From 82cd9901dcb69bb5dd610a91833493b72e2d9fe5 Mon Sep 17 00:00:00 2001 From: James Ward Date: Tue, 5 Jul 2016 13:53:42 -0600 Subject: [PATCH 001/320] bump Gradle --- gradle/wrapper/gradle-wrapper.properties | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 53102c17a..24eebeb91 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ -#Fri Dec 11 12:37:50 MST 2015 +#Tue Jul 05 13:43:33 MDT 2016 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-2.9-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-2.14-bin.zip From ca25b1a7b8a4796fb6cb7f003d9d62fb909473d8 Mon Sep 17 00:00:00 2001 From: Bruce Eckel Date: Tue, 5 Jul 2016 14:46:09 -0600 Subject: [PATCH 002/320] Update to test CI with James --- annotations/database/Member.java | 6 +- arrays/TestCount.java | 88 ++++--- arrays/TestRand.java | 106 +++++---- build.xml | 6 +- collections/StackCollision.java | 2 +- collections/StackTest.java | 6 +- collections/StackTest2.java | 18 ++ collections/build.xml | 2 + collectionsindepth/DequeTest.java | 30 --- collectionsindepth/FillMapTest.java | 29 +++ .../FilledCollectionGeneration.java | 23 -- collectionsindepth/FilledCollectionTest.java | 31 --- collectionsindepth/LinkedHashMapDemo.java | 4 +- collectionsindepth/Maps.java | 6 +- collectionsindepth/QueueBehavior.java | 32 ++- collectionsindepth/SimpleDeques.java | 65 ++++++ collectionsindepth/SortedMapDemo.java | 2 +- collectionsindepth/Stacks.java | 2 +- collectionsindepth/StreamFillMaps.java | 48 ++++ .../SuppliersCollectionTest.java | 62 +++++ collectionsindepth/TypesForSets.java | 40 ++-- collectionsindepth/build.xml | 14 +- newio/MappedIO.java | 119 ---------- newio/build.xml | 2 - .../{CountingFilledMap.java => CountMap.java} | 31 ++- onjava/CountingIntegerList.java | 6 +- onjava/Countries.java | 6 +- onjava/DaemonThreadFactory.java | 16 -- onjava/DaemonThreadPoolExecutor.java | 15 -- onjava/Deque.java | 21 -- onjava/FillMap.java | 38 ++++ onjava/FilledCollection.java | 20 -- onjava/FilledMap.java | 65 ------ onjava/Pair.java | 5 + onjava/Stack.java | 17 +- onjava/SwingConsole.java | 20 -- onjava/TaskItem.java | 16 -- onjava/TaskManager.java | 48 ---- onjava/build.xml | 4 +- patterns/SingletonPattern.java | 37 --- patterns/build.xml | 2 - .../drc/DogAndRobotCollections.java | 4 +- swt/ColorBoxes.java | 83 ------- swt/DisplayEnvironment.java | 25 -- swt/DisplayProperties.java | 26 --- swt/HelloSWT.java | 20 -- swt/Menus.java | 60 ----- swt/ShellsAreMainWindows.java | 29 --- swt/SineWave.java | 77 ------- swt/TabbedPane.java | 152 ------------- swt/build.xml | 32 --- swt/util/SWTApplication.java | 10 - swt/util/SWTConsole.java | 23 -- tasks/ActiveObjectDemo.java | 89 -------- tasks/BasicThreads.java | 18 -- tasks/CachedThreadPool.java | 23 -- tasks/CallableDemo.java | 50 ---- tasks/CountDownLatchDemo.java | 97 -------- tasks/DaemonFromFactory.java | 44 ---- tasks/Daemons.java | 57 ----- tasks/DaemonsDoRunFinally.java | 35 --- tasks/ExchangerDemo.java | 85 ------- tasks/Fat.java | 20 -- tasks/FixedThreadPool.java | 24 -- tasks/Joining.java | 62 ----- tasks/LiftOff.java | 26 --- tasks/ListComparisons.java | 90 -------- tasks/MapComparisons.java | 97 -------- tasks/MoreBasicThreads.java | 23 -- tasks/NotifyVsNotifyAll.java | 110 --------- tasks/PipedIO.java | 67 ------ tasks/Pool.java | 54 ----- tasks/ReaderWriterList.java | 112 --------- tasks/ResponsiveUI.java | 36 --- tasks/SelfManaged.java | 37 --- tasks/SemaphoreDemo.java | 98 -------- tasks/SimpleDaemons.java | 44 ---- tasks/SimpleMicroBenchmark.java | 52 ----- tasks/SimplePriorities.java | 55 ----- tasks/SimpleThread.java | 37 --- tasks/SingleThreadExecutor.java | 24 -- tasks/SleepingTask.java | 38 ---- tasks/SynchronizationComparisons.java | 214 ------------------ tasks/TestBlockingQueues.java | 71 ------ tasks/Tester.java | 77 ------- tasks/ThreadVariations.java | 192 ---------------- tasks/waxomatic/WaxOMatic.java | 88 ------- tasks/waxomatic2/WaxOMatic2.java | 111 --------- {tasks => threads}/AtomicEvenSupplier.java | 2 +- {tasks => threads}/AtomicIntegerTest.java | 2 +- {tasks => threads}/Atomicity.java | 2 +- {tasks => threads}/AtomicityTest.java | 2 +- {tasks => threads}/AttemptLocking.java | 2 +- {tasks => threads}/BankTellerSimulation.java | 2 +- threads/CachedThreadPool.java | 29 +++ threads/CachedThreadPool2.java | 29 +++ threads/CachedThreadPool3.java | 47 ++++ .../CaptureUncaughtException.java | 4 +- {tasks => threads}/CarBuilder.java | 2 +- {tasks => threads}/Chopstick.java | 2 +- {tasks => threads}/CloseResource.java | 2 +- threads/CollectionToStream.java | 36 +++ threads/CountingStream.java | 31 +++ threads/CountingTask.java | 19 ++ {tasks => threads}/CriticalSection.java | 4 +- .../DeadlockingDiningPhilosophers.java | 2 +- {tasks => threads}/DelayQueueDemo.java | 2 +- {tasks => threads}/EvenChecker.java | 2 +- {tasks => threads}/EvenSupplier.java | 2 +- {tasks => threads}/ExceptionThread.java | 2 +- .../ExplicitCriticalSection.java | 4 +- {tasks => threads}/FastSimulation.java | 2 +- .../FixedDiningPhilosophers.java | 2 +- threads/Futures.java | 23 ++ {tasks => threads}/GreenhouseScheduler.java | 2 +- {tasks => threads}/HorseRace.java | 2 +- {tasks => threads}/IntSupplier.java | 2 +- threads/InterferingTask.java | 17 ++ {tasks => threads}/Interrupting.java | 2 +- {tasks => threads}/Interrupting2.java | 2 +- {tasks => threads}/InterruptingIdiom.java | 2 +- threads/LambdasAndMethodReferences.java | 41 ++++ threads/MoreTasksAfterShutdown.java | 29 +++ {tasks => threads}/MultiLock.java | 2 +- {tasks => threads}/MutexEvenSupplier.java | 2 +- {tasks => threads}/NIOInterruption.java | 2 +- .../NaiveExceptionHandling.java | 2 +- .../NumberOfProcessors.java | 11 +- {tasks => threads}/OrnamentalGarden.java | 2 +- threads/ParallelStreamPuzzle.java | 25 ++ threads/ParallelStreamPuzzle2.java | 33 +++ threads/ParallelStreamPuzzle3.java | 32 +++ {tasks => threads}/Philosopher.java | 2 +- threads/Prime.java | 33 +++ .../PriorityBlockingQueueDemo.java | 2 +- threads/QuittableTask.java | 20 ++ threads/QuittingTasks.java | 31 +++ {tasks => threads}/Restaurant.java | 2 +- {tasks => threads}/SerialNumberChecker.java | 2 +- {tasks => threads}/SerialNumberSupplier.java | 2 +- {tasks => threads}/SettingDefaultHandler.java | 2 +- threads/SingleThreadExecutor.java | 50 ++++ threads/SingleThreadExecutor2.java | 29 +++ threads/SingleThreadExecutor3.java | 29 +++ threads/SleepAndPrintTask.java | 23 ++ threads/Summing.java | 50 ++++ threads/Summing2.java | 43 ++++ threads/Summing3.java | 41 ++++ threads/Summing4.java | 20 ++ threads/SwallowedException.java | 17 ++ {tasks => threads}/SyncObject.java | 2 +- threads/SynchronizedEvenSupplier.java | 22 ++ .../ThreadLocalVariableHolder.java | 2 +- threads/ThreadSize.java | 33 +++ {tasks => threads}/ToastOMatic.java | 2 +- threads/WorkStealingPool.java | 39 ++++ {tasks => threads}/build.xml | 120 +++++----- .../restaurant2/RestaurantWithQueues.java | 4 +- typeinfo/PetCount3.java | 8 +- ui/BorderLayout1.java | 21 -- ui/Borders.java | 40 ---- ui/Button1.java | 22 -- ui/Button2.java | 35 --- ui/Button2b.java | 31 --- ui/ButtonGroups.java | 56 ----- ui/Buttons.java | 36 --- ui/CheckBoxes.java | 35 --- ui/ColorBoxes.java | 57 ----- ui/ComboBoxes.java | 38 ---- ui/Dialogs.java | 33 --- ui/Faces.java | 55 ----- ui/FileChooserTest.java | 60 ----- ui/FlowLayout1.java | 19 -- ui/GridLayout1.java | 19 -- ui/HTMLButton.java | 27 --- ui/HelloLabel.java | 20 -- ui/HelloSwing.java | 14 -- ui/InterruptableLongRunningCallable.java | 54 ----- ui/InterruptableLongRunningTask.java | 52 ----- ui/List.java | 61 ----- ui/LongRunningTask.java | 36 --- ui/LookAndFeel.java | 90 -------- ui/Menus.java | 163 ------------- ui/MessageBoxes.java | 72 ------ ui/MonitoredLongRunningCallable.java | 81 ------- ui/Popup.java | 53 ----- ui/Progress.java | 35 --- ui/RadioButtons.java | 36 --- ui/ShowAddListeners.java | 63 ------ ui/SimpleMenus.java | 40 ---- ui/SineWave.java | 60 ----- ui/SubmitLabelManipulationTask.java | 21 -- ui/SubmitSwingProgram.java | 27 --- ui/TabbedPane1.java | 32 --- ui/TextArea.java | 34 --- ui/TextFields.java | 92 -------- ui/TextPane.java | 28 --- ui/TicTacToe.java | 83 ------- ui/TrackEvent.java | 108 --------- ui/build.xml | 80 ------- 200 files changed, 1461 insertions(+), 5664 deletions(-) create mode 100644 collections/StackTest2.java delete mode 100644 collectionsindepth/DequeTest.java create mode 100644 collectionsindepth/FillMapTest.java delete mode 100644 collectionsindepth/FilledCollectionGeneration.java delete mode 100644 collectionsindepth/FilledCollectionTest.java create mode 100644 collectionsindepth/SimpleDeques.java create mode 100644 collectionsindepth/StreamFillMaps.java create mode 100644 collectionsindepth/SuppliersCollectionTest.java delete mode 100644 newio/MappedIO.java rename onjava/{CountingFilledMap.java => CountMap.java} (75%) delete mode 100644 onjava/DaemonThreadFactory.java delete mode 100644 onjava/DaemonThreadPoolExecutor.java delete mode 100644 onjava/Deque.java create mode 100644 onjava/FillMap.java delete mode 100644 onjava/FilledCollection.java delete mode 100644 onjava/FilledMap.java delete mode 100644 onjava/SwingConsole.java delete mode 100644 onjava/TaskItem.java delete mode 100644 onjava/TaskManager.java delete mode 100644 patterns/SingletonPattern.java delete mode 100644 swt/ColorBoxes.java delete mode 100644 swt/DisplayEnvironment.java delete mode 100644 swt/DisplayProperties.java delete mode 100644 swt/HelloSWT.java delete mode 100644 swt/Menus.java delete mode 100644 swt/ShellsAreMainWindows.java delete mode 100644 swt/SineWave.java delete mode 100644 swt/TabbedPane.java delete mode 100644 swt/build.xml delete mode 100644 swt/util/SWTApplication.java delete mode 100644 swt/util/SWTConsole.java delete mode 100644 tasks/ActiveObjectDemo.java delete mode 100644 tasks/BasicThreads.java delete mode 100644 tasks/CachedThreadPool.java delete mode 100644 tasks/CallableDemo.java delete mode 100644 tasks/CountDownLatchDemo.java delete mode 100644 tasks/DaemonFromFactory.java delete mode 100644 tasks/Daemons.java delete mode 100644 tasks/DaemonsDoRunFinally.java delete mode 100644 tasks/ExchangerDemo.java delete mode 100644 tasks/Fat.java delete mode 100644 tasks/FixedThreadPool.java delete mode 100644 tasks/Joining.java delete mode 100644 tasks/LiftOff.java delete mode 100644 tasks/ListComparisons.java delete mode 100644 tasks/MapComparisons.java delete mode 100644 tasks/MoreBasicThreads.java delete mode 100644 tasks/NotifyVsNotifyAll.java delete mode 100644 tasks/PipedIO.java delete mode 100644 tasks/Pool.java delete mode 100644 tasks/ReaderWriterList.java delete mode 100644 tasks/ResponsiveUI.java delete mode 100644 tasks/SelfManaged.java delete mode 100644 tasks/SemaphoreDemo.java delete mode 100644 tasks/SimpleDaemons.java delete mode 100644 tasks/SimpleMicroBenchmark.java delete mode 100644 tasks/SimplePriorities.java delete mode 100644 tasks/SimpleThread.java delete mode 100644 tasks/SingleThreadExecutor.java delete mode 100644 tasks/SleepingTask.java delete mode 100644 tasks/SynchronizationComparisons.java delete mode 100644 tasks/TestBlockingQueues.java delete mode 100644 tasks/Tester.java delete mode 100644 tasks/ThreadVariations.java delete mode 100644 tasks/waxomatic/WaxOMatic.java delete mode 100644 tasks/waxomatic2/WaxOMatic2.java rename {tasks => threads}/AtomicEvenSupplier.java (94%) rename {tasks => threads}/AtomicIntegerTest.java (96%) rename {tasks => threads}/Atomicity.java (97%) rename {tasks => threads}/AtomicityTest.java (96%) rename {tasks => threads}/AttemptLocking.java (98%) rename {tasks => threads}/BankTellerSimulation.java (99%) create mode 100644 threads/CachedThreadPool.java create mode 100644 threads/CachedThreadPool2.java create mode 100644 threads/CachedThreadPool3.java rename {tasks => threads}/CaptureUncaughtException.java (94%) rename {tasks => threads}/CarBuilder.java (99%) rename {tasks => threads}/Chopstick.java (94%) rename {tasks => threads}/CloseResource.java (97%) create mode 100644 threads/CollectionToStream.java create mode 100644 threads/CountingStream.java create mode 100644 threads/CountingTask.java rename {tasks => threads}/CriticalSection.java (98%) rename {tasks => threads}/DeadlockingDiningPhilosophers.java (97%) rename {tasks => threads}/DelayQueueDemo.java (99%) rename {tasks => threads}/EvenChecker.java (97%) rename {tasks => threads}/EvenSupplier.java (95%) rename {tasks => threads}/ExceptionThread.java (94%) rename {tasks => threads}/ExplicitCriticalSection.java (97%) rename {tasks => threads}/FastSimulation.java (98%) rename {tasks => threads}/FixedDiningPhilosophers.java (97%) create mode 100644 threads/Futures.java rename {tasks => threads}/GreenhouseScheduler.java (99%) rename {tasks => threads}/HorseRace.java (99%) rename {tasks => threads}/IntSupplier.java (93%) create mode 100644 threads/InterferingTask.java rename {tasks => threads}/Interrupting.java (98%) rename {tasks => threads}/Interrupting2.java (98%) rename {tasks => threads}/InterruptingIdiom.java (98%) create mode 100644 threads/LambdasAndMethodReferences.java create mode 100644 threads/MoreTasksAfterShutdown.java rename {tasks => threads}/MultiLock.java (97%) rename {tasks => threads}/MutexEvenSupplier.java (95%) rename {tasks => threads}/NIOInterruption.java (98%) rename {tasks => threads}/NaiveExceptionHandling.java (93%) rename tasks/MainThread.java => threads/NumberOfProcessors.java (57%) rename {tasks => threads}/OrnamentalGarden.java (98%) create mode 100644 threads/ParallelStreamPuzzle.java create mode 100644 threads/ParallelStreamPuzzle2.java create mode 100644 threads/ParallelStreamPuzzle3.java rename {tasks => threads}/Philosopher.java (98%) create mode 100644 threads/Prime.java rename {tasks => threads}/PriorityBlockingQueueDemo.java (99%) create mode 100644 threads/QuittableTask.java create mode 100644 threads/QuittingTasks.java rename {tasks => threads}/Restaurant.java (98%) rename {tasks => threads}/SerialNumberChecker.java (98%) rename {tasks => threads}/SerialNumberSupplier.java (90%) rename {tasks => threads}/SettingDefaultHandler.java (93%) create mode 100644 threads/SingleThreadExecutor.java create mode 100644 threads/SingleThreadExecutor2.java create mode 100644 threads/SingleThreadExecutor3.java create mode 100644 threads/SleepAndPrintTask.java create mode 100644 threads/Summing.java create mode 100644 threads/Summing2.java create mode 100644 threads/Summing3.java create mode 100644 threads/Summing4.java create mode 100644 threads/SwallowedException.java rename {tasks => threads}/SyncObject.java (96%) create mode 100644 threads/SynchronizedEvenSupplier.java rename {tasks => threads}/ThreadLocalVariableHolder.java (97%) create mode 100644 threads/ThreadSize.java rename {tasks => threads}/ToastOMatic.java (99%) create mode 100644 threads/WorkStealingPool.java rename {tasks => threads}/build.xml (52%) rename {tasks => threads}/restaurant2/RestaurantWithQueues.java (98%) delete mode 100644 ui/BorderLayout1.java delete mode 100644 ui/Borders.java delete mode 100644 ui/Button1.java delete mode 100644 ui/Button2.java delete mode 100644 ui/Button2b.java delete mode 100644 ui/ButtonGroups.java delete mode 100644 ui/Buttons.java delete mode 100644 ui/CheckBoxes.java delete mode 100644 ui/ColorBoxes.java delete mode 100644 ui/ComboBoxes.java delete mode 100644 ui/Dialogs.java delete mode 100644 ui/Faces.java delete mode 100644 ui/FileChooserTest.java delete mode 100644 ui/FlowLayout1.java delete mode 100644 ui/GridLayout1.java delete mode 100644 ui/HTMLButton.java delete mode 100644 ui/HelloLabel.java delete mode 100644 ui/HelloSwing.java delete mode 100644 ui/InterruptableLongRunningCallable.java delete mode 100644 ui/InterruptableLongRunningTask.java delete mode 100644 ui/List.java delete mode 100644 ui/LongRunningTask.java delete mode 100644 ui/LookAndFeel.java delete mode 100644 ui/Menus.java delete mode 100644 ui/MessageBoxes.java delete mode 100644 ui/MonitoredLongRunningCallable.java delete mode 100644 ui/Popup.java delete mode 100644 ui/Progress.java delete mode 100644 ui/RadioButtons.java delete mode 100644 ui/ShowAddListeners.java delete mode 100644 ui/SimpleMenus.java delete mode 100644 ui/SineWave.java delete mode 100644 ui/SubmitLabelManipulationTask.java delete mode 100644 ui/SubmitSwingProgram.java delete mode 100644 ui/TabbedPane1.java delete mode 100644 ui/TextArea.java delete mode 100644 ui/TextFields.java delete mode 100644 ui/TextPane.java delete mode 100644 ui/TicTacToe.java delete mode 100644 ui/TrackEvent.java diff --git a/annotations/database/Member.java b/annotations/database/Member.java index f7b5bf347..c4475e906 100644 --- a/annotations/database/Member.java +++ b/annotations/database/Member.java @@ -11,12 +11,12 @@ public class Member { @SQLInteger Integer age; @SQLString(value = 30, constraints = @Constraints(primaryKey = true)) - String handle; + String reference; static int memberCount; - public String getHandle() { return handle; } + public String getReference() { return reference; } public String getFirstName() { return firstName; } public String getLastName() { return lastName; } @Override - public String toString() { return handle; } + public String toString() { return reference; } public Integer getAge() { return age; } } diff --git a/arrays/TestCount.java b/arrays/TestCount.java index 909f6fb11..89b0cf39f 100644 --- a/arrays/TestCount.java +++ b/arrays/TestCount.java @@ -15,82 +15,106 @@ public static void main(String[] args) { Boolean[] a1 = new Boolean[SZ]; Arrays.setAll(a1, new Count.Boolean()::get); show(a1); - show(Stream.generate(new Count.Boolean()) - .limit(SZ + 1).toArray()); - show(new Count.Boolean().array(SZ + 2)); - show(new Count.boolean_().array(SZ + 3)); + a1 = Stream.generate(new Count.Boolean()) + .limit(SZ + 1).toArray(Boolean[]::new); + show(a1); + a1 = new Count.Boolean().array(SZ + 2); + show(a1); + boolean[] a1b = new Count.boolean_().array(SZ + 3); + show(a1b); System.out.println("Byte"); Byte[] a2 = new Byte[SZ]; Arrays.setAll(a2, new Count.Byte()::get); show(a2); - show(Stream.generate(new Count.Byte()) - .limit(SZ + 1).toArray()); - show(new Count.Byte().array(SZ + 2)); - show(new Count.byte_().array(SZ + 3)); + a2 = Stream.generate(new Count.Byte()) + .limit(SZ + 1).toArray(Byte[]::new); + show(a2); + a2 = new Count.Byte().array(SZ + 2); + show(a2); + byte[] a2b = new Count.byte_().array(SZ + 3); + show(a2b); System.out.println("Character"); Character[] a3 = new Character[SZ]; Arrays.setAll(a3, new Count.Character()::get); show(a3); - show(Stream.generate(new Count.Character()) - .limit(SZ + 1).toArray()); - show(new Count.Character().array(SZ + 2)); - show(new Count.char_().array(SZ + 3)); + a3 = Stream.generate(new Count.Character()) + .limit(SZ + 1).toArray(Character[]::new); + show(a3); + a3 = new Count.Character().array(SZ + 2); + show(a3); + char[] a3b = new Count.char_().array(SZ + 3); + show(a3b); System.out.println("Short"); Short[] a4 = new Short[SZ]; Arrays.setAll(a4, new Count.Short()::get); show(a4); - show(Stream.generate(new Count.Short()) - .limit(SZ + 1).toArray()); - show(new Count.Short().array(SZ + 2)); - show(new Count.short_().array(SZ + 3)); + a4 = Stream.generate(new Count.Short()) + .limit(SZ + 1).toArray(Short[]::new); + show(a4); + a4 = new Count.Short().array(SZ + 2); + show(a4); + short[] a4b = new Count.short_().array(SZ + 3); + show(a4b); System.out.println("Integer"); int[] a5 = new int[SZ]; Arrays.setAll(a5, new Count.Integer()::get); show(a5); - show(Stream.generate(new Count.Integer()) - .limit(SZ + 1).toArray()); - show(new Count.Integer().array(SZ + 2)); + Integer[] a5b = Stream.generate(new Count.Integer()) + .limit(SZ + 1).toArray(Integer[]::new); + show(a5b); + a5b = new Count.Integer().array(SZ + 2); + show(a5b); a5 = IntStream.generate(new Count.int_()) .limit(SZ + 1).toArray(); show(a5); - show(new Count.int_().array(SZ + 3)); + a5 = new Count.int_().array(SZ + 3); + show(a5); System.out.println("Long"); long[] a6 = new long[SZ]; Arrays.setAll(a6, new Count.Long()::get); show(a6); - show(Stream.generate(new Count.Long()) - .limit(SZ + 1).toArray()); - show(new Count.Long().array(SZ + 2)); + Long[] a6b = Stream.generate(new Count.Long()) + .limit(SZ + 1).toArray(Long[]::new); + show(a6b); + a6b = new Count.Long().array(SZ + 2); + show(a6b); a6 = LongStream.generate(new Count.long_()) .limit(SZ + 1).toArray(); show(a6); - show(new Count.long_().array(SZ + 3)); + a6 = new Count.long_().array(SZ + 3); + show(a6); System.out.println("Float"); Float[] a7 = new Float[SZ]; Arrays.setAll(a7, new Count.Float()::get); show(a7); - show(Stream.generate(new Count.Float()) - .limit(SZ + 1).toArray()); - show(new Count.Float().array(SZ + 2)); - show(new Count.float_().array(SZ + 3)); + a7 = Stream.generate(new Count.Float()) + .limit(SZ + 1).toArray(Float[]::new); + show(a7); + a7 = new Count.Float().array(SZ + 2); + show(a7); + float[] a7b = new Count.float_().array(SZ + 3); + show(a7b); System.out.println("Double"); double[] a8 = new double[SZ]; Arrays.setAll(a8, new Count.Double()::get); show(a8); - show(Stream.generate(new Count.Double()) - .limit(SZ + 1).toArray()); - show(new Count.Double().array(SZ + 2)); + Double[] a8b = Stream.generate(new Count.Double()) + .limit(SZ + 1).toArray(Double[]::new); + show(a8b); + a8b = new Count.Double().array(SZ + 2); + show(a8b); a8 = DoubleStream.generate(new Count.double_()) .limit(SZ + 1).toArray(); show(a8); - show(new Count.double_().array(SZ + 3)); + a8 = new Count.double_().array(SZ + 3); + show(a8); } } /* Output: diff --git a/arrays/TestRand.java b/arrays/TestRand.java index 56ee188e6..68eeefe4c 100644 --- a/arrays/TestRand.java +++ b/arrays/TestRand.java @@ -15,96 +15,124 @@ public static void main(String[] args) { Boolean[] a1 = new Boolean[SZ]; Arrays.setAll(a1, new Rand.Boolean()::get); show(a1); - show(Stream.generate(new Rand.Boolean()) - .limit(SZ + 1).toArray()); - show(new Rand.Boolean().array(SZ + 2)); - show(new Rand.boolean_().array(SZ + 3)); + a1 = Stream.generate(new Rand.Boolean()) + .limit(SZ + 1).toArray(Boolean[]::new); + show(a1); + a1 = new Rand.Boolean().array(SZ + 2); + show(a1); + boolean[] a1b = new Rand.boolean_().array(SZ + 3); + show(a1b); System.out.println("Byte"); Byte[] a2 = new Byte[SZ]; Arrays.setAll(a2, new Rand.Byte()::get); show(a2); - show(Stream.generate(new Rand.Byte()) - .limit(SZ + 1).toArray()); - show(new Rand.Byte().array(SZ + 2)); - show(new Rand.byte_().array(SZ + 3)); + a2 = Stream.generate(new Rand.Byte()) + .limit(SZ + 1).toArray(Byte[]::new); + show(a2); + a2 = new Rand.Byte().array(SZ + 2); + show(a2); + byte[] a2b = new Rand.byte_().array(SZ + 3); + show(a2b); System.out.println("Character"); Character[] a3 = new Character[SZ]; Arrays.setAll(a3, new Rand.Character()::get); show(a3); - show(Stream.generate(new Rand.Character()) - .limit(SZ + 1).toArray()); - show(new Rand.Character().array(SZ + 2)); - show(new Rand.char_().array(SZ + 3)); + a3 = Stream.generate(new Rand.Character()) + .limit(SZ + 1).toArray(Character[]::new); + show(a3); + a3 = new Rand.Character().array(SZ + 2); + show(a3); + char[] a3b = new Rand.char_().array(SZ + 3); + show(a3b); System.out.println("Short"); Short[] a4 = new Short[SZ]; Arrays.setAll(a4, new Rand.Short()::get); show(a4); - show(Stream.generate(new Rand.Short()) - .limit(SZ + 1).toArray()); - show(new Rand.Short().array(SZ + 2)); - show(new Rand.short_().array(SZ + 3)); + a4 = Stream.generate(new Rand.Short()) + .limit(SZ + 1).toArray(Short[]::new); + show(a4); + a4 = new Rand.Short().array(SZ + 2); + show(a4); + short[] a4b = new Rand.short_().array(SZ + 3); + show(a4b); System.out.println("Integer"); int[] a5 = new int[SZ]; Arrays.setAll(a5, new Rand.Integer()::get); show(a5); - show(Stream.generate(new Rand.Integer()) - .limit(SZ + 1).toArray()); - show(new Rand.Integer().array(SZ + 2)); + Integer[] a5b = Stream.generate(new Rand.Integer()) + .limit(SZ + 1).toArray(Integer[]::new); + show(a5b); + a5b = new Rand.Integer().array(SZ + 2); + show(a5b); a5 = IntStream.generate(new Rand.int_()) .limit(SZ + 1).toArray(); show(a5); - show(new Rand.int_().array(SZ + 3)); + a5 = new Rand.int_().array(SZ + 3); + show(a5); System.out.println("Long"); long[] a6 = new long[SZ]; Arrays.setAll(a6, new Rand.Long()::get); show(a6); - show(Stream.generate(new Rand.Long()) - .limit(SZ + 1).toArray()); - show(new Rand.Long().array(SZ + 2)); + Long[] a6b = Stream.generate(new Rand.Long()) + .limit(SZ + 1).toArray(Long[]::new); + show(a6b); + a6b = new Rand.Long().array(SZ + 2); + show(a6b); a6 = LongStream.generate(new Rand.long_()) .limit(SZ + 1).toArray(); show(a6); - show(new Rand.long_().array(SZ + 3)); + a6 = new Rand.long_().array(SZ + 3); + show(a6); System.out.println("Float"); Float[] a7 = new Float[SZ]; Arrays.setAll(a7, new Rand.Float()::get); show(a7); - show(Stream.generate(new Rand.Float()) - .limit(SZ + 1).toArray()); - show(new Rand.Float().array(SZ + 2)); - show(new Rand.float_().array(SZ + 3)); + a7 = Stream.generate(new Rand.Float()) + .limit(SZ + 1).toArray(Float[]::new); + show(a7); + a7 = new Rand.Float().array(SZ + 2); + show(a7); + float[] a7b = new Rand.float_().array(SZ + 3); + show(a7b); System.out.println("Double"); double[] a8 = new double[SZ]; Arrays.setAll(a8, new Rand.Double()::get); show(a8); - show(Stream.generate(new Rand.Double()) - .limit(SZ + 1).toArray()); - show(new Rand.Double().array(SZ + 2)); + Double[] a8b = Stream.generate(new Rand.Double()) + .limit(SZ + 1).toArray(Double[]::new); + show(a8b); + a8b = new Rand.Double().array(SZ + 2); + show(a8b); a8 = DoubleStream.generate(new Rand.double_()) - .limit(SZ + 2).toArray(); + .limit(SZ + 1).toArray(); + show(a8); + a8 = new Rand.double_().array(SZ + 3); show(a8); - show(new Rand.double_().array(SZ + 3)); System.out.println("String"); String[] s = new String[SZ - 1]; Arrays.setAll(s, new Rand.String()::get); show(s); - show(Stream.generate(new Rand.String()) - .limit(SZ).toArray()); - show(new Rand.String().array(SZ + 1)); + s = Stream.generate(new Rand.String()) + .limit(SZ).toArray(String[]::new); + show(s); + s = new Rand.String().array(SZ + 1); + show(s); Arrays.setAll(s, new Rand.String(4)::get); show(s); - show(Stream.generate(new Rand.String(4)) - .limit(SZ).toArray()); - show(new Rand.String(4).array(SZ + 1)); + s = Stream.generate(new Rand.String(4)) + .limit(SZ).toArray(String[]::new); + show(s); + s = new Rand.String(4).array(SZ + 1); + show(s); } } /* Output: diff --git a/build.xml b/build.xml index 1cc30c7c4..a73a1d931 100644 --- a/build.xml +++ b/build.xml @@ -42,9 +42,7 @@ files/build.xml enums/build.xml annotations/build.xml - tasks/build.xml - ui/build.xml - swt/build.xml + threads/build.xml patterns/build.xml unittesting/build.xml assertions/build.xml @@ -86,7 +84,7 @@ files/build.xml enums/build.xml annotations/build.xml - tasks/build.xml + threads/build.xml patterns/build.xml unittesting/build.xml assertions/build.xml diff --git a/collections/StackCollision.java b/collections/StackCollision.java index 82b6d57cf..b6d0986a6 100644 --- a/collections/StackCollision.java +++ b/collections/StackCollision.java @@ -8,7 +8,7 @@ public static void main(String[] args) { onjava.Stack stack = new onjava.Stack<>(); for(String s : "My dog has fleas".split(" ")) stack.push(s); - while(!stack.empty()) + while(!stack.isEmpty()) System.out.print(stack.pop() + " "); System.out.println(); java.util.Stack stack2 = diff --git a/collections/StackTest.java b/collections/StackTest.java index c873b1686..86c308ec0 100644 --- a/collections/StackTest.java +++ b/collections/StackTest.java @@ -2,14 +2,14 @@ // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. -import onjava.*; +import java.util.*; public class StackTest { public static void main(String[] args) { - Stack stack = new Stack<>(); + Deque stack = new ArrayDeque<>(); for(String s : "My dog has fleas".split(" ")) stack.push(s); - while(!stack.empty()) + while(!stack.isEmpty()) System.out.print(stack.pop() + " "); } } diff --git a/collections/StackTest2.java b/collections/StackTest2.java new file mode 100644 index 000000000..f36c62b1a --- /dev/null +++ b/collections/StackTest2.java @@ -0,0 +1,18 @@ +// collections/StackTest2.java +// (c)2016 MindView LLC: see Copyright.txt +// We make no guarantees that this code is fit for any purpose. +// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +import onjava.*; + +public class StackTest2 { + public static void main(String[] args) { + Stack stack = new Stack<>(); + for(String s : "My dog has fleas".split(" ")) + stack.push(s); + while(!stack.isEmpty()) + System.out.print(stack.pop() + " "); + } +} +/* Output: +fleas has dog My +*/ diff --git a/collections/build.xml b/collections/build.xml index b5ffcc1ae..b1ed7e1a6 100644 --- a/collections/build.xml +++ b/collections/build.xml @@ -41,6 +41,7 @@ + @@ -81,6 +82,7 @@ + diff --git a/collectionsindepth/DequeTest.java b/collectionsindepth/DequeTest.java deleted file mode 100644 index dca46926d..000000000 --- a/collectionsindepth/DequeTest.java +++ /dev/null @@ -1,30 +0,0 @@ -// collectionsindepth/DequeTest.java -// (c)2016 MindView LLC: see Copyright.txt -// We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. -import onjava.*; - -public class DequeTest { - static void fillTest(Deque deque) { - for(int i = 20; i < 27; i++) - deque.addFirst(i); - for(int i = 50; i < 55; i++) - deque.addLast(i); - } - public static void main(String[] args) { - Deque di = new Deque<>(); - fillTest(di); - System.out.println(di); - while(di.size() != 0) - System.out.print(di.removeFirst() + " "); - System.out.println(); - fillTest(di); - while(di.size() != 0) - System.out.print(di.removeLast() + " "); - } -} -/* Output: -[26, 25, 24, 23, 22, 21, 20, 50, 51, 52, 53, 54] -26 25 24 23 22 21 20 50 51 52 53 54 -54 53 52 51 50 20 21 22 23 24 25 26 -*/ diff --git a/collectionsindepth/FillMapTest.java b/collectionsindepth/FillMapTest.java new file mode 100644 index 000000000..f44181534 --- /dev/null +++ b/collectionsindepth/FillMapTest.java @@ -0,0 +1,29 @@ +// collectionsindepth/FillMapTest.java +// (c)2016 MindView LLC: see Copyright.txt +// We make no guarantees that this code is fit for any purpose. +// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +import java.util.*; +import java.util.function.*; +import java.util.stream.*; +import onjava.*; + +public class FillMapTest { + public static void main(String[] args) { + Map mcs = FillMap.basic( + new Rand.String(4), new Count.Integer(), 7); + System.out.println(mcs); + HashMap hashm = FillMap.create( + new Rand.String(4), new Count.Integer(), + HashMap::new, 7); + System.out.println(hashm); + LinkedHashMap linkm = FillMap.create( + new Rand.String(4), new Count.Integer(), + LinkedHashMap::new, 7); + System.out.println(linkm); + } +} +/* Output: +{npcc=1, ztdv=6, gvgm=3, btpe=0, einn=4, eelo=5, uxsz=2} +{npcc=1, ztdv=6, gvgm=3, btpe=0, einn=4, eelo=5, uxsz=2} +{btpe=0, npcc=1, uxsz=2, gvgm=3, einn=4, eelo=5, ztdv=6} +*/ diff --git a/collectionsindepth/FilledCollectionGeneration.java b/collectionsindepth/FilledCollectionGeneration.java deleted file mode 100644 index 22458de99..000000000 --- a/collectionsindepth/FilledCollectionGeneration.java +++ /dev/null @@ -1,23 +0,0 @@ -// collectionsindepth/FilledCollectionGeneration.java -// (c)2016 MindView LLC: see Copyright.txt -// We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. -// Using the Suppliers defined in the Arrays chapter -import java.util.*; -import onjava.*; - -public class FilledCollectionGeneration { - public static void main(String[] args) { - System.out.println(new ArrayList<>( - FilledCollection.list( // Convenience method - new Rand.String(9), 10))); - System.out.println(new HashSet<>( - new FilledCollection<>( - new Rand.Integer(), 10))); - } -} -/* Output: -[YNzbrnyGc, FOWZnTcQr, GseGZMmJM, RoEsuEcUO, neOEdLsmw, -HLGEahKcx, rEqUCBbkI, naMesbtWH, kjUrUkZPg, wsqPzDyCy] -[2017, 8037, 871, 7882, 6090, 4779, 299, 573, 4367, 3455] -*/ diff --git a/collectionsindepth/FilledCollectionTest.java b/collectionsindepth/FilledCollectionTest.java deleted file mode 100644 index 4f707b4ff..000000000 --- a/collectionsindepth/FilledCollectionTest.java +++ /dev/null @@ -1,31 +0,0 @@ -// collectionsindepth/FilledCollectionTest.java -// (c)2016 MindView LLC: see Copyright.txt -// We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. -import java.util.*; -import java.util.function.*; -import onjava.*; - -class Government implements Supplier { - String[] foundation = ("strange women lying in ponds " + - "distributing swords is no basis for a system of " + - "government").split(" "); - private int index; - @Override - public String get() { return foundation[index++]; } -} - -public class FilledCollectionTest { - public static void main(String[] args) { - Set set = new LinkedHashSet<>( - new FilledCollection<>(new Government(), 15)); - // Using the convenience method: - set.addAll( - FilledCollection.list(new Government(), 15)); - System.out.println(set); - } -} -/* Output: -[strange, women, lying, in, ponds, distributing, swords, -is, no, basis, for, a, system, of, government] -*/ diff --git a/collectionsindepth/LinkedHashMapDemo.java b/collectionsindepth/LinkedHashMapDemo.java index 164417518..0c886e054 100644 --- a/collectionsindepth/LinkedHashMapDemo.java +++ b/collectionsindepth/LinkedHashMapDemo.java @@ -9,11 +9,11 @@ public class LinkedHashMapDemo { public static void main(String[] args) { LinkedHashMap linkedMap = - new LinkedHashMap<>(new CountingFilledMap(9)); + new LinkedHashMap<>(new CountMap(9)); System.out.println(linkedMap); // Least-recently-used order: linkedMap = new LinkedHashMap<>(16, 0.75f, true); - linkedMap.putAll(new CountingFilledMap(9)); + linkedMap.putAll(new CountMap(9)); System.out.println(linkedMap); for(int i = 0; i < 6; i++) // Cause accesses: linkedMap.get(i); diff --git a/collectionsindepth/Maps.java b/collectionsindepth/Maps.java index 1f568878d..a78c38bac 100644 --- a/collectionsindepth/Maps.java +++ b/collectionsindepth/Maps.java @@ -16,9 +16,9 @@ public static void printKeys(Map map) { } public static void test(Map map) { System.out.println(map.getClass().getSimpleName()); - map.putAll(new CountingFilledMap(25)); + map.putAll(new CountMap(25)); // Map has 'Set' behavior for keys: - map.putAll(new CountingFilledMap(25)); + map.putAll(new CountMap(25)); printKeys(map); // Producing a Collection of the values: System.out.print("Values: "); @@ -35,7 +35,7 @@ public static void test(Map map) { printKeys(map); map.clear(); System.out.println("map.isEmpty(): " + map.isEmpty()); - map.putAll(new CountingFilledMap(25)); + map.putAll(new CountMap(25)); // Operations on the Set change the Map: map.keySet().removeAll(map.keySet()); System.out.println("map.isEmpty(): " + map.isEmpty()); diff --git a/collectionsindepth/QueueBehavior.java b/collectionsindepth/QueueBehavior.java index 0701f7227..63ebffffa 100644 --- a/collectionsindepth/QueueBehavior.java +++ b/collectionsindepth/QueueBehavior.java @@ -5,32 +5,26 @@ // Compares the behavior of some of the queues import java.util.concurrent.*; import java.util.*; -import java.util.function.*; -import onjava.*; public class QueueBehavior { - private static int count = 10; - static void test(Queue queue, Supplier gen) { - for(int i = 0; i < count; i++) - queue.offer(gen.get()); + private static String[] s = + ("one two three four five six seven " + + "eight nine ten").split(" "); + static void test(Queue queue) { + for(String ss : s) + queue.offer(ss); while(queue.peek() != null) System.out.print(queue.remove() + " "); System.out.println(); } - static class Gen implements Supplier { - String[] s = ("one two three four five six seven " + - "eight nine ten").split(" "); - int i; - @Override - public String get() { return s[i++]; } - } public static void main(String[] args) { - test(new LinkedList<>(), new Gen()); - test(new PriorityQueue<>(), new Gen()); - test(new ArrayBlockingQueue<>(count), new Gen()); - test(new ConcurrentLinkedQueue<>(), new Gen()); - test(new LinkedBlockingQueue<>(), new Gen()); - test(new PriorityBlockingQueue<>(), new Gen()); + int count = 10; + test(new LinkedList<>()); + test(new PriorityQueue<>()); + test(new ArrayBlockingQueue<>(count)); + test(new ConcurrentLinkedQueue<>()); + test(new LinkedBlockingQueue<>()); + test(new PriorityBlockingQueue<>()); } } /* Output: diff --git a/collectionsindepth/SimpleDeques.java b/collectionsindepth/SimpleDeques.java new file mode 100644 index 000000000..3ac961dcd --- /dev/null +++ b/collectionsindepth/SimpleDeques.java @@ -0,0 +1,65 @@ +// collectionsindepth/SimpleDeques.java +// (c)2016 MindView LLC: see Copyright.txt +// We make no guarantees that this code is fit for any purpose. +// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Very basic test of Deques +import java.util.concurrent.*; +import java.util.*; +import java.util.function.*; + +class CountString implements Supplier { + private int n = 0; + public CountString() {} + public CountString(int start) { n = start; } + @Override + public String get() { return Integer.toString(n++); } +} + +public class SimpleDeques { + static void test(Deque deque) { + CountString s1 = new CountString(), + s2 = new CountString(20); + for(int n = 0; n < 8; n++) { + deque.offerFirst(s1.get()); + deque.offerLast(s2.get()); // Same as offer() + } + System.out.println(deque); + String result = ""; + while(deque.size() > 0) { + System.out.print(deque.peekFirst() + " "); + result += deque.pollFirst() + " "; + System.out.print(deque.peekLast() + " "); + result += deque.pollLast() + " "; + } + System.out.println("\n" + result); + } + public static void main(String[] args) { + int count = 10; + System.out.println("LinkedList"); + test(new LinkedList<>()); + System.out.println("ArrayDeque"); + test(new ArrayDeque<>()); + System.out.println("LinkedBlockingDeque"); + test(new LinkedBlockingDeque<>(count)); + System.out.println("ConcurrentLinkedDeque"); + test(new ConcurrentLinkedDeque<>()); + } +} +/* Output: +LinkedList +[7, 6, 5, 4, 3, 2, 1, 0, 20, 21, 22, 23, 24, 25, 26, 27] +7 27 6 26 5 25 4 24 3 23 2 22 1 21 0 20 +7 27 6 26 5 25 4 24 3 23 2 22 1 21 0 20 +ArrayDeque +[7, 6, 5, 4, 3, 2, 1, 0, 20, 21, 22, 23, 24, 25, 26, 27] +7 27 6 26 5 25 4 24 3 23 2 22 1 21 0 20 +7 27 6 26 5 25 4 24 3 23 2 22 1 21 0 20 +LinkedBlockingDeque +[4, 3, 2, 1, 0, 20, 21, 22, 23, 24] +4 24 3 23 2 22 1 21 0 20 +4 24 3 23 2 22 1 21 0 20 +ConcurrentLinkedDeque +[7, 6, 5, 4, 3, 2, 1, 0, 20, 21, 22, 23, 24, 25, 26, 27] +7 27 6 26 5 25 4 24 3 23 2 22 1 21 0 20 +7 27 6 26 5 25 4 24 3 23 2 22 1 21 0 20 +*/ diff --git a/collectionsindepth/SortedMapDemo.java b/collectionsindepth/SortedMapDemo.java index 681c8866c..9635fccea 100644 --- a/collectionsindepth/SortedMapDemo.java +++ b/collectionsindepth/SortedMapDemo.java @@ -9,7 +9,7 @@ public class SortedMapDemo { public static void main(String[] args) { TreeMap sortedMap = - new TreeMap<>(new CountingFilledMap(10)); + new TreeMap<>(new CountMap(10)); System.out.println(sortedMap); Integer low = sortedMap.firstKey(); Integer high = sortedMap.lastKey(); diff --git a/collectionsindepth/Stacks.java b/collectionsindepth/Stacks.java index 0c12efae8..2f857dd1c 100644 --- a/collectionsindepth/Stacks.java +++ b/collectionsindepth/Stacks.java @@ -37,7 +37,7 @@ public static void main(String[] args) { for(Month m : Month.values()) stack2.push(m.toString()); System.out.println("stack2 = " + stack2); - while(!stack2.empty()) + while(!stack2.isEmpty()) System.out.print(stack2.pop() + " "); } diff --git a/collectionsindepth/StreamFillMaps.java b/collectionsindepth/StreamFillMaps.java new file mode 100644 index 000000000..0b2c56d23 --- /dev/null +++ b/collectionsindepth/StreamFillMaps.java @@ -0,0 +1,48 @@ +// collectionsindepth/StreamFillMaps.java +// (c)2016 MindView LLC: see Copyright.txt +// We make no guarantees that this code is fit for any purpose. +// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +import java.util.*; +import java.util.function.*; +import java.util.stream.*; +import onjava.*; + +class Letters implements Supplier> { + private int number = 1; + private char letter = 'A'; + @Override + public Pair get() { + return new Pair<>(number++, "" + letter++); + } +} + +public class StreamFillMaps { + public static void main(String[] args) { + Map m = + Stream.generate(new Letters()) + .limit(11) + .collect(Collectors.toMap(Pair::key, Pair::value)); + System.out.println(m); + + // Two separate Suppliers: + Rand.String rs = new Rand.String(3); + Count.Character cc = new Count.Character(); + Map mcs = Stream.generate( + () -> Pair.make(cc.get(), rs.get())) + .limit(8) + .collect(Collectors.toMap(Pair::key, Pair::value)); + System.out.println(mcs); + + // A key Supplier and a single value: + Map mcs2 = Stream.generate( + () -> Pair.make(cc.get(), "Val")) + .limit(8) + .collect(Collectors.toMap(Pair::key, Pair::value)); + System.out.println(mcs2); + } +} +/* Output: +{1=A, 2=B, 3=C, 4=D, 5=E, 6=F, 7=G, 8=H, 9=I, 10=J, 11=K} +{b=btp, c=enp, d=ccu, e=xsz, f=gvg, g=mei, h=nne, i=elo} +{p=Val, q=Val, j=Val, k=Val, l=Val, m=Val, n=Val, o=Val} +*/ diff --git a/collectionsindepth/SuppliersCollectionTest.java b/collectionsindepth/SuppliersCollectionTest.java new file mode 100644 index 000000000..f11c71a37 --- /dev/null +++ b/collectionsindepth/SuppliersCollectionTest.java @@ -0,0 +1,62 @@ +// collectionsindepth/SuppliersCollectionTest.java +// (c)2016 MindView LLC: see Copyright.txt +// We make no guarantees that this code is fit for any purpose. +// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +import java.util.*; +import java.util.function.*; +import java.util.stream.*; +import onjava.*; + +class Government implements Supplier { + static String[] foundation = ( + "strange women lying in ponds distributing swords " + + "is no basis for a system of government").split(" "); + private int index; + @Override + public String get() { return foundation[index++]; } +} + +public class SuppliersCollectionTest { + public static void main(String[] args) { + // The Suppliers class from the Generics chapter: + Set set = Suppliers.create( + LinkedHashSet::new, new Government(), 15); + System.out.println(set); + List list = Suppliers.create( + LinkedList::new, new Government(), 15); + System.out.println(list); + list = new ArrayList<>(); + Suppliers.fill(list, new Government(), 15); + System.out.println(list); + + // Or we could just use Streams: + set = Arrays.stream(Government.foundation).collect( + Collectors.toSet()); + System.out.println(set); + list = Arrays.stream(Government.foundation).collect( + Collectors.toList()); + System.out.println(list); + list = Arrays.stream(Government.foundation).collect( + Collectors.toCollection(LinkedList::new)); + System.out.println(list); + set = Arrays.stream(Government.foundation).collect( + Collectors.toCollection(LinkedHashSet::new)); + System.out.println(set); + } +} +/* Output: +[strange, women, lying, in, ponds, distributing, swords, +is, no, basis, for, a, system, of, government] +[strange, women, lying, in, ponds, distributing, swords, +is, no, basis, for, a, system, of, government] +[strange, women, lying, in, ponds, distributing, swords, +is, no, basis, for, a, system, of, government] +[ponds, no, a, in, swords, for, is, basis, strange, +system, government, distributing, of, women, lying] +[strange, women, lying, in, ponds, distributing, swords, +is, no, basis, for, a, system, of, government] +[strange, women, lying, in, ponds, distributing, swords, +is, no, basis, for, a, system, of, government] +[strange, women, lying, in, ponds, distributing, swords, +is, no, basis, for, a, system, of, government] +*/ diff --git a/collectionsindepth/TypesForSets.java b/collectionsindepth/TypesForSets.java index d89527729..99961c656 100644 --- a/collectionsindepth/TypesForSets.java +++ b/collectionsindepth/TypesForSets.java @@ -3,8 +3,8 @@ // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. // Methods necessary to put your own type in a Set -import java.lang.reflect.InvocationTargetException; import java.util.*; +import java.util.function.*; class SetType { int i; @@ -33,43 +33,35 @@ public int compareTo(TreeType arg) { } public class TypesForSets { - static Set fill(Set set, Class type) { - try { - for(int i = 0; i < 10; i++) - set.add(type.getConstructor(int.class) - .newInstance(i)); - } catch(NoSuchMethodException | - SecurityException | - InstantiationException | - IllegalAccessException | - IllegalArgumentException | - InvocationTargetException e) { - throw new RuntimeException(e); - } + static Set + fill(Set set, Function type) { + for(int i = 0; i < 10; i++) + set.add(type.apply(i)); return set; } - static void test(Set set, Class type) { + static void + test(Set set, Function type) { fill(set, type); fill(set, type); // Try to add duplicates fill(set, type); System.out.println(set); } public static void main(String[] args) { - test(new HashSet<>(), HashType.class); - test(new LinkedHashSet<>(), HashType.class); - test(new TreeSet<>(), TreeType.class); + test(new HashSet<>(), HashType::new); + test(new LinkedHashSet<>(), HashType::new); + test(new TreeSet<>(), TreeType::new); // Things that don't work: - test(new HashSet<>(), SetType.class); - test(new HashSet<>(), TreeType.class); - test(new LinkedHashSet<>(), SetType.class); - test(new LinkedHashSet<>(), TreeType.class); + test(new HashSet<>(), SetType::new); + test(new HashSet<>(), TreeType::new); + test(new LinkedHashSet<>(), SetType::new); + test(new LinkedHashSet<>(), TreeType::new); try { - test(new TreeSet<>(), SetType.class); + test(new TreeSet<>(), SetType::new); } catch(Exception e) { System.out.println("Expected: " + e.getMessage()); } try { - test(new TreeSet<>(), HashType.class); + test(new TreeSet<>(), HashType::new); } catch(Exception e) { System.out.println("Expected: " + e.getMessage()); } diff --git a/collectionsindepth/build.xml b/collectionsindepth/build.xml index 3c003129a..bff9ce4dc 100644 --- a/collectionsindepth/build.xml +++ b/collectionsindepth/build.xml @@ -12,12 +12,10 @@ - - - + @@ -30,6 +28,7 @@ + @@ -37,7 +36,9 @@ + + @@ -51,12 +52,10 @@ - - - + @@ -69,6 +68,7 @@ + @@ -76,7 +76,9 @@ + + diff --git a/newio/MappedIO.java b/newio/MappedIO.java deleted file mode 100644 index c1cbc0edd..000000000 --- a/newio/MappedIO.java +++ /dev/null @@ -1,119 +0,0 @@ -// newio/MappedIO.java -// (c)2016 MindView LLC: see Copyright.txt -// We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. -import java.nio.*; -import java.nio.channels.*; -import java.io.*; - -public class MappedIO { - private static int numOfInts = 4_000_000; - private static int numOfUbuffInts = 1_000_000; - private abstract static class Tester { - private String name; - public Tester(String name) { this.name = name; } - public void runTest() { - System.out.print(name + ": "); - try { - long start = System.nanoTime(); - test(); - double duration = System.nanoTime() - start; - System.out.format("%.3f\n", duration/1.0e9); - } catch(IOException e) { - throw new RuntimeException(e); - } - } - public abstract void test() throws IOException; - } - private static Tester[] tests = { - new Tester("Stream Write") { - @Override - public void test() throws IOException { - try(DataOutputStream dos = new DataOutputStream( - new BufferedOutputStream( - new FileOutputStream( - new File("temp.tmp"))))) { - for(int i = 0; i < numOfInts; i++) - dos.writeInt(i); - } - } - }, - new Tester("Mapped Write") { - @Override - public void test() throws IOException { - try(FileChannel fc = - new RandomAccessFile("temp.tmp", "rw") - .getChannel()) { - IntBuffer ib = fc.map( - FileChannel.MapMode.READ_WRITE, 0, fc.size()) - .asIntBuffer(); - for(int i = 0; i < numOfInts; i++) - ib.put(i); - } - } - }, - new Tester("Stream Read") { - @Override - public void test() throws IOException { - try(DataInputStream dis = new DataInputStream( - new BufferedInputStream( - new FileInputStream("temp.tmp")))) { - for(int i = 0; i < numOfInts; i++) - dis.readInt(); - } - } - }, - new Tester("Mapped Read") { - @Override - public void test() throws IOException { - try(FileChannel fc = new FileInputStream( - new File("temp.tmp")).getChannel()) { - IntBuffer ib = fc.map( - FileChannel.MapMode.READ_ONLY, 0, fc.size()) - .asIntBuffer(); - while(ib.hasRemaining()) - ib.get(); - } - } - }, - new Tester("Stream Read/Write") { - @Override - public void test() throws IOException { - try(RandomAccessFile raf = new RandomAccessFile( - new File("temp.tmp"), "rw")) { - raf.writeInt(1); - for(int i = 0; i < numOfUbuffInts; i++) { - raf.seek(raf.length() - 4); - raf.writeInt(raf.readInt()); - } - } - } - }, - new Tester("Mapped Read/Write") { - @Override - public void test() throws IOException { - try(FileChannel fc = new RandomAccessFile( - new File("temp.tmp"), "rw").getChannel()) { - IntBuffer ib = fc.map( - FileChannel.MapMode.READ_WRITE, 0, fc.size()) - .asIntBuffer(); - ib.put(0); - for(int i = 1; i < numOfUbuffInts; i++) - ib.put(ib.get(i - 1)); - } - } - } - }; - public static void main(String[] args) { - for(Tester test : tests) - test.runTest(); - } -} -/* Output: -Stream Write: 0.329 -Mapped Write: 0.024 -Stream Read: 0.319 -Mapped Read: 0.019 -Stream Read/Write: 12.778 -Mapped Read/Write: 0.010 -*/ diff --git a/newio/build.xml b/newio/build.xml index 1f0e5062e..e8c438939 100644 --- a/newio/build.xml +++ b/newio/build.xml @@ -16,7 +16,6 @@ - @@ -32,7 +31,6 @@ - diff --git a/onjava/CountingFilledMap.java b/onjava/CountMap.java similarity index 75% rename from onjava/CountingFilledMap.java rename to onjava/CountMap.java index d7c857844..21fc010a6 100644 --- a/onjava/CountingFilledMap.java +++ b/onjava/CountMap.java @@ -1,4 +1,4 @@ -// onjava/CountingFilledMap.java +// onjava/CountMap.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. @@ -6,16 +6,24 @@ package onjava; import java.util.*; -public class CountingFilledMap +public class CountMap extends AbstractMap { private int size; - private static String[] chars = - "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" - .split(" "); - public CountingFilledMap(int size) { + private static char[] chars = + "ABCDEFGHIJKLMNOPQRSTUVWXYZ".toCharArray(); + private static String value(int key) { + return + chars[key % chars.length] + + Integer.toString(key / chars.length); + } + public CountMap(int size) { if(size < 0) this.size = 0; else this.size = size; } + @Override + public String get(Object key) { + return value((Integer)key); + } private static class Entry implements Map.Entry { int index; @@ -27,11 +35,7 @@ public boolean equals(Object o) { @Override public Integer getKey() { return index; } @Override - public String getValue() { - return - chars[index % chars.length] + - Integer.toString(index / chars.length); - } + public String getValue() { return value(index); } @Override public String setValue(String value) { throw new UnsupportedOperationException(); @@ -51,7 +55,9 @@ public Set> entrySet() { return entries; } public static void main(String[] args) { - System.out.println(new CountingFilledMap(60)); + CountMap cm = new CountMap(60); + System.out.println(cm); + System.out.println(cm.get(500)); } } /* Output: @@ -63,4 +69,5 @@ public static void main(String[] args) { 41=P1, 42=Q1, 43=R1, 44=S1, 45=T1, 46=U1, 47=V1, 48=W1, 49=X1, 50=Y1, 51=Z1, 52=A2, 53=B2, 54=C2, 55=D2, 56=E2, 57=F2, 58=G2, 59=H2} +G19 */ diff --git a/onjava/CountingIntegerList.java b/onjava/CountingIntegerList.java index 9036632db..b0a100844 100644 --- a/onjava/CountingIntegerList.java +++ b/onjava/CountingIntegerList.java @@ -9,6 +9,7 @@ public class CountingIntegerList extends AbstractList { private int size; + public CountingIntegerList() { size = 0; } public CountingIntegerList(int size) { this.size = size < 0 ? 0 : size; } @@ -19,10 +20,13 @@ public Integer get(int index) { @Override public int size() { return size; } public static void main(String[] args) { - System.out.println(new CountingIntegerList(30)); + List cil = new CountingIntegerList(30); + System.out.println(cil); + System.out.println(cil.get(500)); } } /* Output: [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, 26, 27, 28, 29] +500 */ diff --git a/onjava/Countries.java b/onjava/Countries.java index e1d983bd8..cd00edd1a 100644 --- a/onjava/Countries.java +++ b/onjava/Countries.java @@ -88,7 +88,7 @@ public class Countries { // Europe {"ALBANIA","Tirana"}, {"ANDORRA","Andorra la Vella"}, {"AUSTRIA","Vienna"}, {"BELGIUM","Brussels"}, - {"BOSNIA","-"}, {"HERZEGOVINA","Sarajevo"}, + {"BOSNIA","---"}, {"HERZEGOVINA","Sarajevo"}, {"CROATIA","Zagreb"}, {"CZECH REPUBLIC","Prague"}, {"DENMARK","Copenhagen"}, {"ESTONIA","Tallinn"}, {"FINLAND","Helsinki"}, {"FRANCE","Paris"}, @@ -119,7 +119,7 @@ public class Countries { {"HAITI","Port-au-Prince"}, {"HONDURAS","Tegucigalpa"}, {"JAMAICA","Kingston"}, {"MEXICO","Mexico City"}, {"NICARAGUA","Managua"}, - {"PANAMA","Panama City"}, {"ST. KITTS","-"}, + {"PANAMA","Panama City"}, {"ST. KITTS","---"}, {"NEVIS","Basseterre"}, {"ST. LUCIA","Castries"}, {"ST. VINCENT AND THE GRENADINES","Kingstown"}, {"UNITED STATES OF AMERICA","Washington, D.C."}, @@ -157,7 +157,7 @@ public int hashCode() { return DATA[index][0].hashCode(); } } - // Use AbstractSet by implementing size() & iterator() + // Implement size() & iterator() for AbstractSet: static class EntrySet extends AbstractSet> { private int size; diff --git a/onjava/DaemonThreadFactory.java b/onjava/DaemonThreadFactory.java deleted file mode 100644 index 9fb59c52b..000000000 --- a/onjava/DaemonThreadFactory.java +++ /dev/null @@ -1,16 +0,0 @@ -// onjava/DaemonThreadFactory.java -// (c)2016 MindView LLC: see Copyright.txt -// We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. -package onjava; -import java.util.concurrent.*; - -public class -DaemonThreadFactory implements ThreadFactory { - @Override - public Thread newThread(Runnable r) { - Thread t = new Thread(r); - t.setDaemon(true); - return t; - } -} diff --git a/onjava/DaemonThreadPoolExecutor.java b/onjava/DaemonThreadPoolExecutor.java deleted file mode 100644 index e903081e4..000000000 --- a/onjava/DaemonThreadPoolExecutor.java +++ /dev/null @@ -1,15 +0,0 @@ -// onjava/DaemonThreadPoolExecutor.java -// (c)2016 MindView LLC: see Copyright.txt -// We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. -package onjava; -import java.util.concurrent.*; - -public class DaemonThreadPoolExecutor -extends ThreadPoolExecutor { - public DaemonThreadPoolExecutor() { - super(0, Integer.MAX_VALUE, 60L, TimeUnit.SECONDS, - new SynchronousQueue<>(), - new DaemonThreadFactory()); - } -} diff --git a/onjava/Deque.java b/onjava/Deque.java deleted file mode 100644 index c83da38ec..000000000 --- a/onjava/Deque.java +++ /dev/null @@ -1,21 +0,0 @@ -// onjava/Deque.java -// (c)2016 MindView LLC: see Copyright.txt -// We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. -// Creating a Deque from a LinkedList -package onjava; -import java.util.*; - -public class Deque { - private LinkedList deque = new LinkedList<>(); - public void addFirst(T e) { deque.addFirst(e); } - public void addLast(T e) { deque.addLast(e); } - public T getFirst() { return deque.getFirst(); } - public T getLast() { return deque.getLast(); } - public T removeFirst() { return deque.removeFirst(); } - public T removeLast() { return deque.removeLast(); } - public int size() { return deque.size(); } - @Override - public String toString() { return deque.toString(); } - // And other methods as necessary... -} diff --git a/onjava/FillMap.java b/onjava/FillMap.java new file mode 100644 index 000000000..ff271d9de --- /dev/null +++ b/onjava/FillMap.java @@ -0,0 +1,38 @@ +// onjava/FillMap.java +// (c)2016 MindView LLC: see Copyright.txt +// We make no guarantees that this code is fit for any purpose. +// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +package onjava; +import java.util.*; +import java.util.function.*; +import java.util.stream.*; + +public class FillMap { + public static Map + basic(Supplier> pairGen, int size) { + return Stream.generate(pairGen) + .limit(size) + .collect( + Collectors.toMap(Pair::key, Pair::value)); + } + public static Map + basic(Supplier keyGen, + Supplier valueGen, int size) { + return Stream.generate( + () -> Pair.make(keyGen.get(), valueGen.get())) + .limit(size) + .collect( + Collectors.toMap(Pair::key, Pair::value)); + } + public static > + M create(Supplier keyGen, + Supplier valueGen, + Supplier mapSupplier, int size) { + return Stream.generate( + () -> Pair.make(keyGen.get(), valueGen.get())) + .limit(size) + .collect( + Collectors.toMap(Pair::key, Pair::value, + (k, v) -> k, mapSupplier)); + } +} diff --git a/onjava/FilledCollection.java b/onjava/FilledCollection.java deleted file mode 100644 index 382954a6b..000000000 --- a/onjava/FilledCollection.java +++ /dev/null @@ -1,20 +0,0 @@ -// onjava/FilledCollection.java -// (c)2016 MindView LLC: see Copyright.txt -// We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. -// A Collection filled with data using a generator object -package onjava; -import java.util.*; -import java.util.function.*; - -public class FilledCollection extends ArrayList { - public FilledCollection(Supplier gen, int quantity) { - for(int i = 0; i < quantity; i++) - add(gen.get()); - } - // A generic convenience method: - public static FilledCollection - list(Supplier gen, int quantity) { - return new FilledCollection<>(gen, quantity); - } -} diff --git a/onjava/FilledMap.java b/onjava/FilledMap.java deleted file mode 100644 index 7bd7afede..000000000 --- a/onjava/FilledMap.java +++ /dev/null @@ -1,65 +0,0 @@ -// onjava/FilledMap.java -// (c)2016 MindView LLC: see Copyright.txt -// We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. -// Fill a Map with data using a generator object -package onjava; -import java.util.*; -import java.util.function.*; - -public class FilledMap extends LinkedHashMap { - // A single Pair Supplier: - public FilledMap(Supplier> gen, int quantity) { - for(int i = 0; i < quantity; i++) { - Pair p = gen.get(); - put(p.key, p.value); - } - } - // Two separate Suppliers: - public FilledMap(Supplier genK, Supplier genV, - int quantity) { - for(int i = 0; i < quantity; i++) { - put(genK.get(), genV.get()); - } - } - // A key Supplier and a single value: - public - FilledMap(Supplier genK, V value, int quantity) { - for(int i = 0; i < quantity; i++) { - put(genK.get(), value); - } - } - // An Iterable and a value Supplier: - public FilledMap(Iterable genK, Supplier genV) { - for(K key : genK) { - put(key, genV.get()); - } - } - // An Iterable and a single value: - public FilledMap(Iterable genK, V value) { - for(K key : genK) { - put(key, value); - } - } - // Generic convenience methods: - public static FilledMap - map(Supplier> gen, int quantity) { - return new FilledMap<>(gen, quantity); - } - public static FilledMap - map(Supplier genK, Supplier genV, int quantity) { - return new FilledMap<>(genK, genV, quantity); - } - public static FilledMap - map(Supplier genK, V value, int quantity) { - return new FilledMap<>(genK, value, quantity); - } - public static FilledMap - map(Iterable genK, Supplier genV) { - return new FilledMap<>(genK, genV); - } - public static FilledMap - map(Iterable genK, V value) { - return new FilledMap<>(genK, value); - } -} diff --git a/onjava/Pair.java b/onjava/Pair.java index f0b4f4091..55455e639 100644 --- a/onjava/Pair.java +++ b/onjava/Pair.java @@ -11,4 +11,9 @@ public Pair(K k, V v) { key = k; value = v; } + public K key() { return key; } + public V value() { return value; } + public static Pair make(K k, V v) { + return new Pair(k, v); + } } diff --git a/onjava/Stack.java b/onjava/Stack.java index 49ae8450f..0ef58a068 100644 --- a/onjava/Stack.java +++ b/onjava/Stack.java @@ -2,18 +2,17 @@ // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. -// Making a stack from a LinkedList +// A Stack class built with an ArrayDeque package onjava; -import java.util.LinkedList; +import java.util.Deque; +import java.util.ArrayDeque; public class Stack { - private LinkedList storage = new LinkedList<>(); - public void push(T v) { storage.addFirst(v); } - public T peek() { return storage.getFirst(); } - public T pop() { return storage.removeFirst(); } - public boolean empty() { - return storage.isEmpty(); - } + private Deque storage = new ArrayDeque<>(); + public void push(T v) { storage.push(v); } + public T peek() { return storage.peek(); } + public T pop() { return storage.pop(); } + public boolean isEmpty() { return storage.isEmpty(); } @Override public String toString() { return storage.toString(); diff --git a/onjava/SwingConsole.java b/onjava/SwingConsole.java deleted file mode 100644 index a2f8158c4..000000000 --- a/onjava/SwingConsole.java +++ /dev/null @@ -1,20 +0,0 @@ -// onjava/SwingConsole.java -// (c)2016 MindView LLC: see Copyright.txt -// We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. -// Tool for running Swing demos from the -// console, both applets and JFrames -package onjava; -import javax.swing.*; - -public class SwingConsole { - public static void - run(final JFrame f, final int width, final int height) { - SwingUtilities.invokeLater(() -> { - f.setTitle(f.getClass().getSimpleName()); - f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - f.setSize(width, height); - f.setVisible(true); - }); - } -} diff --git a/onjava/TaskItem.java b/onjava/TaskItem.java deleted file mode 100644 index 5c9cfdcac..000000000 --- a/onjava/TaskItem.java +++ /dev/null @@ -1,16 +0,0 @@ -// onjava/TaskItem.java -// (c)2016 MindView LLC: see Copyright.txt -// We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. -// A Future and the Callable that produced it -package onjava; -import java.util.concurrent.*; - -public class TaskItem> { - public final Future future; - public final C task; - public TaskItem(Future future, C task) { - this.future = future; - this.task = task; - } -} diff --git a/onjava/TaskManager.java b/onjava/TaskManager.java deleted file mode 100644 index 77c021473..000000000 --- a/onjava/TaskManager.java +++ /dev/null @@ -1,48 +0,0 @@ -// onjava/TaskManager.java -// (c)2016 MindView LLC: see Copyright.txt -// We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. -// Managing and executing a queue of tasks -package onjava; -import java.util.concurrent.*; -import java.util.*; - -public class TaskManager> -extends ArrayList> { - private ExecutorService exec = - Executors.newSingleThreadExecutor(); - public void add(C task) { - add(new TaskItem<>(exec.submit(task),task)); - } - public List getResults() { - Iterator> items = iterator(); - List results = new ArrayList<>(); - while(items.hasNext()) { - TaskItem item = items.next(); - if(item.future.isDone()) { - try { - results.add(item.future.get()); - } catch(InterruptedException | - ExecutionException e) { - throw new RuntimeException(e); - } - items.remove(); - } - } - return results; - } - public List purge() { - Iterator> items = iterator(); - List results = new ArrayList<>(); - while(items.hasNext()) { - TaskItem item = items.next(); - // Leave completed tasks for results reporting: - if(!item.future.isDone()) { - results.add("Cancelling " + item.task); - item.future.cancel(true); // Can interrupt - items.remove(); - } - } - return results; - } -} diff --git a/onjava/build.xml b/onjava/build.xml index d224e4aec..640a60478 100644 --- a/onjava/build.xml +++ b/onjava/build.xml @@ -8,8 +8,8 @@ - + @@ -18,8 +18,8 @@ - + diff --git a/patterns/SingletonPattern.java b/patterns/SingletonPattern.java deleted file mode 100644 index 02ff19de5..000000000 --- a/patterns/SingletonPattern.java +++ /dev/null @@ -1,37 +0,0 @@ -// patterns/SingletonPattern.java -// (c)2016 MindView LLC: see Copyright.txt -// We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. -// Since this isn't inherited from a Cloneable -// base class and cloneability isn't added, -// making it final prevents cloneability from -// being added through inheritance: - -final class Singleton { - private static Singleton s = new Singleton(47); - private int i; - private Singleton(int x) { i = x; } - public static Singleton getHandle() { - return s; - } - public int getValue() { return i; } - public void setValue(int x) { i = x; } -} - -public class SingletonPattern { - public static void main(String[] args) { - Singleton s = Singleton.getHandle(); - System.out.println(s.getValue()); - Singleton s2 = Singleton.getHandle(); - s2.setValue(9); - System.out.println(s.getValue()); - try { - // Can't do this: compile-time error. - // Singleton s3 = (Singleton)s2.clone(); - } catch(Exception e) {} - } -} -/* Output: -47 -9 -*/ diff --git a/patterns/build.xml b/patterns/build.xml index e5a9d2dbf..1e957fc4a 100644 --- a/patterns/build.xml +++ b/patterns/build.xml @@ -12,7 +12,6 @@ - @@ -40,7 +39,6 @@ - diff --git a/staticchecking/drc/DogAndRobotCollections.java b/staticchecking/drc/DogAndRobotCollections.java index e8cfaccc2..382a74ad9 100644 --- a/staticchecking/drc/DogAndRobotCollections.java +++ b/staticchecking/drc/DogAndRobotCollections.java @@ -24,10 +24,10 @@ public static void main(String[] args) { List dogList = new ArrayList<>(); List robotList = new ArrayList<>(); for(int i = 0; i < 10; i++) - dogList.add(new Dog()); + dogList.add(new Dog()); //- dogList.add(new Robot()); // Compile-time error for(int i = 0; i < 10; i++) - robotList.add(new Robot()); + robotList.add(new Robot()); //- robotList.add(new Dog()); // Compile-time error dogList.forEach(Dog::talk); robotList.forEach(Robot::talk); diff --git a/swt/ColorBoxes.java b/swt/ColorBoxes.java deleted file mode 100644 index 543875b2c..000000000 --- a/swt/ColorBoxes.java +++ /dev/null @@ -1,83 +0,0 @@ -// swt/ColorBoxes.java -// (c)2016 MindView LLC: see Copyright.txt -// We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. -// SWT translation of Swing ColorBoxes.java -import swt.util.*; -import org.eclipse.swt.*; -import org.eclipse.swt.widgets.*; -import org.eclipse.swt.events.*; -import org.eclipse.swt.graphics.*; -import org.eclipse.swt.layout.*; -import java.util.concurrent.*; -import java.util.*; -import onjava.*; - -class CBox extends Canvas implements Runnable { - class CBoxPaintListener implements PaintListener { - public void paintControl(PaintEvent e) { - Color color = new Color(e.display, cColor); - e.gc.setBackground(color); - Point size = getSize(); - e.gc.fillRectangle(0, 0, size.x, size.y); - color.dispose(); - } - } - private static SplittableRandom rand = new SplittableRandom(); - private static RGB newColor() { - return new RGB(rand.nextInt(255), - rand.nextInt(255), rand.nextInt(255)); - } - private int pause; - private RGB cColor = newColor(); - public CBox(Composite parent, int pause) { - super(parent, SWT.NONE); - this.pause = pause; - addPaintListener(new CBoxPaintListener()); - } - @Override - public void run() { - try { - while(!Thread.interrupted()) { - cColor = newColor(); - getDisplay().asyncExec( () -> { - try { redraw(); } catch(SWTException e) {} - // SWTException is OK when the parent - // is terminated from under us. - }); - TimeUnit.MILLISECONDS.sleep(pause); - } - } catch(InterruptedException e) { - // Acceptable way to exit - } catch(SWTException e) { - // Acceptable way to exit: our parent - // was terminated from under us. - } - } -} - -public class ColorBoxes implements SWTApplication { - private int grid = 12; - private int pause = 50; - @Override - public void createContents(Composite parent) { - GridLayout gridLayout = new GridLayout(grid, true); - gridLayout.horizontalSpacing = 0; - gridLayout.verticalSpacing = 0; - parent.setLayout(gridLayout); - ExecutorService exec = new DaemonThreadPoolExecutor(); - for(int i = 0; i < (grid * grid); i++) { - final CBox cb = new CBox(parent, pause); - cb.setLayoutData(new GridData(GridData.FILL_BOTH)); - exec.execute(cb); - } - } - public static void main(String[] args) { - ColorBoxes boxes = new ColorBoxes(); - if(args.length > 0) - boxes.grid = new Integer(args[0]); - if(args.length > 1) - boxes.pause = new Integer(args[1]); - SWTConsole.run(boxes, 500, 400); - } -} diff --git a/swt/DisplayEnvironment.java b/swt/DisplayEnvironment.java deleted file mode 100644 index b2169113b..000000000 --- a/swt/DisplayEnvironment.java +++ /dev/null @@ -1,25 +0,0 @@ -// swt/DisplayEnvironment.java -// (c)2016 MindView LLC: see Copyright.txt -// We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. -import swt.util.*; -import org.eclipse.swt.*; -import org.eclipse.swt.widgets.*; -import org.eclipse.swt.layout.*; -import java.util.*; - -public class -DisplayEnvironment implements SWTApplication { - @Override - public void createContents(Composite parent) { - parent.setLayout(new FillLayout()); - Text text = new Text(parent, SWT.WRAP | SWT.V_SCROLL); - for(Map.Entry entry: System.getenv().entrySet()) { - text.append(entry.getKey() + ": " + - entry.getValue() + "\n"); - } - } - public static void main(String[] args) { - SWTConsole.run(new DisplayEnvironment(), 800, 600); - } -} diff --git a/swt/DisplayProperties.java b/swt/DisplayProperties.java deleted file mode 100644 index 39548b959..000000000 --- a/swt/DisplayProperties.java +++ /dev/null @@ -1,26 +0,0 @@ -// swt/DisplayProperties.java -// (c)2016 MindView LLC: see Copyright.txt -// We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. -import org.eclipse.swt.*; -import org.eclipse.swt.widgets.*; -import org.eclipse.swt.layout.*; -import java.io.*; - -public class DisplayProperties { - public static void main(String[] args) { - Display display = new Display(); - Shell shell = new Shell(display); - shell.setText("Display Properties"); - shell.setLayout(new FillLayout()); - Text text = new Text(shell, SWT.WRAP | SWT.V_SCROLL); - StringWriter props = new StringWriter(); - System.getProperties().list(new PrintWriter(props)); - text.setText(props.toString()); - shell.open(); - while(!shell.isDisposed()) - if(!display.readAndDispatch()) - display.sleep(); - display.dispose(); - } -} diff --git a/swt/HelloSWT.java b/swt/HelloSWT.java deleted file mode 100644 index a8f2f14aa..000000000 --- a/swt/HelloSWT.java +++ /dev/null @@ -1,20 +0,0 @@ -// swt/HelloSWT.java -// (c)2016 MindView LLC: see Copyright.txt -// We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. -// {Requires: org.eclipse.swt.widgets.Display; You must -// install the SWT library from http://www.eclipse.org } -import org.eclipse.swt.widgets.*; - -public class HelloSWT { - public static void main(String[] args) { - Display display = new Display(); - Shell shell = new Shell(display); - shell.setText("Hi there, SWT!"); // Title bar - shell.open(); - while(!shell.isDisposed()) - if(!display.readAndDispatch()) - display.sleep(); - display.dispose(); - } -} diff --git a/swt/Menus.java b/swt/Menus.java deleted file mode 100644 index 18c54b9e7..000000000 --- a/swt/Menus.java +++ /dev/null @@ -1,60 +0,0 @@ -// swt/Menus.java -// (c)2016 MindView LLC: see Copyright.txt -// We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. -// Fun with menus -import swt.util.*; -import org.eclipse.swt.*; -import org.eclipse.swt.widgets.*; -import java.util.*; -import java.io.IOException; -import java.nio.file.*; -import java.util.stream.*; - -public class Menus implements SWTApplication { - private static Shell shell; - @Override - public void createContents(Composite parent) { - shell = parent.getShell(); - Menu bar = new Menu(shell, SWT.BAR); - shell.setMenuBar(bar); - Set words = null; - try { - words = Files.lines(Paths.get("Menus.java")) - .flatMap(s -> Arrays.stream(s.split("\\W+"))) - .filter(s -> !s.matches("[0-9]+")) // No numbers - .map(String::trim) - .collect(Collectors.toCollection(TreeSet::new)); - } catch(IOException e) { - throw new RuntimeException(e); - } - Iterator it = words.iterator(); - MenuItem[] mItem = new MenuItem[7]; - for(int i = 0; i < mItem.length; i++) { - mItem[i] = new MenuItem(bar, SWT.CASCADE); - mItem[i].setText(it.next()); - Menu submenu = new Menu(shell, SWT.DROP_DOWN); - mItem[i].setMenu(submenu); - } - int i = 0; - while(it.hasNext()) { - addItem(bar, it, mItem[i]); - i = (i + 1) % mItem.length; - } - } - static Listener listener = new Listener() { - public void handleEvent(Event e) { - System.out.println(e.toString()); - } - }; - void - addItem(Menu bar, Iterator it, MenuItem mItem) { - MenuItem item = - new MenuItem(mItem.getMenu(),SWT.PUSH); - item.addListener(SWT.Selection, listener); - item.setText(it.next()); - } - public static void main(String[] args) { - SWTConsole.run(new Menus(), 600, 200); - } -} diff --git a/swt/ShellsAreMainWindows.java b/swt/ShellsAreMainWindows.java deleted file mode 100644 index 3d64b9f2b..000000000 --- a/swt/ShellsAreMainWindows.java +++ /dev/null @@ -1,29 +0,0 @@ -// swt/ShellsAreMainWindows.java -// (c)2016 MindView LLC: see Copyright.txt -// We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. -import org.eclipse.swt.widgets.*; - -public class ShellsAreMainWindows { - static Shell[] shells = new Shell[10]; - public static void main(String[] args) { - Display display = new Display(); - for(int i = 0; i < shells.length; i++) { - shells[i] = new Shell(display); - shells[i].setText("Shell #" + i); - shells[i].open(); - } - while(!shellsDisposed()) - if(!display.readAndDispatch()) - display.sleep(); - display.dispose(); - } - static boolean shellsDisposed() { - for(Shell shell : shells) { - if(shell.isDisposed()) { - return true; - } - } - return false; - } -} diff --git a/swt/SineWave.java b/swt/SineWave.java deleted file mode 100644 index 3d644656b..000000000 --- a/swt/SineWave.java +++ /dev/null @@ -1,77 +0,0 @@ -// swt/SineWave.java -// (c)2016 MindView LLC: see Copyright.txt -// We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. -// SWT translation of Swing SineWave.java -import swt.util.*; -import org.eclipse.swt.*; -import org.eclipse.swt.widgets.*; -import org.eclipse.swt.events.*; -import org.eclipse.swt.layout.*; - -class SineDraw extends Canvas { - private static final int SCALEFACTOR = 200; - private int cycles; - private int points; - private double[] sines; - private int[] pts; - public SineDraw(Composite parent, int style) { - super(parent, style); - addPaintListener(new PaintListener() { - public void paintControl(PaintEvent e) { - int maxWidth = getSize().x; - double hstep = (double)maxWidth / (double)points; - int maxHeight = getSize().y; - pts = new int[points]; - for(int i = 0; i < points; i++) - pts[i] = (int)((sines[i] * maxHeight / 2 * .95) - + (maxHeight / 2)); - e.gc.setForeground( - e.display.getSystemColor(SWT.COLOR_RED)); - for(int i = 1; i < points; i++) { - int x1 = (int)((i - 1) * hstep); - int x2 = (int)(i * hstep); - int y1 = pts[i - 1]; - int y2 = pts[i]; - e.gc.drawLine(x1, y1, x2, y2); - } - } - }); - setCycles(5); - } - public void setCycles(int newCycles) { - cycles = newCycles; - points = SCALEFACTOR * cycles * 2; - sines = new double[points]; - for(int i = 0; i < points; i++) { - double radians = (Math.PI / SCALEFACTOR) * i; - sines[i] = Math.sin(radians); - } - redraw(); - } -} - -public class SineWave implements SWTApplication { - private SineDraw sines; - private Slider slider; - @Override - public void createContents(Composite parent) { - parent.setLayout(new GridLayout(1, true)); - sines = new SineDraw(parent, SWT.NONE); - sines.setLayoutData( - new GridData(SWT.FILL, SWT.FILL, true, true)); - sines.setFocus(); - slider = new Slider(parent, SWT.HORIZONTAL); - slider.setValues(5, 1, 30, 1, 1, 1); - slider.setLayoutData( - new GridData(SWT.FILL, SWT.DEFAULT, true, false)); - slider.addSelectionListener(new SelectionAdapter() { - public void widgetSelected(SelectionEvent event) { - sines.setCycles(slider.getSelection()); - } - }); - } - public static void main(String[] args) { - SWTConsole.run(new SineWave(), 700, 400); - } -} diff --git a/swt/TabbedPane.java b/swt/TabbedPane.java deleted file mode 100644 index f0a411080..000000000 --- a/swt/TabbedPane.java +++ /dev/null @@ -1,152 +0,0 @@ -// swt/TabbedPane.java -// (c)2016 MindView LLC: see Copyright.txt -// We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. -// Placing SWT components in tabbed panes -import swt.util.*; -import org.eclipse.swt.*; -import org.eclipse.swt.widgets.*; -import org.eclipse.swt.events.*; -import org.eclipse.swt.graphics.*; -import org.eclipse.swt.layout.*; -import org.eclipse.swt.browser.*; - -public class TabbedPane implements SWTApplication { - private static TabFolder folder; - private static Shell shell; - @Override - public void createContents(Composite parent) { - shell = parent.getShell(); - parent.setLayout(new FillLayout()); - folder = new TabFolder(shell, SWT.BORDER); - labelTab(); - directoryDialogTab(); - buttonTab(); - sliderTab(); - scribbleTab(); - browserTab(); - } - public static void labelTab() { - TabItem tab = new TabItem(folder, SWT.CLOSE); - tab.setText("A Label"); // Text on the tab - tab.setToolTipText("A simple label"); - Label label = new Label(folder, SWT.CENTER); - label.setText("Label text"); - tab.setControl(label); - } - public static void directoryDialogTab() { - TabItem tab = new TabItem(folder, SWT.CLOSE); - tab.setText("Directory Dialog"); - tab.setToolTipText("Select a directory"); - final Button b = new Button(folder, SWT.PUSH); - b.setText("Select a Directory"); - b.addListener(SWT.MouseDown, new Listener() { - public void handleEvent(Event e) { - DirectoryDialog dd = new DirectoryDialog(shell); - String path = dd.open(); - if(path != null) - b.setText(path); - } - }); - tab.setControl(b); - } - public static void buttonTab() { - TabItem tab = new TabItem(folder, SWT.CLOSE); - tab.setText("Buttons"); - tab.setToolTipText("Different kinds of Buttons"); - Composite composite = new Composite(folder, SWT.NONE); - composite.setLayout(new GridLayout(4, true)); - for(int dir : new int[]{ - SWT.UP, SWT.RIGHT, SWT.LEFT, SWT.DOWN - }) { - Button b = new Button(composite, SWT.ARROW | dir); - b.addListener(SWT.MouseDown, listener); - } - newButton(composite, SWT.CHECK, "Check button"); - newButton(composite, SWT.PUSH, "Push button"); - newButton(composite, SWT.RADIO, "Radio button"); - newButton(composite, SWT.TOGGLE, "Toggle button"); - newButton(composite, SWT.FLAT, "Flat button"); - tab.setControl(composite); - } - private static Listener listener = new Listener() { - public void handleEvent(Event e) { - MessageBox m = new MessageBox(shell, SWT.OK); - m.setMessage(e.toString()); - m.open(); - } - }; - private static void newButton(Composite composite, - int type, String label) { - Button b = new Button(composite, type); - b.setText(label); - b.addListener(SWT.MouseDown, listener); - } - public static void sliderTab() { - TabItem tab = new TabItem(folder, SWT.CLOSE); - tab.setText("Sliders and Progress bars"); - tab.setToolTipText("Tied Slider to ProgressBar"); - Composite composite = new Composite(folder, SWT.NONE); - composite.setLayout(new GridLayout(2, true)); - final Slider slider = - new Slider(composite, SWT.HORIZONTAL); - final ProgressBar progress = - new ProgressBar(composite, SWT.HORIZONTAL); - slider.addSelectionListener(new SelectionAdapter() { - public void widgetSelected(SelectionEvent event) { - progress.setSelection(slider.getSelection()); - } - }); - tab.setControl(composite); - } - public static void scribbleTab() { - TabItem tab = new TabItem(folder, SWT.CLOSE); - tab.setText("Scribble"); - tab.setToolTipText("Simple graphics: drawing"); - final Canvas canvas = new Canvas(folder, SWT.NONE); - ScribbleMouseListener sml = - new ScribbleMouseListener(); - canvas.addMouseListener(sml); - canvas.addMouseMoveListener(sml); - tab.setControl(canvas); - } - private static class ScribbleMouseListener - extends MouseAdapter implements MouseMoveListener { - private Point p = new Point(0, 0); - public void mouseMove(MouseEvent e) { - if((e.stateMask & SWT.BUTTON1) == 0) - return; - GC gc = new GC((Canvas)e.widget); - gc.drawLine(p.x, p.y, e.x, e.y); - gc.dispose(); - updatePoint(e); - } - public void mouseDown(MouseEvent e) { - updatePoint(e); - } - private void updatePoint(MouseEvent e) { - p.x = e.x; - p.y = e.y; - } - } - public static void browserTab() { - TabItem tab = new TabItem(folder, SWT.CLOSE); - tab.setText("A Browser"); - tab.setToolTipText("A Web browser"); - Browser browser = null; - try { - browser = new Browser(folder, SWT.NONE); - } catch(SWTError e) { - Label label = new Label(folder, SWT.BORDER); - label.setText("Could not initialize browser"); - tab.setControl(label); - } - if(browser != null) { - browser.setUrl("http://www.MindviewInc.com"); - tab.setControl(browser); - } - } - public static void main(String[] args) { - SWTConsole.run(new TabbedPane(), 800, 600); - } -} diff --git a/swt/build.xml b/swt/build.xml deleted file mode 100644 index d702220d8..000000000 --- a/swt/build.xml +++ /dev/null @@ -1,32 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/swt/util/SWTApplication.java b/swt/util/SWTApplication.java deleted file mode 100644 index 407b258d2..000000000 --- a/swt/util/SWTApplication.java +++ /dev/null @@ -1,10 +0,0 @@ -// swt/util/SWTApplication.java -// (c)2016 MindView LLC: see Copyright.txt -// We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. -package swt.util; -import org.eclipse.swt.widgets.*; - -public interface SWTApplication { - void createContents(Composite parent); -} diff --git a/swt/util/SWTConsole.java b/swt/util/SWTConsole.java deleted file mode 100644 index 396ee9a8f..000000000 --- a/swt/util/SWTConsole.java +++ /dev/null @@ -1,23 +0,0 @@ -// swt/util/SWTConsole.java -// (c)2016 MindView LLC: see Copyright.txt -// We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. -package swt.util; -import org.eclipse.swt.widgets.*; - -public class SWTConsole { - public static void - run(SWTApplication swtApp, int width, int height) { - Display display = new Display(); - Shell shell = new Shell(display); - shell.setText(swtApp.getClass().getSimpleName()); - swtApp.createContents(shell); - shell.setSize(width, height); - shell.open(); - while(!shell.isDisposed()) { - if(!display.readAndDispatch()) - display.sleep(); - } - display.dispose(); - } -} diff --git a/tasks/ActiveObjectDemo.java b/tasks/ActiveObjectDemo.java deleted file mode 100644 index f39bb0dc2..000000000 --- a/tasks/ActiveObjectDemo.java +++ /dev/null @@ -1,89 +0,0 @@ -// tasks/ActiveObjectDemo.java -// (c)2016 MindView LLC: see Copyright.txt -// We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. -// Can only pass constants, immutables, "disconnected -// objects," or other active objects as arguments -// to asynch methods -import java.util.concurrent.*; -import java.util.*; - -public class ActiveObjectDemo { - private ExecutorService ex = - Executors.newSingleThreadExecutor(); - private SplittableRandom rand = new SplittableRandom(47); - // Insert a random delay to produce the effect - // of a calculation time: - private void pause(int factor) { - try { - TimeUnit.MILLISECONDS.sleep( - 100 + rand.nextInt(factor)); - } catch(InterruptedException e) { - System.out.println("sleep() interrupted"); - } - } - public Future - calculateInt(final int x, final int y) { - return ex.submit(() -> { - System.out.println("starting " + x + " + " + y); - pause(500); - return x + y; - }); - } - public Future - calculateFloat(final float x, final float y) { - return ex.submit(() -> { - System.out.println("starting " + x + " + " + y); - pause(2000); - return x + y; - }); - } - public void shutdown() { ex.shutdown(); } - public static void main(String[] args) { - ActiveObjectDemo d1 = new ActiveObjectDemo(); - // Prevents ConcurrentModificationException: - List> results = - new CopyOnWriteArrayList<>(); - for(float f = 0.0f; f < 1.0f; f += 0.2f) - results.add(d1.calculateFloat(f, f)); - for(int i = 0; i < 5; i++) - results.add(d1.calculateInt(i, i)); - System.out.println("All asynch calls made"); - while(results.size() > 0) { - for(Future f : results) - if(f.isDone()) { - try { - System.out.println(f.get()); - } catch(InterruptedException | - ExecutionException e) { - throw new RuntimeException(e); - } - results.remove(f); - } - } - d1.shutdown(); - } -} -/* Output: -starting 0.0 + 0.0 -All asynch calls made -0.0 -starting 0.2 + 0.2 -0.4 -starting 0.4 + 0.4 -0.8 -starting 0.6 + 0.6 -1.2 -starting 0.8 + 0.8 -1.6 -starting 0 + 0 -starting 1 + 1 -0 -2 -starting 2 + 2 -4 -starting 3 + 3 -6 -starting 4 + 4 -8 -*/ diff --git a/tasks/BasicThreads.java b/tasks/BasicThreads.java deleted file mode 100644 index 49b841913..000000000 --- a/tasks/BasicThreads.java +++ /dev/null @@ -1,18 +0,0 @@ -// tasks/BasicThreads.java -// (c)2016 MindView LLC: see Copyright.txt -// We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. -// The most basic use of the Thread class - -public class BasicThreads { - public static void main(String[] args) { - Thread t = new Thread(new LiftOff()); - t.start(); - System.out.println("Waiting for LiftOff"); - } -} -/* Output: -Waiting for LiftOff -#0(9), #0(8), #0(7), #0(6), #0(5), #0(4), #0(3), #0(2), -#0(1), #0(Liftoff!), -*/ diff --git a/tasks/CachedThreadPool.java b/tasks/CachedThreadPool.java deleted file mode 100644 index 715a80481..000000000 --- a/tasks/CachedThreadPool.java +++ /dev/null @@ -1,23 +0,0 @@ -// tasks/CachedThreadPool.java -// (c)2016 MindView LLC: see Copyright.txt -// We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. -import java.util.concurrent.*; - -public class CachedThreadPool { - public static void main(String[] args) { - ExecutorService e = Executors.newCachedThreadPool(); - for(int i = 0; i < 5; i++) - e.execute(new LiftOff()); - e.shutdown(); - } -} -/* Output: -#0(9), #4(9), #3(9), #1(9), #2(9), #1(8), #3(8), #4(8), -#0(8), #4(7), #3(7), #1(7), #2(8), #3(6), #4(6), #0(7), -#4(5), #3(5), #1(6), #2(7), #1(5), #3(4), #4(4), #0(6), -#4(3), #3(3), #1(4), #2(6), #4(2), #0(5), #1(3), #0(4), -#4(1), #0(3), #1(2), #2(5), #3(2), #2(4), #1(1), #0(2), -#4(Liftoff!), #0(1), #1(Liftoff!), #2(3), #3(1), #2(2), -#0(Liftoff!), #2(1), #3(Liftoff!), #2(Liftoff!), -*/ diff --git a/tasks/CallableDemo.java b/tasks/CallableDemo.java deleted file mode 100644 index 6321980f0..000000000 --- a/tasks/CallableDemo.java +++ /dev/null @@ -1,50 +0,0 @@ -// tasks/CallableDemo.java -// (c)2016 MindView LLC: see Copyright.txt -// We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. -import java.util.concurrent.*; -import java.util.*; - -class TaskWithResult implements Callable { - private int id; - public TaskWithResult(int id) { - this.id = id; - } - @Override - public String call() { - return "result of TaskWithResult " + id; - } -} - -public class CallableDemo { - public static void main(String[] args) { - ExecutorService es = Executors.newCachedThreadPool(); - ArrayList> results = new ArrayList<>(); - for(int i = 0; i < 10; i++) - results.add(es.submit(new TaskWithResult(i))); - for(Future fs : results) - try { - // get() blocks until completion: - System.out.println(fs.get()); - } catch(InterruptedException e) { - System.out.println(e); - return; - } catch(ExecutionException e) { - System.out.println(e); - } finally { - es.shutdown(); - } - } -} -/* Output: -result of TaskWithResult 0 -result of TaskWithResult 1 -result of TaskWithResult 2 -result of TaskWithResult 3 -result of TaskWithResult 4 -result of TaskWithResult 5 -result of TaskWithResult 6 -result of TaskWithResult 7 -result of TaskWithResult 8 -result of TaskWithResult 9 -*/ diff --git a/tasks/CountDownLatchDemo.java b/tasks/CountDownLatchDemo.java deleted file mode 100644 index 15feb8d91..000000000 --- a/tasks/CountDownLatchDemo.java +++ /dev/null @@ -1,97 +0,0 @@ -// tasks/CountDownLatchDemo.java -// (c)2016 MindView LLC: see Copyright.txt -// We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. -import java.util.concurrent.*; -import java.util.*; - -// Performs some portion of a task: -class TaskPortion implements Runnable { - private static int counter = 0; - private final int id = counter++; - private static SplittableRandom rand = new SplittableRandom(47); - private final CountDownLatch latch; - TaskPortion(CountDownLatch latch) { - this.latch = latch; - } - @Override - public void run() { - try { - doWork(); - latch.countDown(); - } catch(InterruptedException ex) { - // Acceptable way to exit - } - } - public void doWork() throws InterruptedException { - TimeUnit.MILLISECONDS.sleep(rand.nextInt(2000)); - System.out.println(this + "completed"); - } - @Override - public String toString() { - return String.format("%1$-3d ", id); - } -} - -// Waits on the CountDownLatch: -class WaitingTask implements Runnable { - private static int counter = 0; - private final int id = counter++; - private final CountDownLatch latch; - WaitingTask(CountDownLatch latch) { - this.latch = latch; - } - @Override - public void run() { - try { - latch.await(); - System.out.println( - "Latch barrier passed for " + this); - } catch(InterruptedException ex) { - System.out.println(this + " interrupted"); - } - } - @Override - public String toString() { - return String.format("WaitingTask %1$-3d ", id); - } -} - -public class CountDownLatchDemo { - static final int SIZE = 100; - public static void - main(String[] args) throws Exception { - ExecutorService es = Executors.newCachedThreadPool(); - // All must share a single CountDownLatch object: - CountDownLatch latch = new CountDownLatch(SIZE); - for(int i = 0; i < 10; i++) - es.execute(new WaitingTask(latch)); - for(int i = 0; i < SIZE; i++) - es.execute(new TaskPortion(latch)); - System.out.println("Launched all tasks"); - es.shutdown(); // Quit when all tasks complete - } -} -/* Output: (First and last 10 Lines) -Launched all tasks -56 completed -99 completed -28 completed -92 completed -90 completed -8 completed -14 completed -71 completed -5 completed -________...________...________...________...________ -Latch barrier passed for WaitingTask 0 -Latch barrier passed for WaitingTask 2 -Latch barrier passed for WaitingTask 8 -Latch barrier passed for WaitingTask 9 -Latch barrier passed for WaitingTask 6 -Latch barrier passed for WaitingTask 5 -Latch barrier passed for WaitingTask 4 -Latch barrier passed for WaitingTask 3 -Latch barrier passed for WaitingTask 1 -Latch barrier passed for WaitingTask 7 -*/ diff --git a/tasks/DaemonFromFactory.java b/tasks/DaemonFromFactory.java deleted file mode 100644 index 210a81609..000000000 --- a/tasks/DaemonFromFactory.java +++ /dev/null @@ -1,44 +0,0 @@ -// tasks/DaemonFromFactory.java -// (c)2016 MindView LLC: see Copyright.txt -// We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. -// Using a Thread Factory to create daemons -import java.util.concurrent.*; -import onjava.*; - -public class DaemonFromFactory implements Runnable { - @Override - public void run() { - try { - while(true) { - TimeUnit.MILLISECONDS.sleep(100); - System.out.println( - Thread.currentThread() + " " + this); - } - } catch(InterruptedException e) { - System.out.println("Interrupted"); - } - } - public static void - main(String[] args) throws Exception { - ExecutorService exec = Executors.newCachedThreadPool( - new DaemonThreadFactory()); - for(int i = 0; i < 10; i++) - exec.execute(new DaemonFromFactory()); - System.out.println("All daemons started"); - TimeUnit.MILLISECONDS.sleep(500); // Run for a while - } -} -/* Output: (First 10 Lines) -All daemons started -Thread[Thread-2,5,main] DaemonFromFactory@1bb3d5e -Thread[Thread-8,5,main] DaemonFromFactory@12aef8a -Thread[Thread-9,5,main] DaemonFromFactory@b5ecf4 -Thread[Thread-0,5,main] DaemonFromFactory@3e3d06 -Thread[Thread-1,5,main] DaemonFromFactory@425a41 -Thread[Thread-5,5,main] DaemonFromFactory@4f61c0 -Thread[Thread-4,5,main] DaemonFromFactory@53f1ba -Thread[Thread-6,5,main] DaemonFromFactory@baf372 -Thread[Thread-3,5,main] DaemonFromFactory@1437b8f - ... -*/ diff --git a/tasks/Daemons.java b/tasks/Daemons.java deleted file mode 100644 index 2085d1f67..000000000 --- a/tasks/Daemons.java +++ /dev/null @@ -1,57 +0,0 @@ -// tasks/Daemons.java -// (c)2016 MindView LLC: see Copyright.txt -// We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. -// Daemon threads spawn other daemon threads -import java.util.concurrent.*; - -class Daemon implements Runnable { - private Thread[] t = new Thread[10]; - @Override - public void run() { - for(int i = 0; i < t.length; i++) { - t[i] = new Thread(new DaemonSpawn()); - t[i].start(); - System.out.print("DaemonSpawn " + i + " started, "); - } - for(int i = 0; i < t.length; i++) - System.out.print("t[" + i + "].isDaemon() = " + - t[i].isDaemon() + ", "); - while(true) - Thread.yield(); - } -} - -class DaemonSpawn implements Runnable { - @Override - public void run() { - while(true) - Thread.yield(); - } -} - -public class Daemons { - public static void - main(String[] args) throws Exception { - Thread d = new Thread(new Daemon()); - d.setDaemon(true); - d.start(); - System.out.print( - "d.isDaemon() = " + d.isDaemon() + ", "); - // Allow the daemon threads to - // finish their startup processes: - TimeUnit.SECONDS.sleep(1); - } -} -/* Output: -d.isDaemon() = true, DaemonSpawn 0 started, DaemonSpawn 1 -started, DaemonSpawn 2 started, DaemonSpawn 3 started, -DaemonSpawn 4 started, DaemonSpawn 5 started, DaemonSpawn 6 -started, DaemonSpawn 7 started, DaemonSpawn 8 started, -DaemonSpawn 9 started, t[0].isDaemon() = true, -t[1].isDaemon() = true, t[2].isDaemon() = true, -t[3].isDaemon() = true, t[4].isDaemon() = true, -t[5].isDaemon() = true, t[6].isDaemon() = true, -t[7].isDaemon() = true, t[8].isDaemon() = true, -t[9].isDaemon() = true, -*/ diff --git a/tasks/DaemonsDoRunFinally.java b/tasks/DaemonsDoRunFinally.java deleted file mode 100644 index 1abc95f1b..000000000 --- a/tasks/DaemonsDoRunFinally.java +++ /dev/null @@ -1,35 +0,0 @@ -// tasks/DaemonsDoRunFinally.java -// (c)2016 MindView LLC: see Copyright.txt -// We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. -// Daemon threads now run the finally clause -import java.util.concurrent.*; - -class ADaemon implements Runnable { - @Override - public void run() { - try { - System.out.println("Starting ADaemon"); - TimeUnit.SECONDS.sleep(1); - } catch(InterruptedException e) { - System.out.println( - "Exiting via InterruptedException"); - } finally { - System.out.println("ADaemon finally clause"); - } - } -} - -public class DaemonsDoRunFinally { - public static void - main(String[] args) throws Exception { - Thread t = new Thread(new ADaemon()); - t.setDaemon(true); - t.start(); - TimeUnit.SECONDS.sleep(2); - } -} -/* Output: -Starting ADaemon -ADaemon finally clause -*/ diff --git a/tasks/ExchangerDemo.java b/tasks/ExchangerDemo.java deleted file mode 100644 index 358dfe1e2..000000000 --- a/tasks/ExchangerDemo.java +++ /dev/null @@ -1,85 +0,0 @@ -// tasks/ExchangerDemo.java -// (c)2016 MindView LLC: see Copyright.txt -// We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. -import java.util.concurrent.*; -import java.util.*; -import java.util.function.*; -import onjava.*; - -class ExchangerProducer implements Runnable { - private Supplier generator; - private Exchanger> exchanger; - private List holder; - ExchangerProducer(Exchanger> exchg, - Supplier gen, List holder) { - exchanger = exchg; - generator = gen; - this.holder = holder; - } - @Override - public void run() { - try { - while(!Thread.interrupted()) { - for(int i = 0; i < ExchangerDemo.size; i++) - holder.add(generator.get()); - // Exchange full for empty: - holder = exchanger.exchange(holder); - } - } catch(InterruptedException e) { - // OK to terminate this way. - } - } -} - -class ExchangerConsumer implements Runnable { - private Exchanger> exchanger; - private List holder; - private volatile T value; - ExchangerConsumer( - Exchanger> ex, List holder) { - exchanger = ex; - this.holder = holder; - } - @Override - public void run() { - try { - while(!Thread.interrupted()) { - holder = exchanger.exchange(holder); - for(T x : holder) { - value = x; // Fetch out value - holder.remove(x); // OK for CopyOnWriteArrayList - } - } - } catch(InterruptedException e) { - // OK to terminate this way. - } - System.out.println("Final value: " + value); - } -} - -public class ExchangerDemo { - static int size = 10; - static int delay = 5; // Seconds - public static void - main(String[] args) throws Exception { - if(args.length > 0) - size = new Integer(args[0]); - if(args.length > 1) - delay = new Integer(args[1]); - ExecutorService es = Executors.newCachedThreadPool(); - Exchanger> xc = new Exchanger<>(); - List - producerList = new CopyOnWriteArrayList<>(), - consumerList = new CopyOnWriteArrayList<>(); - es.execute(new ExchangerProducer<>(xc, - BasicSupplier.create(Fat.class), producerList)); - es.execute( - new ExchangerConsumer<>(xc,consumerList)); - TimeUnit.SECONDS.sleep(delay); - es.shutdownNow(); - } -} -/* Output: -Final value: Fat id: 18859 -*/ diff --git a/tasks/Fat.java b/tasks/Fat.java deleted file mode 100644 index 245a40db8..000000000 --- a/tasks/Fat.java +++ /dev/null @@ -1,20 +0,0 @@ -// tasks/Fat.java -// (c)2016 MindView LLC: see Copyright.txt -// We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. -// Objects that are expensive to create - -public class Fat { - private volatile double d; // Prevent optimization - private static int counter = 0; - private final int id = counter++; - public Fat() { - // Expensive, interruptible operation: - for(int i = 1; i < 10000; i++) { - d += (Math.PI + Math.E) / (double)i; - } - } - public void operation() { System.out.println(this); } - @Override - public String toString() { return "Fat id: " + id; } -} diff --git a/tasks/FixedThreadPool.java b/tasks/FixedThreadPool.java deleted file mode 100644 index 358ac8024..000000000 --- a/tasks/FixedThreadPool.java +++ /dev/null @@ -1,24 +0,0 @@ -// tasks/FixedThreadPool.java -// (c)2016 MindView LLC: see Copyright.txt -// We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. -import java.util.concurrent.*; - -public class FixedThreadPool { - public static void main(String[] args) { - // Constructor argument is number of threads: - ExecutorService e = Executors.newFixedThreadPool(5); - for(int i = 0; i < 5; i++) - e.execute(new LiftOff()); - e.shutdown(); - } -} -/* Output: -#3(9), #2(9), #3(8), #2(8), #1(9), #4(9), #0(9), #2(7), -#3(7), #1(8), #0(8), #4(8), #3(6), #2(6), #0(7), #1(7), -#0(6), #2(5), #4(7), #3(5), #0(5), #1(6), #0(4), #4(6), -#3(4), #2(4), #1(5), #4(5), #0(3), #2(3), #3(3), #2(2), -#0(2), #4(4), #1(4), #0(1), #2(1), #3(2), #0(Liftoff!), -#1(3), #4(3), #1(2), #3(1), #2(Liftoff!), #3(Liftoff!), -#1(1), #4(2), #1(Liftoff!), #4(1), #4(Liftoff!), -*/ diff --git a/tasks/Joining.java b/tasks/Joining.java deleted file mode 100644 index 685a280a3..000000000 --- a/tasks/Joining.java +++ /dev/null @@ -1,62 +0,0 @@ -// tasks/Joining.java -// (c)2016 MindView LLC: see Copyright.txt -// We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. -// Understanding join() - -class Sleeper extends Thread { - private int duration; - public Sleeper(String name, int sleepTime) { - super(name); - duration = sleepTime; - start(); - } - @Override - public void run() { - try { - sleep(duration); - } catch(InterruptedException e) { - System.out.println(getName() + - " was interrupted. " + - "isInterrupted(): " + isInterrupted()); - return; - } - System.out.println(getName() + " has awakened"); - } -} - -class Joiner extends Thread { - private Sleeper sleeper; - public Joiner(String name, Sleeper sleeper) { - super(name); - this.sleeper = sleeper; - start(); - } - @Override - public void run() { - try { - sleeper.join(); - } catch(InterruptedException e) { - System.out.println("Interrupted"); - } - System.out.println(getName() + " join completed"); - } -} - -public class Joining { - public static void main(String[] args) { - Sleeper - sleepy = new Sleeper("Sleepy", 1500), - grumpy = new Sleeper("Grumpy", 1500); - Joiner - dopey = new Joiner("Dopey", sleepy), - doc = new Joiner("Doc", grumpy); - grumpy.interrupt(); - } -} -/* Output: -Grumpy was interrupted. isInterrupted(): false -Doc join completed -Sleepy has awakened -Dopey join completed -*/ diff --git a/tasks/LiftOff.java b/tasks/LiftOff.java deleted file mode 100644 index 5995815d4..000000000 --- a/tasks/LiftOff.java +++ /dev/null @@ -1,26 +0,0 @@ -// tasks/LiftOff.java -// (c)2016 MindView LLC: see Copyright.txt -// We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. -// Demonstration of the Runnable interface - -public class LiftOff implements Runnable { - protected int countDown = 10; // Default - private static int taskCount = 0; - private final int id = taskCount++; - public LiftOff() {} - public LiftOff(int countDown) { - this.countDown = countDown; - } - public String status() { - return "#" + id + "(" + - (countDown > 0 ? countDown : "Liftoff!") + "), "; - } - @Override - public void run() { - while(countDown-- > 0) { - System.out.print(status()); - Thread.yield(); - } - } -} diff --git a/tasks/ListComparisons.java b/tasks/ListComparisons.java deleted file mode 100644 index ba8e1525d..000000000 --- a/tasks/ListComparisons.java +++ /dev/null @@ -1,90 +0,0 @@ -// tasks/ListComparisons.java -// (c)2016 MindView LLC: see Copyright.txt -// We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. -// {Args: 1 10 10} (Fast verification check during build) -// Rough comparison of thread-safe List performance -import java.util.concurrent.*; -import java.util.*; -import onjava.*; - -abstract class ListTest extends Tester> { - ListTest(String testId, int nReaders, int nWriters) { - super(testId, nReaders, nWriters); - } - class Reader extends TestTask { - long result = 0; - void test() { - for(long i = 0; i < testCycles; i++) - for(int n = 0; n < collectionSize; n++) - result += testCollection.get(n); - } - void putResults() { - readResult += result; - readTime += duration; - } - } - class Writer extends TestTask { - void test() { - for(long i = 0; i < testCycles; i++) - for(int n = 0; n < collectionSize; n++) - testCollection.set(n, writeData[n]); - } - void putResults() { - writeTime += duration; - } - } - void startReadersAndWriters() { - for(int i = 0; i < nReaders; i++) - exec.execute(new Reader()); - for(int i = 0; i < nWriters; i++) - exec.execute(new Writer()); - } -} - -class SynchronizedArrayListTest extends ListTest { - List collectionInitializer() { - return Collections.synchronizedList( - new ArrayList<>( - new CountingIntegerList(collectionSize))); - } - SynchronizedArrayListTest(int nReaders, int nWriters) { - super("Synched ArrayList", nReaders, nWriters); - } -} - -class CopyOnWriteArrayListTest extends ListTest { - List collectionInitializer() { - return new CopyOnWriteArrayList<>( - new CountingIntegerList(collectionSize)); - } - CopyOnWriteArrayListTest(int nReaders, int nWriters) { - super("CopyOnWriteArrayList", nReaders, nWriters); - } -} - -public class ListComparisons { - public static void main(String[] args) { - Tester.initMain(args); - new SynchronizedArrayListTest(10, 0); - new SynchronizedArrayListTest(9, 1); - new SynchronizedArrayListTest(5, 5); - new CopyOnWriteArrayListTest(10, 0); - new CopyOnWriteArrayListTest(9, 1); - new CopyOnWriteArrayListTest(5, 5); - Tester.exec.shutdown(); - } -} -/* Output: -Type Read time Write time -Synched ArrayList 10r 0w 700989 0 -Synched ArrayList 9r 1w 2531313 60622 -readTime + writeTime = 2591935 -Synched ArrayList 5r 5w 1396291 649761 -readTime + writeTime = 2046052 -CopyOnWriteArrayList 10r 0w 551005 0 -CopyOnWriteArrayList 9r 1w 161945 123521 -readTime + writeTime = 285466 -CopyOnWriteArrayList 5r 5w 549580 4230146 -readTime + writeTime = 4779726 -*/ diff --git a/tasks/MapComparisons.java b/tasks/MapComparisons.java deleted file mode 100644 index 9a6b6a8e1..000000000 --- a/tasks/MapComparisons.java +++ /dev/null @@ -1,97 +0,0 @@ -// tasks/MapComparisons.java -// (c)2016 MindView LLC: see Copyright.txt -// We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. -// {Args: 1 10 10} (Fast verification check during build) -// Rough comparison of thread-safe Map performance -import java.util.concurrent.*; -import java.util.*; -import onjava.*; - -abstract class MapTest -extends Tester> { - MapTest(String testId, int nReaders, int nWriters) { - super(testId, nReaders, nWriters); - } - class Reader extends TestTask { - long result = 0; - void test() { - for(long i = 0; i < testCycles; i++) - for(int n = 0; n < collectionSize; n++) - result += testCollection.get(n); - } - void putResults() { - readResult += result; - readTime += duration; - } - } - class Writer extends TestTask { - void test() { - for(long i = 0; i < testCycles; i++) - for(int n = 0; n < collectionSize; n++) - testCollection.put(n, writeData[n]); - } - void putResults() { - writeTime += duration; - } - } - void startReadersAndWriters() { - for(int i = 0; i < nReaders; i++) - exec.execute(new Reader()); - for(int i = 0; i < nWriters; i++) - exec.execute(new Writer()); - } -} - -class SynchronizedHashMapTest extends MapTest { - Map collectionInitializer() { - return Collections.synchronizedMap( - new HashMap<>( - FilledMap.map( - new onjava.Count.Integer(), - new onjava.Count.Integer(), - collectionSize))); - } - SynchronizedHashMapTest(int nReaders, int nWriters) { - super("Synched HashMap", nReaders, nWriters); - } -} - -class ConcurrentHashMapTest extends MapTest { - Map collectionInitializer() { - return new ConcurrentHashMap<>( - FilledMap.map( - new onjava.Count.Integer(), - new onjava.Count.Integer(), - collectionSize)); - } - ConcurrentHashMapTest(int nReaders, int nWriters) { - super("ConcurrentHashMap", nReaders, nWriters); - } -} - -public class MapComparisons { - public static void main(String[] args) { - Tester.initMain(args); - new SynchronizedHashMapTest(10, 0); - new SynchronizedHashMapTest(9, 1); - new SynchronizedHashMapTest(5, 5); - new ConcurrentHashMapTest(10, 0); - new ConcurrentHashMapTest(9, 1); - new ConcurrentHashMapTest(5, 5); - Tester.exec.shutdown(); - } -} -/* Output: -Type Read time Write time -Synched HashMap 10r 0w 2825885 0 -Synched HashMap 9r 1w 3463976 74283 -readTime + writeTime = 3538259 -Synched HashMap 5r 5w 744537 633254 -readTime + writeTime = 1377791 -ConcurrentHashMap 10r 0w 437445 0 -ConcurrentHashMap 9r 1w 545597 78268 -readTime + writeTime = 623865 -ConcurrentHashMap 5r 5w 58343 232524 -readTime + writeTime = 290867 -*/ diff --git a/tasks/MoreBasicThreads.java b/tasks/MoreBasicThreads.java deleted file mode 100644 index 0e55d71ca..000000000 --- a/tasks/MoreBasicThreads.java +++ /dev/null @@ -1,23 +0,0 @@ -// tasks/MoreBasicThreads.java -// (c)2016 MindView LLC: see Copyright.txt -// We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. -// Adding more threads - -public class MoreBasicThreads { - public static void main(String[] args) { - for(int i = 0; i < 5; i++) - new Thread(new LiftOff()).start(); - System.out.println("Waiting for LiftOff"); - } -} -/* Output: -Waiting for LiftOff -#3(9), #2(9), #3(8), #2(8), #3(7), #2(7), #3(6), #2(6), -#3(5), #2(5), #3(4), #2(4), #3(3), #2(3), #3(2), #2(2), -#3(1), #2(1), #3(Liftoff!), #2(Liftoff!), #1(9), #0(9), -#4(9), #1(8), #4(8), #0(8), #1(7), #0(7), #4(7), #1(6), -#4(6), #0(6), #1(5), #0(5), #4(5), #1(4), #4(4), #0(4), -#1(3), #0(3), #4(3), #1(2), #4(2), #0(2), #1(1), #0(1), -#4(1), #0(Liftoff!), #4(Liftoff!), #1(Liftoff!), -*/ diff --git a/tasks/NotifyVsNotifyAll.java b/tasks/NotifyVsNotifyAll.java deleted file mode 100644 index 76ad54911..000000000 --- a/tasks/NotifyVsNotifyAll.java +++ /dev/null @@ -1,110 +0,0 @@ -// tasks/NotifyVsNotifyAll.java -// (c)2016 MindView LLC: see Copyright.txt -// We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. -import java.util.concurrent.*; -import java.util.*; - -class Blocker { - synchronized void waitingCall() { - try { - while(!Thread.interrupted()) { - wait(); - System.out.print(Thread.currentThread() + " "); - } - } catch(InterruptedException e) { - // OK to exit this way - } - } - synchronized void prod() { notify(); } - synchronized void prodAll() { notifyAll(); } -} - -class Task implements Runnable { - static Blocker blocker = new Blocker(); - @Override - public void run() { blocker.waitingCall(); } -} - -class Task2 implements Runnable { - // A separate Blocker object: - static Blocker blocker = new Blocker(); - @Override - public void run() { blocker.waitingCall(); } -} - -public class NotifyVsNotifyAll { - public static void - main(String[] args) throws Exception { - ExecutorService es = Executors.newCachedThreadPool(); - for(int i = 0; i < 5; i++) - es.execute(new Task()); - es.execute(new Task2()); - Timer timer = new Timer(); - timer.scheduleAtFixedRate(new TimerTask() { - boolean prod = true; - @Override - public void run() { - if(prod) { - System.out.print("\nnotify() "); - Task.blocker.prod(); - prod = false; - } else { - System.out.print("\nnotifyAll() "); - Task.blocker.prodAll(); - prod = true; - } - } - }, 400, 400); // Run every .4 second - TimeUnit.SECONDS.sleep(5); // Run for a while... - timer.cancel(); - System.out.println("\nTimer canceled"); - TimeUnit.MILLISECONDS.sleep(500); - System.out.print("Task2.blocker.prodAll() "); - Task2.blocker.prodAll(); - TimeUnit.MILLISECONDS.sleep(500); - System.out.println("\nShutting down"); - es.shutdownNow(); // Interrupt all tasks - } -} -/* Output: -notify() Thread[pool-1-thread-1,5,main] -notifyAll() Thread[pool-1-thread-1,5,main] -Thread[pool-1-thread-5,5,main] -Thread[pool-1-thread-4,5,main] -Thread[pool-1-thread-3,5,main] -Thread[pool-1-thread-2,5,main] -notify() Thread[pool-1-thread-1,5,main] -notifyAll() Thread[pool-1-thread-1,5,main] -Thread[pool-1-thread-2,5,main] -Thread[pool-1-thread-3,5,main] -Thread[pool-1-thread-4,5,main] -Thread[pool-1-thread-5,5,main] -notify() Thread[pool-1-thread-1,5,main] -notifyAll() Thread[pool-1-thread-1,5,main] -Thread[pool-1-thread-5,5,main] -Thread[pool-1-thread-4,5,main] -Thread[pool-1-thread-3,5,main] -Thread[pool-1-thread-2,5,main] -notify() Thread[pool-1-thread-1,5,main] -notifyAll() Thread[pool-1-thread-1,5,main] -Thread[pool-1-thread-2,5,main] -Thread[pool-1-thread-3,5,main] -Thread[pool-1-thread-4,5,main] -Thread[pool-1-thread-5,5,main] -notify() Thread[pool-1-thread-1,5,main] -notifyAll() Thread[pool-1-thread-1,5,main] -Thread[pool-1-thread-5,5,main] -Thread[pool-1-thread-4,5,main] -Thread[pool-1-thread-3,5,main] -Thread[pool-1-thread-2,5,main] -notify() Thread[pool-1-thread-1,5,main] -notifyAll() Thread[pool-1-thread-1,5,main] -Thread[pool-1-thread-2,5,main] -Thread[pool-1-thread-3,5,main] -Thread[pool-1-thread-4,5,main] -Thread[pool-1-thread-5,5,main] -Timer canceled -Task2.blocker.prodAll() Thread[pool-1-thread-6,5,main] -Shutting down -*/ diff --git a/tasks/PipedIO.java b/tasks/PipedIO.java deleted file mode 100644 index 34d8d67ac..000000000 --- a/tasks/PipedIO.java +++ /dev/null @@ -1,67 +0,0 @@ -// tasks/PipedIO.java -// (c)2016 MindView LLC: see Copyright.txt -// We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. -// Using pipes for inter-task I/O -import java.util.concurrent.*; -import java.io.*; -import java.util.*; - -class Sender implements Runnable { - private SplittableRandom rand = new SplittableRandom(47); - private PipedWriter out = new PipedWriter(); - public PipedWriter getPipedWriter() { return out; } - @Override - public void run() { - try { - while(true) - for(char c = 'A'; c <= 'z'; c++) { - out.write(c); - TimeUnit.MILLISECONDS.sleep(rand.nextInt(500)); - } - } catch(IOException e) { - System.out.println(e + " Sender write exception"); - } catch(InterruptedException e) { - System.out.println(e + " Sender sleep interrupted"); - } - } -} - -class Receiver implements Runnable { - private PipedReader in; - public Receiver(Sender sender) throws IOException { - in = new PipedReader(sender.getPipedWriter()); - } - @Override - public void run() { - try { - while(true) { - // Blocks until characters are there: - System.out.print( - "Read: " + (char)in.read() + ", "); - } - } catch(IOException e) { - System.out.println(e + " Receiver read exception"); - } - } -} - -public class PipedIO { - public static void - main(String[] args) throws Exception { - Sender sender = new Sender(); - Receiver receiver = new Receiver(sender); - ExecutorService es = Executors.newCachedThreadPool(); - es.execute(sender); - es.execute(receiver); - TimeUnit.SECONDS.sleep(4); - es.shutdownNow(); - } -} -/* Output: -Read: A, Read: B, Read: C, Read: D, Read: E, Read: F, Read: -G, Read: H, Read: I, Read: J, Read: K, Read: L, Read: M, -java.lang.InterruptedException: sleep interrupted Sender -sleep interrupted -java.io.InterruptedIOException Receiver read exception -*/ diff --git a/tasks/Pool.java b/tasks/Pool.java deleted file mode 100644 index 5ca71d15a..000000000 --- a/tasks/Pool.java +++ /dev/null @@ -1,54 +0,0 @@ -// tasks/Pool.java -// (c)2016 MindView LLC: see Copyright.txt -// We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. -// Using a Semaphore inside a Pool, to restrict -// the number of tasks that can use a resource -import java.util.concurrent.*; -import java.util.*; - -public class Pool { - private int size; - private List items = new ArrayList<>(); - private volatile boolean[] checkedOut; - private Semaphore available; - public Pool(Class classObject, int size) { - this.size = size; - checkedOut = new boolean[size]; - available = new Semaphore(size, true); - // Load pool with objects that can be checked out: - for(int i = 0; i < size; ++i) - try { - // Assumes a no-arg constructor: - items.add(classObject.newInstance()); - } catch(InstantiationException | - IllegalAccessException e) { - throw new RuntimeException(e); - } - } - public T checkOut() throws InterruptedException { - available.acquire(); - return getItem(); - } - public void checkIn(T x) { - if(releaseItem(x)) - available.release(); - } - private synchronized T getItem() { - for(int i = 0; i < size; ++i) - if(!checkedOut[i]) { - checkedOut[i] = true; - return items.get(i); - } - return null; // Semaphore prevents reaching here - } - private synchronized boolean releaseItem(T item) { - int index = items.indexOf(item); - if(index == -1) return false; // Not in the list - if(checkedOut[index]) { - checkedOut[index] = false; - return true; - } - return false; // Wasn't checked out - } -} diff --git a/tasks/ReaderWriterList.java b/tasks/ReaderWriterList.java deleted file mode 100644 index d54584d07..000000000 --- a/tasks/ReaderWriterList.java +++ /dev/null @@ -1,112 +0,0 @@ -// tasks/ReaderWriterList.java -// (c)2016 MindView LLC: see Copyright.txt -// We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. -import java.util.concurrent.*; -import java.util.concurrent.locks.*; -import java.util.*; - -public class ReaderWriterList { - private ArrayList lockedList; - // Make the ordering fair: - private ReentrantReadWriteLock lock = - new ReentrantReadWriteLock(true); - public ReaderWriterList(int size, T initialValue) { - lockedList = new ArrayList<>( - Collections.nCopies(size, initialValue)); - } - public T set(int index, T element) { - Lock wlock = lock.writeLock(); - wlock.lock(); - try { - return lockedList.set(index, element); - } finally { - wlock.unlock(); - } - } - public T get(int index) { - Lock rlock = lock.readLock(); - rlock.lock(); - try { - // Show that multiple readers - // can acquire the read lock: - if(lock.getReadLockCount() > 1) - System.out.println(lock.getReadLockCount()); - return lockedList.get(index); - } finally { - rlock.unlock(); - } - } - public static void - main(String[] args) throws Exception { - new ReaderWriterListTest(30, 1); - } -} - -class ReaderWriterListTest { - ExecutorService exec = Executors.newCachedThreadPool(); - private final static int SIZE = 100; - private static SplittableRandom rand = new SplittableRandom(47); - private ReaderWriterList list = - new ReaderWriterList<>(SIZE, 0); - private class Writer implements Runnable { - @Override - public void run() { - try { - for(int i = 0; i < 20; i++) { // 2 second test - list.set(i, rand.nextInt()); - TimeUnit.MILLISECONDS.sleep(100); - } - } catch(InterruptedException e) { - // Acceptable way to exit - } - System.out.println( - "Writer finished, shutting down"); - exec.shutdownNow(); - } - } - private class Reader implements Runnable { - @Override - public void run() { - try { - while(!Thread.interrupted()) { - for(int i = 0; i < SIZE; i++) { - list.get(i); - TimeUnit.MILLISECONDS.sleep(1); - } - } - } catch(InterruptedException e) { - // Acceptable way to exit - } - } - } - public ReaderWriterListTest(int readers, int writers) { - for(int i = 0; i < readers; i++) - exec.execute(new Reader()); - for(int i = 0; i < writers; i++) - exec.execute(new Writer()); - } -} -/* Output: (First and last 10 Lines) -6 -15 -14 -13 -12 -11 -10 -9 -8 -5 -________...________...________...________...________ -21 -30 -29 -28 -28 -30 -29 -28 -27 -26 -*/ diff --git a/tasks/ResponsiveUI.java b/tasks/ResponsiveUI.java deleted file mode 100644 index 732dc782e..000000000 --- a/tasks/ResponsiveUI.java +++ /dev/null @@ -1,36 +0,0 @@ -// tasks/ResponsiveUI.java -// (c)2016 MindView LLC: see Copyright.txt -// We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. -// User interface responsiveness -// {TimeOutDuringTesting} - -class UnresponsiveUI { - private volatile double d = 1; - public UnresponsiveUI() throws Exception { - while(d > 0) - d += (Math.PI + Math.E) / d; - System.in.read(); // Never gets here - } -} - -public class ResponsiveUI extends Thread { - private static volatile double d = 1; - public ResponsiveUI() { - setDaemon(true); - start(); - } - @Override - public void run() { - while(true) { - d += (Math.PI + Math.E) / d; - } - } - public static void - main(String[] args) throws Exception { - //- new UnresponsiveUI(); // Must kill this process - new ResponsiveUI(); - System.in.read(); - System.out.println(d); // Shows progress - } -} diff --git a/tasks/SelfManaged.java b/tasks/SelfManaged.java deleted file mode 100644 index e6f5e2468..000000000 --- a/tasks/SelfManaged.java +++ /dev/null @@ -1,37 +0,0 @@ -// tasks/SelfManaged.java -// (c)2016 MindView LLC: see Copyright.txt -// We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. -// A Runnable containing its own driver Thread - -public class SelfManaged implements Runnable { - private int countDown = 5; - private Thread t = new Thread(this); - public SelfManaged() { t.start(); } - @Override - public String toString() { - return Thread.currentThread().getName() + - "(" + countDown + "), "; - } - @Override - public void run() { - while(true) { - System.out.print(this); - if(--countDown == 0) - return; - } - } - public static void main(String[] args) { - for(int i = 0; i < 5; i++) - new SelfManaged(); - } -} -/* Output: -Thread-0(5), Thread-4(5), Thread-3(5), Thread-1(5), -Thread-2(5), Thread-2(4), Thread-2(3), Thread-1(4), -Thread-3(4), Thread-4(4), Thread-0(4), Thread-4(3), -Thread-3(3), Thread-1(3), Thread-2(2), Thread-1(2), -Thread-3(2), Thread-4(2), Thread-0(3), Thread-4(1), -Thread-3(1), Thread-1(1), Thread-2(1), Thread-0(2), -Thread-0(1), -*/ diff --git a/tasks/SemaphoreDemo.java b/tasks/SemaphoreDemo.java deleted file mode 100644 index ad745e73c..000000000 --- a/tasks/SemaphoreDemo.java +++ /dev/null @@ -1,98 +0,0 @@ -// tasks/SemaphoreDemo.java -// (c)2016 MindView LLC: see Copyright.txt -// We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. -// Testing the Pool class -import java.util.concurrent.*; -import java.util.*; - -// A task to check a resource out of a pool: -class CheckoutTask implements Runnable { - private static int counter = 0; - private final int id = counter++; - private Pool pool; - public CheckoutTask(Pool pool) { - this.pool = pool; - } - @Override - public void run() { - try { - T item = pool.checkOut(); - System.out.println(this + "checked out " + item); - TimeUnit.SECONDS.sleep(1); - System.out.println(this +"checking in " + item); - pool.checkIn(item); - } catch(InterruptedException e) { - // Acceptable way to terminate - } - } - @Override - public String toString() { - return "CheckoutTask " + id + " "; - } -} - -public class SemaphoreDemo { - final static int SIZE = 25; - public static void - main(String[] args) throws Exception { - final Pool pool = new Pool<>(Fat.class, SIZE); - ExecutorService es = Executors.newCachedThreadPool(); - for(int i = 0; i < SIZE; i++) - es.execute(new CheckoutTask<>(pool)); - System.out.println("All CheckoutTasks created"); - List list = new ArrayList<>(); - for(int i = 0; i < SIZE; i++) { - Fat f = pool.checkOut(); - System.out.print( - i + ": main() thread checked out "); - f.operation(); - list.add(f); - } - Future blocked = es.submit(() -> { - try { - // Semaphore prevents additional checkout, - // so call is blocked: - pool.checkOut(); - } catch(InterruptedException e) { - System.out.println("checkOut() Interrupted"); - } - }); - TimeUnit.SECONDS.sleep(2); - blocked.cancel(true); // Break out of blocked call - System.out.println("Checking in objects in " + list); - for(Fat f : list) - pool.checkIn(f); - for(Fat f : list) - pool.checkIn(f); // Second checkIn ignored - es.shutdown(); - } -} -/* Output: (First and last 10 Lines) -CheckoutTask 4 checked out Fat id: 2 -CheckoutTask 22 checked out Fat id: 24 -CheckoutTask 14 checked out Fat id: 23 -CheckoutTask 21 checked out Fat id: 22 -CheckoutTask 18 checked out Fat id: 21 -CheckoutTask 17 checked out Fat id: 20 -CheckoutTask 10 checked out Fat id: 19 -CheckoutTask 13 checked out Fat id: 18 -CheckoutTask 9 checked out Fat id: 17 -CheckoutTask 6 checked out Fat id: 16 -________...________...________...________...________ -20: main() thread checked out Fat id: 5 -21: main() thread checked out Fat id: 1 -CheckoutTask 7 checking in Fat id: 3 -CheckoutTask 0 checking in Fat id: 0 -CheckoutTask 8 checking in Fat id: 4 -22: main() thread checked out Fat id: 3 -23: main() thread checked out Fat id: 0 -24: main() thread checked out Fat id: 4 -checkOut() Interrupted -Checking in objects in [Fat id: 2, Fat id: 23, Fat id: 24, -Fat id: 22, Fat id: 21, Fat id: 20, Fat id: 19, Fat id: 18, -Fat id: 17, Fat id: 16, Fat id: 15, Fat id: 14, Fat id: 13, -Fat id: 11, Fat id: 12, Fat id: 9, Fat id: 10, Fat id: 8, -Fat id: 7, Fat id: 6, Fat id: 5, Fat id: 1, Fat id: 3, Fat -id: 0, Fat id: 4] -*/ diff --git a/tasks/SimpleDaemons.java b/tasks/SimpleDaemons.java deleted file mode 100644 index 6906275f6..000000000 --- a/tasks/SimpleDaemons.java +++ /dev/null @@ -1,44 +0,0 @@ -// tasks/SimpleDaemons.java -// (c)2016 MindView LLC: see Copyright.txt -// We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. -// Daemon threads don't prevent the program from ending -import java.util.concurrent.*; - -public class SimpleDaemons implements Runnable { - @Override - public void run() { - try { - while(true) { - TimeUnit.MILLISECONDS.sleep(100); - System.out.println( - Thread.currentThread() + " " + this); - } - } catch(InterruptedException e) { - System.out.println("sleep() interrupted"); - } - } - public static void - main(String[] args) throws Exception { - for(int i = 0; i < 10; i++) { - Thread daemon = new Thread(new SimpleDaemons()); - daemon.setDaemon(true); // Must call before start() - daemon.start(); - } - System.out.println("All daemons started"); - TimeUnit.MILLISECONDS.sleep(175); - } -} -/* Output: -All daemons started -Thread[Thread-6,5,main] SimpleDaemons@b87187 -Thread[Thread-4,5,main] SimpleDaemons@1fb28c1 -Thread[Thread-8,5,main] SimpleDaemons@8ebcf -Thread[Thread-7,5,main] SimpleDaemons@54761d -Thread[Thread-9,5,main] SimpleDaemons@156afef -Thread[Thread-0,5,main] SimpleDaemons@1320c4d -Thread[Thread-3,5,main] SimpleDaemons@4683f2 -Thread[Thread-2,5,main] SimpleDaemons@4f80f2 -Thread[Thread-5,5,main] SimpleDaemons@29c11d -Thread[Thread-1,5,main] SimpleDaemons@9df74c -*/ diff --git a/tasks/SimpleMicroBenchmark.java b/tasks/SimpleMicroBenchmark.java deleted file mode 100644 index c394494f9..000000000 --- a/tasks/SimpleMicroBenchmark.java +++ /dev/null @@ -1,52 +0,0 @@ -// tasks/SimpleMicroBenchmark.java -// (c)2016 MindView LLC: see Copyright.txt -// We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. -// The dangers of microbenchmarking -import java.util.concurrent.locks.*; - -abstract class Incrementable { - protected long counter = 0; - public abstract void increment(); -} - -class SynchronizingTest extends Incrementable { - @Override - public synchronized void increment() { ++counter; } -} - -class LockingTest extends Incrementable { - private Lock lock = new ReentrantLock(); - @Override - public void increment() { - lock.lock(); - try { - ++counter; - } finally { - lock.unlock(); - } - } -} - -public class SimpleMicroBenchmark { - static long test(Incrementable incr) { - long start = System.nanoTime(); - for(long i = 0; i < 10000000L; i++) - incr.increment(); - return System.nanoTime() - start; - } - public static void main(String[] args) { - long synchTime = test(new SynchronizingTest()); - long lockTime = test(new LockingTest()); - System.out.printf( - "synchronized: %1$10d\n", synchTime); - System.out.printf("Lock: %1$10d\n", lockTime); - System.out.printf("Lock/synchronized = %1$.3f", - (double)lockTime/(double)synchTime); - } -} -/* Output: -synchronized: 243572959 -Lock: 365176719 -Lock/synchronized = 1.499 -*/ diff --git a/tasks/SimplePriorities.java b/tasks/SimplePriorities.java deleted file mode 100644 index 0bc001dc3..000000000 --- a/tasks/SimplePriorities.java +++ /dev/null @@ -1,55 +0,0 @@ -// tasks/SimplePriorities.java -// (c)2016 MindView LLC: see Copyright.txt -// We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. -// Shows thread priorities -import java.util.concurrent.*; - -public class SimplePriorities implements Runnable { - private int countDown = 5; - private volatile double d; // No optimization - private int priority; - public SimplePriorities(int priority) { - this.priority = priority; - } - @Override - public String toString() { - return Thread.currentThread() + ": " + countDown; - } - @Override - public void run() { - Thread.currentThread().setPriority(priority); - while(true) { - // An expensive, interruptable operation: - for(int i = 1; i < 100000; i++) { - d += (Math.PI + Math.E) / (double)i; - if(i % 1000 == 0) - Thread.yield(); - } - System.out.println(this); - if(--countDown == 0) return; - } - } - public static void main(String[] args) { - ExecutorService es = Executors.newCachedThreadPool(); - for(int i = 0; i < 5; i++) - es.execute( - new SimplePriorities(Thread.MIN_PRIORITY)); - es.execute( - new SimplePriorities(Thread.MAX_PRIORITY)); - es.shutdown(); - } -} -/* Output: (First 10 Lines) -Thread[pool-1-thread-6,10,main]: 5 -Thread[pool-1-thread-1,1,main]: 5 -Thread[pool-1-thread-4,1,main]: 5 -Thread[pool-1-thread-5,1,main]: 5 -Thread[pool-1-thread-3,1,main]: 5 -Thread[pool-1-thread-2,1,main]: 5 -Thread[pool-1-thread-3,1,main]: 4 -Thread[pool-1-thread-5,1,main]: 4 -Thread[pool-1-thread-4,1,main]: 4 -Thread[pool-1-thread-1,1,main]: 4 - ... -*/ diff --git a/tasks/SimpleThread.java b/tasks/SimpleThread.java deleted file mode 100644 index 9d1d5d3cd..000000000 --- a/tasks/SimpleThread.java +++ /dev/null @@ -1,37 +0,0 @@ -// tasks/SimpleThread.java -// (c)2016 MindView LLC: see Copyright.txt -// We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. -// Inheriting directly from the Thread class - -public class SimpleThread extends Thread { - private int countDown = 5; - private static int threadCount = 0; - public SimpleThread() { - // Store the thread name: - super(Integer.toString(++threadCount)); - start(); - } - @Override - public String toString() { - return "#" + getName() + "(" + countDown + "), "; - } - @Override - public void run() { - while(true) { - System.out.print(this); - if(--countDown == 0) - return; - } - } - public static void main(String[] args) { - for(int i = 0; i < 5; i++) - new SimpleThread(); - } -} -/* Output: -#4(5), #3(5), #5(5), #2(5), #2(4), #1(5), #4(4), #1(4), -#2(3), #2(2), #5(4), #3(4), #3(3), #3(2), #5(3), #5(2), -#2(1), #1(3), #4(3), #4(2), #1(2), #1(1), #5(1), #3(1), -#4(1), -*/ diff --git a/tasks/SingleThreadExecutor.java b/tasks/SingleThreadExecutor.java deleted file mode 100644 index 3a4b579bf..000000000 --- a/tasks/SingleThreadExecutor.java +++ /dev/null @@ -1,24 +0,0 @@ -// tasks/SingleThreadExecutor.java -// (c)2016 MindView LLC: see Copyright.txt -// We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. -import java.util.concurrent.*; - -public class SingleThreadExecutor { - public static void main(String[] args) { - ExecutorService exec = - Executors.newSingleThreadExecutor(); - for(int i = 0; i < 5; i++) - exec.execute(new LiftOff()); - exec.shutdown(); - } -} -/* Output: -#0(9), #0(8), #0(7), #0(6), #0(5), #0(4), #0(3), #0(2), -#0(1), #0(Liftoff!), #1(9), #1(8), #1(7), #1(6), #1(5), -#1(4), #1(3), #1(2), #1(1), #1(Liftoff!), #2(9), #2(8), -#2(7), #2(6), #2(5), #2(4), #2(3), #2(2), #2(1), -#2(Liftoff!), #3(9), #3(8), #3(7), #3(6), #3(5), #3(4), -#3(3), #3(2), #3(1), #3(Liftoff!), #4(9), #4(8), #4(7), -#4(6), #4(5), #4(4), #4(3), #4(2), #4(1), #4(Liftoff!), -*/ diff --git a/tasks/SleepingTask.java b/tasks/SleepingTask.java deleted file mode 100644 index d9d983462..000000000 --- a/tasks/SleepingTask.java +++ /dev/null @@ -1,38 +0,0 @@ -// tasks/SleepingTask.java -// (c)2016 MindView LLC: see Copyright.txt -// We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. -// Calling sleep() to pause for a while -import java.util.concurrent.*; - -public class SleepingTask extends LiftOff { - @Override - public void run() { - try { - while(countDown-- > 0) { - System.out.print(status()); - // Old-style: - // Thread.sleep(100); - // Modern style: - TimeUnit.MILLISECONDS.sleep(100); - } - } catch(InterruptedException e) { - System.err.println("Interrupted"); - } - } - public static void main(String[] args) { - ExecutorService es = Executors.newCachedThreadPool(); - for(int i = 0; i < 5; i++) - es.execute(new SleepingTask()); - es.shutdown(); - } -} -/* Output: -#2(9), #4(9), #3(9), #0(9), #1(9), #2(8), #4(8), #3(8), -#0(8), #1(8), #4(7), #3(7), #2(7), #1(7), #0(7), #4(6), -#3(6), #2(6), #0(6), #1(6), #4(5), #2(5), #3(5), #1(5), -#0(5), #4(4), #2(4), #3(4), #1(4), #0(4), #4(3), #2(3), -#3(3), #1(3), #0(3), #4(2), #2(2), #3(2), #0(2), #1(2), -#2(1), #4(1), #3(1), #0(1), #1(1), #2(Liftoff!), -#4(Liftoff!), #3(Liftoff!), #0(Liftoff!), #1(Liftoff!), -*/ diff --git a/tasks/SynchronizationComparisons.java b/tasks/SynchronizationComparisons.java deleted file mode 100644 index 841dcc05f..000000000 --- a/tasks/SynchronizationComparisons.java +++ /dev/null @@ -1,214 +0,0 @@ -// tasks/SynchronizationComparisons.java -// (c)2016 MindView LLC: see Copyright.txt -// We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. -// Comparing the performance of explicit Locks -// and Atomics versus the synchronized keyword -import java.util.concurrent.*; -import java.util.concurrent.atomic.*; -import java.util.concurrent.locks.*; -import java.util.*; - -abstract class Accumulator { - public static long cycles = 50000L; - // Number of Modifiers and Readers during each test: - private static final int N = 4; - public static ExecutorService exec = - Executors.newFixedThreadPool(N*2); - private static CyclicBarrier barrier = - new CyclicBarrier(N*2 + 1); - protected volatile int index = 0; - protected volatile long value = 0; - protected long duration = 0; - protected String id = "error"; - protected final static int SIZE = 100000; - protected static int[] preLoaded = new int[SIZE]; - static { // Load the array of random numbers: - SplittableRandom rand = new SplittableRandom(47); - for(int i = 0; i < SIZE; i++) - preLoaded[i] = rand.nextInt(); - } - public abstract void accumulate(); - public abstract long read(); - private class Modifier implements Runnable { - @Override - public void run() { - for(long i = 0; i < cycles; i++) - accumulate(); - try { - barrier.await(); - } catch(InterruptedException | - BrokenBarrierException e) { - throw new RuntimeException(e); - } - } - } - private class Reader implements Runnable { - private volatile long value; - @Override - public void run() { - for(long i = 0; i < cycles; i++) - value = read(); - try { - barrier.await(); - } catch(InterruptedException | - BrokenBarrierException e) { - throw new RuntimeException(e); - } - } - } - public void timedTest() { - long start = System.nanoTime(); - for(int i = 0; i < N; i++) { - exec.execute(new Modifier()); - exec.execute(new Reader()); - } - try { - barrier.await(); - } catch(InterruptedException | - BrokenBarrierException e) { - throw new RuntimeException(e); - } - duration = System.nanoTime() - start; - System.out.printf("%-13s: %13d\n", id, duration); - } - public void report(Accumulator acc2) { - System.out.printf( - "%-22s: %.2f\n", this.id + "/" + acc2.id, - (double)this.duration/(double)acc2.duration); - } -} - -class SynchronizedTest extends Accumulator { - { id = "synch"; } - @Override - public synchronized void accumulate() { - value += preLoaded[index++]; - if(index >= SIZE) index = 0; - } - @Override - public synchronized long read() { - return value; - } -} - -class LockTest extends Accumulator { - { id = "Lock"; } - private Lock lock = new ReentrantLock(); - @Override - public void accumulate() { - lock.lock(); - try { - value += preLoaded[index++]; - if(index >= SIZE) index = 0; - } finally { - lock.unlock(); - } - } - @Override - public long read() { - lock.lock(); - try { - return value; - } finally { - lock.unlock(); - } - } -} - -class AtomicTest extends Accumulator { - { id = "Atomic"; } - private AtomicInteger index = new AtomicInteger(0); - private AtomicLong value = new AtomicLong(0); - // Relying on more than one Atomic at a time doesn't - // work, so we still have to synchronize. But it gives - // a performance indicator: - @Override - public synchronized void accumulate() { - int i; - i = index.getAndIncrement(); - value.getAndAdd(preLoaded[i]); - if(++i >= SIZE) - index.set(0); - } - @Override - public synchronized long read() { return value.get(); } - @Override - public void report(Accumulator acc2) { - System.out.printf( - "%-22s: %.2f\n", "synch/(Atomic-synch)", - (double)acc2.duration/ - ((double)this.duration - (double)acc2.duration)); - } -} - -public class SynchronizationComparisons { - static SynchronizedTest synch = new SynchronizedTest(); - static LockTest lock = new LockTest(); - static AtomicTest atomic = new AtomicTest(); - static void test() { - System.out.println("============================"); - System.out.printf( - "%-12s : %13d\n", "Cycles", Accumulator.cycles); - synch.timedTest(); - lock.timedTest(); - atomic.timedTest(); - synch.report(lock); - atomic.report(synch); - } - public static void main(String[] args) { - int iterations = 5; // Default - if(args.length > 0) // Optionally change iterations - iterations = new Integer(args[0]); - // The first time fills the thread pool: - System.out.println("Warmup"); - synch.timedTest(); - // Now the initial test doesn't include the cost - // of starting the threads for the first time. - // Produce multiple data points: - for(int i = 0; i < iterations; i++) { - test(); - Accumulator.cycles *= 2; - } - Accumulator.exec.shutdown(); - } -} -/* Output: -Warmup -synch : 66040963 -============================ -Cycles : 50000 -synch : 66182130 -Lock : 28967506 -Atomic : 65390062 -synch/Lock : 2.28 -synch/(Atomic-synch) : -83.56 -============================ -Cycles : 100000 -synch : 131045096 -Lock : 49248746 -Atomic : 140269844 -synch/Lock : 2.66 -synch/(Atomic-synch) : 14.21 -============================ -Cycles : 200000 -synch : 256718481 -Lock : 95971018 -Atomic : 287549323 -synch/Lock : 2.67 -synch/(Atomic-synch) : 8.33 -============================ -Cycles : 400000 -synch : 513599757 -Lock : 192522353 -Atomic : 543954449 -synch/Lock : 2.67 -synch/(Atomic-synch) : 16.92 -============================ -Cycles : 800000 -synch : 1089344465 -Lock : 413671821 -Atomic : 963264943 -synch/Lock : 2.63 -synch/(Atomic-synch) : -8.64 -*/ diff --git a/tasks/TestBlockingQueues.java b/tasks/TestBlockingQueues.java deleted file mode 100644 index d47d63c27..000000000 --- a/tasks/TestBlockingQueues.java +++ /dev/null @@ -1,71 +0,0 @@ -// tasks/TestBlockingQueues.java -// (c)2016 MindView LLC: see Copyright.txt -// We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. -// {TimeOutDuringTesting} -import java.util.concurrent.*; -import java.io.*; - -class LiftOffRunner implements Runnable { - private BlockingQueue rockets; - public LiftOffRunner(BlockingQueue queue) { - rockets = queue; - } - public void add(LiftOff lo) { - try { - rockets.put(lo); - } catch(InterruptedException e) { - System.out.println("Interrupted during put()"); - } - } - @Override - public void run() { - try { - while(!Thread.interrupted()) { - LiftOff rocket = rockets.take(); - rocket.run(); // Use this thread - } - } catch(InterruptedException e) { - System.out.println("Waking from take()"); - } - System.out.println("Exiting LiftOffRunner"); - } -} - -public class TestBlockingQueues { - static void getkey() { - try { - // Compensate for Windows/Linux difference in the - // length of the result produced by the Enter key: - new BufferedReader( - new InputStreamReader(System.in)).readLine(); - } catch(java.io.IOException e) { - throw new RuntimeException(e); - } - } - static void getkey(String message) { - System.out.println(message); - getkey(); - } - static void - test(String msg, BlockingQueue queue) { - System.out.println(msg); - LiftOffRunner runner = new LiftOffRunner(queue); - Thread t = new Thread(runner); - t.start(); - for(int i = 0; i < 5; i++) - runner.add(new LiftOff(5)); - getkey("Press 'Enter' (" + msg + ")"); - t.interrupt(); - System.out.println("Finished " + msg + " test"); - } - public static void main(String[] args) { - test("LinkedBlockingQueue", // Unlimited size - new LinkedBlockingQueue<>()); - test("ArrayBlockingQueue", // Fixed size - new ArrayBlockingQueue<>(3)); - test("SynchronousQueue", // Size of 1 - new SynchronousQueue<>()); - } -} -/* Output: (Execute to see) */ diff --git a/tasks/Tester.java b/tasks/Tester.java deleted file mode 100644 index 935c50e27..000000000 --- a/tasks/Tester.java +++ /dev/null @@ -1,77 +0,0 @@ -// tasks/Tester.java -// (c)2016 MindView LLC: see Copyright.txt -// We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. -// Performance test framework for concurrency collections -import java.util.concurrent.*; -import onjava.*; - -public abstract class Tester { - static int testReps = 10; - static int testCycles = 1000; - static int collectionSize = 1000; - abstract C collectionInitializer(); - abstract void startReadersAndWriters(); - C testCollection; - String testId; - int nReaders; - int nWriters; - volatile long readResult = 0; - volatile long readTime = 0; - volatile long writeTime = 0; - CountDownLatch endLatch; - static ExecutorService exec = - Executors.newCachedThreadPool(); - Integer[] writeData; - Tester(String testId, int nReaders, int nWriters) { - this.testId = testId + " " + - nReaders + "r " + nWriters + "w"; - this.nReaders = nReaders; - this.nWriters = nWriters; - writeData = new Rand.Integer().array(collectionSize); - for(int i = 0; i < testReps; i++) { - runTest(); - readTime = 0; - writeTime = 0; - } - } - void runTest() { - endLatch = new CountDownLatch(nReaders + nWriters); - testCollection = collectionInitializer(); - startReadersAndWriters(); - try { - endLatch.await(); - } catch(InterruptedException ex) { - System.out.println("endLatch interrupted"); - } - System.out.printf("%-27s %14d %14d\n", - testId, readTime, writeTime); - if(readTime != 0 && writeTime != 0) - System.out.printf("%-27s %14d\n", - "readTime + writeTime =", readTime + writeTime); - } - abstract class TestTask implements Runnable { - abstract void test(); - abstract void putResults(); - long duration; - public void run() { - long startTime = System.nanoTime(); - test(); - duration = System.nanoTime() - startTime; - synchronized(Tester.this) { - putResults(); - } - endLatch.countDown(); - } - } - public static void initMain(String[] args) { - if(args.length > 0) - testReps = new Integer(args[0]); - if(args.length > 1) - testCycles = new Integer(args[1]); - if(args.length > 2) - collectionSize = new Integer(args[2]); - System.out.printf("%-27s %14s %14s\n", - "Type", "Read time", "Write time"); - } -} diff --git a/tasks/ThreadVariations.java b/tasks/ThreadVariations.java deleted file mode 100644 index 3c8522076..000000000 --- a/tasks/ThreadVariations.java +++ /dev/null @@ -1,192 +0,0 @@ -// tasks/ThreadVariations.java -// (c)2016 MindView LLC: see Copyright.txt -// We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. -// Creating threads with inner classes -import java.util.concurrent.*; - -// Using a named inner class: -class InnerThread1 { - private int countDown = 5; - private Inner inner; - private class Inner extends Thread { - Inner(String name) { - super(name); - start(); - } - @Override - public void run() { - try { - while(true) { - System.out.println(this); - if(--countDown == 0) return; - sleep(10); - } - } catch(InterruptedException e) { - System.out.println("interrupted"); - } - } - @Override - public String toString() { - return getName() + ": " + countDown; - } - } - public InnerThread1(String name) { - inner = new Inner(name); - } -} - -// Using an anonymous inner class: -class InnerThread2 { - private int countDown = 5; - private Thread t; - public InnerThread2(String name) { - t = new Thread(name) { - @Override - public void run() { - try { - while(true) { - System.out.println(this); - if(--countDown == 0) return; - sleep(10); - } - } catch(InterruptedException e) { - System.out.println("sleep() interrupted"); - } - } - @Override - public String toString() { - return getName() + ": " + countDown; - } - }; - t.start(); - } -} - -// Using a named Runnable implementation: -class InnerRunnable1 { - private int countDown = 5; - private Inner inner; - private class Inner implements Runnable { - Thread t; - Inner(String name) { - t = new Thread(this, name); - t.start(); - } - @Override - public void run() { - try { - while(true) { - System.out.println(this); - if(--countDown == 0) return; - TimeUnit.MILLISECONDS.sleep(10); - } - } catch(InterruptedException e) { - System.out.println("sleep() interrupted"); - } - } - @Override - public String toString() { - return t.getName() + ": " + countDown; - } - } - public InnerRunnable1(String name) { - inner = new Inner(name); - } -} - -// Using an anonymous Runnable implementation: -class InnerRunnable2 { - private int countDown = 5; - private Thread t; - public InnerRunnable2(String name) { - t = new Thread(new Runnable() { - @Override - public void run() { - try { - while(true) { - System.out.println(this); - if(--countDown == 0) return; - TimeUnit.MILLISECONDS.sleep(10); - } - } catch(InterruptedException e) { - System.out.println("sleep() interrupted"); - } - } - @Override - public String toString() { - return Thread.currentThread().getName() + - ": " + countDown; - } - }, name); - t.start(); - } -} - -// A separate method to run some code as a task: -class ThreadMethod { - private int countDown = 5; - private Thread t; - private String name; - public ThreadMethod(String name) { this.name = name; } - public void runTask() { - if(t == null) { - t = new Thread(name) { - @Override - public void run() { - try { - while(true) { - System.out.println(this); - if(--countDown == 0) return; - sleep(10); - } - } catch(InterruptedException e) { - System.out.println("sleep() interrupted"); - } - } - @Override - public String toString() { - return getName() + ": " + countDown; - } - }; - t.start(); - } - } -} - -public class ThreadVariations { - public static void main(String[] args) { - new InnerThread1("InnerThread1"); - new InnerThread2("InnerThread2"); - new InnerRunnable1("InnerRunnable1"); - new InnerRunnable2("InnerRunnable2"); - new ThreadMethod("ThreadMethod").runTask(); - } -} -/* Output: -InnerThread1: 5 -InnerThread2: 5 -InnerThread1: 4 -InnerThread2: 4 -InnerThread1: 3 -InnerThread2: 3 -InnerThread1: 2 -InnerThread2: 2 -InnerRunnable1: 5 -InnerThread1: 1 -InnerThread2: 1 -InnerRunnable2: 5 -InnerRunnable1: 4 -InnerRunnable2: 4 -InnerRunnable1: 3 -InnerRunnable2: 3 -InnerRunnable1: 2 -InnerRunnable2: 2 -InnerRunnable1: 1 -InnerRunnable2: 1 -ThreadMethod: 5 -ThreadMethod: 4 -ThreadMethod: 3 -ThreadMethod: 2 -ThreadMethod: 1 -*/ diff --git a/tasks/waxomatic/WaxOMatic.java b/tasks/waxomatic/WaxOMatic.java deleted file mode 100644 index 42d15c7e0..000000000 --- a/tasks/waxomatic/WaxOMatic.java +++ /dev/null @@ -1,88 +0,0 @@ -// tasks/waxomatic/WaxOMatic.java -// (c)2016 MindView LLC: see Copyright.txt -// We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. -// Basic task cooperation -package tasks.waxomatic; -import java.util.concurrent.*; - -class Car { - private boolean waxOn = false; - public synchronized void waxed() { - waxOn = true; // Ready to buff - notifyAll(); - } - public synchronized void buffed() { - waxOn = false; // Ready for another coat of wax - notifyAll(); - } - public synchronized void waitForWaxing() - throws InterruptedException { - while(waxOn == false) - wait(); - } - public synchronized void waitForBuffing() - throws InterruptedException { - while(waxOn == true) - wait(); - } -} - -class WaxOn implements Runnable { - private Car car; - public WaxOn(Car c) { car = c; } - @Override - public void run() { - try { - while(!Thread.interrupted()) { - System.out.print("Wax On! "); - TimeUnit.MILLISECONDS.sleep(200); - car.waxed(); - car.waitForBuffing(); - } - } catch(InterruptedException e) { - System.out.println("Exiting via interrupt"); - } - System.out.println("Ending Wax On task"); - } -} - -class WaxOff implements Runnable { - private Car car; - public WaxOff(Car c) { car = c; } - @Override - public void run() { - try { - while(!Thread.interrupted()) { - car.waitForWaxing(); - System.out.print("Wax Off! "); - TimeUnit.MILLISECONDS.sleep(200); - car.buffed(); - } - } catch(InterruptedException e) { - System.out.println("Exiting via interrupt"); - } - System.out.println("Ending Wax Off task"); - } -} - -public class WaxOMatic { - public static void - main(String[] args) throws Exception { - Car car = new Car(); - ExecutorService es = Executors.newCachedThreadPool(); - es.execute(new WaxOff(car)); - es.execute(new WaxOn(car)); - TimeUnit.SECONDS.sleep(5); // Run for a while... - es.shutdownNow(); // Interrupt all tasks - } -} -/* Output: -Wax On! Wax Off! Wax On! Wax Off! Wax On! Wax Off! Wax On! -Wax Off! Wax On! Wax Off! Wax On! Wax Off! Wax On! Wax Off! -Wax On! Wax Off! Wax On! Wax Off! Wax On! Wax Off! Wax On! -Wax Off! Wax On! Wax Off! Wax On! Exiting via interrupt -Ending Wax On task -Exiting via interrupt -Ending Wax Off task -*/ diff --git a/tasks/waxomatic2/WaxOMatic2.java b/tasks/waxomatic2/WaxOMatic2.java deleted file mode 100644 index 2c9ed53bd..000000000 --- a/tasks/waxomatic2/WaxOMatic2.java +++ /dev/null @@ -1,111 +0,0 @@ -// tasks/waxomatic2/WaxOMatic2.java -// (c)2016 MindView LLC: see Copyright.txt -// We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. -// Using Lock and Condition objects -package tasks.waxomatic2; -import java.util.concurrent.*; -import java.util.concurrent.locks.*; - -class Car { - private Lock lock = new ReentrantLock(); - private Condition condition = lock.newCondition(); - private boolean waxOn = false; - public void waxed() { - lock.lock(); - try { - waxOn = true; // Ready to buff - condition.signalAll(); - } finally { - lock.unlock(); - } - } - public void buffed() { - lock.lock(); - try { - waxOn = false; // Ready for another coat of wax - condition.signalAll(); - } finally { - lock.unlock(); - } - } - public void - waitForWaxing() throws InterruptedException { - lock.lock(); - try { - while(waxOn == false) - condition.await(); - } finally { - lock.unlock(); - } - } - public void - waitForBuffing() throws InterruptedException{ - lock.lock(); - try { - while(waxOn == true) - condition.await(); - } finally { - lock.unlock(); - } - } -} - -class WaxOn implements Runnable { - private Car car; - public WaxOn(Car c) { car = c; } - @Override - public void run() { - try { - while(!Thread.interrupted()) { - System.out.print("Wax On! "); - TimeUnit.MILLISECONDS.sleep(200); - car.waxed(); - car.waitForBuffing(); - } - } catch(InterruptedException e) { - System.out.println("Exiting via interrupt"); - } - System.out.println("Ending Wax On task"); - } -} - -class WaxOff implements Runnable { - private Car car; - public WaxOff(Car c) { car = c; } - @Override - public void run() { - try { - while(!Thread.interrupted()) { - car.waitForWaxing(); - System.out.print("Wax Off! "); - TimeUnit.MILLISECONDS.sleep(200); - car.buffed(); - } - } catch(InterruptedException e) { - System.out.println("Exiting via interrupt"); - } - System.out.println("Ending Wax Off task"); - } -} - -public class WaxOMatic2 { - public static void - main(String[] args) throws Exception { - Car car = new Car(); - ExecutorService es = Executors.newCachedThreadPool(); - es.execute(new WaxOff(car)); - es.execute(new WaxOn(car)); - TimeUnit.SECONDS.sleep(5); - es.shutdownNow(); - } -} -/* Output: -Wax On! Wax Off! Wax On! Wax Off! Wax On! Wax Off! Wax On! -Wax Off! Wax On! Wax Off! Wax On! Wax Off! Wax On! Wax Off! -Wax On! Wax Off! Wax On! Wax Off! Wax On! Wax Off! Wax On! -Wax Off! Wax On! Wax Off! Wax On! Exiting via interrupt -Exiting via interrupt -Ending Wax On task -Ending Wax Off task -*/ diff --git a/tasks/AtomicEvenSupplier.java b/threads/AtomicEvenSupplier.java similarity index 94% rename from tasks/AtomicEvenSupplier.java rename to threads/AtomicEvenSupplier.java index fff3899f7..d278141c0 100644 --- a/tasks/AtomicEvenSupplier.java +++ b/threads/AtomicEvenSupplier.java @@ -1,4 +1,4 @@ -// tasks/AtomicEvenSupplier.java +// threads/AtomicEvenSupplier.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. diff --git a/tasks/AtomicIntegerTest.java b/threads/AtomicIntegerTest.java similarity index 96% rename from tasks/AtomicIntegerTest.java rename to threads/AtomicIntegerTest.java index 1394399ea..f3885c104 100644 --- a/tasks/AtomicIntegerTest.java +++ b/threads/AtomicIntegerTest.java @@ -1,4 +1,4 @@ -// tasks/AtomicIntegerTest.java +// threads/AtomicIntegerTest.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. diff --git a/tasks/Atomicity.java b/threads/Atomicity.java similarity index 97% rename from tasks/Atomicity.java rename to threads/Atomicity.java index 5d1ec1931..96586503f 100644 --- a/tasks/Atomicity.java +++ b/threads/Atomicity.java @@ -1,4 +1,4 @@ -// tasks/Atomicity.java +// threads/Atomicity.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. diff --git a/tasks/AtomicityTest.java b/threads/AtomicityTest.java similarity index 96% rename from tasks/AtomicityTest.java rename to threads/AtomicityTest.java index 2f85d8cc4..49ece9a16 100644 --- a/tasks/AtomicityTest.java +++ b/threads/AtomicityTest.java @@ -1,4 +1,4 @@ -// tasks/AtomicityTest.java +// threads/AtomicityTest.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. diff --git a/tasks/AttemptLocking.java b/threads/AttemptLocking.java similarity index 98% rename from tasks/AttemptLocking.java rename to threads/AttemptLocking.java index 8c0bbb589..8f1d1aff2 100644 --- a/tasks/AttemptLocking.java +++ b/threads/AttemptLocking.java @@ -1,4 +1,4 @@ -// tasks/AttemptLocking.java +// threads/AttemptLocking.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. diff --git a/tasks/BankTellerSimulation.java b/threads/BankTellerSimulation.java similarity index 99% rename from tasks/BankTellerSimulation.java rename to threads/BankTellerSimulation.java index add65a651..12b6231ee 100644 --- a/tasks/BankTellerSimulation.java +++ b/threads/BankTellerSimulation.java @@ -1,4 +1,4 @@ -// tasks/BankTellerSimulation.java +// threads/BankTellerSimulation.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. diff --git a/threads/CachedThreadPool.java b/threads/CachedThreadPool.java new file mode 100644 index 000000000..c458a5b89 --- /dev/null +++ b/threads/CachedThreadPool.java @@ -0,0 +1,29 @@ +// threads/CachedThreadPool.java +// (c)2016 MindView LLC: see Copyright.txt +// We make no guarantees that this code is fit for any purpose. +// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +import java.util.concurrent.*; + +public class CachedThreadPool { + public static void main(String[] args) + throws InterruptedException { + ExecutorService exec = + Executors.newCachedThreadPool(); + for(int id = 0; id < 10; id++) + exec.execute(new SleepAndPrintTask(id)); + exec.shutdown(); + exec.awaitTermination(5, TimeUnit.SECONDS); + } +} +/* Output: +SleepAndPrintTask[2] pool-1-thread-3 +SleepAndPrintTask[8] pool-1-thread-9 +SleepAndPrintTask[7] pool-1-thread-8 +SleepAndPrintTask[9] pool-1-thread-10 +SleepAndPrintTask[6] pool-1-thread-7 +SleepAndPrintTask[5] pool-1-thread-6 +SleepAndPrintTask[1] pool-1-thread-2 +SleepAndPrintTask[3] pool-1-thread-4 +SleepAndPrintTask[0] pool-1-thread-1 +SleepAndPrintTask[4] pool-1-thread-5 +*/ diff --git a/threads/CachedThreadPool2.java b/threads/CachedThreadPool2.java new file mode 100644 index 000000000..3ab693b82 --- /dev/null +++ b/threads/CachedThreadPool2.java @@ -0,0 +1,29 @@ +// threads/CachedThreadPool2.java +// (c)2016 MindView LLC: see Copyright.txt +// We make no guarantees that this code is fit for any purpose. +// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +import java.util.concurrent.*; + +public class CachedThreadPool2 { + public static void main(String[] args) + throws InterruptedException { + ExecutorService exec = + Executors.newCachedThreadPool(); + for(int id = 0; id < 10; id++) + exec.execute(new InterferingTask(id)); + exec.shutdown(); + exec.awaitTermination(5, TimeUnit.SECONDS); + } +} +/* Output: +3 pool-1-thread-4 301 +7 pool-1-thread-8 684 +6 pool-1-thread-7 584 +5 pool-1-thread-6 527 +1 pool-1-thread-2 301 +2 pool-1-thread-3 301 +0 pool-1-thread-1 301 +4 pool-1-thread-5 401 +9 pool-1-thread-10 884 +8 pool-1-thread-9 784 +*/ diff --git a/threads/CachedThreadPool3.java b/threads/CachedThreadPool3.java new file mode 100644 index 000000000..e5f693aa3 --- /dev/null +++ b/threads/CachedThreadPool3.java @@ -0,0 +1,47 @@ +// threads/CachedThreadPool3.java +// (c)2016 MindView LLC: see Copyright.txt +// We make no guarantees that this code is fit for any purpose. +// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +import java.util.*; +import java.util.concurrent.*; +import java.util.stream.*; + +public class CachedThreadPool3 { + public static Integer + extract_result(Future f) { + try { + return f.get(); + } catch(Exception e) { + throw new RuntimeException(e); + } + } + public static void main(String[] args) + throws InterruptedException { + ExecutorService exec = + Executors.newCachedThreadPool(); + List tasks = + IntStream.range(0, 10) + .mapToObj(CountingTask::new) + .collect(Collectors.toList()); + List> futures = + exec.invokeAll(tasks); + Integer sum = futures.stream() + .map(CachedThreadPool3::extract_result) + .reduce(0, Integer::sum); + System.out.println("sum = " + sum); + exec.shutdown(); + } +} +/* Output: +0 pool-1-thread-1 100 +6 pool-1-thread-7 100 +5 pool-1-thread-6 100 +3 pool-1-thread-4 100 +4 pool-1-thread-5 100 +2 pool-1-thread-3 100 +7 pool-1-thread-8 100 +8 pool-1-thread-9 100 +1 pool-1-thread-2 100 +9 pool-1-thread-10 100 +sum = 1000 +*/ diff --git a/tasks/CaptureUncaughtException.java b/threads/CaptureUncaughtException.java similarity index 94% rename from tasks/CaptureUncaughtException.java rename to threads/CaptureUncaughtException.java index 45fb52ce7..8e8e0211d 100644 --- a/tasks/CaptureUncaughtException.java +++ b/threads/CaptureUncaughtException.java @@ -1,4 +1,4 @@ -// tasks/CaptureUncaughtException.java +// threads/CaptureUncaughtException.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. @@ -9,7 +9,7 @@ class ExceptionThread2 implements Runnable { @Override public void run() { Thread t = Thread.currentThread(); - System.out.println("run() by " + t); + System.out.println("run() by " + t.getName()); System.out.println( "eh = " + t.getUncaughtExceptionHandler()); throw new RuntimeException(); diff --git a/tasks/CarBuilder.java b/threads/CarBuilder.java similarity index 99% rename from tasks/CarBuilder.java rename to threads/CarBuilder.java index 1efce05ee..cbe39f537 100644 --- a/tasks/CarBuilder.java +++ b/threads/CarBuilder.java @@ -1,4 +1,4 @@ -// tasks/CarBuilder.java +// threads/CarBuilder.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. diff --git a/tasks/Chopstick.java b/threads/Chopstick.java similarity index 94% rename from tasks/Chopstick.java rename to threads/Chopstick.java index c27b343ae..9f2e10958 100644 --- a/tasks/Chopstick.java +++ b/threads/Chopstick.java @@ -1,4 +1,4 @@ -// tasks/Chopstick.java +// threads/Chopstick.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. diff --git a/tasks/CloseResource.java b/threads/CloseResource.java similarity index 97% rename from tasks/CloseResource.java rename to threads/CloseResource.java index 9a75118d8..3e5d6c565 100644 --- a/tasks/CloseResource.java +++ b/threads/CloseResource.java @@ -1,4 +1,4 @@ -// tasks/CloseResource.java +// threads/CloseResource.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. diff --git a/threads/CollectionToStream.java b/threads/CollectionToStream.java new file mode 100644 index 000000000..391f81e56 --- /dev/null +++ b/threads/CollectionToStream.java @@ -0,0 +1,36 @@ +// threads/CollectionToStream.java +// (c)2016 MindView LLC: see Copyright.txt +// We make no guarantees that this code is fit for any purpose. +// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +import onjava.*; +import java.util.*; +import java.util.stream.*; + +public class CollectionToStream { + public static void main(String[] args) { + List strings = + Stream.generate(new Rand.String(5)) + .limit(10) + .collect(Collectors.toList()); + strings.forEach(System.out::println); + // Convert to a Stream for many more options: + String result = strings.stream() + .map(String::toUpperCase) + .map(s -> s.substring(2)) + .reduce(":", (s1, s2) -> s1 + s2); + System.out.println(result); + } +} +/* Output: +btpen +pccux +szgvg +meinn +eeloz +tdvew +cippc +ygpoa +lkljl +bynxt +:PENCUXGVGINNLOZVEWPPCPOALJLNXT +*/ diff --git a/threads/CountingStream.java b/threads/CountingStream.java new file mode 100644 index 000000000..e5f27a774 --- /dev/null +++ b/threads/CountingStream.java @@ -0,0 +1,31 @@ +// threads/CountingStream.java +// (c)2016 MindView LLC: see Copyright.txt +// We make no guarantees that this code is fit for any purpose. +// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +import java.util.*; +import java.util.concurrent.*; +import java.util.stream.*; + +public class CountingStream { + public static void main(String[] args) { + System.out.println( + IntStream.range(0, 10) + .parallel() + .mapToObj(CountingTask::new) + .map(ct -> ct.call()) + .reduce(0, Integer::sum)); + } +} +/* Output: +1 ForkJoinPool.commonPool-worker-3 100 +4 ForkJoinPool.commonPool-worker-5 100 +3 ForkJoinPool.commonPool-worker-3 100 +5 ForkJoinPool.commonPool-worker-5 100 +0 ForkJoinPool.commonPool-worker-6 100 +8 ForkJoinPool.commonPool-worker-2 100 +7 ForkJoinPool.commonPool-worker-4 100 +9 ForkJoinPool.commonPool-worker-7 100 +6 main 100 +2 ForkJoinPool.commonPool-worker-1 100 +1000 +*/ diff --git a/threads/CountingTask.java b/threads/CountingTask.java new file mode 100644 index 000000000..9ac74f44f --- /dev/null +++ b/threads/CountingTask.java @@ -0,0 +1,19 @@ +// threads/CountingTask.java +// (c)2016 MindView LLC: see Copyright.txt +// We make no guarantees that this code is fit for any purpose. +// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +import java.util.concurrent.*; + +public class CountingTask implements Callable { + final int id; + public CountingTask(int id) { this.id = id; } + @Override + public Integer call() { + Integer val = new Integer(0); + for(int i = 0; i < 100; i++) + val++; + System.out.println(id + " " + + Thread.currentThread().getName() + " " + val); + return val; + } +} diff --git a/tasks/CriticalSection.java b/threads/CriticalSection.java similarity index 98% rename from tasks/CriticalSection.java rename to threads/CriticalSection.java index faaba95db..f2930eee0 100644 --- a/tasks/CriticalSection.java +++ b/threads/CriticalSection.java @@ -1,4 +1,4 @@ -// tasks/CriticalSection.java +// threads/CriticalSection.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. @@ -7,7 +7,7 @@ // Synchronizing blocks instead of entire methods. Also // demonstrates protection of a non-thread-safe class // with a thread-safe one. -package tasks; +package threads; import java.util.concurrent.*; import java.util.concurrent.atomic.*; import java.util.*; diff --git a/tasks/DeadlockingDiningPhilosophers.java b/threads/DeadlockingDiningPhilosophers.java similarity index 97% rename from tasks/DeadlockingDiningPhilosophers.java rename to threads/DeadlockingDiningPhilosophers.java index f3882311f..90613c2a3 100644 --- a/tasks/DeadlockingDiningPhilosophers.java +++ b/threads/DeadlockingDiningPhilosophers.java @@ -1,4 +1,4 @@ -// tasks/DeadlockingDiningPhilosophers.java +// threads/DeadlockingDiningPhilosophers.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. diff --git a/tasks/DelayQueueDemo.java b/threads/DelayQueueDemo.java similarity index 99% rename from tasks/DelayQueueDemo.java rename to threads/DelayQueueDemo.java index c1397451c..5ca8ee09e 100644 --- a/tasks/DelayQueueDemo.java +++ b/threads/DelayQueueDemo.java @@ -1,4 +1,4 @@ -// tasks/DelayQueueDemo.java +// threads/DelayQueueDemo.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. diff --git a/tasks/EvenChecker.java b/threads/EvenChecker.java similarity index 97% rename from tasks/EvenChecker.java rename to threads/EvenChecker.java index 98d62fbc8..6fb775bb6 100644 --- a/tasks/EvenChecker.java +++ b/threads/EvenChecker.java @@ -1,4 +1,4 @@ -// tasks/EvenChecker.java +// threads/EvenChecker.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. diff --git a/tasks/EvenSupplier.java b/threads/EvenSupplier.java similarity index 95% rename from tasks/EvenSupplier.java rename to threads/EvenSupplier.java index 10daf9425..438d62fb2 100644 --- a/tasks/EvenSupplier.java +++ b/threads/EvenSupplier.java @@ -1,4 +1,4 @@ -// tasks/EvenSupplier.java +// threads/EvenSupplier.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. diff --git a/tasks/ExceptionThread.java b/threads/ExceptionThread.java similarity index 94% rename from tasks/ExceptionThread.java rename to threads/ExceptionThread.java index acd42090a..6ebd68858 100644 --- a/tasks/ExceptionThread.java +++ b/threads/ExceptionThread.java @@ -1,4 +1,4 @@ -// tasks/ExceptionThread.java +// threads/ExceptionThread.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. diff --git a/tasks/ExplicitCriticalSection.java b/threads/ExplicitCriticalSection.java similarity index 97% rename from tasks/ExplicitCriticalSection.java rename to threads/ExplicitCriticalSection.java index f60a8782a..d1770e8ec 100644 --- a/tasks/ExplicitCriticalSection.java +++ b/threads/ExplicitCriticalSection.java @@ -1,10 +1,10 @@ -// tasks/ExplicitCriticalSection.java +// threads/ExplicitCriticalSection.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. // {ThrowsException} on a multiprocessor machine // Using explicit Lock objects to create critical sections -package tasks; +package threads; import java.util.concurrent.locks.*; // Synchronize the entire method: diff --git a/tasks/FastSimulation.java b/threads/FastSimulation.java similarity index 98% rename from tasks/FastSimulation.java rename to threads/FastSimulation.java index e3c74b75f..1eec612f0 100644 --- a/tasks/FastSimulation.java +++ b/threads/FastSimulation.java @@ -1,4 +1,4 @@ -// tasks/FastSimulation.java +// threads/FastSimulation.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. diff --git a/tasks/FixedDiningPhilosophers.java b/threads/FixedDiningPhilosophers.java similarity index 97% rename from tasks/FixedDiningPhilosophers.java rename to threads/FixedDiningPhilosophers.java index 9ada5a78c..ef6f34569 100644 --- a/tasks/FixedDiningPhilosophers.java +++ b/threads/FixedDiningPhilosophers.java @@ -1,4 +1,4 @@ -// tasks/FixedDiningPhilosophers.java +// threads/FixedDiningPhilosophers.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. diff --git a/threads/Futures.java b/threads/Futures.java new file mode 100644 index 000000000..79434ffad --- /dev/null +++ b/threads/Futures.java @@ -0,0 +1,23 @@ +// threads/Futures.java +// (c)2016 MindView LLC: see Copyright.txt +// We make no guarantees that this code is fit for any purpose. +// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +import java.util.*; +import java.util.concurrent.*; +import java.util.stream.*; + +public class Futures { + public static void main(String[] args) + throws InterruptedException, ExecutionException { + ExecutorService exec = + Executors.newSingleThreadExecutor(); + Future f = + exec.submit(new CountingTask(99)); + System.out.println(f.get()); //(1) + exec.shutdown(); + } +} +/* Output: +99 pool-1-thread-1 100 +100 +*/ diff --git a/tasks/GreenhouseScheduler.java b/threads/GreenhouseScheduler.java similarity index 99% rename from tasks/GreenhouseScheduler.java rename to threads/GreenhouseScheduler.java index 35f1755ab..3c0c47f48 100644 --- a/tasks/GreenhouseScheduler.java +++ b/threads/GreenhouseScheduler.java @@ -1,4 +1,4 @@ -// tasks/GreenhouseScheduler.java +// threads/GreenhouseScheduler.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. diff --git a/tasks/HorseRace.java b/threads/HorseRace.java similarity index 99% rename from tasks/HorseRace.java rename to threads/HorseRace.java index fa41aa68b..9ab6eb6ce 100644 --- a/tasks/HorseRace.java +++ b/threads/HorseRace.java @@ -1,4 +1,4 @@ -// tasks/HorseRace.java +// threads/HorseRace.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. diff --git a/tasks/IntSupplier.java b/threads/IntSupplier.java similarity index 93% rename from tasks/IntSupplier.java rename to threads/IntSupplier.java index 4397462c6..07359d67e 100644 --- a/tasks/IntSupplier.java +++ b/threads/IntSupplier.java @@ -1,4 +1,4 @@ -// tasks/IntSupplier.java +// threads/IntSupplier.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. diff --git a/threads/InterferingTask.java b/threads/InterferingTask.java new file mode 100644 index 000000000..2b88ea619 --- /dev/null +++ b/threads/InterferingTask.java @@ -0,0 +1,17 @@ +// threads/InterferingTask.java +// (c)2016 MindView LLC: see Copyright.txt +// We make no guarantees that this code is fit for any purpose. +// Visit http://mindviewinc.com/Books/OnJava/ for more book information. + +public class InterferingTask implements Runnable { + final int id; + private static Integer val = new Integer(0); + public InterferingTask(int id) { this.id = id; } + @Override + public void run() { + for(int i = 0; i < 100; i++) + val++; + System.out.println(id + " " + + Thread.currentThread().getName() + " " + val); + } +} diff --git a/tasks/Interrupting.java b/threads/Interrupting.java similarity index 98% rename from tasks/Interrupting.java rename to threads/Interrupting.java index 92dff2454..29517c4cf 100644 --- a/tasks/Interrupting.java +++ b/threads/Interrupting.java @@ -1,4 +1,4 @@ -// tasks/Interrupting.java +// threads/Interrupting.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. diff --git a/tasks/Interrupting2.java b/threads/Interrupting2.java similarity index 98% rename from tasks/Interrupting2.java rename to threads/Interrupting2.java index 8f7aa4bb4..3a459672a 100644 --- a/tasks/Interrupting2.java +++ b/threads/Interrupting2.java @@ -1,4 +1,4 @@ -// tasks/Interrupting2.java +// threads/Interrupting2.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. diff --git a/tasks/InterruptingIdiom.java b/threads/InterruptingIdiom.java similarity index 98% rename from tasks/InterruptingIdiom.java rename to threads/InterruptingIdiom.java index e976eba37..a78a18b38 100644 --- a/tasks/InterruptingIdiom.java +++ b/threads/InterruptingIdiom.java @@ -1,4 +1,4 @@ -// tasks/InterruptingIdiom.java +// threads/InterruptingIdiom.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. diff --git a/threads/LambdasAndMethodReferences.java b/threads/LambdasAndMethodReferences.java new file mode 100644 index 000000000..0eaa8062c --- /dev/null +++ b/threads/LambdasAndMethodReferences.java @@ -0,0 +1,41 @@ +// threads/LambdasAndMethodReferences.java +// (c)2016 MindView LLC: see Copyright.txt +// We make no guarantees that this code is fit for any purpose. +// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +import java.util.concurrent.*; + +class NotRunnable { + public void go() { + System.out.println("NotRunnable"); + } +} + +class NotCallable { + public Integer get() { + System.out.println("NotCallable"); + return 1; + } +} + +public class LambdasAndMethodReferences { + public static void main(String[] args) + throws InterruptedException { + ExecutorService exec = + Executors.newCachedThreadPool(); + exec.submit(() -> System.out.println("Lambda1")); + exec.submit(new NotRunnable()::go); + exec.submit(() -> { + System.out.println("Lambda2"); + return 1; + }); + exec.submit(new NotCallable()::get); + exec.shutdown(); + exec.awaitTermination(1, TimeUnit.SECONDS); + } +} +/* Output: +Lambda1 +NotRunnable +Lambda2 +NotCallable +*/ diff --git a/threads/MoreTasksAfterShutdown.java b/threads/MoreTasksAfterShutdown.java new file mode 100644 index 000000000..6ee70849b --- /dev/null +++ b/threads/MoreTasksAfterShutdown.java @@ -0,0 +1,29 @@ +// threads/MoreTasksAfterShutdown.java +// (c)2016 MindView LLC: see Copyright.txt +// We make no guarantees that this code is fit for any purpose. +// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +import java.util.concurrent.*; + +public class MoreTasksAfterShutdown { + public static void main(String[] args) + throws InterruptedException { + ExecutorService exec = + Executors.newSingleThreadExecutor(); + exec.execute(new SleepAndPrintTask(1)); + exec.shutdown(); + try { + exec.execute(new SleepAndPrintTask(99)); + } catch(RejectedExecutionException e) { + System.out.println(e); + } + exec.awaitTermination(5, TimeUnit.SECONDS); + } +} +/* Output: +java.util.concurrent.RejectedExecutionException: +Task SleepAndPrintTask[99] rejected from +java.util.concurrent.ThreadPoolExecutor@25154f[ +Shutting down, pool size = 1, active threads = 1, +queued tasks = 0, completed tasks = 0] +SleepAndPrintTask[1] pool-1-thread-1 +*/ diff --git a/tasks/MultiLock.java b/threads/MultiLock.java similarity index 97% rename from tasks/MultiLock.java rename to threads/MultiLock.java index beb718965..69f8b0e18 100644 --- a/tasks/MultiLock.java +++ b/threads/MultiLock.java @@ -1,4 +1,4 @@ -// tasks/MultiLock.java +// threads/MultiLock.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. diff --git a/tasks/MutexEvenSupplier.java b/threads/MutexEvenSupplier.java similarity index 95% rename from tasks/MutexEvenSupplier.java rename to threads/MutexEvenSupplier.java index 6511e53dc..efc97a22f 100644 --- a/tasks/MutexEvenSupplier.java +++ b/threads/MutexEvenSupplier.java @@ -1,4 +1,4 @@ -// tasks/MutexEvenSupplier.java +// threads/MutexEvenSupplier.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. diff --git a/tasks/NIOInterruption.java b/threads/NIOInterruption.java similarity index 98% rename from tasks/NIOInterruption.java rename to threads/NIOInterruption.java index 90c7ce8fd..d3f9f1842 100644 --- a/tasks/NIOInterruption.java +++ b/threads/NIOInterruption.java @@ -1,4 +1,4 @@ -// tasks/NIOInterruption.java +// threads/NIOInterruption.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. diff --git a/tasks/NaiveExceptionHandling.java b/threads/NaiveExceptionHandling.java similarity index 93% rename from tasks/NaiveExceptionHandling.java rename to threads/NaiveExceptionHandling.java index 919a396d1..c2852255d 100644 --- a/tasks/NaiveExceptionHandling.java +++ b/threads/NaiveExceptionHandling.java @@ -1,4 +1,4 @@ -// tasks/NaiveExceptionHandling.java +// threads/NaiveExceptionHandling.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. diff --git a/tasks/MainThread.java b/threads/NumberOfProcessors.java similarity index 57% rename from tasks/MainThread.java rename to threads/NumberOfProcessors.java index 3f424569c..78d8306ea 100644 --- a/tasks/MainThread.java +++ b/threads/NumberOfProcessors.java @@ -1,15 +1,14 @@ -// tasks/MainThread.java +// threads/NumberOfProcessors.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. -public class MainThread { +public class NumberOfProcessors { public static void main(String[] args) { - LiftOff launch = new LiftOff(); - launch.run(); + System.out.println( + Runtime.getRuntime().availableProcessors()); } } /* Output: -#0(9), #0(8), #0(7), #0(6), #0(5), #0(4), #0(3), #0(2), -#0(1), #0(Liftoff!), +8 */ diff --git a/tasks/OrnamentalGarden.java b/threads/OrnamentalGarden.java similarity index 98% rename from tasks/OrnamentalGarden.java rename to threads/OrnamentalGarden.java index 054acdffc..f711e2d91 100644 --- a/tasks/OrnamentalGarden.java +++ b/threads/OrnamentalGarden.java @@ -1,4 +1,4 @@ -// tasks/OrnamentalGarden.java +// threads/OrnamentalGarden.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. diff --git a/threads/ParallelStreamPuzzle.java b/threads/ParallelStreamPuzzle.java new file mode 100644 index 000000000..c2429bf40 --- /dev/null +++ b/threads/ParallelStreamPuzzle.java @@ -0,0 +1,25 @@ +// threads/ParallelStreamPuzzle.java +// (c)2016 MindView LLC: see Copyright.txt +// We make no guarantees that this code is fit for any purpose. +// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +import java.util.*; +import java.util.function.*; +import java.util.stream.*; + +public class ParallelStreamPuzzle { + static class IntGenerator + implements Supplier { + private int current = 0; + public Integer get() { + return current++; + } + } + public static void main(String[] args) { + List x = + Stream.generate(new IntGenerator()) + .limit(10) + .parallel() // (1) + .collect(Collectors.toList()); + System.out.println(x); + } +} diff --git a/threads/ParallelStreamPuzzle2.java b/threads/ParallelStreamPuzzle2.java new file mode 100644 index 000000000..8641906d6 --- /dev/null +++ b/threads/ParallelStreamPuzzle2.java @@ -0,0 +1,33 @@ +// threads/ParallelStreamPuzzle2.java +// (c)2016 MindView LLC: see Copyright.txt +// We make no guarantees that this code is fit for any purpose. +// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +import java.util.*; +import java.util.function.*; +import java.util.stream.*; +import java.util.concurrent.*; +import java.nio.file.*; + +public class ParallelStreamPuzzle2 { + public static ConcurrentLinkedDeque trace = + new ConcurrentLinkedDeque<>(); + static class + IntGenerator implements Supplier { + private int current = 0; + public synchronized Integer get() { // (1) + trace.add(current + ": " + + Thread.currentThread().getName()); + return current++; + } + } + public static void main(String[] args) throws Exception { + List x = Stream.generate(new IntGenerator()) + .limit(10) + .parallel() + .collect(Collectors.toList()); + System.out.println(x); + Files.write(Paths.get("PSP2.txt"), trace); + } +} +/* Output: +*/ diff --git a/threads/ParallelStreamPuzzle3.java b/threads/ParallelStreamPuzzle3.java new file mode 100644 index 000000000..c039e30e3 --- /dev/null +++ b/threads/ParallelStreamPuzzle3.java @@ -0,0 +1,32 @@ +// threads/ParallelStreamPuzzle3.java +// (c)2016 MindView LLC: see Copyright.txt +// We make no guarantees that this code is fit for any purpose. +// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +import java.util.*; +import java.util.stream.*; + +public class ParallelStreamPuzzle3 { + public static void main(String[] args) { + List x = IntStream.range(0, 30) + .peek(e -> System.out.println(e + ": " + + Thread.currentThread().getName())) + .limit(10) + .parallel() + .boxed() + .collect(Collectors.toList()); + System.out.println(x); + } +} +/* Output: +1: ForkJoinPool.commonPool-worker-3 +2: ForkJoinPool.commonPool-worker-6 +4: ForkJoinPool.commonPool-worker-1 +3: ForkJoinPool.commonPool-worker-7 +8: main +0: ForkJoinPool.commonPool-worker-4 +6: ForkJoinPool.commonPool-worker-5 +9: ForkJoinPool.commonPool-worker-2 +7: ForkJoinPool.commonPool-worker-6 +5: ForkJoinPool.commonPool-worker-3 +[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] +*/ diff --git a/tasks/Philosopher.java b/threads/Philosopher.java similarity index 98% rename from tasks/Philosopher.java rename to threads/Philosopher.java index 0b6986425..61b05af05 100644 --- a/tasks/Philosopher.java +++ b/threads/Philosopher.java @@ -1,4 +1,4 @@ -// tasks/Philosopher.java +// threads/Philosopher.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. diff --git a/threads/Prime.java b/threads/Prime.java new file mode 100644 index 000000000..676b13c36 --- /dev/null +++ b/threads/Prime.java @@ -0,0 +1,33 @@ +// threads/Prime.java +// (c)2016 MindView LLC: see Copyright.txt +// We make no guarantees that this code is fit for any purpose. +// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +import java.util.*; +import java.util.stream.*; +import static java.util.stream.LongStream.*; +import java.io.*; +import java.nio.file.*; +import java.nio.charset.*; + +public class Prime { + static final int COUNT = 100_000; + public static boolean isPrime(long n) { + return rangeClosed(2, (long)Math.sqrt(n)) + .noneMatch(i -> n % i == 0); + } + public static void main(String[] args) + throws IOException { + long start = System.currentTimeMillis(); + List primes = + iterate(2, i -> i + 1) + .parallel() //(1) + .filter(Prime::isPrime) + .limit(COUNT) + .mapToObj(Long::toString) + .collect(Collectors.toList()); + System.out.println( + System.currentTimeMillis() - start); + Files.write(Paths.get("primes.txt"), primes, + StandardOpenOption.CREATE); + } +} diff --git a/tasks/PriorityBlockingQueueDemo.java b/threads/PriorityBlockingQueueDemo.java similarity index 99% rename from tasks/PriorityBlockingQueueDemo.java rename to threads/PriorityBlockingQueueDemo.java index 00c8c764c..bd9414571 100644 --- a/tasks/PriorityBlockingQueueDemo.java +++ b/threads/PriorityBlockingQueueDemo.java @@ -1,4 +1,4 @@ -// tasks/PriorityBlockingQueueDemo.java +// threads/PriorityBlockingQueueDemo.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. diff --git a/threads/QuittableTask.java b/threads/QuittableTask.java new file mode 100644 index 000000000..c1cffd022 --- /dev/null +++ b/threads/QuittableTask.java @@ -0,0 +1,20 @@ +// threads/QuittableTask.java +// (c)2016 MindView LLC: see Copyright.txt +// We make no guarantees that this code is fit for any purpose. +// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +import java.util.concurrent.*; + +public class QuittableTask implements Runnable { + private boolean running = true; + public void quit() { running = false; } + public boolean running() { return running; } + @Override + public void run() { + while(running) + try { + TimeUnit.MILLISECONDS.sleep(100); + } catch(InterruptedException e) { + throw new RuntimeException(e); + } + } +} diff --git a/threads/QuittingTasks.java b/threads/QuittingTasks.java new file mode 100644 index 000000000..4c6ecab6e --- /dev/null +++ b/threads/QuittingTasks.java @@ -0,0 +1,31 @@ +// threads/QuittingTasks.java +// (c)2016 MindView LLC: see Copyright.txt +// We make no guarantees that this code is fit for any purpose. +// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +import java.util.*; +import java.util.stream.*; +import java.util.concurrent.*; + +public class QuittingTasks { + public static void main(String[] args) + throws InterruptedException { + ExecutorService exec = + Executors.newCachedThreadPool(); + List tasks = + IntStream.range(1, 1000) + .mapToObj(i -> new QuittableTask()) + .peek(exec::execute) + .collect(Collectors.toList()); + TimeUnit.MILLISECONDS.sleep(100); + tasks.forEach(QuittableTask::quit); + exec.shutdown(); + exec.awaitTermination(1, TimeUnit.SECONDS); + // See if any tasks are still running: + System.out.println( + tasks.stream() + .anyMatch(QuittableTask::running)); + } +} +/* Output: +false +*/ diff --git a/tasks/Restaurant.java b/threads/Restaurant.java similarity index 98% rename from tasks/Restaurant.java rename to threads/Restaurant.java index caf37d28d..42b7f750e 100644 --- a/tasks/Restaurant.java +++ b/threads/Restaurant.java @@ -1,4 +1,4 @@ -// tasks/Restaurant.java +// threads/Restaurant.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. diff --git a/tasks/SerialNumberChecker.java b/threads/SerialNumberChecker.java similarity index 98% rename from tasks/SerialNumberChecker.java rename to threads/SerialNumberChecker.java index 5c17371c8..55d3caf51 100644 --- a/tasks/SerialNumberChecker.java +++ b/threads/SerialNumberChecker.java @@ -1,4 +1,4 @@ -// tasks/SerialNumberChecker.java +// threads/SerialNumberChecker.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. diff --git a/tasks/SerialNumberSupplier.java b/threads/SerialNumberSupplier.java similarity index 90% rename from tasks/SerialNumberSupplier.java rename to threads/SerialNumberSupplier.java index a73ae120c..39e9ce8f1 100644 --- a/tasks/SerialNumberSupplier.java +++ b/threads/SerialNumberSupplier.java @@ -1,4 +1,4 @@ -// tasks/SerialNumberSupplier.java +// threads/SerialNumberSupplier.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. diff --git a/tasks/SettingDefaultHandler.java b/threads/SettingDefaultHandler.java similarity index 93% rename from tasks/SettingDefaultHandler.java rename to threads/SettingDefaultHandler.java index 8215d2698..1de9eb5ee 100644 --- a/tasks/SettingDefaultHandler.java +++ b/threads/SettingDefaultHandler.java @@ -1,4 +1,4 @@ -// tasks/SettingDefaultHandler.java +// threads/SettingDefaultHandler.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. diff --git a/threads/SingleThreadExecutor.java b/threads/SingleThreadExecutor.java new file mode 100644 index 000000000..8061310e0 --- /dev/null +++ b/threads/SingleThreadExecutor.java @@ -0,0 +1,50 @@ +// threads/SingleThreadExecutor.java +// (c)2016 MindView LLC: see Copyright.txt +// We make no guarantees that this code is fit for any purpose. +// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +import java.util.concurrent.*; + +public class SingleThreadExecutor { + public static void main(String[] args) { + ExecutorService exec = + Executors.newSingleThreadExecutor(); + for(int id = 0; id < 10; id++) + exec.execute(new SleepAndPrintTask(id)); + System.out.println("All tasks submitted"); + exec.shutdown(); + while(!exec.isTerminated()) { + System.out.println( + Thread.currentThread().getName() + + " awaiting termination"); + try { + Thread.sleep(100); + } catch(InterruptedException e) { + throw new RuntimeException(e); + } + } + } +} +/* Output: +All tasks submitted +main awaiting termination +main awaiting termination +SleepAndPrintTask[0] pool-1-thread-1 +main awaiting termination +SleepAndPrintTask[1] pool-1-thread-1 +SleepAndPrintTask[2] pool-1-thread-1 +main awaiting termination +SleepAndPrintTask[3] pool-1-thread-1 +main awaiting termination +main awaiting termination +SleepAndPrintTask[4] pool-1-thread-1 +main awaiting termination +SleepAndPrintTask[5] pool-1-thread-1 +main awaiting termination +SleepAndPrintTask[6] pool-1-thread-1 +main awaiting termination +SleepAndPrintTask[7] pool-1-thread-1 +main awaiting termination +SleepAndPrintTask[8] pool-1-thread-1 +main awaiting termination +SleepAndPrintTask[9] pool-1-thread-1 +*/ diff --git a/threads/SingleThreadExecutor2.java b/threads/SingleThreadExecutor2.java new file mode 100644 index 000000000..b734dc7c7 --- /dev/null +++ b/threads/SingleThreadExecutor2.java @@ -0,0 +1,29 @@ +// threads/SingleThreadExecutor2.java +// (c)2016 MindView LLC: see Copyright.txt +// We make no guarantees that this code is fit for any purpose. +// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +import java.util.concurrent.*; + +public class SingleThreadExecutor2 { + public static void main(String[] args) + throws InterruptedException { + ExecutorService exec = + Executors.newSingleThreadExecutor(); + for(int id = 0; id < 10; id++) + exec.execute(new SleepAndPrintTask(id)); + exec.shutdown(); + exec.awaitTermination(5, TimeUnit.SECONDS); + } +} +/* Output: +SleepAndPrintTask[0] pool-1-thread-1 +SleepAndPrintTask[1] pool-1-thread-1 +SleepAndPrintTask[2] pool-1-thread-1 +SleepAndPrintTask[3] pool-1-thread-1 +SleepAndPrintTask[4] pool-1-thread-1 +SleepAndPrintTask[5] pool-1-thread-1 +SleepAndPrintTask[6] pool-1-thread-1 +SleepAndPrintTask[7] pool-1-thread-1 +SleepAndPrintTask[8] pool-1-thread-1 +SleepAndPrintTask[9] pool-1-thread-1 +*/ diff --git a/threads/SingleThreadExecutor3.java b/threads/SingleThreadExecutor3.java new file mode 100644 index 000000000..1aa62d0c7 --- /dev/null +++ b/threads/SingleThreadExecutor3.java @@ -0,0 +1,29 @@ +// threads/SingleThreadExecutor3.java +// (c)2016 MindView LLC: see Copyright.txt +// We make no guarantees that this code is fit for any purpose. +// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +import java.util.concurrent.*; + +public class SingleThreadExecutor3 { + public static void main(String[] args) + throws InterruptedException { + ExecutorService exec = + Executors.newSingleThreadExecutor(); + for(int id = 0; id < 10; id++) + exec.execute(new InterferingTask(id)); + exec.shutdown(); + exec.awaitTermination(5, TimeUnit.SECONDS); + } +} +/* Output: +0 pool-1-thread-1 100 +1 pool-1-thread-1 200 +2 pool-1-thread-1 300 +3 pool-1-thread-1 400 +4 pool-1-thread-1 500 +5 pool-1-thread-1 600 +6 pool-1-thread-1 700 +7 pool-1-thread-1 800 +8 pool-1-thread-1 900 +9 pool-1-thread-1 1000 +*/ diff --git a/threads/SleepAndPrintTask.java b/threads/SleepAndPrintTask.java new file mode 100644 index 000000000..7c9a98bde --- /dev/null +++ b/threads/SleepAndPrintTask.java @@ -0,0 +1,23 @@ +// threads/SleepAndPrintTask.java +// (c)2016 MindView LLC: see Copyright.txt +// We make no guarantees that this code is fit for any purpose. +// Visit http://mindviewinc.com/Books/OnJava/ for more book information. + +public class SleepAndPrintTask implements Runnable { + final int id; + public SleepAndPrintTask(int id) { this.id = id; } + @Override + public void run() { + try { + Thread.sleep(100); // Milliseconds + } catch(InterruptedException e) { + throw new RuntimeException(e); + } + System.out.println(this + " " + + Thread.currentThread().getName()); + } + @Override + public String toString() { + return "SleepAndPrintTask[" + id + "]"; + } +} diff --git a/threads/Summing.java b/threads/Summing.java new file mode 100644 index 000000000..b763df47a --- /dev/null +++ b/threads/Summing.java @@ -0,0 +1,50 @@ +// threads/Summing.java +// (c)2016 MindView LLC: see Copyright.txt +// We make no guarantees that this code is fit for any purpose. +// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +import java.util.stream.*; +import java.util.function.*; + +public class Summing { + static volatile long x; + static void timeTest(String id, long checkValue, + LongSupplier operation) { + System.out.print(id + ": "); + long t = System.currentTimeMillis(); + long result = operation.getAsLong(); + long duration = System.currentTimeMillis() - t; + if(result == checkValue) + System.out.println(duration + "ms"); + else + System.out.format("result: %d\ncheckValue: %d\n", + result, checkValue); + x = result; // Prevent optimization + } + public static int SZ = 100_000_000; + // This even works: + // public static int SZ = 1_000_000_000; + // Gauss's formula: + public static final long CHECK = + (long)SZ * ((long)SZ + 1)/2; + public static void main(String[] args) { + System.out.println(CHECK); + timeTest("Sum Stream", CHECK, () -> + LongStream.rangeClosed(0, SZ).sum()); + timeTest("Sum Stream Parallel", CHECK, () -> + LongStream.rangeClosed(0, SZ).parallel().sum()); + timeTest("Sum Iterated", CHECK, () -> + LongStream.iterate(0, i -> i + 1) + .limit(SZ+1).sum()); + // Takes longer, runs out of memory above 1_000_000: + // timeTest("Sum Iterated Parallel", CHECK, () -> + // LongStream.iterate(0, i -> i + 1) + // .parallel() + // .limit(SZ+1).sum()); + } +} +/* Output: +5000000050000000 +Sum Stream: 625ms +Sum Stream Parallel: 158ms +Sum Iterated: 2521ms +*/ diff --git a/threads/Summing2.java b/threads/Summing2.java new file mode 100644 index 000000000..4fb79d714 --- /dev/null +++ b/threads/Summing2.java @@ -0,0 +1,43 @@ +// threads/Summing2.java +// (c)2016 MindView LLC: see Copyright.txt +// We make no guarantees that this code is fit for any purpose. +// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +import java.util.*; + +public class Summing2 { + static long basicSum(long[] ia) { + long sum = 0; + final int sz = ia.length; + for(int i = 0; i < sz; i++) + sum += ia[i]; + return sum; + } + // Approximate largest value of SZ before + // running out of memory on my machine: + public static int SZ = 20_000_000; + public static final long CHECK = + (long)SZ * ((long)SZ + 1)/2; + public static void main(String[] args) { + System.out.println(CHECK); + long[] la = new long[SZ+1]; + Arrays.parallelSetAll(la, i -> i); + Summing.timeTest("Array Stream Sum", CHECK, () -> + Arrays.stream(la).sum()); + Summing.timeTest("Parallel", CHECK, () -> + Arrays.stream(la).parallel().sum()); + Summing.timeTest("Basic Sum", CHECK, () -> + basicSum(la)); + // Destructive summation: + Summing.timeTest("parallelPrefix", CHECK, () -> { + Arrays.parallelPrefix(la, Long::sum); + return la[la.length - 1]; + }); + } +} +/* Output: +200000010000000 +Array Stream Sum: 114ms +Parallel: 27ms +Basic Sum: 33ms +parallelPrefix: 49ms +*/ diff --git a/threads/Summing3.java b/threads/Summing3.java new file mode 100644 index 000000000..69a4314b0 --- /dev/null +++ b/threads/Summing3.java @@ -0,0 +1,41 @@ +// threads/Summing3.java +// (c)2016 MindView LLC: see Copyright.txt +// We make no guarantees that this code is fit for any purpose. +// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +import java.util.*; + +public class Summing3 { + static long basicSum(Long[] ia) { + long sum = 0; + final int sz = ia.length; + for(int i = 0; i < sz; i++) + sum += ia[i]; + return sum; + } + // Approximate largest value of SZ before + // running out of memory on my machine: + public static int SZ = 10_000_000; + public static final long CHECK = + (long)SZ * ((long)SZ + 1)/2; + public static void main(String[] args) { + System.out.println(CHECK); + Long[] La = new Long[SZ+1]; + Arrays.parallelSetAll(La, i -> (long)i); + Summing.timeTest("Long Array Stream Reduce", + CHECK, () -> + Arrays.stream(La).reduce(0L, Long::sum)); + Summing.timeTest("Long Basic Sum", CHECK, () -> + basicSum(La)); + // Destructive summation: + Summing.timeTest("Long parallelPrefix",CHECK, ()-> { + Arrays.parallelPrefix(La, Long::sum); + return La[La.length - 1]; + }); + } +} +/* Output: +50000005000000 +Long Array Stream Reduce: 1046ms +Long Basic Sum: 21ms +Long parallelPrefix: 3287ms +*/ diff --git a/threads/Summing4.java b/threads/Summing4.java new file mode 100644 index 000000000..99ec194e2 --- /dev/null +++ b/threads/Summing4.java @@ -0,0 +1,20 @@ +// threads/Summing4.java +// (c)2016 MindView LLC: see Copyright.txt +// We make no guarantees that this code is fit for any purpose. +// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +import java.util.*; + +public class Summing4 { + public static void main(String[] args) { + System.out.println(Summing3.CHECK); + Long[] La = new Long[Summing3.SZ+1]; + Arrays.parallelSetAll(La, i -> (long)i); + Summing.timeTest("Long Parallel", + Summing3.CHECK, () -> + Arrays.stream(La).parallel().reduce(0L,Long::sum)); + } +} +/* Output: +50000005000000 +Long Parallel: 1008ms +*/ diff --git a/threads/SwallowedException.java b/threads/SwallowedException.java new file mode 100644 index 000000000..ec662a094 --- /dev/null +++ b/threads/SwallowedException.java @@ -0,0 +1,17 @@ +// threads/SwallowedException.java +// (c)2016 MindView LLC: see Copyright.txt +// We make no guarantees that this code is fit for any purpose. +// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +import java.util.concurrent.*; + +public class SwallowedException { + public static void main(String[] args) + throws InterruptedException { + ExecutorService exec = + Executors.newSingleThreadExecutor(); + exec.submit(() -> { + throw new RuntimeException(); + }); + exec.shutdownNow(); + } +} diff --git a/tasks/SyncObject.java b/threads/SyncObject.java similarity index 96% rename from tasks/SyncObject.java rename to threads/SyncObject.java index 009fdb61b..be7424e19 100644 --- a/tasks/SyncObject.java +++ b/threads/SyncObject.java @@ -1,4 +1,4 @@ -// tasks/SyncObject.java +// threads/SyncObject.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. diff --git a/threads/SynchronizedEvenSupplier.java b/threads/SynchronizedEvenSupplier.java new file mode 100644 index 000000000..50c931259 --- /dev/null +++ b/threads/SynchronizedEvenSupplier.java @@ -0,0 +1,22 @@ +// threads/SynchronizedEvenSupplier.java +// (c)2016 MindView LLC: see Copyright.txt +// We make no guarantees that this code is fit for any purpose. +// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Simplifying mutexes with the synchronized keyword +// {TimeOutDuringTesting} +// {IgnoreOutput} // No output validation + +public class +SynchronizedEvenSupplier extends IntSupplier { + private int currentEvenValue = 0; + @Override + public synchronized int next() { + ++currentEvenValue; + Thread.yield(); // Cause failure faster + ++currentEvenValue; + return currentEvenValue; + } + public static void main(String[] args) { + EvenChecker.test(new SynchronizedEvenSupplier()); + } +} diff --git a/tasks/ThreadLocalVariableHolder.java b/threads/ThreadLocalVariableHolder.java similarity index 97% rename from tasks/ThreadLocalVariableHolder.java rename to threads/ThreadLocalVariableHolder.java index 6634f2bb5..2df98df5d 100644 --- a/tasks/ThreadLocalVariableHolder.java +++ b/threads/ThreadLocalVariableHolder.java @@ -1,4 +1,4 @@ -// tasks/ThreadLocalVariableHolder.java +// threads/ThreadLocalVariableHolder.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. diff --git a/threads/ThreadSize.java b/threads/ThreadSize.java new file mode 100644 index 000000000..568ad09af --- /dev/null +++ b/threads/ThreadSize.java @@ -0,0 +1,33 @@ +// threads/ThreadSize.java +// (c)2016 MindView LLC: see Copyright.txt +// We make no guarantees that this code is fit for any purpose. +// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +import java.util.concurrent.*; + +public class ThreadSize { + static class Dummy extends Thread { + @Override + public void run() { + try { + Thread.sleep(1000); + } catch(Exception e) { + throw new RuntimeException(e); + } + } + } + public static void main(String[] args) { + ExecutorService exec = + Executors.newCachedThreadPool(); + int count = 0; + try { + while(true) { + exec.execute(new Dummy()); + count++; + } + } catch(Error e) { + System.out.println( + e.getClass().getSimpleName() + ": " + count); + System.exit(0); + } + } +} diff --git a/tasks/ToastOMatic.java b/threads/ToastOMatic.java similarity index 99% rename from tasks/ToastOMatic.java rename to threads/ToastOMatic.java index 45dfb0975..e3e484588 100644 --- a/tasks/ToastOMatic.java +++ b/threads/ToastOMatic.java @@ -1,4 +1,4 @@ -// tasks/ToastOMatic.java +// threads/ToastOMatic.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. diff --git a/threads/WorkStealingPool.java b/threads/WorkStealingPool.java new file mode 100644 index 000000000..a84d47b42 --- /dev/null +++ b/threads/WorkStealingPool.java @@ -0,0 +1,39 @@ +// threads/WorkStealingPool.java +// (c)2016 MindView LLC: see Copyright.txt +// We make no guarantees that this code is fit for any purpose. +// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +import java.util.concurrent.*; + +class ShowThread implements Runnable { + @Override + public void run() { + System.out.println( + Thread.currentThread().getName()); + } +} + +public class WorkStealingPool { + public static void main(String[] args) + throws InterruptedException { + System.out.println( + Runtime.getRuntime().availableProcessors()); + ExecutorService exec = + Executors.newWorkStealingPool(); + for(int i = 0; i < 10; i++) + exec.execute(new ShowThread()); + exec.awaitTermination(1, TimeUnit.SECONDS); + } +} +/* Output: +4 +ForkJoinPool-1-worker-1 +ForkJoinPool-1-worker-3 +ForkJoinPool-1-worker-2 +ForkJoinPool-1-worker-1 +ForkJoinPool-1-worker-3 +ForkJoinPool-1-worker-0 +ForkJoinPool-1-worker-1 +ForkJoinPool-1-worker-2 +ForkJoinPool-1-worker-0 +ForkJoinPool-1-worker-3 +*/ diff --git a/tasks/build.xml b/threads/build.xml similarity index 52% rename from tasks/build.xml rename to threads/build.xml index d321f0733..8c053762c 100644 --- a/tasks/build.xml +++ b/threads/build.xml @@ -1,143 +1,129 @@ - + - - - + + - - - - - + + + - - + - + - - - - - + + - + - + + + + - - + - - - - - - - - + + + + + + + + - - + - - - + + - - - + + - - - - - + + + - - + - + - - - - - + + - + - + + + + - - + - - - - - - - - + + + + + + + + - - + - - - + + diff --git a/tasks/restaurant2/RestaurantWithQueues.java b/threads/restaurant2/RestaurantWithQueues.java similarity index 98% rename from tasks/restaurant2/RestaurantWithQueues.java rename to threads/restaurant2/RestaurantWithQueues.java index c58972ba7..195f4eeda 100644 --- a/tasks/restaurant2/RestaurantWithQueues.java +++ b/threads/restaurant2/RestaurantWithQueues.java @@ -1,9 +1,9 @@ -// tasks/restaurant2/RestaurantWithQueues.java +// threads/restaurant2/RestaurantWithQueues.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. // {Args: 5} -package tasks.restaurant2; +package threads.restaurant2; import enums.menu.*; import java.util.concurrent.*; import java.util.*; diff --git a/typeinfo/PetCount3.java b/typeinfo/PetCount3.java index 7fcaa0da7..efd157d93 100644 --- a/typeinfo/PetCount3.java +++ b/typeinfo/PetCount3.java @@ -3,15 +3,19 @@ // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. // Using isInstance() -import typeinfo.pets.*; import java.util.*; +import java.util.stream.*; import onjava.*; +import typeinfo.pets.*; public class PetCount3 { static class Counter extends LinkedHashMap, Integer> { public Counter() { - super(FilledMap.map(LiteralPetCreator.allTypes, 0)); + super(LiteralPetCreator.allTypes.stream() + .map(lpc -> Pair.make(lpc, 0)) + .collect( + Collectors.toMap(Pair::key, Pair::value))); } public void count(Pet pet) { // Class.isInstance() eliminates instanceofs: diff --git a/ui/BorderLayout1.java b/ui/BorderLayout1.java deleted file mode 100644 index 6236f4e9e..000000000 --- a/ui/BorderLayout1.java +++ /dev/null @@ -1,21 +0,0 @@ -// ui/BorderLayout1.java -// (c)2016 MindView LLC: see Copyright.txt -// We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. -// Demonstrates BorderLayout -import javax.swing.*; -import java.awt.*; -import static onjava.SwingConsole.*; - -public class BorderLayout1 extends JFrame { - public BorderLayout1() { - add(BorderLayout.NORTH, new JButton("North")); - add(BorderLayout.SOUTH, new JButton("South")); - add(BorderLayout.EAST, new JButton("East")); - add(BorderLayout.WEST, new JButton("West")); - add(BorderLayout.CENTER, new JButton("Center")); - } - public static void main(String[] args) { - run(new BorderLayout1(), 300, 250); - } -} diff --git a/ui/Borders.java b/ui/Borders.java deleted file mode 100644 index 55bf25c3e..000000000 --- a/ui/Borders.java +++ /dev/null @@ -1,40 +0,0 @@ -// ui/Borders.java -// (c)2016 MindView LLC: see Copyright.txt -// We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. -// Different Swing borders -import javax.swing.*; -import javax.swing.border.*; -import java.awt.*; -import static onjava.SwingConsole.*; - -public class Borders extends JFrame { - static JPanel showBorder(Border b) { - JPanel jp = new JPanel(); - jp.setLayout(new BorderLayout()); - String nm = b.getClass().toString(); - nm = nm.substring(nm.lastIndexOf('.') + 1); - jp.add(new JLabel(nm, JLabel.CENTER), - BorderLayout.CENTER); - jp.setBorder(b); - return jp; - } - public Borders() { - setLayout(new GridLayout(2,4)); - add(showBorder(new TitledBorder("Title"))); - add(showBorder(new EtchedBorder())); - add(showBorder(new LineBorder(Color.BLUE))); - add(showBorder( - new MatteBorder(5,5,30,30,Color.GREEN))); - add(showBorder( - new BevelBorder(BevelBorder.RAISED))); - add(showBorder( - new SoftBevelBorder(BevelBorder.LOWERED))); - add(showBorder(new CompoundBorder( - new EtchedBorder(), - new LineBorder(Color.RED)))); - } - public static void main(String[] args) { - run(new Borders(), 500, 300); - } -} diff --git a/ui/Button1.java b/ui/Button1.java deleted file mode 100644 index 7f49c9fee..000000000 --- a/ui/Button1.java +++ /dev/null @@ -1,22 +0,0 @@ -// ui/Button1.java -// (c)2016 MindView LLC: see Copyright.txt -// We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. -// Putting buttons on a Swing application -import javax.swing.*; -import java.awt.*; -import static onjava.SwingConsole.*; - -public class Button1 extends JFrame { - private JButton - b1 = new JButton("Button 1"), - b2 = new JButton("Button 2"); - public Button1() { - setLayout(new FlowLayout()); - add(b1); - add(b2); - } - public static void main(String[] args) { - run(new Button1(), 200, 100); - } -} diff --git a/ui/Button2.java b/ui/Button2.java deleted file mode 100644 index 2762bf375..000000000 --- a/ui/Button2.java +++ /dev/null @@ -1,35 +0,0 @@ -// ui/Button2.java -// (c)2016 MindView LLC: see Copyright.txt -// We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. -// Responding to button presses -import javax.swing.*; -import java.awt.*; -import java.awt.event.*; -import static onjava.SwingConsole.*; - -public class Button2 extends JFrame { - private JButton - b1 = new JButton("Button 1"), - b2 = new JButton("Button 2"); - private JTextField txt = new JTextField(10); - class ButtonListener implements ActionListener { - @Override - public void actionPerformed(ActionEvent e) { - String name = ((JButton)e.getSource()).getText(); - txt.setText(name); - } - } - private ButtonListener bl = new ButtonListener(); - public Button2() { - b1.addActionListener(bl); - b2.addActionListener(bl); - setLayout(new FlowLayout()); - add(b1); - add(b2); - add(txt); - } - public static void main(String[] args) { - run(new Button2(), 200, 150); - } -} diff --git a/ui/Button2b.java b/ui/Button2b.java deleted file mode 100644 index ebb09dc30..000000000 --- a/ui/Button2b.java +++ /dev/null @@ -1,31 +0,0 @@ -// ui/Button2b.java -// (c)2016 MindView LLC: see Copyright.txt -// We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. -// Using anonymous inner classes -import javax.swing.*; -import java.awt.*; -import java.awt.event.*; -import static onjava.SwingConsole.*; - -public class Button2b extends JFrame { - private JButton - b1 = new JButton("Button 1"), - b2 = new JButton("Button 2"); - private JTextField txt = new JTextField(10); - private ActionListener bl = e -> { - String name1 = ((JButton)e.getSource()).getText(); - txt.setText(name1); - }; - public Button2b() { - b1.addActionListener(bl); - b2.addActionListener(bl); - setLayout(new FlowLayout()); - add(b1); - add(b2); - add(txt); - } - public static void main(String[] args) { - run(new Button2b(), 200, 150); - } -} diff --git a/ui/ButtonGroups.java b/ui/ButtonGroups.java deleted file mode 100644 index 6c9acb088..000000000 --- a/ui/ButtonGroups.java +++ /dev/null @@ -1,56 +0,0 @@ -// ui/ButtonGroups.java -// (c)2016 MindView LLC: see Copyright.txt -// We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. -// Uses reflection to create groups -// of different types of AbstractButton -import javax.swing.*; -import javax.swing.border.*; -import java.awt.*; -import java.lang.reflect.*; -import static onjava.SwingConsole.*; - -public class ButtonGroups extends JFrame { - private static String[] ids = { - "June", "Ward", "Beaver", "Wally", "Eddie", "Lumpy" - }; - static JPanel makeBPanel( - Class kind, String[] ids) { - ButtonGroup bg = new ButtonGroup(); - JPanel jp = new JPanel(); - String title = kind.getName(); - title = title.substring(title.lastIndexOf('.') + 1); - jp.setBorder(new TitledBorder(title)); - for(String id : ids) { - AbstractButton ab = new JButton("failed"); - try { - // Get the dynamic constructor method - // that takes a String argument: - Constructor ctor = - kind.getConstructor(String.class); - // Create a new object: - ab = (AbstractButton)ctor.newInstance(id); - } catch(NoSuchMethodException | - SecurityException | - InstantiationException | - IllegalAccessException | - IllegalArgumentException | - InvocationTargetException ex) { - System.err.println("can't create " + kind); - } - bg.add(ab); - jp.add(ab); - } - return jp; - } - public ButtonGroups() { - setLayout(new FlowLayout()); - add(makeBPanel(JButton.class, ids)); - add(makeBPanel(JToggleButton.class, ids)); - add(makeBPanel(JCheckBox.class, ids)); - add(makeBPanel(JRadioButton.class, ids)); - } - public static void main(String[] args) { - run(new ButtonGroups(), 500, 350); - } -} diff --git a/ui/Buttons.java b/ui/Buttons.java deleted file mode 100644 index 7a0ca1939..000000000 --- a/ui/Buttons.java +++ /dev/null @@ -1,36 +0,0 @@ -// ui/Buttons.java -// (c)2016 MindView LLC: see Copyright.txt -// We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. -// Various Swing buttons -import javax.swing.*; -import javax.swing.border.*; -import javax.swing.plaf.basic.*; -import java.awt.*; -import static onjava.SwingConsole.*; - -public class Buttons extends JFrame { - private JButton jb = new JButton("JButton"); - private BasicArrowButton - up = new BasicArrowButton(BasicArrowButton.NORTH), - down = new BasicArrowButton(BasicArrowButton.SOUTH), - right = new BasicArrowButton(BasicArrowButton.EAST), - left = new BasicArrowButton(BasicArrowButton.WEST); - public Buttons() { - setLayout(new FlowLayout()); - add(jb); - add(new JToggleButton("JToggleButton")); - add(new JCheckBox("JCheckBox")); - add(new JRadioButton("JRadioButton")); - JPanel jp = new JPanel(); - jp.setBorder(new TitledBorder("Directions")); - jp.add(up); - jp.add(down); - jp.add(left); - jp.add(right); - add(jp); - } - public static void main(String[] args) { - run(new Buttons(), 350, 200); - } -} diff --git a/ui/CheckBoxes.java b/ui/CheckBoxes.java deleted file mode 100644 index 1aa99a843..000000000 --- a/ui/CheckBoxes.java +++ /dev/null @@ -1,35 +0,0 @@ -// ui/CheckBoxes.java -// (c)2016 MindView LLC: see Copyright.txt -// We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. -// Using JCheckBoxes -import javax.swing.*; -import java.awt.*; -import static onjava.SwingConsole.*; - -public class CheckBoxes extends JFrame { - private JTextArea t = new JTextArea(6, 15); - private JCheckBox - cb1 = new JCheckBox("Check Box 1"), - cb2 = new JCheckBox("Check Box 2"), - cb3 = new JCheckBox("Check Box 3"); - public CheckBoxes() { - cb1.addActionListener(e -> trace("1", cb1)); - cb2.addActionListener(e -> trace("2", cb2)); - cb3.addActionListener(e -> trace("3", cb3)); - setLayout(new FlowLayout()); - add(new JScrollPane(t)); - add(cb1); - add(cb2); - add(cb3); - } - private void trace(String b, JCheckBox cb) { - if(cb.isSelected()) - t.append("Box " + b + " Set\n"); - else - t.append("Box " + b + " Cleared\n"); - } - public static void main(String[] args) { - run(new CheckBoxes(), 200, 300); - } -} diff --git a/ui/ColorBoxes.java b/ui/ColorBoxes.java deleted file mode 100644 index 403be7989..000000000 --- a/ui/ColorBoxes.java +++ /dev/null @@ -1,57 +0,0 @@ -// ui/ColorBoxes.java -// (c)2016 MindView LLC: see Copyright.txt -// We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. -// A visual demonstration of threading -import javax.swing.*; -import java.awt.*; -import java.util.concurrent.*; -import java.util.*; -import static onjava.SwingConsole.*; - -class CBox extends JPanel implements Runnable { - private int pause; - private static SplittableRandom rand = new SplittableRandom(); - private Color color = new Color(0); - public void paintComponent(Graphics g) { - g.setColor(color); - Dimension s = getSize(); - g.fillRect(0, 0, s.width, s.height); - } - public CBox(int pause) { this.pause = pause; } - public void run() { - try { - while(!Thread.interrupted()) { - color = new Color(rand.nextInt(0x1000000)); - repaint(); // Asynchronously request a paint() - TimeUnit.MILLISECONDS.sleep(pause); - } - } catch(InterruptedException e) { - // Acceptable way to exit - } - } -} - -public class ColorBoxes extends JFrame { - private int grid = 12; - private int pause = 50; - private static ExecutorService exec = - Executors.newCachedThreadPool(); - public void setUp() { - setLayout(new GridLayout(grid, grid)); - for(int i = 0; i < grid * grid; i++) { - CBox cb = new CBox(pause); - add(cb); - exec.execute(cb); - } - } - public static void main(String[] args) { - ColorBoxes boxes = new ColorBoxes(); - if(args.length > 0) - boxes.grid = new Integer(args[0]); - if(args.length > 1) - boxes.pause = new Integer(args[1]); - boxes.setUp(); - run(boxes, 500, 400); - } -} diff --git a/ui/ComboBoxes.java b/ui/ComboBoxes.java deleted file mode 100644 index aa2475c5d..000000000 --- a/ui/ComboBoxes.java +++ /dev/null @@ -1,38 +0,0 @@ -// ui/ComboBoxes.java -// (c)2016 MindView LLC: see Copyright.txt -// We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. -// Using drop-down lists -import javax.swing.*; -import java.awt.*; -import static onjava.SwingConsole.*; - -public class ComboBoxes extends JFrame { - private String[] description = { - "Ebullient", "Obtuse", "Recalcitrant", "Brilliant", - "Somnescent", "Timorous", "Florid", "Putrescent" - }; - private JTextField t = new JTextField(15); - private JComboBox c = new JComboBox<>(); - private JButton b = new JButton("Add items"); - private int count = 0; - public ComboBoxes() { - for(int i = 0; i < 4; i++) - c.addItem(description[count++]); - t.setEditable(false); - b.addActionListener(e -> { - if(count < description.length) - c.addItem(description[count++]); - }); - c.addActionListener(e -> t.setText("index: " + - c.getSelectedIndex() + " " + - ((JComboBox)e.getSource()).getSelectedItem())); - setLayout(new FlowLayout()); - add(t); - add(c); - add(b); - } - public static void main(String[] args) { - run(new ComboBoxes(), 200, 175); - } -} diff --git a/ui/Dialogs.java b/ui/Dialogs.java deleted file mode 100644 index ae1fb96b2..000000000 --- a/ui/Dialogs.java +++ /dev/null @@ -1,33 +0,0 @@ -// ui/Dialogs.java -// (c)2016 MindView LLC: see Copyright.txt -// We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. -// Creating and using Dialog Boxes -import javax.swing.*; -import java.awt.*; -import static onjava.SwingConsole.*; - -class MyDialog extends JDialog { - public MyDialog(JFrame parent) { - super(parent, "My dialog", true); - setLayout(new FlowLayout()); - add(new JLabel("Here is my dialog")); - JButton ok = new JButton("OK"); - ok.addActionListener(e -> - dispose()); // Closes the dialog - add(ok); - setSize(150,125); - } -} - -public class Dialogs extends JFrame { - private JButton b1 = new JButton("Dialog Box"); - private MyDialog dlg = new MyDialog(null); - public Dialogs() { - b1.addActionListener(e -> dlg.setVisible(true)); - add(b1); - } - public static void main(String[] args) { - run(new Dialogs(), 125, 75); - } -} diff --git a/ui/Faces.java b/ui/Faces.java deleted file mode 100644 index 834dae892..000000000 --- a/ui/Faces.java +++ /dev/null @@ -1,55 +0,0 @@ -// ui/Faces.java -// (c)2016 MindView LLC: see Copyright.txt -// We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. -// Icon behavior in JButtons -import javax.swing.*; -import java.awt.*; -import static onjava.SwingConsole.*; - -public class Faces extends JFrame { - private static Icon[] faces; - private JButton jb, jb2 = new JButton("Disable"); - private boolean mad = false; - public Faces() { - faces = new Icon[]{ - new ImageIcon(getClass().getResource("Face0.gif")), - new ImageIcon(getClass().getResource("Face1.gif")), - new ImageIcon(getClass().getResource("Face2.gif")), - new ImageIcon(getClass().getResource("Face3.gif")), - new ImageIcon(getClass().getResource("Face4.gif")), - }; - jb = new JButton("JButton", faces[3]); - setLayout(new FlowLayout()); - jb.addActionListener(e -> { - if(mad) { - jb.setIcon(faces[3]); - mad = false; - } else { - jb.setIcon(faces[0]); - mad = true; - } - jb.setVerticalAlignment(JButton.TOP); - jb.setHorizontalAlignment(JButton.LEFT); - }); - jb.setRolloverEnabled(true); - jb.setRolloverIcon(faces[1]); - jb.setPressedIcon(faces[2]); - jb.setDisabledIcon(faces[4]); - jb.setToolTipText("Yow!"); - add(jb); - jb2.addActionListener(e -> { - if(jb.isEnabled()) { - jb.setEnabled(false); - jb2.setText("Enable"); - } else { - jb.setEnabled(true); - jb2.setText("Disable"); - } - }); - add(jb2); - } - public static void main(String[] args) { - run(new Faces(), 250, 125); - } -} diff --git a/ui/FileChooserTest.java b/ui/FileChooserTest.java deleted file mode 100644 index 240b3ebf0..000000000 --- a/ui/FileChooserTest.java +++ /dev/null @@ -1,60 +0,0 @@ -// ui/FileChooserTest.java -// (c)2016 MindView LLC: see Copyright.txt -// We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. -// Demonstration of File dialog boxes -import javax.swing.*; -import java.awt.*; -import java.awt.event.*; -import static onjava.SwingConsole.*; - -public class FileChooserTest extends JFrame { - private JTextField - fileName = new JTextField(), - dir = new JTextField(); - private JButton - open = new JButton("Open"), - save = new JButton("Save"); - public FileChooserTest() { - JPanel p = new JPanel(); - open.addActionListener(event -> { - JFileChooser c = new JFileChooser(); - // Demonstrate "Open" dialog: - int rVal = c.showOpenDialog(FileChooserTest.this); - if(rVal == JFileChooser.APPROVE_OPTION) { - fileName.setText(c.getSelectedFile().getName()); - dir.setText(c.getCurrentDirectory().toString()); - } - if(rVal == JFileChooser.CANCEL_OPTION) { - fileName.setText("You pressed cancel"); - dir.setText(""); - } - }); - p.add(open); - save.addActionListener(event -> { - JFileChooser c = new JFileChooser(); - // Demonstrate "Save" dialog: - int rVal = c.showSaveDialog(FileChooserTest.this); - if(rVal == JFileChooser.APPROVE_OPTION) { - fileName.setText(c.getSelectedFile().getName()); - dir.setText(c.getCurrentDirectory().toString()); - } - if(rVal == JFileChooser.CANCEL_OPTION) { - fileName.setText("You pressed cancel"); - dir.setText(""); - } - }); - p.add(save); - add(p, BorderLayout.SOUTH); - dir.setEditable(false); - fileName.setEditable(false); - p = new JPanel(); - p.setLayout(new GridLayout(2,1)); - p.add(fileName); - p.add(dir); - add(p, BorderLayout.NORTH); - } - public static void main(String[] args) { - run(new FileChooserTest(), 250, 150); - } -} diff --git a/ui/FlowLayout1.java b/ui/FlowLayout1.java deleted file mode 100644 index 5d707aee9..000000000 --- a/ui/FlowLayout1.java +++ /dev/null @@ -1,19 +0,0 @@ -// ui/FlowLayout1.java -// (c)2016 MindView LLC: see Copyright.txt -// We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. -// Demonstrates FlowLayout -import javax.swing.*; -import java.awt.*; -import static onjava.SwingConsole.*; - -public class FlowLayout1 extends JFrame { - public FlowLayout1() { - setLayout(new FlowLayout()); - for(int i = 0; i < 20; i++) - add(new JButton("Button " + i)); - } - public static void main(String[] args) { - run(new FlowLayout1(), 300, 300); - } -} diff --git a/ui/GridLayout1.java b/ui/GridLayout1.java deleted file mode 100644 index 0ff08ddcf..000000000 --- a/ui/GridLayout1.java +++ /dev/null @@ -1,19 +0,0 @@ -// ui/GridLayout1.java -// (c)2016 MindView LLC: see Copyright.txt -// We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. -// Demonstrates GridLayout -import javax.swing.*; -import java.awt.*; -import static onjava.SwingConsole.*; - -public class GridLayout1 extends JFrame { - public GridLayout1() { - setLayout(new GridLayout(7,3)); - for(int i = 0; i < 20; i++) - add(new JButton("Button " + i)); - } - public static void main(String[] args) { - run(new GridLayout1(), 300, 300); - } -} diff --git a/ui/HTMLButton.java b/ui/HTMLButton.java deleted file mode 100644 index 9581439f4..000000000 --- a/ui/HTMLButton.java +++ /dev/null @@ -1,27 +0,0 @@ -// ui/HTMLButton.java -// (c)2016 MindView LLC: see Copyright.txt -// We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. -// Putting HTML text on Swing components -import javax.swing.*; -import java.awt.*; -import static onjava.SwingConsole.*; - -public class HTMLButton extends JFrame { - private JButton b = new JButton( - "" + - "
Hello!
Press me now!"); - public HTMLButton() { - b.addActionListener(e -> { - add(new JLabel("" + - "Kapow!")); - // Force a re-layout to include the new label: - validate(); - }); - setLayout(new FlowLayout()); - add(b); - } - public static void main(String[] args) { - run(new HTMLButton(), 200, 500); - } -} diff --git a/ui/HelloLabel.java b/ui/HelloLabel.java deleted file mode 100644 index 76115ea9a..000000000 --- a/ui/HelloLabel.java +++ /dev/null @@ -1,20 +0,0 @@ -// ui/HelloLabel.java -// (c)2016 MindView LLC: see Copyright.txt -// We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. -import javax.swing.*; -import java.util.concurrent.*; - -public class HelloLabel { - public static void - main(String[] args) throws Exception { - JFrame frame = new JFrame("Hello Swing"); - JLabel label = new JLabel("A Label"); - frame.add(label); - frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - frame.setSize(300, 100); - frame.setVisible(true); - TimeUnit.SECONDS.sleep(1); - label.setText("Hey! This is Different!"); - } -} diff --git a/ui/HelloSwing.java b/ui/HelloSwing.java deleted file mode 100644 index b3971346e..000000000 --- a/ui/HelloSwing.java +++ /dev/null @@ -1,14 +0,0 @@ -// ui/HelloSwing.java -// (c)2016 MindView LLC: see Copyright.txt -// We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. -import javax.swing.*; - -public class HelloSwing { - public static void main(String[] args) { - JFrame frame = new JFrame("Hello Swing"); - frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - frame.setSize(300, 100); - frame.setVisible(true); - } -} diff --git a/ui/InterruptableLongRunningCallable.java b/ui/InterruptableLongRunningCallable.java deleted file mode 100644 index 95dc5ce5e..000000000 --- a/ui/InterruptableLongRunningCallable.java +++ /dev/null @@ -1,54 +0,0 @@ -// ui/InterruptableLongRunningCallable.java -// (c)2016 MindView LLC: see Copyright.txt -// We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. -// Using Callables for long-running tasks -import javax.swing.*; -import java.awt.*; -import java.util.concurrent.*; -import onjava.*; -import static onjava.SwingConsole.*; - -class CallableTask extends Task -implements Callable { - @Override - public String call() { - run(); - return "Return value of " + this; - } -} - -public class -InterruptableLongRunningCallable extends JFrame { - private JButton - b1 = new JButton("Start Long Running Task"), - b2 = new JButton("End Long Running Task"), - b3 = new JButton("Get results"); - private TaskManager manager = - new TaskManager<>(); - public InterruptableLongRunningCallable() { - b1.addActionListener(e -> { - CallableTask task = new CallableTask(); - manager.add(task); - System.out.println(task + " added to the queue"); - }); - b2.addActionListener(e -> { - for(String result : manager.purge()) - System.out.println(result); - }); - b3.addActionListener(e -> { - // Sample call to a Task method: - for(TaskItem tt : manager) - tt.task.id(); // No cast required - for(String result : manager.getResults()) - System.out.println(result); - }); - setLayout(new FlowLayout()); - add(b1); - add(b2); - add(b3); - } - public static void main(String[] args) { - run(new InterruptableLongRunningCallable(), 200, 150); - } -} diff --git a/ui/InterruptableLongRunningTask.java b/ui/InterruptableLongRunningTask.java deleted file mode 100644 index a40dc783d..000000000 --- a/ui/InterruptableLongRunningTask.java +++ /dev/null @@ -1,52 +0,0 @@ -// ui/InterruptableLongRunningTask.java -// (c)2016 MindView LLC: see Copyright.txt -// We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. -// Long-running tasks in threads -import javax.swing.*; -import java.awt.*; -import java.util.concurrent.*; -import static onjava.SwingConsole.*; - -class Task implements Runnable { - private static int counter = 0; - private final int id = counter++; - @Override - public void run() { - System.out.println(this + " started"); - try { - TimeUnit.SECONDS.sleep(3); - } catch(InterruptedException e) { - System.out.println(this + " interrupted"); - return; - } - System.out.println(this + " completed"); - } - @Override - public String toString() { return "Task " + id; } - public long id() { return id; } -}; - -public class InterruptableLongRunningTask extends JFrame { - private JButton - b1 = new JButton("Start Long Running Task"), - b2 = new JButton("End Long Running Task"); - ExecutorService executor = - Executors.newSingleThreadExecutor(); - public InterruptableLongRunningTask() { - b1.addActionListener(e -> { - Task task = new Task(); - executor.execute(task); - System.out.println(task + " added to the queue"); - }); - b2.addActionListener(e -> { - executor.shutdownNow(); // Heavy-handed - }); - setLayout(new FlowLayout()); - add(b1); - add(b2); - } - public static void main(String[] args) { - run(new InterruptableLongRunningTask(), 200, 150); - } -} diff --git a/ui/List.java b/ui/List.java deleted file mode 100644 index 51e4e16ee..000000000 --- a/ui/List.java +++ /dev/null @@ -1,61 +0,0 @@ -// ui/List.java -// (c)2016 MindView LLC: see Copyright.txt -// We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. -import javax.swing.*; -import javax.swing.border.*; -import javax.swing.event.*; -import java.awt.*; -import java.awt.event.*; -import static onjava.SwingConsole.*; - -public class List extends JFrame { - private String[] flavors = { - "Chocolate", "Strawberry", "Vanilla Fudge Swirl", - "Mint Chip", "Mocha Almond Fudge", "Rum Raisin", - "Praline Cream", "Mud Pie" - }; - private int count = 0; - private DefaultListModel lItems = - new DefaultListModel<>(); - private JList lst = new JList<>(lItems); - private JTextArea t = - new JTextArea(flavors.length, 20); - private JButton b = new JButton("Add Item"); - private ActionListener bl = e -> { - if(count < flavors.length) { - lItems.add(0, flavors[count++]); - } else { - // Disable, since there are no more - // flavors left to be added to the List - b.setEnabled(false); - } - }; - private ListSelectionListener ll = e -> { - if(e.getValueIsAdjusting()) return; - t.setText(""); - for(Object item : lst.getSelectedValuesList()) - t.append(item + "\n"); - }; - public List() { - t.setEditable(false); - setLayout(new FlowLayout()); - // Create Borders for components: - Border brd = BorderFactory.createMatteBorder( - 1, 1, 2, 2, Color.BLACK); - lst.setBorder(brd); - t.setBorder(brd); - // Add the first four items to the List - for(int i = 0; i < 4; i++) - lItems.addElement(flavors[count++]); - add(t); - add(lst); - add(b); - // Register event listeners - lst.addListSelectionListener(ll); - b.addActionListener(bl); - } - public static void main(String[] args) { - run(new List(), 250, 375); - } -} diff --git a/ui/LongRunningTask.java b/ui/LongRunningTask.java deleted file mode 100644 index 4cbc3e141..000000000 --- a/ui/LongRunningTask.java +++ /dev/null @@ -1,36 +0,0 @@ -// ui/LongRunningTask.java -// (c)2016 MindView LLC: see Copyright.txt -// We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. -// A badly designed program -import javax.swing.*; -import java.awt.*; -import java.util.concurrent.*; -import static onjava.SwingConsole.*; - -public class LongRunningTask extends JFrame { - private JButton - b1 = new JButton("Start Long Running Task"), - b2 = new JButton("End Long Running Task"); - public LongRunningTask() { - b1.addActionListener(e -> { - try { - TimeUnit.SECONDS.sleep(3); - } catch(InterruptedException ex) { - System.out.println("Task interrupted"); - return; - } - System.out.println("Task completed"); - }); - b2.addActionListener(e -> { - // Interrupt yourself? - Thread.currentThread().interrupt(); - }); - setLayout(new FlowLayout()); - add(b1); - add(b2); - } - public static void main(String[] args) { - run(new LongRunningTask(), 200, 150); - } -} diff --git a/ui/LookAndFeel.java b/ui/LookAndFeel.java deleted file mode 100644 index b49f5e641..000000000 --- a/ui/LookAndFeel.java +++ /dev/null @@ -1,90 +0,0 @@ -// ui/LookAndFeel.java -// (c)2016 MindView LLC: see Copyright.txt -// We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. -// Selecting different looks & feels -// {Args: motif} -import javax.swing.*; -import java.awt.*; -import java.util.*; -import static onjava.SwingConsole.*; - -public class LookAndFeel extends JFrame { - private String[] choices = - "Eeny Meeny Minnie Mickey Moe Larry Curly" - .split(" "); - private Component[] samples = { - new JButton("JButton"), - new JTextField("JTextField"), - new JLabel("JLabel"), - new JCheckBox("JCheckBox"), - new JRadioButton("Radio"), - new JComboBox<>(choices), - new JList<>(choices), - }; - private static - Map optionMap = new HashMap<>(); - private static String options = ""; - public LookAndFeel() { - super("Look And Feel"); - setLayout(new FlowLayout()); - for(Component component : samples) - add(component); - } - public static void initOptions() { - if(optionMap.isEmpty()) { - UIManager.LookAndFeelInfo[] lafi = - UIManager.getInstalledLookAndFeels(); - for(UIManager.LookAndFeelInfo lf : lafi) { - String classname = lf.getClassName(); - String[] parts = classname.split("\\."); - String option = parts[parts.length - 2]; - optionMap.put(option, classname); - } - for(String option : optionMap.keySet()) - options += option + " | "; - options = - options.substring(0, options.length() - 3); - options = "cross | system | " + options; - } - } - private static void usageError() { - System.out.println( - "Usage:LookAndFeel [ " + options + " ]"); - System.exit(1); - } - public static void main(String[] args) { - initOptions(); - if(args.length == 0) usageError(); - try { - switch(args[0]) { - case "cross": - UIManager.setLookAndFeel(UIManager. - getCrossPlatformLookAndFeelClassName()); - break; - case "system": - UIManager.setLookAndFeel(UIManager. - getSystemLookAndFeelClassName()); - break; - case "motif": - UIManager.setLookAndFeel("com.sun.java."+ - "swing.plaf.motif.MotifLookAndFeel"); - break; - default: - if(optionMap.containsKey(args[0])) - UIManager.setLookAndFeel( - optionMap.get(args[0])); - else - usageError(); - } - } catch(ClassNotFoundException | - InstantiationException | - IllegalAccessException | - UnsupportedLookAndFeelException e) { - usageError(); - } - // Note the look & feel must be set before - // any components are created. - run(new LookAndFeel(), 300, 300); - } -} diff --git a/ui/Menus.java b/ui/Menus.java deleted file mode 100644 index a8328d4bb..000000000 --- a/ui/Menus.java +++ /dev/null @@ -1,163 +0,0 @@ -// ui/Menus.java -// (c)2016 MindView LLC: see Copyright.txt -// We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. -// Submenus, check box menu items, swapping menus, -// mnemonics (shortcuts) and action commands -import javax.swing.*; -import java.awt.*; -import java.awt.event.*; -import static onjava.SwingConsole.*; - -public class Menus extends JFrame { - private String[] flavors = { - "Chocolate", "Strawberry", "Vanilla Fudge Swirl", - "Mint Chip", "Mocha Almond Fudge", "Rum Raisin", - "Praline Cream", "Mud Pie" - }; - private JTextField t = new JTextField("No flavor", 30); - private JMenuBar mb1 = new JMenuBar(); - private JMenu - f = new JMenu("File"), - m = new JMenu("Flavors"), - s = new JMenu("Safety"); - // Alternative approach: - private JCheckBoxMenuItem[] safety = { - new JCheckBoxMenuItem("Guard"), - new JCheckBoxMenuItem("Hide") - }; - private JMenuItem[] file = { new JMenuItem("Open") }; - // A second menu bar to swap to: - private JMenuBar mb2 = new JMenuBar(); - private JMenu fooBar = new JMenu("fooBar"); - private JMenuItem[] other = { - // Adding a menu shortcut (mnemonic) is very - // simple, but only JMenuItems can have them - // in their constructors: - new JMenuItem("Foo", KeyEvent.VK_F), - new JMenuItem("Bar", KeyEvent.VK_A), - // No shortcut: - new JMenuItem("Baz"), - }; - private JButton b = new JButton("Swap Menus"); - class BL implements ActionListener { - @Override - public void actionPerformed(ActionEvent e) { - JMenuBar m = getJMenuBar(); - setJMenuBar(m == mb1 ? mb2 : mb1); - validate(); // Refresh the frame - } - } - class ML implements ActionListener { - @Override - public void actionPerformed(ActionEvent e) { - JMenuItem target = (JMenuItem)e.getSource(); - String actionCommand = target.getActionCommand(); - if(actionCommand.equals("Open")) { - String s = t.getText(); - boolean chosen = false; - for(String flavor : flavors) - if(s.equals(flavor)) - chosen = true; - if(!chosen) - t.setText("Choose a flavor first!"); - else - t.setText("Opening " + s + ". Mmm, mm!"); - } - } - } - class FL implements ActionListener { - @Override - public void actionPerformed(ActionEvent e) { - JMenuItem target = (JMenuItem)e.getSource(); - t.setText(target.getText()); - } - } - // Alternatively, you can create a different - // class for each different MenuItem. Then you - // don't have to figure out which one it is: - class FooL implements ActionListener { - @Override - public void actionPerformed(ActionEvent e) { - t.setText("Foo selected"); - } - } - class BarL implements ActionListener { - @Override - public void actionPerformed(ActionEvent e) { - t.setText("Bar selected"); - } - } - class BazL implements ActionListener { - @Override - public void actionPerformed(ActionEvent e) { - t.setText("Baz selected"); - } - } - class CMIL implements ItemListener { - @Override - public void itemStateChanged(ItemEvent e) { - JCheckBoxMenuItem target = - (JCheckBoxMenuItem)e.getSource(); - String actionCommand = target.getActionCommand(); - switch (actionCommand) { - case "Guard": - t.setText("Guard the Ice Cream! " + - "Guarding is " + target.getState()); - break; - case "Hide": - t.setText("Hide the Ice Cream! " + - "Is it hidden? " + target.getState()); - break; - } - } - } - public Menus() { - ML ml = new ML(); - CMIL cmil = new CMIL(); - safety[0].setActionCommand("Guard"); - safety[0].setMnemonic(KeyEvent.VK_G); - safety[0].addItemListener(cmil); - safety[1].setActionCommand("Hide"); - safety[1].setMnemonic(KeyEvent.VK_H); - safety[1].addItemListener(cmil); - other[0].addActionListener(new FooL()); - other[1].addActionListener(new BarL()); - other[2].addActionListener(new BazL()); - FL fl = new FL(); - int n = 0; - for(String flavor : flavors) { - JMenuItem mi = new JMenuItem(flavor); - mi.addActionListener(fl); - m.add(mi); - // Add separators at intervals: - if((n++ + 1) % 3 == 0) - m.addSeparator(); - } - for(JCheckBoxMenuItem sfty : safety) - s.add(sfty); - s.setMnemonic(KeyEvent.VK_A); - f.add(s); - f.setMnemonic(KeyEvent.VK_F); - for(JMenuItem file1 : file) { - file1.addActionListener(ml); - f.add(file1); - } - mb1.add(f); - mb1.add(m); - setJMenuBar(mb1); - t.setEditable(false); - add(t, BorderLayout.CENTER); - // Set up the system for swapping menus: - b.addActionListener(new BL()); - b.setMnemonic(KeyEvent.VK_S); - add(b, BorderLayout.NORTH); - for(JMenuItem oth : other) - fooBar.add(oth); - fooBar.setMnemonic(KeyEvent.VK_B); - mb2.add(fooBar); - } - public static void main(String[] args) { - run(new Menus(), 300, 200); - } -} diff --git a/ui/MessageBoxes.java b/ui/MessageBoxes.java deleted file mode 100644 index bd2fab08e..000000000 --- a/ui/MessageBoxes.java +++ /dev/null @@ -1,72 +0,0 @@ -// ui/MessageBoxes.java -// (c)2016 MindView LLC: see Copyright.txt -// We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. -// Demonstrates JOptionPane -import javax.swing.*; -import java.awt.*; -import java.awt.event.*; -import static onjava.SwingConsole.*; - -public class MessageBoxes extends JFrame { - private JButton[] b = { - new JButton("Alert"), new JButton("Yes/No"), - new JButton("Color"), new JButton("Input"), - new JButton("3 Vals") - }; - private JTextField txt = new JTextField(15); - private ActionListener al = e -> { - String id = ((JButton)e.getSource()).getText(); - switch (id) { - case "Alert": - JOptionPane.showMessageDialog(null, - "There's a bug on you!", "Hey!", - JOptionPane.ERROR_MESSAGE); - break; - case "Yes/No": - JOptionPane.showConfirmDialog(null, - "or no", "choose yes", - JOptionPane.YES_NO_OPTION); - break; - case "Color": - Object[] options = { "Red", "Green" }; - int sel = JOptionPane.showOptionDialog( - null, "Choose a Color!", "Warning", - JOptionPane.DEFAULT_OPTION, - JOptionPane.WARNING_MESSAGE, null, - options, options[0]); - if(sel != JOptionPane.CLOSED_OPTION) - txt.setText("Color Selected: " + options[sel]); - break; - case "Input": { - String val = JOptionPane.showInputDialog( - "How many fingers do you see?"); - txt.setText(val); - break; - } - case "3 Vals": { - Object[] selections = { - "First", "Second", "Third" - }; - Object val = JOptionPane.showInputDialog( - null, "Choose one", "Input", - JOptionPane.INFORMATION_MESSAGE, - null, selections, selections[0]); - if(val != null) - txt.setText(val.toString()); - break; - } - } - }; - public MessageBoxes() { - setLayout(new FlowLayout()); - for(JButton b1 : b) { - b1.addActionListener(al); - add(b1); - } - add(txt); - } - public static void main(String[] args) { - run(new MessageBoxes(), 200, 200); - } -} diff --git a/ui/MonitoredLongRunningCallable.java b/ui/MonitoredLongRunningCallable.java deleted file mode 100644 index adbf6bad4..000000000 --- a/ui/MonitoredLongRunningCallable.java +++ /dev/null @@ -1,81 +0,0 @@ -// ui/MonitoredLongRunningCallable.java -// (c)2016 MindView LLC: see Copyright.txt -// We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. -// Displaying task progress with ProgressMonitors -// {IgnoreOutput} -import javax.swing.*; -import java.awt.*; -import java.util.concurrent.*; -import onjava.*; -import static onjava.SwingConsole.*; - -class MonitoredCallable implements Callable { - private static int counter = 0; - private final int id = counter++; - private final ProgressMonitor monitor; - private final static int MAX = 8; - public MonitoredCallable(ProgressMonitor monitor) { - this.monitor = monitor; - monitor.setNote(toString()); - monitor.setMaximum(MAX - 1); - monitor.setMillisToPopup(500); - } - @Override - public String call() { - System.out.println(this + " started"); - try { - for(int i = 0; i < MAX; i++) { - TimeUnit.MILLISECONDS.sleep(500); - if(monitor.isCanceled()) - Thread.currentThread().interrupt(); - final int progress = i; - SwingUtilities.invokeLater(() -> - monitor.setProgress(progress)); - } - } catch(InterruptedException e) { - monitor.close(); - System.out.println(this + " interrupted"); - return "Result: " + this + " interrupted"; - } - System.out.println(this + " completed"); - return "Result: " + this + " completed"; - } - @Override - public String toString() { return "Task " + id; } -}; - -public class MonitoredLongRunningCallable extends JFrame { - private JButton - b1 = new JButton("Start Long Running Task"), - b2 = new JButton("End Long Running Task"), - b3 = new JButton("Get results"); - private TaskManager manager = - new TaskManager<>(); - public MonitoredLongRunningCallable() { - b1.addActionListener(e -> { - MonitoredCallable task = new MonitoredCallable( - new ProgressMonitor( - MonitoredLongRunningCallable.this, - "Long-Running Task", "", 0, 0) - ); - manager.add(task); - System.out.println(task + " added to the queue"); - }); - b2.addActionListener(e -> { - for(String result : manager.purge()) - System.out.println(result); - }); - b3.addActionListener(e -> { - for(String result : manager.getResults()) - System.out.println(result); - }); - setLayout(new FlowLayout()); - add(b1); - add(b2); - add(b3); - } - public static void main(String[] args) { - run(new MonitoredLongRunningCallable(), 200, 500); - } -} diff --git a/ui/Popup.java b/ui/Popup.java deleted file mode 100644 index 67469e363..000000000 --- a/ui/Popup.java +++ /dev/null @@ -1,53 +0,0 @@ -// ui/Popup.java -// (c)2016 MindView LLC: see Copyright.txt -// We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. -// Creating popup menus with Swing -import javax.swing.*; -import java.awt.*; -import java.awt.event.*; -import static onjava.SwingConsole.*; - -public class Popup extends JFrame { - private JPopupMenu popup = new JPopupMenu(); - private JTextField t = new JTextField(10); - public Popup() { - setLayout(new FlowLayout()); - add(t); - ActionListener al = e -> - t.setText(((JMenuItem)e.getSource()).getText()); - JMenuItem m = new JMenuItem("Hither"); - m.addActionListener(al); - popup.add(m); - m = new JMenuItem("Yon"); - m.addActionListener(al); - popup.add(m); - m = new JMenuItem("Afar"); - m.addActionListener(al); - popup.add(m); - popup.addSeparator(); - m = new JMenuItem("Stay Here"); - m.addActionListener(al); - popup.add(m); - PopupListener pl = new PopupListener(); - addMouseListener(pl); - t.addMouseListener(pl); - } - class PopupListener extends MouseAdapter { - @Override - public void mousePressed(MouseEvent e) { - maybeShowPopup(e); - } - @Override - public void mouseReleased(MouseEvent e) { - maybeShowPopup(e); - } - private void maybeShowPopup(MouseEvent e) { - if(e.isPopupTrigger()) - popup.show(e.getComponent(), e.getX(), e.getY()); - } - } - public static void main(String[] args) { - run(new Popup(), 300, 200); - } -} diff --git a/ui/Progress.java b/ui/Progress.java deleted file mode 100644 index a1e4b99c5..000000000 --- a/ui/Progress.java +++ /dev/null @@ -1,35 +0,0 @@ -// ui/Progress.java -// (c)2016 MindView LLC: see Copyright.txt -// We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. -// Using sliders, progress bars and progress monitors -import javax.swing.*; -import javax.swing.border.*; -import java.awt.*; -import static onjava.SwingConsole.*; - -public class Progress extends JFrame { - private JProgressBar pb = new JProgressBar(); - private ProgressMonitor pm = new ProgressMonitor( - this, "Monitoring Progress", "Test", 0, 100); - private JSlider sb = - new JSlider(JSlider.HORIZONTAL, 0, 100, 60); - public Progress() { - setLayout(new GridLayout(2,1)); - add(pb); - pm.setProgress(0); - pm.setMillisToPopup(1000); - sb.setValue(0); - sb.setPaintTicks(true); - sb.setMajorTickSpacing(20); - sb.setMinorTickSpacing(5); - sb.setBorder(new TitledBorder("Slide Me")); - pb.setModel(sb.getModel()); // Share model - add(sb); - sb.addChangeListener(e -> - pm.setProgress(sb.getValue())); - } - public static void main(String[] args) { - run(new Progress(), 300, 200); - } -} diff --git a/ui/RadioButtons.java b/ui/RadioButtons.java deleted file mode 100644 index 180e0d5b8..000000000 --- a/ui/RadioButtons.java +++ /dev/null @@ -1,36 +0,0 @@ -// ui/RadioButtons.java -// (c)2016 MindView LLC: see Copyright.txt -// We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. -// Using JRadioButtons -import javax.swing.*; -import java.awt.*; -import java.awt.event.*; -import static onjava.SwingConsole.*; - -public class RadioButtons extends JFrame { - private JTextField t = new JTextField(15); - private ButtonGroup g = new ButtonGroup(); - private JRadioButton - rb1 = new JRadioButton("one", false), - rb2 = new JRadioButton("two", false), - rb3 = new JRadioButton("three", false); - private ActionListener al = e -> - t.setText("Radio button " + - ((JRadioButton)e.getSource()).getText()); - public RadioButtons() { - rb1.addActionListener(al); - rb2.addActionListener(al); - rb3.addActionListener(al); - g.add(rb1); g.add(rb2); g.add(rb3); - t.setEditable(false); - setLayout(new FlowLayout()); - add(t); - add(rb1); - add(rb2); - add(rb3); - } - public static void main(String[] args) { - run(new RadioButtons(), 200, 125); - } -} diff --git a/ui/ShowAddListeners.java b/ui/ShowAddListeners.java deleted file mode 100644 index e8b8b47d8..000000000 --- a/ui/ShowAddListeners.java +++ /dev/null @@ -1,63 +0,0 @@ -// ui/ShowAddListeners.java -// (c)2016 MindView LLC: see Copyright.txt -// We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. -// Display the "addXXXListener" methods of any Swing class -import javax.swing.*; -import java.awt.*; -import java.awt.event.*; -import java.lang.reflect.*; -import java.util.regex.*; -import static onjava.SwingConsole.*; - -public class ShowAddListeners extends JFrame { - private JTextField name = new JTextField(25); - private JTextArea results = new JTextArea(40, 65); - private static Pattern addListener = - Pattern.compile("(add\\w+?Listener\\(.*?\\))"); - private static Pattern qualifier = - Pattern.compile("\\w+\\."); - class NameL implements ActionListener { - @Override - public void actionPerformed(ActionEvent e) { - String nm = name.getText().trim(); - if(nm.length() == 0) { - results.setText("No match"); - return; - } - Class kind; - try { - kind = Class.forName("javax.swing." + nm); - } catch(ClassNotFoundException ex) { - results.setText("No match"); - return; - } - Method[] methods = kind.getMethods(); - results.setText(""); - for(Method m : methods) { - Matcher matcher = - addListener.matcher(m.toString()); - if(matcher.find()) - results.append(qualifier.matcher( - matcher.group(1)).replaceAll("") + "\n"); - } - } - } - public ShowAddListeners() { - NameL nameListener = new NameL(); - name.addActionListener(nameListener); - JPanel top = new JPanel(); - top.add(new JLabel( - "Swing class name (press Enter):")); - top.add(name); - add(BorderLayout.NORTH, top); - add(new JScrollPane(results)); - // Initial data and test: - name.setText("JTextArea"); - nameListener.actionPerformed( - new ActionEvent("", 0, "")); - } - public static void main(String[] args) { - run(new ShowAddListeners(), 500, 400); - } -} diff --git a/ui/SimpleMenus.java b/ui/SimpleMenus.java deleted file mode 100644 index b9667e4a8..000000000 --- a/ui/SimpleMenus.java +++ /dev/null @@ -1,40 +0,0 @@ -// ui/SimpleMenus.java -// (c)2016 MindView LLC: see Copyright.txt -// We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. -import javax.swing.*; -import java.awt.*; -import java.awt.event.*; -import static onjava.SwingConsole.*; - -public class SimpleMenus extends JFrame { - private JTextField t = new JTextField(15); - private ActionListener al = e -> - t.setText(((JMenuItem)e.getSource()).getText()); - private JMenu[] menus = { - new JMenu("Winken"), new JMenu("Blinken"), - new JMenu("Nod") - }; - private JMenuItem[] items = { - new JMenuItem("Fee"), new JMenuItem("Fi"), - new JMenuItem("Fo"), new JMenuItem("Zip"), - new JMenuItem("Zap"), new JMenuItem("Zot"), - new JMenuItem("Olly"), new JMenuItem("Oxen"), - new JMenuItem("Free") - }; - public SimpleMenus() { - for(int i = 0; i < items.length; i++) { - items[i].addActionListener(al); - menus[i % 3].add(items[i]); - } - JMenuBar mb = new JMenuBar(); - for(JMenu jm : menus) - mb.add(jm); - setJMenuBar(mb); - setLayout(new FlowLayout()); - add(t); - } - public static void main(String[] args) { - run(new SimpleMenus(), 200, 150); - } -} diff --git a/ui/SineWave.java b/ui/SineWave.java deleted file mode 100644 index 6f1915f16..000000000 --- a/ui/SineWave.java +++ /dev/null @@ -1,60 +0,0 @@ -// ui/SineWave.java -// (c)2016 MindView LLC: see Copyright.txt -// We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. -// Drawing with Swing, using a JSlider -import javax.swing.*; -import javax.swing.event.*; -import java.awt.*; -import static onjava.SwingConsole.*; - -class SineDraw extends JPanel { - private static final int SCALEFACTOR = 200; - private int cycles; - private int points; - private double[] sines; - private int[] pts; - public SineDraw() { setCycles(5); } - public void paintComponent(Graphics g) { - super.paintComponent(g); - int maxWidth = getWidth(); - double hstep = (double)maxWidth / (double)points; - int maxHeight = getHeight(); - pts = new int[points]; - for(int i = 0; i < points; i++) - pts[i] = - (int)(sines[i] * maxHeight/2 * .95 + maxHeight/2); - g.setColor(Color.RED); - for(int i = 1; i < points; i++) { - int x1 = (int)((i - 1) * hstep); - int x2 = (int)(i * hstep); - int y1 = pts[i-1]; - int y2 = pts[i]; - g.drawLine(x1, y1, x2, y2); - } - } - public void setCycles(int newCycles) { - cycles = newCycles; - points = SCALEFACTOR * cycles * 2; - sines = new double[points]; - for(int i = 0; i < points; i++) { - double radians = (Math.PI / SCALEFACTOR) * i; - sines[i] = Math.sin(radians); - } - repaint(); - } -} - -public class SineWave extends JFrame { - private SineDraw sines = new SineDraw(); - private JSlider adjustCycles = new JSlider(1, 30, 5); - public SineWave() { - add(sines); - adjustCycles.addChangeListener(e -> sines.setCycles( - ((JSlider)e.getSource()).getValue())); - add(BorderLayout.SOUTH, adjustCycles); - } - public static void main(String[] args) { - run(new SineWave(), 700, 400); - } -} diff --git a/ui/SubmitLabelManipulationTask.java b/ui/SubmitLabelManipulationTask.java deleted file mode 100644 index 1616387bc..000000000 --- a/ui/SubmitLabelManipulationTask.java +++ /dev/null @@ -1,21 +0,0 @@ -// ui/SubmitLabelManipulationTask.java -// (c)2016 MindView LLC: see Copyright.txt -// We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. -import javax.swing.*; -import java.util.concurrent.*; - -public class SubmitLabelManipulationTask { - public static void - main(String[] args) throws Exception { - JFrame frame = new JFrame("Hello Swing"); - final JLabel label = new JLabel("A Label"); - frame.add(label); - frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - frame.setSize(300, 100); - frame.setVisible(true); - TimeUnit.SECONDS.sleep(1); - SwingUtilities.invokeLater(() -> - label.setText("Hey! This is Different!")); - } -} diff --git a/ui/SubmitSwingProgram.java b/ui/SubmitSwingProgram.java deleted file mode 100644 index fe029cf02..000000000 --- a/ui/SubmitSwingProgram.java +++ /dev/null @@ -1,27 +0,0 @@ -// ui/SubmitSwingProgram.java -// (c)2016 MindView LLC: see Copyright.txt -// We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. -import javax.swing.*; -import java.util.concurrent.*; - -public class SubmitSwingProgram extends JFrame { - JLabel label; - public SubmitSwingProgram() { - super("Hello Swing"); - label = new JLabel("A Label"); - add(label); - setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - setSize(300, 100); - setVisible(true); - } - static SubmitSwingProgram ssp; - public static void - main(String[] args) throws Exception { - SwingUtilities.invokeLater(() -> - ssp = new SubmitSwingProgram()); - TimeUnit.SECONDS.sleep(1); - SwingUtilities.invokeLater(() -> - ssp.label.setText("Hey! This is Different!")); - } -} diff --git a/ui/TabbedPane1.java b/ui/TabbedPane1.java deleted file mode 100644 index 0d529dec9..000000000 --- a/ui/TabbedPane1.java +++ /dev/null @@ -1,32 +0,0 @@ -// ui/TabbedPane1.java -// (c)2016 MindView LLC: see Copyright.txt -// We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. -// Demonstrates the Tabbed Pane -import javax.swing.*; -import java.awt.*; -import static onjava.SwingConsole.*; - -public class TabbedPane1 extends JFrame { - private String[] flavors = { - "Chocolate", "Strawberry", "Vanilla Fudge Swirl", - "Mint Chip", "Mocha Almond Fudge", "Rum Raisin", - "Praline Cream", "Mud Pie" - }; - private JTabbedPane tabs = new JTabbedPane(); - private JTextField txt = new JTextField(20); - public TabbedPane1() { - int i = 0; - for(String flavor : flavors) - tabs.addTab(flavors[i], - new JButton("Tabbed pane " + i++)); - tabs.addChangeListener(e -> - txt.setText("Tab selected: " + - tabs.getSelectedIndex())); - add(BorderLayout.SOUTH, txt); - add(tabs); - } - public static void main(String[] args) { - run(new TabbedPane1(), 400, 250); - } -} diff --git a/ui/TextArea.java b/ui/TextArea.java deleted file mode 100644 index ab8d8dfb1..000000000 --- a/ui/TextArea.java +++ /dev/null @@ -1,34 +0,0 @@ -// ui/TextArea.java -// (c)2016 MindView LLC: see Copyright.txt -// We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. -// Using the JTextArea control -import javax.swing.*; -import java.awt.*; -import java.util.*; -import onjava.*; -import static onjava.SwingConsole.*; - -public class TextArea extends JFrame { - private JButton - b = new JButton("Add Data"), - c = new JButton("Clear Data"); - private JTextArea t = new JTextArea(20, 40); - private Map m = new HashMap<>(); - public TextArea() { - // Use up all the data: - m.putAll(Countries.capitals()); - b.addActionListener(e -> { - for(Map.Entry me : m.entrySet()) - t.append(me.getKey() + ": "+ me.getValue()+"\n"); - }); - c.addActionListener(e -> t.setText("")); - setLayout(new FlowLayout()); - add(new JScrollPane(t)); - add(b); - add(c); - } - public static void main(String[] args) { - run(new TextArea(), 475, 425); - } -} diff --git a/ui/TextFields.java b/ui/TextFields.java deleted file mode 100644 index eba0abe81..000000000 --- a/ui/TextFields.java +++ /dev/null @@ -1,92 +0,0 @@ -// ui/TextFields.java -// (c)2016 MindView LLC: see Copyright.txt -// We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. -// Text fields and Java events -import javax.swing.*; -import javax.swing.event.*; -import javax.swing.text.*; -import java.awt.*; -import java.awt.event.*; -import static onjava.SwingConsole.*; - -public class TextFields extends JFrame { - private JButton - b1 = new JButton("Get Text"), - b2 = new JButton("Set Text"); - private JTextField - t1 = new JTextField(30), - t2 = new JTextField(30), - t3 = new JTextField(30); - private String s = ""; - private UpperCaseDocument ucd = new UpperCaseDocument(); - public TextFields() { - t1.setDocument(ucd); - ucd.addDocumentListener(new T1()); - b1.addActionListener(new B1()); - b2.addActionListener(new B2()); - t1.addActionListener(new T1A()); - setLayout(new FlowLayout()); - add(b1); - add(b2); - add(t1); - add(t2); - add(t3); - } - class T1 implements DocumentListener { - @Override - public void changedUpdate(DocumentEvent e) {} - @Override - public void insertUpdate(DocumentEvent e) { - t2.setText(t1.getText()); - t3.setText("Text: "+ t1.getText()); - } - @Override - public void removeUpdate(DocumentEvent e) { - t2.setText(t1.getText()); - } - } - class T1A implements ActionListener { - private int count = 0; - @Override - public void actionPerformed(ActionEvent e) { - t3.setText("t1 Action Event " + count++); - } - } - class B1 implements ActionListener { - @Override - public void actionPerformed(ActionEvent e) { - if(t1.getSelectedText() == null) - s = t1.getText(); - else - s = t1.getSelectedText(); - t1.setEditable(true); - } - } - class B2 implements ActionListener { - @Override - public void actionPerformed(ActionEvent e) { - ucd.setUpperCase(false); - t1.setText("Inserted by Button 2: " + s); - ucd.setUpperCase(true); - t1.setEditable(false); - } - } - public static void main(String[] args) { - run(new TextFields(), 375, 200); - } -} - -class UpperCaseDocument extends PlainDocument { - private boolean upperCase = true; - public void setUpperCase(boolean flag) { - upperCase = flag; - } - @Override - public void insertString( - int offset, String str, AttributeSet attSet) - throws BadLocationException { - if(upperCase) str = str.toUpperCase(); - super.insertString(offset, str, attSet); - } -} diff --git a/ui/TextPane.java b/ui/TextPane.java deleted file mode 100644 index 046dd7ace..000000000 --- a/ui/TextPane.java +++ /dev/null @@ -1,28 +0,0 @@ -// ui/TextPane.java -// (c)2016 MindView LLC: see Copyright.txt -// We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. -// The JTextPane control is a little editor -import javax.swing.*; -import java.awt.*; -import java.util.function.*; -import onjava.*; -import static onjava.SwingConsole.*; - -public class TextPane extends JFrame { - private JButton b = new JButton("Add Text"); - private JTextPane tp = new JTextPane(); - private static Supplier sg = - new Rand.String(7); - public TextPane() { - b.addActionListener(e -> { - for(int i = 1; i < 10; i++) - tp.setText(tp.getText() + sg.get() + "\n"); - }); - add(new JScrollPane(tp)); - add(BorderLayout.SOUTH, b); - } - public static void main(String[] args) { - run(new TextPane(), 475, 425); - } -} diff --git a/ui/TicTacToe.java b/ui/TicTacToe.java deleted file mode 100644 index d7ada215f..000000000 --- a/ui/TicTacToe.java +++ /dev/null @@ -1,83 +0,0 @@ -// ui/TicTacToe.java -// (c)2016 MindView LLC: see Copyright.txt -// We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. -// Dialog boxes and creating your own components -import javax.swing.*; -import java.awt.*; -import java.awt.event.*; -import static onjava.SwingConsole.*; - -public class TicTacToe extends JFrame { - private JTextField - rows = new JTextField("3"), - cols = new JTextField("3"); - private enum State { BLANK, XX, OO } - static class ToeDialog extends JDialog { - private State turn = State.XX; // Start with x's turn - ToeDialog(int cellsWide, int cellsHigh) { - setTitle("The game itself"); - setLayout(new GridLayout(cellsWide, cellsHigh)); - for(int i = 0; i < cellsWide * cellsHigh; i++) - add(new ToeButton()); - setSize(cellsWide * 50, cellsHigh * 50); - setDefaultCloseOperation(DISPOSE_ON_CLOSE); - } - class ToeButton extends JPanel { - private State state = State.BLANK; - public ToeButton() { addMouseListener(new ML()); } - @Override - public void paintComponent(Graphics g) { - super.paintComponent(g); - int - x1 = 0, y1 = 0, - x2 = getSize().width - 1, - y2 = getSize().height - 1; - g.drawRect(x1, y1, x2, y2); - x1 = x2/4; - y1 = y2/4; - int wide = x2/2, high = y2/2; - if(state == State.XX) { - g.drawLine(x1, y1, x1 + wide, y1 + high); - g.drawLine(x1, y1 + high, x1 + wide, y1); - } - if(state == State.OO) - g.drawOval(x1, y1, x1 + wide/2, y1 + high/2); - } - class ML extends MouseAdapter { - @Override - public void mousePressed(MouseEvent e) { - if(state == State.BLANK) { - state = turn; - turn = - (turn == State.XX ? State.OO : State.XX); - } - else - state = - (state == State.XX ? State.OO : State.XX); - repaint(); - } - } - } - } - public TicTacToe() { - JPanel p = new JPanel(); - p.setLayout(new GridLayout(2,2)); - p.add(new JLabel("Rows", JLabel.CENTER)); - p.add(rows); - p.add(new JLabel("Columns", JLabel.CENTER)); - p.add(cols); - add(p, BorderLayout.NORTH); - JButton b = new JButton("go"); - b.addActionListener(e -> { - JDialog d = new ToeDialog( - new Integer(rows.getText()), - new Integer(cols.getText())); - d.setVisible(true); - }); - add(b, BorderLayout.SOUTH); - } - public static void main(String[] args) { - run(new TicTacToe(), 200, 200); - } -} diff --git a/ui/TrackEvent.java b/ui/TrackEvent.java deleted file mode 100644 index 1192955c0..000000000 --- a/ui/TrackEvent.java +++ /dev/null @@ -1,108 +0,0 @@ -// ui/TrackEvent.java -// (c)2016 MindView LLC: see Copyright.txt -// We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. -// Show events as they happen -import javax.swing.*; -import java.awt.*; -import java.awt.event.*; -import java.util.*; -import static onjava.SwingConsole.*; - -public class TrackEvent extends JFrame { - private HashMap h = - new HashMap<>(); - private String[] event = { - "focusGained", "focusLost", "keyPressed", - "keyReleased", "keyTyped", "mouseClicked", - "mouseEntered", "mouseExited", "mousePressed", - "mouseReleased", "mouseDragged", "mouseMoved" - }; - private MyButton - b1 = new MyButton(Color.BLUE, "test1"), - b2 = new MyButton(Color.RED, "test2"); - class MyButton extends JButton { - void report(String field, String msg) { - h.get(field).setText(msg); - } - FocusListener fl = new FocusListener() { - @Override - public void focusGained(FocusEvent e) { - report("focusGained", e.paramString()); - } - @Override - public void focusLost(FocusEvent e) { - report("focusLost", e.paramString()); - } - }; - KeyListener kl = new KeyListener() { - @Override - public void keyPressed(KeyEvent e) { - report("keyPressed", e.paramString()); - } - @Override - public void keyReleased(KeyEvent e) { - report("keyReleased", e.paramString()); - } - @Override - public void keyTyped(KeyEvent e) { - report("keyTyped", e.paramString()); - } - }; - MouseListener ml = new MouseListener() { - @Override - public void mouseClicked(MouseEvent e) { - report("mouseClicked", e.paramString()); - } - @Override - public void mouseEntered(MouseEvent e) { - report("mouseEntered", e.paramString()); - } - @Override - public void mouseExited(MouseEvent e) { - report("mouseExited", e.paramString()); - } - @Override - public void mousePressed(MouseEvent e) { - report("mousePressed", e.paramString()); - } - @Override - public void mouseReleased(MouseEvent e) { - report("mouseReleased", e.paramString()); - } - }; - MouseMotionListener mml = new MouseMotionListener() { - @Override - public void mouseDragged(MouseEvent e) { - report("mouseDragged", e.paramString()); - } - @Override - public void mouseMoved(MouseEvent e) { - report("mouseMoved", e.paramString()); - } - }; - public MyButton(Color color, String label) { - super(label); - setBackground(color); - addFocusListener(fl); - addKeyListener(kl); - addMouseListener(ml); - addMouseMotionListener(mml); - } - } - public TrackEvent() { - setLayout(new GridLayout(event.length + 1, 2)); - for(String evt : event) { - JTextField t = new JTextField(); - t.setEditable(false); - add(new JLabel(evt, JLabel.RIGHT)); - add(t); - h.put(evt, t); - } - add(b1); - add(b2); - } - public static void main(String[] args) { - run(new TrackEvent(), 700, 500); - } -} diff --git a/ui/build.xml b/ui/build.xml index f48dfdb29..b418d689a 100644 --- a/ui/build.xml +++ b/ui/build.xml @@ -7,89 +7,9 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - From 04f961cf81ad6230a2cf78eb4221faa72002d6b8 Mon Sep 17 00:00:00 2001 From: Bruce Eckel Date: Thu, 7 Jul 2016 12:43:10 -0600 Subject: [PATCH 003/320] Might work now with gradle --- annotations/AtUnitComposition.java | 7 +- annotations/AtUnitExample1.java | 7 +- annotations/AtUnitExample2.java | 7 +- annotations/AtUnitExample3.java | 7 +- annotations/AtUnitExample4.java | 8 +- annotations/AtUnitExample5.java | 7 +- annotations/AtUnitExternalTest.java | 7 +- annotations/HashSetTest.java | 7 +- annotations/StackLStringTest.java | 7 +- annotations/build.xml | 42 ------ annotations/database/TableCreator.java | 1 + annotations/ifx/Multiplier.java | 1 + annotations/simplest/SimpleTest.java | 1 + appveyor.yml | 4 - arrays/build.xml | 88 ------------- assertions/Assert1.java | 3 +- assertions/build.gradle | 3 + assertions/build.xml | 24 ---- build.gradle | 160 ++++++++++++++++------- collections/build.gradle | 3 + collections/build.xml | 92 ------------- collectionsindepth/ListPerformance.java | 3 +- collectionsindepth/MapPerformance.java | 3 +- collectionsindepth/SetPerformance.java | 3 +- collectionsindepth/build.gradle | 4 + collectionsindepth/build.xml | 90 ------------- com/build.xml | 16 --- compression/build.xml | 20 --- control/build.xml | 44 ------- debugging/build.xml | 18 --- enums/build.xml | 72 ---------- exceptions/build.xml | 80 ------------ files/build.xml | 42 ------ functional/build.xml | 68 ---------- generics/build.gradle | 3 + generics/build.xml | 146 --------------------- gradle/wrapper/gradle-wrapper.properties | 4 +- hiding/build.gradle | 3 + hiding/build.xml | 36 ----- housekeeping/build.xml | 82 ------------ innerclasses/build.xml | 70 ---------- interfaces/build.gradle | 3 + interfaces/build.xml | 56 -------- iostreams/build.xml | 32 ----- logging/build.xml | 42 ------ network/build.xml | 11 +- newio/build.xml | 40 ------ objects/build.xml | 20 --- onjava/build.xml | 30 ----- operators/build.xml | 58 -------- patterns/build.xml | 64 --------- polymorphism/build.xml | 44 ------- preferences/build.xml | 18 --- references/build.gradle | 3 + references/build.xml | 52 -------- remote/build.xml | 7 +- reuse/build.xml | 54 -------- run.bat | 3 - serialization/build.gradle | 9 ++ serialization/build.xml | 40 ------ settings.gradle | 12 ++ standardio/build.xml | 24 ---- staticchecking/build.xml | 24 ---- streams/build.xml | 104 --------------- strings/TestRegularExpression.java | 2 +- strings/build.gradle | 3 + strings/build.xml | 70 ---------- threads/CloseResource.java | 45 ------- threads/Interrupting.java | 98 -------------- threads/Interrupting2.java | 53 -------- threads/InterruptingIdiom.java | 84 ------------ threads/MultiLock.java | 44 ------- threads/NIOInterruption.java | 59 --------- threads/OrnamentalGarden.java | 110 ---------------- threads/build.gradle | 3 + threads/build.xml | 130 ------------------ typeinfo/build.xml | 78 ----------- ui/Face0.gif | Bin 261 -> 0 bytes ui/Face1.gif | Bin 289 -> 0 bytes ui/Face2.gif | Bin 310 -> 0 bytes ui/Face3.gif | Bin 235 -> 0 bytes ui/Face4.gif | Bin 259 -> 0 bytes ui/build.xml | 16 --- unittesting/build.gradle | 3 + unittesting/build.xml | 18 --- 85 files changed, 199 insertions(+), 2660 deletions(-) delete mode 100644 annotations/build.xml delete mode 100644 appveyor.yml delete mode 100644 arrays/build.xml create mode 100644 assertions/build.gradle delete mode 100644 assertions/build.xml create mode 100644 collections/build.gradle delete mode 100644 collections/build.xml create mode 100644 collectionsindepth/build.gradle delete mode 100644 collectionsindepth/build.xml delete mode 100644 com/build.xml delete mode 100644 compression/build.xml delete mode 100644 control/build.xml delete mode 100644 debugging/build.xml delete mode 100644 enums/build.xml delete mode 100644 exceptions/build.xml delete mode 100644 files/build.xml delete mode 100644 functional/build.xml create mode 100644 generics/build.gradle delete mode 100644 generics/build.xml create mode 100644 hiding/build.gradle delete mode 100644 hiding/build.xml delete mode 100644 housekeeping/build.xml delete mode 100644 innerclasses/build.xml create mode 100644 interfaces/build.gradle delete mode 100644 interfaces/build.xml delete mode 100644 iostreams/build.xml delete mode 100644 logging/build.xml delete mode 100644 newio/build.xml delete mode 100644 objects/build.xml delete mode 100644 onjava/build.xml delete mode 100644 operators/build.xml delete mode 100644 patterns/build.xml delete mode 100644 polymorphism/build.xml delete mode 100644 preferences/build.xml create mode 100644 references/build.gradle delete mode 100644 references/build.xml delete mode 100644 reuse/build.xml delete mode 100644 run.bat create mode 100644 serialization/build.gradle delete mode 100644 serialization/build.xml create mode 100644 settings.gradle delete mode 100644 standardio/build.xml delete mode 100644 staticchecking/build.xml delete mode 100644 streams/build.xml create mode 100644 strings/build.gradle delete mode 100644 strings/build.xml delete mode 100644 threads/CloseResource.java delete mode 100644 threads/Interrupting.java delete mode 100644 threads/Interrupting2.java delete mode 100644 threads/InterruptingIdiom.java delete mode 100644 threads/MultiLock.java delete mode 100644 threads/NIOInterruption.java delete mode 100644 threads/OrnamentalGarden.java create mode 100644 threads/build.gradle delete mode 100644 threads/build.xml delete mode 100644 typeinfo/build.xml delete mode 100644 ui/Face0.gif delete mode 100644 ui/Face1.gif delete mode 100644 ui/Face2.gif delete mode 100644 ui/Face3.gif delete mode 100644 ui/Face4.gif delete mode 100644 ui/build.xml create mode 100644 unittesting/build.gradle delete mode 100644 unittesting/build.xml diff --git a/annotations/AtUnitComposition.java b/annotations/AtUnitComposition.java index 714d9b789..f3ba4672d 100644 --- a/annotations/AtUnitComposition.java +++ b/annotations/AtUnitComposition.java @@ -3,6 +3,8 @@ // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. // Creating non-embedded tests +// {main: onjava.atunit.AtUnit} +// {Args: build/classes/main/annotations/AtUnitComposition.class} package annotations; import onjava.atunit.*; import onjava.*; @@ -16,11 +18,6 @@ public class AtUnitComposition { @Test boolean _methodTwo() { return testObject.methodTwo() == 2; } - public static void - main(String[] args) throws Exception { - OSExecute.command("java -cp .. " + - "onjava.atunit.AtUnit AtUnitComposition.class"); - } } /* Output: annotations.AtUnitComposition diff --git a/annotations/AtUnitExample1.java b/annotations/AtUnitExample1.java index 3987752b5..dd10076d9 100644 --- a/annotations/AtUnitExample1.java +++ b/annotations/AtUnitExample1.java @@ -2,6 +2,8 @@ // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// {main: onjava.atunit.AtUnit} +// {Args: build/classes/main/annotations/AtUnitExample1.class} package annotations; import onjava.atunit.*; import onjava.*; @@ -22,11 +24,6 @@ public int methodTwo() { // Shows output for failure: @Test boolean failureTest() { return false; } @Test boolean anotherDisappointment() { return false; } - public static void - main(String[] args) throws Exception { - OSExecute.command("java -cp .. " + - "onjava.atunit.AtUnit AtUnitExample1.class"); - } } /* Output: annotations.AtUnitExample1 diff --git a/annotations/AtUnitExample2.java b/annotations/AtUnitExample2.java index 467e61c12..3f4ea6d7e 100644 --- a/annotations/AtUnitExample2.java +++ b/annotations/AtUnitExample2.java @@ -3,6 +3,8 @@ // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. // Assertions and exceptions can be used in @Tests +// {main: onjava.atunit.AtUnit} +// {Args: build/classes/main/annotations/AtUnitExample2.class} package annotations; import java.io.*; import onjava.atunit.*; @@ -30,11 +32,6 @@ public int methodTwo() { assert methodTwo() == 2: "methodTwo must equal 2"; return methodOne().equals("This is methodOne"); } - public static void - main(String[] args) throws Exception { - OSExecute.command("java -cp .. " + - "onjava.atunit.AtUnit AtUnitExample2.class"); - } } /* Output: annotations.AtUnitExample2 diff --git a/annotations/AtUnitExample3.java b/annotations/AtUnitExample3.java index f81eeb53b..5a3714d51 100644 --- a/annotations/AtUnitExample3.java +++ b/annotations/AtUnitExample3.java @@ -2,6 +2,8 @@ // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// {main: onjava.atunit.AtUnit} +// {Args: build/classes/main/annotations/AtUnitExample3.class} package annotations; import onjava.atunit.*; import onjava.*; @@ -25,11 +27,6 @@ public int methodTwo() { return methodOne().equals("This is methodOne"); } @Test boolean m2() { return methodTwo() == 2; } - public static void - main(String[] args) throws Exception { - OSExecute.command("java -cp .. " + - "onjava.atunit.AtUnit AtUnitExample3.class"); - } } /* Output: annotations.AtUnitExample3 diff --git a/annotations/AtUnitExample4.java b/annotations/AtUnitExample4.java index 2c446ce04..27af8fafc 100644 --- a/annotations/AtUnitExample4.java +++ b/annotations/AtUnitExample4.java @@ -2,6 +2,8 @@ // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// {main: onjava.atunit.AtUnit} +// {Args: build/classes/main/annotations/AtUnitExample4.class} package annotations; import java.util.*; import onjava.atunit.*; @@ -53,12 +55,6 @@ public String scrambleWord() { System.out.println(scrambled); return scrambled.equals("tsaeborornussu"); } - public static void - main(String[] args) throws Exception { - System.out.println("starting"); - OSExecute.command("java -cp .. " + - "onjava.atunit.AtUnit AtUnitExample4.class"); - } } /* Output: starting diff --git a/annotations/AtUnitExample5.java b/annotations/AtUnitExample5.java index 88370d683..c12431456 100644 --- a/annotations/AtUnitExample5.java +++ b/annotations/AtUnitExample5.java @@ -2,6 +2,8 @@ // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// {main: onjava.atunit.AtUnit} +// {Args: build/classes/main/annotations/AtUnitExample5.class} package annotations; import java.io.*; import onjava.atunit.*; @@ -40,11 +42,6 @@ public class AtUnitExample5 { output.print("test3"); return true; } - public static void - main(String[] args) throws Exception { - OSExecute.command("java -cp .. " + - "onjava.atunit.AtUnit AtUnitExample5.class"); - } } /* Output: annotations.AtUnitExample5 diff --git a/annotations/AtUnitExternalTest.java b/annotations/AtUnitExternalTest.java index 2016e0db9..9d9d90f16 100644 --- a/annotations/AtUnitExternalTest.java +++ b/annotations/AtUnitExternalTest.java @@ -3,6 +3,8 @@ // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. // Creating non-embedded tests +// {main: onjava.atunit.AtUnit} +// {Args: build/classes/main/annotations/AtUnitExternalTest.class} package annotations; import onjava.atunit.*; import onjava.*; @@ -12,11 +14,6 @@ public class AtUnitExternalTest extends AtUnitExample1 { return methodOne().equals("This is methodOne"); } @Test boolean _methodTwo() { return methodTwo() == 2; } - public static void - main(String[] args) throws Exception { - OSExecute.command("java -cp .. " + - "onjava.atunit.AtUnit AtUnitExternalTest.class"); - } } /* Output: annotations.AtUnitExternalTest diff --git a/annotations/HashSetTest.java b/annotations/HashSetTest.java index 3d72063f1..2d3285e99 100644 --- a/annotations/HashSetTest.java +++ b/annotations/HashSetTest.java @@ -2,6 +2,8 @@ // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// {main: onjava.atunit.AtUnit} +// {Args: build/classes/main/annotations/HashSetTest.class} package annotations; import java.util.*; import onjava.atunit.*; @@ -21,11 +23,6 @@ public class HashSetTest { testObject.remove("one"); assert testObject.isEmpty(); } - public static void - main(String[] args) throws Exception { - OSExecute.command("java -cp .. " + - "onjava.atunit.AtUnit HashSetTest.class"); - } } /* Output: annotations.HashSetTest diff --git a/annotations/StackLStringTest.java b/annotations/StackLStringTest.java index 364038e6b..405aa4571 100644 --- a/annotations/StackLStringTest.java +++ b/annotations/StackLStringTest.java @@ -3,6 +3,8 @@ // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. // Applying @Unit to generics +// {main: onjava.atunit.AtUnit} +// {Args: build/classes/main/annotations/StackLStringTest.class} package annotations; import onjava.atunit.*; import onjava.*; @@ -26,11 +28,6 @@ public class StackLStringTest extends StackL { assert top().equals("B"); assert top().equals("B"); } - public static void - main(String[] args) throws Exception { - OSExecute.command("java -cp .. " + - "onjava.atunit.AtUnit StackLStringTest.class"); - } } /* Output: annotations.StackLStringTest diff --git a/annotations/build.xml b/annotations/build.xml deleted file mode 100644 index c530c3fab..000000000 --- a/annotations/build.xml +++ /dev/null @@ -1,42 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/annotations/database/TableCreator.java b/annotations/database/TableCreator.java index ebd70bdd1..96ac8cafc 100644 --- a/annotations/database/TableCreator.java +++ b/annotations/database/TableCreator.java @@ -3,6 +3,7 @@ // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. // Reflection-based annotation processor +// {main: annotations.database.TableCreator} // {Args: annotations.database.Member} package annotations.database; import java.lang.annotation.*; diff --git a/annotations/ifx/Multiplier.java b/annotations/ifx/Multiplier.java index d66270f27..34f73db17 100644 --- a/annotations/ifx/Multiplier.java +++ b/annotations/ifx/Multiplier.java @@ -3,6 +3,7 @@ // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. // javac-based annotation processing +// {main: annotations.ifx.Multiplier} package annotations.ifx; @ExtractInterface(interfaceName="IMultiplier") diff --git a/annotations/simplest/SimpleTest.java b/annotations/simplest/SimpleTest.java index 2e0caf5de..eaad49372 100644 --- a/annotations/simplest/SimpleTest.java +++ b/annotations/simplest/SimpleTest.java @@ -3,6 +3,7 @@ // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. // Test the "Simple" annotation +// {main: annotations.simplest.SimpleTest} package annotations.simplest; @Simple diff --git a/appveyor.yml b/appveyor.yml deleted file mode 100644 index 013d861cd..000000000 --- a/appveyor.yml +++ /dev/null @@ -1,4 +0,0 @@ -build_script: - - gradlew.bat runconsole --stacktrace - -test: off diff --git a/arrays/build.xml b/arrays/build.xml deleted file mode 100644 index 97d2372da..000000000 --- a/arrays/build.xml +++ /dev/null @@ -1,88 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/assertions/Assert1.java b/assertions/Assert1.java index 96ef9f4a6..303bd172b 100644 --- a/assertions/Assert1.java +++ b/assertions/Assert1.java @@ -3,7 +3,8 @@ // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. // Non-informative style of assert -// {JVMArgs: -ea} // Must run with -ea +// Must run with -ea: +// {JVMArgs: -ea} // {ThrowsException} public class Assert1 { diff --git a/assertions/build.gradle b/assertions/build.gradle new file mode 100644 index 000000000..7b6876d6e --- /dev/null +++ b/assertions/build.gradle @@ -0,0 +1,3 @@ +dependencies { + compile 'junit:junit:4.12' +} diff --git a/assertions/build.xml b/assertions/build.xml deleted file mode 100644 index e15e1e215..000000000 --- a/assertions/build.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/build.gradle b/build.gradle index 3c70412b1..7064d7d35 100644 --- a/build.gradle +++ b/build.gradle @@ -1,61 +1,127 @@ -repositories { - mavenLocal() - mavenCentral() - maven { - url 'http://maven-eclipse.github.io/maven' - } -} +subprojects { + apply plugin: 'java' -// these java plugin settings don't really need to be specified since ant does the actual build, but it makes things nicer in an IDE that understands gradle projects -apply plugin: 'java' + sourceCompatibility = '1.8' + targetCompatibility = '1.8' -sourceCompatibility = '1.8' -targetCompatibility = '1.8' + repositories { + mavenLocal() + mavenCentral() + } -sourceSets { - main { - java { - srcDirs 'annotations', 'arrays', 'assertions', 'com', 'compression', 'concurrency', 'containers', 'containersindepth', 'control', 'debugging', 'enums', 'exceptions', 'files', 'functional', 'generics', 'hiding', 'housekeeping', 'innerclasses', 'interfaces', 'iostreams', 'logging', 'network', 'newio', 'objects', 'onjava', 'operators', 'patterns', 'polymorphism', 'preferences', 'references', 'remote', 'reuse', 'serialization', 'standardio', 'staticchecking', 'streams', 'strings', 'swt', 'typeinfo', 'ui', 'unittesting' + sourceSets { + main { + java { + srcDir projectDir + } } } -} -// fix for a xom / xalan transitive dependency issue: http://stackoverflow.com/a/23870656/77409 -configurations.all { - resolutionStrategy { - force 'xml-apis:xml-apis:1.0.b2' - } -} + List tasks = [] + projectDir.eachFileRecurse { + if (it.name.endsWith('.java')) { -dependencies { - compile 'org.eclipse.swt:org.eclipse.swt.win32.win32.x86:4.4.2' - compile 'org.eclipse.swt:org.eclipse.swt.win32.win32.x86_64:4.4.2' - compile 'org.eclipse.swt:org.eclipse.swt.gtk.linux.x86:4.4.2' - compile 'org.eclipse.swt:org.eclipse.swt.gtk.linux.x86_64:4.4.2' - compile 'org.eclipse.swt:org.eclipse.swt.cocoa.macosx.x86_64:4.4.2' - compile 'junit:junit:4.12' - compile 'com.io7m.xom:xom:1.2.10' -} + List lines = it.readLines() -// this sets the classpath that ant uses to include the dependency jars -ant.properties['java.class.path'] = sourceSets.main.compileClasspath.getAsPath() + Boolean hasMainMethod = lines.join('').contains('main(String[] args)') + Boolean hasMainParam = lines.find { it.startsWith('// {main: ')} -// import the ant build and override a few task names -ant.importBuild('build.xml') { antTaskName -> - if (antTaskName == 'build') 'ant-build' // rename ant's build task to ant-build so it doesn't override the gradle task with that name - else if (antTaskName == 'clean') 'ant-clean' // rename ant's clean task to ant-clean so it doesn't override the gradle task with that name - else antTaskName -} + // add tasks for java sources with main methods + if (hasMainMethod || hasMainParam) { -// this task is already defined by gradle so we need to tell it to call the ant clean task -clean << { - tasks['ant-clean'].execute() -} + String maybeArgsLine = lines.find { it.startsWith('// {Args: ')} + + List maybeArgs = [] + if (maybeArgsLine != null) { + maybeArgs = maybeArgsLine.trim().replaceAll('\\/\\/ \\{Args: ', '').reverse().replaceFirst('}', '').reverse().split(' ') + } + + String mainClass = it.name.replaceAll('.java', '') + + String taskName = mainClass + tasks.add(taskName) + + // some java sources with a main method specify a different main class + String maybeMainLine = lines.find { it.startsWith('// {main: ')} + if (maybeMainLine != null) { + mainClass = maybeMainLine.trim().replaceAll('\\/\\/ \\{main: ', '').replaceAll('}', '') + } + + // some java sources with JVM args + List maybeJvmArgs = [] + String maybeJvmArgsLine = lines.find { it.startsWith('// {JVMArgs: ')} + if (maybeJvmArgsLine != null) { + maybeJvmArgs = maybeJvmArgsLine.trim().replaceAll('\\/\\/ \\{JVMArgs: ', '').replaceAll('}', '').split(' ') + } -// this task is already defined by gradle so we need to tell it to call the ant build task -build << { - tasks['ant-build'].execute() + // some java sources depend on others to be run first + String maybeRunFirst = null + String maybeRunFirstLine = lines.find { it.startsWith('// {RunFirst: ')} + if (maybeRunFirstLine != null) { + maybeRunFirst = maybeRunFirstLine.trim().replaceAll('\\/\\/ \\{RunFirst: ', '').replaceAll('}', '') + } + + task "$taskName"(type: JavaExec, dependsOn: maybeRunFirst) { + main = mainClass + classpath = sourceSets.main.runtimeClasspath + args = maybeArgs + jvmArgs = maybeJvmArgs + } + + Integer expectedOutputStartLine = lines.findIndexOf { it.startsWith('/* Output:') } + Integer expectedOutputEndLine = -1 + List expectedOutputLines = [] + + if (expectedOutputStartLine != -1) { + expectedOutputStartLine += 1 + expectedOutputEndLine = lines.findIndexOf(expectedOutputStartLine, { it.startsWith('*/') }) + if (expectedOutputEndLine == -1) { + expectedOutputEndLine = expectedOutputStartLine + } + expectedOutputLines = lines.subList(expectedOutputStartLine, expectedOutputEndLine) + } + + OutputStream testStandardOutput = new ByteArrayOutputStream() + OutputStream testErrorOutput = new ByteArrayOutputStream() + + task "test$taskName"(type: JavaExec, dependsOn: maybeRunFirst) { + main = mainClass + classpath = sourceSets.main.runtimeClasspath + args = maybeArgs + jvmArgs = maybeJvmArgs + standardOutput = testStandardOutput + errorOutput = testErrorOutput + doLast { + // test the output here + println("Expected") + println(expectedOutputLines) + println("STDOUT") + println(testStandardOutput.toString().readLines()) + println("STDERR") + println(testErrorOutput.toString().readLines()) + throw new Exception("Expected output did not match the actual output") + } + } + } + + // exclude java sources that will not compile + if (lines.find { it.startsWith('// {CompileTimeError') } != null) { + sourceSets.main.java.excludes.add(it.name) + } + } + } + + task run(dependsOn: tasks) + + List testTasks = tasks.collect { "test" + it } + task test(overwrite:true, dependsOn: testTasks) } -defaultTasks 'run' \ No newline at end of file +configure(subprojects - project(':onjava')) { + + dependencies { + compile project(':onjava') + } + +} diff --git a/collections/build.gradle b/collections/build.gradle new file mode 100644 index 000000000..6b3f49b58 --- /dev/null +++ b/collections/build.gradle @@ -0,0 +1,3 @@ +dependencies { + compile project(':typeinfo') +} diff --git a/collections/build.xml b/collections/build.xml deleted file mode 100644 index b1ed7e1a6..000000000 --- a/collections/build.xml +++ /dev/null @@ -1,92 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/collectionsindepth/ListPerformance.java b/collectionsindepth/ListPerformance.java index 51e37eef4..1b26773b1 100644 --- a/collectionsindepth/ListPerformance.java +++ b/collectionsindepth/ListPerformance.java @@ -3,7 +3,8 @@ // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. // Demonstrates performance differences in Lists -// {Args: 100 500} Small to keep build testing short +// Small to keep build testing short: +// {Args: 100 500} import java.util.*; import onjava.*; diff --git a/collectionsindepth/MapPerformance.java b/collectionsindepth/MapPerformance.java index 02aca5d79..77d86bcee 100644 --- a/collectionsindepth/MapPerformance.java +++ b/collectionsindepth/MapPerformance.java @@ -3,7 +3,8 @@ // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. // Demonstrates performance differences in Maps -// {Args: 100 5000} Small to keep build testing short +// Small to keep build testing short: +// {Args: 100 5000} import java.util.*; public class MapPerformance { diff --git a/collectionsindepth/SetPerformance.java b/collectionsindepth/SetPerformance.java index 368384e50..20bc0e77b 100644 --- a/collectionsindepth/SetPerformance.java +++ b/collectionsindepth/SetPerformance.java @@ -3,7 +3,8 @@ // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. // Demonstrates performance differences in Sets -// {Args: 100 5000} Small to keep build testing short +// Small to keep build testing short: +// {Args: 100 5000} import java.util.*; public class SetPerformance { diff --git a/collectionsindepth/build.gradle b/collectionsindepth/build.gradle new file mode 100644 index 000000000..3f51fbe83 --- /dev/null +++ b/collectionsindepth/build.gradle @@ -0,0 +1,4 @@ +dependencies { + compile project(':typeinfo') + compile project(':collections') +} diff --git a/collectionsindepth/build.xml b/collectionsindepth/build.xml deleted file mode 100644 index bff9ce4dc..000000000 --- a/collectionsindepth/build.xml +++ /dev/null @@ -1,90 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/com/build.xml b/com/build.xml deleted file mode 100644 index 1dc933bba..000000000 --- a/com/build.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/compression/build.xml b/compression/build.xml deleted file mode 100644 index 5659b0998..000000000 --- a/compression/build.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/control/build.xml b/control/build.xml deleted file mode 100644 index 5b0f6b3a3..000000000 --- a/control/build.xml +++ /dev/null @@ -1,44 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/debugging/build.xml b/debugging/build.xml deleted file mode 100644 index e253c677f..000000000 --- a/debugging/build.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/enums/build.xml b/enums/build.xml deleted file mode 100644 index e624bc0b3..000000000 --- a/enums/build.xml +++ /dev/null @@ -1,72 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/exceptions/build.xml b/exceptions/build.xml deleted file mode 100644 index 313fd7fa6..000000000 --- a/exceptions/build.xml +++ /dev/null @@ -1,80 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/files/build.xml b/files/build.xml deleted file mode 100644 index e7be87585..000000000 --- a/files/build.xml +++ /dev/null @@ -1,42 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/functional/build.xml b/functional/build.xml deleted file mode 100644 index 60759bd2c..000000000 --- a/functional/build.xml +++ /dev/null @@ -1,68 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/generics/build.gradle b/generics/build.gradle new file mode 100644 index 000000000..6b3f49b58 --- /dev/null +++ b/generics/build.gradle @@ -0,0 +1,3 @@ +dependencies { + compile project(':typeinfo') +} diff --git a/generics/build.xml b/generics/build.xml deleted file mode 100644 index 6b9ac5f9e..000000000 --- a/generics/build.xml +++ /dev/null @@ -1,146 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 24eebeb91..38944e46d 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ -#Tue Jul 05 13:43:33 MDT 2016 +#Wed Jul 06 11:17:56 MDT 2016 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-2.14-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-2.14-all.zip diff --git a/hiding/build.gradle b/hiding/build.gradle new file mode 100644 index 000000000..f1b2e23ad --- /dev/null +++ b/hiding/build.gradle @@ -0,0 +1,3 @@ +dependencies { + compile project(':com') +} diff --git a/hiding/build.xml b/hiding/build.xml deleted file mode 100644 index a1bf2c129..000000000 --- a/hiding/build.xml +++ /dev/null @@ -1,36 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/housekeeping/build.xml b/housekeeping/build.xml deleted file mode 100644 index 9584fc313..000000000 --- a/housekeeping/build.xml +++ /dev/null @@ -1,82 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/innerclasses/build.xml b/innerclasses/build.xml deleted file mode 100644 index ba4280c06..000000000 --- a/innerclasses/build.xml +++ /dev/null @@ -1,70 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/interfaces/build.gradle b/interfaces/build.gradle new file mode 100644 index 000000000..2730e045f --- /dev/null +++ b/interfaces/build.gradle @@ -0,0 +1,3 @@ +dependencies { + compile project(':polymorphism') +} diff --git a/interfaces/build.xml b/interfaces/build.xml deleted file mode 100644 index 4e978be1c..000000000 --- a/interfaces/build.xml +++ /dev/null @@ -1,56 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/iostreams/build.xml b/iostreams/build.xml deleted file mode 100644 index 3e3c247c1..000000000 --- a/iostreams/build.xml +++ /dev/null @@ -1,32 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/logging/build.xml b/logging/build.xml deleted file mode 100644 index da20fbfe2..000000000 --- a/logging/build.xml +++ /dev/null @@ -1,42 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/network/build.xml b/network/build.xml index 039355807..122ab6dc3 100644 --- a/network/build.xml +++ b/network/build.xml @@ -15,13 +15,4 @@ - - - - - - - - - - \ No newline at end of file + diff --git a/newio/build.xml b/newio/build.xml deleted file mode 100644 index e8c438939..000000000 --- a/newio/build.xml +++ /dev/null @@ -1,40 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/objects/build.xml b/objects/build.xml deleted file mode 100644 index a841bc9ae..000000000 --- a/objects/build.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/onjava/build.xml b/onjava/build.xml deleted file mode 100644 index 640a60478..000000000 --- a/onjava/build.xml +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/operators/build.xml b/operators/build.xml deleted file mode 100644 index f24e3023c..000000000 --- a/operators/build.xml +++ /dev/null @@ -1,58 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/patterns/build.xml b/patterns/build.xml deleted file mode 100644 index 1e957fc4a..000000000 --- a/patterns/build.xml +++ /dev/null @@ -1,64 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/polymorphism/build.xml b/polymorphism/build.xml deleted file mode 100644 index 5a425ef33..000000000 --- a/polymorphism/build.xml +++ /dev/null @@ -1,44 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/preferences/build.xml b/preferences/build.xml deleted file mode 100644 index 7e888156f..000000000 --- a/preferences/build.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/references/build.gradle b/references/build.gradle new file mode 100644 index 000000000..7b6876d6e --- /dev/null +++ b/references/build.gradle @@ -0,0 +1,3 @@ +dependencies { + compile 'junit:junit:4.12' +} diff --git a/references/build.xml b/references/build.xml deleted file mode 100644 index dde5d9ea6..000000000 --- a/references/build.xml +++ /dev/null @@ -1,52 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/remote/build.xml b/remote/build.xml index ab6f58470..9f712d385 100644 --- a/remote/build.xml +++ b/remote/build.xml @@ -10,9 +10,4 @@ - - - - - - \ No newline at end of file + diff --git a/reuse/build.xml b/reuse/build.xml deleted file mode 100644 index a915b93b2..000000000 --- a/reuse/build.xml +++ /dev/null @@ -1,54 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/run.bat b/run.bat deleted file mode 100644 index 83d7120c7..000000000 --- a/run.bat +++ /dev/null @@ -1,3 +0,0 @@ -python ..\tools\Validate.py -p -powershell .\runall.ps1 -python ..\tools\Validate.py -e diff --git a/serialization/build.gradle b/serialization/build.gradle new file mode 100644 index 000000000..042afca5c --- /dev/null +++ b/serialization/build.gradle @@ -0,0 +1,9 @@ +configurations.all { + resolutionStrategy { + force 'xml-apis:xml-apis:1.0.b2' + } +} + +dependencies { + compile 'com.io7m.xom:xom:1.2.10' +} diff --git a/serialization/build.xml b/serialization/build.xml deleted file mode 100644 index 64b5592dd..000000000 --- a/serialization/build.xml +++ /dev/null @@ -1,40 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/settings.gradle b/settings.gradle new file mode 100644 index 000000000..247e44520 --- /dev/null +++ b/settings.gradle @@ -0,0 +1,12 @@ +def isSubproject = { File file -> + file.isDirectory() && + !file.name.contains('.git') && + !file.name.contains('.gradle') && + !file.name.contains('.idea') && + !file.name.contains('build') && + !file.name.contains('gradle') +} + +String[] subprojects = rootDir.listFiles().findAll(isSubproject).collect { it.name } + +include subprojects diff --git a/standardio/build.xml b/standardio/build.xml deleted file mode 100644 index 5a06e4553..000000000 --- a/standardio/build.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/staticchecking/build.xml b/staticchecking/build.xml deleted file mode 100644 index 1d8f3350f..000000000 --- a/staticchecking/build.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/streams/build.xml b/streams/build.xml deleted file mode 100644 index 18ac9f02e..000000000 --- a/streams/build.xml +++ /dev/null @@ -1,104 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/strings/TestRegularExpression.java b/strings/TestRegularExpression.java index 3120424ab..c1b5e14eb 100644 --- a/strings/TestRegularExpression.java +++ b/strings/TestRegularExpression.java @@ -2,7 +2,7 @@ // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. -// Easily try out regular expressions +// Simple regular expression demonstration // {Args: abcabcabcdefabc "abc+" "(abc)+" "(abc){2,}" } import java.util.regex.*; diff --git a/strings/build.gradle b/strings/build.gradle new file mode 100644 index 000000000..40df7aba3 --- /dev/null +++ b/strings/build.gradle @@ -0,0 +1,3 @@ +dependencies { + compile project(':generics') +} diff --git a/strings/build.xml b/strings/build.xml deleted file mode 100644 index 4aec4d5bd..000000000 --- a/strings/build.xml +++ /dev/null @@ -1,70 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/threads/CloseResource.java b/threads/CloseResource.java deleted file mode 100644 index 3e5d6c565..000000000 --- a/threads/CloseResource.java +++ /dev/null @@ -1,45 +0,0 @@ -// threads/CloseResource.java -// (c)2016 MindView LLC: see Copyright.txt -// We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. -// Interrupting a blocked task by -// closing the underlying resource -// {TimeOutDuringTesting} -import java.net.*; -import java.util.concurrent.*; -import java.io.*; - -public class CloseResource { - public static void - main(String[] args) throws Exception { - ExecutorService es = Executors.newCachedThreadPool(); - ServerSocket server = new ServerSocket(8080); - try(InputStream socketInput = - new Socket("localhost", 8080) - .getInputStream()) { - es.execute(new IOBlocked(socketInput)); - es.execute(new IOBlocked(System.in)); - TimeUnit.MILLISECONDS.sleep(100); - System.out.println("Shutting down all threads"); - es.shutdownNow(); - TimeUnit.SECONDS.sleep(1); - System.out.println( - "Closing " + socketInput.getClass().getName()); - socketInput.close(); // Releases blocked thread - } - TimeUnit.SECONDS.sleep(1); - System.out.println( - "Closing " + System.in.getClass().getName()); - System.in.close(); // Releases blocked thread - } -} -/* Output: -Waiting for read(): -Waiting for read(): -Shutting down all threads -Closing java.net.SocketInputStream -Interrupted from blocked I/O -Exiting IOBlocked.run() -Closing java.io.BufferedInputStream -Exiting IOBlocked.run() -*/ diff --git a/threads/Interrupting.java b/threads/Interrupting.java deleted file mode 100644 index 29517c4cf..000000000 --- a/threads/Interrupting.java +++ /dev/null @@ -1,98 +0,0 @@ -// threads/Interrupting.java -// (c)2016 MindView LLC: see Copyright.txt -// We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. -// Interrupting a blocked thread -import java.util.concurrent.*; -import java.io.*; - -class SleepBlocked implements Runnable { - @Override - public void run() { - try { - TimeUnit.SECONDS.sleep(100); - } catch(InterruptedException e) { - System.out.println("InterruptedException"); - } - System.out.println("Exiting SleepBlocked.run()"); - } -} - -class IOBlocked implements Runnable { - private InputStream in; - public IOBlocked(InputStream is) { in = is; } - @Override - public void run() { - try { - System.out.println("Waiting for read():"); - in.read(); - } catch(IOException e) { - if(Thread.currentThread().isInterrupted()) { - System.out.println( - "Interrupted from blocked I/O"); - } else { - throw new RuntimeException(e); - } - } - System.out.println("Exiting IOBlocked.run()"); - } -} - -class SynchronizedBlocked implements Runnable { - public synchronized void f() { - while(true) // Never releases lock - Thread.yield(); - } - public SynchronizedBlocked() { - new Thread() { - @Override - public void run() { - f(); // Lock acquired by this thread - } - }.start(); - } - @Override - public void run() { - System.out.println("Trying to call f()"); - f(); - System.out.println( - "Exiting SynchronizedBlocked.run()"); - } -} - -public class Interrupting { - private static ExecutorService exec = - Executors.newCachedThreadPool(); - static void - test(Runnable r) throws InterruptedException { - Future f = exec.submit(r); - TimeUnit.MILLISECONDS.sleep(100); - System.out.println( - "Interrupting " + r.getClass().getName()); - f.cancel(true); // Interrupts if running - System.out.println( - "Interrupt sent to " + r.getClass().getName()); - } - public static void - main(String[] args) throws Exception { - test(new SleepBlocked()); - test(new IOBlocked(System.in)); - test(new SynchronizedBlocked()); - TimeUnit.SECONDS.sleep(3); - System.out.println("Aborting with System.exit(0)"); - System.exit(0); // ... since last 2 interrupts failed - } -} -/* Output: -Interrupting SleepBlocked -InterruptedException -Exiting SleepBlocked.run() -Interrupt sent to SleepBlocked -Waiting for read(): -Interrupting IOBlocked -Interrupt sent to IOBlocked -Trying to call f() -Interrupting SynchronizedBlocked -Interrupt sent to SynchronizedBlocked -Aborting with System.exit(0) -*/ diff --git a/threads/Interrupting2.java b/threads/Interrupting2.java deleted file mode 100644 index 3a459672a..000000000 --- a/threads/Interrupting2.java +++ /dev/null @@ -1,53 +0,0 @@ -// threads/Interrupting2.java -// (c)2016 MindView LLC: see Copyright.txt -// We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. -// Interrupting a task blocked with a ReentrantLock -import java.util.concurrent.*; -import java.util.concurrent.locks.*; - -class BlockedMutex { - private Lock lock = new ReentrantLock(); - public BlockedMutex() { - // Acquire it right away, to demonstrate interruption - // of a task blocked on a ReentrantLock: - lock.lock(); - } - public void f() { - try { - // This will never be available to a second task - lock.lockInterruptibly(); // Special call - System.out.println("lock acquired in f()"); - } catch(InterruptedException e) { - System.out.println( - "Interrupted from lock acquisition in f()"); - } - } -} - -class Blocked2 implements Runnable { - BlockedMutex blocked = new BlockedMutex(); - @Override - public void run() { - System.out.println("Waiting for f() in BlockedMutex"); - blocked.f(); - System.out.println("Broken out of blocked call"); - } -} - -public class Interrupting2 { - public static void - main(String[] args) throws Exception { - Thread t = new Thread(new Blocked2()); - t.start(); - TimeUnit.SECONDS.sleep(1); - System.out.println("Issuing t.interrupt()"); - t.interrupt(); - } -} -/* Output: -Waiting for f() in BlockedMutex -Issuing t.interrupt() -Interrupted from lock acquisition in f() -Broken out of blocked call -*/ diff --git a/threads/InterruptingIdiom.java b/threads/InterruptingIdiom.java deleted file mode 100644 index a78a18b38..000000000 --- a/threads/InterruptingIdiom.java +++ /dev/null @@ -1,84 +0,0 @@ -// threads/InterruptingIdiom.java -// (c)2016 MindView LLC: see Copyright.txt -// We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. -// General idiom for interrupting a task -// {Args: 1100} -import java.util.concurrent.*; - -class NeedsCleanup { - private final int id; - public NeedsCleanup(int ident) { - id = ident; - System.out.println("NeedsCleanup " + id); - } - public void cleanup() { - System.out.println("Cleaning up " + id); - } -} - -class Blocked3 implements Runnable { - private volatile double d = 0.0; - @Override - public void run() { - try { - while(!Thread.interrupted()) { - // point1 - NeedsCleanup n1 = new NeedsCleanup(1); - // Start try-finally immediately after definition - // of n1, to guarantee proper cleanup of n1: - try { - System.out.println("Sleeping"); - TimeUnit.SECONDS.sleep(1); - // point2 - NeedsCleanup n2 = new NeedsCleanup(2); - // Guarantee proper cleanup of n2: - try { - System.out.println("Calculating"); - // A time-consuming, non-blocking operation: - for(int i = 1; i < 2500000; i++) - d += (Math.PI + Math.E) / d; - System.out.println( - "Finished time-consuming operation"); - } finally { - n2.cleanup(); - } - } finally { - n1.cleanup(); - } - } - System.out.println("Exiting via while() test"); - } catch(InterruptedException e) { - System.out.println( - "Exiting via InterruptedException"); - } - } -} - -public class InterruptingIdiom { - public static void - main(String[] args) throws Exception { - if(args.length != 1) { - System.out.println( - "usage: java InterruptingIdiom delay-in-mS"); - System.exit(1); - } - Thread t = new Thread(new Blocked3()); - t.start(); - TimeUnit.MILLISECONDS.sleep(new Integer(args[0])); - t.interrupt(); - } -} -/* Output: -NeedsCleanup 1 -Sleeping -NeedsCleanup 2 -Calculating -Finished time-consuming operation -Cleaning up 2 -Cleaning up 1 -NeedsCleanup 1 -Sleeping -Cleaning up 1 -Exiting via InterruptedException -*/ diff --git a/threads/MultiLock.java b/threads/MultiLock.java deleted file mode 100644 index 69f8b0e18..000000000 --- a/threads/MultiLock.java +++ /dev/null @@ -1,44 +0,0 @@ -// threads/MultiLock.java -// (c)2016 MindView LLC: see Copyright.txt -// We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. -// One thread can reacquire the same lock - -public class MultiLock { - public synchronized void f1(int count) { - if(count-- > 0) { - System.out.println( - "f1() calling f2() with count " + count); - f2(count); - } - } - public synchronized void f2(int count) { - if(count-- > 0) { - System.out.println( - "f2() calling f1() with count " + count); - f1(count); - } - } - public static void - main(String[] args) throws Exception { - final MultiLock multiLock = new MultiLock(); - new Thread() { - @Override - public void run() { - multiLock.f1(10); - } - }.start(); - } -} -/* Output: -f1() calling f2() with count 9 -f2() calling f1() with count 8 -f1() calling f2() with count 7 -f2() calling f1() with count 6 -f1() calling f2() with count 5 -f2() calling f1() with count 4 -f1() calling f2() with count 3 -f2() calling f1() with count 2 -f1() calling f2() with count 1 -f2() calling f1() with count 0 -*/ diff --git a/threads/NIOInterruption.java b/threads/NIOInterruption.java deleted file mode 100644 index d3f9f1842..000000000 --- a/threads/NIOInterruption.java +++ /dev/null @@ -1,59 +0,0 @@ -// threads/NIOInterruption.java -// (c)2016 MindView LLC: see Copyright.txt -// We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. -// Interrupting a blocked NIO channel -import java.net.*; -import java.nio.*; -import java.nio.channels.*; -import java.util.concurrent.*; -import java.io.*; - -class NIOBlocked implements Runnable { - private final SocketChannel sc; - public NIOBlocked(SocketChannel sc) { this.sc = sc; } - @Override - public void run() { - try { - System.out.println("Waiting for read() in " + this); - sc.read(ByteBuffer.allocate(1)); - } catch(ClosedByInterruptException e) { - System.out.println("ClosedByInterruptException"); - } catch(AsynchronousCloseException e) { - System.out.println("AsynchronousCloseException"); - } catch(IOException e) { - throw new RuntimeException(e); - } - System.out.println( - "Exiting NIOBlocked.run() " + this); - } -} - -public class NIOInterruption { - public static void - main(String[] args) throws Exception { - ExecutorService es = Executors.newCachedThreadPool(); - InetSocketAddress isa = - new InetSocketAddress("localhost", 8080); - try(ServerSocket server = new ServerSocket(8080); - SocketChannel sc1 = SocketChannel.open(isa); - SocketChannel sc2 = SocketChannel.open(isa)) { - Future f = es.submit(new NIOBlocked(sc1)); - es.execute(new NIOBlocked(sc2)); - es.shutdown(); - TimeUnit.SECONDS.sleep(1); - // Produce an interrupt via cancel: - f.cancel(true); - TimeUnit.SECONDS.sleep(1); - // Release the block by closing the channel: - } - } -} -/* Output: -Waiting for read() in NIOBlocked@122af49 -Waiting for read() in NIOBlocked@1feeb4a -ClosedByInterruptException -Exiting NIOBlocked.run() NIOBlocked@122af49 -AsynchronousCloseException -Exiting NIOBlocked.run() NIOBlocked@1feeb4a -*/ diff --git a/threads/OrnamentalGarden.java b/threads/OrnamentalGarden.java deleted file mode 100644 index f711e2d91..000000000 --- a/threads/OrnamentalGarden.java +++ /dev/null @@ -1,110 +0,0 @@ -// threads/OrnamentalGarden.java -// (c)2016 MindView LLC: see Copyright.txt -// We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. -import java.util.concurrent.*; -import java.util.*; - -class Count { - private int count = 0; - private SplittableRandom rand = new SplittableRandom(47); - // Remove the synchronized keyword to see counting fail: - public synchronized int increment() { - int temp = count; - if(rand.nextBoolean()) // Yield half the time - Thread.yield(); - return (count = ++temp); - } - public synchronized int value() { return count; } -} - -class Entrance implements Runnable { - private static Count count = new Count(); - private static List entrances = - new ArrayList<>(); - private int number = 0; - // Doesn't need synchronization to read: - private final int id; - private static volatile boolean canceled = false; - // Atomic operation on a volatile field: - public static void cancel() { canceled = true; } - public Entrance(int id) { - this.id = id; - // Keep this task in a list. Also prevents - // garbage collection of dead tasks: - entrances.add(this); - } - @Override - public void run() { - while(!canceled) { - synchronized(this) { - ++number; - } - System.out.println( - this + " Total: " + count.increment()); - try { - TimeUnit.MILLISECONDS.sleep(100); - } catch(InterruptedException e) { - System.out.println("sleep interrupted"); - } - } - System.out.println("Stopping " + this); - } - public synchronized int getValue() { return number; } - @Override - public String toString() { - return "Entrance " + id + ": " + getValue(); - } - public static int getTotalCount() { - return count.value(); - } - public static int sumEntrances() { - int sum = 0; - for(Entrance entrance : entrances) - sum += entrance.getValue(); - return sum; - } -} - -public class OrnamentalGarden { - public static void - main(String[] args) throws Exception { - ExecutorService es = Executors.newCachedThreadPool(); - for(int i = 0; i < 5; i++) - es.execute(new Entrance(i)); - // Run for a while, then stop and collect the data: - TimeUnit.SECONDS.sleep(3); - Entrance.cancel(); - es.shutdown(); - if(!es.awaitTermination(250, TimeUnit.MILLISECONDS)) - System.out.println( - "Some tasks were not terminated!"); - System.out.println( - "Total: " + Entrance.getTotalCount()); - System.out.println( - "Sum of Entrances: " + Entrance.sumEntrances()); - } -} -/* Output: (First and last 10 Lines) -Entrance 0: 1 Total: 1 -Entrance 1: 1 Total: 2 -Entrance 4: 1 Total: 5 -Entrance 3: 1 Total: 3 -Entrance 2: 1 Total: 4 -Entrance 0: 2 Total: 6 -Entrance 1: 2 Total: 7 -Entrance 4: 2 Total: 8 -Entrance 2: 2 Total: 10 -Entrance 3: 2 Total: 9 -________...________...________...________...________ -Entrance 4: 30 Total: 147 -Entrance 2: 30 Total: 149 -Entrance 3: 30 Total: 150 -Stopping Entrance 0: 30 -Stopping Entrance 1: 30 -Stopping Entrance 4: 30 -Stopping Entrance 2: 30 -Stopping Entrance 3: 30 -Total: 150 -Sum of Entrances: 150 -*/ diff --git a/threads/build.gradle b/threads/build.gradle new file mode 100644 index 000000000..da12aa0a3 --- /dev/null +++ b/threads/build.gradle @@ -0,0 +1,3 @@ +dependencies { + compile project(':enums') +} diff --git a/threads/build.xml b/threads/build.xml deleted file mode 100644 index 8c053762c..000000000 --- a/threads/build.xml +++ /dev/null @@ -1,130 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/typeinfo/build.xml b/typeinfo/build.xml deleted file mode 100644 index 9d52770e2..000000000 --- a/typeinfo/build.xml +++ /dev/null @@ -1,78 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/ui/Face0.gif b/ui/Face0.gif deleted file mode 100644 index 9850c6d37fe7c6ce40eef9aeffd5fa532e47d5ee..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 261 zcmV+g0s8(&Nk%v~VLt#k0Du4h00030|Nkri0000#05|{u0_2R3smrYZoD49|yDGkV zqY8H37KV*ArsS!%9P7pm`pBf2IaXP!;3J|)AQK|SSftIALuLYbgQcLKnA5qc$&^?R z*JeOoj@IMze)(^_)^aG4o#j69;$pz`I(9tnsuj> zyv(@l>Kq3>*DNhny>$&nosG(E<^2r~D?UzcXYPgmrk>7z>Rtr@EN`8$9ldmq|EE9w L5k$|Jx&i<@JBoV! diff --git a/ui/Face1.gif b/ui/Face1.gif deleted file mode 100644 index 691fe54a21277cf69416ea33df003a0194739d45..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 289 zcmV++0p9*cNk%v~VMG8w0Du4h00030|Nkri0000)06zc#0{)DTsmsj(or6Hyt7_2r zXx@bx0%BYwrbdZgrK-NGJi@j`HT2CVx!((lcETdbh}0#QK&F%Ez3CuS=U(C22;_f zM+g}bvBMk*=5m7hNqprhN-Y_92pz@b9bQPTYmPLIPPuN}&if7@?>_HVPk$eikG!wn nKlBe^zz*u-6?}KFUBY#a77F_|u-6%feMm%$D27(R0RjL!*fEI& diff --git a/ui/Face2.gif b/ui/Face2.gif deleted file mode 100644 index 9b325c5117a36b1e8744a9b1c04a77fedc668b7d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 310 zcmV-60m=SHNk%v~VO9V#0Du4h00030|Nkri0001105Sjo0{)DTsR+FfO`9{?YbiJy zv$}xZ_&ArDZ5~RJEcSk_q|T=;m3Y4Eea-3dgh3(@_?sbzMrL!h3`9dKDQudUBC%Lb zClXU=y4F&SoBBe+pK%6U_O0Du@|a!Jq3icIUoB?__a`DqSV&bjI0qO)Ce3|x^^mQboAtxnk5wT8MqjVv$2Gys424xiaYl!tm^A)hv+r? zns*3E!Qj%@QmMS`WXhS=ie3Dx>-cSoY;#v`f@#TE&24>XzRu1ZKTl3?Uw@wus?YD* z{|^nIz-t5b!7G>qA;5zQ@ijE~kRQW{`zYRn+a diff --git a/ui/Face3.gif b/ui/Face3.gif deleted file mode 100644 index 2bbac492e0851c21a94ad0bc301a899084deb591..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 235 zcmV99>} zhwfcK_>CJ#qL7-Jk4q|W6u)-O-FQy#yyDZ%f*&9;Q#|s9#}SigdIp`!oD^EkOt##v z_Y3Y?#HSP2Jl=*_TFp4QqLi;C_v+$d-|5COJnO{Q(x(I?nD+x^SjBW0r!^&|hxRo2 zn0E+5XDNfz@S?(}R`=;c*5m1z^|#uJ>I#b&8>>2-VoQtbTC4lkyUP2kBaB7dWPFS~ lrM%3%6YLDFER9TUY)!n0%~(99>} zhwfcK_>CJ#qL7-hib=jJ9E*=hhhu*AHJGFEW(rOu7A$gxN24#oY#O7~)zfLceJnhe zvYM$zZCCBMB(0o_YqSTaYsq!(?VHSP@AT&+*RGakrZxmd)%C|T<^`ukWQKSLr6lN> z2IG}gCX_PyRbx}=Cg+m*b_j~5ScjK4*SBUmv&wlwQKFHGds|7T`&$Mq95-CtX^b40 zyo|-{% - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/unittesting/build.gradle b/unittesting/build.gradle new file mode 100644 index 000000000..7b6876d6e --- /dev/null +++ b/unittesting/build.gradle @@ -0,0 +1,3 @@ +dependencies { + compile 'junit:junit:4.12' +} diff --git a/unittesting/build.xml b/unittesting/build.xml deleted file mode 100644 index 7fd331247..000000000 --- a/unittesting/build.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - - - - - - - - - \ No newline at end of file From fedef37f7be87ee389fd0111ee90939c0e4d55be Mon Sep 17 00:00:00 2001 From: Bruce Eckel Date: Thu, 7 Jul 2016 13:24:35 -0600 Subject: [PATCH 004/320] Remaining Ant artifacts removed --- Ant-Clean.xml | 46 -------- Ant-Common.xml | 216 ---------------------------------- build.xml | 205 -------------------------------- collections/MapOfList.java | 1 + network/ChatterServer.bat | 3 - network/ChatterServer.sh | 3 - network/MultiSimpleServer.bat | 3 - network/MultiSimpleServer.sh | 3 - network/SimpleServer.bat | 2 - network/SimpleServer.sh | 3 - network/build.xml | 18 --- remote/build.xml | 13 -- remote/go.bat | 1 - remote/go.sh | 1 - remote/ptime.bat | 6 - remote/ptime.sh | 5 - remote/registry.bat | 4 - remote/registry.sh | 3 - remote/server.bat | 4 - remote/server.sh | 3 - 20 files changed, 1 insertion(+), 542 deletions(-) delete mode 100644 Ant-Clean.xml delete mode 100644 Ant-Common.xml delete mode 100644 build.xml delete mode 100644 network/ChatterServer.bat delete mode 100644 network/ChatterServer.sh delete mode 100644 network/MultiSimpleServer.bat delete mode 100644 network/MultiSimpleServer.sh delete mode 100644 network/SimpleServer.bat delete mode 100644 network/SimpleServer.sh delete mode 100644 network/build.xml delete mode 100644 remote/build.xml delete mode 100644 remote/go.bat delete mode 100644 remote/go.sh delete mode 100644 remote/ptime.bat delete mode 100644 remote/ptime.sh delete mode 100644 remote/registry.bat delete mode 100644 remote/registry.sh delete mode 100644 remote/server.bat delete mode 100644 remote/server.sh diff --git a/Ant-Clean.xml b/Ant-Clean.xml deleted file mode 100644 index b15cb6f14..000000000 --- a/Ant-Clean.xml +++ /dev/null @@ -1,46 +0,0 @@ - - - - For this file to be included in all build.xml files - at all directory levels, the single entries with the - "**/" syntax must be used everywhere. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Ant-Common.xml b/Ant-Common.xml deleted file mode 100644 index 43ef0b064..000000000 --- a/Ant-Common.xml +++ /dev/null @@ -1,216 +0,0 @@ - - - - - - - Ant build.xml for the source code for chapter ${chapter} - Bruce Eckel On Java - Code available at https://github.com/BruceEckel/OnJava-Examples - See installation instructions in README.md - See copyright notice in CopyRight.txt - - Ant available from http://ant.apache.org - - To see options, type: ant -p - - - - - - - - - - - - - - - - - [${chapter}] java @{cls} @{arguments} - [${chapter}] java @{cls} @{arguments} - - - - - [${chapter}] Finished: java @{cls} @{arguments} - @{msg} - -------------------------------- - - - - - - - - - - - - - - [${chapter}] java @{cls} @{arguments} - [${chapter}] java @{cls} @{arguments} - - - - [${chapter}] Finished: java @{cls} @{arguments} - @{msg} - -------------------------------- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/build.xml b/build.xml deleted file mode 100644 index a73a1d931..000000000 --- a/build.xml +++ /dev/null @@ -1,205 +0,0 @@ - - - - - - - Main build.xml for the source code for - Bruce Eckel On Java - Code available at https://github.com/BruceEckel/OnJava-Examples - See installation instructions in README.md - See copyright notice in CopyRight.txt - - Ant available from http://ant.apache.org - - To see options, type: ant -p - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/collections/MapOfList.java b/collections/MapOfList.java index c4ea6f0eb..c6dfd5cef 100644 --- a/collections/MapOfList.java +++ b/collections/MapOfList.java @@ -2,6 +2,7 @@ // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// {main: collections.MapOfList} package collections; import typeinfo.pets.*; import java.util.*; diff --git a/network/ChatterServer.bat b/network/ChatterServer.bat deleted file mode 100644 index ef7fe4860..000000000 --- a/network/ChatterServer.bat +++ /dev/null @@ -1,3 +0,0 @@ -start java ChatterServer -timeout /t 1 -java ChatterClient diff --git a/network/ChatterServer.sh b/network/ChatterServer.sh deleted file mode 100644 index 5c867beab..000000000 --- a/network/ChatterServer.sh +++ /dev/null @@ -1,3 +0,0 @@ -java -cp ..:. ChatterServer & -sleep 1 -java -cp ..:. ChatterClient diff --git a/network/MultiSimpleServer.bat b/network/MultiSimpleServer.bat deleted file mode 100644 index 4d20bd013..000000000 --- a/network/MultiSimpleServer.bat +++ /dev/null @@ -1,3 +0,0 @@ -start java MultiSimpleServer -timeout /t 1 -java MultiSimpleClient diff --git a/network/MultiSimpleServer.sh b/network/MultiSimpleServer.sh deleted file mode 100644 index deeb4b0ad..000000000 --- a/network/MultiSimpleServer.sh +++ /dev/null @@ -1,3 +0,0 @@ -java -cp ..:. MultiSimpleServer & -sleep 1 -java -cp ..:. MultiSimpleClient diff --git a/network/SimpleServer.bat b/network/SimpleServer.bat deleted file mode 100644 index 095c330a8..000000000 --- a/network/SimpleServer.bat +++ /dev/null @@ -1,2 +0,0 @@ -start java SimpleServer -java SimpleClient diff --git a/network/SimpleServer.sh b/network/SimpleServer.sh deleted file mode 100644 index 2c1335c71..000000000 --- a/network/SimpleServer.sh +++ /dev/null @@ -1,3 +0,0 @@ -java SimpleServer & -sleep 1 -java SimpleClient diff --git a/network/build.xml b/network/build.xml deleted file mode 100644 index 122ab6dc3..000000000 --- a/network/build.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - - - - - - - - - diff --git a/remote/build.xml b/remote/build.xml deleted file mode 100644 index 9f712d385..000000000 --- a/remote/build.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - - - diff --git a/remote/go.bat b/remote/go.bat deleted file mode 100644 index ac6f4c636..000000000 --- a/remote/go.bat +++ /dev/null @@ -1 +0,0 @@ -start "ptime.bat" ptime.bat diff --git a/remote/go.sh b/remote/go.sh deleted file mode 100644 index fdff7366a..000000000 --- a/remote/go.sh +++ /dev/null @@ -1 +0,0 @@ -sh ptime.sh diff --git a/remote/ptime.bat b/remote/ptime.bat deleted file mode 100644 index aee99dbfc..000000000 --- a/remote/ptime.bat +++ /dev/null @@ -1,6 +0,0 @@ -start /min "registry.bat" registry.bat 3 -start /min "server.bat" server.bat 3 -timeout /t 1 -java DisplayPerfectTime -timeout /t 3 -exit \ No newline at end of file diff --git a/remote/ptime.sh b/remote/ptime.sh deleted file mode 100644 index 937264fdc..000000000 --- a/remote/ptime.sh +++ /dev/null @@ -1,5 +0,0 @@ -sh registry.sh 3 & -sleep 1 -sh server.sh 3 & -sleep 1 -java DisplayPerfectTime diff --git a/remote/registry.bat b/remote/registry.bat deleted file mode 100644 index ddb22c41d..000000000 --- a/remote/registry.bat +++ /dev/null @@ -1,4 +0,0 @@ -start /min "rmiregistry" rmiregistry -timeout /t %1 -taskkill /im rmiregistry.exe -exit \ No newline at end of file diff --git a/remote/registry.sh b/remote/registry.sh deleted file mode 100644 index ec2ba67e1..000000000 --- a/remote/registry.sh +++ /dev/null @@ -1,3 +0,0 @@ -rmiregistry & -sleep $1 -killall rmiregistry diff --git a/remote/server.bat b/remote/server.bat deleted file mode 100644 index 119f5255f..000000000 --- a/remote/server.bat +++ /dev/null @@ -1,4 +0,0 @@ -start /min "PerfectTimeServer" java PerfectTimeServer -timeout /t %1 -taskkill /im java.exe -exit \ No newline at end of file diff --git a/remote/server.sh b/remote/server.sh deleted file mode 100644 index 1149bf92f..000000000 --- a/remote/server.sh +++ /dev/null @@ -1,3 +0,0 @@ -java PerfectTimeServer & -sleep $1 -pkill -f 'java PerfectTimeServer' \ No newline at end of file From 35240be2e877af4f29cd8b0dca14727a530cbe93 Mon Sep 17 00:00:00 2001 From: James Ward Date: Thu, 7 Jul 2016 14:15:50 -0600 Subject: [PATCH 005/320] more stuff --- build.gradle | 97 +++++++++++++++++++++++++++++++++------------------- 1 file changed, 62 insertions(+), 35 deletions(-) diff --git a/build.gradle b/build.gradle index 7064d7d35..e7f43801b 100644 --- a/build.gradle +++ b/build.gradle @@ -26,9 +26,11 @@ subprojects { Boolean hasMainMethod = lines.join('').contains('main(String[] args)') Boolean hasMainParam = lines.find { it.startsWith('// {main: ')} + Boolean willNotCompile = lines.find { it.startsWith('// {CompileTimeError') } + Boolean validateByHand = lines.find { it.startsWith('// {ValidateByHand}') } // add tasks for java sources with main methods - if (hasMainMethod || hasMainParam) { + if ((hasMainMethod || hasMainParam) && (!willNotCompile)) { String maybeArgsLine = lines.find { it.startsWith('// {Args: ')} @@ -62,51 +64,76 @@ subprojects { maybeRunFirst = maybeRunFirstLine.trim().replaceAll('\\/\\/ \\{RunFirst: ', '').replaceAll('}', '') } - task "$taskName"(type: JavaExec, dependsOn: maybeRunFirst) { - main = mainClass - classpath = sourceSets.main.runtimeClasspath - args = maybeArgs - jvmArgs = maybeJvmArgs + // some java apps intentionally throw an exception + Boolean maybeIgnoreExitValue = false + if (lines.find { it.startsWith('// {ThrowsException}') } != null) { + maybeIgnoreExitValue = true } - Integer expectedOutputStartLine = lines.findIndexOf { it.startsWith('/* Output:') } - Integer expectedOutputEndLine = -1 - List expectedOutputLines = [] + // some java apps need a timeout + Boolean timeOutDuringTesting = false + if (lines.find { it.startsWith('// {TimeOutDuringTesting}') } != null) { + timeOutDuringTesting = true + } + + if (timeOutDuringTesting) { + // todo: apps with timeOutDuringTesting need special handling + task "$taskName" << { + println "not implemented" + } - if (expectedOutputStartLine != -1) { - expectedOutputStartLine += 1 - expectedOutputEndLine = lines.findIndexOf(expectedOutputStartLine, { it.startsWith('*/') }) - if (expectedOutputEndLine == -1) { - expectedOutputEndLine = expectedOutputStartLine + task "test$taskName" << { + println "not implemented" } - expectedOutputLines = lines.subList(expectedOutputStartLine, expectedOutputEndLine) } + else { + task "$taskName"(type: JavaExec, dependsOn: maybeRunFirst) { + main = mainClass + classpath = sourceSets.main.runtimeClasspath + args = maybeArgs + jvmArgs = maybeJvmArgs + ignoreExitValue = maybeIgnoreExitValue + } + + Integer expectedOutputStartLine = lines.findIndexOf { it.startsWith('/* Output:') } + Integer expectedOutputEndLine = -1 + List expectedOutputLines = [] + + if (expectedOutputStartLine != -1) { + expectedOutputStartLine += 1 + expectedOutputEndLine = lines.findIndexOf(expectedOutputStartLine, { it.startsWith('*/') }) + if (expectedOutputEndLine == -1) { + expectedOutputEndLine = expectedOutputStartLine + } + expectedOutputLines = lines.subList(expectedOutputStartLine, expectedOutputEndLine) + } - OutputStream testStandardOutput = new ByteArrayOutputStream() - OutputStream testErrorOutput = new ByteArrayOutputStream() - - task "test$taskName"(type: JavaExec, dependsOn: maybeRunFirst) { - main = mainClass - classpath = sourceSets.main.runtimeClasspath - args = maybeArgs - jvmArgs = maybeJvmArgs - standardOutput = testStandardOutput - errorOutput = testErrorOutput - doLast { - // test the output here - println("Expected") - println(expectedOutputLines) - println("STDOUT") - println(testStandardOutput.toString().readLines()) - println("STDERR") - println(testErrorOutput.toString().readLines()) - throw new Exception("Expected output did not match the actual output") + OutputStream testStandardOutput = new ByteArrayOutputStream() + OutputStream testErrorOutput = new ByteArrayOutputStream() + + task "test$taskName"(type: JavaExec, dependsOn: maybeRunFirst) { + main = mainClass + classpath = sourceSets.main.runtimeClasspath + args = maybeArgs + jvmArgs = maybeJvmArgs + ignoreExitValue = maybeIgnoreExitValue + standardOutput = testStandardOutput + errorOutput = testErrorOutput + doLast { + // test the output here + def rstrip = { it.replaceAll('\\s$', '') } + List testStandardOutputLines = testStandardOutput.toString().readLines().collect(rstrip) + + assert expectedOutputLines.size() == testStandardOutputLines.size() + + expectedOutputLines.eachWithIndex { expectedLine, i -> assert expectedLine == testStandardOutputLines.get(i) } + } } } } // exclude java sources that will not compile - if (lines.find { it.startsWith('// {CompileTimeError') } != null) { + if (willNotCompile) { sourceSets.main.java.excludes.add(it.name) } } From 2478dc168bb22e70eb66df78f02de409ad42e428 Mon Sep 17 00:00:00 2001 From: Bruce Eckel Date: Thu, 7 Jul 2016 14:58:56 -0600 Subject: [PATCH 006/320] Adding {main: when necessary --- collectionsindepth/RandomBounds.java | 3 ++- enums/Burrito.java | 1 + enums/EnumMaps.java | 1 + enums/EnumSets.java | 1 + enums/Reflection.java | 2 +- enums/RoShamBo1.java | 1 + enums/RoShamBo2.java | 1 + enums/RoShamBo3.java | 1 + enums/RoShamBo4.java | 1 + enums/RoShamBo5.java | 1 + enums/RoShamBo6.java | 1 + enums/cartoons/EnumImplementation.java | 1 + enums/menu/Meal.java | 1 + enums/menu/Meal2.java | 1 + enums/menu/TypeOfFood.java | 1 + generics/coffee/CoffeeSupplier.java | 1 + generics/decorator/Decoration.java | 1 + innerclasses/Callbacks.java | 1 + innerclasses/MultiImplementation.java | 1 + innerclasses/mui/MultiInterfaces.java | 1 + interfaces/interfaceprocessor/FilterProcessor.java | 1 + interfaces/interfaceprocessor/StringProcessor.java | 1 + interfaces/music4/Music4.java | 1 + interfaces/music5/Music5.java | 1 + interfaces/nesting/NestingInterfaces.java | 1 + onjava/CollectionMethodDifferences.java | 1 + onjava/CountMap.java | 1 + onjava/CountingIntegerList.java | 1 + onjava/Countries.java | 1 + onjava/Hex.java | 4 +++- onjava/ProcessFiles.java | 1 + onjava/atunit/AtUnit.java | 1 + onjava/atunit/ClassNameFinder.java | 1 + patterns/absfactory/GameEnvironment.java | 1 + patterns/adapt/Adapter.java | 1 + patterns/chain/ChainOfResponsibility.java | 1 + patterns/doubledispatch/DoubleDispatch.java | 1 + patterns/dynatrash/DynaTrash.java | 1 + patterns/factory/ShapeFactory1.java | 1 + patterns/observer/ObservedFlower.java | 1 + patterns/recyclea/RecycleA.java | 1 + patterns/recycleb/RecycleB.java | 1 + patterns/recyclec/RecycleC.java | 1 + patterns/state/StateMachineDemo.java | 1 + patterns/strategy/StrategyPattern.java | 1 + patterns/strategy/StrategyPattern2.java | 1 + patterns/trash/ParseTrash.java | 1 + patterns/trashvisitor/TrashVisitor.java | 1 + patterns/visitor/BeeAndFlowers.java | 1 + patterns/visualobserver/BoxObserver.java | 4 +++- standardio/OSExecuteDemo.java | 8 ++------ threads/AtomicityTest.java | 2 +- threads/EvenSupplier.java | 2 +- 53 files changed, 59 insertions(+), 12 deletions(-) diff --git a/collectionsindepth/RandomBounds.java b/collectionsindepth/RandomBounds.java index 8efcd9d7f..83e316a65 100644 --- a/collectionsindepth/RandomBounds.java +++ b/collectionsindepth/RandomBounds.java @@ -3,8 +3,8 @@ // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. // Does Math.random() produce 0.0 and 1.0? -// {TimeOutDuringTesting} // {Args: lower} +import onjava.*; public class RandomBounds { static void usage() { @@ -15,6 +15,7 @@ static void usage() { } public static void main(String[] args) { if(args.length != 1) usage(); + new TimedAbort(3); switch(args[0]) { case "lower": while(Math.random() != 0.0) diff --git a/enums/Burrito.java b/enums/Burrito.java index 8d7852004..5bddb0317 100644 --- a/enums/Burrito.java +++ b/enums/Burrito.java @@ -2,6 +2,7 @@ // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// {main: enums.Burrito} package enums; import static enums.Spiciness.*; diff --git a/enums/EnumMaps.java b/enums/EnumMaps.java index 92cbbc045..abc8a2ecd 100644 --- a/enums/EnumMaps.java +++ b/enums/EnumMaps.java @@ -3,6 +3,7 @@ // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. // Basics of EnumMaps +// {main: enums.EnumMaps} package enums; import java.util.*; import static enums.AlarmPoints.*; diff --git a/enums/EnumSets.java b/enums/EnumSets.java index c25833580..f67636cd4 100644 --- a/enums/EnumSets.java +++ b/enums/EnumSets.java @@ -3,6 +3,7 @@ // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. // Operations on EnumSets +// {main: enums.EnumSets} package enums; import java.util.*; import static enums.AlarmPoints.*; diff --git a/enums/Reflection.java b/enums/Reflection.java index c1359eb0f..88601c963 100644 --- a/enums/Reflection.java +++ b/enums/Reflection.java @@ -34,7 +34,7 @@ public static void main(String[] args) { exploreMethods.removeAll(enumMethods); System.out.println(exploreMethods); // Decompile the code for the enum: - OSExecute.command("javap Explore"); + OSExecute.command("javap -cp build/classes/main Explore"); } } /* Output: diff --git a/enums/RoShamBo1.java b/enums/RoShamBo1.java index 50ae9a0bb..62899404b 100644 --- a/enums/RoShamBo1.java +++ b/enums/RoShamBo1.java @@ -3,6 +3,7 @@ // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. // Demonstration of multiple dispatching +// {main: enums.RoShamBo1} package enums; import java.util.*; import static enums.Outcome.*; diff --git a/enums/RoShamBo2.java b/enums/RoShamBo2.java index ce009b7c0..b5dfd9a96 100644 --- a/enums/RoShamBo2.java +++ b/enums/RoShamBo2.java @@ -3,6 +3,7 @@ // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. // Switching one enum on another +// {main: enums.RoShamBo2} package enums; import static enums.Outcome.*; diff --git a/enums/RoShamBo3.java b/enums/RoShamBo3.java index 734a5eed6..72782beac 100644 --- a/enums/RoShamBo3.java +++ b/enums/RoShamBo3.java @@ -3,6 +3,7 @@ // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. // Using constant-specific methods +// {main: enums.RoShamBo3} package enums; import static enums.Outcome.*; diff --git a/enums/RoShamBo4.java b/enums/RoShamBo4.java index cf679c339..473ea8e96 100644 --- a/enums/RoShamBo4.java +++ b/enums/RoShamBo4.java @@ -2,6 +2,7 @@ // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// {main: enums.RoShamBo4} package enums; public enum RoShamBo4 implements Competitor { diff --git a/enums/RoShamBo5.java b/enums/RoShamBo5.java index d705aca95..4d6e7b535 100644 --- a/enums/RoShamBo5.java +++ b/enums/RoShamBo5.java @@ -3,6 +3,7 @@ // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. // Multiple dispatching using an EnumMap of EnumMaps +// {main: enums.RoShamBo5} package enums; import java.util.*; import static enums.Outcome.*; diff --git a/enums/RoShamBo6.java b/enums/RoShamBo6.java index 54b08f8ee..90fba9e1c 100644 --- a/enums/RoShamBo6.java +++ b/enums/RoShamBo6.java @@ -3,6 +3,7 @@ // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. // Enums using "tables" instead of multiple dispatch +// {main: enums.RoShamBo6} package enums; import static enums.Outcome.*; diff --git a/enums/cartoons/EnumImplementation.java b/enums/cartoons/EnumImplementation.java index 013aa3608..71e1bbbaa 100644 --- a/enums/cartoons/EnumImplementation.java +++ b/enums/cartoons/EnumImplementation.java @@ -3,6 +3,7 @@ // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. // An enum can implement an interface +// {main: enums.cartoons.EnumImplementation} package enums.cartoons; import java.util.*; import java.util.function.*; diff --git a/enums/menu/Meal.java b/enums/menu/Meal.java index 172ba45ec..a7d6334ca 100644 --- a/enums/menu/Meal.java +++ b/enums/menu/Meal.java @@ -2,6 +2,7 @@ // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// {main: enums.menu.Meal} package enums.menu; public class Meal { diff --git a/enums/menu/Meal2.java b/enums/menu/Meal2.java index 10946f98e..b0a7dc401 100644 --- a/enums/menu/Meal2.java +++ b/enums/menu/Meal2.java @@ -2,6 +2,7 @@ // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// {main: enums.menu.Meal2} package enums.menu; import onjava.*; diff --git a/enums/menu/TypeOfFood.java b/enums/menu/TypeOfFood.java index f0abb7e5c..b4d06851f 100644 --- a/enums/menu/TypeOfFood.java +++ b/enums/menu/TypeOfFood.java @@ -2,6 +2,7 @@ // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// {main: enums.menu.TypeOfFood} package enums.menu; import static enums.menu.Food.*; diff --git a/generics/coffee/CoffeeSupplier.java b/generics/coffee/CoffeeSupplier.java index 464e6a4f2..512eb964b 100644 --- a/generics/coffee/CoffeeSupplier.java +++ b/generics/coffee/CoffeeSupplier.java @@ -2,6 +2,7 @@ // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// {main: generics.coffee.CoffeeSupplier} package generics.coffee; import java.util.*; import java.util.function.*; diff --git a/generics/decorator/Decoration.java b/generics/decorator/Decoration.java index f54d7f41c..fe608ff33 100644 --- a/generics/decorator/Decoration.java +++ b/generics/decorator/Decoration.java @@ -2,6 +2,7 @@ // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// {main: generics.decorator.Decoration} package generics.decorator; import java.util.*; diff --git a/innerclasses/Callbacks.java b/innerclasses/Callbacks.java index 94ff1cb00..323c8239b 100644 --- a/innerclasses/Callbacks.java +++ b/innerclasses/Callbacks.java @@ -3,6 +3,7 @@ // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. // Using inner classes for callbacks +// {main: innerclasses.Callbacks} package innerclasses; interface Incrementable { diff --git a/innerclasses/MultiImplementation.java b/innerclasses/MultiImplementation.java index d94017f46..e38250d6f 100644 --- a/innerclasses/MultiImplementation.java +++ b/innerclasses/MultiImplementation.java @@ -4,6 +4,7 @@ // Visit http://mindviewinc.com/Books/OnJava/ for more book information. // For concrete or abstract classes, inner classes // produce "multiple implementation inheritance" +// {main: innerclasses.MultiImplementation} package innerclasses; class D {} diff --git a/innerclasses/mui/MultiInterfaces.java b/innerclasses/mui/MultiInterfaces.java index d7e27f4d3..e36a78b78 100644 --- a/innerclasses/mui/MultiInterfaces.java +++ b/innerclasses/mui/MultiInterfaces.java @@ -3,6 +3,7 @@ // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. // Two ways that a class can implement multiple interfaces +// {main: innerclasses.mui.MultiInterfaces} package innerclasses.mui; interface A {} diff --git a/interfaces/interfaceprocessor/FilterProcessor.java b/interfaces/interfaceprocessor/FilterProcessor.java index f4eb8aaf0..221a9c1ae 100644 --- a/interfaces/interfaceprocessor/FilterProcessor.java +++ b/interfaces/interfaceprocessor/FilterProcessor.java @@ -2,6 +2,7 @@ // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// {main: interfaces.interfaceprocessor.FilterProcessor} package interfaces.interfaceprocessor; import interfaces.filters.*; diff --git a/interfaces/interfaceprocessor/StringProcessor.java b/interfaces/interfaceprocessor/StringProcessor.java index 4074aa032..a5593fa7f 100644 --- a/interfaces/interfaceprocessor/StringProcessor.java +++ b/interfaces/interfaceprocessor/StringProcessor.java @@ -2,6 +2,7 @@ // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// {main: interfaces.interfaceprocessor.StringProcessor} package interfaces.interfaceprocessor; import java.util.*; diff --git a/interfaces/music4/Music4.java b/interfaces/music4/Music4.java index 776d80e67..628aaa066 100644 --- a/interfaces/music4/Music4.java +++ b/interfaces/music4/Music4.java @@ -3,6 +3,7 @@ // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. // Abstract classes and methods +// {main: interfaces.music4.Music4} package interfaces.music4; import polymorphism.music.Note; diff --git a/interfaces/music5/Music5.java b/interfaces/music5/Music5.java index a2d490ca2..d3c0461e6 100644 --- a/interfaces/music5/Music5.java +++ b/interfaces/music5/Music5.java @@ -2,6 +2,7 @@ // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// {main: interfaces.music5.Music5} package interfaces.music5; import polymorphism.music.Note; diff --git a/interfaces/nesting/NestingInterfaces.java b/interfaces/nesting/NestingInterfaces.java index 555e6bf3f..0f6bafbfa 100644 --- a/interfaces/nesting/NestingInterfaces.java +++ b/interfaces/nesting/NestingInterfaces.java @@ -2,6 +2,7 @@ // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// {main: interfaces.nesting.NestingInterfaces} package interfaces.nesting; class A { diff --git a/onjava/CollectionMethodDifferences.java b/onjava/CollectionMethodDifferences.java index 7e82604eb..0bca0ba2c 100644 --- a/onjava/CollectionMethodDifferences.java +++ b/onjava/CollectionMethodDifferences.java @@ -2,6 +2,7 @@ // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// {main: onjava.CollectionMethodDifferences} package onjava; import java.lang.reflect.*; import java.util.*; diff --git a/onjava/CountMap.java b/onjava/CountMap.java index 21fc010a6..6d08bbd35 100644 --- a/onjava/CountMap.java +++ b/onjava/CountMap.java @@ -3,6 +3,7 @@ // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. // Unlimited-length Map containing sample data +// {main: onjava.CountMap} package onjava; import java.util.*; diff --git a/onjava/CountingIntegerList.java b/onjava/CountingIntegerList.java index b0a100844..f702c0967 100644 --- a/onjava/CountingIntegerList.java +++ b/onjava/CountingIntegerList.java @@ -3,6 +3,7 @@ // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. // List of any length, containing sample data +// {main: onjava.CountingIntegerList} package onjava; import java.util.*; diff --git a/onjava/Countries.java b/onjava/Countries.java index cd00edd1a..9a3587ade 100644 --- a/onjava/Countries.java +++ b/onjava/Countries.java @@ -3,6 +3,7 @@ // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. // "Flyweight" Maps and Lists of sample data +// {main: onjava.Countries} package onjava; import java.util.*; diff --git a/onjava/Hex.java b/onjava/Hex.java index a22eaf2b1..61bc55299 100644 --- a/onjava/Hex.java +++ b/onjava/Hex.java @@ -2,6 +2,7 @@ // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// {main: onjava.Hex} package onjava; import java.io.*; import java.nio.file.*; @@ -25,7 +26,8 @@ public static String format(byte[] data) { if(args.length == 0) // Test by displaying this class file: System.out.println(format( - Files.readAllBytes(Paths.get("Hex.class")))); + Files.readAllBytes(Paths.get( + "build/classes/main/onjava/Hex.class")))); else System.out.println(format( Files.readAllBytes(Paths.get(args[0])))); diff --git a/onjava/ProcessFiles.java b/onjava/ProcessFiles.java index 8dc5e8890..973a2581e 100644 --- a/onjava/ProcessFiles.java +++ b/onjava/ProcessFiles.java @@ -3,6 +3,7 @@ // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. // {ValidateByHand} +// {main: onjava.ProcessFiles} package onjava; import java.io.*; import java.nio.file.*; diff --git a/onjava/atunit/AtUnit.java b/onjava/atunit/AtUnit.java index 569132fb5..737ad0d2f 100644 --- a/onjava/atunit/AtUnit.java +++ b/onjava/atunit/AtUnit.java @@ -3,6 +3,7 @@ // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. // An annotation-based unit-test framework +// {main: onjava.atunit.AtUnit} package onjava.atunit; import java.lang.reflect.*; import java.io.*; diff --git a/onjava/atunit/ClassNameFinder.java b/onjava/atunit/ClassNameFinder.java index d4c0d7d57..20be9be59 100644 --- a/onjava/atunit/ClassNameFinder.java +++ b/onjava/atunit/ClassNameFinder.java @@ -2,6 +2,7 @@ // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// {main: onjava.atunit.ClassNameFinder} package onjava.atunit; import java.io.*; import java.nio.file.*; diff --git a/patterns/absfactory/GameEnvironment.java b/patterns/absfactory/GameEnvironment.java index f6fdf378d..7de3c5f77 100644 --- a/patterns/absfactory/GameEnvironment.java +++ b/patterns/absfactory/GameEnvironment.java @@ -3,6 +3,7 @@ // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. // An example of the Abstract Factory pattern +// {main: patterns.absfactory.GameEnvironment} package patterns.absfactory; import java.util.function.*; diff --git a/patterns/adapt/Adapter.java b/patterns/adapt/Adapter.java index 3ff1bc3c8..de2ed7e74 100644 --- a/patterns/adapt/Adapter.java +++ b/patterns/adapt/Adapter.java @@ -3,6 +3,7 @@ // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. // Variations on the Adapter pattern +// {main: patterns.adapt.Adapter} package patterns.adapt; class WhatIHave { diff --git a/patterns/chain/ChainOfResponsibility.java b/patterns/chain/ChainOfResponsibility.java index fe1b1666f..05663800a 100644 --- a/patterns/chain/ChainOfResponsibility.java +++ b/patterns/chain/ChainOfResponsibility.java @@ -3,6 +3,7 @@ // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. // Using the Functional interface +// {main: patterns.chain.ChainOfResponsibility} package patterns.chain; import java.util.*; import java.util.function.*; diff --git a/patterns/doubledispatch/DoubleDispatch.java b/patterns/doubledispatch/DoubleDispatch.java index dd88cf11d..fb062dfa2 100644 --- a/patterns/doubledispatch/DoubleDispatch.java +++ b/patterns/doubledispatch/DoubleDispatch.java @@ -4,6 +4,7 @@ // Visit http://mindviewinc.com/Books/OnJava/ for more book information. // Using multiple dispatching to handle more // than one unknown type during a method call +// {main: patterns.doubledispatch.DoubleDispatch} package patterns.doubledispatch; import patterns.trash.*; import java.util.*; diff --git a/patterns/dynatrash/DynaTrash.java b/patterns/dynatrash/DynaTrash.java index 5d3afbb59..2e0136fb2 100644 --- a/patterns/dynatrash/DynaTrash.java +++ b/patterns/dynatrash/DynaTrash.java @@ -5,6 +5,7 @@ // Using a Map of Lists and RTTI to automatically // sort trash into Lists. This solution, despite // the use of RTTI, is extensible. +// {main: patterns.dynatrash.DynaTrash} package patterns.dynatrash; import patterns.trash.*; import java.util.*; diff --git a/patterns/factory/ShapeFactory1.java b/patterns/factory/ShapeFactory1.java index 81e6844c3..33ac728d0 100644 --- a/patterns/factory/ShapeFactory1.java +++ b/patterns/factory/ShapeFactory1.java @@ -3,6 +3,7 @@ // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. // A simple static factory method +// {main: patterns.factory.ShapeFactory1} package patterns.factory; import java.util.*; import java.util.stream.*; diff --git a/patterns/observer/ObservedFlower.java b/patterns/observer/ObservedFlower.java index bc89ac39f..8d4662f5e 100644 --- a/patterns/observer/ObservedFlower.java +++ b/patterns/observer/ObservedFlower.java @@ -3,6 +3,7 @@ // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. // Demonstration of "Observer" pattern +// {main: patterns.observer.ObservedFlower} package patterns.observer; import java.util.*; diff --git a/patterns/recyclea/RecycleA.java b/patterns/recyclea/RecycleA.java index fb07cb412..c570c92c0 100644 --- a/patterns/recyclea/RecycleA.java +++ b/patterns/recyclea/RecycleA.java @@ -3,6 +3,7 @@ // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. // Recycling with RTTI +// {main: patterns.recyclea.RecycleA} package patterns.recyclea; import java.util.*; import java.util.function.*; diff --git a/patterns/recycleb/RecycleB.java b/patterns/recycleb/RecycleB.java index 072e10a56..ea41f1e79 100644 --- a/patterns/recycleb/RecycleB.java +++ b/patterns/recycleb/RecycleB.java @@ -2,6 +2,7 @@ // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// {main: patterns.recycleb.RecycleB} package patterns.recycleb; import patterns.trash.*; import java.util.*; diff --git a/patterns/recyclec/RecycleC.java b/patterns/recyclec/RecycleC.java index b3969fee3..2d44d8c38 100644 --- a/patterns/recyclec/RecycleC.java +++ b/patterns/recyclec/RecycleC.java @@ -3,6 +3,7 @@ // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. // Adding more objects to the recycling problem +// {main: patterns.recyclec.RecycleC} package patterns.recyclec; import patterns.trash.*; import java.util.*; diff --git a/patterns/state/StateMachineDemo.java b/patterns/state/StateMachineDemo.java index fc113368a..c9b205755 100644 --- a/patterns/state/StateMachineDemo.java +++ b/patterns/state/StateMachineDemo.java @@ -3,6 +3,7 @@ // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. // The StateMachine pattern and Template method +// {main: patterns.state.StateMachineDemo} package patterns.state; interface State { diff --git a/patterns/strategy/StrategyPattern.java b/patterns/strategy/StrategyPattern.java index 74264f624..9092376c6 100644 --- a/patterns/strategy/StrategyPattern.java +++ b/patterns/strategy/StrategyPattern.java @@ -2,6 +2,7 @@ // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// {main: patterns.strategy.StrategyPattern} package patterns.strategy; import java.util.function.*; import java.util.*; diff --git a/patterns/strategy/StrategyPattern2.java b/patterns/strategy/StrategyPattern2.java index fca09e50b..db87b8158 100644 --- a/patterns/strategy/StrategyPattern2.java +++ b/patterns/strategy/StrategyPattern2.java @@ -2,6 +2,7 @@ // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// {main: patterns.strategy.StrategyPattern2} package patterns.strategy; import java.util.function.*; import java.util.*; diff --git a/patterns/trash/ParseTrash.java b/patterns/trash/ParseTrash.java index 69cff8071..7acc2261d 100644 --- a/patterns/trash/ParseTrash.java +++ b/patterns/trash/ParseTrash.java @@ -4,6 +4,7 @@ // Visit http://mindviewinc.com/Books/OnJava/ for more book information. // Open a file and parse its contents into // Trash objects, placing each into a List +// {main: patterns.trash.ParseTrash} package patterns.trash; import java.util.*; import java.util.stream.*; diff --git a/patterns/trashvisitor/TrashVisitor.java b/patterns/trashvisitor/TrashVisitor.java index 5089fbf92..a64501a61 100644 --- a/patterns/trashvisitor/TrashVisitor.java +++ b/patterns/trashvisitor/TrashVisitor.java @@ -2,6 +2,7 @@ // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// {main: patterns.trashvisitor.TrashVisitor} package patterns.trashvisitor; import patterns.trash.*; import java.util.*; diff --git a/patterns/visitor/BeeAndFlowers.java b/patterns/visitor/BeeAndFlowers.java index a8a9acafd..c3782012a 100644 --- a/patterns/visitor/BeeAndFlowers.java +++ b/patterns/visitor/BeeAndFlowers.java @@ -3,6 +3,7 @@ // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. // Demonstration of "visitor" pattern +// {main: patterns.visitor.BeeAndFlowers} package patterns.visitor; import java.util.*; import java.util.function.*; diff --git a/patterns/visualobserver/BoxObserver.java b/patterns/visualobserver/BoxObserver.java index 4c2e32a99..e29ba9628 100644 --- a/patterns/visualobserver/BoxObserver.java +++ b/patterns/visualobserver/BoxObserver.java @@ -4,12 +4,13 @@ // Visit http://mindviewinc.com/Books/OnJava/ for more book information. // Demonstration of Observer pattern using // Java's built-in observer classes -// {TimeOut:4000} During testing +// {main: patterns.visualobserver.BoxObserver} package patterns.visualobserver; import javax.swing.*; import java.awt.*; import java.awt.event.*; import java.util.*; +import onjava.*; import onjava.MouseClick; // You must inherit a new type of Observable: @@ -33,6 +34,7 @@ public BoxObserver(int grid) { cp.add(new OCBox(x, y, notifier)); } public static void main(String[] args) { + new TimedAbort(4); int grid = 8; if(args.length > 0) grid = Integer.parseInt(args[0]); diff --git a/standardio/OSExecuteDemo.java b/standardio/OSExecuteDemo.java index 4801605e6..a9724f481 100644 --- a/standardio/OSExecuteDemo.java +++ b/standardio/OSExecuteDemo.java @@ -3,17 +3,13 @@ // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. // Demonstrates standard I/O redirection +// {Exec: javap -cp build/classes/main OSExecuteDemo} import onjava.*; -public class OSExecuteDemo { - public static void main(String[] args) { - OSExecute.command("javap OSExecuteDemo"); - } -} +public class OSExecuteDemo {} /* Output: Compiled from "OSExecuteDemo.java" public class OSExecuteDemo { public OSExecuteDemo(); - public static void main(java.lang.String[]); } */ diff --git a/threads/AtomicityTest.java b/threads/AtomicityTest.java index 49ece9a16..e748b3043 100644 --- a/threads/AtomicityTest.java +++ b/threads/AtomicityTest.java @@ -2,7 +2,7 @@ // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. -// {TimeOutDuringTesting} (on single-core machines) +// {TimeOutDuringTesting} import java.util.concurrent.*; public class AtomicityTest implements Runnable { diff --git a/threads/EvenSupplier.java b/threads/EvenSupplier.java index 438d62fb2..ebdb0ca67 100644 --- a/threads/EvenSupplier.java +++ b/threads/EvenSupplier.java @@ -3,7 +3,7 @@ // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. // When threads collide -// {TimeOutDuringTesting} (on single-core machines) +// {TimeOutDuringTesting} public class EvenSupplier extends IntSupplier { private int currentEvenValue = 0; From 85ff83410f82a78791495f17e979652f35be698e Mon Sep 17 00:00:00 2001 From: Bruce Eckel Date: Thu, 7 Jul 2016 15:12:55 -0600 Subject: [PATCH 007/320] Removed {TimeOutDuringTesting} --- polymorphism/Frog.java | 1 + standardio/Echo.java | 3 ++- threads/AtomicEvenSupplier.java | 3 ++- threads/AtomicityTest.java | 3 ++- threads/CaptureUncaughtException.java | 3 ++- threads/CriticalSection.java | 3 ++- threads/EvenSupplier.java | 3 ++- threads/MutexEvenSupplier.java | 3 ++- threads/SettingDefaultHandler.java | 3 ++- threads/SynchronizedEvenSupplier.java | 3 ++- 10 files changed, 19 insertions(+), 9 deletions(-) diff --git a/polymorphism/Frog.java b/polymorphism/Frog.java index e29d037ab..86ff42ce3 100644 --- a/polymorphism/Frog.java +++ b/polymorphism/Frog.java @@ -3,6 +3,7 @@ // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. // Cleanup and inheritance +// {main: polymorphism.Frog} package polymorphism; class Characteristic { diff --git a/standardio/Echo.java b/standardio/Echo.java index c59ac07cb..3fd9f2d71 100644 --- a/standardio/Echo.java +++ b/standardio/Echo.java @@ -3,12 +3,13 @@ // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. // How to read from standard input -// {TimeOutDuringTesting} import java.io.*; +import onjava.TimedAbort; public class Echo { public static void main(String[] args) throws IOException { + new TimedAbort(4); BufferedReader stdin = new BufferedReader( new InputStreamReader(System.in)); String s; diff --git a/threads/AtomicEvenSupplier.java b/threads/AtomicEvenSupplier.java index d278141c0..f1674d379 100644 --- a/threads/AtomicEvenSupplier.java +++ b/threads/AtomicEvenSupplier.java @@ -3,9 +3,9 @@ // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. // Atomic classes are occasionally useful in regular code -// {TimeOutDuringTesting} // {IgnoreOutput} // No output validation import java.util.concurrent.atomic.*; +import onjava.TimedAbort; public class AtomicEvenSupplier extends IntSupplier { private AtomicInteger currentEvenValue = @@ -15,6 +15,7 @@ public int next() { return currentEvenValue.addAndGet(2); } public static void main(String[] args) { + new TimedAbort(4); EvenChecker.test(new AtomicEvenSupplier()); } } diff --git a/threads/AtomicityTest.java b/threads/AtomicityTest.java index e748b3043..d7dab569f 100644 --- a/threads/AtomicityTest.java +++ b/threads/AtomicityTest.java @@ -2,8 +2,8 @@ // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. -// {TimeOutDuringTesting} import java.util.concurrent.*; +import onjava.TimedAbort; public class AtomicityTest implements Runnable { private int i = 0; @@ -15,6 +15,7 @@ public void run() { evenIncrement(); } public static void main(String[] args) { + new TimedAbort(4); ExecutorService es = Executors.newCachedThreadPool(); AtomicityTest at = new AtomicityTest(); es.execute(at); diff --git a/threads/CaptureUncaughtException.java b/threads/CaptureUncaughtException.java index 8e8e0211d..edc76cad4 100644 --- a/threads/CaptureUncaughtException.java +++ b/threads/CaptureUncaughtException.java @@ -2,8 +2,8 @@ // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. -// {TimeOutDuringTesting} import java.util.concurrent.*; +import onjava.TimedAbort; class ExceptionThread2 implements Runnable { @Override @@ -40,6 +40,7 @@ public Thread newThread(Runnable r) { public class CaptureUncaughtException { public static void main(String[] args) { + new TimedAbort(4); ExecutorService exec = Executors.newCachedThreadPool( new HandlerThreadFactory()); exec.execute(new ExceptionThread2()); diff --git a/threads/CriticalSection.java b/threads/CriticalSection.java index f2930eee0..67f99cd01 100644 --- a/threads/CriticalSection.java +++ b/threads/CriticalSection.java @@ -2,7 +2,6 @@ // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. -// {TimeOutDuringTesting} // (Behavior may have changed in Java 8) // Synchronizing blocks instead of entire methods. Also // demonstrates protection of a non-thread-safe class @@ -11,6 +10,7 @@ import java.util.concurrent.*; import java.util.concurrent.atomic.*; import java.util.*; +import onjava.TimedAbort; class Pair { // Not thread-safe private int x, y; @@ -139,6 +139,7 @@ public class CriticalSection { System.exit(0); } public static void main(String[] args) { + new TimedAbort(4); PairManager pman1 = new PairManager1(), pman2 = new PairManager2(); diff --git a/threads/EvenSupplier.java b/threads/EvenSupplier.java index ebdb0ca67..97f792baf 100644 --- a/threads/EvenSupplier.java +++ b/threads/EvenSupplier.java @@ -3,7 +3,7 @@ // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. // When threads collide -// {TimeOutDuringTesting} +import onjava.TimedAbort; public class EvenSupplier extends IntSupplier { private int currentEvenValue = 0; @@ -14,6 +14,7 @@ public int next() { return currentEvenValue; } public static void main(String[] args) { + new TimedAbort(4); EvenChecker.test(new EvenSupplier()); } } diff --git a/threads/MutexEvenSupplier.java b/threads/MutexEvenSupplier.java index efc97a22f..1b15ba8dc 100644 --- a/threads/MutexEvenSupplier.java +++ b/threads/MutexEvenSupplier.java @@ -3,9 +3,9 @@ // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. // Preventing thread collisions with mutexes -// {TimeOutDuringTesting} // {IgnoreOutput} // No output validation import java.util.concurrent.locks.*; +import onjava.TimedAbort; public class MutexEvenSupplier extends IntSupplier { private int currentEvenValue = 0; @@ -23,6 +23,7 @@ public int next() { } } public static void main(String[] args) { + new TimedAbort(4); EvenChecker.test(new MutexEvenSupplier()); } } diff --git a/threads/SettingDefaultHandler.java b/threads/SettingDefaultHandler.java index 1de9eb5ee..eb027d410 100644 --- a/threads/SettingDefaultHandler.java +++ b/threads/SettingDefaultHandler.java @@ -2,11 +2,12 @@ // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. -// {TimeOutDuringTesting} import java.util.concurrent.*; +import onjava.TimedAbort; public class SettingDefaultHandler { public static void main(String[] args) { + new TimedAbort(4); Thread.setDefaultUncaughtExceptionHandler( new MyUncaughtExceptionHandler()); ExecutorService es = Executors.newCachedThreadPool(); diff --git a/threads/SynchronizedEvenSupplier.java b/threads/SynchronizedEvenSupplier.java index 50c931259..e21698ef7 100644 --- a/threads/SynchronizedEvenSupplier.java +++ b/threads/SynchronizedEvenSupplier.java @@ -3,8 +3,8 @@ // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. // Simplifying mutexes with the synchronized keyword -// {TimeOutDuringTesting} // {IgnoreOutput} // No output validation +import onjava.TimedAbort; public class SynchronizedEvenSupplier extends IntSupplier { @@ -17,6 +17,7 @@ public synchronized int next() { return currentEvenValue; } public static void main(String[] args) { + new TimedAbort(4); EvenChecker.test(new SynchronizedEvenSupplier()); } } From dbfcd9397eff40127312a92e07280391ee15cc43 Mon Sep 17 00:00:00 2001 From: Bruce Eckel Date: Thu, 7 Jul 2016 15:20:35 -0600 Subject: [PATCH 008/320] Fixed {main: for gradle --- polymorphism/PrivateOverride.java | 1 + polymorphism/Sandwich.java | 1 + polymorphism/music/Music.java | 1 + polymorphism/music/Music2.java | 1 + polymorphism/music3/Music3.java | 1 + 5 files changed, 5 insertions(+) diff --git a/polymorphism/PrivateOverride.java b/polymorphism/PrivateOverride.java index 167b3fc13..1f5eef034 100644 --- a/polymorphism/PrivateOverride.java +++ b/polymorphism/PrivateOverride.java @@ -3,6 +3,7 @@ // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. // Trying to override a private method +// {main: polymorphism.PrivateOverride} package polymorphism; public class PrivateOverride { diff --git a/polymorphism/Sandwich.java b/polymorphism/Sandwich.java index 987fbafe0..7c507f471 100644 --- a/polymorphism/Sandwich.java +++ b/polymorphism/Sandwich.java @@ -3,6 +3,7 @@ // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. // Order of constructor calls +// {main: polymorphism.Sandwich} package polymorphism; class Meal { diff --git a/polymorphism/music/Music.java b/polymorphism/music/Music.java index fd6574ba3..d12b01c7f 100644 --- a/polymorphism/music/Music.java +++ b/polymorphism/music/Music.java @@ -3,6 +3,7 @@ // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. // Inheritance & upcasting +// {main: polymorphism.music.Music} package polymorphism.music; public class Music { diff --git a/polymorphism/music/Music2.java b/polymorphism/music/Music2.java index 2f7188883..a9fe50783 100644 --- a/polymorphism/music/Music2.java +++ b/polymorphism/music/Music2.java @@ -3,6 +3,7 @@ // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. // Overloading instead of upcasting +// {main: polymorphism.music.Music2} package polymorphism.music; class Stringed extends Instrument { diff --git a/polymorphism/music3/Music3.java b/polymorphism/music3/Music3.java index eb6e02906..1fe3903ca 100644 --- a/polymorphism/music3/Music3.java +++ b/polymorphism/music3/Music3.java @@ -3,6 +3,7 @@ // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. // An extensible program +// {main: polymorphism.music3.Music3} package polymorphism.music3; import polymorphism.music.Note; From 1ee35dc7273bc04347208c39eaded158704b22e2 Mon Sep 17 00:00:00 2001 From: James Ward Date: Thu, 7 Jul 2016 15:41:26 -0600 Subject: [PATCH 009/320] do not auto-run apps that need manual validation --- build.gradle | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/build.gradle b/build.gradle index e7f43801b..fcc111aab 100644 --- a/build.gradle +++ b/build.gradle @@ -28,6 +28,7 @@ subprojects { Boolean hasMainParam = lines.find { it.startsWith('// {main: ')} Boolean willNotCompile = lines.find { it.startsWith('// {CompileTimeError') } Boolean validateByHand = lines.find { it.startsWith('// {ValidateByHand}') } + Boolean throwsException = lines.find { it.startsWith('// {ThrowsException}') } // add tasks for java sources with main methods if ((hasMainMethod || hasMainParam) && (!willNotCompile)) { @@ -42,7 +43,11 @@ subprojects { String mainClass = it.name.replaceAll('.java', '') String taskName = mainClass - tasks.add(taskName) + + if (!validateByHand) { + // only add tasks that we know we can run successfully to the task list + tasks.add(taskName) + } // some java sources with a main method specify a different main class String maybeMainLine = lines.find { it.startsWith('// {main: ')} @@ -65,10 +70,7 @@ subprojects { } // some java apps intentionally throw an exception - Boolean maybeIgnoreExitValue = false - if (lines.find { it.startsWith('// {ThrowsException}') } != null) { - maybeIgnoreExitValue = true - } + Boolean maybeIgnoreExitValue = (validateByHand || throwsException) // some java apps need a timeout Boolean timeOutDuringTesting = false @@ -76,6 +78,7 @@ subprojects { timeOutDuringTesting = true } + // create run and test tasks if (timeOutDuringTesting) { // todo: apps with timeOutDuringTesting need special handling task "$taskName" << { From e05401eecc0f760c4aa471a4de2c417e2d3b5145 Mon Sep 17 00:00:00 2001 From: James Ward Date: Thu, 7 Jul 2016 15:42:23 -0600 Subject: [PATCH 010/320] more ignores --- .gitignore | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/.gitignore b/.gitignore index abe3365fc..09b28c118 100644 --- a/.gitignore +++ b/.gitignore @@ -77,3 +77,26 @@ io/X.file /serialization/Blip3.serialized /serialization/Blips.serialized + +build/ + +/compression/test.gz +/compression/test.zip +/iostreams/BasicFileOutput.dat +/iostreams/Data.txt +/iostreams/FileOutputShortcut.dat +/iostreams/rtest.dat +/logging/LogToFile.xml +/logging/LogToFile2.txt +/logging/MultipleHandlers.xml +/logging/MultipleHandlers2.xml +/logging/java0.log +/logging/java1.log +/logging/java2.log +/newio/TransferTo.txt +/newio/data2.txt +/newio/file.txt +/newio/test.dat +/newio/test.txt +/serialization/CADState.dat +/serialization/worm.dat From df864d009d540a4d06cc93bbd72a6ac4cc4e953b Mon Sep 17 00:00:00 2001 From: Bruce Eckel Date: Thu, 7 Jul 2016 15:57:38 -0600 Subject: [PATCH 011/320] more gradle path fixes --- arrays/ParallelSetAll.java | 2 +- patterns/trash/ParseTrash.java | 2 +- reuse/CADSystem.java | 1 + 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/arrays/ParallelSetAll.java b/arrays/ParallelSetAll.java index c17a0225f..a72850329 100644 --- a/arrays/ParallelSetAll.java +++ b/arrays/ParallelSetAll.java @@ -6,7 +6,7 @@ import onjava.*; public class ParallelSetAll { - static final int SIZE = 20_000_000; + static final int SIZE = 10_000_000; static void intArray() { int[] ia = new int[SIZE]; Arrays.setAll(ia, new Rand.int_()::get); diff --git a/patterns/trash/ParseTrash.java b/patterns/trash/ParseTrash.java index 7acc2261d..b55f704da 100644 --- a/patterns/trash/ParseTrash.java +++ b/patterns/trash/ParseTrash.java @@ -16,7 +16,7 @@ public class ParseTrash { public static void fillBin(String pckg, Fillable bin) { try { - Files.lines(Paths.get("..", "trash", "Trash.dat")) + Files.lines(Paths.get("trash", "Trash.dat")) // Remove empty lines and comment lines: .filter(line -> line.trim().length() != 0) .filter(line -> !line.startsWith("//")) diff --git a/reuse/CADSystem.java b/reuse/CADSystem.java index 2cd10f742..05085f91a 100644 --- a/reuse/CADSystem.java +++ b/reuse/CADSystem.java @@ -3,6 +3,7 @@ // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. // Ensuring proper cleanup +// {main: reuse.CADSystem} package reuse; class Shape { From 9659aa6adfc781fd0b0c489de33bf477f855dcb8 Mon Sep 17 00:00:00 2001 From: Bruce Eckel Date: Thu, 7 Jul 2016 16:23:19 -0600 Subject: [PATCH 012/320] latest {main: fixes --- serialization/xfiles/ThawAlien.java | 4 +++- staticchecking/dr/DogsAndRobots.java | 1 + staticchecking/drc/DogAndRobotCollections.java | 1 + staticchecking/latent/Latent.java | 1 + staticchecking/petspeak/PetSpeak.java | 1 + typeinfo/FamilyVsExactType.java | 1 + typeinfo/pets/LiteralPetCreator.java | 1 + typeinfo/toys/GenericToyTest.java | 1 + typeinfo/toys/ToyTest.java | 1 + 9 files changed, 11 insertions(+), 1 deletion(-) diff --git a/serialization/xfiles/ThawAlien.java b/serialization/xfiles/ThawAlien.java index 0032abde5..75baba0b1 100644 --- a/serialization/xfiles/ThawAlien.java +++ b/serialization/xfiles/ThawAlien.java @@ -3,6 +3,8 @@ // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. // Recover a serialized file +// {main: serialization.xfiles.ThawAlien} +// {RunFirst: FreezeAlien} package serialization.xfiles; import java.io.*; @@ -10,7 +12,7 @@ public class ThawAlien { public static void main(String[] args) throws Exception { ObjectInputStream in = new ObjectInputStream( - new FileInputStream(new File("..", "X.file"))); + new FileInputStream(new File("X.file"))); Object mystery = in.readObject(); System.out.println(mystery.getClass()); } diff --git a/staticchecking/dr/DogsAndRobots.java b/staticchecking/dr/DogsAndRobots.java index d44f74b90..67f68e82f 100644 --- a/staticchecking/dr/DogsAndRobots.java +++ b/staticchecking/dr/DogsAndRobots.java @@ -2,6 +2,7 @@ // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// {main: staticchecking.dr.DogsAndRobots} package staticchecking.dr; interface Speaks { void talk(); } diff --git a/staticchecking/drc/DogAndRobotCollections.java b/staticchecking/drc/DogAndRobotCollections.java index 382a74ad9..06c62a782 100644 --- a/staticchecking/drc/DogAndRobotCollections.java +++ b/staticchecking/drc/DogAndRobotCollections.java @@ -2,6 +2,7 @@ // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// {main: staticchecking.drc.DogAndRobotCollections} package staticchecking.drc; import java.util.*; diff --git a/staticchecking/latent/Latent.java b/staticchecking/latent/Latent.java index e49f5af7e..bd9e8606c 100644 --- a/staticchecking/latent/Latent.java +++ b/staticchecking/latent/Latent.java @@ -2,6 +2,7 @@ // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// {main: staticchecking.latent.Latent} package staticchecking.latent; import java.lang.reflect.*; diff --git a/staticchecking/petspeak/PetSpeak.java b/staticchecking/petspeak/PetSpeak.java index 3a3d79c65..b2847bb4a 100644 --- a/staticchecking/petspeak/PetSpeak.java +++ b/staticchecking/petspeak/PetSpeak.java @@ -3,6 +3,7 @@ // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. // Speaking pets in Java +// {main: staticchecking.petspeak.PetSpeak} package staticchecking.petspeak; interface Pet { diff --git a/typeinfo/FamilyVsExactType.java b/typeinfo/FamilyVsExactType.java index b73b6253b..33f3a8626 100644 --- a/typeinfo/FamilyVsExactType.java +++ b/typeinfo/FamilyVsExactType.java @@ -3,6 +3,7 @@ // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. // The difference between instanceof and class +// {main: typeinfo.FamilyVsExactType} package typeinfo; class Base {} diff --git a/typeinfo/pets/LiteralPetCreator.java b/typeinfo/pets/LiteralPetCreator.java index ffdafe74f..7c75e49e3 100644 --- a/typeinfo/pets/LiteralPetCreator.java +++ b/typeinfo/pets/LiteralPetCreator.java @@ -3,6 +3,7 @@ // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. // Using class literals +// {main: typeinfo.pets.LiteralPetCreator} package typeinfo.pets; import java.util.*; diff --git a/typeinfo/toys/GenericToyTest.java b/typeinfo/toys/GenericToyTest.java index 73492fa55..009bf7ce0 100644 --- a/typeinfo/toys/GenericToyTest.java +++ b/typeinfo/toys/GenericToyTest.java @@ -3,6 +3,7 @@ // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. // Testing class Class +// {main: typeinfo.toys.GenericToyTest} package typeinfo.toys; public class GenericToyTest { diff --git a/typeinfo/toys/ToyTest.java b/typeinfo/toys/ToyTest.java index 247577eaa..b3e3f0e33 100644 --- a/typeinfo/toys/ToyTest.java +++ b/typeinfo/toys/ToyTest.java @@ -3,6 +3,7 @@ // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. // Testing class Class +// {main: typeinfo.toys.ToyTest} package typeinfo.toys; interface HasBatteries {} From 60178b5d47ee25f69687aff5700af6435972cd44 Mon Sep 17 00:00:00 2001 From: James Ward Date: Thu, 7 Jul 2016 16:45:20 -0600 Subject: [PATCH 013/320] jython for textwrap --- build.gradle | 29 ++++++++++++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index fcc111aab..30c1cda01 100644 --- a/build.gradle +++ b/build.gradle @@ -1,3 +1,16 @@ +import org.python.util.PythonInterpreter +import org.python.core.* + +buildscript { + repositories { + mavenLocal() + mavenCentral() + } + dependencies { + classpath group: 'org.python', name: 'jython-standalone', version: '2.7.1b2' + } +} + subprojects { apply plugin: 'java' @@ -125,7 +138,21 @@ subprojects { doLast { // test the output here def rstrip = { it.replaceAll('\\s$', '') } - List testStandardOutputLines = testStandardOutput.toString().readLines().collect(rstrip) + + def textwrap = { String text -> + if (text.length() > 0) { + PythonInterpreter interpreter = new PythonInterpreter() + interpreter.exec("from textwrap import fill") + PyFunction textwrapFill = (PyFunction) interpreter.get("fill") + PyObject result = textwrapFill.__call__(new PyString(text), new PyInteger(59)) + return ((String) result.__tojava__(String.class)).readLines() + } + else { + return [""] + } + } + + List testStandardOutputLines = testStandardOutput.toString().readLines().collect(rstrip).collectMany(textwrap) assert expectedOutputLines.size() == testStandardOutputLines.size() From 6864a5ab361a952714bf7c5a9b7362ebfe34cb9b Mon Sep 17 00:00:00 2001 From: Bruce Eckel Date: Thu, 7 Jul 2016 17:22:39 -0600 Subject: [PATCH 014/320] {main: fixes --- threads/CriticalSection.java | 1 + threads/FastSimulation.java | 7 +++++-- threads/restaurant2/RestaurantWithQueues.java | 1 + 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/threads/CriticalSection.java b/threads/CriticalSection.java index 67f99cd01..922a9e033 100644 --- a/threads/CriticalSection.java +++ b/threads/CriticalSection.java @@ -6,6 +6,7 @@ // Synchronizing blocks instead of entire methods. Also // demonstrates protection of a non-thread-safe class // with a thread-safe one. +// {main: threads.CriticalSection} package threads; import java.util.concurrent.*; import java.util.concurrent.atomic.*; diff --git a/threads/FastSimulation.java b/threads/FastSimulation.java index 1eec612f0..f0af5dbe4 100644 --- a/threads/FastSimulation.java +++ b/threads/FastSimulation.java @@ -13,10 +13,12 @@ public class FastSimulation { static final AtomicInteger[][] GRID = new AtomicInteger[N_ELEMENTS][N_GENES]; static SplittableRandom rand = new SplittableRandom(47); + private static volatile boolean running = true; + public static void stop() { running = false; } static class Evolver implements Runnable { @Override public void run() { - while(!Thread.interrupted()) { + while(running) { // Randomly select an element to work on: int element = rand.nextInt(N_ELEMENTS); for(int i = 0; i < N_GENES; i++) { @@ -50,7 +52,8 @@ public void run() { new AtomicInteger(rand.nextInt(1000)); for(int i = 0; i < N_EVOLVERS; i++) es.execute(new Evolver()); - TimeUnit.SECONDS.sleep(5); + TimeUnit.SECONDS.sleep(4); + FastSimulation.stop(); es.shutdownNow(); } } diff --git a/threads/restaurant2/RestaurantWithQueues.java b/threads/restaurant2/RestaurantWithQueues.java index 195f4eeda..85ebf0320 100644 --- a/threads/restaurant2/RestaurantWithQueues.java +++ b/threads/restaurant2/RestaurantWithQueues.java @@ -3,6 +3,7 @@ // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. // {Args: 5} +// {main: threads.restaurant2.RestaurantWithQueues} package threads.restaurant2; import enums.menu.*; import java.util.concurrent.*; From ff7380e093feee12a15294a6f748420ab0cc7b8e Mon Sep 17 00:00:00 2001 From: James Ward Date: Fri, 8 Jul 2016 13:32:37 -0600 Subject: [PATCH 015/320] more ignores --- .gitignore | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.gitignore b/.gitignore index 09b28c118..3603e838e 100644 --- a/.gitignore +++ b/.gitignore @@ -100,3 +100,8 @@ build/ /newio/test.txt /serialization/CADState.dat /serialization/worm.dat +/serialization/Logon.dat +/serialization/X.file +/standardio/Redirecting.txt +/threads/PSP2.txt +/threads/primes.txt From 48aa54343e84c2c3bc3f261d6f9a8673cc59d01a Mon Sep 17 00:00:00 2001 From: James Ward Date: Fri, 8 Jul 2016 13:58:18 -0600 Subject: [PATCH 016/320] parallel info --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 48faf18b4..4c297174b 100644 --- a/.travis.yml +++ b/.travis.yml @@ -2,4 +2,4 @@ language: java jdk: - oraclejdk8 install: true -script: ./gradlew run +script: ./gradlew --parallel --info run From 36fdd4be0af714b9b6c97260694c134c4ac4295b Mon Sep 17 00:00:00 2001 From: James Ward Date: Fri, 8 Jul 2016 14:00:52 -0600 Subject: [PATCH 017/320] add appveyor --- appveyor.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 appveyor.yml diff --git a/appveyor.yml b/appveyor.yml new file mode 100644 index 000000000..fc577648b --- /dev/null +++ b/appveyor.yml @@ -0,0 +1,4 @@ +build_script: + - gradlew.bat --parallel --info runconsole + +test: off From bd5161473b2327ac80d5dcaf1723ddbc8b951035 Mon Sep 17 00:00:00 2001 From: James Ward Date: Fri, 8 Jul 2016 14:06:34 -0600 Subject: [PATCH 018/320] fix command --- appveyor.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/appveyor.yml b/appveyor.yml index fc577648b..c25dec809 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -1,4 +1,4 @@ build_script: - - gradlew.bat --parallel --info runconsole + - gradlew.bat --parallel --info run test: off From 348d7de52cd24b54d670c612f96959e9381fde9f Mon Sep 17 00:00:00 2001 From: Bruce Eckel Date: Fri, 8 Jul 2016 14:13:13 -0600 Subject: [PATCH 019/320] Reduce SIZE because of build failures --- arrays/ParallelPrefix.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/arrays/ParallelPrefix.java b/arrays/ParallelPrefix.java index 104ebfdc5..987b9c51c 100644 --- a/arrays/ParallelPrefix.java +++ b/arrays/ParallelPrefix.java @@ -5,7 +5,7 @@ import java.util.*; public class ParallelPrefix { - static final int SIZE = 20_000_000; + static final int SIZE = 10_000_000; public static void main(String[] args) { long[] nums = new long[SIZE]; Arrays.setAll(nums, n -> n); From 7cc95dbcb8d7909eb04e6ad8ef47dc97b3c3784a Mon Sep 17 00:00:00 2001 From: James Ward Date: Fri, 8 Jul 2016 14:16:55 -0600 Subject: [PATCH 020/320] stacktrace --- .travis.yml | 2 +- appveyor.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 4c297174b..fab9b5b3b 100644 --- a/.travis.yml +++ b/.travis.yml @@ -2,4 +2,4 @@ language: java jdk: - oraclejdk8 install: true -script: ./gradlew --parallel --info run +script: ./gradlew --parallel --stacktrace run diff --git a/appveyor.yml b/appveyor.yml index c25dec809..78c7d35f3 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -1,4 +1,4 @@ build_script: - - gradlew.bat --parallel --info run + - gradlew.bat --parallel --stacktrace run test: off From 1f6b857c80e1acd53d79b33f87e7001a7c5a1b51 Mon Sep 17 00:00:00 2001 From: Bruce Eckel Date: Fri, 8 Jul 2016 14:35:56 -0600 Subject: [PATCH 021/320] Lines not necessary, were making ci fail --- files/PartsOfPaths.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/files/PartsOfPaths.java b/files/PartsOfPaths.java index c9627a460..9788dede0 100644 --- a/files/PartsOfPaths.java +++ b/files/PartsOfPaths.java @@ -11,8 +11,6 @@ public static void main(String[] args) { Paths.get("PartsOfPaths.java").toAbsolutePath(); for(int i = 0; i < p.getNameCount(); i++) System.out.println(p.getName(i)); - Path sub = p.subpath(3, p.getNameCount() - 2); - System.out.println(sub); System.out.println("ends with '.java': " + p.endsWith(".java")); for(Path pp : p) { From eddbd2c6a40a1c46fcf9138fb8aa04da8c3540ea Mon Sep 17 00:00:00 2001 From: Bruce Eckel Date: Fri, 8 Jul 2016 14:42:53 -0600 Subject: [PATCH 022/320] Change to {ValidateByHand} --- threads/ThreadSize.java | 1 + 1 file changed, 1 insertion(+) diff --git a/threads/ThreadSize.java b/threads/ThreadSize.java index 568ad09af..ed6f7713b 100644 --- a/threads/ThreadSize.java +++ b/threads/ThreadSize.java @@ -2,6 +2,7 @@ // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// {ValidateByHand} import java.util.concurrent.*; public class ThreadSize { From 6e748306c77363c374674ce1509ad3d9fb137f0e Mon Sep 17 00:00:00 2001 From: James Ward Date: Fri, 8 Jul 2016 15:39:40 -0600 Subject: [PATCH 023/320] out to files --- build.gradle | 78 +++++++++------------------------------------------- 1 file changed, 13 insertions(+), 65 deletions(-) diff --git a/build.gradle b/build.gradle index 30c1cda01..87942fa61 100644 --- a/build.gradle +++ b/build.gradle @@ -1,15 +1,4 @@ -import org.python.util.PythonInterpreter -import org.python.core.* - -buildscript { - repositories { - mavenLocal() - mavenCentral() - } - dependencies { - classpath group: 'org.python', name: 'jython-standalone', version: '2.7.1b2' - } -} +import org.apache.tools.ant.util.TeeOutputStream subprojects { apply plugin: 'java' @@ -97,66 +86,28 @@ subprojects { task "$taskName" << { println "not implemented" } - - task "test$taskName" << { - println "not implemented" - } } else { - task "$taskName"(type: JavaExec, dependsOn: maybeRunFirst) { - main = mainClass - classpath = sourceSets.main.runtimeClasspath - args = maybeArgs - jvmArgs = maybeJvmArgs - ignoreExitValue = maybeIgnoreExitValue - } + File outFile = new File(projectDir, "${taskName}.out") + File errFile = new File(projectDir, "${taskName}.err") - Integer expectedOutputStartLine = lines.findIndexOf { it.startsWith('/* Output:') } - Integer expectedOutputEndLine = -1 - List expectedOutputLines = [] + OutputStream runStandardOutput = new TeeOutputStream(new FileOutputStream(outFile), System.out) - if (expectedOutputStartLine != -1) { - expectedOutputStartLine += 1 - expectedOutputEndLine = lines.findIndexOf(expectedOutputStartLine, { it.startsWith('*/') }) - if (expectedOutputEndLine == -1) { - expectedOutputEndLine = expectedOutputStartLine - } - expectedOutputLines = lines.subList(expectedOutputStartLine, expectedOutputEndLine) - } - - OutputStream testStandardOutput = new ByteArrayOutputStream() - OutputStream testErrorOutput = new ByteArrayOutputStream() + OutputStream runErrorOutput = new TeeOutputStream(new FileOutputStream(errFile), System.err) - task "test$taskName"(type: JavaExec, dependsOn: maybeRunFirst) { + task "$taskName"(type: JavaExec, dependsOn: maybeRunFirst) { main = mainClass classpath = sourceSets.main.runtimeClasspath args = maybeArgs jvmArgs = maybeJvmArgs ignoreExitValue = maybeIgnoreExitValue - standardOutput = testStandardOutput - errorOutput = testErrorOutput - doLast { - // test the output here - def rstrip = { it.replaceAll('\\s$', '') } - - def textwrap = { String text -> - if (text.length() > 0) { - PythonInterpreter interpreter = new PythonInterpreter() - interpreter.exec("from textwrap import fill") - PyFunction textwrapFill = (PyFunction) interpreter.get("fill") - PyObject result = textwrapFill.__call__(new PyString(text), new PyInteger(59)) - return ((String) result.__tojava__(String.class)).readLines() - } - else { - return [""] - } - } - - List testStandardOutputLines = testStandardOutput.toString().readLines().collect(rstrip).collectMany(textwrap) - - assert expectedOutputLines.size() == testStandardOutputLines.size() - - expectedOutputLines.eachWithIndex { expectedLine, i -> assert expectedLine == testStandardOutputLines.get(i) } + standardOutput = runStandardOutput + errorOutput = runErrorOutput + addShutdownHook { + runStandardOutput.close() + runErrorOutput.close() + if (outFile.size() == 0) outFile.delete() + if (errFile.size() == 0) errFile.delete() } } } @@ -170,9 +121,6 @@ subprojects { } task run(dependsOn: tasks) - - List testTasks = tasks.collect { "test" + it } - task test(overwrite:true, dependsOn: testTasks) } configure(subprojects - project(':onjava')) { From 2280fcc16aebd9fc9d680828d6e6f137fcab9be4 Mon Sep 17 00:00:00 2001 From: James Ward Date: Sat, 9 Jul 2016 14:03:58 -0600 Subject: [PATCH 024/320] sub-dir path for out files - fixes #12 --- build.gradle | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/build.gradle b/build.gradle index 87942fa61..9c5889a55 100644 --- a/build.gradle +++ b/build.gradle @@ -88,8 +88,10 @@ subprojects { } } else { - File outFile = new File(projectDir, "${taskName}.out") - File errFile = new File(projectDir, "${taskName}.err") + String basePath = it.absolutePath.replaceAll('\\.java', '') + + File outFile = new File(basePath + '.out') + File errFile = new File(basePath + '.err') OutputStream runStandardOutput = new TeeOutputStream(new FileOutputStream(outFile), System.out) From af33c51b1f2446dc056bc81ab586f0d4e2bf2a15 Mon Sep 17 00:00:00 2001 From: Bruce Eckel Date: Wed, 13 Jul 2016 16:34:14 -0600 Subject: [PATCH 025/320] Added "Tags" class --- build.gradle | 72 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 72 insertions(+) diff --git a/build.gradle b/build.gradle index 9c5889a55..17c96c527 100644 --- a/build.gradle +++ b/build.gradle @@ -1,5 +1,74 @@ import org.apache.tools.ant.util.TeeOutputStream +class Tags { + Boolean mainMethod = false + Boolean compileTimeError = false + Boolean throwsException = false + Boolean errorOutputExpected = false + Boolean validateByHand = false + Boolean ignoreOutput = false // probably don't need this tag + String javaCmd = null + String args = null + String jVMArgs = null + String exec = null + String runFirst = null + private List lines + private String block + def Tags(List lines) { + this.lines = lines + block = lines.join('') + mainMethod = block.contains('main(String[] args)') + compileTimeError = testFor('CompileTimeError') + throwsException = testFor('ThrowsException') + errorOutputExpected = testFor('ErrorOutputExpected') + validateByHand = testFor('ValidateByHand') + ignoreOutput = testFor('IgnoreOutput') + javaCmd = extract('main:') + args = extract('Args:') + jVMArgs = extract('JVMArgs:') + exec = extract('Exec:') + runFirst = extract('RunFirst:') + } + private def testFor(String marker) { + return block.contains("// {" + marker + "}") + } + private def extract(String marker) { + if(!block.contains("// {" + marker)) + return null + def re = "\\/\\/ \\{" + marker + /[^}]+}/ + def tagline = block =~ re + if(tagline.getCount()) { + println lines[0] + def rtrim = tagline[0] - "}" + def ltrim = rtrim - ("// {" + marker) + println ">" + ltrim + return ltrim + } else { + println "Searching for: " + re + println block + System.exit(1) + } + } + public String toString() { + String result = "" + for(ln in lines) + result += ln + "\n" + result += "mainMethod: " + mainMethod + "\n" + result += "compileTimeError: " + compileTimeError + "\n" + result += "throwsException: " + throwsException + "\n" + result += "errorOutputExpected: " + errorOutputExpected + "\n" + result += "validateByHand: " + validateByHand + "\n" + result += "ignoreOutput: " + ignoreOutput + "\n" + result += "javaCmd: " + javaCmd + "\n" + result += "args: " + args + "\n" + result += "jVMArgs: " + jVMArgs + "\n" + result += "exec: " + exec + "\n" + result += "runFirst: " + runFirst + "\n" + return result + } +} + + subprojects { apply plugin: 'java' @@ -26,6 +95,9 @@ subprojects { List lines = it.readLines() + Tags tags = new Tags(lines) // Not used yet; just for demo + println tags + Boolean hasMainMethod = lines.join('').contains('main(String[] args)') Boolean hasMainParam = lines.find { it.startsWith('// {main: ')} Boolean willNotCompile = lines.find { it.startsWith('// {CompileTimeError') } From bec8b1fd6a000c4def4f656e165f59ecfdaab6ce Mon Sep 17 00:00:00 2001 From: Bruce Eckel Date: Thu, 14 Jul 2016 05:59:30 -0600 Subject: [PATCH 026/320] Simplified/cleaner test output --- build.gradle | 61 ++++++++++++++++++++++++++++++++++++---------------- 1 file changed, 43 insertions(+), 18 deletions(-) diff --git a/build.gradle b/build.gradle index 17c96c527..11c46c706 100644 --- a/build.gradle +++ b/build.gradle @@ -33,37 +33,61 @@ class Tags { return block.contains("// {" + marker + "}") } private def extract(String marker) { - if(!block.contains("// {" + marker)) + if(!block.contains("// {" + marker)) return null def re = "\\/\\/ \\{" + marker + /[^}]+}/ def tagline = block =~ re if(tagline.getCount()) { - println lines[0] def rtrim = tagline[0] - "}" def ltrim = rtrim - ("// {" + marker) - println ">" + ltrim - return ltrim + return ltrim.trim() } else { println "Searching for: " + re println block System.exit(1) } } + public boolean hasTags() { + return compileTimeError || + throwsException || + errorOutputExpected || + validateByHand || + ignoreOutput || + javaCmd || + args || + jVMArgs || + exec || + runFirst + } public String toString() { String result = "" for(ln in lines) - result += ln + "\n" - result += "mainMethod: " + mainMethod + "\n" - result += "compileTimeError: " + compileTimeError + "\n" - result += "throwsException: " + throwsException + "\n" - result += "errorOutputExpected: " + errorOutputExpected + "\n" - result += "validateByHand: " + validateByHand + "\n" - result += "ignoreOutput: " + ignoreOutput + "\n" - result += "javaCmd: " + javaCmd + "\n" - result += "args: " + args + "\n" - result += "jVMArgs: " + jVMArgs + "\n" - result += "exec: " + exec + "\n" - result += "runFirst: " + runFirst + "\n" + if(ln.startsWith("//") || ln.startsWith("package ")) + result += ln + "\n" + else + break + if(mainMethod) + result += "mainMethod: " + mainMethod + "\n" + if(compileTimeError) + result += "compileTimeError: " + compileTimeError + "\n" + if(throwsException) + result += "throwsException: " + throwsException + "\n" + if(errorOutputExpected) + result += "errorOutputExpected: " + errorOutputExpected + "\n" + if(validateByHand) + result += "validateByHand: " + validateByHand + "\n" + if(ignoreOutput) + result += "ignoreOutput: " + ignoreOutput + "\n" + if(javaCmd) + result += "javaCmd: " + javaCmd + "\n" + if(args) + result += "args: " + args + "\n" + if(jVMArgs) + result += "jVMArgs: " + jVMArgs + "\n" + if(exec) + result += "exec: " + exec + "\n" + if(runFirst) + result += "runFirst: " + runFirst + "\n" return result } } @@ -96,7 +120,8 @@ subprojects { List lines = it.readLines() Tags tags = new Tags(lines) // Not used yet; just for demo - println tags + if(tags.hasTags()) + println tags Boolean hasMainMethod = lines.join('').contains('main(String[] args)') Boolean hasMainParam = lines.find { it.startsWith('// {main: ')} @@ -104,7 +129,7 @@ subprojects { Boolean validateByHand = lines.find { it.startsWith('// {ValidateByHand}') } Boolean throwsException = lines.find { it.startsWith('// {ThrowsException}') } - // add tasks for java sources with main methods + // Add tasks for java sources with main methods if ((hasMainMethod || hasMainParam) && (!willNotCompile)) { String maybeArgsLine = lines.find { it.startsWith('// {Args: ')} From 28f14faa14788fb646ced1a23f2fb5438cb94469 Mon Sep 17 00:00:00 2001 From: James Ward Date: Thu, 14 Jul 2016 09:53:19 -0600 Subject: [PATCH 027/320] post run cleanup --- build.gradle | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/build.gradle b/build.gradle index 11c46c706..c1ccb134a 100644 --- a/build.gradle +++ b/build.gradle @@ -202,12 +202,11 @@ subprojects { ignoreExitValue = maybeIgnoreExitValue standardOutput = runStandardOutput errorOutput = runErrorOutput - addShutdownHook { - runStandardOutput.close() - runErrorOutput.close() - if (outFile.size() == 0) outFile.delete() - if (errFile.size() == 0) errFile.delete() - } + } << { + runStandardOutput.close() + runErrorOutput.close() + if (outFile.size() == 0) outFile.delete() + if (errFile.size() == 0) errFile.delete() } } } From b21359ea195d6f982fc67e23555daf65a152034d Mon Sep 17 00:00:00 2001 From: Bruce Eckel Date: Thu, 14 Jul 2016 12:23:33 -0600 Subject: [PATCH 028/320] Evolving towards using the Tag class --- build.gradle | 91 +++++++++++++++++++++------------------------------- 1 file changed, 37 insertions(+), 54 deletions(-) diff --git a/build.gradle b/build.gradle index c1ccb134a..1879a0bb4 100644 --- a/build.gradle +++ b/build.gradle @@ -8,7 +8,7 @@ class Tags { Boolean validateByHand = false Boolean ignoreOutput = false // probably don't need this tag String javaCmd = null - String args = null + List args = [] String jVMArgs = null String exec = null String runFirst = null @@ -24,7 +24,8 @@ class Tags { validateByHand = testFor('ValidateByHand') ignoreOutput = testFor('IgnoreOutput') javaCmd = extract('main:') - args = extract('Args:') + def argString = extract('Args:') + if(argString) args = argString.split(' ') jVMArgs = extract('JVMArgs:') exec = extract('Exec:') runFirst = extract('RunFirst:') @@ -38,7 +39,11 @@ class Tags { def re = "\\/\\/ \\{" + marker + /[^}]+}/ def tagline = block =~ re if(tagline.getCount()) { - def rtrim = tagline[0] - "}" + if(block.contains("TestRegularExpression")) + println tagline[0] + def rtrim = tagline[0].reverse().dropWhile{ it != '}'}.reverse()[0..-2] + if(block.contains("TestRegularExpression")) + println rtrim def ltrim = rtrim - ("// {" + marker) return ltrim.trim() } else { @@ -120,30 +125,23 @@ subprojects { List lines = it.readLines() Tags tags = new Tags(lines) // Not used yet; just for demo - if(tags.hasTags()) - println tags - - Boolean hasMainMethod = lines.join('').contains('main(String[] args)') - Boolean hasMainParam = lines.find { it.startsWith('// {main: ')} - Boolean willNotCompile = lines.find { it.startsWith('// {CompileTimeError') } - Boolean validateByHand = lines.find { it.startsWith('// {ValidateByHand}') } - Boolean throwsException = lines.find { it.startsWith('// {ThrowsException}') } + // if(tags.hasTags()) println tags // Trace output for debugging // Add tasks for java sources with main methods - if ((hasMainMethod || hasMainParam) && (!willNotCompile)) { + if ((tags.mainMethod || tags.javaCmd) && (!tags.compileTimeError)) { - String maybeArgsLine = lines.find { it.startsWith('// {Args: ')} +/* String maybeArgsLine = lines.find { it.startsWith('// {Args: ')} List maybeArgs = [] if (maybeArgsLine != null) { maybeArgs = maybeArgsLine.trim().replaceAll('\\/\\/ \\{Args: ', '').reverse().replaceFirst('}', '').reverse().split(' ') } - +*/ String mainClass = it.name.replaceAll('.java', '') String taskName = mainClass - if (!validateByHand) { + if (!tags.validateByHand) { // only add tasks that we know we can run successfully to the task list tasks.add(taskName) } @@ -168,51 +166,36 @@ subprojects { maybeRunFirst = maybeRunFirstLine.trim().replaceAll('\\/\\/ \\{RunFirst: ', '').replaceAll('}', '') } - // some java apps intentionally throw an exception - Boolean maybeIgnoreExitValue = (validateByHand || throwsException) + // Some java apps intentionally throw an exception + Boolean maybeIgnoreExitValue = (tags.validateByHand || tags.throwsException) - // some java apps need a timeout - Boolean timeOutDuringTesting = false - if (lines.find { it.startsWith('// {TimeOutDuringTesting}') } != null) { - timeOutDuringTesting = true - } + String basePath = it.absolutePath.replaceAll('\\.java', '') - // create run and test tasks - if (timeOutDuringTesting) { - // todo: apps with timeOutDuringTesting need special handling - task "$taskName" << { - println "not implemented" - } - } - else { - String basePath = it.absolutePath.replaceAll('\\.java', '') - - File outFile = new File(basePath + '.out') - File errFile = new File(basePath + '.err') - - OutputStream runStandardOutput = new TeeOutputStream(new FileOutputStream(outFile), System.out) - - OutputStream runErrorOutput = new TeeOutputStream(new FileOutputStream(errFile), System.err) - - task "$taskName"(type: JavaExec, dependsOn: maybeRunFirst) { - main = mainClass - classpath = sourceSets.main.runtimeClasspath - args = maybeArgs - jvmArgs = maybeJvmArgs - ignoreExitValue = maybeIgnoreExitValue - standardOutput = runStandardOutput - errorOutput = runErrorOutput - } << { - runStandardOutput.close() - runErrorOutput.close() - if (outFile.size() == 0) outFile.delete() - if (errFile.size() == 0) errFile.delete() - } + File outFile = new File(basePath + '.out') + File errFile = new File(basePath + '.err') + + OutputStream runStandardOutput = new TeeOutputStream(new FileOutputStream(outFile), System.out) + + OutputStream runErrorOutput = new TeeOutputStream(new FileOutputStream(errFile), System.err) + + task "$taskName"(type: JavaExec, dependsOn: maybeRunFirst) { + main = mainClass + classpath = sourceSets.main.runtimeClasspath + args = tags.args + jvmArgs = maybeJvmArgs + ignoreExitValue = maybeIgnoreExitValue + standardOutput = runStandardOutput + errorOutput = runErrorOutput + } << { + runStandardOutput.close() + runErrorOutput.close() + if (outFile.size() == 0) outFile.delete() + if (errFile.size() == 0) errFile.delete() } } // exclude java sources that will not compile - if (willNotCompile) { + if (tags.compileTimeError) { sourceSets.main.java.excludes.add(it.name) } } From 6c93ba2268d7fe070b3d806567c6b0a1e7957fe8 Mon Sep 17 00:00:00 2001 From: Bruce Eckel Date: Thu, 14 Jul 2016 12:32:20 -0600 Subject: [PATCH 029/320] Fix TestRegularExpression --- Copyright.txt | 2 +- assertions/Assert1.java | 2 +- collectionsindepth/MapPerformance.java | 2 +- serialization/APerson.java | 3 +-- serialization/People.java | 3 +-- strings/TestRegularExpression.java | 2 +- 6 files changed, 6 insertions(+), 8 deletions(-) diff --git a/Copyright.txt b/Copyright.txt index 2b0c56fec..8f25e3a2b 100644 --- a/Copyright.txt +++ b/Copyright.txt @@ -1,5 +1,5 @@ // Copyright.txt -This computer source code is Copyright ©2016 MindView LLC +This computer source code is Copyright ©2016 MindView LLC All Rights Reserved. Permission to use, copy, modify, and distribute this diff --git a/assertions/Assert1.java b/assertions/Assert1.java index 303bd172b..894bb19b6 100644 --- a/assertions/Assert1.java +++ b/assertions/Assert1.java @@ -4,7 +4,7 @@ // Visit http://mindviewinc.com/Books/OnJava/ for more book information. // Non-informative style of assert // Must run with -ea: -// {JVMArgs: -ea} +// {JVMArgs: -ea} // {ThrowsException} public class Assert1 { diff --git a/collectionsindepth/MapPerformance.java b/collectionsindepth/MapPerformance.java index 77d86bcee..1e26a728e 100644 --- a/collectionsindepth/MapPerformance.java +++ b/collectionsindepth/MapPerformance.java @@ -4,7 +4,7 @@ // Visit http://mindviewinc.com/Books/OnJava/ for more book information. // Demonstrates performance differences in Maps // Small to keep build testing short: -// {Args: 100 5000} +// {Args: 100 5000} import java.util.*; public class MapPerformance { diff --git a/serialization/APerson.java b/serialization/APerson.java index 930b5a4a3..0815a9bb2 100644 --- a/serialization/APerson.java +++ b/serialization/APerson.java @@ -3,8 +3,7 @@ // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. // Use the XOM library to write and read XML -// {Requires: nu.xom.Node; You must install -// the XOM library from http://www.xom.nu } +// You must install nu.xom.Node from http://www.xom.nu import nu.xom.*; import java.io.*; import java.util.*; diff --git a/serialization/People.java b/serialization/People.java index 5a7a7fa12..1211603e8 100644 --- a/serialization/People.java +++ b/serialization/People.java @@ -2,8 +2,7 @@ // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. -// {Requires: nu.xom.Node; You must install -// the XOM library from http://www.xom.nu } +// You must install nu.xom.Node from http://www.xom.nu // {RunFirst: APerson} import nu.xom.*; import java.io.File; diff --git a/strings/TestRegularExpression.java b/strings/TestRegularExpression.java index c1b5e14eb..28257b7aa 100644 --- a/strings/TestRegularExpression.java +++ b/strings/TestRegularExpression.java @@ -3,7 +3,7 @@ // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. // Simple regular expression demonstration -// {Args: abcabcabcdefabc "abc+" "(abc)+" "(abc){2,}" } +// {Args: abcabcabcdefabc "abc+" "(abc)+" } import java.util.regex.*; public class TestRegularExpression { From 74d0a678b4b13f200ef5d7e2ed11df3563ccb5b8 Mon Sep 17 00:00:00 2001 From: Bruce Eckel Date: Thu, 14 Jul 2016 13:29:44 -0600 Subject: [PATCH 030/320] Further towards use of Tags class --- build.gradle | 38 ++++++++++++-------------------------- 1 file changed, 12 insertions(+), 26 deletions(-) diff --git a/build.gradle b/build.gradle index 1879a0bb4..55daf8316 100644 --- a/build.gradle +++ b/build.gradle @@ -7,6 +7,8 @@ class Tags { Boolean errorOutputExpected = false Boolean validateByHand = false Boolean ignoreOutput = false // probably don't need this tag + String fileRoot + String mainClass String javaCmd = null List args = [] String jVMArgs = null @@ -18,14 +20,19 @@ class Tags { this.lines = lines block = lines.join('') mainMethod = block.contains('main(String[] args)') + fileRoot = lines[0].split("/")[-1] - ".java" + mainClass = fileRoot + javaCmd = extract('main:') + if(javaCmd) + mainClass = javaCmd compileTimeError = testFor('CompileTimeError') throwsException = testFor('ThrowsException') errorOutputExpected = testFor('ErrorOutputExpected') validateByHand = testFor('ValidateByHand') ignoreOutput = testFor('IgnoreOutput') - javaCmd = extract('main:') def argString = extract('Args:') - if(argString) args = argString.split(' ') + if(argString) + args = argString.split(' ') jVMArgs = extract('JVMArgs:') exec = extract('Exec:') runFirst = extract('RunFirst:') @@ -39,11 +46,7 @@ class Tags { def re = "\\/\\/ \\{" + marker + /[^}]+}/ def tagline = block =~ re if(tagline.getCount()) { - if(block.contains("TestRegularExpression")) - println tagline[0] def rtrim = tagline[0].reverse().dropWhile{ it != '}'}.reverse()[0..-2] - if(block.contains("TestRegularExpression")) - println rtrim def ltrim = rtrim - ("// {" + marker) return ltrim.trim() } else { @@ -130,26 +133,9 @@ subprojects { // Add tasks for java sources with main methods if ((tags.mainMethod || tags.javaCmd) && (!tags.compileTimeError)) { -/* String maybeArgsLine = lines.find { it.startsWith('// {Args: ')} - - List maybeArgs = [] - if (maybeArgsLine != null) { - maybeArgs = maybeArgsLine.trim().replaceAll('\\/\\/ \\{Args: ', '').reverse().replaceFirst('}', '').reverse().split(' ') - } -*/ - String mainClass = it.name.replaceAll('.java', '') - - String taskName = mainClass - if (!tags.validateByHand) { // only add tasks that we know we can run successfully to the task list - tasks.add(taskName) - } - - // some java sources with a main method specify a different main class - String maybeMainLine = lines.find { it.startsWith('// {main: ')} - if (maybeMainLine != null) { - mainClass = maybeMainLine.trim().replaceAll('\\/\\/ \\{main: ', '').replaceAll('}', '') + tasks.add(tags.fileRoot) } // some java sources with JVM args @@ -178,8 +164,8 @@ subprojects { OutputStream runErrorOutput = new TeeOutputStream(new FileOutputStream(errFile), System.err) - task "$taskName"(type: JavaExec, dependsOn: maybeRunFirst) { - main = mainClass + task "$tags.fileRoot"(type: JavaExec, dependsOn: maybeRunFirst) { + main = tags.mainClass classpath = sourceSets.main.runtimeClasspath args = tags.args jvmArgs = maybeJvmArgs From a0bf41dc252c920d592d2747d4973c9acc060340 Mon Sep 17 00:00:00 2001 From: Bruce Eckel Date: Thu, 14 Jul 2016 13:43:54 -0600 Subject: [PATCH 031/320] jvmArgs now uses Tags class --- build.gradle | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/build.gradle b/build.gradle index 55daf8316..047296509 100644 --- a/build.gradle +++ b/build.gradle @@ -11,7 +11,7 @@ class Tags { String mainClass String javaCmd = null List args = [] - String jVMArgs = null + List jVMArgs = [] String exec = null String runFirst = null private List lines @@ -33,7 +33,9 @@ class Tags { def argString = extract('Args:') if(argString) args = argString.split(' ') - jVMArgs = extract('JVMArgs:') + def jvmArgString = extract('JVMArgs:') + if(jvmArgString) + jVMArgs = jvmArgString.split(' ') exec = extract('Exec:') runFirst = extract('RunFirst:') } @@ -138,13 +140,6 @@ subprojects { tasks.add(tags.fileRoot) } - // some java sources with JVM args - List maybeJvmArgs = [] - String maybeJvmArgsLine = lines.find { it.startsWith('// {JVMArgs: ')} - if (maybeJvmArgsLine != null) { - maybeJvmArgs = maybeJvmArgsLine.trim().replaceAll('\\/\\/ \\{JVMArgs: ', '').replaceAll('}', '').split(' ') - } - // some java sources depend on others to be run first String maybeRunFirst = null String maybeRunFirstLine = lines.find { it.startsWith('// {RunFirst: ')} @@ -168,7 +163,7 @@ subprojects { main = tags.mainClass classpath = sourceSets.main.runtimeClasspath args = tags.args - jvmArgs = maybeJvmArgs + jvmArgs = tags.jVMArgs ignoreExitValue = maybeIgnoreExitValue standardOutput = runStandardOutput errorOutput = runErrorOutput From ec1665584d65454e131779ab102a380ad1e02d95 Mon Sep 17 00:00:00 2001 From: Bruce Eckel Date: Thu, 14 Jul 2016 13:52:04 -0600 Subject: [PATCH 032/320] runFirst now uses Tags class --- build.gradle | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/build.gradle b/build.gradle index 047296509..5e2f55223 100644 --- a/build.gradle +++ b/build.gradle @@ -140,13 +140,6 @@ subprojects { tasks.add(tags.fileRoot) } - // some java sources depend on others to be run first - String maybeRunFirst = null - String maybeRunFirstLine = lines.find { it.startsWith('// {RunFirst: ')} - if (maybeRunFirstLine != null) { - maybeRunFirst = maybeRunFirstLine.trim().replaceAll('\\/\\/ \\{RunFirst: ', '').replaceAll('}', '') - } - // Some java apps intentionally throw an exception Boolean maybeIgnoreExitValue = (tags.validateByHand || tags.throwsException) @@ -159,7 +152,7 @@ subprojects { OutputStream runErrorOutput = new TeeOutputStream(new FileOutputStream(errFile), System.err) - task "$tags.fileRoot"(type: JavaExec, dependsOn: maybeRunFirst) { + task "$tags.fileRoot"(type: JavaExec, dependsOn: tags.runFirst) { main = tags.mainClass classpath = sourceSets.main.runtimeClasspath args = tags.args From 33db5aa10d1a91ad8e1e1da130b4e94fb58d7d0c Mon Sep 17 00:00:00 2001 From: Bruce Eckel Date: Thu, 14 Jul 2016 13:56:55 -0600 Subject: [PATCH 033/320] combined "ignorExitValue" operations --- build.gradle | 16 ++-------------- 1 file changed, 2 insertions(+), 14 deletions(-) diff --git a/build.gradle b/build.gradle index 5e2f55223..8edc6edb8 100644 --- a/build.gradle +++ b/build.gradle @@ -127,9 +127,7 @@ subprojects { projectDir.eachFileRecurse { if (it.name.endsWith('.java')) { - List lines = it.readLines() - - Tags tags = new Tags(lines) // Not used yet; just for demo + Tags tags = new Tags(it.readLines()) // if(tags.hasTags()) println tags // Trace output for debugging // Add tasks for java sources with main methods @@ -140,16 +138,10 @@ subprojects { tasks.add(tags.fileRoot) } - // Some java apps intentionally throw an exception - Boolean maybeIgnoreExitValue = (tags.validateByHand || tags.throwsException) - String basePath = it.absolutePath.replaceAll('\\.java', '') - File outFile = new File(basePath + '.out') File errFile = new File(basePath + '.err') - OutputStream runStandardOutput = new TeeOutputStream(new FileOutputStream(outFile), System.out) - OutputStream runErrorOutput = new TeeOutputStream(new FileOutputStream(errFile), System.err) task "$tags.fileRoot"(type: JavaExec, dependsOn: tags.runFirst) { @@ -157,7 +149,7 @@ subprojects { classpath = sourceSets.main.runtimeClasspath args = tags.args jvmArgs = tags.jVMArgs - ignoreExitValue = maybeIgnoreExitValue + ignoreExitValue = tags.validateByHand || tags.throwsException standardOutput = runStandardOutput errorOutput = runErrorOutput } << { @@ -167,21 +159,17 @@ subprojects { if (errFile.size() == 0) errFile.delete() } } - // exclude java sources that will not compile if (tags.compileTimeError) { sourceSets.main.java.excludes.add(it.name) } } } - task run(dependsOn: tasks) } configure(subprojects - project(':onjava')) { - dependencies { compile project(':onjava') } - } From fd2593b9759e58253eb065bf25e1275c684aec2c Mon Sep 17 00:00:00 2001 From: Bruce Eckel Date: Thu, 14 Jul 2016 18:18:02 -0600 Subject: [PATCH 034/320] clever toString() --- build.gradle | 44 ++++++++++++++++++++------------------------ 1 file changed, 20 insertions(+), 24 deletions(-) diff --git a/build.gradle b/build.gradle index 8edc6edb8..93b68ab5b 100644 --- a/build.gradle +++ b/build.gradle @@ -6,7 +6,7 @@ class Tags { Boolean throwsException = false Boolean errorOutputExpected = false Boolean validateByHand = false - Boolean ignoreOutput = false // probably don't need this tag + Boolean ignoreOutput = false // This tag isn't used in the build... String fileRoot String mainClass String javaCmd = null @@ -76,29 +76,25 @@ class Tags { result += ln + "\n" else break - if(mainMethod) - result += "mainMethod: " + mainMethod + "\n" - if(compileTimeError) - result += "compileTimeError: " + compileTimeError + "\n" - if(throwsException) - result += "throwsException: " + throwsException + "\n" - if(errorOutputExpected) - result += "errorOutputExpected: " + errorOutputExpected + "\n" - if(validateByHand) - result += "validateByHand: " + validateByHand + "\n" - if(ignoreOutput) - result += "ignoreOutput: " + ignoreOutput + "\n" - if(javaCmd) - result += "javaCmd: " + javaCmd + "\n" - if(args) - result += "args: " + args + "\n" - if(jVMArgs) - result += "jVMArgs: " + jVMArgs + "\n" - if(exec) - result += "exec: " + exec + "\n" - if(runFirst) - result += "runFirst: " + runFirst + "\n" - return result + """ + mainMethod + compileTimeError + throwsException + errorOutputExpected + validateByHand + ignoreOutput + fileRoot + mainClass + javaCmd + args + jVMArgs + exec + runFirst + """.split().each { str -> + if(this[str]) + result += str + ": " + this[str] + "\n" + } + result } } From fddfa8b3b2262afef7536fa4c24f0435254ffbf3 Mon Sep 17 00:00:00 2001 From: Bruce Eckel Date: Thu, 14 Jul 2016 18:43:34 -0600 Subject: [PATCH 035/320] added debug flag --- build.gradle | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 93b68ab5b..859a9230a 100644 --- a/build.gradle +++ b/build.gradle @@ -1,4 +1,5 @@ import org.apache.tools.ant.util.TeeOutputStream +boolean debug = false class Tags { Boolean mainMethod = false @@ -124,7 +125,7 @@ subprojects { if (it.name.endsWith('.java')) { Tags tags = new Tags(it.readLines()) - // if(tags.hasTags()) println tags // Trace output for debugging + if(debug && tags.hasTags()) println tags // Add tasks for java sources with main methods if ((tags.mainMethod || tags.javaCmd) && (!tags.compileTimeError)) { From c023845c91ac3bb829cdc9890b850ecf32d05192 Mon Sep 17 00:00:00 2001 From: Bruce Eckel Date: Thu, 14 Jul 2016 22:00:16 -0600 Subject: [PATCH 036/320] Removed sections on Atomics and Thread Locals --- threads/FastSimulation.java | 82 -------------------------- threads/ThreadLocalVariableHolder.java | 71 ---------------------- 2 files changed, 153 deletions(-) delete mode 100644 threads/FastSimulation.java delete mode 100644 threads/ThreadLocalVariableHolder.java diff --git a/threads/FastSimulation.java b/threads/FastSimulation.java deleted file mode 100644 index f0af5dbe4..000000000 --- a/threads/FastSimulation.java +++ /dev/null @@ -1,82 +0,0 @@ -// threads/FastSimulation.java -// (c)2016 MindView LLC: see Copyright.txt -// We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. -import java.util.concurrent.*; -import java.util.concurrent.atomic.*; -import java.util.*; - -public class FastSimulation { - static final int N_ELEMENTS = 100000; - static final int N_GENES = 30; - static final int N_EVOLVERS = 50; - static final AtomicInteger[][] GRID = - new AtomicInteger[N_ELEMENTS][N_GENES]; - static SplittableRandom rand = new SplittableRandom(47); - private static volatile boolean running = true; - public static void stop() { running = false; } - static class Evolver implements Runnable { - @Override - public void run() { - while(running) { - // Randomly select an element to work on: - int element = rand.nextInt(N_ELEMENTS); - for(int i = 0; i < N_GENES; i++) { - int previous = element - 1; - if(previous < 0) previous = N_ELEMENTS - 1; - int next = element + 1; - if(next >= N_ELEMENTS) next = 0; - int oldvalue = GRID[element][i].get(); - // Perform some kind of modeling calculation: - int newvalue = oldvalue + - GRID[previous][i].get() + GRID[next][i].get(); - newvalue /= 3; // Average the three values - if(!GRID[element][i] - .compareAndSet(oldvalue, newvalue)) { - // Policy here to deal with failure. Here, we - // just report it and ignore it; our model - // will eventually deal with it. - System.out.println( - "Old value changed from " + oldvalue); - } - } - } - } - } - public static void - main(String[] args) throws Exception { - ExecutorService es = Executors.newCachedThreadPool(); - for(int i = 0; i < N_ELEMENTS; i++) - for(int j = 0; j < N_GENES; j++) - GRID[i][j] = - new AtomicInteger(rand.nextInt(1000)); - for(int i = 0; i < N_EVOLVERS; i++) - es.execute(new Evolver()); - TimeUnit.SECONDS.sleep(4); - FastSimulation.stop(); - es.shutdownNow(); - } -} -/* Output: (First and last 10 Lines) -Old value changed from 542 -Old value changed from 447 -Old value changed from 446 -Old value changed from 643 -Old value changed from 419 -Old value changed from 573 -Old value changed from 668 -Old value changed from 710 -Old value changed from 800 -Old value changed from 406 -________...________...________...________...________ -Old value changed from 458 -Old value changed from 436 -Old value changed from 475 -Old value changed from 501 -Old value changed from 526 -Old value changed from 465 -Old value changed from 467 -Old value changed from 368 -Old value changed from 404 -Old value changed from 428 -*/ diff --git a/threads/ThreadLocalVariableHolder.java b/threads/ThreadLocalVariableHolder.java deleted file mode 100644 index 2df98df5d..000000000 --- a/threads/ThreadLocalVariableHolder.java +++ /dev/null @@ -1,71 +0,0 @@ -// threads/ThreadLocalVariableHolder.java -// (c)2016 MindView LLC: see Copyright.txt -// We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. -// Automatically giving each thread its own storage -import java.util.concurrent.*; -import java.util.*; - -class Accessor implements Runnable { - private final int id; - public Accessor(int idn) { id = idn; } - @Override - public void run() { - while(!Thread.currentThread().isInterrupted()) { - ThreadLocalVariableHolder.increment(); - System.out.println(this); - Thread.yield(); - } - } - @Override - public String toString() { - return "#" + id + ": " + - ThreadLocalVariableHolder.get(); - } -} - -public class ThreadLocalVariableHolder { - private static ThreadLocal value = - new ThreadLocal() { - private SplittableRandom rand = new SplittableRandom(47); - @Override - protected synchronized Integer initialValue() { - return rand.nextInt(10000); - } - }; - public static void increment() { - value.set(value.get() + 1); - } - public static int get() { return value.get(); } - public static void - main(String[] args) throws Exception { - ExecutorService es = Executors.newCachedThreadPool(); - for(int i = 0; i < 5; i++) - es.execute(new Accessor(i)); - TimeUnit.SECONDS.sleep(3); // Run for a while - es.shutdownNow(); // All Accessors will quit - } -} -/* Output: (First and last 10 Lines) -#2: 9259 -#1: 962 -#3: 1862 -#4: 6694 -#0: 556 -#4: 6695 -#4: 6696 -#3: 1863 -#1: 963 -#2: 9260 -________...________...________...________...________ -#3: 3791 -#2: 11096 -#4: 8402 -#4: 8403 -#2: 11097 -#3: 3792 -#0: 2637 -#1: 3032 -#4: 8404 -#2: 11098 -*/ From c26ff2bcfc254877da3b4d9cbd5a46baf8257758 Mon Sep 17 00:00:00 2001 From: Bruce Eckel Date: Mon, 18 Jul 2016 14:46:40 -0600 Subject: [PATCH 037/320] Added support for outputLine --- build.gradle | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/build.gradle b/build.gradle index 859a9230a..d1ff04fac 100644 --- a/build.gradle +++ b/build.gradle @@ -15,6 +15,7 @@ class Tags { List jVMArgs = [] String exec = null String runFirst = null + String outputLine = null private List lines private String block def Tags(List lines) { @@ -39,6 +40,12 @@ class Tags { jVMArgs = jvmArgString.split(' ') exec = extract('Exec:') runFirst = extract('RunFirst:') + lines.each { + if(it =~ /\\/* Output:/) { + outputLine = it.trim() + println outputLine + } + } } private def testFor(String marker) { return block.contains("// {" + marker + "}") @@ -137,6 +144,8 @@ subprojects { String basePath = it.absolutePath.replaceAll('\\.java', '') File outFile = new File(basePath + '.out') + if(tags.outputLine) + outFile.write(tags.outputLine + "\n") File errFile = new File(basePath + '.err') OutputStream runStandardOutput = new TeeOutputStream(new FileOutputStream(outFile), System.out) OutputStream runErrorOutput = new TeeOutputStream(new FileOutputStream(errFile), System.err) From 86429d6d033edb040afd59e310e0f0f1c02f6f87 Mon Sep 17 00:00:00 2001 From: Bruce Eckel Date: Mon, 18 Jul 2016 17:34:08 -0600 Subject: [PATCH 038/320] Output file erased if it exists, append allows outputLine --- build.gradle | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/build.gradle b/build.gradle index d1ff04fac..b7e1c4fd1 100644 --- a/build.gradle +++ b/build.gradle @@ -144,10 +144,12 @@ subprojects { String basePath = it.absolutePath.replaceAll('\\.java', '') File outFile = new File(basePath + '.out') + if(outFile.exists()) + outFile.delete() if(tags.outputLine) - outFile.write(tags.outputLine + "\n") + outFile << tags.outputLine + "\n" File errFile = new File(basePath + '.err') - OutputStream runStandardOutput = new TeeOutputStream(new FileOutputStream(outFile), System.out) + OutputStream runStandardOutput = new TeeOutputStream(new FileOutputStream(outFile, true), System.out) OutputStream runErrorOutput = new TeeOutputStream(new FileOutputStream(errFile), System.err) task "$tags.fileRoot"(type: JavaExec, dependsOn: tags.runFirst) { From b0a251a5781f4aaef560110a0366aa6a89bf3005 Mon Sep 17 00:00:00 2001 From: James Ward Date: Mon, 18 Jul 2016 18:53:16 -0600 Subject: [PATCH 039/320] bump gradle to 2.14.1 --- gradle/wrapper/gradle-wrapper.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 38944e46d..4341a60e5 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-2.14-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-2.14.1-all.zip From 4f8d2953abe736710d83f39ff63d1a97bc1b380d Mon Sep 17 00:00:00 2001 From: Bruce Eckel Date: Tue, 19 Jul 2016 12:46:32 -0600 Subject: [PATCH 040/320] Removed "close()" for files --- build.gradle | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/build.gradle b/build.gradle index b7e1c4fd1..e2c06270c 100644 --- a/build.gradle +++ b/build.gradle @@ -1,4 +1,5 @@ import org.apache.tools.ant.util.TeeOutputStream +// TODO: test for tags that span multiple lines boolean debug = false class Tags { @@ -43,7 +44,6 @@ class Tags { lines.each { if(it =~ /\\/* Output:/) { outputLine = it.trim() - println outputLine } } } @@ -161,8 +161,8 @@ subprojects { standardOutput = runStandardOutput errorOutput = runErrorOutput } << { - runStandardOutput.close() - runErrorOutput.close() + println "$outFile size():> " + outFile.size() + println "$errFile size():> " + errFile.size() if (outFile.size() == 0) outFile.delete() if (errFile.size() == 0) errFile.delete() } From 28b43326f826ddfc43ee27e8c8dadaf15d906479 Mon Sep 17 00:00:00 2001 From: James Ward Date: Tue, 19 Jul 2016 15:42:38 -0600 Subject: [PATCH 041/320] proper task lifecycle --- build.gradle | 28 +++++++++++++++------------- 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/build.gradle b/build.gradle index e2c06270c..b8a723c81 100644 --- a/build.gradle +++ b/build.gradle @@ -144,13 +144,7 @@ subprojects { String basePath = it.absolutePath.replaceAll('\\.java', '') File outFile = new File(basePath + '.out') - if(outFile.exists()) - outFile.delete() - if(tags.outputLine) - outFile << tags.outputLine + "\n" File errFile = new File(basePath + '.err') - OutputStream runStandardOutput = new TeeOutputStream(new FileOutputStream(outFile, true), System.out) - OutputStream runErrorOutput = new TeeOutputStream(new FileOutputStream(errFile), System.err) task "$tags.fileRoot"(type: JavaExec, dependsOn: tags.runFirst) { main = tags.mainClass @@ -158,13 +152,21 @@ subprojects { args = tags.args jvmArgs = tags.jVMArgs ignoreExitValue = tags.validateByHand || tags.throwsException - standardOutput = runStandardOutput - errorOutput = runErrorOutput - } << { - println "$outFile size():> " + outFile.size() - println "$errFile size():> " + errFile.size() - if (outFile.size() == 0) outFile.delete() - if (errFile.size() == 0) errFile.delete() + doFirst { + if(outFile.exists()) + outFile.delete() + if(tags.outputLine) + outFile << tags.outputLine + "\n" + + standardOutput = new TeeOutputStream(new FileOutputStream(outFile, true), System.out) + errorOutput = new TeeOutputStream(new FileOutputStream(errFile), System.err) + } + doLast { + println "$outFile size():> " + outFile.size() + println "$errFile size():> " + errFile.size() + if (outFile.size() == 0) outFile.delete() + if (errFile.size() == 0) errFile.delete() + } } } // exclude java sources that will not compile From 910b036a6982fe9978446728779544c479f13a7d Mon Sep 17 00:00:00 2001 From: Bruce Eckel Date: Tue, 19 Jul 2016 17:06:26 -0600 Subject: [PATCH 042/320] Minor adjustments --- build.gradle | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/build.gradle b/build.gradle index b8a723c81..3a7f41e8c 100644 --- a/build.gradle +++ b/build.gradle @@ -138,7 +138,7 @@ subprojects { if ((tags.mainMethod || tags.javaCmd) && (!tags.compileTimeError)) { if (!tags.validateByHand) { - // only add tasks that we know we can run successfully to the task list + // Only add tasks that we know we can run successfully to the task list tasks.add(tags.fileRoot) } @@ -162,14 +162,12 @@ subprojects { errorOutput = new TeeOutputStream(new FileOutputStream(errFile), System.err) } doLast { - println "$outFile size():> " + outFile.size() - println "$errFile size():> " + errFile.size() if (outFile.size() == 0) outFile.delete() if (errFile.size() == 0) errFile.delete() } } } - // exclude java sources that will not compile + // Exclude java sources that will not compile if (tags.compileTimeError) { sourceSets.main.java.excludes.add(it.name) } From 98fafd47ff0816f096fa4f3c243bdcdf285ed6ba Mon Sep 17 00:00:00 2001 From: Bruce Eckel Date: Wed, 20 Jul 2016 06:32:39 -0600 Subject: [PATCH 043/320] Various output fixes --- collections/EnvironmentVariables.java | 2 +- collectionsindepth/Lists.java | 2 +- collectionsindepth/References.java | 2 +- compression/GZIPcompress.java | 2 +- compression/ZipCompress.java | 2 +- control/WhileTest.java | 2 +- go.bat | 3 +++ iostreams/BasicFileOutput.java | 2 +- iostreams/BufferedInputFile.java | 2 +- iostreams/FileOutputShortcut.java | 2 +- iostreams/FormattedMemoryInput.java | 2 +- iostreams/MemoryInput.java | 2 +- iostreams/TestEOF.java | 2 +- onjava/ProcessFiles.java | 1 - patterns/doubledispatch/DoubleDispatch.java | 2 +- patterns/dynatrash/DynaTrash.java | 2 +- patterns/recyclea/RecycleA.java | 2 +- patterns/recycleb/RecycleB.java | 2 +- patterns/recyclec/RecycleC.java | 2 +- patterns/trashvisitor/TrashVisitor.java | 2 +- threads/DeadlockingDiningPhilosophers.java | 2 +- threads/ExplicitCriticalSection.java | 1 + threads/FixedDiningPhilosophers.java | 2 +- threads/GreenhouseScheduler.java | 2 +- threads/HorseRace.java | 2 +- threads/PriorityBlockingQueueDemo.java | 2 +- threads/restaurant2/RestaurantWithQueues.java | 2 +- 27 files changed, 28 insertions(+), 25 deletions(-) create mode 100644 go.bat diff --git a/collections/EnvironmentVariables.java b/collections/EnvironmentVariables.java index 3b083bdaa..a8f7bb6ec 100644 --- a/collections/EnvironmentVariables.java +++ b/collections/EnvironmentVariables.java @@ -2,6 +2,7 @@ // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// {ValidateByHand} import java.util.*; public class EnvironmentVariables { @@ -12,4 +13,3 @@ public static void main(String[] args) { } } } -/* Output: (Execute to see) */ diff --git a/collectionsindepth/Lists.java b/collectionsindepth/Lists.java index 5cf731ac7..6280de57d 100644 --- a/collectionsindepth/Lists.java +++ b/collectionsindepth/Lists.java @@ -125,7 +125,7 @@ public static void main(String[] args) { testLinkedList(); } } -/* Output: (First and last 2 Lines) +/* Output: (First and Last 2 Lines) [ALGERIA, ANGOLA, BENIN, BOTSWANA, BURKINA FASO, BURUNDI, CAMEROON, CAPE VERDE, CENTRAL AFRICAN REPUBLIC, CHAD, COMOROS, CONGO, DJIBOUTI, EGYPT, EQUATORIAL GUINEA, diff --git a/collectionsindepth/References.java b/collectionsindepth/References.java index 55fd3d1b8..b1858d5e5 100644 --- a/collectionsindepth/References.java +++ b/collectionsindepth/References.java @@ -63,7 +63,7 @@ public static void main(String[] args) { } } } -/* Output: (First and last 10 Lines) +/* Output: (First and Last 10 Lines) Just created: java.lang.ref.SoftReference@19e0bfd Just created: java.lang.ref.SoftReference@139a55 Just created: java.lang.ref.SoftReference@1db9742 diff --git a/compression/GZIPcompress.java b/compression/GZIPcompress.java index b313a3ffa..9539c0b47 100644 --- a/compression/GZIPcompress.java +++ b/compression/GZIPcompress.java @@ -3,6 +3,7 @@ // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. // {Args: GZIPcompress.java} +// {ValidateByHand} import java.util.zip.*; import java.io.*; @@ -37,4 +38,3 @@ public class GZIPcompress { } } } -/* Output: (Execute to see) */ diff --git a/compression/ZipCompress.java b/compression/ZipCompress.java index 12fe04393..267f0fc26 100644 --- a/compression/ZipCompress.java +++ b/compression/ZipCompress.java @@ -5,6 +5,7 @@ // Uses Zip compression to compress any // number of files given on the command line // {Args: ZipCompress.java} +// {ValidateByHand} import java.util.zip.*; import java.io.*; import java.util.*; @@ -67,4 +68,3 @@ public class ZipCompress { } } } -/* Output: (Execute to see) */ diff --git a/control/WhileTest.java b/control/WhileTest.java index e3d044ded..0ab199148 100644 --- a/control/WhileTest.java +++ b/control/WhileTest.java @@ -16,7 +16,7 @@ public static void main(String[] args) { System.out.println("Exited 'while'"); } } -/* Output: (First and last 5 Lines) +/* Output: (First and Last 5 Lines) true, Inside 'while' true, Inside 'while' true, Inside 'while' diff --git a/go.bat b/go.bat new file mode 100644 index 000000000..957d931c9 --- /dev/null +++ b/go.bat @@ -0,0 +1,3 @@ +gradlew --parallel --daemon run > output.txt 2> errors.txt +START /min "C:\Program Files\Windows Media Player\wmplayer.exe" %windir%\media\Alarm07.wav +rem find . -size 0 -type f diff --git a/iostreams/BasicFileOutput.java b/iostreams/BasicFileOutput.java index 36a06c415..ee7d91e5b 100644 --- a/iostreams/BasicFileOutput.java +++ b/iostreams/BasicFileOutput.java @@ -2,6 +2,7 @@ // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// {ValidateByHand} import java.io.*; public class BasicFileOutput { @@ -23,4 +24,3 @@ public class BasicFileOutput { System.out.println(BufferedInputFile.read(file)); } } -/* Output: (Execute to see) */ diff --git a/iostreams/BufferedInputFile.java b/iostreams/BufferedInputFile.java index 950067992..5b9f5f0e3 100644 --- a/iostreams/BufferedInputFile.java +++ b/iostreams/BufferedInputFile.java @@ -2,6 +2,7 @@ // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// {ValidateByHand} import java.io.*; public class BufferedInputFile { @@ -21,4 +22,3 @@ public class BufferedInputFile { System.out.print(read("BufferedInputFile.java")); } } -/* Output: (Execute to see) */ diff --git a/iostreams/FileOutputShortcut.java b/iostreams/FileOutputShortcut.java index 6e7607f6b..b1f6c2c95 100644 --- a/iostreams/FileOutputShortcut.java +++ b/iostreams/FileOutputShortcut.java @@ -2,6 +2,7 @@ // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// {ValidateByHand} import java.io.*; public class FileOutputShortcut { @@ -22,4 +23,3 @@ public class FileOutputShortcut { System.out.println(BufferedInputFile.read(file)); } } -/* Output: (Execute to see) */ diff --git a/iostreams/FormattedMemoryInput.java b/iostreams/FormattedMemoryInput.java index aa60ec523..c61453acd 100644 --- a/iostreams/FormattedMemoryInput.java +++ b/iostreams/FormattedMemoryInput.java @@ -2,6 +2,7 @@ // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// {ValidateByHand} import java.io.*; public class FormattedMemoryInput { @@ -19,4 +20,3 @@ public class FormattedMemoryInput { } } } -/* Output: (Execute to see) */ diff --git a/iostreams/MemoryInput.java b/iostreams/MemoryInput.java index 9ef9e1f1d..d2cb05336 100644 --- a/iostreams/MemoryInput.java +++ b/iostreams/MemoryInput.java @@ -2,6 +2,7 @@ // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// {ValidateByHand} import java.io.*; public class MemoryInput { @@ -14,4 +15,3 @@ public class MemoryInput { System.out.print((char)c); } } -/* Output: (Execute to see) */ diff --git a/iostreams/TestEOF.java b/iostreams/TestEOF.java index e5cc1a1a9..aa1df1e6c 100644 --- a/iostreams/TestEOF.java +++ b/iostreams/TestEOF.java @@ -3,6 +3,7 @@ // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. // Testing for end of file +// {ValidateByHand} import java.io.*; public class TestEOF { @@ -16,4 +17,3 @@ public class TestEOF { } } } -/* Output: (Execute to see) */ diff --git a/onjava/ProcessFiles.java b/onjava/ProcessFiles.java index 973a2581e..a716fcca3 100644 --- a/onjava/ProcessFiles.java +++ b/onjava/ProcessFiles.java @@ -53,4 +53,3 @@ public static void main(String[] args) { "java").start(args); } } -/* Output: (Execute to see) */ diff --git a/patterns/doubledispatch/DoubleDispatch.java b/patterns/doubledispatch/DoubleDispatch.java index fb062dfa2..6b4974736 100644 --- a/patterns/doubledispatch/DoubleDispatch.java +++ b/patterns/doubledispatch/DoubleDispatch.java @@ -70,7 +70,7 @@ public static void main(String[] args) { Trash.sumValue(bin); } } -/* Output: (First and last 10 Lines) +/* Output: (First and Last 10 Lines) Loading patterns.doubledispatch.DDGlass Loading patterns.doubledispatch.DDPaper Loading patterns.doubledispatch.DDAluminum diff --git a/patterns/dynatrash/DynaTrash.java b/patterns/dynatrash/DynaTrash.java index 2e0136fb2..35262b0ad 100644 --- a/patterns/dynatrash/DynaTrash.java +++ b/patterns/dynatrash/DynaTrash.java @@ -49,7 +49,7 @@ public static void main(String[] args) { bin.values().forEach(Trash::sumValue); } } -/* Output: (First and last 10 Lines) +/* Output: (First and Last 10 Lines) Loading patterns.trash.Glass Loading patterns.trash.Paper Loading patterns.trash.Aluminum diff --git a/patterns/recyclea/RecycleA.java b/patterns/recyclea/RecycleA.java index c570c92c0..cf1e160e4 100644 --- a/patterns/recyclea/RecycleA.java +++ b/patterns/recyclea/RecycleA.java @@ -99,7 +99,7 @@ public static void main(String[] args) { Trash.sumValue(bin); } } -/* Output: (First and last 11 Lines) +/* Output: (First and Last 11 Lines) weight of patterns.recyclea.Aluminum = 0.11435456649761422 weight of patterns.recyclea.Aluminum = 0.5295954256745989 weight of patterns.recyclea.Aluminum = 0.44032876173820623 diff --git a/patterns/recycleb/RecycleB.java b/patterns/recycleb/RecycleB.java index ea41f1e79..bc2f87d75 100644 --- a/patterns/recycleb/RecycleB.java +++ b/patterns/recycleb/RecycleB.java @@ -31,7 +31,7 @@ public static void main(String[] args) { Trash.sumValue(bin); } } -/* Output: (First and last 10 Lines) +/* Output: (First and Last 10 Lines) Loading patterns.trash.Glass Loading patterns.trash.Paper Loading patterns.trash.Aluminum diff --git a/patterns/recyclec/RecycleC.java b/patterns/recyclec/RecycleC.java index 2d44d8c38..fa5c4fc09 100644 --- a/patterns/recyclec/RecycleC.java +++ b/patterns/recyclec/RecycleC.java @@ -59,7 +59,7 @@ public static void main(String[] args) { Trash.sumValue(bin); } } -/* Output: (First and last 10 Lines) +/* Output: (First and Last 10 Lines) Loading patterns.trash.Glass Loading patterns.trash.Paper Loading patterns.trash.Aluminum diff --git a/patterns/trashvisitor/TrashVisitor.java b/patterns/trashvisitor/TrashVisitor.java index a64501a61..52db0d88c 100644 --- a/patterns/trashvisitor/TrashVisitor.java +++ b/patterns/trashvisitor/TrashVisitor.java @@ -102,7 +102,7 @@ public static void main(String[] args) { visitors.forEach(Visitor::total); } } -/* Output: (First and last 10 Lines) +/* Output: (First and Last 10 Lines) Loading patterns.trashvisitor.Glass Loading patterns.trashvisitor.Paper Loading patterns.trashvisitor.Aluminum diff --git a/threads/DeadlockingDiningPhilosophers.java b/threads/DeadlockingDiningPhilosophers.java index 90613c2a3..d9464cd1a 100644 --- a/threads/DeadlockingDiningPhilosophers.java +++ b/threads/DeadlockingDiningPhilosophers.java @@ -31,7 +31,7 @@ public class DeadlockingDiningPhilosophers { es.shutdownNow(); } } -/* Output: (First and last 10 Lines) +/* Output: (First and Last 10 Lines) Philosopher 1 thinking Philosopher 1 grabbing right Philosopher 1 grabbing left diff --git a/threads/ExplicitCriticalSection.java b/threads/ExplicitCriticalSection.java index d1770e8ec..21bc41bf8 100644 --- a/threads/ExplicitCriticalSection.java +++ b/threads/ExplicitCriticalSection.java @@ -4,6 +4,7 @@ // Visit http://mindviewinc.com/Books/OnJava/ for more book information. // {ThrowsException} on a multiprocessor machine // Using explicit Lock objects to create critical sections +// {main: threads.ExplicitCriticalSection} package threads; import java.util.concurrent.locks.*; diff --git a/threads/FixedDiningPhilosophers.java b/threads/FixedDiningPhilosophers.java index ef6f34569..279e587f3 100644 --- a/threads/FixedDiningPhilosophers.java +++ b/threads/FixedDiningPhilosophers.java @@ -35,7 +35,7 @@ public class FixedDiningPhilosophers { es.shutdownNow(); } } -/* Output: (First and last 10 Lines) +/* Output: (First and Last 10 Lines) Philosopher 4 thinking Philosopher 3 thinking Philosopher 0 thinking diff --git a/threads/GreenhouseScheduler.java b/threads/GreenhouseScheduler.java index 3c0c47f48..d6f5876ba 100644 --- a/threads/GreenhouseScheduler.java +++ b/threads/GreenhouseScheduler.java @@ -168,7 +168,7 @@ public static void main(String[] args) { gh.repeat(gh.new CollectData(), 500, 500); } } -/* Output: (First and last 10 Lines) +/* Output: (First and Last 10 Lines) Bing! Thermostat to night setting Turning on lights diff --git a/threads/HorseRace.java b/threads/HorseRace.java index 9ab6eb6ce..fe8aa97a3 100644 --- a/threads/HorseRace.java +++ b/threads/HorseRace.java @@ -88,7 +88,7 @@ public static void main(String[] args) { new HorseRace(nHorses, pause); } } -/* Output: (First and last 18 Lines) +/* Output: (First and Last 18 Lines) =========================================================== ================ *0 diff --git a/threads/PriorityBlockingQueueDemo.java b/threads/PriorityBlockingQueueDemo.java index bd9414571..616ece024 100644 --- a/threads/PriorityBlockingQueueDemo.java +++ b/threads/PriorityBlockingQueueDemo.java @@ -127,7 +127,7 @@ public class PriorityBlockingQueueDemo { es.execute(new PrioritizedTaskConsumer(queue)); } } -/* Output: (First and last 12 Lines) +/* Output: (First and Last 12 Lines) [8 ] Task 0 [9 ] Task 5 [9 ] Task 13 diff --git a/threads/restaurant2/RestaurantWithQueues.java b/threads/restaurant2/RestaurantWithQueues.java index 85ebf0320..7b5083e92 100644 --- a/threads/restaurant2/RestaurantWithQueues.java +++ b/threads/restaurant2/RestaurantWithQueues.java @@ -206,7 +206,7 @@ public class RestaurantWithQueues { es.shutdownNow(); } } -/* Output: (First and last 10 Lines) +/* Output: (First and Last 10 Lines) WaitPerson 0 received SPRING_ROLLS delivering to Customer 1 Customer 1 eating SPRING_ROLLS WaitPerson 3 received SPRING_ROLLS delivering to Customer 0 From ede10f751bc3fd391418183ea3340eec7e760798 Mon Sep 17 00:00:00 2001 From: Bruce Eckel Date: Wed, 20 Jul 2016 13:13:02 -0600 Subject: [PATCH 044/320] Remove .out files without /* Output: line --- build.gradle | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/build.gradle b/build.gradle index 3a7f41e8c..a680304fb 100644 --- a/build.gradle +++ b/build.gradle @@ -162,8 +162,11 @@ subprojects { errorOutput = new TeeOutputStream(new FileOutputStream(errFile), System.err) } doLast { - if (outFile.size() == 0) outFile.delete() - if (errFile.size() == 0) errFile.delete() + if(outFile.size() == 0) + outFile.delete() + else if(!outFile.text.contains("/* Output:")) + outFile.delete() + if(errFile.size() == 0) errFile.delete() } } } From d6e63d4265bc0c3d56abd28934c07fc215101a9e Mon Sep 17 00:00:00 2001 From: Bruce Eckel Date: Fri, 22 Jul 2016 14:45:35 -0600 Subject: [PATCH 045/320] Auto-updated example output --- annotations/AtUnitComposition.java | 2 +- annotations/AtUnitExample1.java | 6 +- annotations/AtUnitExample4.java | 22 +++--- annotations/AtUnitExternalTest.java | 2 +- annotations/HashSetTest.java | 2 +- annotations/StackLStringTest.java | 2 +- annotations/database/TableCreator.java | 2 +- arrays/AlphabeticSearch.java | 11 +-- arrays/ArrayCopying.java | 12 +-- arrays/ArraySearching.java | 6 +- arrays/BadMicroBenchmark.java | 4 +- arrays/BadMicroBenchmark2.java | 4 +- arrays/BadMicroBenchmark3.java | 8 +- arrays/CompType.java | 20 ++--- arrays/ComparatorTest.java | 20 ++--- arrays/ComparingArrays.java | 6 +- arrays/CountUpward.java | 3 +- arrays/FillingArrays.java | 20 ++--- arrays/IceCream.java | 14 ++-- arrays/ModifyExisting.java | 5 +- arrays/ParallelPrefix.java | 2 +- arrays/ParallelSort.java | 4 +- arrays/RaggedArray.java | 5 +- arrays/Reverse.java | 20 ++--- arrays/StringSorting.java | 28 ++++--- arrays/TestRand.java | 4 +- assertions/Assert1.java | 3 +- assertions/Assert2.java | 1 - assertions/LoaderAssertions.java | 1 - .../ApplesAndOrangesWithoutGenerics.java | 5 +- collections/GenericsAndUpcasting.java | 8 +- collectionsindepth/Bits.java | 20 ++--- collectionsindepth/FillingLists.java | 9 ++- collectionsindepth/ListPerformance.java | 10 +-- collectionsindepth/Lists.java | 2 +- collectionsindepth/MapPerformance.java | 12 +-- collectionsindepth/References.java | 14 ++-- collectionsindepth/SetPerformance.java | 6 +- collectionsindepth/SpringDetector.java | 12 +-- collectionsindepth/SpringDetector2.java | 12 +-- .../SuppliersCollectionTest.java | 4 +- collectionsindepth/TypesForSets.java | 8 +- control/WhileTest.java | 4 +- debugging/SimpleDebugging.java | 1 - enums/ConstantSpecificMethod.java | 14 +--- enums/PostOffice.java | 72 +++++++++--------- enums/RandomTest.java | 6 +- enums/RoShamBo1.java | 26 +++---- enums/RoShamBo2.java | 26 +++---- enums/RoShamBo3.java | 26 +++---- enums/RoShamBo4.java | 26 +++---- enums/RoShamBo5.java | 26 +++---- enums/RoShamBo6.java | 26 +++---- enums/SecurityCategory.java | 10 +-- enums/cartoons/EnumImplementation.java | 4 +- enums/menu/Meal.java | 32 ++++---- enums/menu/Meal2.java | 32 ++++---- exceptions/ExtraFeatures.java | 12 +-- exceptions/LoggingExceptions.java | 5 +- exceptions/LoggingExceptions2.java | 3 +- exceptions/NeverCaught.java | 1 - files/AddAndSubtractPaths.java | 24 +++--- files/Directories.java | 14 ++-- files/File_System.java | 6 +- files/Find.java | 24 +++--- files/PartsOfPaths.java | 5 +- files/PathAnalysis.java | 8 +- files/PathInfo.java | 14 ++-- files/ReadLineStream.java | 2 +- files/TreeWatcher.java | 2 +- generics/DynamicProxyMixin.java | 2 +- generics/Mixins.java | 4 +- generics/PrimitiveGenericTest.java | 4 +- generics/TupleList.java | 4 +- generics/TupleTest.java | 6 +- generics/TupleTest2.java | 6 +- generics/WatercolorSets.java | 30 ++++---- housekeeping/NewVarArgs.java | 2 +- housekeeping/VarArgs.java | 2 +- innerclasses/GreenhouseController.java | 16 ++++ logging/ConfigureLogging.java | 63 ++++++++++------ logging/CustomHandler.java | 5 +- logging/InfoLogging.java | 3 +- logging/InfoLogging2.java | 3 +- logging/LogToFile.java | 3 +- logging/LogToFile2.java | 3 +- logging/LoggingLevelManipulation.java | 73 +++++++++---------- logging/LoggingLevels.java | 19 +++-- logging/MultipleHandlers.java | 5 +- logging/MultipleHandlers2.java | 3 +- logging/PrintableLogRecord.java | 2 +- logging/SimpleFilter.java | 9 +-- logging/SimpleFormatterExample.java | 1 - network/WhoAmI.java | 4 +- newio/BufferToText.java | 2 +- newio/LockingMappedFiles.java | 2 +- objects/HelloDate.java | 2 +- objects/ShowProperties.java | 10 +-- onjava/Hex.java | 12 +-- onjava/atunit/ClassNameFinder.java | 68 +++++++++++++++++ patterns/PaperScissorsRock.java | 26 +++---- patterns/doubledispatch/DoubleDispatch.java | 40 +++++----- patterns/dynatrash/DynaTrash.java | 22 +++--- patterns/recyclea/RecycleA.java | 46 ++++++------ patterns/recycleb/RecycleB.java | 2 +- patterns/recyclec/RecycleC.java | 2 +- patterns/trashvisitor/TrashVisitor.java | 2 +- patterns/visitor/BeeAndFlowers.java | 12 +-- phase1.py | 46 ++++++++++++ polymorphism/RTTI.java | 1 - preferences/PreferencesDemo.java | 8 +- references/Compete.java | 4 +- references/PassReferences.java | 4 +- serialization/AStoreCADState.java | 20 ++--- serialization/Logon.java | 6 +- serialization/MyWorld.java | 6 +- serialization/RecoverCADState.java | 20 ++--- serialization/Worm.java | 6 +- streams/ForEach.java | 2 +- strings/Conversion.java | 4 +- strings/JGrep.java | 18 +---- strings/TestRegularExpression.java | 2 - test_output.py | 31 ++++++++ threads/AtomicityTest.java | 2 +- threads/BankTellerSimulation.java | 21 +++--- threads/CachedThreadPool.java | 12 +-- threads/CachedThreadPool2.java | 20 ++--- threads/CachedThreadPool3.java | 10 +-- threads/CaptureUncaughtException.java | 15 ++-- threads/CarBuilder.java | 42 +++++++---- threads/CountingStream.java | 16 ++-- threads/CriticalSection.java | 3 +- threads/DeadlockingDiningPhilosophers.java | 22 +++--- threads/DelayQueueDemo.java | 18 ++--- threads/EvenSupplier.java | 7 +- threads/ExplicitCriticalSection.java | 26 +++---- threads/FixedDiningPhilosophers.java | 26 +++---- threads/GreenhouseScheduler.java | 42 +++++------ threads/HorseRace.java | 51 ++++++------- threads/MoreTasksAfterShutdown.java | 10 +-- threads/ParallelStreamPuzzle2.java | 1 + threads/ParallelStreamPuzzle3.java | 12 +-- threads/PriorityBlockingQueueDemo.java | 34 ++++----- threads/SerialNumberChecker.java | 3 +- threads/SettingDefaultHandler.java | 1 + threads/SingleThreadExecutor.java | 8 +- threads/Summing.java | 6 +- threads/Summing2.java | 6 +- threads/Summing3.java | 4 +- threads/Summing4.java | 2 +- threads/SyncObject.java | 8 +- threads/ToastOMatic.java | 16 +--- threads/WorkStealingPool.java | 14 ++-- threads/restaurant2/RestaurantWithQueues.java | 36 ++++----- typeinfo/PetCount3.java | 4 +- typeinfo/PetCount4.java | 4 +- update_extracted_example_output.py | 35 +++++++++ 157 files changed, 1121 insertions(+), 926 deletions(-) create mode 100644 phase1.py create mode 100644 test_output.py create mode 100644 update_extracted_example_output.py diff --git a/annotations/AtUnitComposition.java b/annotations/AtUnitComposition.java index f3ba4672d..f2be08966 100644 --- a/annotations/AtUnitComposition.java +++ b/annotations/AtUnitComposition.java @@ -21,8 +21,8 @@ public class AtUnitComposition { } /* Output: annotations.AtUnitComposition - . _methodOne . _methodTwo This is methodTwo + . _methodOne OK (2 tests) */ diff --git a/annotations/AtUnitExample1.java b/annotations/AtUnitExample1.java index dd10076d9..11bdc8003 100644 --- a/annotations/AtUnitExample1.java +++ b/annotations/AtUnitExample1.java @@ -28,11 +28,11 @@ public int methodTwo() { /* Output: annotations.AtUnitExample1 . anotherDisappointment (failed) - . methodOneTest - . failureTest (failed) - . m3 . m2 This is methodTwo + . m3 + . failureTest (failed) + . methodOneTest (5 tests) >>> 2 FAILURES <<< diff --git a/annotations/AtUnitExample4.java b/annotations/AtUnitExample4.java index 27af8fafc..aa408915e 100644 --- a/annotations/AtUnitExample4.java +++ b/annotations/AtUnitExample4.java @@ -57,15 +57,19 @@ public String scrambleWord() { } } /* Output: -starting annotations.AtUnitExample4 - . scramble1 'All' -lAl + . words 'All' +(failed) + . scramble1 'brontosauruses' +ntsaueorosurbs +(failed) + . scramble2 'are' +are +(failed) +(3 tests) - . scramble2 'brontosauruses' -tsaeborornussu - - . words 'are' - -OK (3 tests) +>>> 3 FAILURES <<< + annotations.AtUnitExample4: words + annotations.AtUnitExample4: scramble1 + annotations.AtUnitExample4: scramble2 */ diff --git a/annotations/AtUnitExternalTest.java b/annotations/AtUnitExternalTest.java index 9d9d90f16..eb78a551f 100644 --- a/annotations/AtUnitExternalTest.java +++ b/annotations/AtUnitExternalTest.java @@ -17,8 +17,8 @@ public class AtUnitExternalTest extends AtUnitExample1 { } /* Output: annotations.AtUnitExternalTest + . _methodOne . _methodTwo This is methodTwo - . _methodOne OK (2 tests) */ diff --git a/annotations/HashSetTest.java b/annotations/HashSetTest.java index 2d3285e99..f2cfd7eb9 100644 --- a/annotations/HashSetTest.java +++ b/annotations/HashSetTest.java @@ -26,8 +26,8 @@ public class HashSetTest { } /* Output: annotations.HashSetTest + . _remove . initialization . _contains - . _remove OK (3 tests) */ diff --git a/annotations/StackLStringTest.java b/annotations/StackLStringTest.java index 405aa4571..d4a81b545 100644 --- a/annotations/StackLStringTest.java +++ b/annotations/StackLStringTest.java @@ -31,8 +31,8 @@ public class StackLStringTest extends StackL { } /* Output: annotations.StackLStringTest - . _top . _push + . _top . _pop OK (3 tests) */ diff --git a/annotations/database/TableCreator.java b/annotations/database/TableCreator.java index 96ac8cafc..6001e07fd 100644 --- a/annotations/database/TableCreator.java +++ b/annotations/database/TableCreator.java @@ -99,5 +99,5 @@ CREATE TABLE MEMBER( FIRSTNAME VARCHAR(30), LASTNAME VARCHAR(50), AGE INT, - HANDLE VARCHAR(30) PRIMARY KEY); + REFERENCE VARCHAR(30) PRIMARY KEY); */ diff --git a/arrays/AlphabeticSearch.java b/arrays/AlphabeticSearch.java index 01c768c5b..6b5d87ee3 100644 --- a/arrays/AlphabeticSearch.java +++ b/arrays/AlphabeticSearch.java @@ -19,10 +19,11 @@ public static void main(String[] args) { } } /* Output: -[bkIna, cQrGs, cXZJo, dLsmw, eGZMm, EqUCB, gwsqP, hKcxr, -HLGEa, HqXum, HxxHv, JMRoE, JmzMs, Mesbt, MNvqe, nyGcF, -ogoYW, OneOE, OWZnT, RFJQA, rUkZP, sgqia, slJrL, suEcU, -uTpnX, vpfFv, WHkjU, xxEAJ, YNzbr, zDyCy] +[anmkkyh, bhmupju, btpenpc, cjwzmmr, cuxszgv, eloztdv, +ewcippc, ezdeklu, fcjpthl, fqmlgsh, gmeinne, hyoubzl, +jbvlgwc, jlxpqds, ljlbynx, mvducuj, qgekgly, skddcat, +taprwxz, uybypgp, vjsszkn, vniyapk, vqqakbm, vwodhcf, +ydpulcq, ygpoalk, yskvett, zehpfmm, zofmmvm, zrxmclh] Index: 10 -HxxHv +gmeinne */ diff --git a/arrays/ArrayCopying.java b/arrays/ArrayCopying.java index 52fa0ff4e..459aaa17c 100644 --- a/arrays/ArrayCopying.java +++ b/arrays/ArrayCopying.java @@ -69,12 +69,12 @@ public static void main(String[] args) { } } /* Output: -a1 = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14] -a1 = [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] -a2 = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14] -a2 = [0, 1, 2, 3, 4, 5, 6] -a2 = [0, 1, 2, 3, 4, 5, 6, 0, 0, 0, 0, 0] -a4 = [4, 5, 6, 7, 8, 9, 10, 11] +a1: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14] +a1: [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] +a2: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14] +a2: [0, 1, 2, 3, 4, 5, 6] +a2: [0, 1, 2, 3, 4, 5, 6, 0, 0, 0, 0, 0] +a4: [4, 5, 6, 7, 8, 9, 10, 11] [Sub0, Sub1, Sub2, Sub3, Sub4, Sub5, Sub6] [Sub0, Sub1, Sub2, Sub3, Sub4, Sub5, Sub6] java.lang.ArrayStoreException diff --git a/arrays/ArraySearching.java b/arrays/ArraySearching.java index 2868744b9..b76bade69 100644 --- a/arrays/ArraySearching.java +++ b/arrays/ArraySearching.java @@ -26,8 +26,8 @@ public static void main(String[] args) { } } /* Output: -Sorted array: [125, 267, 635, 650, 1131, 1506, 1634, -2400, 2766, 3063, 3768, 3941, 4720, 4762, 4948, 5070, -5682, 5807, 6177, 6193, 6656, 7021, 8479, 8737, 9954] +Sorted array: [125, 267, 635, 650, 1131, 1506, 1634, 2400, +2766, 3063, 3768, 3941, 4720, 4762, 4948, 5070, 5682, 5807, +6177, 6193, 6656, 7021, 8479, 8737, 9954] Location of 635 is 2, a[2] is 635 */ diff --git a/arrays/BadMicroBenchmark.java b/arrays/BadMicroBenchmark.java index 765df060d..99dfb05be 100644 --- a/arrays/BadMicroBenchmark.java +++ b/arrays/BadMicroBenchmark.java @@ -16,6 +16,6 @@ public static void main(String[] args) { } } /* Output: -setAll: 27 -parallelSetAll: 53 +setAll: 62 +parallelSetAll: 75 */ diff --git a/arrays/BadMicroBenchmark2.java b/arrays/BadMicroBenchmark2.java index b4db07002..f3b20c351 100644 --- a/arrays/BadMicroBenchmark2.java +++ b/arrays/BadMicroBenchmark2.java @@ -17,6 +17,6 @@ public static void main(String[] args) { } } /* Output: -parallelSetAll: 38 -setAll: 63 +parallelSetAll: 83 +setAll: 159 */ diff --git a/arrays/BadMicroBenchmark3.java b/arrays/BadMicroBenchmark3.java index aea7532c6..2160c7661 100644 --- a/arrays/BadMicroBenchmark3.java +++ b/arrays/BadMicroBenchmark3.java @@ -27,8 +27,8 @@ public static void main(String[] args) { } } /* Output: -parallelSetAll: 5150 -setAll: 649 -parallelSetAll: 277 -setAll: 246 +parallelSetAll: 4948 +setAll: 1204 +parallelSetAll: 405 +setAll: 557 */ diff --git a/arrays/CompType.java b/arrays/CompType.java index 70a1587e1..ae13e85ea 100644 --- a/arrays/CompType.java +++ b/arrays/CompType.java @@ -41,16 +41,16 @@ public static void main(String[] args) { } } /* Output: -before sorting: -[[i = 58, j = 55], [i = 93, j = 61], [i = 61, j = 29] -, [i = 68, j = 0], [i = 22, j = 7], [i = 88, j = 28] -, [i = 51, j = 89], [i = 9, j = 78], [i = 98, j = 61] -, [i = 20, j = 58], [i = 16, j = 40], [i = 11, j = 22] +Before sorting: [[i = 35, j = 37], [i = 41, j = 20], [i = +77, j = 79] +, [i = 56, j = 68], [i = 48, j = 93], [i = 70, j = 7] +, [i = 0, j = 25], [i = 62, j = 34], [i = 50, j = 82] +, [i = 31, j = 67], [i = 66, j = 54], [i = 21, j = 6] ] -after sorting: -[[i = 9, j = 78], [i = 11, j = 22], [i = 16, j = 40] -, [i = 20, j = 58], [i = 22, j = 7], [i = 51, j = 89] -, [i = 58, j = 55], [i = 61, j = 29], [i = 68, j = 0] -, [i = 88, j = 28], [i = 93, j = 61], [i = 98, j = 61] +After sorting: [[i = 0, j = 25], [i = 21, j = 6], [i = 31, +j = 67] +, [i = 35, j = 37], [i = 41, j = 20], [i = 48, j = 93] +, [i = 50, j = 82], [i = 56, j = 68], [i = 62, j = 34] +, [i = 66, j = 54], [i = 70, j = 7], [i = 77, j = 79] ] */ diff --git a/arrays/ComparatorTest.java b/arrays/ComparatorTest.java index 85abb45a8..07cc0a922 100644 --- a/arrays/ComparatorTest.java +++ b/arrays/ComparatorTest.java @@ -23,16 +23,16 @@ public static void main(String[] args) { } } /* Output: -before sorting: -[[i = 58, j = 55], [i = 93, j = 61], [i = 61, j = 29] -, [i = 68, j = 0], [i = 22, j = 7], [i = 88, j = 28] -, [i = 51, j = 89], [i = 9, j = 78], [i = 98, j = 61] -, [i = 20, j = 58], [i = 16, j = 40], [i = 11, j = 22] +Before sorting: [[i = 35, j = 37], [i = 41, j = 20], [i = +77, j = 79] +, [i = 56, j = 68], [i = 48, j = 93], [i = 70, j = 7] +, [i = 0, j = 25], [i = 62, j = 34], [i = 50, j = 82] +, [i = 31, j = 67], [i = 66, j = 54], [i = 21, j = 6] ] -after sorting: -[[i = 68, j = 0], [i = 22, j = 7], [i = 11, j = 22] -, [i = 88, j = 28], [i = 61, j = 29], [i = 16, j = 40] -, [i = 58, j = 55], [i = 20, j = 58], [i = 93, j = 61] -, [i = 98, j = 61], [i = 9, j = 78], [i = 51, j = 89] +After sorting: [[i = 21, j = 6], [i = 70, j = 7], [i = 41, +j = 20] +, [i = 0, j = 25], [i = 62, j = 34], [i = 35, j = 37] +, [i = 66, j = 54], [i = 31, j = 67], [i = 56, j = 68] +, [i = 77, j = 79], [i = 50, j = 82], [i = 48, j = 93] ] */ diff --git a/arrays/ComparingArrays.java b/arrays/ComparingArrays.java index bbdcdfe30..0a31fb9cf 100644 --- a/arrays/ComparingArrays.java +++ b/arrays/ComparingArrays.java @@ -52,9 +52,11 @@ public static void main(String[] args) { a1 == a2: false a1w == a2w: true a1w == a2w: false -[[], [YNzbrny], [YNzbrny, GcFOWZn], [YNzbrny, GcFOWZn, TcQrGse], [YNzbrny, GcFOWZn, TcQrGse, GZMmJMR]] +[[], [btpenpc], [btpenpc, cuxszgv], [btpenpc, cuxszgv, +gmeinne], [btpenpc, cuxszgv, gmeinne, eloztdv]] deepEquals(md1, md2): true md1 == md2: false -[[], [YNzbrny], [YNzbrny, GcFOWZn], [YNzbrny, GcFOWZn, TcQrGse], [YNzbrny, #$#$#$#, TcQrGse, GZMmJMR]] +[[], [btpenpc], [btpenpc, cuxszgv], [btpenpc, cuxszgv, +gmeinne], [btpenpc, #$#$#$#, gmeinne, eloztdv]] deepEquals(md1, md2): false */ diff --git a/arrays/CountUpward.java b/arrays/CountUpward.java index 490995837..79f7afa1c 100644 --- a/arrays/CountUpward.java +++ b/arrays/CountUpward.java @@ -19,5 +19,6 @@ public static void main(String[] args) { } } /* Output: -[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19] +[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, +17, 18, 19] */ diff --git a/arrays/FillingArrays.java b/arrays/FillingArrays.java index 9c27d8323..6a7a247cd 100644 --- a/arrays/FillingArrays.java +++ b/arrays/FillingArrays.java @@ -42,14 +42,14 @@ public static void main(String[] args) { } } /* Output: -a1 = [true, true, true, true, true, true] -a2 = [11, 11, 11, 11, 11, 11] -a3 = [x, x, x, x, x, x] -a4 = [17, 17, 17, 17, 17, 17] -a5 = [19, 19, 19, 19, 19, 19] -a6 = [23, 23, 23, 23, 23, 23] -a7 = [29.0, 29.0, 29.0, 29.0, 29.0, 29.0] -a8 = [47.0, 47.0, 47.0, 47.0, 47.0, 47.0] -a9 = [Hello, Hello, Hello, Hello, Hello, Hello] -a9 = [Hello, Hello, Hello, World, World, Hello] +a1: [true, true, true, true, true, true] +a2: [11, 11, 11, 11, 11, 11] +a3: [x, x, x, x, x, x] +a4: [17, 17, 17, 17, 17, 17] +a5: [19, 19, 19, 19, 19, 19] +a6: [23, 23, 23, 23, 23, 23] +a7: [29.0, 29.0, 29.0, 29.0, 29.0, 29.0] +a8: [47.0, 47.0, 47.0, 47.0, 47.0, 47.0] +a9: [Hello, Hello, Hello, Hello, Hello, Hello] +a9: [Hello, Hello, Hello, World, World, Hello] */ diff --git a/arrays/IceCream.java b/arrays/IceCream.java index 7ee32d7b7..3db2a2f4c 100644 --- a/arrays/IceCream.java +++ b/arrays/IceCream.java @@ -35,11 +35,11 @@ public static void main(String[] args) { } } /* Output: -[Rum Raisin, Mint Chip, Mocha Almond Fudge] -[Chocolate, Strawberry, Mocha Almond Fudge] -[Strawberry, Mint Chip, Mocha Almond Fudge] -[Rum Raisin, Vanilla Fudge Swirl, Mud Pie] -[Vanilla Fudge Swirl, Chocolate, Mocha Almond Fudge] -[Praline Cream, Strawberry, Mocha Almond Fudge] -[Mocha Almond Fudge, Strawberry, Mint Chip] +[Praline Cream, Mint Chip, Vanilla Fudge Swirl] +[Strawberry, Vanilla Fudge Swirl, Mud Pie] +[Chocolate, Strawberry, Vanilla Fudge Swirl] +[Rum Raisin, Praline Cream, Chocolate] +[Mint Chip, Rum Raisin, Mocha Almond Fudge] +[Mocha Almond Fudge, Mud Pie, Vanilla Fudge Swirl] +[Mocha Almond Fudge, Mud Pie, Mint Chip] */ diff --git a/arrays/ModifyExisting.java b/arrays/ModifyExisting.java index 3db997b11..1199c7056 100644 --- a/arrays/ModifyExisting.java +++ b/arrays/ModifyExisting.java @@ -16,6 +16,7 @@ public static void main(String[] args) { } } /* Output: -[0.73, 0.53, 0.16, 0.19, 0.52, 0.27, 0.26] -[0.0073, 0.0053, 0.0016, 0.0019, 0.0052, 0.0027, 0.0026] +[4.83, 2.89, 2.9, 1.97, 3.01, 0.18, 0.99] +[0.0483, 0.028900000000000002, 0.028999999999999998, +0.0197, 0.0301, 0.0018, 0.009899999999999999] */ diff --git a/arrays/ParallelPrefix.java b/arrays/ParallelPrefix.java index 987b9c51c..6c5a63cd1 100644 --- a/arrays/ParallelPrefix.java +++ b/arrays/ParallelPrefix.java @@ -18,5 +18,5 @@ public static void main(String[] args) { /* Output: First 20: 190 First 200: 19900 -All: 199999990000000 +All: 49999995000000 */ diff --git a/arrays/ParallelSort.java b/arrays/ParallelSort.java index 4b724c80f..009b56e0b 100644 --- a/arrays/ParallelSort.java +++ b/arrays/ParallelSort.java @@ -20,7 +20,7 @@ public static void main(String[] args) { } } /* Output: -sort(): 484 -parallelSort(): 149 +sort(): 864 +parallelSort(): 274 3 */ diff --git a/arrays/RaggedArray.java b/arrays/RaggedArray.java index 78125295c..b09d99b4e 100644 --- a/arrays/RaggedArray.java +++ b/arrays/RaggedArray.java @@ -21,7 +21,6 @@ public static void main(String[] args) { } } /* Output: -[[], [[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], []], [[26], [], [27]]] +[[[1], []], [[2, 3, 4, 5], [6]], [[7, 8, 9], [10, 11, 12], +[]]] */ diff --git a/arrays/Reverse.java b/arrays/Reverse.java index 729cf395b..1862dd524 100644 --- a/arrays/Reverse.java +++ b/arrays/Reverse.java @@ -17,16 +17,16 @@ public static void main(String[] args) { } } /* Output: -before sorting: -[[i = 58, j = 55], [i = 93, j = 61], [i = 61, j = 29] -, [i = 68, j = 0], [i = 22, j = 7], [i = 88, j = 28] -, [i = 51, j = 89], [i = 9, j = 78], [i = 98, j = 61] -, [i = 20, j = 58], [i = 16, j = 40], [i = 11, j = 22] +Before sorting: [[i = 35, j = 37], [i = 41, j = 20], [i = +77, j = 79] +, [i = 56, j = 68], [i = 48, j = 93], [i = 70, j = 7] +, [i = 0, j = 25], [i = 62, j = 34], [i = 50, j = 82] +, [i = 31, j = 67], [i = 66, j = 54], [i = 21, j = 6] ] -after sorting: -[[i = 98, j = 61], [i = 93, j = 61], [i = 88, j = 28] -, [i = 68, j = 0], [i = 61, j = 29], [i = 58, j = 55] -, [i = 51, j = 89], [i = 22, j = 7], [i = 20, j = 58] -, [i = 16, j = 40], [i = 11, j = 22], [i = 9, j = 78] +After sorting: [[i = 77, j = 79], [i = 70, j = 7], [i = 66, +j = 54] +, [i = 62, j = 34], [i = 56, j = 68], [i = 50, j = 82] +, [i = 48, j = 93], [i = 41, j = 20], [i = 35, j = 37] +, [i = 31, j = 67], [i = 21, j = 6], [i = 0, j = 25] ] */ diff --git a/arrays/StringSorting.java b/arrays/StringSorting.java index bbdac6df9..c07325a41 100644 --- a/arrays/StringSorting.java +++ b/arrays/StringSorting.java @@ -20,16 +20,20 @@ public static void main(String[] args) { } } /* Output: -Before sort: [YNzbr, nyGcF, OWZnT, cQrGs, eGZMm, JMRoE, -suEcU, OneOE, dLsmw, HLGEa, hKcxr, EqUCB, bkIna, Mesbt, -WHkjU, rUkZP, gwsqP, zDyCy, RFJQA, HxxHv] -After sort: [EqUCB, HLGEa, HxxHv, JMRoE, Mesbt, OWZnT, -OneOE, RFJQA, WHkjU, YNzbr, bkIna, cQrGs, dLsmw, eGZMm, -gwsqP, hKcxr, nyGcF, rUkZP, suEcU, zDyCy] -Reverse sort: [zDyCy, suEcU, rUkZP, nyGcF, hKcxr, gwsqP, -eGZMm, dLsmw, cQrGs, bkIna, YNzbr, WHkjU, RFJQA, OneOE, -OWZnT, Mesbt, JMRoE, HxxHv, HLGEa, EqUCB] -Case-insensitive sort: [bkIna, cQrGs, dLsmw, eGZMm, EqUCB, -gwsqP, hKcxr, HLGEa, HxxHv, JMRoE, Mesbt, nyGcF, OneOE, -OWZnT, RFJQA, rUkZP, suEcU, WHkjU, YNzbr, zDyCy] +Before sort: [btpenpc, cuxszgv, gmeinne, eloztdv, ewcippc, +ygpoalk, ljlbynx, taprwxz, bhmupju, cjwzmmr, anmkkyh, +fcjpthl, skddcat, jbvlgwc, mvducuj, ydpulcq, zehpfmm, +zrxmclh, qgekgly, hyoubzl] +After sort: [anmkkyh, bhmupju, btpenpc, cjwzmmr, cuxszgv, +eloztdv, ewcippc, fcjpthl, gmeinne, hyoubzl, jbvlgwc, +ljlbynx, mvducuj, qgekgly, skddcat, taprwxz, ydpulcq, +ygpoalk, zehpfmm, zrxmclh] +Reverse sort: [zrxmclh, zehpfmm, ygpoalk, ydpulcq, taprwxz, +skddcat, qgekgly, mvducuj, ljlbynx, jbvlgwc, hyoubzl, +gmeinne, fcjpthl, ewcippc, eloztdv, cuxszgv, cjwzmmr, +btpenpc, bhmupju, anmkkyh] +Case-insensitive sort: [anmkkyh, bhmupju, btpenpc, cjwzmmr, +cuxszgv, eloztdv, ewcippc, fcjpthl, gmeinne, hyoubzl, +jbvlgwc, ljlbynx, mvducuj, qgekgly, skddcat, taprwxz, +ydpulcq, ygpoalk, zehpfmm, zrxmclh] */ diff --git a/arrays/TestRand.java b/arrays/TestRand.java index 68eeefe4c..43e1695b4 100644 --- a/arrays/TestRand.java +++ b/arrays/TestRand.java @@ -177,13 +177,13 @@ public static void main(String[] args) { [4.83, 2.89, 2.9, 1.97, 3.01] [4.83, 2.89, 2.9, 1.97, 3.01, 0.18] [4.83, 2.89, 2.9, 1.97, 3.01, 0.18, 0.99] -[4.83, 2.89, 2.9, 1.97, 3.01, 0.18, 0.99] +[4.83, 2.89, 2.9, 1.97, 3.01, 0.18] [4.83, 2.89, 2.9, 1.97, 3.01, 0.18, 0.99, 8.28] String [btpenpc, cuxszgv, gmeinne, eloztdv] [btpenpc, cuxszgv, gmeinne, eloztdv, ewcippc] [btpenpc, cuxszgv, gmeinne, eloztdv, ewcippc, ygpoalk] -[btpe, npcc, uxsz, gvgm] +[btpe, npcc, uxsz, gvgm, einn, eelo] [btpe, npcc, uxsz, gvgm, einn] [btpe, npcc, uxsz, gvgm, einn, eelo] */ diff --git a/assertions/Assert1.java b/assertions/Assert1.java index 894bb19b6..1822490a1 100644 --- a/assertions/Assert1.java +++ b/assertions/Assert1.java @@ -15,6 +15,5 @@ public static void main(String[] args) { /* Output: ___[ Error Output ]___ Exception in thread "main" java.lang.AssertionError - at Assert1.main(Assert1.java:8) -___[ Exception is Expected ]___ + at Assert1.main(Assert1.java:9) */ diff --git a/assertions/Assert2.java b/assertions/Assert2.java index 0549ede0e..bccefc77a 100644 --- a/assertions/Assert2.java +++ b/assertions/Assert2.java @@ -16,5 +16,4 @@ public static void main(String[] args) { Exception in thread "main" java.lang.AssertionError: Here's a message saying what happened at Assert2.main(Assert2.java:8) -___[ Exception is Expected ]___ */ diff --git a/assertions/LoaderAssertions.java b/assertions/LoaderAssertions.java index 27914ed70..28b640ffa 100644 --- a/assertions/LoaderAssertions.java +++ b/assertions/LoaderAssertions.java @@ -24,5 +24,4 @@ public void go() { Loaded.go() at Loaded.go(LoaderAssertions.java:15) at LoaderAssertions.main(LoaderAssertions.java:9) -___[ Exception is Expected ]___ */ diff --git a/collections/ApplesAndOrangesWithoutGenerics.java b/collections/ApplesAndOrangesWithoutGenerics.java index 649dfbc4d..2b16df219 100644 --- a/collections/ApplesAndOrangesWithoutGenerics.java +++ b/collections/ApplesAndOrangesWithoutGenerics.java @@ -32,7 +32,6 @@ public static void main(String[] args) { ___[ Error Output ]___ Exception in thread "main" java.lang.ClassCastException: Orange cannot be cast to Apple - at ApplesAndOrangesWithoutGenerics.main(Unknown -Source) -___[ Exception is Expected ]___ + at ApplesAndOrangesWithoutGenerics.main(ApplesAndOr +angesWithoutGenerics.java:23) */ diff --git a/collections/GenericsAndUpcasting.java b/collections/GenericsAndUpcasting.java index 37853d37d..df42b729f 100644 --- a/collections/GenericsAndUpcasting.java +++ b/collections/GenericsAndUpcasting.java @@ -21,8 +21,8 @@ public static void main(String[] args) { } } /* Output: -GrannySmith@19e0bfd -Gala@139a55 -Fuji@1db9742 -Braeburn@106d69c +GrannySmith@1db9742 +Gala@106d69c +Fuji@52e922 +Braeburn@25154f */ diff --git a/collectionsindepth/Bits.java b/collectionsindepth/Bits.java index e51b836b9..6e85e60ea 100644 --- a/collectionsindepth/Bits.java +++ b/collectionsindepth/Bits.java @@ -60,18 +60,18 @@ public static void main(String[] args) { } } /* Output: -byte value: -107 -bits: {0, 2, 4, 7} -bit pattern: 1010100100000000000000000000000000000000000000 +byte value: 118 +bits: {1, 2, 4, 5, 6} +bit pattern: 0110111000000000000000000000000000000000000000 000000000000000000 -short value: 1302 -bits: {1, 2, 4, 8, 10} -bit pattern: 0110100010100000000000000000000000000000000000 +short value: 9795 +bits: {0, 1, 6, 9, 10, 13} +bit pattern: 1100001001100100000000000000000000000000000000 000000000000000000 -int value: -2014573909 -bits: {0, 1, 3, 5, 7, 9, 11, 18, 19, 21, 22, 23, 24, 25, -26, 31} -bit pattern: 1101010101010000001101111110000100000000000000 +int value: -645079414 +bits: {1, 3, 7, 9, 10, 11, 12, 14, 15, 18, 19, 23, 24, 27, +28, 30, 31} +bit pattern: 0101000101111011001100011001101100000000000000 000000000000000000 set bit 127: {127} set bit 255: {255} diff --git a/collectionsindepth/FillingLists.java b/collectionsindepth/FillingLists.java index 37f7b1bdd..b4c4640bc 100644 --- a/collectionsindepth/FillingLists.java +++ b/collectionsindepth/FillingLists.java @@ -24,8 +24,9 @@ public static void main(String[] args) { } } /* Output: -[StringAddress@19e0bfd Hello, StringAddress@19e0bfd Hello, -StringAddress@19e0bfd Hello, StringAddress@19e0bfd Hello] -[StringAddress@139a55 World!, StringAddress@139a55 World!, -StringAddress@139a55 World!, StringAddress@139a55 World!] +[StringAddress@1db9742 Hello, StringAddress@1db9742 Hello, +StringAddress@1db9742 Hello, StringAddress@1db9742 Hello] +[StringAddress@106d69c World!, StringAddress@106d69c +World!, StringAddress@106d69c World!, StringAddress@106d69c +World!] */ diff --git a/collectionsindepth/ListPerformance.java b/collectionsindepth/ListPerformance.java index 1b26773b1..083352d57 100644 --- a/collectionsindepth/ListPerformance.java +++ b/collectionsindepth/ListPerformance.java @@ -195,17 +195,17 @@ List initialize(int size) { /* Output: --- Array as List --- size get set - 100 19 20 + 100 44 44 --------------------- ArrayList --------------------- size add get set iteradd insert remove - 100 31 19 21 33 158 114 + 100 80 44 48 106 0 640 --------------------- LinkedList --------------------- size add get set iteradd insert remove - 100 30 44 45 77 143 56 + 100 80 106 94 177 0 120 ----------------------- Vector ----------------------- size add get set iteradd insert remove - 100 26 32 33 64 147 67 + 100 40 62 58 114 0 120 -------------------- Queue tests -------------------- size addFirst addLast rmFirst rmLast - 100 33 71 102 135 + 100 60 120 120 100 */ diff --git a/collectionsindepth/Lists.java b/collectionsindepth/Lists.java index 6280de57d..ecd55649b 100644 --- a/collectionsindepth/Lists.java +++ b/collectionsindepth/Lists.java @@ -136,7 +136,7 @@ public static void main(String[] args) { CHAD, COMOROS, CONGO, DJIBOUTI, EGYPT, EQUATORIAL GUINEA, ERITREA, ETHIOPIA, GABON, THE GAMBIA, GHANA, GUINEA, BISSAU, COTE D'IVOIR (IVORY COAST), KENYA, LESOTHO] -________...________...________...________...________ +...________...________...________...________... LESOTHO [ALGERIA, ANGOLA, BENIN, BOTSWANA, BURKINA FASO, BURUNDI, CAMEROON, CAPE VERDE, CENTRAL AFRICAN REPUBLIC, CHAD, diff --git a/collectionsindepth/MapPerformance.java b/collectionsindepth/MapPerformance.java index 1e26a728e..016725914 100644 --- a/collectionsindepth/MapPerformance.java +++ b/collectionsindepth/MapPerformance.java @@ -63,20 +63,20 @@ public static void main(String[] args) { /* Output: ---------- TreeMap ---------- size put get iterate - 100 86 47 9 + 100 228 128 25 ---------- HashMap ---------- size put get iterate - 100 25 10 12 + 100 68 26 35 ------- LinkedHashMap ------- size put get iterate - 100 27 8 6 + 100 70 35 18 ------ IdentityHashMap ------ size put get iterate - 100 51 47 13 + 100 128 126 38 -------- WeakHashMap -------- size put get iterate - 100 28 11 12 + 100 62 31 25 --------- Hashtable --------- size put get iterate - 100 31 21 13 + 100 56 30 20 */ diff --git a/collectionsindepth/References.java b/collectionsindepth/References.java index b1858d5e5..37610b04c 100644 --- a/collectionsindepth/References.java +++ b/collectionsindepth/References.java @@ -64,8 +64,6 @@ public static void main(String[] args) { } } /* Output: (First and Last 10 Lines) -Just created: java.lang.ref.SoftReference@19e0bfd -Just created: java.lang.ref.SoftReference@139a55 Just created: java.lang.ref.SoftReference@1db9742 Just created: java.lang.ref.SoftReference@106d69c Just created: java.lang.ref.SoftReference@52e922 @@ -74,15 +72,17 @@ public static void main(String[] args) { Just created: java.lang.ref.SoftReference@647e05 Just created: java.lang.ref.SoftReference@1909752 Just created: java.lang.ref.SoftReference@1f96302 -________...________...________...________...________ -Just created: java.lang.ref.PhantomReference@16f6e28 -In queue: null -Just created: java.lang.ref.PhantomReference@15fbaa4 -In queue: null +Just created: java.lang.ref.SoftReference@14eac69 +Just created: java.lang.ref.SoftReference@a57993 +...________...________...________...________... Just created: java.lang.ref.PhantomReference@1ee12a7 In queue: null Just created: java.lang.ref.PhantomReference@10bedb4 In queue: null Just created: java.lang.ref.PhantomReference@103dbd3 In queue: null +Just created: java.lang.ref.PhantomReference@167cf4d +In queue: null +Just created: java.lang.ref.PhantomReference@a987ac +In queue: null */ diff --git a/collectionsindepth/SetPerformance.java b/collectionsindepth/SetPerformance.java index 20bc0e77b..ab0520620 100644 --- a/collectionsindepth/SetPerformance.java +++ b/collectionsindepth/SetPerformance.java @@ -60,11 +60,11 @@ public static void main(String[] args) { /* Output: ------------- TreeSet ------------- size add contains iterate - 100 85 51 9 + 100 200 132 24 ------------- HashSet ------------- size add contains iterate - 100 27 12 12 + 100 76 32 34 ---------- LinkedHashSet ---------- size add contains iterate - 100 28 10 7 + 100 70 25 19 */ diff --git a/collectionsindepth/SpringDetector.java b/collectionsindepth/SpringDetector.java index 7a9e259c4..7a4aaa8b4 100644 --- a/collectionsindepth/SpringDetector.java +++ b/collectionsindepth/SpringDetector.java @@ -28,12 +28,12 @@ void detectSpring(Class type) throws Exception { } } /* Output: -map = {Groundhog #2=Early Spring!, Groundhog #3=Early -Spring!, Groundhog #1=Six more weeks of Winter!, Groundhog -#8=Six more weeks of Winter!, Groundhog #9=Six more weeks -of Winter!, Groundhog #6=Early Spring!, Groundhog #5=Early -Spring!, Groundhog #0=Six more weeks of Winter!, Groundhog -#7=Early Spring!, Groundhog #4=Six more weeks of Winter!} +map = {Groundhog #2=Early Spring!, Groundhog #5=Early +Spring!, Groundhog #6=Early Spring!, Groundhog #4=Early +Spring!, Groundhog #9=Six more weeks of Winter!, Groundhog +#8=Six more weeks of Winter!, Groundhog #0=Early Spring!, +Groundhog #1=Early Spring!, Groundhog #3=Early Spring!, +Groundhog #7=Six more weeks of Winter!} Looking up prediction for Groundhog #3 Key not found: Groundhog #3 */ diff --git a/collectionsindepth/SpringDetector2.java b/collectionsindepth/SpringDetector2.java index 4a2081cb6..830159bf5 100644 --- a/collectionsindepth/SpringDetector2.java +++ b/collectionsindepth/SpringDetector2.java @@ -11,12 +11,12 @@ public class SpringDetector2 { } } /* Output: -map = {Groundhog #0=Six more weeks of Winter!, Groundhog -#1=Six more weeks of Winter!, Groundhog #2=Early Spring!, -Groundhog #3=Early Spring!, Groundhog #4=Six more weeks of -Winter!, Groundhog #5=Early Spring!, Groundhog #6=Early -Spring!, Groundhog #7=Early Spring!, Groundhog #8=Six more -weeks of Winter!, Groundhog #9=Six more weeks of Winter!} +map = {Groundhog #0=Early Spring!, Groundhog #1=Early +Spring!, Groundhog #2=Early Spring!, Groundhog #3=Early +Spring!, Groundhog #4=Early Spring!, Groundhog #5=Early +Spring!, Groundhog #6=Early Spring!, Groundhog #7=Six more +weeks of Winter!, Groundhog #8=Six more weeks of Winter!, +Groundhog #9=Six more weeks of Winter!} Looking up prediction for Groundhog #3 Early Spring! */ diff --git a/collectionsindepth/SuppliersCollectionTest.java b/collectionsindepth/SuppliersCollectionTest.java index f11c71a37..4c4d447a0 100644 --- a/collectionsindepth/SuppliersCollectionTest.java +++ b/collectionsindepth/SuppliersCollectionTest.java @@ -51,8 +51,8 @@ public static void main(String[] args) { is, no, basis, for, a, system, of, government] [strange, women, lying, in, ponds, distributing, swords, is, no, basis, for, a, system, of, government] -[ponds, no, a, in, swords, for, is, basis, strange, -system, government, distributing, of, women, lying] +[ponds, no, a, in, swords, for, is, basis, strange, system, +government, distributing, of, women, lying] [strange, women, lying, in, ponds, distributing, swords, is, no, basis, for, a, system, of, government] [strange, women, lying, in, ponds, distributing, swords, diff --git a/collectionsindepth/TypesForSets.java b/collectionsindepth/TypesForSets.java index 99961c656..7fe2ea171 100644 --- a/collectionsindepth/TypesForSets.java +++ b/collectionsindepth/TypesForSets.java @@ -71,10 +71,10 @@ public static void main(String[] args) { [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] [9, 8, 7, 6, 5, 4, 3, 2, 1, 0] -[6, 9, 2, 0, 8, 5, 4, 8, 0, 2, 7, 8, 9, 1, 4, 5, 0, 4, 3, -1, 6, 3, 2, 7, 7, 6, 5, 3, 9, 1] -[7, 2, 8, 9, 1, 7, 4, 1, 2, 3, 0, 9, 1, 8, 3, 0, 8, 5, 6, -6, 3, 0, 2, 7, 5, 4, 6, 4, 5, 9] +[8, 6, 3, 5, 4, 2, 2, 1, 0, 3, 6, 7, 9, 1, 3, 1, 5, 0, 9, +8, 0, 9, 8, 7, 4, 6, 2, 4, 7, 5] +[2, 2, 1, 4, 6, 6, 8, 4, 9, 3, 0, 4, 8, 5, 8, 1, 7, 5, 5, +3, 1, 9, 6, 0, 7, 0, 9, 7, 2, 3] [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9] [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, diff --git a/control/WhileTest.java b/control/WhileTest.java index 0ab199148..a85418d75 100644 --- a/control/WhileTest.java +++ b/control/WhileTest.java @@ -7,7 +7,7 @@ public class WhileTest { static boolean condition() { boolean result = Math.random() < 0.99; - System.out.println(result + ", "); + System.out.print(result + ", "); return result; } public static void main(String[] args) { @@ -22,7 +22,7 @@ public static void main(String[] args) { true, Inside 'while' true, Inside 'while' true, Inside 'while' -________...________...________...________...________ +...________...________...________...________... true, Inside 'while' true, Inside 'while' true, Inside 'while' diff --git a/debugging/SimpleDebugging.java b/debugging/SimpleDebugging.java index 74846b8d3..4a78dc95c 100644 --- a/debugging/SimpleDebugging.java +++ b/debugging/SimpleDebugging.java @@ -33,5 +33,4 @@ public static void main(String[] args) { at SimpleDebugging.foo2(SimpleDebugging.java:10) at SimpleDebugging.foo1(SimpleDebugging.java:6) at SimpleDebugging.main(SimpleDebugging.java:19) -___[ Exception is Expected ]___ */ diff --git a/enums/ConstantSpecificMethod.java b/enums/ConstantSpecificMethod.java index 974acf7c6..c4be5a7be 100644 --- a/enums/ConstantSpecificMethod.java +++ b/enums/ConstantSpecificMethod.java @@ -32,14 +32,8 @@ public static void main(String[] args) { } } /* Output: -Dec 13, 2015 -.;..;C:\Program Files (x86)\Java\xom-1.2.10.jar;C:\Program -Files (x86)\Java\jdk1.8.0_45\lib\tools.jar;C:\Program Files -(x86)\Java\jre1.8.0_45\lib\javaws.jar;C:\Program Files -(x86)\Java\swt-4.4.2-win32-win32-x86\swt.jar;C:\Program -Files (x86)\Java\javassist.jar;C:\Users\Bruce\Documents\Git -Hub\OnJava\ExtractedExamples;C:\Program Files -(x86)\Java\junit-4.12.jar;C:\Program Files -(x86)\Java\hamcrest-core-1.3.jar; -1.8.0_66 +Jul 22, 2016 +C:\Users\Bruce\Documents\GitHub\on- +java\ExtractedExamples\\gradle\wrapper\gradle-wrapper.jar +1.8.0_77 */ diff --git a/enums/PostOffice.java b/enums/PostOffice.java index 7b1837e47..b975b9048 100644 --- a/enums/PostOffice.java +++ b/enums/PostOffice.java @@ -137,54 +137,54 @@ public static void main(String[] args) { } } /* Output: -Mail 0, General Delivery: NO2, Address Scanability: -UNSCANNABLE, Address Readability: YES3, Address Address: -OK1, Return address: OK1 -Delivering Mail 0 normally +Mail 0, General Delivery: NO3, Address Scanability: YES2, +Address Readability: YES1, Address Address: OK4, Return +address: OK5 +Delivering Mail 0 automatically ***** -Mail 1, General Delivery: NO5, Address Scanability: YES3, -Address Readability: ILLEGIBLE, Address Address: OK5, -Return address: OK1 +Mail 1, General Delivery: NO1, Address Scanability: YES1, +Address Readability: YES3, Address Address: OK6, Return +address: OK1 Delivering Mail 1 automatically ***** -Mail 2, General Delivery: YES, Address Scanability: YES3, -Address Readability: YES1, Address Address: OK1, Return -address: OK5 -Using general delivery for Mail 2 +Mail 2, General Delivery: NO4, Address Scanability: YES2, +Address Readability: ILLEGIBLE, Address Address: OK5, +Return address: MISSING +Delivering Mail 2 automatically ***** -Mail 3, General Delivery: NO4, Address Scanability: YES3, -Address Readability: YES1, Address Address: INCORRECT, -Return address: OK4 -Returning Mail 3 to sender +Mail 3, General Delivery: YES, Address Scanability: +UNSCANNABLE, Address Readability: YES2, Address Address: +OK6, Return address: OK1 +Using general delivery for Mail 3 ***** -Mail 4, General Delivery: NO4, Address Scanability: -UNSCANNABLE, Address Readability: YES1, Address Address: -INCORRECT, Return address: OK2 -Returning Mail 4 to sender +Mail 4, General Delivery: YES, Address Scanability: YES4, +Address Readability: YES1, Address Address: OK6, Return +address: OK5 +Using general delivery for Mail 4 ***** -Mail 5, General Delivery: NO3, Address Scanability: YES1, -Address Readability: ILLEGIBLE, Address Address: OK4, -Return address: OK2 +Mail 5, General Delivery: NO5, Address Scanability: YES3, +Address Readability: YES3, Address Address: OK1, Return +address: OK4 Delivering Mail 5 automatically ***** -Mail 6, General Delivery: YES, Address Scanability: YES4, -Address Readability: ILLEGIBLE, Address Address: OK4, -Return address: OK4 +Mail 6, General Delivery: YES, Address Scanability: +UNSCANNABLE, Address Readability: YES1, Address Address: +OK3, Return address: MISSING Using general delivery for Mail 6 ***** -Mail 7, General Delivery: YES, Address Scanability: YES3, -Address Readability: YES4, Address Address: OK2, Return +Mail 7, General Delivery: NO4, Address Scanability: YES1, +Address Readability: YES2, Address Address: OK2, Return address: MISSING -Using general delivery for Mail 7 +Delivering Mail 7 automatically ***** -Mail 8, General Delivery: NO3, Address Scanability: YES1, -Address Readability: YES3, Address Address: INCORRECT, -Return address: MISSING -Mail 8 is a dead letter +Mail 8, General Delivery: NO1, Address Scanability: YES2, +Address Readability: YES3, Address Address: OK3, Return +address: OK3 +Delivering Mail 8 automatically ***** -Mail 9, General Delivery: NO1, Address Scanability: -UNSCANNABLE, Address Readability: YES2, Address Address: -OK1, Return address: OK4 -Delivering Mail 9 normally +Mail 9, General Delivery: NO5, Address Scanability: YES1, +Address Readability: YES3, Address Address: OK2, Return +address: OK3 +Delivering Mail 9 automatically ***** */ diff --git a/enums/RandomTest.java b/enums/RandomTest.java index 70dbc4436..aae5cabaa 100644 --- a/enums/RandomTest.java +++ b/enums/RandomTest.java @@ -15,7 +15,7 @@ public static void main(String[] args) { } } /* Output: -STANDING FLYING RUNNING STANDING RUNNING STANDING LYING -DODGING SITTING RUNNING HOPPING HOPPING HOPPING RUNNING -STANDING LYING FALLING RUNNING FLYING LYING +JUMPING DODGING SITTING RUNNING FLYING RUNNING DODGING +STANDING DODGING FALLING FALLING SITTING DODGING LYING +JUMPING JUMPING HOPPING DODGING SITTING FALLING */ diff --git a/enums/RoShamBo1.java b/enums/RoShamBo1.java index 62899404b..a4f3c435f 100644 --- a/enums/RoShamBo1.java +++ b/enums/RoShamBo1.java @@ -81,24 +81,24 @@ public static void main(String[] args) { } } /* Output: -Rock vs. Rock: DRAW -Paper vs. Rock: WIN -Paper vs. Rock: WIN -Paper vs. Rock: WIN -Scissors vs. Paper: WIN -Scissors vs. Scissors: DRAW +Scissors vs. Rock: LOSE Scissors vs. Paper: WIN Rock vs. Paper: LOSE -Paper vs. Paper: DRAW +Rock vs. Rock: DRAW Rock vs. Paper: LOSE Paper vs. Scissors: LOSE -Paper vs. Scissors: LOSE -Rock vs. Scissors: WIN Rock vs. Paper: LOSE -Paper vs. Rock: WIN +Scissors vs. Scissors: DRAW +Scissors vs. Rock: LOSE Scissors vs. Paper: WIN +Scissors vs. Rock: LOSE Paper vs. Scissors: LOSE -Paper vs. Scissors: LOSE -Paper vs. Scissors: LOSE -Paper vs. Scissors: LOSE +Rock vs. Rock: DRAW +Scissors vs. Scissors: DRAW +Paper vs. Paper: DRAW +Scissors vs. Paper: WIN +Scissors vs. Rock: LOSE +Scissors vs. Paper: WIN +Rock vs. Paper: LOSE +Rock vs. Scissors: WIN */ diff --git a/enums/RoShamBo2.java b/enums/RoShamBo2.java index b5dfd9a96..7538c879f 100644 --- a/enums/RoShamBo2.java +++ b/enums/RoShamBo2.java @@ -31,24 +31,24 @@ public static void main(String[] args) { } } /* Output: -ROCK vs. ROCK: DRAW -SCISSORS vs. ROCK: LOSE -SCISSORS vs. ROCK: LOSE -SCISSORS vs. ROCK: LOSE -PAPER vs. SCISSORS: LOSE -PAPER vs. PAPER: DRAW +PAPER vs. ROCK: WIN PAPER vs. SCISSORS: LOSE ROCK vs. SCISSORS: WIN -SCISSORS vs. SCISSORS: DRAW +ROCK vs. ROCK: DRAW ROCK vs. SCISSORS: WIN SCISSORS vs. PAPER: WIN -SCISSORS vs. PAPER: WIN -ROCK vs. PAPER: LOSE ROCK vs. SCISSORS: WIN -SCISSORS vs. ROCK: LOSE +PAPER vs. PAPER: DRAW +PAPER vs. ROCK: WIN PAPER vs. SCISSORS: LOSE +PAPER vs. ROCK: WIN SCISSORS vs. PAPER: WIN -SCISSORS vs. PAPER: WIN -SCISSORS vs. PAPER: WIN -SCISSORS vs. PAPER: WIN +ROCK vs. ROCK: DRAW +PAPER vs. PAPER: DRAW +SCISSORS vs. SCISSORS: DRAW +PAPER vs. SCISSORS: LOSE +PAPER vs. ROCK: WIN +PAPER vs. SCISSORS: LOSE +ROCK vs. SCISSORS: WIN +ROCK vs. PAPER: LOSE */ diff --git a/enums/RoShamBo3.java b/enums/RoShamBo3.java index 72782beac..90df039be 100644 --- a/enums/RoShamBo3.java +++ b/enums/RoShamBo3.java @@ -48,24 +48,24 @@ public static void main(String[] args) { } } /* Output: -ROCK vs. ROCK: DRAW -SCISSORS vs. ROCK: LOSE -SCISSORS vs. ROCK: LOSE -SCISSORS vs. ROCK: LOSE -PAPER vs. SCISSORS: LOSE -PAPER vs. PAPER: DRAW +PAPER vs. ROCK: WIN PAPER vs. SCISSORS: LOSE ROCK vs. SCISSORS: WIN -SCISSORS vs. SCISSORS: DRAW +ROCK vs. ROCK: DRAW ROCK vs. SCISSORS: WIN SCISSORS vs. PAPER: WIN -SCISSORS vs. PAPER: WIN -ROCK vs. PAPER: LOSE ROCK vs. SCISSORS: WIN -SCISSORS vs. ROCK: LOSE +PAPER vs. PAPER: DRAW +PAPER vs. ROCK: WIN PAPER vs. SCISSORS: LOSE +PAPER vs. ROCK: WIN SCISSORS vs. PAPER: WIN -SCISSORS vs. PAPER: WIN -SCISSORS vs. PAPER: WIN -SCISSORS vs. PAPER: WIN +ROCK vs. ROCK: DRAW +PAPER vs. PAPER: DRAW +SCISSORS vs. SCISSORS: DRAW +PAPER vs. SCISSORS: LOSE +PAPER vs. ROCK: WIN +PAPER vs. SCISSORS: LOSE +ROCK vs. SCISSORS: WIN +ROCK vs. PAPER: LOSE */ diff --git a/enums/RoShamBo4.java b/enums/RoShamBo4.java index 473ea8e96..b80a55e9b 100644 --- a/enums/RoShamBo4.java +++ b/enums/RoShamBo4.java @@ -34,24 +34,24 @@ public static void main(String[] args) { } } /* Output: -PAPER vs. PAPER: DRAW -SCISSORS vs. PAPER: WIN -SCISSORS vs. PAPER: WIN -SCISSORS vs. PAPER: WIN -ROCK vs. SCISSORS: WIN -ROCK vs. ROCK: DRAW +ROCK vs. PAPER: LOSE ROCK vs. SCISSORS: WIN PAPER vs. SCISSORS: LOSE -SCISSORS vs. SCISSORS: DRAW +PAPER vs. PAPER: DRAW PAPER vs. SCISSORS: LOSE SCISSORS vs. ROCK: LOSE -SCISSORS vs. ROCK: LOSE -PAPER vs. ROCK: WIN PAPER vs. SCISSORS: LOSE -SCISSORS vs. PAPER: WIN +ROCK vs. ROCK: DRAW +ROCK vs. PAPER: LOSE ROCK vs. SCISSORS: WIN +ROCK vs. PAPER: LOSE SCISSORS vs. ROCK: LOSE -SCISSORS vs. ROCK: LOSE -SCISSORS vs. ROCK: LOSE -SCISSORS vs. ROCK: LOSE +PAPER vs. PAPER: DRAW +ROCK vs. ROCK: DRAW +SCISSORS vs. SCISSORS: DRAW +ROCK vs. SCISSORS: WIN +ROCK vs. PAPER: LOSE +ROCK vs. SCISSORS: WIN +PAPER vs. SCISSORS: LOSE +PAPER vs. ROCK: WIN */ diff --git a/enums/RoShamBo5.java b/enums/RoShamBo5.java index 4d6e7b535..78f805071 100644 --- a/enums/RoShamBo5.java +++ b/enums/RoShamBo5.java @@ -36,24 +36,24 @@ public static void main(String[] args) { } } /* Output: -ROCK vs. ROCK: DRAW -SCISSORS vs. ROCK: LOSE -SCISSORS vs. ROCK: LOSE -SCISSORS vs. ROCK: LOSE -PAPER vs. SCISSORS: LOSE -PAPER vs. PAPER: DRAW +PAPER vs. ROCK: WIN PAPER vs. SCISSORS: LOSE ROCK vs. SCISSORS: WIN -SCISSORS vs. SCISSORS: DRAW +ROCK vs. ROCK: DRAW ROCK vs. SCISSORS: WIN SCISSORS vs. PAPER: WIN -SCISSORS vs. PAPER: WIN -ROCK vs. PAPER: LOSE ROCK vs. SCISSORS: WIN -SCISSORS vs. ROCK: LOSE +PAPER vs. PAPER: DRAW +PAPER vs. ROCK: WIN PAPER vs. SCISSORS: LOSE +PAPER vs. ROCK: WIN SCISSORS vs. PAPER: WIN -SCISSORS vs. PAPER: WIN -SCISSORS vs. PAPER: WIN -SCISSORS vs. PAPER: WIN +ROCK vs. ROCK: DRAW +PAPER vs. PAPER: DRAW +SCISSORS vs. SCISSORS: DRAW +PAPER vs. SCISSORS: LOSE +PAPER vs. ROCK: WIN +PAPER vs. SCISSORS: LOSE +ROCK vs. SCISSORS: WIN +ROCK vs. PAPER: LOSE */ diff --git a/enums/RoShamBo6.java b/enums/RoShamBo6.java index 90fba9e1c..b59a05eb1 100644 --- a/enums/RoShamBo6.java +++ b/enums/RoShamBo6.java @@ -23,24 +23,24 @@ public static void main(String[] args) { } } /* Output: -ROCK vs. ROCK: DRAW -SCISSORS vs. ROCK: LOSE -SCISSORS vs. ROCK: LOSE -SCISSORS vs. ROCK: LOSE -PAPER vs. SCISSORS: LOSE -PAPER vs. PAPER: DRAW +PAPER vs. ROCK: WIN PAPER vs. SCISSORS: LOSE ROCK vs. SCISSORS: WIN -SCISSORS vs. SCISSORS: DRAW +ROCK vs. ROCK: DRAW ROCK vs. SCISSORS: WIN SCISSORS vs. PAPER: WIN -SCISSORS vs. PAPER: WIN -ROCK vs. PAPER: LOSE ROCK vs. SCISSORS: WIN -SCISSORS vs. ROCK: LOSE +PAPER vs. PAPER: DRAW +PAPER vs. ROCK: WIN PAPER vs. SCISSORS: LOSE +PAPER vs. ROCK: WIN SCISSORS vs. PAPER: WIN -SCISSORS vs. PAPER: WIN -SCISSORS vs. PAPER: WIN -SCISSORS vs. PAPER: WIN +ROCK vs. ROCK: DRAW +PAPER vs. PAPER: DRAW +SCISSORS vs. SCISSORS: DRAW +PAPER vs. SCISSORS: LOSE +PAPER vs. ROCK: WIN +PAPER vs. SCISSORS: LOSE +ROCK vs. SCISSORS: WIN +ROCK vs. PAPER: LOSE */ diff --git a/enums/SecurityCategory.java b/enums/SecurityCategory.java index 357980d62..469af033a 100644 --- a/enums/SecurityCategory.java +++ b/enums/SecurityCategory.java @@ -28,14 +28,14 @@ public static void main(String[] args) { } } /* Output: -BOND: MUNICIPAL -BOND: MUNICIPAL -STOCK: MARGIN STOCK: MARGIN -BOND: JUNK -STOCK: SHORT STOCK: LONG STOCK: LONG +STOCK: MARGIN BOND: MUNICIPAL +BOND: MUNICIPAL +STOCK: LONG +BOND: JUNK +STOCK: MARGIN BOND: JUNK */ diff --git a/enums/cartoons/EnumImplementation.java b/enums/cartoons/EnumImplementation.java index 71e1bbbaa..5164b0d03 100644 --- a/enums/cartoons/EnumImplementation.java +++ b/enums/cartoons/EnumImplementation.java @@ -30,6 +30,6 @@ public static void main(String[] args) { } } /* Output: -BOB, PUNCHY, BOB, SPANKY, NUTTY, PUNCHY, SLAPPY, NUTTY, -NUTTY, SLAPPY, +SILLY, SPANKY, PUNCHY, BOUNCY, BOB, SLAPPY, SLAPPY, BOB, +BOB, SLAPPY, */ diff --git a/enums/menu/Meal.java b/enums/menu/Meal.java index a7d6334ca..7d6cb8d34 100644 --- a/enums/menu/Meal.java +++ b/enums/menu/Meal.java @@ -17,29 +17,29 @@ public static void main(String[] args) { } } /* Output: -SPRING_ROLLS +SALAD VINDALOO -FRUIT -DECAF_COFFEE +GELATO +CAPPUCCINO --- -SOUP -VINDALOO -FRUIT -TEA +SPRING_ROLLS +BURRITO +GELATO +HERB_TEA --- -SALAD +SPRING_ROLLS BURRITO -FRUIT -TEA +TIRAMISU +CAPPUCCINO --- -SALAD +SPRING_ROLLS BURRITO -CREME_CARAMEL +BLACK_FOREST_CAKE LATTE --- -SOUP -BURRITO -TIRAMISU -ESPRESSO +SALAD +PAD_THAI +GELATO +TEA --- */ diff --git a/enums/menu/Meal2.java b/enums/menu/Meal2.java index b0a7dc401..a0aaf84f7 100644 --- a/enums/menu/Meal2.java +++ b/enums/menu/Meal2.java @@ -46,29 +46,29 @@ public static void main(String[] args) { } } /* Output: -SPRING_ROLLS +SALAD VINDALOO -FRUIT -DECAF_COFFEE +GELATO +CAPPUCCINO --- -SOUP -VINDALOO -FRUIT -TEA +SPRING_ROLLS +BURRITO +GELATO +HERB_TEA --- -SALAD +SPRING_ROLLS BURRITO -FRUIT -TEA +TIRAMISU +CAPPUCCINO --- -SALAD +SPRING_ROLLS BURRITO -CREME_CARAMEL +BLACK_FOREST_CAKE LATTE --- -SOUP -BURRITO -TIRAMISU -ESPRESSO +SALAD +PAD_THAI +GELATO +TEA --- */ diff --git a/exceptions/ExtraFeatures.java b/exceptions/ExtraFeatures.java index 57200ce9c..1dc318f05 100644 --- a/exceptions/ExtraFeatures.java +++ b/exceptions/ExtraFeatures.java @@ -55,15 +55,15 @@ public static void main(String[] args) { /* Output: Throwing MyException2 from f() MyException2: Detail Message: 0 null - at ExtraFeatures.f(ExtraFeatures.java:22) - at ExtraFeatures.main(ExtraFeatures.java:34) + at ExtraFeatures.f(ExtraFeatures.java:23) + at ExtraFeatures.main(ExtraFeatures.java:35) Throwing MyException2 from g() MyException2: Detail Message: 0 Originated in g() - at ExtraFeatures.g(ExtraFeatures.java:26) - at ExtraFeatures.main(ExtraFeatures.java:39) + at ExtraFeatures.g(ExtraFeatures.java:27) + at ExtraFeatures.main(ExtraFeatures.java:40) Throwing MyException2 from h() MyException2: Detail Message: 47 Originated in h() - at ExtraFeatures.h(ExtraFeatures.java:30) - at ExtraFeatures.main(ExtraFeatures.java:44) + at ExtraFeatures.h(ExtraFeatures.java:31) + at ExtraFeatures.main(ExtraFeatures.java:45) e.val() = 47 */ diff --git a/exceptions/LoggingExceptions.java b/exceptions/LoggingExceptions.java index 2fe1f0243..b70a87443 100644 --- a/exceptions/LoggingExceptions.java +++ b/exceptions/LoggingExceptions.java @@ -33,17 +33,16 @@ public static void main(String[] args) { } /* Output: ___[ Error Output ]___ -Dec 15, 2015 10:34:24 PM LoggingException +Jul 22, 2016 11:55:45 AM LoggingException SEVERE: LoggingException at LoggingExceptions.main(LoggingExceptions.java:20) Caught LoggingException -Dec 15, 2015 10:34:24 PM LoggingException +Jul 22, 2016 11:55:45 AM LoggingException SEVERE: LoggingException at LoggingExceptions.main(LoggingExceptions.java:25) Caught LoggingException -___[ Error Output is Expected ]___ */ diff --git a/exceptions/LoggingExceptions2.java b/exceptions/LoggingExceptions2.java index ae7cffd42..b5c2ccefd 100644 --- a/exceptions/LoggingExceptions2.java +++ b/exceptions/LoggingExceptions2.java @@ -25,9 +25,8 @@ public static void main(String[] args) { } /* Output: ___[ Error Output ]___ -Dec 15, 2015 10:34:25 PM LoggingExceptions2 logException +Jul 22, 2016 11:55:47 AM LoggingExceptions2 logException SEVERE: java.lang.NullPointerException at LoggingExceptions2.main(LoggingExceptions2.java:17) -___[ Error Output is Expected ]___ */ diff --git a/exceptions/NeverCaught.java b/exceptions/NeverCaught.java index 633417383..974ccecdb 100644 --- a/exceptions/NeverCaught.java +++ b/exceptions/NeverCaught.java @@ -23,5 +23,4 @@ public static void main(String[] args) { at NeverCaught.f(NeverCaught.java:7) at NeverCaught.g(NeverCaught.java:10) at NeverCaught.main(NeverCaught.java:13) -___[ Exception is Expected ]___ */ diff --git a/files/AddAndSubtractPaths.java b/files/AddAndSubtractPaths.java index d107bf957..55506f698 100644 --- a/files/AddAndSubtractPaths.java +++ b/files/AddAndSubtractPaths.java @@ -53,35 +53,35 @@ public static void main(String[] args) { } /* Output: Windows 10 -C:\Users\Bruce\Documents\Git +C:\Users\Bruce\Documents\GitHub (1)r on- java\ExtractedExamples\files\AddAndSubtractPaths.java -RealPath: C:\Users\Bruce\Documents\Git\on- +RealPath: C:\Users\Bruce\Documents\GitHub\on- java\ExtractedExamples\files\AddAndSubtractPaths.java (2)r on-java\ExtractedExamples\strings\..\files -RealPath: C:\Users\Bruce\Documents\Git\on- +RealPath: C:\Users\Bruce\Documents\GitHub\on- java\ExtractedExamples\files (3)r on-java\ExtractedExamples\files -RealPath: C:\Users\Bruce\Documents\Git\on- +RealPath: C:\Users\Bruce\Documents\GitHub\on- java\ExtractedExamples\files (4) ..\.. -RealPath: C:\Users\Bruce\Documents\Git\on-java +RealPath: C:\Users\Bruce\Documents\GitHub\on-java (5) ..\.. -RealPath: C:\Users\Bruce\Documents\Git\on-java +RealPath: C:\Users\Bruce\Documents\GitHub\on-java (6)r on-java -RealPath: C:\Users\Bruce\Documents\Git\on-java +RealPath: C:\Users\Bruce\Documents\GitHub\on-java (7)r on-java\ExtractedExamples\files\.\..\.. -RealPath: C:\Users\Bruce\Documents\Git\on-java +RealPath: C:\Users\Bruce\Documents\GitHub\on-java (8)r on-java -RealPath: C:\Users\Bruce\Documents\Git\on-java +RealPath: C:\Users\Bruce\Documents\GitHub\on-java (9)r on-java\ExtractedExamples\files -RealPath: C:\Users\Bruce\Documents\Git\on- +RealPath: C:\Users\Bruce\Documents\GitHub\on- java\ExtractedExamples\files (10)r on-java\ExtractedExamples\strings -RealPath: C:\Users\Bruce\Documents\Git\on- +RealPath: C:\Users\Bruce\Documents\GitHub\on- java\ExtractedExamples\strings (11) nonexistent java.nio.file.NoSuchFileException: -C:\Users\Bruce\Documents\Git\on- +C:\Users\Bruce\Documents\GitHub\on- java\ExtractedExamples\files\nonexistent */ diff --git a/files/Directories.java b/files/Directories.java index 434bf01ec..bf052a273 100644 --- a/files/Directories.java +++ b/files/Directories.java @@ -59,7 +59,7 @@ static void populateTestDir() throws Exception { test\bag test\bar test\baz -test\DIR_8446534140186618410 +test\DIR_8460303386746117268 test\foo test\Hello.txt ********* @@ -68,27 +68,27 @@ static void populateTestDir() throws Exception { test\bag\foo test\bag\foo\bar test\bag\foo\bar\baz -test\bag\foo\bar\baz\7681439653764312519.tmp +test\bag\foo\bar\baz\4101434906493986662.tmp test\bag\foo\bar\baz\File.txt test\bar test\bar\baz test\bar\baz\bag test\bar\baz\bag\foo -test\bar\baz\bag\foo\231438590599434409.tmp +test\bar\baz\bag\foo\7816199470809856557.tmp test\bar\baz\bag\foo\File.txt test\baz test\baz\bag test\baz\bag\foo test\baz\bag\foo\bar -test\baz\bag\foo\bar\2568963174268478267.tmp +test\baz\bag\foo\bar\5361615738906181780.tmp test\baz\bag\foo\bar\File.txt -test\DIR_8446534140186618410 -test\DIR_8446534140186618410\pre4960544428685536384.non +test\DIR_8460303386746117268 +test\DIR_8460303386746117268\pre8013004952693214586.non test\foo test\foo\bar test\foo\bar\baz test\foo\bar\baz\bag -test\foo\bar\baz\bag\8569628193069437000.tmp +test\foo\bar\baz\bag\7164453512868942303.tmp test\foo\bar\baz\bag\File.txt test\Hello.txt */ diff --git a/files/File_System.java b/files/File_System.java index d173810de..24014ae22 100644 --- a/files/File_System.java +++ b/files/File_System.java @@ -27,15 +27,15 @@ public static void main(String[] args) { } /* Output: Windows 10 -File Store: (C:) +File Store: SSD (C:) Root Directory: C:\ Root Directory: D:\ Separator: \ UserPrincipalLookupService: -sun.nio.fs.WindowsFileSystem$LookupService$1@106d69c +sun.nio.fs.WindowsFileSystem$LookupService$1@1db9742 isOpen: true isReadOnly: false FileSystemProvider: -sun.nio.fs.WindowsFileSystemProvider@52e922 +sun.nio.fs.WindowsFileSystemProvider@106d69c File Attribute Views: [owner, dos, acl, basic, user] */ diff --git a/files/Find.java b/files/Find.java index babf8eb5d..5d8d1b031 100644 --- a/files/Find.java +++ b/files/Find.java @@ -36,24 +36,24 @@ public class Find { } } /* Output: -test\bag\foo\bar\baz\7875645296823748474.tmp +test\bag\foo\bar\baz\6081303161062291208.tmp test\bag\foo\bar\baz\File.txt -test\bar\baz\bag\foo\8495339501512512468.tmp +test\bar\baz\bag\foo\771297659941286896.tmp test\bar\baz\bag\foo\File.txt -test\baz\bag\foo\bar\4657930969137717517.tmp +test\baz\bag\foo\bar\1769334171376700049.tmp test\baz\bag\foo\bar\File.txt test\dir.tmp -test\foo\bar\baz\bag\5205870604020775563.tmp +test\foo\bar\baz\bag\4483950466184961816.tmp test\foo\bar\baz\bag\File.txt *************** -7875645296823748474.tmp -8495339501512512468.tmp -4657930969137717517.tmp +6081303161062291208.tmp +771297659941286896.tmp +1769334171376700049.tmp dir.tmp -5205870604020775563.tmp +4483950466184961816.tmp *************** -7875645296823748474.tmp -8495339501512512468.tmp -4657930969137717517.tmp -5205870604020775563.tmp +6081303161062291208.tmp +771297659941286896.tmp +1769334171376700049.tmp +4483950466184961816.tmp */ diff --git a/files/PartsOfPaths.java b/files/PartsOfPaths.java index 9788dede0..3122a05d7 100644 --- a/files/PartsOfPaths.java +++ b/files/PartsOfPaths.java @@ -27,17 +27,16 @@ public static void main(String[] args) { Users Bruce Documents -Git +GitHub on-java ExtractedExamples files PartsOfPaths.java -Git\on-java\ExtractedExamples ends with '.java': false Users: false : false Bruce: false : false Documents: false : false -Git: false : false +GitHub: false : false on-java: false : false ExtractedExamples: false : false files: false : false diff --git a/files/PathAnalysis.java b/files/PathAnalysis.java index 77b4603d2..5e32b8ae8 100644 --- a/files/PathAnalysis.java +++ b/files/PathAnalysis.java @@ -47,10 +47,10 @@ static void say(String id, Object result) { Writable: true notExists: false Hidden: false -size: 1617 -FileStore: (C:) -LastModified: : 2015-12-13T21:24:32.029627Z -Owner: GROOT\Bruce (User) +size: 1631 +FileStore: SSD (C:) +LastModified: : 2016-07-22T17:55:34.80143Z +Owner: MINDVIEWTOSHIBA\Bruce (User) ContentType: null SymbolicLink: false */ diff --git a/files/PathInfo.java b/files/PathInfo.java index 3dbae20b8..2dcdc1b04 100644 --- a/files/PathInfo.java +++ b/files/PathInfo.java @@ -63,40 +63,40 @@ public static void main(String[] args) { Parent: null Root: null ---------------- -toString: C:\Users\Bruce\Documents\Git\on- +toString: C:\Users\Bruce\Documents\GitHub\on- java\ExtractedExamples\files\PathInfo.java Exists: true RegularFile: true Directory: false Absolute: true FileName: PathInfo.java -Parent: C:\Users\Bruce\Documents\Git\on- +Parent: C:\Users\Bruce\Documents\GitHub\on- java\ExtractedExamples\files Root: C:\ ---------------- -toString: C:\Users\Bruce\Documents\Git\on- +toString: C:\Users\Bruce\Documents\GitHub\on- java\ExtractedExamples\files Exists: true RegularFile: false Directory: true Absolute: true FileName: files -Parent: C:\Users\Bruce\Documents\Git\on- +Parent: C:\Users\Bruce\Documents\GitHub\on- java\ExtractedExamples Root: C:\ ---------------- -toString: C:\Users\Bruce\Documents\Git\on- +toString: C:\Users\Bruce\Documents\GitHub\on- java\ExtractedExamples\files\PathInfo.java Exists: true RegularFile: true Directory: false Absolute: true FileName: PathInfo.java -Parent: C:\Users\Bruce\Documents\Git\on- +Parent: C:\Users\Bruce\Documents\GitHub\on- java\ExtractedExamples\files Root: C:\ ---------------- -URI: file:///C:/Users/Bruce/Documents/Git/on- +URI: file:///C:/Users/Bruce/Documents/GitHub/on- java/ExtractedExamples/files/PathInfo.java true */ diff --git a/files/ReadLineStream.java b/files/ReadLineStream.java index d33a37b43..be32d9d05 100644 --- a/files/ReadLineStream.java +++ b/files/ReadLineStream.java @@ -14,5 +14,5 @@ public class ReadLineStream { } } /* Output: -show("RegularFile", Files.isRegularFile(p)); + show("RegularFile", Files.isRegularFile(p)); */ diff --git a/files/TreeWatcher.java b/files/TreeWatcher.java index fa7abeeb2..7afc374ea 100644 --- a/files/TreeWatcher.java +++ b/files/TreeWatcher.java @@ -43,8 +43,8 @@ static void watchDir(Path dir) { } /* Output: deleting test\bag\foo\bar\baz\File.txt +deleting test\bar\baz\bag\foo\File.txt evt.context(): File.txt evt.count(): 1 evt.kind(): ENTRY_DELETE -deleting test\bar\baz\bag\foo\File.txt */ diff --git a/generics/DynamicProxyMixin.java b/generics/DynamicProxyMixin.java index ddca21c2a..9ea58279b 100644 --- a/generics/DynamicProxyMixin.java +++ b/generics/DynamicProxyMixin.java @@ -60,6 +60,6 @@ public static void main(String[] args) { } /* Output: Hello -1434408462833 +1469210152348 1 */ diff --git a/generics/Mixins.java b/generics/Mixins.java index 1234958ee..c524c5f8d 100644 --- a/generics/Mixins.java +++ b/generics/Mixins.java @@ -64,6 +64,6 @@ public static void main(String[] args) { } } /* Output: -test string 1 1434408464412 1 -test string 2 1434408464413 2 +test string 1 1469210158525 1 +test string 2 1469210158525 2 */ diff --git a/generics/PrimitiveGenericTest.java b/generics/PrimitiveGenericTest.java index e4f95e2fb..883e2512d 100644 --- a/generics/PrimitiveGenericTest.java +++ b/generics/PrimitiveGenericTest.java @@ -41,6 +41,6 @@ public static void main(String[] args) { } } /* Output: -[YNzbrnyGc, FOWZnTcQr, GseGZMmJM, RoEsuEcUO, neOEdLsmw] -[8689, 7185, 6992, 5746, 3976, 2447, 5368, 1854, 1395] +[btpenpccu, xszgvgmei, nneeloztd, vewcippcy, gpoalkljl] +[635, 8737, 3941, 4720, 6177, 8479, 6656, 3768, 4948] */ diff --git a/generics/TupleList.java b/generics/TupleList.java index 2c96a07b3..6003fb722 100644 --- a/generics/TupleList.java +++ b/generics/TupleList.java @@ -18,6 +18,6 @@ public static void main(String[] args) { } } /* Output: -(Vehicle@18025c, Amphibian@16f27d, hi, 47) -(Vehicle@7aac27, Amphibian@3abc88, hi, 47) +(Vehicle@107d329, Amphibian@1629346, hi, 47) +(Vehicle@4b9385, Amphibian@1311334, hi, 47) */ diff --git a/generics/TupleTest.java b/generics/TupleTest.java index 8cafff708..fee02b251 100644 --- a/generics/TupleTest.java +++ b/generics/TupleTest.java @@ -38,7 +38,7 @@ public static void main(String[] args) { } /* Output: (hi, 47) -(Amphibian@139a55, hi, 47) -(Vehicle@1db9742, Amphibian@106d69c, hi, 47) -(Vehicle@52e922, Amphibian@25154f, hi, 47, 11.1) +(Amphibian@1c7c054, hi, 47) +(Vehicle@14991ad, Amphibian@d93b30, hi, 47) +(Vehicle@a14482, Amphibian@140e19d, hi, 47, 11.1) */ diff --git a/generics/TupleTest2.java b/generics/TupleTest2.java index d1ad478f0..c3f65cae0 100644 --- a/generics/TupleTest2.java +++ b/generics/TupleTest2.java @@ -35,7 +35,7 @@ public static void main(String[] args) { /* Output: (hi, 47) (hi, 47) -(Amphibian@139a55, hi, 47) -(Vehicle@1db9742, Amphibian@106d69c, hi, 47) -(Vehicle@52e922, Amphibian@25154f, hi, 47, 11.1) +(Amphibian@a298b7, hi, 47) +(Vehicle@16d3586, Amphibian@154617c, hi, 47) +(Vehicle@17327b6, Amphibian@14ae5a5, hi, 47, 11.1) */ diff --git a/generics/WatercolorSets.java b/generics/WatercolorSets.java index 673bf0be8..b5248eebb 100644 --- a/generics/WatercolorSets.java +++ b/generics/WatercolorSets.java @@ -35,19 +35,19 @@ public static void main(String[] args) { set2: [CERULEAN_BLUE_HUE, PHTHALO_BLUE, ULTRAMARINE, COBALT_BLUE_HUE, PERMANENT_GREEN, VIRIDIAN_HUE, SAP_GREEN, YELLOW_OCHRE, BURNT_SIENNA, RAW_UMBER, BURNT_UMBER] -union(set1, set2): [MAGENTA, ROSE_MADDER, CRIMSON, -PERMANENT_GREEN, BURNT_UMBER, SAP_GREEN, CERULEAN_BLUE_HUE, -RAW_UMBER, YELLOW_OCHRE, BRILLIANT_RED, ULTRAMARINE, -BURNT_SIENNA, COBALT_BLUE_HUE, VIRIDIAN_HUE, PHTHALO_BLUE, -VIOLET] -intersection(set1, set2): [COBALT_BLUE_HUE, -PERMANENT_GREEN, VIRIDIAN_HUE, PHTHALO_BLUE, -CERULEAN_BLUE_HUE, ULTRAMARINE] -difference(set1, subset): [MAGENTA, ROSE_MADDER, CRIMSON, -BRILLIANT_RED, VIOLET] -difference(set2, subset): [BURNT_UMBER, SAP_GREEN, -RAW_UMBER, YELLOW_OCHRE, BURNT_SIENNA] -complement(set1, set2): [MAGENTA, ROSE_MADDER, CRIMSON, -BURNT_UMBER, SAP_GREEN, RAW_UMBER, YELLOW_OCHRE, -BRILLIANT_RED, BURNT_SIENNA, VIOLET] +union(set1, set2): [MAGENTA, COBALT_BLUE_HUE, VIOLET, +VIRIDIAN_HUE, BURNT_SIENNA, ULTRAMARINE, CERULEAN_BLUE_HUE, +BURNT_UMBER, BRILLIANT_RED, PHTHALO_BLUE, YELLOW_OCHRE, +SAP_GREEN, CRIMSON, ROSE_MADDER, RAW_UMBER, +PERMANENT_GREEN] +intersection(set1, set2): [COBALT_BLUE_HUE, VIRIDIAN_HUE, +ULTRAMARINE, CERULEAN_BLUE_HUE, PHTHALO_BLUE, +PERMANENT_GREEN] +difference(set1, subset): [CRIMSON, MAGENTA, VIOLET, +ROSE_MADDER, BRILLIANT_RED] +difference(set2, subset): [BURNT_SIENNA, BURNT_UMBER, +YELLOW_OCHRE, RAW_UMBER, SAP_GREEN] +complement(set1, set2): [MAGENTA, VIOLET, BURNT_SIENNA, +BURNT_UMBER, BRILLIANT_RED, YELLOW_OCHRE, SAP_GREEN, +CRIMSON, ROSE_MADDER, RAW_UMBER] */ diff --git a/housekeeping/NewVarArgs.java b/housekeeping/NewVarArgs.java index 749c2c1bf..5f94b54d3 100644 --- a/housekeeping/NewVarArgs.java +++ b/housekeeping/NewVarArgs.java @@ -25,6 +25,6 @@ public static void main(String[] args) { 47 3.14 11.11 47 3.14 11.11 one two three -A@19e0bfd A@139a55 A@1db9742 +A@1db9742 A@106d69c A@52e922 1 2 3 4 */ diff --git a/housekeeping/VarArgs.java b/housekeeping/VarArgs.java index eb8b3bd51..af8e3939d 100644 --- a/housekeeping/VarArgs.java +++ b/housekeeping/VarArgs.java @@ -22,5 +22,5 @@ public static void main(String[] args) { /* Output: 47 3.14 11.11 one two three -A@19e0bfd A@139a55 A@1db9742 +A@1db9742 A@106d69c A@52e922 */ diff --git a/innerclasses/GreenhouseController.java b/innerclasses/GreenhouseController.java index 6b00fedac..5f1cd43ec 100644 --- a/innerclasses/GreenhouseController.java +++ b/innerclasses/GreenhouseController.java @@ -29,13 +29,29 @@ gc.new ThermostatDay(1400) } } /* Output: +Thermostat on night setting +Light is on +Light is off +Greenhouse water is on +Greenhouse water is off +Bing! +Thermostat on day setting Bing! +Restarting system Thermostat on night setting Light is on Light is off Greenhouse water is on +Bing! Greenhouse water is off Thermostat on day setting +Bing! Restarting system +Thermostat on night setting +Light is on +Light is off +Bing! +Greenhouse water is on +Greenhouse water is off Terminating */ diff --git a/logging/ConfigureLogging.java b/logging/ConfigureLogging.java index b378f82ba..12ac25b08 100644 --- a/logging/ConfigureLogging.java +++ b/logging/ConfigureLogging.java @@ -44,41 +44,58 @@ public static void main(String[] args) { } } /* Output: -Logger Name : com Level: null - Logger Name : com.mindviewinc Level: null - Logger Name : onjava Level: null - Logger Name : com.mindviewinc.test Level: null - Logger Name : random Level: null + Logger Name : com Level: null + Logger Name : com.mindviewinc Level: FINEST + Logger Name : onjava Level: INFO + Logger Name : com.mindviewinc.test Level: FINER + Logger Name : random Level: SEVERE ___[ Error Output ]___ -Dec 15, 2015 9:58:42 PM ConfigureLogging sendLogMessages +Jul 22, 2016 11:55:52 AM ConfigureLogging sendLogMessages +FINEST: Finest +Jul 22, 2016 11:55:52 AM ConfigureLogging sendLogMessages +FINER: Finer +Jul 22, 2016 11:55:52 AM ConfigureLogging sendLogMessages +FINE: Fine +Jul 22, 2016 11:55:52 AM ConfigureLogging sendLogMessages +CONFIG: Config +Jul 22, 2016 11:55:52 AM ConfigureLogging sendLogMessages INFO: Info -Dec 15, 2015 9:58:42 PM ConfigureLogging sendLogMessages +Jul 22, 2016 11:55:52 AM ConfigureLogging sendLogMessages WARNING: Warning -Dec 15, 2015 9:58:42 PM ConfigureLogging sendLogMessages +Jul 22, 2016 11:55:52 AM ConfigureLogging sendLogMessages SEVERE: Severe -Dec 15, 2015 9:58:42 PM ConfigureLogging sendLogMessages +Jul 22, 2016 11:55:52 AM ConfigureLogging sendLogMessages +FINEST: Finest +Jul 22, 2016 11:55:52 AM ConfigureLogging sendLogMessages +FINER: Finer +Jul 22, 2016 11:55:52 AM ConfigureLogging sendLogMessages +FINE: Fine +Jul 22, 2016 11:55:52 AM ConfigureLogging sendLogMessages +CONFIG: Config +Jul 22, 2016 11:55:52 AM ConfigureLogging sendLogMessages INFO: Info -Dec 15, 2015 9:58:42 PM ConfigureLogging sendLogMessages +Jul 22, 2016 11:55:52 AM ConfigureLogging sendLogMessages WARNING: Warning -Dec 15, 2015 9:58:42 PM ConfigureLogging sendLogMessages +Jul 22, 2016 11:55:52 AM ConfigureLogging sendLogMessages SEVERE: Severe -Dec 15, 2015 9:58:42 PM ConfigureLogging sendLogMessages +Jul 22, 2016 11:55:52 AM ConfigureLogging sendLogMessages INFO: Info -Dec 15, 2015 9:58:42 PM ConfigureLogging sendLogMessages +Jul 22, 2016 11:55:52 AM ConfigureLogging sendLogMessages WARNING: Warning -Dec 15, 2015 9:58:42 PM ConfigureLogging sendLogMessages +Jul 22, 2016 11:55:52 AM ConfigureLogging sendLogMessages SEVERE: Severe -Dec 15, 2015 9:58:42 PM ConfigureLogging sendLogMessages +Jul 22, 2016 11:55:52 AM ConfigureLogging sendLogMessages +FINER: Finer +Jul 22, 2016 11:55:52 AM ConfigureLogging sendLogMessages +FINE: Fine +Jul 22, 2016 11:55:52 AM ConfigureLogging sendLogMessages +CONFIG: Config +Jul 22, 2016 11:55:52 AM ConfigureLogging sendLogMessages INFO: Info -Dec 15, 2015 9:58:42 PM ConfigureLogging sendLogMessages +Jul 22, 2016 11:55:52 AM ConfigureLogging sendLogMessages WARNING: Warning -Dec 15, 2015 9:58:42 PM ConfigureLogging sendLogMessages +Jul 22, 2016 11:55:52 AM ConfigureLogging sendLogMessages SEVERE: Severe -Dec 15, 2015 9:58:42 PM ConfigureLogging sendLogMessages -INFO: Info -Dec 15, 2015 9:58:42 PM ConfigureLogging sendLogMessages -WARNING: Warning -Dec 15, 2015 9:58:42 PM ConfigureLogging sendLogMessages +Jul 22, 2016 11:55:52 AM ConfigureLogging sendLogMessages SEVERE: Severe -___[ Error Output is Expected ]___ */ diff --git a/logging/CustomHandler.java b/logging/CustomHandler.java index b111b003a..853863b3b 100644 --- a/logging/CustomHandler.java +++ b/logging/CustomHandler.java @@ -40,9 +40,8 @@ public void close() {} , INFO:, CustomHandler:, main:, , ] ___[ Error Output ]___ -Dec 15, 2015 9:58:42 PM CustomHandler main +Jul 22, 2016 11:55:52 AM CustomHandler main WARNING: Logging Warning -Dec 15, 2015 9:58:42 PM CustomHandler main +Jul 22, 2016 11:55:52 AM CustomHandler main INFO: Logging Info -___[ Error Output is Expected ]___ */ diff --git a/logging/InfoLogging.java b/logging/InfoLogging.java index 9e987fcda..353e3ebcf 100644 --- a/logging/InfoLogging.java +++ b/logging/InfoLogging.java @@ -14,7 +14,6 @@ public static void main(String[] args) { } /* Output: ___[ Error Output ]___ -Dec 15, 2015 9:58:43 PM InfoLogging main +Jul 22, 2016 11:55:52 AM InfoLogging main INFO: Logging: INFO-level message -___[ Error Output is Expected ]___ */ diff --git a/logging/InfoLogging2.java b/logging/InfoLogging2.java index b3ba0c6f2..091a64589 100644 --- a/logging/InfoLogging2.java +++ b/logging/InfoLogging2.java @@ -16,7 +16,6 @@ public static void main(String[] args) { } /* Output: ___[ Error Output ]___ -Dec 15, 2015 9:58:43 PM InfoLogging2 main +Jul 22, 2016 11:55:53 AM InfoLogging2 main INFO: Logging an INFO-level message -___[ Error Output is Expected ]___ */ diff --git a/logging/LogToFile.java b/logging/LogToFile.java index 8337ee9c4..94ab32a0a 100644 --- a/logging/LogToFile.java +++ b/logging/LogToFile.java @@ -17,7 +17,6 @@ public class LogToFile { } /* Output: ___[ Error Output ]___ -Dec 15, 2015 9:58:43 PM LogToFile main +Jul 22, 2016 11:55:53 AM LogToFile main INFO: A message logged to the file -___[ Error Output is Expected ]___ */ diff --git a/logging/LogToFile2.java b/logging/LogToFile2.java index 4fd6d5d02..1dfb0f028 100644 --- a/logging/LogToFile2.java +++ b/logging/LogToFile2.java @@ -19,7 +19,6 @@ public class LogToFile2 { } /* Output: ___[ Error Output ]___ -Dec 15, 2015 9:58:43 PM LogToFile2 main +Jul 22, 2016 11:55:53 AM LogToFile2 main INFO: A message logged to the file -___[ Error Output is Expected ]___ */ diff --git a/logging/LoggingLevelManipulation.java b/logging/LoggingLevelManipulation.java index e88c51625..814573736 100644 --- a/logging/LoggingLevelManipulation.java +++ b/logging/LoggingLevelManipulation.java @@ -62,7 +62,7 @@ public static void main(String[] args) { } } /* Output: --- printing levels -- com : null com.mindviewinc : null + -- printing levels -- com : null com.mindviewinc : null onjava : null com.mindviewinc.test : null random : null -- printing levels -- com : SEVERE com.mindviewinc : null onjava : null com.mindviewinc.test : null random : null @@ -76,110 +76,109 @@ public static void main(String[] args) { FINEST net level: FINEST ___[ Error Output ]___ -Dec 15, 2015 9:58:43 PM LoggingLevelManipulation +Jul 22, 2016 11:55:53 AM LoggingLevelManipulation printLogMessages SEVERE: com Severe -Dec 15, 2015 9:58:43 PM LoggingLevelManipulation +Jul 22, 2016 11:55:54 AM LoggingLevelManipulation printLogMessages SEVERE: com.mindviewinc Severe -Dec 15, 2015 9:58:43 PM LoggingLevelManipulation +Jul 22, 2016 11:55:54 AM LoggingLevelManipulation printLogMessages INFO: onjava Info -Dec 15, 2015 9:58:43 PM LoggingLevelManipulation +Jul 22, 2016 11:55:54 AM LoggingLevelManipulation printLogMessages WARNING: onjava Warning -Dec 15, 2015 9:58:43 PM LoggingLevelManipulation +Jul 22, 2016 11:55:54 AM LoggingLevelManipulation printLogMessages SEVERE: onjava Severe -Dec 15, 2015 9:58:43 PM LoggingLevelManipulation +Jul 22, 2016 11:55:54 AM LoggingLevelManipulation printLogMessages SEVERE: com.mindviewinc.test Severe -Dec 15, 2015 9:58:43 PM LoggingLevelManipulation +Jul 22, 2016 11:55:54 AM LoggingLevelManipulation printLogMessages INFO: random Info -Dec 15, 2015 9:58:43 PM LoggingLevelManipulation +Jul 22, 2016 11:55:54 AM LoggingLevelManipulation printLogMessages WARNING: random Warning -Dec 15, 2015 9:58:43 PM LoggingLevelManipulation +Jul 22, 2016 11:55:54 AM LoggingLevelManipulation printLogMessages SEVERE: random Severe -Dec 15, 2015 9:58:43 PM LoggingLevelManipulation +Jul 22, 2016 11:55:54 AM LoggingLevelManipulation printLogMessages SEVERE: com Severe -Dec 15, 2015 9:58:43 PM LoggingLevelManipulation +Jul 22, 2016 11:55:54 AM LoggingLevelManipulation printLogMessages SEVERE: com.mindviewinc Severe -Dec 15, 2015 9:58:43 PM LoggingLevelManipulation +Jul 22, 2016 11:55:54 AM LoggingLevelManipulation printLogMessages INFO: onjava Info -Dec 15, 2015 9:58:43 PM LoggingLevelManipulation +Jul 22, 2016 11:55:54 AM LoggingLevelManipulation printLogMessages WARNING: onjava Warning -Dec 15, 2015 9:58:43 PM LoggingLevelManipulation +Jul 22, 2016 11:55:54 AM LoggingLevelManipulation printLogMessages SEVERE: onjava Severe -Dec 15, 2015 9:58:43 PM LoggingLevelManipulation +Jul 22, 2016 11:55:54 AM LoggingLevelManipulation printLogMessages INFO: com.mindviewinc.test Info -Dec 15, 2015 9:58:43 PM LoggingLevelManipulation +Jul 22, 2016 11:55:54 AM LoggingLevelManipulation printLogMessages WARNING: com.mindviewinc.test Warning -Dec 15, 2015 9:58:43 PM LoggingLevelManipulation +Jul 22, 2016 11:55:54 AM LoggingLevelManipulation printLogMessages SEVERE: com.mindviewinc.test Severe -Dec 15, 2015 9:58:43 PM LoggingLevelManipulation +Jul 22, 2016 11:55:54 AM LoggingLevelManipulation printLogMessages INFO: random Info -Dec 15, 2015 9:58:43 PM LoggingLevelManipulation +Jul 22, 2016 11:55:54 AM LoggingLevelManipulation printLogMessages WARNING: random Warning -Dec 15, 2015 9:58:43 PM LoggingLevelManipulation +Jul 22, 2016 11:55:54 AM LoggingLevelManipulation printLogMessages SEVERE: random Severe -Dec 15, 2015 9:58:43 PM LoggingLevelManipulation +Jul 22, 2016 11:55:54 AM LoggingLevelManipulation printLogMessages INFO: com Info -Dec 15, 2015 9:58:43 PM LoggingLevelManipulation +Jul 22, 2016 11:55:54 AM LoggingLevelManipulation printLogMessages WARNING: com Warning -Dec 15, 2015 9:58:43 PM LoggingLevelManipulation +Jul 22, 2016 11:55:54 AM LoggingLevelManipulation printLogMessages SEVERE: com Severe -Dec 15, 2015 9:58:43 PM LoggingLevelManipulation +Jul 22, 2016 11:55:54 AM LoggingLevelManipulation printLogMessages INFO: com.mindviewinc Info -Dec 15, 2015 9:58:43 PM LoggingLevelManipulation +Jul 22, 2016 11:55:54 AM LoggingLevelManipulation printLogMessages WARNING: com.mindviewinc Warning -Dec 15, 2015 9:58:43 PM LoggingLevelManipulation +Jul 22, 2016 11:55:54 AM LoggingLevelManipulation printLogMessages SEVERE: com.mindviewinc Severe -Dec 15, 2015 9:58:43 PM LoggingLevelManipulation +Jul 22, 2016 11:55:54 AM LoggingLevelManipulation printLogMessages INFO: onjava Info -Dec 15, 2015 9:58:43 PM LoggingLevelManipulation +Jul 22, 2016 11:55:54 AM LoggingLevelManipulation printLogMessages WARNING: onjava Warning -Dec 15, 2015 9:58:43 PM LoggingLevelManipulation +Jul 22, 2016 11:55:54 AM LoggingLevelManipulation printLogMessages SEVERE: onjava Severe -Dec 15, 2015 9:58:43 PM LoggingLevelManipulation +Jul 22, 2016 11:55:54 AM LoggingLevelManipulation printLogMessages INFO: com.mindviewinc.test Info -Dec 15, 2015 9:58:43 PM LoggingLevelManipulation +Jul 22, 2016 11:55:54 AM LoggingLevelManipulation printLogMessages WARNING: com.mindviewinc.test Warning -Dec 15, 2015 9:58:43 PM LoggingLevelManipulation +Jul 22, 2016 11:55:54 AM LoggingLevelManipulation printLogMessages SEVERE: com.mindviewinc.test Severe -Dec 15, 2015 9:58:43 PM LoggingLevelManipulation +Jul 22, 2016 11:55:54 AM LoggingLevelManipulation printLogMessages INFO: random Info -Dec 15, 2015 9:58:43 PM LoggingLevelManipulation +Jul 22, 2016 11:55:54 AM LoggingLevelManipulation printLogMessages WARNING: random Warning -Dec 15, 2015 9:58:43 PM LoggingLevelManipulation +Jul 22, 2016 11:55:54 AM LoggingLevelManipulation printLogMessages SEVERE: random Severe -___[ Error Output is Expected ]___ */ diff --git a/logging/LoggingLevels.java b/logging/LoggingLevels.java index baa8e7031..363b59a27 100644 --- a/logging/LoggingLevels.java +++ b/logging/LoggingLevels.java @@ -40,23 +40,22 @@ public static void main(String[] args) { individual loggers set to FINEST com level: SEVERE ___[ Error Output ]___ -Dec 15, 2015 9:58:43 PM LoggingLevels logMessages +Jul 22, 2016 11:55:54 AM LoggingLevels logMessages INFO: util : info -Dec 15, 2015 9:58:43 PM LoggingLevels logMessages +Jul 22, 2016 11:55:54 AM LoggingLevels logMessages SEVERE: test : severe -Dec 15, 2015 9:58:43 PM LoggingLevels logMessages +Jul 22, 2016 11:55:54 AM LoggingLevels logMessages INFO: random : info -Dec 15, 2015 9:58:43 PM LoggingLevels logMessages +Jul 22, 2016 11:55:54 AM LoggingLevels logMessages INFO: util : info -Dec 15, 2015 9:58:43 PM LoggingLevels logMessages +Jul 22, 2016 11:55:54 AM LoggingLevels logMessages SEVERE: test : severe -Dec 15, 2015 9:58:43 PM LoggingLevels logMessages +Jul 22, 2016 11:55:54 AM LoggingLevels logMessages INFO: random : info -Dec 15, 2015 9:58:43 PM LoggingLevels logMessages +Jul 22, 2016 11:55:54 AM LoggingLevels logMessages INFO: util : info -Dec 15, 2015 9:58:43 PM LoggingLevels logMessages +Jul 22, 2016 11:55:54 AM LoggingLevels logMessages SEVERE: test : severe -Dec 15, 2015 9:58:43 PM LoggingLevels logMessages +Jul 22, 2016 11:55:54 AM LoggingLevels logMessages INFO: random : info -___[ Error Output is Expected ]___ */ diff --git a/logging/MultipleHandlers.java b/logging/MultipleHandlers.java index e8eaa51ed..fda36f05c 100644 --- a/logging/MultipleHandlers.java +++ b/logging/MultipleHandlers.java @@ -20,9 +20,8 @@ public class MultipleHandlers { } /* Output: ___[ Error Output ]___ -Dec 15, 2015 9:58:43 PM MultipleHandlers main +Jul 22, 2016 11:55:54 AM MultipleHandlers main WARNING: Output to multiple handlers -Dec 15, 2015 9:58:43 PM MultipleHandlers main +Jul 22, 2016 11:55:54 AM MultipleHandlers main WARNING: Output to multiple handlers -___[ Error Output is Expected ]___ */ diff --git a/logging/MultipleHandlers2.java b/logging/MultipleHandlers2.java index ec3d0678f..f3e481964 100644 --- a/logging/MultipleHandlers2.java +++ b/logging/MultipleHandlers2.java @@ -21,7 +21,6 @@ public class MultipleHandlers2 { } /* Output: ___[ Error Output ]___ -Dec 15, 2015 9:58:43 PM MultipleHandlers2 main +Jul 22, 2016 11:55:54 AM MultipleHandlers2 main WARNING: Output to multiple handlers -___[ Error Output is Expected ]___ */ diff --git a/logging/PrintableLogRecord.java b/logging/PrintableLogRecord.java index fb4d31d73..a9fce941f 100644 --- a/logging/PrintableLogRecord.java +++ b/logging/PrintableLogRecord.java @@ -48,7 +48,7 @@ public static void main(String[] args) { Level LoggerName Message -CurrentMillis<1434408472765> +CurrentMillis<1469210155053> Params ResourceBundle ResourceBundleName diff --git a/logging/SimpleFilter.java b/logging/SimpleFilter.java index cf52ae4d5..2653a685a 100644 --- a/logging/SimpleFilter.java +++ b/logging/SimpleFilter.java @@ -34,13 +34,12 @@ public static void main(String[] args) { } /* Output: ___[ Error Output ]___ -Dec 15, 2015 9:58:44 PM SimpleFilter sendLogMessages +Jul 22, 2016 11:55:55 AM SimpleFilter sendLogMessages WARNING: A duck in the house! -Dec 15, 2015 9:58:44 PM SimpleFilter sendLogMessages +Jul 22, 2016 11:55:55 AM SimpleFilter sendLogMessages WARNING: A Wombat at large! -Dec 15, 2015 9:58:44 PM SimpleFilter main +Jul 22, 2016 11:55:55 AM SimpleFilter main INFO: After setting filter.. -Dec 15, 2015 9:58:44 PM SimpleFilter sendLogMessages +Jul 22, 2016 11:55:55 AM SimpleFilter sendLogMessages WARNING: A duck in the house! -___[ Error Output is Expected ]___ */ diff --git a/logging/SimpleFormatterExample.java b/logging/SimpleFormatterExample.java index 1cab2fda0..cfbb7a99a 100644 --- a/logging/SimpleFormatterExample.java +++ b/logging/SimpleFormatterExample.java @@ -35,5 +35,4 @@ public String format(LogRecord record) { One INFO : SimpleFormatterExample -:- logMessages -:- Line Two -___[ Error Output is Expected ]___ */ diff --git a/network/WhoAmI.java b/network/WhoAmI.java index aab56a1f7..0cda6ae99 100644 --- a/network/WhoAmI.java +++ b/network/WhoAmI.java @@ -15,6 +15,6 @@ public class WhoAmI { } } /* Output: -groot -192.168.70.108 +MindviewToshibaLaptop +192.168.0.107 */ diff --git a/newio/BufferToText.java b/newio/BufferToText.java index 7de658b81..b0184bc34 100644 --- a/newio/BufferToText.java +++ b/newio/BufferToText.java @@ -62,7 +62,7 @@ public class BufferToText { } /* Output: ???? -Decoded using Cp1252: Some text +Decoded using windows-1252: Some text Some text Some textNULNULNUL */ diff --git a/newio/LockingMappedFiles.java b/newio/LockingMappedFiles.java index fb01d8f48..20c8205b6 100644 --- a/newio/LockingMappedFiles.java +++ b/newio/LockingMappedFiles.java @@ -52,8 +52,8 @@ public void run() { } } /* Output: -Locked: 75497471 to 113246206 Locked: 0 to 50331647 +Locked: 75497471 to 113246206 Released: 75497471 to 113246206 Released: 0 to 50331647 */ diff --git a/objects/HelloDate.java b/objects/HelloDate.java index 4fd4a4ba0..42f703674 100644 --- a/objects/HelloDate.java +++ b/objects/HelloDate.java @@ -22,5 +22,5 @@ public static void main(String[] args) { } /* Output: Hello, it's: -Mon Jun 15 15:47:53 PDT 2015 +Fri Jul 22 11:55:55 MDT 2016 */ diff --git a/objects/ShowProperties.java b/objects/ShowProperties.java index 02db099ef..fec2d61bb 100644 --- a/objects/ShowProperties.java +++ b/objects/ShowProperties.java @@ -15,8 +15,8 @@ public static void main(String[] args) { -- listing properties -- java.runtime.name=Java(TM) SE Runtime Environment sun.boot.library.path=C:\Program Files -(x86)\Java\jre1.8.0_... -java.vm.version=25.60-b23 +(x86)\Java\jdk1.8.0_... +java.vm.version=25.77-b03 java.vm.vendor=Oracle Corporation java.vendor.url=http://java.oracle.com/ path.separator=; @@ -28,10 +28,10 @@ public static void main(String[] args) { sun.os.patch.level= java.vm.specification.name=Java Virtual Machine Specification -user.dir=C:\Users\Bruce\Documents\GitHub\OnJav... -java.runtime.version=1.8.0_60-b27 +user.dir=C:\Users\Bruce\Documents\GitHub\on-ja... +java.runtime.version=1.8.0_77-b03 java.awt.graphicsenv=sun.awt.Win32GraphicsEnvironment -java.endorsed.dirs=C:\Program Files (x86)\Java\jre1.8.0_... +java.endorsed.dirs=C:\Program Files (x86)\Java\jdk1.8.0_... os.arch=x86 java.io.tmpdir=C:\Users\Bruce\AppData\Local\Temp\ ... diff --git a/onjava/Hex.java b/onjava/Hex.java index 61bc55299..e8f53f6f2 100644 --- a/onjava/Hex.java +++ b/onjava/Hex.java @@ -34,11 +34,11 @@ public static String format(byte[] data) { } } /* Output: (First 6 Lines) -00000: CA FE BA BE 00 00 00 34 00 53 0A 00 05 00 22 07 -00010: 00 23 0A 00 02 00 22 08 00 24 07 00 25 0A 00 26 -00020: 00 27 0A 00 28 00 29 0A 00 02 00 2A 08 00 2B 0A -00030: 00 2C 00 2D 08 00 2E 0A 00 02 00 2F 09 00 30 00 -00040: 31 08 00 32 0A 00 33 00 34 0A 00 15 00 35 0A 00 -00050: 36 00 37 07 00 38 0A 00 12 00 39 0A 00 33 00 3A +00000: CA FE BA BE 00 00 00 34 00 61 0A 00 05 00 31 07 +00010: 00 32 0A 00 02 00 31 08 00 33 07 00 34 0A 00 35 +00020: 00 36 0A 00 0F 00 37 0A 00 02 00 38 08 00 39 0A +00030: 00 3A 00 3B 08 00 3C 0A 00 02 00 3D 09 00 3E 00 +00040: 3F 08 00 40 07 00 41 0A 00 42 00 43 0A 00 44 00 +00050: 45 0A 00 14 00 46 0A 00 47 00 48 07 00 49 01 00 ... */ diff --git a/onjava/atunit/ClassNameFinder.java b/onjava/atunit/ClassNameFinder.java index 20be9be59..5693ef0af 100644 --- a/onjava/atunit/ClassNameFinder.java +++ b/onjava/atunit/ClassNameFinder.java @@ -101,6 +101,7 @@ public static String thisClass(byte[] classBytes) { } } /* Output: +onjava.ArrayShow onjava.atunit.AtUnit$TestMethods onjava.atunit.AtUnit onjava.atunit.ClassNameFinder @@ -108,4 +109,71 @@ public static String thisClass(byte[] classBytes) { onjava.atunit.TestObjectCleanup onjava.atunit.TestObjectCreate onjava.atunit.TestProperty +onjava.BasicSupplier +onjava.CollectionMethodDifferences +onjava.ConvertTo +onjava.Count$Boolean +onjava.Count$boolean_ +onjava.Count$Byte +onjava.Count$byte_ +onjava.Count$Character +onjava.Count$char_ +onjava.Count$Double +onjava.Count$double_ +onjava.Count$Float +onjava.Count$float_ +onjava.Count$Integer +onjava.Count$int_ +onjava.Count$Long +onjava.Count$long_ +onjava.Count$Short +onjava.Count$short_ +onjava.Count +onjava.CountingIntegerList +onjava.CountMap +onjava.Countries +onjava.Enums +onjava.FillMap +onjava.Hex +onjava.MouseClick +onjava.Null +onjava.Operation +onjava.OSExecute +onjava.OSExecuteException +onjava.Pair +onjava.ProcessFiles$Strategy +onjava.ProcessFiles +onjava.Rand$Boolean +onjava.Rand$boolean_ +onjava.Rand$Byte +onjava.Rand$byte_ +onjava.Rand$Character +onjava.Rand$char_ +onjava.Rand$Double +onjava.Rand$double_ +onjava.Rand$Float +onjava.Rand$float_ +onjava.Rand$Integer +onjava.Rand$int_ +onjava.Rand$Long +onjava.Rand$long_ +onjava.Rand$Short +onjava.Rand$short_ +onjava.Rand$String +onjava.Rand +onjava.Range +onjava.Repeat +onjava.RmDir +onjava.Sets +onjava.Sleep +onjava.Stack +onjava.Suppliers +onjava.TimedAbort +onjava.TimeIt +onjava.Tuple +onjava.Tuple2 +onjava.Tuple3 +onjava.Tuple4 +onjava.Tuple5 +onjava.TypeCounter */ diff --git a/patterns/PaperScissorsRock.java b/patterns/PaperScissorsRock.java index 79a182fc2..29e8b0bba 100644 --- a/patterns/PaperScissorsRock.java +++ b/patterns/PaperScissorsRock.java @@ -111,24 +111,24 @@ public static void main(String[] args) { } } /* Output: -Rock -> Rock : DRAW -Paper -> Rock : WIN -Paper -> Rock : WIN -Paper -> Rock : WIN -Scissors -> Paper : WIN -Scissors -> Scissors : DRAW +Scissors -> Rock : LOSE Scissors -> Paper : WIN Rock -> Paper : LOSE -Paper -> Paper : DRAW +Rock -> Rock : DRAW Rock -> Paper : LOSE Paper -> Scissors : LOSE -Paper -> Scissors : LOSE -Rock -> Scissors : WIN Rock -> Paper : LOSE -Paper -> Rock : WIN +Scissors -> Scissors : DRAW +Scissors -> Rock : LOSE Scissors -> Paper : WIN +Scissors -> Rock : LOSE Paper -> Scissors : LOSE -Paper -> Scissors : LOSE -Paper -> Scissors : LOSE -Paper -> Scissors : LOSE +Rock -> Rock : DRAW +Scissors -> Scissors : DRAW +Paper -> Paper : DRAW +Scissors -> Paper : WIN +Scissors -> Rock : LOSE +Scissors -> Paper : WIN +Rock -> Paper : LOSE +Rock -> Scissors : WIN */ diff --git a/patterns/doubledispatch/DoubleDispatch.java b/patterns/doubledispatch/DoubleDispatch.java index 6b4974736..604d50027 100644 --- a/patterns/doubledispatch/DoubleDispatch.java +++ b/patterns/doubledispatch/DoubleDispatch.java @@ -71,25 +71,25 @@ public static void main(String[] args) { } } /* Output: (First and Last 10 Lines) -Loading patterns.doubledispatch.DDGlass -Loading patterns.doubledispatch.DDPaper -Loading patterns.doubledispatch.DDAluminum -Loading patterns.doubledispatch.DDCardboard -weight of patterns.doubledispatch.DDAluminum = 89.0 -weight of patterns.doubledispatch.DDAluminum = 76.0 -weight of patterns.doubledispatch.DDAluminum = 25.0 -weight of patterns.doubledispatch.DDAluminum = 34.0 -weight of patterns.doubledispatch.DDAluminum = 27.0 -weight of patterns.doubledispatch.DDAluminum = 18.0 -________...________...________...________...________ -weight of patterns.doubledispatch.DDAluminum = 93.0 -weight of patterns.doubledispatch.DDGlass = 93.0 -weight of patterns.doubledispatch.DDPaper = 80.0 -weight of patterns.doubledispatch.DDGlass = 36.0 -weight of patterns.doubledispatch.DDGlass = 12.0 -weight of patterns.doubledispatch.DDGlass = 60.0 -weight of patterns.doubledispatch.DDPaper = 66.0 -weight of patterns.doubledispatch.DDAluminum = 36.0 -weight of patterns.doubledispatch.DDCardboard = 22.0 +Loading patterns.doubledispatch.Glass +Loading patterns.doubledispatch.Paper +Loading patterns.doubledispatch.Aluminum +Loading patterns.doubledispatch.Cardboard +weight of patterns.doubledispatch.Aluminum = 89.0 +weight of patterns.doubledispatch.Aluminum = 76.0 +weight of patterns.doubledispatch.Aluminum = 25.0 +weight of patterns.doubledispatch.Aluminum = 34.0 +weight of patterns.doubledispatch.Aluminum = 27.0 +weight of patterns.doubledispatch.Aluminum = 18.0 +...________...________...________...________... +weight of patterns.doubledispatch.Aluminum = 93.0 +weight of patterns.doubledispatch.Glass = 93.0 +weight of patterns.doubledispatch.Paper = 80.0 +weight of patterns.doubledispatch.Glass = 36.0 +weight of patterns.doubledispatch.Glass = 12.0 +weight of patterns.doubledispatch.Glass = 60.0 +weight of patterns.doubledispatch.Paper = 66.0 +weight of patterns.doubledispatch.Aluminum = 36.0 +weight of patterns.doubledispatch.Cardboard = 22.0 Total value = 1086.0599818825722 */ diff --git a/patterns/dynatrash/DynaTrash.java b/patterns/dynatrash/DynaTrash.java index 35262b0ad..1ad760860 100644 --- a/patterns/dynatrash/DynaTrash.java +++ b/patterns/dynatrash/DynaTrash.java @@ -54,21 +54,21 @@ public static void main(String[] args) { Loading patterns.trash.Paper Loading patterns.trash.Aluminum Loading patterns.trash.Cardboard -weight of patterns.trash.Glass = 54.0 -weight of patterns.trash.Glass = 17.0 -weight of patterns.trash.Glass = 11.0 -weight of patterns.trash.Glass = 68.0 -weight of patterns.trash.Glass = 43.0 -weight of patterns.trash.Glass = 63.0 -________...________...________...________...________ -weight of patterns.trash.Aluminum = 93.0 -weight of patterns.trash.Aluminum = 36.0 -Total value = 860.0499778985977 weight of patterns.trash.Paper = 22.0 weight of patterns.trash.Paper = 11.0 weight of patterns.trash.Paper = 88.0 weight of patterns.trash.Paper = 91.0 weight of patterns.trash.Paper = 80.0 weight of patterns.trash.Paper = 66.0 -Total value = 35.80000053346157 +...________...________...________...________... +weight of patterns.trash.Aluminum = 81.0 +weight of patterns.trash.Aluminum = 36.0 +weight of patterns.trash.Aluminum = 93.0 +weight of patterns.trash.Aluminum = 36.0 +Total value = 860.0499778985977 +weight of patterns.trash.Cardboard = 96.0 +weight of patterns.trash.Cardboard = 44.0 +weight of patterns.trash.Cardboard = 12.0 +weight of patterns.trash.Cardboard = 22.0 +Total value = 40.02000072598457 */ diff --git a/patterns/recyclea/RecycleA.java b/patterns/recyclea/RecycleA.java index cf1e160e4..fb3174d95 100644 --- a/patterns/recyclea/RecycleA.java +++ b/patterns/recyclea/RecycleA.java @@ -100,27 +100,27 @@ public static void main(String[] args) { } } /* Output: (First and Last 11 Lines) -weight of patterns.recyclea.Aluminum = 0.11435456649761422 -weight of patterns.recyclea.Aluminum = 0.5295954256745989 -weight of patterns.recyclea.Aluminum = 0.44032876173820623 -weight of patterns.recyclea.Aluminum = 0.483968447804611 -weight of patterns.recyclea.Aluminum = 0.2724064060083268 -weight of patterns.recyclea.Aluminum = 0.7661553155473436 -weight of patterns.recyclea.Aluminum = 0.32266202529378485 -weight of patterns.recyclea.Aluminum = 0.29010681217024337 -weight of patterns.recyclea.Aluminum = 0.04867885164993724 -weight of patterns.recyclea.Aluminum = 0.6398064631177899 -Total value = 6.526465168373229 -________...________...________...________...________ -weight of patterns.recyclea.Paper = 0.7024254510631527 -weight of patterns.recyclea.Paper = 0.7775491010186331 -weight of patterns.recyclea.Paper = 0.5929413550962656 -weight of patterns.recyclea.Paper = 0.8991222558891441 -weight of patterns.recyclea.Aluminum = 0.32266202529378485 -weight of patterns.recyclea.Aluminum = 0.29010681217024337 -weight of patterns.recyclea.Glass = 0.42812712031823896 -weight of patterns.recyclea.Paper = 0.8242175461669214 -weight of patterns.recyclea.Aluminum = 0.04867885164993724 -weight of patterns.recyclea.Aluminum = 0.6398064631177899 -Total value = 7.489772197549787 +weight of Aluminum = 0.2893030122276371 +weight of Aluminum = 0.1970234961398979 +weight of Aluminum = 0.36295525806274787 +weight of Aluminum = 0.4825532324565849 +weight of Aluminum = 0.8036398273294586 +weight of Aluminum = 0.510430896154935 +weight of Aluminum = 0.6703377164093444 +weight of Aluminum = 0.41477933066243455 +weight of Aluminum = 0.3603022312124007 +weight of Aluminum = 0.43690089841661006 +weight of Aluminum = 0.6708820087907101 +...________...________...________...________... +weight of Aluminum = 0.41477933066243455 +weight of Aluminum = 0.3603022312124007 +weight of Aluminum = 0.43690089841661006 +weight of Glass = 0.5999637765664924 +weight of Glass = 0.7748836191212746 +weight of Paper = 0.5735994548427199 +weight of Glass = 0.5362827750851034 +weight of Aluminum = 0.6708820087907101 +weight of Paper = 0.8370669795210507 +weight of Glass = 0.3397919679731668 +Total value = 9.90671597531968 */ diff --git a/patterns/recycleb/RecycleB.java b/patterns/recycleb/RecycleB.java index bc2f87d75..871491eb8 100644 --- a/patterns/recycleb/RecycleB.java +++ b/patterns/recycleb/RecycleB.java @@ -42,7 +42,7 @@ public static void main(String[] args) { weight of patterns.trash.Aluminum = 34.0 weight of patterns.trash.Aluminum = 27.0 weight of patterns.trash.Aluminum = 18.0 -________...________...________...________...________ +...________...________...________...________... weight of patterns.trash.Aluminum = 93.0 weight of patterns.trash.Glass = 93.0 weight of patterns.trash.Paper = 80.0 diff --git a/patterns/recyclec/RecycleC.java b/patterns/recyclec/RecycleC.java index fa5c4fc09..9a0b86ddc 100644 --- a/patterns/recyclec/RecycleC.java +++ b/patterns/recyclec/RecycleC.java @@ -70,7 +70,7 @@ public static void main(String[] args) { weight of patterns.trash.Aluminum = 34.0 weight of patterns.trash.Aluminum = 27.0 weight of patterns.trash.Aluminum = 18.0 -________...________...________...________...________ +...________...________...________...________... weight of patterns.trash.Aluminum = 93.0 weight of patterns.trash.Glass = 93.0 weight of patterns.trash.Paper = 80.0 diff --git a/patterns/trashvisitor/TrashVisitor.java b/patterns/trashvisitor/TrashVisitor.java index 52db0d88c..1ab8b3bc5 100644 --- a/patterns/trashvisitor/TrashVisitor.java +++ b/patterns/trashvisitor/TrashVisitor.java @@ -113,7 +113,7 @@ public static void main(String[] args) { Paper weight = 22.0 value of Paper= 1.1000000163912773 Paper weight = 11.0 -________...________...________...________...________ +...________...________...________...________... value of Cardboard = 5.060000091791153 Cardboard weight = 22.0 Total Aluminum: $860.0499778985977 diff --git a/patterns/visitor/BeeAndFlowers.java b/patterns/visitor/BeeAndFlowers.java index c3782012a..739c2db01 100644 --- a/patterns/visitor/BeeAndFlowers.java +++ b/patterns/visitor/BeeAndFlowers.java @@ -98,24 +98,24 @@ public static void main(String[] args) { } } /* Output: +Gladiolus Chrysanthemum -Chrysanthemum +Gladiolus Renuculus Chrysanthemum Renuculus Chrysanthemum -Renuculus Chrysanthemum -Gladiolus +Chrysanthemum Renuculus +Bee and Gladiolus Bee and Chrysanthemum -Bee and Chrysanthemum +Bee and Gladiolus Bee and Renuculus Bee and Chrysanthemum Bee and Renuculus Bee and Chrysanthemum -Bee and Renuculus Bee and Chrysanthemum -Bee and Gladiolus +Bee and Chrysanthemum Bee and Renuculus */ diff --git a/phase1.py b/phase1.py new file mode 100644 index 000000000..d6c0383e1 --- /dev/null +++ b/phase1.py @@ -0,0 +1,46 @@ +#! py -3 +# Requires Python 3.5 +# Phase1: +# (0) Do first/last lines before formatting to width +# (1) Combine output and error (if present) files +# (2) Format all output to width limit +# (3) Add closing '*/' +from pathlib import Path +import textwrap +import pprint + +def fill_to_width(text): + result = "" + for line in text.splitlines(): + result += textwrap.fill(line, width=59) + "\n" + return result.strip() + +def adjust_lines(text): + text = text.replace("\0", "NUL") + lines = text.splitlines() + slug = lines[0] + if "(First and Last " in slug: + num_of_lines = int(slug.split()[5]) + adjusted = lines[:num_of_lines + 1] +\ + ["...________...________...________...________..."] +\ + lines[-num_of_lines:] + return "\n".join(adjusted) + elif "(First " in slug: + num_of_lines = int(slug.split()[3]) + adjusted = lines[:num_of_lines + 1] +\ + [" ..."] + return "\n".join(adjusted) + else: + return text + +if __name__ == '__main__': + for outfile in Path(".").rglob("*.out"): + out_text = adjust_lines(outfile.read_text()) + phase_1 = outfile.with_suffix(".p1") + with phase_1.open('w') as phs1: + phs1.write(fill_to_width(out_text) + "\n") + errfile = outfile.with_suffix(".err") + if errfile.exists(): + phs1.write("___[ Error Output ]___\n") + phs1.write(fill_to_width(errfile.read_text()) + "\n") + phs1.write("*/\n") diff --git a/polymorphism/RTTI.java b/polymorphism/RTTI.java index 9532abe34..a57357653 100644 --- a/polymorphism/RTTI.java +++ b/polymorphism/RTTI.java @@ -39,5 +39,4 @@ public static void main(String[] args) { Exception in thread "main" java.lang.ClassCastException: Useful cannot be cast to MoreUseful at RTTI.main(RTTI.java:31) -___[ Exception is Expected ]___ */ diff --git a/preferences/PreferencesDemo.java b/preferences/PreferencesDemo.java index 0b05105a2..386389370 100644 --- a/preferences/PreferencesDemo.java +++ b/preferences/PreferencesDemo.java @@ -30,6 +30,12 @@ public class PreferencesDemo { Footwear: Ruby Slippers Companions: 4 Are there witches?: true -UsageCount: 33 +UsageCount: 183 How many companions does Dorothy have? 4 +___[ Error Output ]___ +Jul 22, 2016 11:56:00 AM java.util.prefs.WindowsPreferences + +WARNING: Could not open/create prefs root node +Software\JavaSoft\Prefs at root 0x80000002. Windows +RegCreateKeyEx(...) returned error code 5. */ diff --git a/references/Compete.java b/references/Compete.java index e673b7677..3539fdfb7 100644 --- a/references/Compete.java +++ b/references/Compete.java @@ -81,6 +81,6 @@ public class Compete { } } /* Output: -Duplication via serialization: 202 Milliseconds -Duplication via cloning: 17 Milliseconds +Duplication via serialization: 296 Milliseconds +Duplication via cloning: 20 Milliseconds */ diff --git a/references/PassReferences.java b/references/PassReferences.java index 49348e2e9..e5b03fdda 100644 --- a/references/PassReferences.java +++ b/references/PassReferences.java @@ -14,6 +14,6 @@ public static void main(String[] args) { } } /* Output: -p inside main(): PassReferences@19e0bfd -h inside f(): PassReferences@19e0bfd +p inside main(): PassReferences@1db9742 +h inside f(): PassReferences@1db9742 */ diff --git a/serialization/AStoreCADState.java b/serialization/AStoreCADState.java index afcc799d6..b0c207327 100644 --- a/serialization/AStoreCADState.java +++ b/serialization/AStoreCADState.java @@ -99,15 +99,15 @@ public class AStoreCADState { } } /* Output: -[class Circlecolor[3] xPos[58] yPos[55] dim[93] -, class Squarecolor[3] xPos[61] yPos[61] dim[29] -, class Linecolor[3] xPos[68] yPos[0] dim[22] -, class Circlecolor[3] xPos[7] yPos[88] dim[28] -, class Squarecolor[3] xPos[51] yPos[89] dim[9] -, class Linecolor[3] xPos[78] yPos[98] dim[61] -, class Circlecolor[3] xPos[20] yPos[58] dim[16] -, class Squarecolor[3] xPos[40] yPos[11] dim[22] -, class Linecolor[3] xPos[4] yPos[83] dim[6] -, class Circlecolor[3] xPos[75] yPos[10] dim[42] +[class Circlecolor[3] xPos[35] yPos[37] dim[41] +, class Squarecolor[3] xPos[20] yPos[77] dim[79] +, class Linecolor[3] xPos[56] yPos[68] dim[48] +, class Circlecolor[3] xPos[93] yPos[70] dim[7] +, class Squarecolor[3] xPos[0] yPos[25] dim[62] +, class Linecolor[3] xPos[34] yPos[50] dim[82] +, class Circlecolor[3] xPos[31] yPos[67] dim[66] +, class Squarecolor[3] xPos[54] yPos[21] dim[6] +, class Linecolor[3] xPos[63] yPos[39] dim[63] +, class Circlecolor[3] xPos[13] yPos[90] dim[92] ] */ diff --git a/serialization/Logon.java b/serialization/Logon.java index 5987b7734..84aa3d575 100644 --- a/serialization/Logon.java +++ b/serialization/Logon.java @@ -42,11 +42,11 @@ public String toString() { /* Output: logon a = logon info: username: Hulk - date: Tue Dec 08 16:09:48 PST 2015 + date: Fri Jul 22 11:56:03 MDT 2016 password: myLittlePony -Recovering object at Tue Dec 08 16:09:49 PST 2015 +Recovering object at Fri Jul 22 11:56:04 MDT 2016 logon a = logon info: username: Hulk - date: Tue Dec 08 16:09:48 PST 2015 + date: Fri Jul 22 11:56:03 MDT 2016 password: null */ diff --git a/serialization/MyWorld.java b/serialization/MyWorld.java index d42f4ff52..2710b5c6b 100644 --- a/serialization/MyWorld.java +++ b/serialization/MyWorld.java @@ -65,9 +65,9 @@ public class MyWorld { } } /* Output: -animals: [Bosco the dog[Animal@19e0bfd], House@139a55 -, Ralph the hamster[Animal@1db9742], House@139a55 -, Molly the cat[Animal@106d69c], House@139a55 +animals: [Bosco the dog[Animal@1db9742], House@106d69c +, Ralph the hamster[Animal@52e922], House@106d69c +, Molly the cat[Animal@25154f], House@106d69c ] animals1: [Bosco the dog[Animal@10bedb4], House@103dbd3 , Ralph the hamster[Animal@167cf4d], House@103dbd3 diff --git a/serialization/RecoverCADState.java b/serialization/RecoverCADState.java index e23d0bca3..10bda437d 100644 --- a/serialization/RecoverCADState.java +++ b/serialization/RecoverCADState.java @@ -24,15 +24,15 @@ public class RecoverCADState { } } /* Output: -[class Circlecolor[1] xPos[58] yPos[55] dim[93] -, class Squarecolor[0] xPos[61] yPos[61] dim[29] -, class Linecolor[3] xPos[68] yPos[0] dim[22] -, class Circlecolor[1] xPos[7] yPos[88] dim[28] -, class Squarecolor[0] xPos[51] yPos[89] dim[9] -, class Linecolor[3] xPos[78] yPos[98] dim[61] -, class Circlecolor[1] xPos[20] yPos[58] dim[16] -, class Squarecolor[0] xPos[40] yPos[11] dim[22] -, class Linecolor[3] xPos[4] yPos[83] dim[6] -, class Circlecolor[1] xPos[75] yPos[10] dim[42] +[class Circlecolor[1] xPos[35] yPos[37] dim[41] +, class Squarecolor[0] xPos[20] yPos[77] dim[79] +, class Linecolor[3] xPos[56] yPos[68] dim[48] +, class Circlecolor[1] xPos[93] yPos[70] dim[7] +, class Squarecolor[0] xPos[0] yPos[25] dim[62] +, class Linecolor[3] xPos[34] yPos[50] dim[82] +, class Circlecolor[1] xPos[31] yPos[67] dim[66] +, class Squarecolor[0] xPos[54] yPos[21] dim[6] +, class Linecolor[3] xPos[63] yPos[39] dim[63] +, class Circlecolor[1] xPos[13] yPos[90] dim[92] ] */ diff --git a/serialization/Worm.java b/serialization/Worm.java index 0b3d949f4..e384494bd 100644 --- a/serialization/Worm.java +++ b/serialization/Worm.java @@ -86,9 +86,9 @@ public String toString() { Worm constructor: 3 Worm constructor: 2 Worm constructor: 1 -w = :a(853):b(119):c(802):d(788):e(199):f(881) +w = :a(571):b(079):c(688):d(307):e(052):f(402) Worm storage -w2 = :a(853):b(119):c(802):d(788):e(199):f(881) +w2 = :a(571):b(079):c(688):d(307):e(052):f(402) Worm storage -w3 = :a(853):b(119):c(802):d(788):e(199):f(881) +w3 = :a(571):b(079):c(688):d(307):e(052):f(402) */ diff --git a/streams/ForEach.java b/streams/ForEach.java index ebc7ab7e1..e890f6d77 100644 --- a/streams/ForEach.java +++ b/streams/ForEach.java @@ -23,6 +23,6 @@ public static void main(String[] args) { } /* Output: 258 555 693 861 961 429 868 200 522 207 288 128 551 589 -551 589 200 861 555 693 258 128 207 429 288 868 522 961 +551 589 200 522 868 861 288 128 207 555 429 693 961 258 258 555 693 861 961 429 868 200 522 207 288 128 551 589 */ diff --git a/strings/Conversion.java b/strings/Conversion.java index 242fcdae0..857ca4296 100644 --- a/strings/Conversion.java +++ b/strings/Conversion.java @@ -104,8 +104,8 @@ public static void main(String[] args) { h: 1ef462c y = new Conversion() b: true -s: Conversion@19e0bfd -h: 19e0bfd +s: Conversion@1db9742 +h: 1db9742 z = false b: false s: false diff --git a/strings/JGrep.java b/strings/JGrep.java index 93a6cc419..a0380d363 100644 --- a/strings/JGrep.java +++ b/strings/JGrep.java @@ -29,20 +29,6 @@ public class JGrep { } } /* Output: -0: String: 18 -1: String: 20 -2: String: 9 -3: String: 25 -4: String: 4 -5: for: 4 -6: String: 8 -7: return: 4 -8: String: 9 -9: String: 25 -10: String: 4 -11: String: 31 -12: for: 4 -13: String: 8 -14: return: 4 -15: String: 20 +0: for: 4 +1: for: 4 */ diff --git a/strings/TestRegularExpression.java b/strings/TestRegularExpression.java index 28257b7aa..1570cde26 100644 --- a/strings/TestRegularExpression.java +++ b/strings/TestRegularExpression.java @@ -40,6 +40,4 @@ public static void main(String[] args) { Regular expression: "(abc)+" Match "abcabcabc" at positions 0-8 Match "abc" at positions 12-14 -Regular expression: "(abc){2,}" -Match "abcabcabc" at positions 0-8 */ diff --git a/test_output.py b/test_output.py new file mode 100644 index 000000000..2f3f302fc --- /dev/null +++ b/test_output.py @@ -0,0 +1,31 @@ +#! py -3 +# Requires Python 3.5 +# Validates output from executable Java programs in "On Java 8" +# (1) Extract output in Java file, keep whole file +# (2) If direct comparison of actual output with output stored in Java file fails: +# (3) Use chain of responsibility to successively try filters until one matches or all fail +from pathlib import Path +import re + + +if __name__ == '__main__': + find_output = re.compile(r"/\* (Output:.*)\*/", re.DOTALL) # should space be \s+ ?? + for outfile in Path(".").rglob("*.p1"): + javafile = outfile.with_suffix(".java") + if not javafile.exists(): + print(str(outfile) + " has no javafile") + javatext = javafile.read_text() + if "/* Output:" not in javatext: + print(str(outfile) + " has no /* Output:") + embedded_output = find_output.search(javatext).group(0).strip() + new_output = outfile.read_text().strip() + if new_output == embedded_output: + print(str(javafile)) + else: + with outfile.with_suffix(".nomatch").open('w') as nomatch: + nomatch.write(str(embedded_output) + "\n\n") + nomatch.write("=== Actual ===\n\n") + nomatch.write(str(new_output)) + print(" No Match ".center(45, "=")) + for nomatch in Path(".").rglob("*.nomatch"): + print(nomatch) diff --git a/threads/AtomicityTest.java b/threads/AtomicityTest.java index d7dab569f..7fc53b625 100644 --- a/threads/AtomicityTest.java +++ b/threads/AtomicityTest.java @@ -29,5 +29,5 @@ public static void main(String[] args) { } } /* Output: -73 +5 */ diff --git a/threads/BankTellerSimulation.java b/threads/BankTellerSimulation.java index 12b6231ee..78517a89e 100644 --- a/threads/BankTellerSimulation.java +++ b/threads/BankTellerSimulation.java @@ -198,18 +198,21 @@ public class BankTellerSimulation { } } /* Output: -[200][207] { T1 T0 } -[861][258][140][322] { T1 T0 } -[575][342][804][826][896] { T1 T0 } -[896][984][810][141][12][689][992][976][368] { T2 T0 T1 } +[768][193][807][125] { T1 T0 } +[125][634][682][267][954][506][639][213] { T2 T0 T1 } +[213][592][770][919][552][727][998][902] { T2 T0 T1 } +[552][727][998][902][769][373][313][683][177][526] { T3 T2 +T1 T0 } TellerManager interrupted -CustomerSupplier interrupted Teller 0 interrupted -Teller 2 interrupted -Teller 1 interrupted -Teller 2 terminating Teller 0 terminating +Teller 1 interrupted +Teller 3 interrupted +Teller 2 interrupted +CustomerSupplier interrupted CustomerSupplier terminating -TellerManager terminating +Teller 2 terminating +Teller 3 terminating Teller 1 terminating +TellerManager terminating */ diff --git a/threads/CachedThreadPool.java b/threads/CachedThreadPool.java index c458a5b89..b741930a5 100644 --- a/threads/CachedThreadPool.java +++ b/threads/CachedThreadPool.java @@ -16,14 +16,14 @@ public static void main(String[] args) } } /* Output: -SleepAndPrintTask[2] pool-1-thread-3 +SleepAndPrintTask[0] pool-1-thread-1 +SleepAndPrintTask[5] pool-1-thread-6 SleepAndPrintTask[8] pool-1-thread-9 -SleepAndPrintTask[7] pool-1-thread-8 +SleepAndPrintTask[4] pool-1-thread-5 SleepAndPrintTask[9] pool-1-thread-10 -SleepAndPrintTask[6] pool-1-thread-7 -SleepAndPrintTask[5] pool-1-thread-6 SleepAndPrintTask[1] pool-1-thread-2 +SleepAndPrintTask[2] pool-1-thread-3 +SleepAndPrintTask[6] pool-1-thread-7 +SleepAndPrintTask[7] pool-1-thread-8 SleepAndPrintTask[3] pool-1-thread-4 -SleepAndPrintTask[0] pool-1-thread-1 -SleepAndPrintTask[4] pool-1-thread-5 */ diff --git a/threads/CachedThreadPool2.java b/threads/CachedThreadPool2.java index 3ab693b82..7feb190a5 100644 --- a/threads/CachedThreadPool2.java +++ b/threads/CachedThreadPool2.java @@ -16,14 +16,14 @@ public static void main(String[] args) } } /* Output: -3 pool-1-thread-4 301 -7 pool-1-thread-8 684 -6 pool-1-thread-7 584 -5 pool-1-thread-6 527 -1 pool-1-thread-2 301 -2 pool-1-thread-3 301 -0 pool-1-thread-1 301 -4 pool-1-thread-5 401 -9 pool-1-thread-10 884 -8 pool-1-thread-9 784 +2 pool-1-thread-3 518 +1 pool-1-thread-2 518 +0 pool-1-thread-1 518 +6 pool-1-thread-7 618 +5 pool-1-thread-6 518 +4 pool-1-thread-5 518 +3 pool-1-thread-4 518 +9 pool-1-thread-10 918 +8 pool-1-thread-9 818 +7 pool-1-thread-8 718 */ diff --git a/threads/CachedThreadPool3.java b/threads/CachedThreadPool3.java index e5f693aa3..1758ab634 100644 --- a/threads/CachedThreadPool3.java +++ b/threads/CachedThreadPool3.java @@ -33,15 +33,15 @@ public static void main(String[] args) } } /* Output: -0 pool-1-thread-1 100 -6 pool-1-thread-7 100 -5 pool-1-thread-6 100 3 pool-1-thread-4 100 -4 pool-1-thread-5 100 +5 pool-1-thread-6 100 +6 pool-1-thread-7 100 +1 pool-1-thread-2 100 2 pool-1-thread-3 100 7 pool-1-thread-8 100 8 pool-1-thread-9 100 -1 pool-1-thread-2 100 +4 pool-1-thread-5 100 +0 pool-1-thread-1 100 9 pool-1-thread-10 100 sum = 1000 */ diff --git a/threads/CaptureUncaughtException.java b/threads/CaptureUncaughtException.java index edc76cad4..e00e7c687 100644 --- a/threads/CaptureUncaughtException.java +++ b/threads/CaptureUncaughtException.java @@ -47,13 +47,14 @@ public static void main(String[] args) { } } /* Output: -HandlerThreadFactory@10dea4e creating new Thread -created Thread[Thread-0,5,main] -eh = MyUncaughtExceptionHandler@647e05 -run() by Thread[Thread-0,5,main] -eh = MyUncaughtExceptionHandler@647e05 -HandlerThreadFactory@10dea4e creating new Thread +HandlerThreadFactory@14991ad creating new Thread created Thread[Thread-1,5,main] -eh = MyUncaughtExceptionHandler@c34ec2 +eh = MyUncaughtExceptionHandler@d93b30 +run() by Thread-1 +eh = MyUncaughtExceptionHandler@d93b30 +HandlerThreadFactory@14991ad creating new Thread +created Thread[Thread-2,5,main] +eh = MyUncaughtExceptionHandler@28e402 caught java.lang.RuntimeException +TimedAbort 4 */ diff --git a/threads/CarBuilder.java b/threads/CarBuilder.java index cbe39f537..bd89b8ea9 100644 --- a/threads/CarBuilder.java +++ b/threads/CarBuilder.java @@ -221,15 +221,15 @@ public class CarBuilder { /* Output: ChassisBuilder created Car 0 [ engine: false driveTrain: false wheels: false ] -WheelRobot installing Wheels EngineRobot installing engine +WheelRobot installing Wheels DriveTrainRobot installing DriveTrain Car 0 [ engine: true driveTrain: true wheels: true ] ChassisBuilder created Car 1 [ engine: false driveTrain: false wheels: false ] EngineRobot installing engine -DriveTrainRobot installing DriveTrain WheelRobot installing Wheels +DriveTrainRobot installing DriveTrain Car 1 [ engine: true driveTrain: true wheels: true ] ChassisBuilder created Car 2 [ engine: false driveTrain: false wheels: false ] @@ -239,33 +239,33 @@ public class CarBuilder { Car 2 [ engine: true driveTrain: true wheels: true ] ChassisBuilder created Car 3 [ engine: false driveTrain: false wheels: false ] -DriveTrainRobot installing DriveTrain EngineRobot installing engine WheelRobot installing Wheels +DriveTrainRobot installing DriveTrain Car 3 [ engine: true driveTrain: true wheels: true ] ChassisBuilder created Car 4 [ engine: false driveTrain: false wheels: false ] EngineRobot installing engine -WheelRobot installing Wheels DriveTrainRobot installing DriveTrain +WheelRobot installing Wheels Car 4 [ engine: true driveTrain: true wheels: true ] ChassisBuilder created Car 5 [ engine: false driveTrain: false wheels: false ] +EngineRobot installing engine DriveTrainRobot installing DriveTrain WheelRobot installing Wheels -EngineRobot installing engine Car 5 [ engine: true driveTrain: true wheels: true ] ChassisBuilder created Car 6 [ engine: false driveTrain: false wheels: false ] EngineRobot installing engine -DriveTrainRobot installing DriveTrain WheelRobot installing Wheels +DriveTrainRobot installing DriveTrain Car 6 [ engine: true driveTrain: true wheels: true ] ChassisBuilder created Car 7 [ engine: false driveTrain: false wheels: false ] EngineRobot installing engine -DriveTrainRobot installing DriveTrain WheelRobot installing Wheels +DriveTrainRobot installing DriveTrain Car 7 [ engine: true driveTrain: true wheels: true ] ChassisBuilder created Car 8 [ engine: false driveTrain: false wheels: false ] @@ -281,20 +281,32 @@ public class CarBuilder { Car 9 [ engine: true driveTrain: true wheels: true ] ChassisBuilder created Car 10 [ engine: false driveTrain: false wheels: false ] -DriveTrainRobot installing DriveTrain WheelRobot installing Wheels +DriveTrainRobot installing DriveTrain EngineRobot installing engine Car 10 [ engine: true driveTrain: true wheels: true ] +ChassisBuilder created Car 11 [ engine: false driveTrain: +false wheels: false ] +DriveTrainRobot installing DriveTrain +WheelRobot installing Wheels +EngineRobot installing engine +Car 11 [ engine: true driveTrain: true wheels: true ] +ChassisBuilder created Car 12 [ engine: false driveTrain: +false wheels: false ] +DriveTrainRobot installing DriveTrain +WheelRobot installing Wheels +EngineRobot installing engine +Car 12 [ engine: true driveTrain: true wheels: true ] Exiting Reporter via interrupt +Reporter off Exiting EngineRobot via interrupt -Interrupted: ChassisBuilder -Exiting WheelRobot via interrupt +EngineRobot off Exiting DriveTrainRobot via interrupt +Exiting WheelRobot via interrupt +Interrupted: ChassisBuilder Exiting Assembler via interrupt -Assembler off -DriveTrainRobot off -WheelRobot off ChassisBuilder off -EngineRobot off -Reporter off +WheelRobot off +DriveTrainRobot off +Assembler off */ diff --git a/threads/CountingStream.java b/threads/CountingStream.java index e5f27a774..cfcb92bce 100644 --- a/threads/CountingStream.java +++ b/threads/CountingStream.java @@ -17,15 +17,15 @@ public static void main(String[] args) { } } /* Output: -1 ForkJoinPool.commonPool-worker-3 100 -4 ForkJoinPool.commonPool-worker-5 100 -3 ForkJoinPool.commonPool-worker-3 100 -5 ForkJoinPool.commonPool-worker-5 100 -0 ForkJoinPool.commonPool-worker-6 100 -8 ForkJoinPool.commonPool-worker-2 100 -7 ForkJoinPool.commonPool-worker-4 100 -9 ForkJoinPool.commonPool-worker-7 100 +0 ForkJoinPool.commonPool-worker-4 100 +4 ForkJoinPool.commonPool-worker-3 100 +3 ForkJoinPool.commonPool-worker-5 100 6 main 100 +8 ForkJoinPool.commonPool-worker-6 100 +5 ForkJoinPool.commonPool-worker-7 100 2 ForkJoinPool.commonPool-worker-1 100 +1 ForkJoinPool.commonPool-worker-2 100 +9 ForkJoinPool.commonPool-worker-3 100 +7 ForkJoinPool.commonPool-worker-4 100 1000 */ diff --git a/threads/CriticalSection.java b/threads/CriticalSection.java index 922a9e033..18f04b172 100644 --- a/threads/CriticalSection.java +++ b/threads/CriticalSection.java @@ -148,6 +148,5 @@ public static void main(String[] args) { } } /* Output: -pm1: Pair: x: 15, y: 15 checkCounter = 272565 -pm2: Pair: x: 16, y: 16 checkCounter = 3956974 +TimedAbort 4 */ diff --git a/threads/DeadlockingDiningPhilosophers.java b/threads/DeadlockingDiningPhilosophers.java index d9464cd1a..779f5c1ae 100644 --- a/threads/DeadlockingDiningPhilosophers.java +++ b/threads/DeadlockingDiningPhilosophers.java @@ -32,25 +32,25 @@ public class DeadlockingDiningPhilosophers { } } /* Output: (First and Last 10 Lines) +Philosopher 2 thinking +Philosopher 3 thinking +Philosopher 3 grabbing right +Philosopher 3 grabbing left +Philosopher 3 eating Philosopher 1 thinking Philosopher 1 grabbing right Philosopher 1 grabbing left -Philosopher 1 eating -Philosopher 1 thinking -Philosopher 3 thinking Philosopher 4 thinking -Philosopher 2 thinking -Philosopher 1 grabbing right Philosopher 0 thinking -________...________...________...________...________ -Philosopher 3 grabbing left +...________...________...________...________... +Philosopher 0 grabbing right +Philosopher 1 grabbing right +Philosopher 1 grabbing left Philosopher 2 grabbing left Philosopher 0 grabbing left -Philosopher 4 grabbing left -Philosopher 1 grabbing left -Philosopher 3 exiting via interrupt -Philosopher 4 exiting via interrupt Philosopher 1 exiting via interrupt Philosopher 0 exiting via interrupt +Philosopher 3 exiting via interrupt +Philosopher 4 exiting via interrupt Philosopher 2 exiting via interrupt */ diff --git a/threads/DelayQueueDemo.java b/threads/DelayQueueDemo.java index 5ca8ee09e..89ad75dcd 100644 --- a/threads/DelayQueueDemo.java +++ b/threads/DelayQueueDemo.java @@ -91,15 +91,15 @@ public static void main(String[] args) { } } /* Output: -[128 ] Task 11 [200 ] Task 7 [429 ] Task 5 [520 ] Task 18 -[555 ] Task 1 [961 ] Task 4 [998 ] Task 16 [1207] Task 9 -[1693] Task 2 [1809] Task 14 [1861] Task 3 [2278] Task 15 -[3288] Task 10 [3551] Task 12 [4258] Task 0 [4258] Task 19 -[4522] Task 8 [4589] Task 13 [4861] Task 17 [4868] Task 6 -(0:4258) (1:555) (2:1693) (3:1861) (4:961) (5:429) (6:4868) -(7:200) (8:4522) (9:1207) (10:3288) (11:128) (12:3551) -(13:4589) (14:1809) (15:2278) (16:998) (17:4861) (18:520) -(19:4258) (20:5000) +[70 ] Task 10 [125 ] Task 13 [267 ] Task 19 [635 ] Task 0 +[650 ] Task 16 [682 ] Task 17 [807 ] Task 11 [1131] Task 18 +[1177] Task 4 [1193] Task 9 [1634] Task 15 [1656] Task 6 +[2400] Task 12 [3479] Task 5 [3737] Task 1 [3768] Task 7 +[3941] Task 2 [4720] Task 3 [4762] Task 14 [4948] Task 8 +(0:635) (1:3737) (2:3941) (3:4720) (4:1177) (5:3479) +(6:1656) (7:3768) (8:4948) (9:1193) (10:70) (11:807) +(12:2400) (13:125) (14:4762) (15:1634) (16:650) (17:682) +(18:1131) (19:267) (20:5000) [5000] Task 20 Calling shutdownNow() Finished DelayedTaskConsumer */ diff --git a/threads/EvenSupplier.java b/threads/EvenSupplier.java index 97f792baf..89d8ead8a 100644 --- a/threads/EvenSupplier.java +++ b/threads/EvenSupplier.java @@ -20,7 +20,8 @@ public static void main(String[] args) { } /* Output: Press Control-C to exit -1305 not even! -1307 not even! -1303 not even! +23 not even! +27 not even! +25 not even! +TimedAbort 4 */ diff --git a/threads/ExplicitCriticalSection.java b/threads/ExplicitCriticalSection.java index 21bc41bf8..28f044407 100644 --- a/threads/ExplicitCriticalSection.java +++ b/threads/ExplicitCriticalSection.java @@ -52,32 +52,28 @@ public class ExplicitCriticalSection { } } /* Output: -pm1: Pair: x: 10, y: 10 checkCounter = 2193118 -pm2: Pair: x: 10, y: 10 checkCounter = 2184256 +pm1: Pair: x: 10, y: 10 checkCounter = 3504848 +pm2: Pair: x: 10, y: 10 checkCounter = 2105413 ___[ Error Output ]___ -Exception in thread "pool-1-thread-4" Exception in thread -"pool-1-thread-3" -concurrency.Pair$PairValuesNotEqualException: Pair values -not equal: x: 2, y: 1 +Exception in thread "pool-1-thread-3" Exception in thread +"pool-1-thread-4" threads.Pair$PairValuesNotEqualException: +Pair values not equal: x: 3, y: 2 + at threads.Pair.checkState(CriticalSection.java:37) at -concurrency.Pair.checkState(CriticalSection.java:36) - at -concurrency.PairChecker.run(CriticalSection.java:110) +threads.PairChecker.run(CriticalSection.java:111) at java.util.concurrent.ThreadPoolExecutor.runWorke r(ThreadPoolExecutor.java:1142) at java.util.concurrent.ThreadPoolExecutor$Worker.r un(ThreadPoolExecutor.java:617) at java.lang.Thread.run(Thread.java:745) -concurrency.Pair$PairValuesNotEqualException: Pair values -not equal: x: 2, y: 1 - at -concurrency.Pair.checkState(CriticalSection.java:36) +threads.Pair$PairValuesNotEqualException: Pair values not +equal: x: 3, y: 2 + at threads.Pair.checkState(CriticalSection.java:37) at -concurrency.PairChecker.run(CriticalSection.java:110) +threads.PairChecker.run(CriticalSection.java:111) at java.util.concurrent.ThreadPoolExecutor.runWorke r(ThreadPoolExecutor.java:1142) at java.util.concurrent.ThreadPoolExecutor$Worker.r un(ThreadPoolExecutor.java:617) at java.lang.Thread.run(Thread.java:745) -___[ Exception is Expected ]___ */ diff --git a/threads/FixedDiningPhilosophers.java b/threads/FixedDiningPhilosophers.java index 279e587f3..8282d947e 100644 --- a/threads/FixedDiningPhilosophers.java +++ b/threads/FixedDiningPhilosophers.java @@ -36,25 +36,25 @@ public class FixedDiningPhilosophers { } } /* Output: (First and Last 10 Lines) +Philosopher 0 thinking Philosopher 4 thinking Philosopher 3 thinking -Philosopher 0 thinking Philosopher 2 thinking Philosopher 1 thinking -Philosopher 4 grabbing right -Philosopher 1 grabbing right -Philosopher 2 grabbing right -Philosopher 2 grabbing left Philosopher 0 grabbing right -________...________...________...________...________ +Philosopher 0 grabbing left +Philosopher 0 eating +Philosopher 3 grabbing right Philosopher 2 grabbing right -Philosopher 1 exiting via interrupt -Philosopher 0 exiting via interrupt -Philosopher 3 exiting via interrupt +...________...________...________...________... +Philosopher 4 thinking +Philosopher 3 grabbing left +Philosopher 3 eating +Philosopher 0 eating Philosopher 4 grabbing right -Philosopher 2 grabbing left -Philosopher 4 grabbing left -Philosopher 2 exiting via interrupt -Philosopher 4 eating +Philosopher 3 exiting via interrupt +Philosopher 0 exiting via interrupt +Philosopher 1 exiting via interrupt Philosopher 4 exiting via interrupt +Philosopher 2 exiting via interrupt */ diff --git a/threads/GreenhouseScheduler.java b/threads/GreenhouseScheduler.java index d6f5876ba..e06e36171 100644 --- a/threads/GreenhouseScheduler.java +++ b/threads/GreenhouseScheduler.java @@ -174,29 +174,29 @@ public static void main(String[] args) { Turning on lights Turning off lights Turning greenhouse water on -Turning on lights Turning greenhouse water off Thermostat to day setting Turning on lights -Turning off lights -________...________...________...________...________ Turning on lights -Mon Jun 15 16:00:00 PDT 2015 temperature: 66.4 humidity: -50.05 -Mon Jun 15 16:30:00 PDT 2015 temperature: 68.0 humidity: -50.47 -Mon Jun 15 17:00:00 PDT 2015 temperature: 69.7 humidity: -51.42 -Mon Jun 15 17:30:00 PDT 2015 temperature: 70.8 humidity: -50.87 -Mon Jun 15 18:00:00 PDT 2015 temperature: 72.0 humidity: -50.32 -Mon Jun 15 18:30:00 PDT 2015 temperature: 73.2 humidity: -49.92 -Mon Jun 15 19:00:00 PDT 2015 temperature: 71.9 humidity: -49.81 -Mon Jun 15 19:30:00 PDT 2015 temperature: 70.1 humidity: -50.25 -Mon Jun 15 20:00:00 PDT 2015 temperature: 68.9 humidity: -51.00 +Turning off lights +...________...________...________...________... +Terminating +Fri Jul 22 12:00:00 MDT 2016 temperature: 66.3 humidity: +50.20 +Fri Jul 22 12:30:00 MDT 2016 temperature: 67.3 humidity: +51.02 +Fri Jul 22 13:00:00 MDT 2016 temperature: 68.8 humidity: +51.82 +Fri Jul 22 13:30:00 MDT 2016 temperature: 70.0 humidity: +52.19 +Fri Jul 22 14:00:00 MDT 2016 temperature: 71.5 humidity: +52.99 +Fri Jul 22 14:30:00 MDT 2016 temperature: 73.0 humidity: +53.32 +Fri Jul 22 15:00:00 MDT 2016 temperature: 74.4 humidity: +53.99 +Fri Jul 22 15:30:00 MDT 2016 temperature: 75.5 humidity: +54.40 +Fri Jul 22 16:00:00 MDT 2016 temperature: 76.8 humidity: +53.96 */ diff --git a/threads/HorseRace.java b/threads/HorseRace.java index fe8aa97a3..4dd903f8b 100644 --- a/threads/HorseRace.java +++ b/threads/HorseRace.java @@ -91,56 +91,57 @@ public static void main(String[] args) { /* Output: (First and Last 18 Lines) =========================================================== ================ -*0 +0 **1 -*2 -**3 +2 +*3 **4 -*5 -**6 +**5 +*6 =========================================================== ================ -***0 -**1 +**0 +****1 *2 -***3 +**3 ***4 -*5 -**6 +****5 +*6 =========================================================== ================ -*****0 -________...________...________...________...________ -*****************************************************6 +**0 +...________...________...________...________... +*********************************************************** +6 =========================================================== ================ *********************************************************** -*0 +************0 *********************************************************** -1 +*********1 *********************************************************** -*2 +****2 *********************************************************** **************3 *********************************************************** -4 +**4 +******************************************************5 *********************************************************** -***********5 -*******************************************************6 +**6 =========================================================== ================ *********************************************************** -**0 +*************0 *********************************************************** -**1 +**********1 *********************************************************** -**2 +****2 *********************************************************** ****************3 *********************************************************** -*4 +****4 +********************************************************5 *********************************************************** -*************5 -********************************************************6 +****6 Horse 3 won! */ diff --git a/threads/MoreTasksAfterShutdown.java b/threads/MoreTasksAfterShutdown.java index 6ee70849b..53a2d212c 100644 --- a/threads/MoreTasksAfterShutdown.java +++ b/threads/MoreTasksAfterShutdown.java @@ -20,10 +20,10 @@ public static void main(String[] args) } } /* Output: -java.util.concurrent.RejectedExecutionException: -Task SleepAndPrintTask[99] rejected from -java.util.concurrent.ThreadPoolExecutor@25154f[ -Shutting down, pool size = 1, active threads = 1, -queued tasks = 0, completed tasks = 0] +java.util.concurrent.RejectedExecutionException: Task +SleepAndPrintTask[99] rejected from +java.util.concurrent.ThreadPoolExecutor@25154f[Shutting +down, pool size = 1, active threads = 1, queued tasks = 0, +completed tasks = 0] SleepAndPrintTask[1] pool-1-thread-1 */ diff --git a/threads/ParallelStreamPuzzle2.java b/threads/ParallelStreamPuzzle2.java index 8641906d6..bcf17e412 100644 --- a/threads/ParallelStreamPuzzle2.java +++ b/threads/ParallelStreamPuzzle2.java @@ -30,4 +30,5 @@ public static void main(String[] args) throws Exception { } } /* Output: +[29, 30, 31, 33, 35, 36, 37, 38, 39, 91] */ diff --git a/threads/ParallelStreamPuzzle3.java b/threads/ParallelStreamPuzzle3.java index c039e30e3..7eabf812a 100644 --- a/threads/ParallelStreamPuzzle3.java +++ b/threads/ParallelStreamPuzzle3.java @@ -18,15 +18,15 @@ public static void main(String[] args) { } } /* Output: -1: ForkJoinPool.commonPool-worker-3 +6: ForkJoinPool.commonPool-worker-5 +3: ForkJoinPool.commonPool-worker-7 2: ForkJoinPool.commonPool-worker-6 +0: ForkJoinPool.commonPool-worker-4 4: ForkJoinPool.commonPool-worker-1 -3: ForkJoinPool.commonPool-worker-7 +1: ForkJoinPool.commonPool-worker-3 8: main -0: ForkJoinPool.commonPool-worker-4 -6: ForkJoinPool.commonPool-worker-5 +7: ForkJoinPool.commonPool-worker-7 +5: ForkJoinPool.commonPool-worker-5 9: ForkJoinPool.commonPool-worker-2 -7: ForkJoinPool.commonPool-worker-6 -5: ForkJoinPool.commonPool-worker-3 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] */ diff --git a/threads/PriorityBlockingQueueDemo.java b/threads/PriorityBlockingQueueDemo.java index 616ece024..e6caac953 100644 --- a/threads/PriorityBlockingQueueDemo.java +++ b/threads/PriorityBlockingQueueDemo.java @@ -128,24 +128,24 @@ public class PriorityBlockingQueueDemo { } } /* Output: (First and Last 12 Lines) -[8 ] Task 0 [9 ] Task 5 -[9 ] Task 13 -[9 ] Task 14 -[8 ] Task 10 -[8 ] Task 16 -[8 ] Task 19 -[8 ] Task 11 -[8 ] Task 6 -[8 ] Task 15 -[7 ] Task 9 -[5 ] Task 1 -________...________...________...________...________ -[0 ] Task 30 -(0:8)(1:5)(2:3)(3:1)(4:1) -(5:9)(6:8)(7:0)(8:2)(9:7) -(10:8)(11:8)(12:1)(13:9)(14:9) -(15:8)(16:8)(17:1)(18:0)(19:8) +[8 ] Task 7 +[10 ] Task 20 +[8 ] Task 8 +[10 ] Task 21 +[7 ] Task 19 +[10 ] Task 22 +[7 ] Task 11 +[10 ] Task 23 +[7 ] Task 4 +[10 ] Task 24 +[7 ] Task 1 +...________...________...________...________... +[0 ] Task 16 +(0:5)(1:7)(2:1)(3:0)(4:7) +(5:9)(6:6)(7:8)(8:8)(9:3) +(10:0)(11:7)(12:0)(13:5)(14:2) +(15:4)(16:0)(17:2)(18:1)(19:7) (20:10)(21:10)(22:10)(23:10)(24:10) (25:10)(26:10)(27:10)(28:10)(29:10) (30:0)(31:1)(32:2)(33:3)(34:4) diff --git a/threads/SerialNumberChecker.java b/threads/SerialNumberChecker.java index 55d3caf51..fcb4d0f03 100644 --- a/threads/SerialNumberChecker.java +++ b/threads/SerialNumberChecker.java @@ -65,6 +65,5 @@ public void run() { } } /* Output: -Duplicate: 5453 -Duplicate: 5639 +Duplicate: 5178 */ diff --git a/threads/SettingDefaultHandler.java b/threads/SettingDefaultHandler.java index eb027d410..708a4f582 100644 --- a/threads/SettingDefaultHandler.java +++ b/threads/SettingDefaultHandler.java @@ -16,4 +16,5 @@ public static void main(String[] args) { } /* Output: caught java.lang.RuntimeException +TimedAbort 4 */ diff --git a/threads/SingleThreadExecutor.java b/threads/SingleThreadExecutor.java index 8061310e0..ef9446795 100644 --- a/threads/SingleThreadExecutor.java +++ b/threads/SingleThreadExecutor.java @@ -29,22 +29,22 @@ public static void main(String[] args) { main awaiting termination main awaiting termination SleepAndPrintTask[0] pool-1-thread-1 -main awaiting termination SleepAndPrintTask[1] pool-1-thread-1 -SleepAndPrintTask[2] pool-1-thread-1 main awaiting termination +main awaiting termination +SleepAndPrintTask[2] pool-1-thread-1 SleepAndPrintTask[3] pool-1-thread-1 main awaiting termination main awaiting termination SleepAndPrintTask[4] pool-1-thread-1 main awaiting termination SleepAndPrintTask[5] pool-1-thread-1 -main awaiting termination SleepAndPrintTask[6] pool-1-thread-1 main awaiting termination -SleepAndPrintTask[7] pool-1-thread-1 main awaiting termination +SleepAndPrintTask[7] pool-1-thread-1 SleepAndPrintTask[8] pool-1-thread-1 main awaiting termination +main awaiting termination SleepAndPrintTask[9] pool-1-thread-1 */ diff --git a/threads/Summing.java b/threads/Summing.java index b763df47a..4938d0833 100644 --- a/threads/Summing.java +++ b/threads/Summing.java @@ -44,7 +44,7 @@ public static void main(String[] args) { } /* Output: 5000000050000000 -Sum Stream: 625ms -Sum Stream Parallel: 158ms -Sum Iterated: 2521ms +Sum Stream: 629ms +Sum Stream Parallel: 167ms +Sum Iterated: 2537ms */ diff --git a/threads/Summing2.java b/threads/Summing2.java index 4fb79d714..9b3fcf730 100644 --- a/threads/Summing2.java +++ b/threads/Summing2.java @@ -36,8 +36,8 @@ public static void main(String[] args) { } /* Output: 200000010000000 -Array Stream Sum: 114ms -Parallel: 27ms +Array Stream Sum: 111ms +Parallel: 26ms Basic Sum: 33ms -parallelPrefix: 49ms +parallelPrefix: 50ms */ diff --git a/threads/Summing3.java b/threads/Summing3.java index 69a4314b0..ad4d240ff 100644 --- a/threads/Summing3.java +++ b/threads/Summing3.java @@ -35,7 +35,7 @@ public static void main(String[] args) { } /* Output: 50000005000000 -Long Array Stream Reduce: 1046ms +Long Array Stream Reduce: 1142ms Long Basic Sum: 21ms -Long parallelPrefix: 3287ms +Long parallelPrefix: 3571ms */ diff --git a/threads/Summing4.java b/threads/Summing4.java index 99ec194e2..175d3acf3 100644 --- a/threads/Summing4.java +++ b/threads/Summing4.java @@ -16,5 +16,5 @@ public static void main(String[] args) { } /* Output: 50000005000000 -Long Parallel: 1008ms +Long Parallel: 978ms */ diff --git a/threads/SyncObject.java b/threads/SyncObject.java index be7424e19..79ae1d3ef 100644 --- a/threads/SyncObject.java +++ b/threads/SyncObject.java @@ -35,14 +35,14 @@ public void run() { } } /* Output: -f() g() g() -f() g() -f() +g() g() f() f() -g() +f() +f() +f() */ diff --git a/threads/ToastOMatic.java b/threads/ToastOMatic.java index e3e484588..97d85dffb 100644 --- a/threads/ToastOMatic.java +++ b/threads/ToastOMatic.java @@ -193,20 +193,12 @@ public class ToastOMatic { Toast 12: BUTTERED Toast 12: JAMMED Chomp! Toast 12: JAMMED -Toast 13: DRY -Toast 13: BUTTERED -Toast 13: JAMMED -Chomp! Toast 13: JAMMED -Toast 14: DRY -Toast 14: BUTTERED -Toast 14: JAMMED -Chomp! Toast 14: JAMMED -Jammer interrupted -Jammer off +Eater interrupted Butterer interrupted -Butterer off Toaster interrupted -Eater interrupted Toaster off +Jammer interrupted +Butterer off Eater off +Jammer off */ diff --git a/threads/WorkStealingPool.java b/threads/WorkStealingPool.java index a84d47b42..650074682 100644 --- a/threads/WorkStealingPool.java +++ b/threads/WorkStealingPool.java @@ -25,15 +25,15 @@ public static void main(String[] args) } } /* Output: -4 +8 ForkJoinPool-1-worker-1 -ForkJoinPool-1-worker-3 ForkJoinPool-1-worker-2 -ForkJoinPool-1-worker-1 ForkJoinPool-1-worker-3 -ForkJoinPool-1-worker-0 -ForkJoinPool-1-worker-1 -ForkJoinPool-1-worker-2 -ForkJoinPool-1-worker-0 ForkJoinPool-1-worker-3 +ForkJoinPool-1-worker-3 +ForkJoinPool-1-worker-4 +ForkJoinPool-1-worker-5 +ForkJoinPool-1-worker-3 +ForkJoinPool-1-worker-2 +ForkJoinPool-1-worker-1 */ diff --git a/threads/restaurant2/RestaurantWithQueues.java b/threads/restaurant2/RestaurantWithQueues.java index 7b5083e92..beb3a12a3 100644 --- a/threads/restaurant2/RestaurantWithQueues.java +++ b/threads/restaurant2/RestaurantWithQueues.java @@ -207,25 +207,25 @@ public class RestaurantWithQueues { } } /* Output: (First and Last 10 Lines) -WaitPerson 0 received SPRING_ROLLS delivering to Customer 1 +WaitPerson 0 received SALAD delivering to Customer 0 +Customer 0 eating SALAD +WaitPerson 2 received SPRING_ROLLS delivering to Customer 1 Customer 1 eating SPRING_ROLLS -WaitPerson 3 received SPRING_ROLLS delivering to Customer 0 -Customer 0 eating SPRING_ROLLS -WaitPerson 3 received SOUP delivering to Customer 2 +WaitPerson 1 received SOUP delivering to Customer 2 Customer 2 eating SOUP -WaitPerson 0 received VINDALOO delivering to Customer 1 -Customer 1 eating VINDALOO -WaitPerson 1 received SOUP delivering to Customer 3 -Customer 3 eating SOUP -________...________...________...________...________ -WaitPerson 3 off duty -Customer 6 finished meal, leaving -WaitPerson 4 off duty -Customer 42 finished meal, leaving +WaitPerson 0 received LENTILS delivering to Customer 0 +Customer 0 eating LENTILS +WaitPerson 0 received SPRING_ROLLS delivering to Customer 3 +Customer 3 eating SPRING_ROLLS +...________...________...________...________... +WaitPerson 0 off duty +Customer 46 finished meal, leaving +Customer 37 finished meal, leaving +Customer 31 finished meal, leaving +Customer 1 finished meal, leaving +Customer 3 finished meal, leaving +Customer 17 finished meal, leaving +Customer 12 finished meal, leaving +Customer 4 finished meal, leaving Customer 7 finished meal, leaving -Customer 28 finished meal, leaving -Customer 9 finished meal, leaving -Customer 15 finished meal, leaving -Customer 21 finished meal, leaving -Customer 0 finished meal, leaving */ diff --git a/typeinfo/PetCount3.java b/typeinfo/PetCount3.java index efd157d93..74291dc47 100644 --- a/typeinfo/PetCount3.java +++ b/typeinfo/PetCount3.java @@ -53,6 +53,6 @@ public static void main(String[] args) { Rat Manx Cymric Mutt Pug Cymric Pug Manx Cymric Rat EgyptianMau Hamster EgyptianMau Mutt Mutt Cymric Mouse Pug Mouse Cymric -{Pet=20, Dog=6, Cat=9, Rodent=5, Mutt=3, Pug=3, -EgyptianMau=2, Manx=7, Cymric=5, Rat=2, Mouse=2, Hamster=1} +{Hamster=1, Rodent=5, Mouse=2, Dog=6, Cymric=5, Manx=7, +Rat=2, Pug=3, Mutt=3, Pet=20, EgyptianMau=2, Cat=9} */ diff --git a/typeinfo/PetCount4.java b/typeinfo/PetCount4.java index 5f1197e82..2112db6a3 100644 --- a/typeinfo/PetCount4.java +++ b/typeinfo/PetCount4.java @@ -20,6 +20,6 @@ public static void main(String[] args) { Rat Manx Cymric Mutt Pug Cymric Pug Manx Cymric Rat EgyptianMau Hamster EgyptianMau Mutt Mutt Cymric Mouse Pug Mouse Cymric -{Mutt=3, Rat=2, EgyptianMau=2, Pet=20, Mouse=2, Manx=7, -Cat=9, Rodent=5, Cymric=5, Dog=6, Pug=3, Hamster=1} +{EgyptianMau=2, Hamster=1, Pug=3, Manx=7, Cymric=5, Dog=6, +Mutt=3, Rat=2, Mouse=2, Rodent=5, Pet=20, Cat=9} */ diff --git a/update_extracted_example_output.py b/update_extracted_example_output.py new file mode 100644 index 000000000..3e21c2830 --- /dev/null +++ b/update_extracted_example_output.py @@ -0,0 +1,35 @@ +#! py -3 +# Requires Python 3.5 +# Updates generated output into extracted Java programs in "On Java 8" +from pathlib import Path +import pprint +import sys + +def remove_output(javatext): + result = "" + for line in javatext.splitlines(): + if "/* Output:" not in line: + result += line.rstrip() + "\n" + else: + return result + +def update_file(outfile): + print(str(outfile)) + javafile = outfile.with_suffix(".java") + if not javafile.exists(): + print(str(outfile) + " has no javafile") + sys.exit(1) + javatext = javafile.read_text() + if "/* Output:" not in javatext: + print(str(javafile) + " has no /* Output:") + sys.exit(1) + new_output = outfile.read_text() + new_javatext = remove_output(javatext) + new_output + javafile.write_text(new_javatext) + +if __name__ == '__main__': + if len(sys.argv) > 1: + update_file(Path(sys.argv[1])) + else: + for outfile in Path(".").rglob("*.p1"): + update_file(outfile) From 873637cf1d73016426729c2a1d495852b735ea3e Mon Sep 17 00:00:00 2001 From: Bruce Eckel Date: Fri, 22 Jul 2016 17:26:49 -0600 Subject: [PATCH 046/320] Added "gradlew verify" --- build.gradle | 5 +++++ gradle.properties | 2 ++ phase1.py | 46 ---------------------------------------------- test_output.py | 43 +++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 50 insertions(+), 46 deletions(-) create mode 100644 gradle.properties delete mode 100644 phase1.py diff --git a/build.gradle b/build.gradle index a680304fb..59819dc1c 100644 --- a/build.gradle +++ b/build.gradle @@ -184,3 +184,8 @@ configure(subprojects - project(':onjava')) { compile project(':onjava') } } + +task verify(type:Exec) { + println("execute 'gradlew run' first") + commandLine 'python', 'test_output.py' +} diff --git a/gradle.properties b/gradle.properties new file mode 100644 index 000000000..41f55a530 --- /dev/null +++ b/gradle.properties @@ -0,0 +1,2 @@ +org.gradle.daemon=true +org.gradle.parallel=true diff --git a/phase1.py b/phase1.py deleted file mode 100644 index d6c0383e1..000000000 --- a/phase1.py +++ /dev/null @@ -1,46 +0,0 @@ -#! py -3 -# Requires Python 3.5 -# Phase1: -# (0) Do first/last lines before formatting to width -# (1) Combine output and error (if present) files -# (2) Format all output to width limit -# (3) Add closing '*/' -from pathlib import Path -import textwrap -import pprint - -def fill_to_width(text): - result = "" - for line in text.splitlines(): - result += textwrap.fill(line, width=59) + "\n" - return result.strip() - -def adjust_lines(text): - text = text.replace("\0", "NUL") - lines = text.splitlines() - slug = lines[0] - if "(First and Last " in slug: - num_of_lines = int(slug.split()[5]) - adjusted = lines[:num_of_lines + 1] +\ - ["...________...________...________...________..."] +\ - lines[-num_of_lines:] - return "\n".join(adjusted) - elif "(First " in slug: - num_of_lines = int(slug.split()[3]) - adjusted = lines[:num_of_lines + 1] +\ - [" ..."] - return "\n".join(adjusted) - else: - return text - -if __name__ == '__main__': - for outfile in Path(".").rglob("*.out"): - out_text = adjust_lines(outfile.read_text()) - phase_1 = outfile.with_suffix(".p1") - with phase_1.open('w') as phs1: - phs1.write(fill_to_width(out_text) + "\n") - errfile = outfile.with_suffix(".err") - if errfile.exists(): - phs1.write("___[ Error Output ]___\n") - phs1.write(fill_to_width(errfile.read_text()) + "\n") - phs1.write("*/\n") diff --git a/test_output.py b/test_output.py index 2f3f302fc..19bef65d4 100644 --- a/test_output.py +++ b/test_output.py @@ -5,10 +5,53 @@ # (2) If direct comparison of actual output with output stored in Java file fails: # (3) Use chain of responsibility to successively try filters until one matches or all fail from pathlib import Path +import textwrap import re +def fill_to_width(text): + result = "" + for line in text.splitlines(): + result += textwrap.fill(line, width=59) + "\n" + return result.strip() + +def adjust_lines(text): + text = text.replace("\0", "NUL") + lines = text.splitlines() + slug = lines[0] + if "(First and Last " in slug: + num_of_lines = int(slug.split()[5]) + adjusted = lines[:num_of_lines + 1] +\ + ["...________...________...________...________..."] +\ + lines[-num_of_lines:] + return "\n".join(adjusted) + elif "(First " in slug: + num_of_lines = int(slug.split()[3]) + adjusted = lines[:num_of_lines + 1] +\ + [" ..."] + return "\n".join(adjusted) + else: + return text + +def phase1(): + """ + (0) Do first/last lines before formatting to width + (1) Combine output and error (if present) files + (2) Format all output to width limit + (3) Add closing '*/' + """ + for outfile in Path(".").rglob("*.out"): + out_text = adjust_lines(outfile.read_text()) + phase_1 = outfile.with_suffix(".p1") + with phase_1.open('w') as phs1: + phs1.write(fill_to_width(out_text) + "\n") + errfile = outfile.with_suffix(".err") + if errfile.exists(): + phs1.write("___[ Error Output ]___\n") + phs1.write(fill_to_width(errfile.read_text()) + "\n") + phs1.write("*/\n") if __name__ == '__main__': + phase1() find_output = re.compile(r"/\* (Output:.*)\*/", re.DOTALL) # should space be \s+ ?? for outfile in Path(".").rglob("*.p1"): javafile = outfile.with_suffix(".java") From 45133a4945c69b9928ba3f0b6f4f147e00c39900 Mon Sep 17 00:00:00 2001 From: Bruce Eckel Date: Tue, 26 Jul 2016 10:28:19 -0600 Subject: [PATCH 047/320] switch to verify_output.py --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 59819dc1c..fae3fb384 100644 --- a/build.gradle +++ b/build.gradle @@ -187,5 +187,5 @@ configure(subprojects - project(':onjava')) { task verify(type:Exec) { println("execute 'gradlew run' first") - commandLine 'python', 'test_output.py' + commandLine 'python', 'verify_output.py' } From e84910951c35def1076c9aabf5bedef8d3bf6ac9 Mon Sep 17 00:00:00 2001 From: Bruce Eckel Date: Wed, 27 Jul 2016 11:12:11 -0600 Subject: [PATCH 048/320] Updated output, added verify_output.py --- annotations/AtUnitComposition.java | 2 +- annotations/AtUnitExample2.java | 4 +- annotations/AtUnitExample3.java | 4 +- annotations/AtUnitExample5.java | 4 +- annotations/AtUnitExternalTest.java | 2 +- annotations/HashSetTest.java | 2 +- annotations/StackLStringTest.java | 4 +- arrays/BadMicroBenchmark.java | 4 +- arrays/BadMicroBenchmark2.java | 4 +- arrays/BadMicroBenchmark3.java | 8 +- arrays/ParallelSort.java | 4 +- collectionsindepth/ListPerformance.java | 10 +- collectionsindepth/MapPerformance.java | 12 +- collectionsindepth/SetPerformance.java | 6 +- enums/ConstantSpecificMethod.java | 4 +- exceptions/LoggingExceptions.java | 4 +- exceptions/LoggingExceptions2.java | 2 +- files/Directories.java | 14 +- files/Find.java | 24 +- files/PathAnalysis.java | 4 +- files/TreeWatcher.java | 3 + generics/DynamicProxyMixin.java | 2 +- generics/Mixins.java | 4 +- logging/ConfigureLogging.java | 48 +-- logging/CustomHandler.java | 4 +- logging/InfoLogging.java | 2 +- logging/InfoLogging2.java | 2 +- logging/LogToFile.java | 2 +- logging/LogToFile2.java | 2 +- logging/LoggingLevelManipulation.java | 70 ++-- logging/LoggingLevels.java | 18 +- logging/MultipleHandlers.java | 4 +- logging/MultipleHandlers2.java | 2 +- logging/PrintableLogRecord.java | 2 +- logging/SimpleFilter.java | 8 +- network/WhoAmI.java | 2 +- objects/HelloDate.java | 2 +- objects/ShowProperties.java | 4 +- output_duet.py | 365 ------------------ preferences/PreferencesDemo.java | 4 +- references/Compete.java | 4 +- serialization/Logon.java | 6 +- serialization/MyWorld.java | 18 +- streams/ForEach.java | 2 +- test_output.py | 74 ---- threads/AtomicityTest.java | 2 +- threads/AttemptLocking.java | 1 - threads/BankTellerSimulation.java | 14 +- threads/CachedThreadPool.java | 12 +- threads/CachedThreadPool2.java | 20 +- threads/CachedThreadPool3.java | 12 +- threads/CaptureUncaughtException.java | 2 +- threads/CarBuilder.java | 34 +- threads/CountingStream.java | 16 +- threads/DeadlockingDiningPhilosophers.java | 22 +- threads/EvenSupplier.java | 5 +- threads/ExplicitCriticalSection.java | 12 +- threads/FixedDiningPhilosophers.java | 26 +- threads/GreenhouseScheduler.java | 18 +- threads/HorseRace.java | 42 +- threads/ParallelStreamPuzzle2.java | 2 +- threads/ParallelStreamPuzzle3.java | 10 +- threads/PriorityBlockingQueueDemo.java | 6 +- threads/SerialNumberChecker.java | 2 +- threads/SingleThreadExecutor.java | 9 +- threads/Summing.java | 6 +- threads/Summing2.java | 6 +- threads/Summing3.java | 4 +- threads/Summing4.java | 2 +- threads/ToastOMatic.java | 10 +- threads/WorkStealingPool.java | 10 +- threads/restaurant2/RestaurantWithQueues.java | 18 +- typeinfo/PetCount4.java | 2 +- verify_output.py | 244 ++++++++---- 74 files changed, 507 insertions(+), 838 deletions(-) delete mode 100644 output_duet.py delete mode 100644 test_output.py diff --git a/annotations/AtUnitComposition.java b/annotations/AtUnitComposition.java index f2be08966..f3ba4672d 100644 --- a/annotations/AtUnitComposition.java +++ b/annotations/AtUnitComposition.java @@ -21,8 +21,8 @@ public class AtUnitComposition { } /* Output: annotations.AtUnitComposition + . _methodOne . _methodTwo This is methodTwo - . _methodOne OK (2 tests) */ diff --git a/annotations/AtUnitExample2.java b/annotations/AtUnitExample2.java index 3f4ea6d7e..e0bbf8b2c 100644 --- a/annotations/AtUnitExample2.java +++ b/annotations/AtUnitExample2.java @@ -39,11 +39,11 @@ public int methodTwo() { surprise! (failed) . assertExample - . assertAndReturn This is methodTwo - . exceptionExample java.io.FileNotFoundException: nofile.txt (The system cannot find the file specified) (failed) + . assertAndReturn This is methodTwo + (4 tests) >>> 2 FAILURES <<< diff --git a/annotations/AtUnitExample3.java b/annotations/AtUnitExample3.java index 5a3714d51..e24eb7000 100644 --- a/annotations/AtUnitExample3.java +++ b/annotations/AtUnitExample3.java @@ -30,9 +30,9 @@ public int methodTwo() { } /* Output: annotations.AtUnitExample3 - . initialization - . methodOneTest . m2 This is methodTwo + . methodOneTest + . initialization OK (3 tests) */ diff --git a/annotations/AtUnitExample5.java b/annotations/AtUnitExample5.java index c12431456..befc7117f 100644 --- a/annotations/AtUnitExample5.java +++ b/annotations/AtUnitExample5.java @@ -46,10 +46,10 @@ public class AtUnitExample5 { /* Output: annotations.AtUnitExample5 . test1 -Running cleanup - . test2 Running cleanup . test3 +Running cleanup + . test2 Running cleanup OK (3 tests) */ diff --git a/annotations/AtUnitExternalTest.java b/annotations/AtUnitExternalTest.java index eb78a551f..9d9d90f16 100644 --- a/annotations/AtUnitExternalTest.java +++ b/annotations/AtUnitExternalTest.java @@ -17,8 +17,8 @@ public class AtUnitExternalTest extends AtUnitExample1 { } /* Output: annotations.AtUnitExternalTest - . _methodOne . _methodTwo This is methodTwo + . _methodOne OK (2 tests) */ diff --git a/annotations/HashSetTest.java b/annotations/HashSetTest.java index f2cfd7eb9..3b79ea207 100644 --- a/annotations/HashSetTest.java +++ b/annotations/HashSetTest.java @@ -27,7 +27,7 @@ public class HashSetTest { /* Output: annotations.HashSetTest . _remove - . initialization . _contains + . initialization OK (3 tests) */ diff --git a/annotations/StackLStringTest.java b/annotations/StackLStringTest.java index d4a81b545..cdad60c10 100644 --- a/annotations/StackLStringTest.java +++ b/annotations/StackLStringTest.java @@ -31,8 +31,8 @@ public class StackLStringTest extends StackL { } /* Output: annotations.StackLStringTest - . _push - . _top . _pop + . _top + . _push OK (3 tests) */ diff --git a/arrays/BadMicroBenchmark.java b/arrays/BadMicroBenchmark.java index 99dfb05be..bdcb26c1c 100644 --- a/arrays/BadMicroBenchmark.java +++ b/arrays/BadMicroBenchmark.java @@ -16,6 +16,6 @@ public static void main(String[] args) { } } /* Output: -setAll: 62 -parallelSetAll: 75 +setAll: 75 +parallelSetAll: 110 */ diff --git a/arrays/BadMicroBenchmark2.java b/arrays/BadMicroBenchmark2.java index f3b20c351..17315eda3 100644 --- a/arrays/BadMicroBenchmark2.java +++ b/arrays/BadMicroBenchmark2.java @@ -17,6 +17,6 @@ public static void main(String[] args) { } } /* Output: -parallelSetAll: 83 -setAll: 159 +parallelSetAll: 68 +setAll: 196 */ diff --git a/arrays/BadMicroBenchmark3.java b/arrays/BadMicroBenchmark3.java index 2160c7661..aa36f5bc3 100644 --- a/arrays/BadMicroBenchmark3.java +++ b/arrays/BadMicroBenchmark3.java @@ -27,8 +27,8 @@ public static void main(String[] args) { } } /* Output: -parallelSetAll: 4948 -setAll: 1204 -parallelSetAll: 405 -setAll: 557 +parallelSetAll: 4540 +setAll: 1540 +parallelSetAll: 398 +setAll: 739 */ diff --git a/arrays/ParallelSort.java b/arrays/ParallelSort.java index 009b56e0b..970878aae 100644 --- a/arrays/ParallelSort.java +++ b/arrays/ParallelSort.java @@ -20,7 +20,7 @@ public static void main(String[] args) { } } /* Output: -sort(): 864 -parallelSort(): 274 +sort(): 1237 +parallelSort(): 344 3 */ diff --git a/collectionsindepth/ListPerformance.java b/collectionsindepth/ListPerformance.java index 083352d57..82401fbaa 100644 --- a/collectionsindepth/ListPerformance.java +++ b/collectionsindepth/ListPerformance.java @@ -195,17 +195,17 @@ List initialize(int size) { /* Output: --- Array as List --- size get set - 100 44 44 + 100 50 68 --------------------- ArrayList --------------------- size add get set iteradd insert remove - 100 80 44 48 106 0 640 + 100 60 76 74 103 0 360 --------------------- LinkedList --------------------- size add get set iteradd insert remove - 100 80 106 94 177 0 120 + 100 200 166 114 201 0 120 ----------------------- Vector ----------------------- size add get set iteradd insert remove - 100 40 62 58 114 0 120 + 100 60 76 84 159 0 220 -------------------- Queue tests -------------------- size addFirst addLast rmFirst rmLast - 100 60 120 120 100 + 100 80 160 100 120 */ diff --git a/collectionsindepth/MapPerformance.java b/collectionsindepth/MapPerformance.java index 016725914..0981a55eb 100644 --- a/collectionsindepth/MapPerformance.java +++ b/collectionsindepth/MapPerformance.java @@ -63,20 +63,20 @@ public static void main(String[] args) { /* Output: ---------- TreeMap ---------- size put get iterate - 100 228 128 25 + 100 286 152 35 ---------- HashMap ---------- size put get iterate - 100 68 26 35 + 100 86 38 44 ------- LinkedHashMap ------- size put get iterate - 100 70 35 18 + 100 92 27 28 ------ IdentityHashMap ------ size put get iterate - 100 128 126 38 + 100 298 101 42 -------- WeakHashMap -------- size put get iterate - 100 62 31 25 + 100 88 36 57 --------- Hashtable --------- size put get iterate - 100 56 30 20 + 100 98 52 46 */ diff --git a/collectionsindepth/SetPerformance.java b/collectionsindepth/SetPerformance.java index ab0520620..17077b907 100644 --- a/collectionsindepth/SetPerformance.java +++ b/collectionsindepth/SetPerformance.java @@ -60,11 +60,11 @@ public static void main(String[] args) { /* Output: ------------- TreeSet ------------- size add contains iterate - 100 200 132 24 + 100 256 162 31 ------------- HashSet ------------- size add contains iterate - 100 76 32 34 + 100 88 58 43 ---------- LinkedHashSet ---------- size add contains iterate - 100 70 25 19 + 100 100 46 23 */ diff --git a/enums/ConstantSpecificMethod.java b/enums/ConstantSpecificMethod.java index c4be5a7be..0946337ba 100644 --- a/enums/ConstantSpecificMethod.java +++ b/enums/ConstantSpecificMethod.java @@ -32,8 +32,8 @@ public static void main(String[] args) { } } /* Output: -Jul 22, 2016 +Jul 27, 2016 C:\Users\Bruce\Documents\GitHub\on- java\ExtractedExamples\\gradle\wrapper\gradle-wrapper.jar -1.8.0_77 +1.8.0_102 */ diff --git a/exceptions/LoggingExceptions.java b/exceptions/LoggingExceptions.java index b70a87443..6797400f5 100644 --- a/exceptions/LoggingExceptions.java +++ b/exceptions/LoggingExceptions.java @@ -33,13 +33,13 @@ public static void main(String[] args) { } /* Output: ___[ Error Output ]___ -Jul 22, 2016 11:55:45 AM LoggingException +Jul 27, 2016 10:50:30 AM LoggingException SEVERE: LoggingException at LoggingExceptions.main(LoggingExceptions.java:20) Caught LoggingException -Jul 22, 2016 11:55:45 AM LoggingException +Jul 27, 2016 10:50:30 AM LoggingException SEVERE: LoggingException at LoggingExceptions.main(LoggingExceptions.java:25) diff --git a/exceptions/LoggingExceptions2.java b/exceptions/LoggingExceptions2.java index b5c2ccefd..ab99446cb 100644 --- a/exceptions/LoggingExceptions2.java +++ b/exceptions/LoggingExceptions2.java @@ -25,7 +25,7 @@ public static void main(String[] args) { } /* Output: ___[ Error Output ]___ -Jul 22, 2016 11:55:47 AM LoggingExceptions2 logException +Jul 27, 2016 10:50:30 AM LoggingExceptions2 logException SEVERE: java.lang.NullPointerException at LoggingExceptions2.main(LoggingExceptions2.java:17) diff --git a/files/Directories.java b/files/Directories.java index bf052a273..62724c3e9 100644 --- a/files/Directories.java +++ b/files/Directories.java @@ -59,7 +59,7 @@ static void populateTestDir() throws Exception { test\bag test\bar test\baz -test\DIR_8460303386746117268 +test\DIR_3697011820450773773 test\foo test\Hello.txt ********* @@ -68,27 +68,27 @@ static void populateTestDir() throws Exception { test\bag\foo test\bag\foo\bar test\bag\foo\bar\baz -test\bag\foo\bar\baz\4101434906493986662.tmp +test\bag\foo\bar\baz\234245189903117886.tmp test\bag\foo\bar\baz\File.txt test\bar test\bar\baz test\bar\baz\bag test\bar\baz\bag\foo -test\bar\baz\bag\foo\7816199470809856557.tmp +test\bar\baz\bag\foo\8752987828022262887.tmp test\bar\baz\bag\foo\File.txt test\baz test\baz\bag test\baz\bag\foo test\baz\bag\foo\bar -test\baz\bag\foo\bar\5361615738906181780.tmp +test\baz\bag\foo\bar\465343347528104633.tmp test\baz\bag\foo\bar\File.txt -test\DIR_8460303386746117268 -test\DIR_8460303386746117268\pre8013004952693214586.non +test\DIR_3697011820450773773 +test\DIR_3697011820450773773\pre3304897437567097054.non test\foo test\foo\bar test\foo\bar\baz test\foo\bar\baz\bag -test\foo\bar\baz\bag\7164453512868942303.tmp +test\foo\bar\baz\bag\2118206626074637804.tmp test\foo\bar\baz\bag\File.txt test\Hello.txt */ diff --git a/files/Find.java b/files/Find.java index 5d8d1b031..35d0b4d3d 100644 --- a/files/Find.java +++ b/files/Find.java @@ -36,24 +36,24 @@ public class Find { } } /* Output: -test\bag\foo\bar\baz\6081303161062291208.tmp +test\bag\foo\bar\baz\369594599218802549.tmp test\bag\foo\bar\baz\File.txt -test\bar\baz\bag\foo\771297659941286896.tmp +test\bar\baz\bag\foo\2372197258227988384.tmp test\bar\baz\bag\foo\File.txt -test\baz\bag\foo\bar\1769334171376700049.tmp +test\baz\bag\foo\bar\1091363470697614580.tmp test\baz\bag\foo\bar\File.txt test\dir.tmp -test\foo\bar\baz\bag\4483950466184961816.tmp +test\foo\bar\baz\bag\48863440153181406.tmp test\foo\bar\baz\bag\File.txt *************** -6081303161062291208.tmp -771297659941286896.tmp -1769334171376700049.tmp +369594599218802549.tmp +2372197258227988384.tmp +1091363470697614580.tmp dir.tmp -4483950466184961816.tmp +48863440153181406.tmp *************** -6081303161062291208.tmp -771297659941286896.tmp -1769334171376700049.tmp -4483950466184961816.tmp +369594599218802549.tmp +2372197258227988384.tmp +1091363470697614580.tmp +48863440153181406.tmp */ diff --git a/files/PathAnalysis.java b/files/PathAnalysis.java index 5e32b8ae8..71e7ec36c 100644 --- a/files/PathAnalysis.java +++ b/files/PathAnalysis.java @@ -47,9 +47,9 @@ static void say(String id, Object result) { Writable: true notExists: false Hidden: false -size: 1631 +size: 1630 FileStore: SSD (C:) -LastModified: : 2016-07-22T17:55:34.80143Z +LastModified: : 2016-07-27T15:52:49.898848Z Owner: MINDVIEWTOSHIBA\Bruce (User) ContentType: null SymbolicLink: false diff --git a/files/TreeWatcher.java b/files/TreeWatcher.java index 7afc374ea..53915d880 100644 --- a/files/TreeWatcher.java +++ b/files/TreeWatcher.java @@ -47,4 +47,7 @@ static void watchDir(Path dir) { evt.context(): File.txt evt.count(): 1 evt.kind(): ENTRY_DELETE +evt.context(): File.txt +evt.count(): 1 +evt.kind(): ENTRY_DELETE */ diff --git a/generics/DynamicProxyMixin.java b/generics/DynamicProxyMixin.java index 9ea58279b..9f7ac0133 100644 --- a/generics/DynamicProxyMixin.java +++ b/generics/DynamicProxyMixin.java @@ -60,6 +60,6 @@ public static void main(String[] args) { } /* Output: Hello -1469210152348 +1469638238271 1 */ diff --git a/generics/Mixins.java b/generics/Mixins.java index c524c5f8d..4183e72aa 100644 --- a/generics/Mixins.java +++ b/generics/Mixins.java @@ -64,6 +64,6 @@ public static void main(String[] args) { } } /* Output: -test string 1 1469210158525 1 -test string 2 1469210158525 2 +test string 1 1469638250315 1 +test string 2 1469638250317 2 */ diff --git a/logging/ConfigureLogging.java b/logging/ConfigureLogging.java index 12ac25b08..654f2abb8 100644 --- a/logging/ConfigureLogging.java +++ b/logging/ConfigureLogging.java @@ -50,52 +50,52 @@ public static void main(String[] args) { Logger Name : com.mindviewinc.test Level: FINER Logger Name : random Level: SEVERE ___[ Error Output ]___ -Jul 22, 2016 11:55:52 AM ConfigureLogging sendLogMessages +Jul 27, 2016 10:50:38 AM ConfigureLogging sendLogMessages FINEST: Finest -Jul 22, 2016 11:55:52 AM ConfigureLogging sendLogMessages +Jul 27, 2016 10:50:38 AM ConfigureLogging sendLogMessages FINER: Finer -Jul 22, 2016 11:55:52 AM ConfigureLogging sendLogMessages +Jul 27, 2016 10:50:38 AM ConfigureLogging sendLogMessages FINE: Fine -Jul 22, 2016 11:55:52 AM ConfigureLogging sendLogMessages +Jul 27, 2016 10:50:38 AM ConfigureLogging sendLogMessages CONFIG: Config -Jul 22, 2016 11:55:52 AM ConfigureLogging sendLogMessages +Jul 27, 2016 10:50:38 AM ConfigureLogging sendLogMessages INFO: Info -Jul 22, 2016 11:55:52 AM ConfigureLogging sendLogMessages +Jul 27, 2016 10:50:38 AM ConfigureLogging sendLogMessages WARNING: Warning -Jul 22, 2016 11:55:52 AM ConfigureLogging sendLogMessages +Jul 27, 2016 10:50:38 AM ConfigureLogging sendLogMessages SEVERE: Severe -Jul 22, 2016 11:55:52 AM ConfigureLogging sendLogMessages +Jul 27, 2016 10:50:38 AM ConfigureLogging sendLogMessages FINEST: Finest -Jul 22, 2016 11:55:52 AM ConfigureLogging sendLogMessages +Jul 27, 2016 10:50:38 AM ConfigureLogging sendLogMessages FINER: Finer -Jul 22, 2016 11:55:52 AM ConfigureLogging sendLogMessages +Jul 27, 2016 10:50:38 AM ConfigureLogging sendLogMessages FINE: Fine -Jul 22, 2016 11:55:52 AM ConfigureLogging sendLogMessages +Jul 27, 2016 10:50:38 AM ConfigureLogging sendLogMessages CONFIG: Config -Jul 22, 2016 11:55:52 AM ConfigureLogging sendLogMessages +Jul 27, 2016 10:50:38 AM ConfigureLogging sendLogMessages INFO: Info -Jul 22, 2016 11:55:52 AM ConfigureLogging sendLogMessages +Jul 27, 2016 10:50:38 AM ConfigureLogging sendLogMessages WARNING: Warning -Jul 22, 2016 11:55:52 AM ConfigureLogging sendLogMessages +Jul 27, 2016 10:50:38 AM ConfigureLogging sendLogMessages SEVERE: Severe -Jul 22, 2016 11:55:52 AM ConfigureLogging sendLogMessages +Jul 27, 2016 10:50:38 AM ConfigureLogging sendLogMessages INFO: Info -Jul 22, 2016 11:55:52 AM ConfigureLogging sendLogMessages +Jul 27, 2016 10:50:38 AM ConfigureLogging sendLogMessages WARNING: Warning -Jul 22, 2016 11:55:52 AM ConfigureLogging sendLogMessages +Jul 27, 2016 10:50:38 AM ConfigureLogging sendLogMessages SEVERE: Severe -Jul 22, 2016 11:55:52 AM ConfigureLogging sendLogMessages +Jul 27, 2016 10:50:38 AM ConfigureLogging sendLogMessages FINER: Finer -Jul 22, 2016 11:55:52 AM ConfigureLogging sendLogMessages +Jul 27, 2016 10:50:38 AM ConfigureLogging sendLogMessages FINE: Fine -Jul 22, 2016 11:55:52 AM ConfigureLogging sendLogMessages +Jul 27, 2016 10:50:38 AM ConfigureLogging sendLogMessages CONFIG: Config -Jul 22, 2016 11:55:52 AM ConfigureLogging sendLogMessages +Jul 27, 2016 10:50:38 AM ConfigureLogging sendLogMessages INFO: Info -Jul 22, 2016 11:55:52 AM ConfigureLogging sendLogMessages +Jul 27, 2016 10:50:38 AM ConfigureLogging sendLogMessages WARNING: Warning -Jul 22, 2016 11:55:52 AM ConfigureLogging sendLogMessages +Jul 27, 2016 10:50:38 AM ConfigureLogging sendLogMessages SEVERE: Severe -Jul 22, 2016 11:55:52 AM ConfigureLogging sendLogMessages +Jul 27, 2016 10:50:38 AM ConfigureLogging sendLogMessages SEVERE: Severe */ diff --git a/logging/CustomHandler.java b/logging/CustomHandler.java index 853863b3b..823e092ce 100644 --- a/logging/CustomHandler.java +++ b/logging/CustomHandler.java @@ -40,8 +40,8 @@ public void close() {} , INFO:, CustomHandler:, main:, , ] ___[ Error Output ]___ -Jul 22, 2016 11:55:52 AM CustomHandler main +Jul 27, 2016 10:50:39 AM CustomHandler main WARNING: Logging Warning -Jul 22, 2016 11:55:52 AM CustomHandler main +Jul 27, 2016 10:50:39 AM CustomHandler main INFO: Logging Info */ diff --git a/logging/InfoLogging.java b/logging/InfoLogging.java index 353e3ebcf..7fa19444c 100644 --- a/logging/InfoLogging.java +++ b/logging/InfoLogging.java @@ -14,6 +14,6 @@ public static void main(String[] args) { } /* Output: ___[ Error Output ]___ -Jul 22, 2016 11:55:52 AM InfoLogging main +Jul 27, 2016 10:50:39 AM InfoLogging main INFO: Logging: INFO-level message */ diff --git a/logging/InfoLogging2.java b/logging/InfoLogging2.java index 091a64589..dd4c93d39 100644 --- a/logging/InfoLogging2.java +++ b/logging/InfoLogging2.java @@ -16,6 +16,6 @@ public static void main(String[] args) { } /* Output: ___[ Error Output ]___ -Jul 22, 2016 11:55:53 AM InfoLogging2 main +Jul 27, 2016 10:50:40 AM InfoLogging2 main INFO: Logging an INFO-level message */ diff --git a/logging/LogToFile.java b/logging/LogToFile.java index 94ab32a0a..22b408618 100644 --- a/logging/LogToFile.java +++ b/logging/LogToFile.java @@ -17,6 +17,6 @@ public class LogToFile { } /* Output: ___[ Error Output ]___ -Jul 22, 2016 11:55:53 AM LogToFile main +Jul 27, 2016 10:50:41 AM LogToFile main INFO: A message logged to the file */ diff --git a/logging/LogToFile2.java b/logging/LogToFile2.java index 1dfb0f028..b561e298d 100644 --- a/logging/LogToFile2.java +++ b/logging/LogToFile2.java @@ -19,6 +19,6 @@ public class LogToFile2 { } /* Output: ___[ Error Output ]___ -Jul 22, 2016 11:55:53 AM LogToFile2 main +Jul 27, 2016 10:50:41 AM LogToFile2 main INFO: A message logged to the file */ diff --git a/logging/LoggingLevelManipulation.java b/logging/LoggingLevelManipulation.java index 814573736..ec00a4859 100644 --- a/logging/LoggingLevelManipulation.java +++ b/logging/LoggingLevelManipulation.java @@ -76,109 +76,109 @@ public static void main(String[] args) { FINEST net level: FINEST ___[ Error Output ]___ -Jul 22, 2016 11:55:53 AM LoggingLevelManipulation +Jul 27, 2016 10:50:42 AM LoggingLevelManipulation printLogMessages SEVERE: com Severe -Jul 22, 2016 11:55:54 AM LoggingLevelManipulation +Jul 27, 2016 10:50:42 AM LoggingLevelManipulation printLogMessages SEVERE: com.mindviewinc Severe -Jul 22, 2016 11:55:54 AM LoggingLevelManipulation +Jul 27, 2016 10:50:42 AM LoggingLevelManipulation printLogMessages INFO: onjava Info -Jul 22, 2016 11:55:54 AM LoggingLevelManipulation +Jul 27, 2016 10:50:42 AM LoggingLevelManipulation printLogMessages WARNING: onjava Warning -Jul 22, 2016 11:55:54 AM LoggingLevelManipulation +Jul 27, 2016 10:50:42 AM LoggingLevelManipulation printLogMessages SEVERE: onjava Severe -Jul 22, 2016 11:55:54 AM LoggingLevelManipulation +Jul 27, 2016 10:50:42 AM LoggingLevelManipulation printLogMessages SEVERE: com.mindviewinc.test Severe -Jul 22, 2016 11:55:54 AM LoggingLevelManipulation +Jul 27, 2016 10:50:42 AM LoggingLevelManipulation printLogMessages INFO: random Info -Jul 22, 2016 11:55:54 AM LoggingLevelManipulation +Jul 27, 2016 10:50:42 AM LoggingLevelManipulation printLogMessages WARNING: random Warning -Jul 22, 2016 11:55:54 AM LoggingLevelManipulation +Jul 27, 2016 10:50:42 AM LoggingLevelManipulation printLogMessages SEVERE: random Severe -Jul 22, 2016 11:55:54 AM LoggingLevelManipulation +Jul 27, 2016 10:50:42 AM LoggingLevelManipulation printLogMessages SEVERE: com Severe -Jul 22, 2016 11:55:54 AM LoggingLevelManipulation +Jul 27, 2016 10:50:42 AM LoggingLevelManipulation printLogMessages SEVERE: com.mindviewinc Severe -Jul 22, 2016 11:55:54 AM LoggingLevelManipulation +Jul 27, 2016 10:50:42 AM LoggingLevelManipulation printLogMessages INFO: onjava Info -Jul 22, 2016 11:55:54 AM LoggingLevelManipulation +Jul 27, 2016 10:50:42 AM LoggingLevelManipulation printLogMessages WARNING: onjava Warning -Jul 22, 2016 11:55:54 AM LoggingLevelManipulation +Jul 27, 2016 10:50:42 AM LoggingLevelManipulation printLogMessages SEVERE: onjava Severe -Jul 22, 2016 11:55:54 AM LoggingLevelManipulation +Jul 27, 2016 10:50:42 AM LoggingLevelManipulation printLogMessages INFO: com.mindviewinc.test Info -Jul 22, 2016 11:55:54 AM LoggingLevelManipulation +Jul 27, 2016 10:50:42 AM LoggingLevelManipulation printLogMessages WARNING: com.mindviewinc.test Warning -Jul 22, 2016 11:55:54 AM LoggingLevelManipulation +Jul 27, 2016 10:50:42 AM LoggingLevelManipulation printLogMessages SEVERE: com.mindviewinc.test Severe -Jul 22, 2016 11:55:54 AM LoggingLevelManipulation +Jul 27, 2016 10:50:42 AM LoggingLevelManipulation printLogMessages INFO: random Info -Jul 22, 2016 11:55:54 AM LoggingLevelManipulation +Jul 27, 2016 10:50:42 AM LoggingLevelManipulation printLogMessages WARNING: random Warning -Jul 22, 2016 11:55:54 AM LoggingLevelManipulation +Jul 27, 2016 10:50:42 AM LoggingLevelManipulation printLogMessages SEVERE: random Severe -Jul 22, 2016 11:55:54 AM LoggingLevelManipulation +Jul 27, 2016 10:50:42 AM LoggingLevelManipulation printLogMessages INFO: com Info -Jul 22, 2016 11:55:54 AM LoggingLevelManipulation +Jul 27, 2016 10:50:42 AM LoggingLevelManipulation printLogMessages WARNING: com Warning -Jul 22, 2016 11:55:54 AM LoggingLevelManipulation +Jul 27, 2016 10:50:42 AM LoggingLevelManipulation printLogMessages SEVERE: com Severe -Jul 22, 2016 11:55:54 AM LoggingLevelManipulation +Jul 27, 2016 10:50:42 AM LoggingLevelManipulation printLogMessages INFO: com.mindviewinc Info -Jul 22, 2016 11:55:54 AM LoggingLevelManipulation +Jul 27, 2016 10:50:42 AM LoggingLevelManipulation printLogMessages WARNING: com.mindviewinc Warning -Jul 22, 2016 11:55:54 AM LoggingLevelManipulation +Jul 27, 2016 10:50:42 AM LoggingLevelManipulation printLogMessages SEVERE: com.mindviewinc Severe -Jul 22, 2016 11:55:54 AM LoggingLevelManipulation +Jul 27, 2016 10:50:42 AM LoggingLevelManipulation printLogMessages INFO: onjava Info -Jul 22, 2016 11:55:54 AM LoggingLevelManipulation +Jul 27, 2016 10:50:42 AM LoggingLevelManipulation printLogMessages WARNING: onjava Warning -Jul 22, 2016 11:55:54 AM LoggingLevelManipulation +Jul 27, 2016 10:50:42 AM LoggingLevelManipulation printLogMessages SEVERE: onjava Severe -Jul 22, 2016 11:55:54 AM LoggingLevelManipulation +Jul 27, 2016 10:50:42 AM LoggingLevelManipulation printLogMessages INFO: com.mindviewinc.test Info -Jul 22, 2016 11:55:54 AM LoggingLevelManipulation +Jul 27, 2016 10:50:42 AM LoggingLevelManipulation printLogMessages WARNING: com.mindviewinc.test Warning -Jul 22, 2016 11:55:54 AM LoggingLevelManipulation +Jul 27, 2016 10:50:42 AM LoggingLevelManipulation printLogMessages SEVERE: com.mindviewinc.test Severe -Jul 22, 2016 11:55:54 AM LoggingLevelManipulation +Jul 27, 2016 10:50:42 AM LoggingLevelManipulation printLogMessages INFO: random Info -Jul 22, 2016 11:55:54 AM LoggingLevelManipulation +Jul 27, 2016 10:50:42 AM LoggingLevelManipulation printLogMessages WARNING: random Warning -Jul 22, 2016 11:55:54 AM LoggingLevelManipulation +Jul 27, 2016 10:50:42 AM LoggingLevelManipulation printLogMessages SEVERE: random Severe */ diff --git a/logging/LoggingLevels.java b/logging/LoggingLevels.java index 363b59a27..362c8133d 100644 --- a/logging/LoggingLevels.java +++ b/logging/LoggingLevels.java @@ -40,22 +40,22 @@ public static void main(String[] args) { individual loggers set to FINEST com level: SEVERE ___[ Error Output ]___ -Jul 22, 2016 11:55:54 AM LoggingLevels logMessages +Jul 27, 2016 10:50:42 AM LoggingLevels logMessages INFO: util : info -Jul 22, 2016 11:55:54 AM LoggingLevels logMessages +Jul 27, 2016 10:50:42 AM LoggingLevels logMessages SEVERE: test : severe -Jul 22, 2016 11:55:54 AM LoggingLevels logMessages +Jul 27, 2016 10:50:42 AM LoggingLevels logMessages INFO: random : info -Jul 22, 2016 11:55:54 AM LoggingLevels logMessages +Jul 27, 2016 10:50:42 AM LoggingLevels logMessages INFO: util : info -Jul 22, 2016 11:55:54 AM LoggingLevels logMessages +Jul 27, 2016 10:50:42 AM LoggingLevels logMessages SEVERE: test : severe -Jul 22, 2016 11:55:54 AM LoggingLevels logMessages +Jul 27, 2016 10:50:42 AM LoggingLevels logMessages INFO: random : info -Jul 22, 2016 11:55:54 AM LoggingLevels logMessages +Jul 27, 2016 10:50:42 AM LoggingLevels logMessages INFO: util : info -Jul 22, 2016 11:55:54 AM LoggingLevels logMessages +Jul 27, 2016 10:50:42 AM LoggingLevels logMessages SEVERE: test : severe -Jul 22, 2016 11:55:54 AM LoggingLevels logMessages +Jul 27, 2016 10:50:42 AM LoggingLevels logMessages INFO: random : info */ diff --git a/logging/MultipleHandlers.java b/logging/MultipleHandlers.java index fda36f05c..1c5335dc2 100644 --- a/logging/MultipleHandlers.java +++ b/logging/MultipleHandlers.java @@ -20,8 +20,8 @@ public class MultipleHandlers { } /* Output: ___[ Error Output ]___ -Jul 22, 2016 11:55:54 AM MultipleHandlers main +Jul 27, 2016 10:50:43 AM MultipleHandlers main WARNING: Output to multiple handlers -Jul 22, 2016 11:55:54 AM MultipleHandlers main +Jul 27, 2016 10:50:43 AM MultipleHandlers main WARNING: Output to multiple handlers */ diff --git a/logging/MultipleHandlers2.java b/logging/MultipleHandlers2.java index f3e481964..8177a1aaf 100644 --- a/logging/MultipleHandlers2.java +++ b/logging/MultipleHandlers2.java @@ -21,6 +21,6 @@ public class MultipleHandlers2 { } /* Output: ___[ Error Output ]___ -Jul 22, 2016 11:55:54 AM MultipleHandlers2 main +Jul 27, 2016 10:50:43 AM MultipleHandlers2 main WARNING: Output to multiple handlers */ diff --git a/logging/PrintableLogRecord.java b/logging/PrintableLogRecord.java index a9fce941f..3de032b29 100644 --- a/logging/PrintableLogRecord.java +++ b/logging/PrintableLogRecord.java @@ -48,7 +48,7 @@ public static void main(String[] args) { Level LoggerName Message -CurrentMillis<1469210155053> +CurrentMillis<1469638244376> Params ResourceBundle ResourceBundleName diff --git a/logging/SimpleFilter.java b/logging/SimpleFilter.java index 2653a685a..106008f76 100644 --- a/logging/SimpleFilter.java +++ b/logging/SimpleFilter.java @@ -34,12 +34,12 @@ public static void main(String[] args) { } /* Output: ___[ Error Output ]___ -Jul 22, 2016 11:55:55 AM SimpleFilter sendLogMessages +Jul 27, 2016 10:50:44 AM SimpleFilter sendLogMessages WARNING: A duck in the house! -Jul 22, 2016 11:55:55 AM SimpleFilter sendLogMessages +Jul 27, 2016 10:50:44 AM SimpleFilter sendLogMessages WARNING: A Wombat at large! -Jul 22, 2016 11:55:55 AM SimpleFilter main +Jul 27, 2016 10:50:44 AM SimpleFilter main INFO: After setting filter.. -Jul 22, 2016 11:55:55 AM SimpleFilter sendLogMessages +Jul 27, 2016 10:50:44 AM SimpleFilter sendLogMessages WARNING: A duck in the house! */ diff --git a/network/WhoAmI.java b/network/WhoAmI.java index 0cda6ae99..5cc8ff99f 100644 --- a/network/WhoAmI.java +++ b/network/WhoAmI.java @@ -16,5 +16,5 @@ public class WhoAmI { } /* Output: MindviewToshibaLaptop -192.168.0.107 +192.168.0.104 */ diff --git a/objects/HelloDate.java b/objects/HelloDate.java index 42f703674..c8d103ac0 100644 --- a/objects/HelloDate.java +++ b/objects/HelloDate.java @@ -22,5 +22,5 @@ public static void main(String[] args) { } /* Output: Hello, it's: -Fri Jul 22 11:55:55 MDT 2016 +Wed Jul 27 10:50:45 MDT 2016 */ diff --git a/objects/ShowProperties.java b/objects/ShowProperties.java index fec2d61bb..ef3d4de27 100644 --- a/objects/ShowProperties.java +++ b/objects/ShowProperties.java @@ -16,7 +16,7 @@ public static void main(String[] args) { java.runtime.name=Java(TM) SE Runtime Environment sun.boot.library.path=C:\Program Files (x86)\Java\jdk1.8.0_... -java.vm.version=25.77-b03 +java.vm.version=25.102-b14 java.vm.vendor=Oracle Corporation java.vendor.url=http://java.oracle.com/ path.separator=; @@ -29,7 +29,7 @@ public static void main(String[] args) { java.vm.specification.name=Java Virtual Machine Specification user.dir=C:\Users\Bruce\Documents\GitHub\on-ja... -java.runtime.version=1.8.0_77-b03 +java.runtime.version=1.8.0_102-b14 java.awt.graphicsenv=sun.awt.Win32GraphicsEnvironment java.endorsed.dirs=C:\Program Files (x86)\Java\jdk1.8.0_... os.arch=x86 diff --git a/output_duet.py b/output_duet.py deleted file mode 100644 index d7a8f3b9b..000000000 --- a/output_duet.py +++ /dev/null @@ -1,365 +0,0 @@ -# Requires Python 3.5 or greater -# (c)2016 MindView LLC: see Copyright.txt -# We make no guarantees that this code is fit for any purpose. -# Visit http://mindviewinc.com/Books/OnJava/ for more book information. -""" -ToDo: - - Right now it's ignoring the "(first x lines)" examples -""" -import sys -from pathlib import Path -import re -import textwrap -from enum import Enum, unique - -def trace(str): pass -# trace = print - -maxlinewidth = 59 -current_dir_name = Path.cwd().stem - -word_only = re.compile("[A-Za-z]+") - -def trim(block): - trimmed = "\n".join([ln.rstrip() for ln in block.splitlines()]) - return trimmed.strip() - -class Adjuster: - def adjust(self, input_text): pass - -class IgnoreDigits(Adjuster): - def adjust(self, input_text): - trace("Ignoring digits") - return trim(re.sub("-?\d", "", input_text)) - -ignore_digits = IgnoreDigits() - -class IgnoreMemoryAddresses(Adjuster): - def adjust(self, input_text): - return trim(memlocation.sub("", input_text)) - -ignore_memory_addresses = IgnoreMemoryAddresses() - -class RemoveCharacters(Adjuster): - def __init__(self, chars_to_remove): - self.chars_to_remove = chars_to_remove - def adjust(self, input_text): - for c in self.chars_to_remove: - input_text = input_text.replace(c, "") - return input_text - -class SortLines(Adjuster): - def adjust(self, input_text): - return "\n".join(sorted(input_text.splitlines())).strip() - -sort_lines = SortLines() - -class SortWords(Adjuster): - def adjust(self, input_text): - return "\n".join(sorted(input_text.split())).strip() - -sort_words = SortWords() - -class UniqueLines(Adjuster): - def adjust(self, input_text): - return "\n".join(sorted(list(set(input_text.splitlines())))) - -unique_lines = UniqueLines() - -class UniqueWords(Adjuster): - # Fairly extreme but will still reveal significant changes - def adjust(self, input_text): - return "\n".join(sorted(set(input_text.split()))) - -unique_words = UniqueWords() - -class WordsOnly(Adjuster): - # Fairly extreme but will still reveal significant changes - def adjust(self, input_text): - return "\n".join( - sorted([w for w in input_text.split() - if word_only.fullmatch(w)])) - -words_only = WordsOnly() - -class IgnoreLines(Adjuster): - def __init__(self, *lines_to_ignore): - self.lines_to_ignore = lines_to_ignore - def adjust(self, input_text): - lines = input_text.splitlines() - for ignore in sorted(list(self.lines_to_ignore), reverse=True): - ignore = ignore - 1 # Compensate for zero indexing - print("ignoring line %d: %s" % (ignore, lines[ignore])) - del lines[ignore] - return "\n".join(lines) - - -match_adjustments = { - "ToastOMatic.java" : sort_lines, - "ThreadVariations.java" : sort_lines, - "ActiveObjectDemo.java" : [sort_lines, ignore_digits], - "Interrupting.java" : sort_lines, - "SyncObject.java" : sort_lines, - "UseCaseTracker.java" : sort_lines, - "AtUnitComposition.java" : sort_lines, - "AtUnitExample1.java" : sort_lines, - "AtUnitExample2.java" : sort_lines, - "AtUnitExample3.java" : sort_lines, - "AtUnitExample5.java" : sort_lines, - "AtUnitExternalTest.java" : sort_lines, - "HashSetTest.java" : sort_lines, - "StackLStringTest.java" : sort_lines, - "WaxOMatic2.java" : sort_lines, - - "ForEach.java" : sort_words, - "PetCount4.java" : [RemoveCharacters("{}"), sort_words], - - "CachedThreadPool.java" : words_only, - "FixedThreadPool.java" : words_only, - "MoreBasicThreads.java" : words_only, - "ConstantSpecificMethod.java" : words_only, - - "BankTellerSimulation.java" : [words_only, unique_words], - - "MapComparisons.java" : ignore_digits, - "ListComparisons.java" : ignore_digits, - "NotifyVsNotifyAll.java" : ignore_digits, - "SelfManaged.java" : ignore_digits, - "SimpleMicroBenchmark.java" : ignore_digits, - "SimpleThread.java" : ignore_digits, - "SleepingTask.java" : ignore_digits, - "ExchangerDemo.java" : ignore_digits, - "Compete.java" : ignore_digits, - "MappedIO.java" : ignore_digits, - "Directories.java" : ignore_digits, - "Find.java" : ignore_digits, - "PathAnalysis.java" : ignore_digits, - "TreeWatcher.java" : ignore_digits, - "Mixins.java" : ignore_digits, - "ListPerformance.java" : ignore_digits, - "MapPerformance.java" : ignore_digits, - "SetPerformance.java" : ignore_digits, - "SynchronizationComparisons.java" : ignore_digits, - "AtomicityTest.java" : ignore_digits, - "TypesForSets.java" : ignore_digits, - "PrintableLogRecord.java" : ignore_digits, - "LockingMappedFiles.java" : ignore_digits, - - - "Conversion.java" : IgnoreLines(27, 28), - "DynamicProxyMixin.java" : IgnoreLines(2), - "PreferencesDemo.java" : IgnoreLines(5), - "AtUnitExample4.java" : IgnoreLines(6, 9), - - "SerialNumberChecker.java" : [ignore_digits, unique_lines], - "EvenSupplier.java" : [ignore_digits, unique_lines], - - "FillingLists.java" : [ ignore_memory_addresses, sort_words ], - - "SimpleDaemons.java" : [ ignore_memory_addresses, ignore_digits ], - "CaptureUncaughtException.java" : [ - ignore_memory_addresses, ignore_digits, unique_lines ], - - "CarBuilder.java" : [ ignore_digits, unique_lines ], - "CloseResource.java" : [ unique_lines ], - - "SpringDetector.java" : [ ignore_digits, sort_words ], - - "PipedIO.java" : [ unique_words ], - - "CriticalSection.java" : ignore_digits, - "ExplicitCriticalSection.java" : ignore_digits, -} - - -translate_file_name = { - "ApplyTest.java": "Apply.java", - "FillTest.java": "Fill.java", - "Fill2Test.java": "Fill2.java", - "ClassInInterface$Test.java": "ClassInInterface.java", - "TestBed$Tester.java": "TestBed.java", -} - - -memlocation = re.compile("@[0-9a-z]{5,7}") -datestamp1 = re.compile("(?:[MTWFS][a-z]{2} ){0,1}[JFMASOND][a-z]{2} \d{1,2} \d{2}:\d{2}:\d{2} [A-Z]{3} \d{4}") -datestamp2 = re.compile("[JFMASOND][a-z]{2} \d{1,2}, \d{4} \d{1,2}:\d{1,2}:\d{1,2} (:?AM|PM)") -varying = [ memlocation, datestamp1, datestamp2 ] - - -# Result of Duet.validate(): -Valid = Enum('Valid', - 'exact varying execute_to_see selected_lines fail') - - -class Duet: - """ - Holds embedded and generated output. Also original file content, and - "adjusted" output for comparison. - """ - - def __init__(self, out_filename): - - if not (out_filename.suffix == ".out" or - out_filename.suffix == ".err" or - out_filename.suffix == ".new"): - print("Error: argument to Duet() must end with '.out' or '.err' or '.new'") - print("Argument was {}".format(out_filename)) - sys.exit() - - self.java_file = None # Full contents of Java code file - self.java_slugline = None # First (marker) line of Java code file - - self.out_path = out_filename.with_suffix(".out") - self.out = None - self.generated = "" - if self.out_path.exists(): - self.out = self.out_path.read_text().strip() - trace("{} file exists".format(self.out_path)) - self.generated = self.fill_to_width(self.out) - - self.error = False - self.err_path = out_filename.with_suffix(".err") - if self.err_path.exists(): - self.error = True - self.generated += "\n___[ Error Output ]___\n" - self.generated += self.fill_to_width(self.err_path.read_text()) - trace("{} file exists".format(self.err_path)) - - self.new = None - self.new_path = out_filename.with_suffix(".new") - if self.new_path.exists(): - self.new = self.new_path.read_text().strip() - print("{} file exists".format(self.new_path)) - - self.java_path = self.calculate_java_path() - # This also fills self.java_file and self.java_slugline: - self.embedded = self.embedded_output() - - self.ignore = False - if "{IgnoreOutput}" in self.java_file: - self.ignore = True - trace("Ignoring .out for {}".format(self.java_path)) - return - - if "{ThrowsException}" in self.java_file: - self.generated = self.generated.strip() + "\n___[ Exception is Expected ]___" - trace("Exception expected for {}".format(self.java_path)) - - if "{ErrorOutputExpected}" in self.java_file: - self.generated = self.generated.strip() + "\n___[ Error Output is Expected ]___" - trace("OK: 'Error Output' expected for {}".format(self.java_path)) - - self.embedded_adjusted = self.adjust(self.embedded) - self.generated_un_adjusted = self.generated - self.generated_adjusted = None - if self.generated: - self.generated_adjusted = self.adjust(self.generated) - - def calculate_java_path(self): - - def __java_filename(out_pieces): - path_components = out_pieces.split(".", out_pieces.count(".") - 1) - # path_components[-1] = path_components[-1].replace(".out", ".java") - # path_components[-1] = path_components[-1].replace(".err", ".java") - return path_components - - _java_path = self.out_path.with_suffix(".java") - jfn = __java_filename(_java_path.parts[-1]) - # jfn = __java_filename(self.out_path.parts[-1]) - jpath = list(self.out_path.parts[:-1]) + list(jfn) - if len(jpath) > 1 and jpath[0] == jpath[1]: - del jpath[0] - if jpath[0] == current_dir_name: - del jpath[0] - if jpath[-1] in translate_file_name: - jpath[-1] = translate_file_name[jpath[-1]] - return Path(*jpath) - - - def embedded_output(self): - find_output = re.compile(r"/\* (Output:.*)\*/", re.DOTALL) # should space be \s+ ?? - with self.java_path.open() as java: - self.java_file = java.read() - self.java_slugline = self.java_file.strip().splitlines()[0] - output = find_output.search(self.java_file) - if not output: - trace("No embedded output: in {}".format(self.java_path)) - return None - lines = output.group(1).strip().splitlines() - self.output_tag = lines[0] - return ("\n".join(lines[1:])).strip() - - - @staticmethod - def fill_to_width(text): - result = "" - for line in text.splitlines(): - result += textwrap.fill(line, width=maxlinewidth) + "\n" - return result.strip() - - - def __repr__(self): - # result = "\n" + str(self.output_tag) - result = "\n" + str(self.java_path).center(60, "=") + "\n" + self.embedded - result += "\n" + str(self.out_path).center(60, "-") + "\n" + self.generated - result += "\n" + (str(self.java_path) + - "(adjusted)").center(60, "-") + "\n" + str(self.embedded_adjusted) - result += "\n" + (str(self.out_path) + - "(adjusted)").center(60, "-") + "\n" + str(self.generated_adjusted) - - difflines = [] - embedded_adjusted_lines = self.embedded_adjusted.splitlines() - generated_adjusted_lines = self.generated_adjusted.splitlines() - trace(str(self.java_path)) - trace("len embedded_adjusted %d len generated_adjusted %d" % - (len(embedded_adjusted_lines), len(generated_adjusted_lines))) - for n, line in enumerate(embedded_adjusted_lines): - try: - if not line == generated_adjusted_lines[n]: - difflines.append(">--------<") - difflines.append("embedded_adjusted: " + line) - difflines.append("generated_adjusted: " + generated_adjusted_lines[n]) - except: - continue - if difflines: - result += "\n" + "\n".join(difflines) - - return result - - - @staticmethod - def strip_varying(text): - for pat in varying: - text = pat.sub("", text) - return text - - - def adjust(self, output): - output = output.replace("\0", "NUL") - if self.java_path.name not in match_adjustments: - return output - trace("adjusting %s" % self.java_path.name) - strategy = match_adjustments[self.java_path.name] - if isinstance(strategy, Adjuster): - return strategy.adjust(output) - assert isinstance(strategy, list) - for strat in strategy: - output = strat.adjust(output) - return output - - - def validate(self): - if "(Execute to see)" in self.output_tag: - return Valid.execute_to_see - if "(None)" in self.output_tag: ### This should no longer be necessary - assert false, "(None) in output_tag " + self - if "Output: (First" in self.output_tag: ### This is temporary ### - return Valid.selected_lines - if self.generated_adjusted == self.embedded_adjusted: - return Valid.exact - if isinstance(self.generated_adjusted, str): - if (Duet.strip_varying(self.generated_adjusted) == - Duet.strip_varying(self.embedded_adjusted)): - return Valid.varying - return Valid.fail diff --git a/preferences/PreferencesDemo.java b/preferences/PreferencesDemo.java index 386389370..59c9edc98 100644 --- a/preferences/PreferencesDemo.java +++ b/preferences/PreferencesDemo.java @@ -30,10 +30,10 @@ public class PreferencesDemo { Footwear: Ruby Slippers Companions: 4 Are there witches?: true -UsageCount: 183 +UsageCount: 191 How many companions does Dorothy have? 4 ___[ Error Output ]___ -Jul 22, 2016 11:56:00 AM java.util.prefs.WindowsPreferences +Jul 27, 2016 10:50:50 AM java.util.prefs.WindowsPreferences WARNING: Could not open/create prefs root node Software\JavaSoft\Prefs at root 0x80000002. Windows diff --git a/references/Compete.java b/references/Compete.java index 3539fdfb7..a2ffe5051 100644 --- a/references/Compete.java +++ b/references/Compete.java @@ -81,6 +81,6 @@ public class Compete { } } /* Output: -Duplication via serialization: 296 Milliseconds -Duplication via cloning: 20 Milliseconds +Duplication via serialization: 776 Milliseconds +Duplication via cloning: 122 Milliseconds */ diff --git a/serialization/Logon.java b/serialization/Logon.java index 84aa3d575..71f3840e9 100644 --- a/serialization/Logon.java +++ b/serialization/Logon.java @@ -42,11 +42,11 @@ public String toString() { /* Output: logon a = logon info: username: Hulk - date: Fri Jul 22 11:56:03 MDT 2016 + date: Wed Jul 27 10:50:53 MDT 2016 password: myLittlePony -Recovering object at Fri Jul 22 11:56:04 MDT 2016 +Recovering object at Wed Jul 27 10:50:55 MDT 2016 logon a = logon info: username: Hulk - date: Fri Jul 22 11:56:03 MDT 2016 + date: Wed Jul 27 10:50:53 MDT 2016 password: null */ diff --git a/serialization/MyWorld.java b/serialization/MyWorld.java index 2710b5c6b..f5e601703 100644 --- a/serialization/MyWorld.java +++ b/serialization/MyWorld.java @@ -69,16 +69,16 @@ public class MyWorld { , Ralph the hamster[Animal@52e922], House@106d69c , Molly the cat[Animal@25154f], House@106d69c ] -animals1: [Bosco the dog[Animal@10bedb4], House@103dbd3 -, Ralph the hamster[Animal@167cf4d], House@103dbd3 -, Molly the cat[Animal@a987ac], House@103dbd3 +animals1: [Bosco the dog[Animal@1a4f24f], House@19a45b3 +, Ralph the hamster[Animal@99a589], House@19a45b3 +, Molly the cat[Animal@372a00], House@19a45b3 ] -animals2: [Bosco the dog[Animal@10bedb4], House@103dbd3 -, Ralph the hamster[Animal@167cf4d], House@103dbd3 -, Molly the cat[Animal@a987ac], House@103dbd3 +animals2: [Bosco the dog[Animal@1a4f24f], House@19a45b3 +, Ralph the hamster[Animal@99a589], House@19a45b3 +, Molly the cat[Animal@372a00], House@19a45b3 ] -animals3: [Bosco the dog[Animal@a3a380], House@1453f44 -, Ralph the hamster[Animal@ad8086], House@1453f44 -, Molly the cat[Animal@be858], House@1453f44 +animals3: [Bosco the dog[Animal@dd8dc3], House@103e736 +, Ralph the hamster[Animal@8db2f2], House@103e736 +, Molly the cat[Animal@18bf509], House@103e736 ] */ diff --git a/streams/ForEach.java b/streams/ForEach.java index e890f6d77..9829125bd 100644 --- a/streams/ForEach.java +++ b/streams/ForEach.java @@ -23,6 +23,6 @@ public static void main(String[] args) { } /* Output: 258 555 693 861 961 429 868 200 522 207 288 128 551 589 -551 589 200 522 868 861 288 128 207 555 429 693 961 258 +551 589 200 861 522 429 868 961 288 555 128 693 207 258 258 555 693 861 961 429 868 200 522 207 288 128 551 589 */ diff --git a/test_output.py b/test_output.py deleted file mode 100644 index 19bef65d4..000000000 --- a/test_output.py +++ /dev/null @@ -1,74 +0,0 @@ -#! py -3 -# Requires Python 3.5 -# Validates output from executable Java programs in "On Java 8" -# (1) Extract output in Java file, keep whole file -# (2) If direct comparison of actual output with output stored in Java file fails: -# (3) Use chain of responsibility to successively try filters until one matches or all fail -from pathlib import Path -import textwrap -import re - -def fill_to_width(text): - result = "" - for line in text.splitlines(): - result += textwrap.fill(line, width=59) + "\n" - return result.strip() - -def adjust_lines(text): - text = text.replace("\0", "NUL") - lines = text.splitlines() - slug = lines[0] - if "(First and Last " in slug: - num_of_lines = int(slug.split()[5]) - adjusted = lines[:num_of_lines + 1] +\ - ["...________...________...________...________..."] +\ - lines[-num_of_lines:] - return "\n".join(adjusted) - elif "(First " in slug: - num_of_lines = int(slug.split()[3]) - adjusted = lines[:num_of_lines + 1] +\ - [" ..."] - return "\n".join(adjusted) - else: - return text - -def phase1(): - """ - (0) Do first/last lines before formatting to width - (1) Combine output and error (if present) files - (2) Format all output to width limit - (3) Add closing '*/' - """ - for outfile in Path(".").rglob("*.out"): - out_text = adjust_lines(outfile.read_text()) - phase_1 = outfile.with_suffix(".p1") - with phase_1.open('w') as phs1: - phs1.write(fill_to_width(out_text) + "\n") - errfile = outfile.with_suffix(".err") - if errfile.exists(): - phs1.write("___[ Error Output ]___\n") - phs1.write(fill_to_width(errfile.read_text()) + "\n") - phs1.write("*/\n") - -if __name__ == '__main__': - phase1() - find_output = re.compile(r"/\* (Output:.*)\*/", re.DOTALL) # should space be \s+ ?? - for outfile in Path(".").rglob("*.p1"): - javafile = outfile.with_suffix(".java") - if not javafile.exists(): - print(str(outfile) + " has no javafile") - javatext = javafile.read_text() - if "/* Output:" not in javatext: - print(str(outfile) + " has no /* Output:") - embedded_output = find_output.search(javatext).group(0).strip() - new_output = outfile.read_text().strip() - if new_output == embedded_output: - print(str(javafile)) - else: - with outfile.with_suffix(".nomatch").open('w') as nomatch: - nomatch.write(str(embedded_output) + "\n\n") - nomatch.write("=== Actual ===\n\n") - nomatch.write(str(new_output)) - print(" No Match ".center(45, "=")) - for nomatch in Path(".").rglob("*.nomatch"): - print(nomatch) diff --git a/threads/AtomicityTest.java b/threads/AtomicityTest.java index 7fc53b625..3f8f7f44a 100644 --- a/threads/AtomicityTest.java +++ b/threads/AtomicityTest.java @@ -29,5 +29,5 @@ public static void main(String[] args) { } } /* Output: -5 +1 */ diff --git a/threads/AttemptLocking.java b/threads/AttemptLocking.java index 8f1d1aff2..0990bb046 100644 --- a/threads/AttemptLocking.java +++ b/threads/AttemptLocking.java @@ -56,5 +56,4 @@ public void run() { tryLock(2, TimeUnit.SECONDS): true tryLock(): true tryLock(2, TimeUnit.SECONDS): true -acquired */ diff --git a/threads/BankTellerSimulation.java b/threads/BankTellerSimulation.java index 78517a89e..357290c86 100644 --- a/threads/BankTellerSimulation.java +++ b/threads/BankTellerSimulation.java @@ -204,15 +204,15 @@ public class BankTellerSimulation { [552][727][998][902][769][373][313][683][177][526] { T3 T2 T1 T0 } TellerManager interrupted -Teller 0 interrupted -Teller 0 terminating -Teller 1 interrupted Teller 3 interrupted -Teller 2 interrupted CustomerSupplier interrupted -CustomerSupplier terminating -Teller 2 terminating Teller 3 terminating -Teller 1 terminating +Teller 2 interrupted +Teller 2 terminating TellerManager terminating +Teller 1 interrupted +Teller 0 interrupted +Teller 0 terminating +Teller 1 terminating +CustomerSupplier terminating */ diff --git a/threads/CachedThreadPool.java b/threads/CachedThreadPool.java index b741930a5..a99f453b0 100644 --- a/threads/CachedThreadPool.java +++ b/threads/CachedThreadPool.java @@ -16,14 +16,14 @@ public static void main(String[] args) } } /* Output: -SleepAndPrintTask[0] pool-1-thread-1 -SleepAndPrintTask[5] pool-1-thread-6 -SleepAndPrintTask[8] pool-1-thread-9 -SleepAndPrintTask[4] pool-1-thread-5 -SleepAndPrintTask[9] pool-1-thread-10 -SleepAndPrintTask[1] pool-1-thread-2 SleepAndPrintTask[2] pool-1-thread-3 +SleepAndPrintTask[9] pool-1-thread-10 SleepAndPrintTask[6] pool-1-thread-7 +SleepAndPrintTask[5] pool-1-thread-6 SleepAndPrintTask[7] pool-1-thread-8 +SleepAndPrintTask[8] pool-1-thread-9 +SleepAndPrintTask[0] pool-1-thread-1 +SleepAndPrintTask[1] pool-1-thread-2 +SleepAndPrintTask[4] pool-1-thread-5 SleepAndPrintTask[3] pool-1-thread-4 */ diff --git a/threads/CachedThreadPool2.java b/threads/CachedThreadPool2.java index 7feb190a5..e154dc30a 100644 --- a/threads/CachedThreadPool2.java +++ b/threads/CachedThreadPool2.java @@ -16,14 +16,14 @@ public static void main(String[] args) } } /* Output: -2 pool-1-thread-3 518 -1 pool-1-thread-2 518 -0 pool-1-thread-1 518 -6 pool-1-thread-7 618 -5 pool-1-thread-6 518 -4 pool-1-thread-5 518 -3 pool-1-thread-4 518 -9 pool-1-thread-10 918 -8 pool-1-thread-9 818 -7 pool-1-thread-8 718 +0 pool-1-thread-1 200 +4 pool-1-thread-5 300 +3 pool-1-thread-4 400 +1 pool-1-thread-2 200 +2 pool-1-thread-3 200 +6 pool-1-thread-7 500 +8 pool-1-thread-9 757 +5 pool-1-thread-6 657 +7 pool-1-thread-8 657 +9 pool-1-thread-10 857 */ diff --git a/threads/CachedThreadPool3.java b/threads/CachedThreadPool3.java index 1758ab634..7f5915555 100644 --- a/threads/CachedThreadPool3.java +++ b/threads/CachedThreadPool3.java @@ -33,15 +33,15 @@ public static void main(String[] args) } } /* Output: -3 pool-1-thread-4 100 -5 pool-1-thread-6 100 -6 pool-1-thread-7 100 -1 pool-1-thread-2 100 2 pool-1-thread-3 100 +6 pool-1-thread-7 100 +5 pool-1-thread-6 100 7 pool-1-thread-8 100 -8 pool-1-thread-9 100 4 pool-1-thread-5 100 -0 pool-1-thread-1 100 9 pool-1-thread-10 100 +3 pool-1-thread-4 100 +0 pool-1-thread-1 100 +1 pool-1-thread-2 100 +8 pool-1-thread-9 100 sum = 1000 */ diff --git a/threads/CaptureUncaughtException.java b/threads/CaptureUncaughtException.java index e00e7c687..aa66a3751 100644 --- a/threads/CaptureUncaughtException.java +++ b/threads/CaptureUncaughtException.java @@ -54,7 +54,7 @@ public static void main(String[] args) { eh = MyUncaughtExceptionHandler@d93b30 HandlerThreadFactory@14991ad creating new Thread created Thread[Thread-2,5,main] -eh = MyUncaughtExceptionHandler@28e402 +eh = MyUncaughtExceptionHandler@1351c58 caught java.lang.RuntimeException TimedAbort 4 */ diff --git a/threads/CarBuilder.java b/threads/CarBuilder.java index bd89b8ea9..571dbdb8e 100644 --- a/threads/CarBuilder.java +++ b/threads/CarBuilder.java @@ -221,9 +221,9 @@ public class CarBuilder { /* Output: ChassisBuilder created Car 0 [ engine: false driveTrain: false wheels: false ] -EngineRobot installing engine WheelRobot installing Wheels DriveTrainRobot installing DriveTrain +EngineRobot installing engine Car 0 [ engine: true driveTrain: true wheels: true ] ChassisBuilder created Car 1 [ engine: false driveTrain: false wheels: false ] @@ -233,15 +233,15 @@ public class CarBuilder { Car 1 [ engine: true driveTrain: true wheels: true ] ChassisBuilder created Car 2 [ engine: false driveTrain: false wheels: false ] -EngineRobot installing engine DriveTrainRobot installing DriveTrain WheelRobot installing Wheels +EngineRobot installing engine Car 2 [ engine: true driveTrain: true wheels: true ] ChassisBuilder created Car 3 [ engine: false driveTrain: false wheels: false ] -EngineRobot installing engine -WheelRobot installing Wheels DriveTrainRobot installing DriveTrain +WheelRobot installing Wheels +EngineRobot installing engine Car 3 [ engine: true driveTrain: true wheels: true ] ChassisBuilder created Car 4 [ engine: false driveTrain: false wheels: false ] @@ -252,8 +252,8 @@ public class CarBuilder { ChassisBuilder created Car 5 [ engine: false driveTrain: false wheels: false ] EngineRobot installing engine -DriveTrainRobot installing DriveTrain WheelRobot installing Wheels +DriveTrainRobot installing DriveTrain Car 5 [ engine: true driveTrain: true wheels: true ] ChassisBuilder created Car 6 [ engine: false driveTrain: false wheels: false ] @@ -270,26 +270,26 @@ public class CarBuilder { ChassisBuilder created Car 8 [ engine: false driveTrain: false wheels: false ] EngineRobot installing engine -DriveTrainRobot installing DriveTrain WheelRobot installing Wheels +DriveTrainRobot installing DriveTrain Car 8 [ engine: true driveTrain: true wheels: true ] ChassisBuilder created Car 9 [ engine: false driveTrain: false wheels: false ] DriveTrainRobot installing DriveTrain -WheelRobot installing Wheels EngineRobot installing engine +WheelRobot installing Wheels Car 9 [ engine: true driveTrain: true wheels: true ] ChassisBuilder created Car 10 [ engine: false driveTrain: false wheels: false ] -WheelRobot installing Wheels DriveTrainRobot installing DriveTrain EngineRobot installing engine +WheelRobot installing Wheels Car 10 [ engine: true driveTrain: true wheels: true ] ChassisBuilder created Car 11 [ engine: false driveTrain: false wheels: false ] -DriveTrainRobot installing DriveTrain -WheelRobot installing Wheels EngineRobot installing engine +WheelRobot installing Wheels +DriveTrainRobot installing DriveTrain Car 11 [ engine: true driveTrain: true wheels: true ] ChassisBuilder created Car 12 [ engine: false driveTrain: false wheels: false ] @@ -297,16 +297,16 @@ public class CarBuilder { WheelRobot installing Wheels EngineRobot installing engine Car 12 [ engine: true driveTrain: true wheels: true ] -Exiting Reporter via interrupt -Reporter off +Exiting Assembler via interrupt Exiting EngineRobot via interrupt -EngineRobot off -Exiting DriveTrainRobot via interrupt Exiting WheelRobot via interrupt +Exiting DriveTrainRobot via interrupt +DriveTrainRobot off +Exiting Reporter via interrupt Interrupted: ChassisBuilder -Exiting Assembler via interrupt -ChassisBuilder off +Reporter off WheelRobot off -DriveTrainRobot off +EngineRobot off Assembler off +ChassisBuilder off */ diff --git a/threads/CountingStream.java b/threads/CountingStream.java index cfcb92bce..cc52fe86c 100644 --- a/threads/CountingStream.java +++ b/threads/CountingStream.java @@ -17,15 +17,15 @@ public static void main(String[] args) { } } /* Output: -0 ForkJoinPool.commonPool-worker-4 100 -4 ForkJoinPool.commonPool-worker-3 100 -3 ForkJoinPool.commonPool-worker-5 100 -6 main 100 -8 ForkJoinPool.commonPool-worker-6 100 -5 ForkJoinPool.commonPool-worker-7 100 +4 ForkJoinPool.commonPool-worker-5 100 2 ForkJoinPool.commonPool-worker-1 100 -1 ForkJoinPool.commonPool-worker-2 100 -9 ForkJoinPool.commonPool-worker-3 100 +6 main 100 +5 ForkJoinPool.commonPool-worker-1 100 7 ForkJoinPool.commonPool-worker-4 100 +1 ForkJoinPool.commonPool-worker-3 100 +8 ForkJoinPool.commonPool-worker-2 100 +0 ForkJoinPool.commonPool-worker-6 100 +9 ForkJoinPool.commonPool-worker-7 100 +3 ForkJoinPool.commonPool-worker-5 100 1000 */ diff --git a/threads/DeadlockingDiningPhilosophers.java b/threads/DeadlockingDiningPhilosophers.java index 779f5c1ae..bb713db77 100644 --- a/threads/DeadlockingDiningPhilosophers.java +++ b/threads/DeadlockingDiningPhilosophers.java @@ -32,25 +32,25 @@ public class DeadlockingDiningPhilosophers { } } /* Output: (First and Last 10 Lines) -Philosopher 2 thinking +Philosopher 0 thinking +Philosopher 4 thinking +Philosopher 1 thinking Philosopher 3 thinking +Philosopher 2 thinking Philosopher 3 grabbing right -Philosopher 3 grabbing left -Philosopher 3 eating -Philosopher 1 thinking Philosopher 1 grabbing right -Philosopher 1 grabbing left -Philosopher 4 thinking -Philosopher 0 thinking -...________...________...________...________... +Philosopher 4 grabbing right Philosopher 0 grabbing right -Philosopher 1 grabbing right +Philosopher 4 grabbing left +...________...________...________...________... +Philosopher 3 grabbing left Philosopher 1 grabbing left +Philosopher 4 grabbing left Philosopher 2 grabbing left Philosopher 0 grabbing left Philosopher 1 exiting via interrupt -Philosopher 0 exiting via interrupt -Philosopher 3 exiting via interrupt Philosopher 4 exiting via interrupt +Philosopher 3 exiting via interrupt Philosopher 2 exiting via interrupt +Philosopher 0 exiting via interrupt */ diff --git a/threads/EvenSupplier.java b/threads/EvenSupplier.java index 89d8ead8a..edf147cde 100644 --- a/threads/EvenSupplier.java +++ b/threads/EvenSupplier.java @@ -20,8 +20,7 @@ public static void main(String[] args) { } /* Output: Press Control-C to exit -23 not even! -27 not even! -25 not even! +193 not even! +191 not even! TimedAbort 4 */ diff --git a/threads/ExplicitCriticalSection.java b/threads/ExplicitCriticalSection.java index 28f044407..557e6327f 100644 --- a/threads/ExplicitCriticalSection.java +++ b/threads/ExplicitCriticalSection.java @@ -52,12 +52,12 @@ public class ExplicitCriticalSection { } } /* Output: -pm1: Pair: x: 10, y: 10 checkCounter = 3504848 -pm2: Pair: x: 10, y: 10 checkCounter = 2105413 +pm1: Pair: x: 10, y: 10 checkCounter = 1713716 +pm2: Pair: x: 10, y: 10 checkCounter = 1717747 ___[ Error Output ]___ -Exception in thread "pool-1-thread-3" Exception in thread -"pool-1-thread-4" threads.Pair$PairValuesNotEqualException: -Pair values not equal: x: 3, y: 2 +Exception in thread "pool-1-thread-4" Exception in thread +"pool-1-thread-3" threads.Pair$PairValuesNotEqualException: +Pair values not equal: x: 2, y: 1 at threads.Pair.checkState(CriticalSection.java:37) at threads.PairChecker.run(CriticalSection.java:111) @@ -67,7 +67,7 @@ public class ExplicitCriticalSection { un(ThreadPoolExecutor.java:617) at java.lang.Thread.run(Thread.java:745) threads.Pair$PairValuesNotEqualException: Pair values not -equal: x: 3, y: 2 +equal: x: 2, y: 1 at threads.Pair.checkState(CriticalSection.java:37) at threads.PairChecker.run(CriticalSection.java:111) diff --git a/threads/FixedDiningPhilosophers.java b/threads/FixedDiningPhilosophers.java index 8282d947e..96923e0ee 100644 --- a/threads/FixedDiningPhilosophers.java +++ b/threads/FixedDiningPhilosophers.java @@ -36,25 +36,25 @@ public class FixedDiningPhilosophers { } } /* Output: (First and Last 10 Lines) -Philosopher 0 thinking +Philosopher 1 thinking Philosopher 4 thinking -Philosopher 3 thinking Philosopher 2 thinking -Philosopher 1 thinking -Philosopher 0 grabbing right -Philosopher 0 grabbing left -Philosopher 0 eating -Philosopher 3 grabbing right +Philosopher 0 thinking +Philosopher 3 thinking +Philosopher 1 grabbing right Philosopher 2 grabbing right +Philosopher 4 grabbing right +Philosopher 4 grabbing left +Philosopher 4 eating ...________...________...________...________... -Philosopher 4 thinking -Philosopher 3 grabbing left -Philosopher 3 eating +Philosopher 1 thinking +Philosopher 0 grabbing left Philosopher 0 eating -Philosopher 4 grabbing right +Philosopher 2 eating +Philosopher 1 grabbing right Philosopher 3 exiting via interrupt -Philosopher 0 exiting via interrupt Philosopher 1 exiting via interrupt -Philosopher 4 exiting via interrupt Philosopher 2 exiting via interrupt +Philosopher 0 exiting via interrupt +Philosopher 4 exiting via interrupt */ diff --git a/threads/GreenhouseScheduler.java b/threads/GreenhouseScheduler.java index e06e36171..9be4ea88d 100644 --- a/threads/GreenhouseScheduler.java +++ b/threads/GreenhouseScheduler.java @@ -181,22 +181,22 @@ public static void main(String[] args) { Turning off lights ...________...________...________...________... Terminating -Fri Jul 22 12:00:00 MDT 2016 temperature: 66.3 humidity: +Wed Jul 27 11:00:00 MDT 2016 temperature: 66.3 humidity: 50.20 -Fri Jul 22 12:30:00 MDT 2016 temperature: 67.3 humidity: +Wed Jul 27 11:30:00 MDT 2016 temperature: 67.3 humidity: 51.02 -Fri Jul 22 13:00:00 MDT 2016 temperature: 68.8 humidity: +Wed Jul 27 12:00:00 MDT 2016 temperature: 68.8 humidity: 51.82 -Fri Jul 22 13:30:00 MDT 2016 temperature: 70.0 humidity: +Wed Jul 27 12:30:00 MDT 2016 temperature: 70.0 humidity: 52.19 -Fri Jul 22 14:00:00 MDT 2016 temperature: 71.5 humidity: +Wed Jul 27 13:00:00 MDT 2016 temperature: 71.5 humidity: 52.99 -Fri Jul 22 14:30:00 MDT 2016 temperature: 73.0 humidity: +Wed Jul 27 13:30:00 MDT 2016 temperature: 73.0 humidity: 53.32 -Fri Jul 22 15:00:00 MDT 2016 temperature: 74.4 humidity: +Wed Jul 27 14:00:00 MDT 2016 temperature: 74.4 humidity: 53.99 -Fri Jul 22 15:30:00 MDT 2016 temperature: 75.5 humidity: +Wed Jul 27 14:30:00 MDT 2016 temperature: 75.5 humidity: 54.40 -Fri Jul 22 16:00:00 MDT 2016 temperature: 76.8 humidity: +Wed Jul 27 15:00:00 MDT 2016 temperature: 76.8 humidity: 53.96 */ diff --git a/threads/HorseRace.java b/threads/HorseRace.java index 4dd903f8b..e76fb77af 100644 --- a/threads/HorseRace.java +++ b/threads/HorseRace.java @@ -96,52 +96,50 @@ public static void main(String[] args) { 2 *3 **4 -**5 -*6 +*5 +**6 =========================================================== ================ **0 -****1 -*2 +***1 +**2 **3 ***4 -****5 -*6 +*5 +****6 =========================================================== ================ **0 ...________...________...________...________... *********************************************************** -6 +*******6 =========================================================== ================ *********************************************************** -************0 +**********0 *********************************************************** -*********1 -*********************************************************** -****2 +**********1 *********************************************************** -**************3 +***********2 *********************************************************** -**4 -******************************************************5 +***************3 +********************************************************4 +*********************************************************5 *********************************************************** -**6 +*******6 =========================================================== ================ *********************************************************** -*************0 +***********0 *********************************************************** **********1 *********************************************************** -****2 +************2 *********************************************************** -****************3 +*****************3 +*********************************************************4 +**********************************************************5 *********************************************************** -****4 -********************************************************5 -*********************************************************** -****6 +*******6 Horse 3 won! */ diff --git a/threads/ParallelStreamPuzzle2.java b/threads/ParallelStreamPuzzle2.java index bcf17e412..4468c35c9 100644 --- a/threads/ParallelStreamPuzzle2.java +++ b/threads/ParallelStreamPuzzle2.java @@ -30,5 +30,5 @@ public static void main(String[] args) throws Exception { } } /* Output: -[29, 30, 31, 33, 35, 36, 37, 38, 39, 91] +[2, 3, 4, 5, 6, 7, 8, 9, 10, 63] */ diff --git a/threads/ParallelStreamPuzzle3.java b/threads/ParallelStreamPuzzle3.java index 7eabf812a..4e822d53a 100644 --- a/threads/ParallelStreamPuzzle3.java +++ b/threads/ParallelStreamPuzzle3.java @@ -18,15 +18,15 @@ public static void main(String[] args) { } } /* Output: +8: main 6: ForkJoinPool.commonPool-worker-5 3: ForkJoinPool.commonPool-worker-7 +5: ForkJoinPool.commonPool-worker-5 +1: ForkJoinPool.commonPool-worker-3 2: ForkJoinPool.commonPool-worker-6 -0: ForkJoinPool.commonPool-worker-4 4: ForkJoinPool.commonPool-worker-1 -1: ForkJoinPool.commonPool-worker-3 -8: main -7: ForkJoinPool.commonPool-worker-7 -5: ForkJoinPool.commonPool-worker-5 +0: ForkJoinPool.commonPool-worker-4 +7: main 9: ForkJoinPool.commonPool-worker-2 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] */ diff --git a/threads/PriorityBlockingQueueDemo.java b/threads/PriorityBlockingQueueDemo.java index e6caac953..4469d4620 100644 --- a/threads/PriorityBlockingQueueDemo.java +++ b/threads/PriorityBlockingQueueDemo.java @@ -133,11 +133,11 @@ public class PriorityBlockingQueueDemo { [10 ] Task 20 [8 ] Task 8 [10 ] Task 21 -[7 ] Task 19 +[7 ] Task 4 [10 ] Task 22 -[7 ] Task 11 +[7 ] Task 19 [10 ] Task 23 -[7 ] Task 4 +[7 ] Task 11 [10 ] Task 24 [7 ] Task 1 ...________...________...________...________... diff --git a/threads/SerialNumberChecker.java b/threads/SerialNumberChecker.java index fcb4d0f03..76fe5e55d 100644 --- a/threads/SerialNumberChecker.java +++ b/threads/SerialNumberChecker.java @@ -65,5 +65,5 @@ public void run() { } } /* Output: -Duplicate: 5178 +Duplicate: 4119 */ diff --git a/threads/SingleThreadExecutor.java b/threads/SingleThreadExecutor.java index ef9446795..ac94e7c33 100644 --- a/threads/SingleThreadExecutor.java +++ b/threads/SingleThreadExecutor.java @@ -27,24 +27,23 @@ public static void main(String[] args) { /* Output: All tasks submitted main awaiting termination -main awaiting termination SleepAndPrintTask[0] pool-1-thread-1 -SleepAndPrintTask[1] pool-1-thread-1 main awaiting termination +SleepAndPrintTask[1] pool-1-thread-1 main awaiting termination SleepAndPrintTask[2] pool-1-thread-1 -SleepAndPrintTask[3] pool-1-thread-1 main awaiting termination +SleepAndPrintTask[3] pool-1-thread-1 main awaiting termination SleepAndPrintTask[4] pool-1-thread-1 main awaiting termination SleepAndPrintTask[5] pool-1-thread-1 -SleepAndPrintTask[6] pool-1-thread-1 main awaiting termination +SleepAndPrintTask[6] pool-1-thread-1 main awaiting termination SleepAndPrintTask[7] pool-1-thread-1 -SleepAndPrintTask[8] pool-1-thread-1 main awaiting termination +SleepAndPrintTask[8] pool-1-thread-1 main awaiting termination SleepAndPrintTask[9] pool-1-thread-1 */ diff --git a/threads/Summing.java b/threads/Summing.java index 4938d0833..6cd86d3d6 100644 --- a/threads/Summing.java +++ b/threads/Summing.java @@ -44,7 +44,7 @@ public static void main(String[] args) { } /* Output: 5000000050000000 -Sum Stream: 629ms -Sum Stream Parallel: 167ms -Sum Iterated: 2537ms +Sum Stream: 631ms +Sum Stream Parallel: 159ms +Sum Iterated: 2560ms */ diff --git a/threads/Summing2.java b/threads/Summing2.java index 9b3fcf730..f3847e3c5 100644 --- a/threads/Summing2.java +++ b/threads/Summing2.java @@ -36,8 +36,8 @@ public static void main(String[] args) { } /* Output: 200000010000000 -Array Stream Sum: 111ms -Parallel: 26ms +Array Stream Sum: 112ms +Parallel: 28ms Basic Sum: 33ms -parallelPrefix: 50ms +parallelPrefix: 60ms */ diff --git a/threads/Summing3.java b/threads/Summing3.java index ad4d240ff..75ca9dba3 100644 --- a/threads/Summing3.java +++ b/threads/Summing3.java @@ -35,7 +35,7 @@ public static void main(String[] args) { } /* Output: 50000005000000 -Long Array Stream Reduce: 1142ms +Long Array Stream Reduce: 1038ms Long Basic Sum: 21ms -Long parallelPrefix: 3571ms +Long parallelPrefix: 3616ms */ diff --git a/threads/Summing4.java b/threads/Summing4.java index 175d3acf3..c12836789 100644 --- a/threads/Summing4.java +++ b/threads/Summing4.java @@ -16,5 +16,5 @@ public static void main(String[] args) { } /* Output: 50000005000000 -Long Parallel: 978ms +Long Parallel: 1014ms */ diff --git a/threads/ToastOMatic.java b/threads/ToastOMatic.java index 97d85dffb..9aa18b93f 100644 --- a/threads/ToastOMatic.java +++ b/threads/ToastOMatic.java @@ -194,11 +194,11 @@ public class ToastOMatic { Toast 12: JAMMED Chomp! Toast 12: JAMMED Eater interrupted -Butterer interrupted -Toaster interrupted -Toaster off -Jammer interrupted -Butterer off Eater off +Jammer interrupted Jammer off +Toaster interrupted +Butterer interrupted +Butterer off +Toaster off */ diff --git a/threads/WorkStealingPool.java b/threads/WorkStealingPool.java index 650074682..66c8bb806 100644 --- a/threads/WorkStealingPool.java +++ b/threads/WorkStealingPool.java @@ -28,12 +28,12 @@ public static void main(String[] args) 8 ForkJoinPool-1-worker-1 ForkJoinPool-1-worker-2 -ForkJoinPool-1-worker-3 -ForkJoinPool-1-worker-3 -ForkJoinPool-1-worker-3 +ForkJoinPool-1-worker-1 +ForkJoinPool-1-worker-1 ForkJoinPool-1-worker-4 -ForkJoinPool-1-worker-5 +ForkJoinPool-1-worker-1 ForkJoinPool-1-worker-3 +ForkJoinPool-1-worker-5 +ForkJoinPool-1-worker-4 ForkJoinPool-1-worker-2 -ForkJoinPool-1-worker-1 */ diff --git a/threads/restaurant2/RestaurantWithQueues.java b/threads/restaurant2/RestaurantWithQueues.java index beb3a12a3..cff6191c9 100644 --- a/threads/restaurant2/RestaurantWithQueues.java +++ b/threads/restaurant2/RestaurantWithQueues.java @@ -218,14 +218,14 @@ public class RestaurantWithQueues { WaitPerson 0 received SPRING_ROLLS delivering to Customer 3 Customer 3 eating SPRING_ROLLS ...________...________...________...________... -WaitPerson 0 off duty +WaitPerson 2 off duty +Customer 33 finished meal, leaving +Customer 18 finished meal, leaving +Customer 35 finished meal, leaving Customer 46 finished meal, leaving -Customer 37 finished meal, leaving -Customer 31 finished meal, leaving -Customer 1 finished meal, leaving -Customer 3 finished meal, leaving -Customer 17 finished meal, leaving -Customer 12 finished meal, leaving -Customer 4 finished meal, leaving -Customer 7 finished meal, leaving +WaitPerson 4 off duty +Customer 24 finished meal, leaving +Customer 30 finished meal, leaving +Customer 34 finished meal, leaving +Customer 48 finished meal, leaving */ diff --git a/typeinfo/PetCount4.java b/typeinfo/PetCount4.java index 2112db6a3..3b768ae2f 100644 --- a/typeinfo/PetCount4.java +++ b/typeinfo/PetCount4.java @@ -21,5 +21,5 @@ public static void main(String[] args) { EgyptianMau Hamster EgyptianMau Mutt Mutt Cymric Mouse Pug Mouse Cymric {EgyptianMau=2, Hamster=1, Pug=3, Manx=7, Cymric=5, Dog=6, -Mutt=3, Rat=2, Mouse=2, Rodent=5, Pet=20, Cat=9} +Pet=20, Mutt=3, Rat=2, Mouse=2, Rodent=5, Cat=9} */ diff --git a/verify_output.py b/verify_output.py index 1a04a0276..376692c9d 100644 --- a/verify_output.py +++ b/verify_output.py @@ -1,74 +1,184 @@ -# Requires Python 3.5 or greater -# (c)2016 MindView LLC: see Copyright.txt -# We make no guarantees that this code is fit for any purpose. -# Visit http://mindviewinc.com/Books/OnJava/ for more book information. -""" -ToDo: - - Validate errors -""" +#! py -3 +# Requires Python 3.5 +# Validates output from executable Java programs in "On Java 8." +# Use chain of responsibility to successively try strategies until one matches from pathlib import Path -from output_duet import Duet, Valid +import textwrap +import re +import sys import os -import collections -import pprint -import itertools +import textwrap +from collections import defaultdict +WIDTH = 59 # Max line width -def trace(*str): pass -# trace = print +#################### Phase 1: Basic formatting ##################### -def clean(): - for p in (Path(f) for f in [ - "update_output.bat", - "edit_errors.bat", - "strategies.txt", - "validate_successes.txt", - "validate_failures.txt", - ]): - if p.exists(): - p.unlink() +def adjust_lines(text): + text = text.replace("\0", "NUL") + lines = text.splitlines() + slug = lines[0] + if "(First and Last " in slug: + num_of_lines = int(slug.split()[5]) + adjusted = lines[:num_of_lines + 1] +\ + ["...________...________...________...________..."] +\ + lines[-num_of_lines:] + return "\n".join(adjusted) + elif "(First " in slug: + num_of_lines = int(slug.split()[3]) + adjusted = lines[:num_of_lines + 1] +\ + [" ..."] + return "\n".join(adjusted) + else: + return text + +def fill_to_width(text): + result = "" + for line in text.splitlines(): + result += textwrap.fill(line, width = WIDTH) + "\n" + return result.strip() + +def phase1(): + """ + (0) Do first/last lines before formatting to width + (1) Combine output and error (if present) files + (2) Format all output to width limit + (3) Add closing '*/' + """ + for outfile in Path(".").rglob("*.out"): + out_text = adjust_lines(outfile.read_text()) + phase_1 = outfile.with_suffix(".p1") + with phase_1.open('w') as phs1: + phs1.write(fill_to_width(out_text) + "\n") + errfile = outfile.with_suffix(".err") + if errfile.exists(): + phs1.write("___[ Error Output ]___\n") + phs1.write(fill_to_width(errfile.read_text()) + "\n") + phs1.write("*/\n") + + +########### Chain of Responsibility Match Finder ####################### + +def exact_match(text): return text + +memlocation = re.compile("@[0-9a-z]{5,7}") + +def ignore_memory_addresses(text): + return memlocation.sub("", text) + +datestamp1 = re.compile( + "(?:[MTWFS][a-z]{2} ){0,1}[JFMASOND][a-z]{2} \d{1,2} \d{2}:\d{2}:\d{2} [A-Z]{3} \d{4}") +datestamp2 = re.compile( + "[JFMASOND][a-z]{2} \d{1,2}, \d{4} \d{1,2}:\d{1,2}:\d{1,2} (:?AM|PM)") + +def ignore_dates(text): + for pat in [ datestamp1, datestamp2 ]: + text = pat.sub("", text) + return text + +def ignore_digits(input_text): + return re.sub("-?\d", "", input_text) + +def sort_lines(input_text): + return "\n".join(sorted(input_text.splitlines())).strip() + +def sort_words(input_text): + return "\n".join(sorted(input_text.split())).strip() + +def unique_lines(input_text): + return "\n".join(sorted(list(set(input_text.splitlines())))) + +# Fairly extreme but will still reveal significant changes +def unique_words(input_text): + return "\n".join(sorted(set(input_text.split()))) + +# Fairly extreme but will still reveal significant changes +word_only = re.compile("[A-Za-z]+") +def words_only(input_text): + return "\n".join( + sorted([w for w in input_text.split() + if word_only.fullmatch(w)])) + +def no_match(input_text): return True + +# Chain of responsibility: +strategies = [ + # Filter Retain result for rest of chain + (exact_match, False), + (ignore_dates, True ), + (ignore_memory_addresses, True ), + (sort_lines, False), + (ignore_digits, False), + (sort_words, False), + (unique_lines, False), + (unique_words, False), + (words_only, False), + (no_match, False), +] + + +class Validator(defaultdict): # Map of lists + compare_output = Path(".") / "compare_output.bat" + + def __init__(self): + super().__init__(list) + if Validator.compare_output.exists(): + Validator.compare_output.unlink() + for strategy, retain in strategies: + strat_batch = Path(strategy.__name__ + ".bat") + if strat_batch.exists(): + strat_batch.unlink() + + def find_output_match(self, javafile, embedded_output, generated_output): + for strategy, retain in strategies: + filtered_embedded_output = strategy(embedded_output) + filtered_generated_output = strategy(generated_output) + if filtered_embedded_output == filtered_generated_output: + strat_name = strategy.__name__ + self[strat_name].append(str(javafile)) + if strat_name is "exact_match": return + tfile = javafile.with_suffix("." + strat_name) + with Path(strat_name + ".bat").open('a') as strat_batch: + strat_batch.write("subl " + str(tfile) + "\n") + with Validator.compare_output.open('a') as batch: + batch.write("subl " + str(tfile) + "\n") + with tfile.open('w') as trace_file: + trace_file.write(str(embedded_output) + "\n\n") + trace_file.write("=== Actual ===\n\n") + trace_file.write(str(generated_output)) + return + if retain: + embedded_output = filtered_embedded_output + generated_output = filtered_generated_output + + def display_results(self): + log = open("verified_output.txt", 'w') + for strategy, retain in strategies: + key = strategy.__name__ + if key is "exact_match": + for java in self[key]: + print(java) + elif key in self: + log.write("\n" + (" " + key + " ").center(45, "=") + "\n") + for java in self[key]: + log.write(java + "\n") + log.close() if __name__ == '__main__': - clean() - jfiles = sorted([java.name for java in Path(".").glob("**/*.java")]) - duplicates = sorted([x for x, y in collections.Counter(jfiles).items() if y > 1]) - if duplicates: - print("Duplicates:") - pprint.pprint(duplicates) - - count = 0 - for output in itertools.chain(Path(".").glob("**/*.out"), Path(".").glob("**/*.err")): - duet = Duet(output) - # if duet.error: - # os.system("subl {}".format(duet.java_path)) - trace("duet.ignore:", duet.ignore, duet.java_path ) - if duet.ignore: - continue - v = duet.validate() - if v is Valid.fail: - with Path("validate_failures.txt").open('a') as vf: - print(duet, file = vf) - with Path("strategies.txt").open('a') as st: - print(' "' + duet.java_path.name + '" : IgnoreSortedLines(),', file = st) - with Path("update_output.bat").open('a') as uo: - print('call no ' + str(duet.out_path.with_suffix(".new")), file = uo) - with Path("edit_errors.bat").open('a') as eo: - print('subl ' + str(duet.java_path), file = eo) - if duet.error: - duet.out_path.with_suffix(".new").write_text(duet.generated_un_adjusted) - os.system('subl ' + str(duet.out_path.with_suffix(".new"))) - else: - with Path("validate_successes.txt").open('a') as vs: - print("{:<20}".format(v) + "{}".format(duet.java_path), file = vs) - count += 1 - print("\n" + " Verified files = {} ".format(count).center(60, "*")) - - if Path("validate_failures.txt").exists(): - os.system("subl " - "update_output.bat " - "edit_errors.bat " - "strategies.txt " - "validate_successes.txt " - "validate_failures.txt") - else: - print("\n" + " No Output Errors ".center(60, "=")) + phase1() # Generates '.p1' files + find_output = re.compile(r"/\* (Output:.*)\*/", re.DOTALL) + validator = Validator() + for outfile in Path(".").rglob("*.p1"): + javafile = outfile.with_suffix(".java") + if not javafile.exists(): + print(str(outfile) + " has no javafile") + sys.exit(1) + javatext = javafile.read_text() + if "/* Output:" not in javatext: + print(str(outfile) + " has no /* Output:") + sys.exit(1) + validator.find_output_match(javafile, + find_output.search(javatext).group(0).strip(), + outfile.read_text().strip()) + validator.display_results() + os.system("more verified_output.txt") From 72a37051d324e9371172b6aac9e8d89228219715 Mon Sep 17 00:00:00 2001 From: Bruce Eckel Date: Wed, 27 Jul 2016 17:31:28 -0600 Subject: [PATCH 049/320] Towards the unified {java command --- build.gradle | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/build.gradle b/build.gradle index fae3fb384..c828861fa 100644 --- a/build.gradle +++ b/build.gradle @@ -25,9 +25,12 @@ class Tags { mainMethod = block.contains('main(String[] args)') fileRoot = lines[0].split("/")[-1] - ".java" mainClass = fileRoot - javaCmd = extract('main:') - if(javaCmd) + javaCmd = extract('java') + if(javaCmd) { mainClass = javaCmd + println("fileRoot: " + fileRoot) + println("mainClass: " + mainClass) + } compileTimeError = testFor('CompileTimeError') throwsException = testFor('ThrowsException') errorOutputExpected = testFor('ErrorOutputExpected') @@ -58,6 +61,7 @@ class Tags { if(tagline.getCount()) { def rtrim = tagline[0].reverse().dropWhile{ it != '}'}.reverse()[0..-2] def ltrim = rtrim - ("// {" + marker) + ltrim = ltrim.replaceAll("//", " ") return ltrim.trim() } else { println "Searching for: " + re From 72c57ddee3d23ed43d159b89a15be374f0f2ca6d Mon Sep 17 00:00:00 2001 From: Bruce Eckel Date: Thu, 28 Jul 2016 12:48:23 -0600 Subject: [PATCH 050/320] Changing to {java tag --- annotations/AtUnitComposition.java | 4 +-- annotations/AtUnitExample1.java | 4 +-- annotations/AtUnitExample2.java | 4 +-- annotations/AtUnitExample3.java | 4 +-- annotations/AtUnitExample4.java | 4 +-- annotations/AtUnitExample5.java | 4 +-- annotations/AtUnitExternalTest.java | 4 +-- annotations/HashSetTest.java | 4 +-- annotations/StackLStringTest.java | 4 +-- annotations/database/TableCreator.java | 4 +-- annotations/ifx/Multiplier.java | 2 +- annotations/simplest/SimpleTest.java | 2 +- build.gradle | 31 +++++++++++-------- check.bat | 2 ++ collections/MapOfList.java | 2 +- enums/Burrito.java | 2 +- enums/EnumMaps.java | 2 +- enums/EnumSets.java | 2 +- enums/RoShamBo1.java | 2 +- enums/RoShamBo2.java | 2 +- enums/RoShamBo3.java | 2 +- enums/RoShamBo4.java | 2 +- enums/RoShamBo5.java | 2 +- enums/RoShamBo6.java | 2 +- enums/cartoons/EnumImplementation.java | 2 +- enums/menu/Meal.java | 2 +- enums/menu/Meal2.java | 2 +- enums/menu/TypeOfFood.java | 2 +- generics/coffee/CoffeeSupplier.java | 2 +- generics/decorator/Decoration.java | 2 +- innerclasses/Callbacks.java | 2 +- innerclasses/ClassInInterface.java | 2 +- innerclasses/MultiImplementation.java | 2 +- innerclasses/TestBed.java | 2 +- innerclasses/mui/MultiInterfaces.java | 2 +- .../interfaceprocessor/FilterProcessor.java | 2 +- .../interfaceprocessor/StringProcessor.java | 2 +- interfaces/music4/Music4.java | 2 +- interfaces/music5/Music5.java | 2 +- interfaces/nesting/NestingInterfaces.java | 2 +- onjava/CollectionMethodDifferences.java | 2 +- onjava/CountMap.java | 2 +- onjava/CountingIntegerList.java | 2 +- onjava/Countries.java | 2 +- onjava/Hex.java | 2 +- onjava/ProcessFiles.java | 2 +- onjava/atunit/AtUnit.java | 2 +- onjava/atunit/ClassNameFinder.java | 2 +- patterns/absfactory/GameEnvironment.java | 2 +- patterns/adapt/Adapter.java | 2 +- patterns/chain/ChainOfResponsibility.java | 2 +- patterns/doubledispatch/DoubleDispatch.java | 2 +- patterns/dynatrash/DynaTrash.java | 2 +- patterns/factory/ShapeFactory1.java | 2 +- patterns/observer/ObservedFlower.java | 2 +- patterns/recyclea/RecycleA.java | 2 +- patterns/recycleb/RecycleB.java | 2 +- patterns/recyclec/RecycleC.java | 2 +- patterns/state/StateMachineDemo.java | 2 +- patterns/strategy/StrategyPattern.java | 2 +- patterns/strategy/StrategyPattern2.java | 2 +- patterns/trash/ParseTrash.java | 2 +- patterns/trashvisitor/TrashVisitor.java | 2 +- patterns/visitor/BeeAndFlowers.java | 2 +- patterns/visualobserver/BoxObserver.java | 2 +- polymorphism/Frog.java | 2 +- polymorphism/PrivateOverride.java | 2 +- polymorphism/Sandwich.java | 2 +- polymorphism/music/Music.java | 2 +- polymorphism/music/Music2.java | 2 +- polymorphism/music3/Music3.java | 2 +- reuse/CADSystem.java | 2 +- serialization/xfiles/ThawAlien.java | 2 +- staticchecking/dr/DogsAndRobots.java | 2 +- .../drc/DogAndRobotCollections.java | 2 +- staticchecking/latent/Latent.java | 2 +- staticchecking/petspeak/PetSpeak.java | 2 +- threads/CriticalSection.java | 2 +- threads/ExplicitCriticalSection.java | 2 +- threads/restaurant2/RestaurantWithQueues.java | 3 +- typeinfo/FamilyVsExactType.java | 2 +- typeinfo/pets/LiteralPetCreator.java | 2 +- typeinfo/toys/GenericToyTest.java | 2 +- typeinfo/toys/ToyTest.java | 2 +- verify_output.py | 27 ++++++++-------- 85 files changed, 126 insertions(+), 119 deletions(-) create mode 100644 check.bat diff --git a/annotations/AtUnitComposition.java b/annotations/AtUnitComposition.java index f3ba4672d..bab704faf 100644 --- a/annotations/AtUnitComposition.java +++ b/annotations/AtUnitComposition.java @@ -3,8 +3,8 @@ // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. // Creating non-embedded tests -// {main: onjava.atunit.AtUnit} -// {Args: build/classes/main/annotations/AtUnitComposition.class} +// {java onjava.atunit.AtUnit +// build/classes/main/annotations/AtUnitComposition.class} package annotations; import onjava.atunit.*; import onjava.*; diff --git a/annotations/AtUnitExample1.java b/annotations/AtUnitExample1.java index 11bdc8003..d8573bfae 100644 --- a/annotations/AtUnitExample1.java +++ b/annotations/AtUnitExample1.java @@ -2,8 +2,8 @@ // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. -// {main: onjava.atunit.AtUnit} -// {Args: build/classes/main/annotations/AtUnitExample1.class} +// {java onjava.atunit.AtUnit +// build/classes/main/annotations/AtUnitExample1.class} package annotations; import onjava.atunit.*; import onjava.*; diff --git a/annotations/AtUnitExample2.java b/annotations/AtUnitExample2.java index e0bbf8b2c..37b745673 100644 --- a/annotations/AtUnitExample2.java +++ b/annotations/AtUnitExample2.java @@ -3,8 +3,8 @@ // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. // Assertions and exceptions can be used in @Tests -// {main: onjava.atunit.AtUnit} -// {Args: build/classes/main/annotations/AtUnitExample2.class} +// {java onjava.atunit.AtUnit +// build/classes/main/annotations/AtUnitExample2.class} package annotations; import java.io.*; import onjava.atunit.*; diff --git a/annotations/AtUnitExample3.java b/annotations/AtUnitExample3.java index e24eb7000..d253c6a2c 100644 --- a/annotations/AtUnitExample3.java +++ b/annotations/AtUnitExample3.java @@ -2,8 +2,8 @@ // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. -// {main: onjava.atunit.AtUnit} -// {Args: build/classes/main/annotations/AtUnitExample3.class} +// {java onjava.atunit.AtUnit +// build/classes/main/annotations/AtUnitExample3.class} package annotations; import onjava.atunit.*; import onjava.*; diff --git a/annotations/AtUnitExample4.java b/annotations/AtUnitExample4.java index aa408915e..935d0eee4 100644 --- a/annotations/AtUnitExample4.java +++ b/annotations/AtUnitExample4.java @@ -2,8 +2,8 @@ // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. -// {main: onjava.atunit.AtUnit} -// {Args: build/classes/main/annotations/AtUnitExample4.class} +// {java onjava.atunit.AtUnit +// build/classes/main/annotations/AtUnitExample4.class} package annotations; import java.util.*; import onjava.atunit.*; diff --git a/annotations/AtUnitExample5.java b/annotations/AtUnitExample5.java index befc7117f..972970582 100644 --- a/annotations/AtUnitExample5.java +++ b/annotations/AtUnitExample5.java @@ -2,8 +2,8 @@ // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. -// {main: onjava.atunit.AtUnit} -// {Args: build/classes/main/annotations/AtUnitExample5.class} +// {java onjava.atunit.AtUnit +// build/classes/main/annotations/AtUnitExample5.class} package annotations; import java.io.*; import onjava.atunit.*; diff --git a/annotations/AtUnitExternalTest.java b/annotations/AtUnitExternalTest.java index 9d9d90f16..a58909bed 100644 --- a/annotations/AtUnitExternalTest.java +++ b/annotations/AtUnitExternalTest.java @@ -3,8 +3,8 @@ // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. // Creating non-embedded tests -// {main: onjava.atunit.AtUnit} -// {Args: build/classes/main/annotations/AtUnitExternalTest.class} +// {java onjava.atunit.AtUnit +// build/classes/main/annotations/AtUnitExternalTest.class} package annotations; import onjava.atunit.*; import onjava.*; diff --git a/annotations/HashSetTest.java b/annotations/HashSetTest.java index 3b79ea207..553378ea4 100644 --- a/annotations/HashSetTest.java +++ b/annotations/HashSetTest.java @@ -2,8 +2,8 @@ // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. -// {main: onjava.atunit.AtUnit} -// {Args: build/classes/main/annotations/HashSetTest.class} +// {java onjava.atunit.AtUnit +// build/classes/main/annotations/HashSetTest.class} package annotations; import java.util.*; import onjava.atunit.*; diff --git a/annotations/StackLStringTest.java b/annotations/StackLStringTest.java index cdad60c10..5ceda09cd 100644 --- a/annotations/StackLStringTest.java +++ b/annotations/StackLStringTest.java @@ -3,8 +3,8 @@ // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. // Applying @Unit to generics -// {main: onjava.atunit.AtUnit} -// {Args: build/classes/main/annotations/StackLStringTest.class} +// {java onjava.atunit.AtUnit +// build/classes/main/annotations/StackLStringTest.class} package annotations; import onjava.atunit.*; import onjava.*; diff --git a/annotations/database/TableCreator.java b/annotations/database/TableCreator.java index 6001e07fd..eeb80705e 100644 --- a/annotations/database/TableCreator.java +++ b/annotations/database/TableCreator.java @@ -3,8 +3,8 @@ // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. // Reflection-based annotation processor -// {main: annotations.database.TableCreator} -// {Args: annotations.database.Member} +// {java annotations.database.TableCreator +// annotations.database.Member} package annotations.database; import java.lang.annotation.*; import java.lang.reflect.*; diff --git a/annotations/ifx/Multiplier.java b/annotations/ifx/Multiplier.java index 34f73db17..71322e11e 100644 --- a/annotations/ifx/Multiplier.java +++ b/annotations/ifx/Multiplier.java @@ -3,7 +3,7 @@ // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. // javac-based annotation processing -// {main: annotations.ifx.Multiplier} +// {java annotations.ifx.Multiplier} package annotations.ifx; @ExtractInterface(interfaceName="IMultiplier") diff --git a/annotations/simplest/SimpleTest.java b/annotations/simplest/SimpleTest.java index eaad49372..4a991d50d 100644 --- a/annotations/simplest/SimpleTest.java +++ b/annotations/simplest/SimpleTest.java @@ -3,7 +3,7 @@ // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. // Test the "Simple" annotation -// {main: annotations.simplest.SimpleTest} +// {java annotations.simplest.SimpleTest} package annotations.simplest; @Simple diff --git a/build.gradle b/build.gradle index c828861fa..59db6ef40 100644 --- a/build.gradle +++ b/build.gradle @@ -3,7 +3,7 @@ import org.apache.tools.ant.util.TeeOutputStream boolean debug = false class Tags { - Boolean mainMethod = false + Boolean hasMainMethod = false Boolean compileTimeError = false Boolean throwsException = false Boolean errorOutputExpected = false @@ -22,20 +22,25 @@ class Tags { def Tags(List lines) { this.lines = lines block = lines.join('') - mainMethod = block.contains('main(String[] args)') + hasMainMethod = block.contains('main(String[] args)') fileRoot = lines[0].split("/")[-1] - ".java" mainClass = fileRoot javaCmd = extract('java') if(javaCmd) { - mainClass = javaCmd - println("fileRoot: " + fileRoot) - println("mainClass: " + mainClass) + def pieces = javaCmd.split() + mainClass = pieces[0] + if(pieces.size() > 1) + for(p in pieces[1..-1]) + if(p.startsWith("-")) + jVMArgs << p + else + args << p } - compileTimeError = testFor('CompileTimeError') - throwsException = testFor('ThrowsException') - errorOutputExpected = testFor('ErrorOutputExpected') - validateByHand = testFor('ValidateByHand') - ignoreOutput = testFor('IgnoreOutput') + compileTimeError = hasTag('CompileTimeError') + throwsException = hasTag('ThrowsException') + errorOutputExpected = hasTag('ErrorOutputExpected') + validateByHand = hasTag('ValidateByHand') + ignoreOutput = hasTag('IgnoreOutput') def argString = extract('Args:') if(argString) args = argString.split(' ') @@ -50,7 +55,7 @@ class Tags { } } } - private def testFor(String marker) { + private def hasTag(String marker) { return block.contains("// {" + marker + "}") } private def extract(String marker) { @@ -89,7 +94,7 @@ class Tags { else break """ - mainMethod + hasMainMethod compileTimeError throwsException errorOutputExpected @@ -139,7 +144,7 @@ subprojects { if(debug && tags.hasTags()) println tags // Add tasks for java sources with main methods - if ((tags.mainMethod || tags.javaCmd) && (!tags.compileTimeError)) { + if ((tags.hasMainMethod || tags.javaCmd) && (!tags.compileTimeError)) { if (!tags.validateByHand) { // Only add tasks that we know we can run successfully to the task list diff --git a/check.bat b/check.bat new file mode 100644 index 000000000..c250560b1 --- /dev/null +++ b/check.bat @@ -0,0 +1,2 @@ +cp ..\..\OnJava-Tools\verify_output.py . +python verify_output.py diff --git a/collections/MapOfList.java b/collections/MapOfList.java index c6dfd5cef..d6ca5e298 100644 --- a/collections/MapOfList.java +++ b/collections/MapOfList.java @@ -2,7 +2,7 @@ // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. -// {main: collections.MapOfList} +// {java collections.MapOfList} package collections; import typeinfo.pets.*; import java.util.*; diff --git a/enums/Burrito.java b/enums/Burrito.java index 5bddb0317..aff22b78a 100644 --- a/enums/Burrito.java +++ b/enums/Burrito.java @@ -2,7 +2,7 @@ // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. -// {main: enums.Burrito} +// {java enums.Burrito} package enums; import static enums.Spiciness.*; diff --git a/enums/EnumMaps.java b/enums/EnumMaps.java index abc8a2ecd..3698f85f3 100644 --- a/enums/EnumMaps.java +++ b/enums/EnumMaps.java @@ -3,7 +3,7 @@ // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. // Basics of EnumMaps -// {main: enums.EnumMaps} +// {java enums.EnumMaps} package enums; import java.util.*; import static enums.AlarmPoints.*; diff --git a/enums/EnumSets.java b/enums/EnumSets.java index f67636cd4..f394b1dbc 100644 --- a/enums/EnumSets.java +++ b/enums/EnumSets.java @@ -3,7 +3,7 @@ // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. // Operations on EnumSets -// {main: enums.EnumSets} +// {java enums.EnumSets} package enums; import java.util.*; import static enums.AlarmPoints.*; diff --git a/enums/RoShamBo1.java b/enums/RoShamBo1.java index a4f3c435f..4dc1c3d5b 100644 --- a/enums/RoShamBo1.java +++ b/enums/RoShamBo1.java @@ -3,7 +3,7 @@ // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. // Demonstration of multiple dispatching -// {main: enums.RoShamBo1} +// {java enums.RoShamBo1} package enums; import java.util.*; import static enums.Outcome.*; diff --git a/enums/RoShamBo2.java b/enums/RoShamBo2.java index 7538c879f..0da102e40 100644 --- a/enums/RoShamBo2.java +++ b/enums/RoShamBo2.java @@ -3,7 +3,7 @@ // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. // Switching one enum on another -// {main: enums.RoShamBo2} +// {java enums.RoShamBo2} package enums; import static enums.Outcome.*; diff --git a/enums/RoShamBo3.java b/enums/RoShamBo3.java index 90df039be..c502f65fa 100644 --- a/enums/RoShamBo3.java +++ b/enums/RoShamBo3.java @@ -3,7 +3,7 @@ // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. // Using constant-specific methods -// {main: enums.RoShamBo3} +// {java enums.RoShamBo3} package enums; import static enums.Outcome.*; diff --git a/enums/RoShamBo4.java b/enums/RoShamBo4.java index b80a55e9b..60d9f25c8 100644 --- a/enums/RoShamBo4.java +++ b/enums/RoShamBo4.java @@ -2,7 +2,7 @@ // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. -// {main: enums.RoShamBo4} +// {java enums.RoShamBo4} package enums; public enum RoShamBo4 implements Competitor { diff --git a/enums/RoShamBo5.java b/enums/RoShamBo5.java index 78f805071..2206d181d 100644 --- a/enums/RoShamBo5.java +++ b/enums/RoShamBo5.java @@ -3,7 +3,7 @@ // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. // Multiple dispatching using an EnumMap of EnumMaps -// {main: enums.RoShamBo5} +// {java enums.RoShamBo5} package enums; import java.util.*; import static enums.Outcome.*; diff --git a/enums/RoShamBo6.java b/enums/RoShamBo6.java index b59a05eb1..a74784c05 100644 --- a/enums/RoShamBo6.java +++ b/enums/RoShamBo6.java @@ -3,7 +3,7 @@ // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. // Enums using "tables" instead of multiple dispatch -// {main: enums.RoShamBo6} +// {java enums.RoShamBo6} package enums; import static enums.Outcome.*; diff --git a/enums/cartoons/EnumImplementation.java b/enums/cartoons/EnumImplementation.java index 5164b0d03..40cd6cfb9 100644 --- a/enums/cartoons/EnumImplementation.java +++ b/enums/cartoons/EnumImplementation.java @@ -3,7 +3,7 @@ // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. // An enum can implement an interface -// {main: enums.cartoons.EnumImplementation} +// {java enums.cartoons.EnumImplementation} package enums.cartoons; import java.util.*; import java.util.function.*; diff --git a/enums/menu/Meal.java b/enums/menu/Meal.java index 7d6cb8d34..2baab82d1 100644 --- a/enums/menu/Meal.java +++ b/enums/menu/Meal.java @@ -2,7 +2,7 @@ // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. -// {main: enums.menu.Meal} +// {java enums.menu.Meal} package enums.menu; public class Meal { diff --git a/enums/menu/Meal2.java b/enums/menu/Meal2.java index a0aaf84f7..52737655f 100644 --- a/enums/menu/Meal2.java +++ b/enums/menu/Meal2.java @@ -2,7 +2,7 @@ // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. -// {main: enums.menu.Meal2} +// {java enums.menu.Meal2} package enums.menu; import onjava.*; diff --git a/enums/menu/TypeOfFood.java b/enums/menu/TypeOfFood.java index b4d06851f..c40175596 100644 --- a/enums/menu/TypeOfFood.java +++ b/enums/menu/TypeOfFood.java @@ -2,7 +2,7 @@ // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. -// {main: enums.menu.TypeOfFood} +// {java enums.menu.TypeOfFood} package enums.menu; import static enums.menu.Food.*; diff --git a/generics/coffee/CoffeeSupplier.java b/generics/coffee/CoffeeSupplier.java index 512eb964b..00d59cdba 100644 --- a/generics/coffee/CoffeeSupplier.java +++ b/generics/coffee/CoffeeSupplier.java @@ -2,7 +2,7 @@ // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. -// {main: generics.coffee.CoffeeSupplier} +// {java generics.coffee.CoffeeSupplier} package generics.coffee; import java.util.*; import java.util.function.*; diff --git a/generics/decorator/Decoration.java b/generics/decorator/Decoration.java index fe608ff33..ff1bbc4a7 100644 --- a/generics/decorator/Decoration.java +++ b/generics/decorator/Decoration.java @@ -2,7 +2,7 @@ // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. -// {main: generics.decorator.Decoration} +// {java generics.decorator.Decoration} package generics.decorator; import java.util.*; diff --git a/innerclasses/Callbacks.java b/innerclasses/Callbacks.java index 323c8239b..89bb33a9f 100644 --- a/innerclasses/Callbacks.java +++ b/innerclasses/Callbacks.java @@ -3,7 +3,7 @@ // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. // Using inner classes for callbacks -// {main: innerclasses.Callbacks} +// {java innerclasses.Callbacks} package innerclasses; interface Incrementable { diff --git a/innerclasses/ClassInInterface.java b/innerclasses/ClassInInterface.java index dfdc63d34..99f409c5f 100644 --- a/innerclasses/ClassInInterface.java +++ b/innerclasses/ClassInInterface.java @@ -2,7 +2,7 @@ // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. -// {main: ClassInInterface$Test} +// {java ClassInInterface$Test} public interface ClassInInterface { void howdy(); diff --git a/innerclasses/MultiImplementation.java b/innerclasses/MultiImplementation.java index e38250d6f..faa4ebd53 100644 --- a/innerclasses/MultiImplementation.java +++ b/innerclasses/MultiImplementation.java @@ -4,7 +4,7 @@ // Visit http://mindviewinc.com/Books/OnJava/ for more book information. // For concrete or abstract classes, inner classes // produce "multiple implementation inheritance" -// {main: innerclasses.MultiImplementation} +// {java innerclasses.MultiImplementation} package innerclasses; class D {} diff --git a/innerclasses/TestBed.java b/innerclasses/TestBed.java index b8ee7d3b1..87a453f43 100644 --- a/innerclasses/TestBed.java +++ b/innerclasses/TestBed.java @@ -3,7 +3,7 @@ // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. // Putting test code in a nested class -// {main: TestBed$Tester} +// {java TestBed$Tester} public class TestBed { public void f() { System.out.println("f()"); } diff --git a/innerclasses/mui/MultiInterfaces.java b/innerclasses/mui/MultiInterfaces.java index e36a78b78..7c7f01860 100644 --- a/innerclasses/mui/MultiInterfaces.java +++ b/innerclasses/mui/MultiInterfaces.java @@ -3,7 +3,7 @@ // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. // Two ways that a class can implement multiple interfaces -// {main: innerclasses.mui.MultiInterfaces} +// {java innerclasses.mui.MultiInterfaces} package innerclasses.mui; interface A {} diff --git a/interfaces/interfaceprocessor/FilterProcessor.java b/interfaces/interfaceprocessor/FilterProcessor.java index 221a9c1ae..5df986d2a 100644 --- a/interfaces/interfaceprocessor/FilterProcessor.java +++ b/interfaces/interfaceprocessor/FilterProcessor.java @@ -2,7 +2,7 @@ // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. -// {main: interfaces.interfaceprocessor.FilterProcessor} +// {java interfaces.interfaceprocessor.FilterProcessor} package interfaces.interfaceprocessor; import interfaces.filters.*; diff --git a/interfaces/interfaceprocessor/StringProcessor.java b/interfaces/interfaceprocessor/StringProcessor.java index a5593fa7f..f138e6f42 100644 --- a/interfaces/interfaceprocessor/StringProcessor.java +++ b/interfaces/interfaceprocessor/StringProcessor.java @@ -2,7 +2,7 @@ // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. -// {main: interfaces.interfaceprocessor.StringProcessor} +// {java interfaces.interfaceprocessor.StringProcessor} package interfaces.interfaceprocessor; import java.util.*; diff --git a/interfaces/music4/Music4.java b/interfaces/music4/Music4.java index 628aaa066..d3077fff0 100644 --- a/interfaces/music4/Music4.java +++ b/interfaces/music4/Music4.java @@ -3,7 +3,7 @@ // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. // Abstract classes and methods -// {main: interfaces.music4.Music4} +// {java interfaces.music4.Music4} package interfaces.music4; import polymorphism.music.Note; diff --git a/interfaces/music5/Music5.java b/interfaces/music5/Music5.java index d3c0461e6..2ac4b7f8d 100644 --- a/interfaces/music5/Music5.java +++ b/interfaces/music5/Music5.java @@ -2,7 +2,7 @@ // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. -// {main: interfaces.music5.Music5} +// {java interfaces.music5.Music5} package interfaces.music5; import polymorphism.music.Note; diff --git a/interfaces/nesting/NestingInterfaces.java b/interfaces/nesting/NestingInterfaces.java index 0f6bafbfa..4b3985adc 100644 --- a/interfaces/nesting/NestingInterfaces.java +++ b/interfaces/nesting/NestingInterfaces.java @@ -2,7 +2,7 @@ // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. -// {main: interfaces.nesting.NestingInterfaces} +// {java interfaces.nesting.NestingInterfaces} package interfaces.nesting; class A { diff --git a/onjava/CollectionMethodDifferences.java b/onjava/CollectionMethodDifferences.java index 0bca0ba2c..dec100afb 100644 --- a/onjava/CollectionMethodDifferences.java +++ b/onjava/CollectionMethodDifferences.java @@ -2,7 +2,7 @@ // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. -// {main: onjava.CollectionMethodDifferences} +// {java onjava.CollectionMethodDifferences} package onjava; import java.lang.reflect.*; import java.util.*; diff --git a/onjava/CountMap.java b/onjava/CountMap.java index 6d08bbd35..72a174e88 100644 --- a/onjava/CountMap.java +++ b/onjava/CountMap.java @@ -3,7 +3,7 @@ // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. // Unlimited-length Map containing sample data -// {main: onjava.CountMap} +// {java onjava.CountMap} package onjava; import java.util.*; diff --git a/onjava/CountingIntegerList.java b/onjava/CountingIntegerList.java index f702c0967..c457f1b8e 100644 --- a/onjava/CountingIntegerList.java +++ b/onjava/CountingIntegerList.java @@ -3,7 +3,7 @@ // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. // List of any length, containing sample data -// {main: onjava.CountingIntegerList} +// {java onjava.CountingIntegerList} package onjava; import java.util.*; diff --git a/onjava/Countries.java b/onjava/Countries.java index 9a3587ade..e94458999 100644 --- a/onjava/Countries.java +++ b/onjava/Countries.java @@ -3,7 +3,7 @@ // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. // "Flyweight" Maps and Lists of sample data -// {main: onjava.Countries} +// {java onjava.Countries} package onjava; import java.util.*; diff --git a/onjava/Hex.java b/onjava/Hex.java index e8f53f6f2..29c9b0ddc 100644 --- a/onjava/Hex.java +++ b/onjava/Hex.java @@ -2,7 +2,7 @@ // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. -// {main: onjava.Hex} +// {java onjava.Hex} package onjava; import java.io.*; import java.nio.file.*; diff --git a/onjava/ProcessFiles.java b/onjava/ProcessFiles.java index a716fcca3..583f27f63 100644 --- a/onjava/ProcessFiles.java +++ b/onjava/ProcessFiles.java @@ -3,7 +3,7 @@ // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. // {ValidateByHand} -// {main: onjava.ProcessFiles} +// {java onjava.ProcessFiles} package onjava; import java.io.*; import java.nio.file.*; diff --git a/onjava/atunit/AtUnit.java b/onjava/atunit/AtUnit.java index 737ad0d2f..34b1f6c5f 100644 --- a/onjava/atunit/AtUnit.java +++ b/onjava/atunit/AtUnit.java @@ -3,7 +3,7 @@ // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. // An annotation-based unit-test framework -// {main: onjava.atunit.AtUnit} +// {java onjava.atunit.AtUnit} package onjava.atunit; import java.lang.reflect.*; import java.io.*; diff --git a/onjava/atunit/ClassNameFinder.java b/onjava/atunit/ClassNameFinder.java index 5693ef0af..55e336948 100644 --- a/onjava/atunit/ClassNameFinder.java +++ b/onjava/atunit/ClassNameFinder.java @@ -2,7 +2,7 @@ // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. -// {main: onjava.atunit.ClassNameFinder} +// {java onjava.atunit.ClassNameFinder} package onjava.atunit; import java.io.*; import java.nio.file.*; diff --git a/patterns/absfactory/GameEnvironment.java b/patterns/absfactory/GameEnvironment.java index 7de3c5f77..26f2e47ad 100644 --- a/patterns/absfactory/GameEnvironment.java +++ b/patterns/absfactory/GameEnvironment.java @@ -3,7 +3,7 @@ // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. // An example of the Abstract Factory pattern -// {main: patterns.absfactory.GameEnvironment} +// {java patterns.absfactory.GameEnvironment} package patterns.absfactory; import java.util.function.*; diff --git a/patterns/adapt/Adapter.java b/patterns/adapt/Adapter.java index de2ed7e74..7001c8781 100644 --- a/patterns/adapt/Adapter.java +++ b/patterns/adapt/Adapter.java @@ -3,7 +3,7 @@ // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. // Variations on the Adapter pattern -// {main: patterns.adapt.Adapter} +// {java patterns.adapt.Adapter} package patterns.adapt; class WhatIHave { diff --git a/patterns/chain/ChainOfResponsibility.java b/patterns/chain/ChainOfResponsibility.java index 05663800a..f94b7cbc7 100644 --- a/patterns/chain/ChainOfResponsibility.java +++ b/patterns/chain/ChainOfResponsibility.java @@ -3,7 +3,7 @@ // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. // Using the Functional interface -// {main: patterns.chain.ChainOfResponsibility} +// {java patterns.chain.ChainOfResponsibility} package patterns.chain; import java.util.*; import java.util.function.*; diff --git a/patterns/doubledispatch/DoubleDispatch.java b/patterns/doubledispatch/DoubleDispatch.java index 604d50027..ea2eab506 100644 --- a/patterns/doubledispatch/DoubleDispatch.java +++ b/patterns/doubledispatch/DoubleDispatch.java @@ -4,7 +4,7 @@ // Visit http://mindviewinc.com/Books/OnJava/ for more book information. // Using multiple dispatching to handle more // than one unknown type during a method call -// {main: patterns.doubledispatch.DoubleDispatch} +// {java patterns.doubledispatch.DoubleDispatch} package patterns.doubledispatch; import patterns.trash.*; import java.util.*; diff --git a/patterns/dynatrash/DynaTrash.java b/patterns/dynatrash/DynaTrash.java index 1ad760860..89f240a72 100644 --- a/patterns/dynatrash/DynaTrash.java +++ b/patterns/dynatrash/DynaTrash.java @@ -5,7 +5,7 @@ // Using a Map of Lists and RTTI to automatically // sort trash into Lists. This solution, despite // the use of RTTI, is extensible. -// {main: patterns.dynatrash.DynaTrash} +// {java patterns.dynatrash.DynaTrash} package patterns.dynatrash; import patterns.trash.*; import java.util.*; diff --git a/patterns/factory/ShapeFactory1.java b/patterns/factory/ShapeFactory1.java index 33ac728d0..76706bb1d 100644 --- a/patterns/factory/ShapeFactory1.java +++ b/patterns/factory/ShapeFactory1.java @@ -3,7 +3,7 @@ // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. // A simple static factory method -// {main: patterns.factory.ShapeFactory1} +// {java patterns.factory.ShapeFactory1} package patterns.factory; import java.util.*; import java.util.stream.*; diff --git a/patterns/observer/ObservedFlower.java b/patterns/observer/ObservedFlower.java index 8d4662f5e..761595a55 100644 --- a/patterns/observer/ObservedFlower.java +++ b/patterns/observer/ObservedFlower.java @@ -3,7 +3,7 @@ // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. // Demonstration of "Observer" pattern -// {main: patterns.observer.ObservedFlower} +// {java patterns.observer.ObservedFlower} package patterns.observer; import java.util.*; diff --git a/patterns/recyclea/RecycleA.java b/patterns/recyclea/RecycleA.java index fb3174d95..c8d228474 100644 --- a/patterns/recyclea/RecycleA.java +++ b/patterns/recyclea/RecycleA.java @@ -3,7 +3,7 @@ // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. // Recycling with RTTI -// {main: patterns.recyclea.RecycleA} +// {java patterns.recyclea.RecycleA} package patterns.recyclea; import java.util.*; import java.util.function.*; diff --git a/patterns/recycleb/RecycleB.java b/patterns/recycleb/RecycleB.java index 871491eb8..f5d567ce7 100644 --- a/patterns/recycleb/RecycleB.java +++ b/patterns/recycleb/RecycleB.java @@ -2,7 +2,7 @@ // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. -// {main: patterns.recycleb.RecycleB} +// {java patterns.recycleb.RecycleB} package patterns.recycleb; import patterns.trash.*; import java.util.*; diff --git a/patterns/recyclec/RecycleC.java b/patterns/recyclec/RecycleC.java index 9a0b86ddc..3af3d0f20 100644 --- a/patterns/recyclec/RecycleC.java +++ b/patterns/recyclec/RecycleC.java @@ -3,7 +3,7 @@ // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. // Adding more objects to the recycling problem -// {main: patterns.recyclec.RecycleC} +// {java patterns.recyclec.RecycleC} package patterns.recyclec; import patterns.trash.*; import java.util.*; diff --git a/patterns/state/StateMachineDemo.java b/patterns/state/StateMachineDemo.java index c9b205755..e6ff5c264 100644 --- a/patterns/state/StateMachineDemo.java +++ b/patterns/state/StateMachineDemo.java @@ -3,7 +3,7 @@ // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. // The StateMachine pattern and Template method -// {main: patterns.state.StateMachineDemo} +// {java patterns.state.StateMachineDemo} package patterns.state; interface State { diff --git a/patterns/strategy/StrategyPattern.java b/patterns/strategy/StrategyPattern.java index 9092376c6..e7d60b374 100644 --- a/patterns/strategy/StrategyPattern.java +++ b/patterns/strategy/StrategyPattern.java @@ -2,7 +2,7 @@ // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. -// {main: patterns.strategy.StrategyPattern} +// {java patterns.strategy.StrategyPattern} package patterns.strategy; import java.util.function.*; import java.util.*; diff --git a/patterns/strategy/StrategyPattern2.java b/patterns/strategy/StrategyPattern2.java index db87b8158..341447a1e 100644 --- a/patterns/strategy/StrategyPattern2.java +++ b/patterns/strategy/StrategyPattern2.java @@ -2,7 +2,7 @@ // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. -// {main: patterns.strategy.StrategyPattern2} +// {java patterns.strategy.StrategyPattern2} package patterns.strategy; import java.util.function.*; import java.util.*; diff --git a/patterns/trash/ParseTrash.java b/patterns/trash/ParseTrash.java index b55f704da..f91a2cbf3 100644 --- a/patterns/trash/ParseTrash.java +++ b/patterns/trash/ParseTrash.java @@ -4,7 +4,7 @@ // Visit http://mindviewinc.com/Books/OnJava/ for more book information. // Open a file and parse its contents into // Trash objects, placing each into a List -// {main: patterns.trash.ParseTrash} +// {java patterns.trash.ParseTrash} package patterns.trash; import java.util.*; import java.util.stream.*; diff --git a/patterns/trashvisitor/TrashVisitor.java b/patterns/trashvisitor/TrashVisitor.java index 1ab8b3bc5..728348b04 100644 --- a/patterns/trashvisitor/TrashVisitor.java +++ b/patterns/trashvisitor/TrashVisitor.java @@ -2,7 +2,7 @@ // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. -// {main: patterns.trashvisitor.TrashVisitor} +// {java patterns.trashvisitor.TrashVisitor} package patterns.trashvisitor; import patterns.trash.*; import java.util.*; diff --git a/patterns/visitor/BeeAndFlowers.java b/patterns/visitor/BeeAndFlowers.java index 739c2db01..b794a424d 100644 --- a/patterns/visitor/BeeAndFlowers.java +++ b/patterns/visitor/BeeAndFlowers.java @@ -3,7 +3,7 @@ // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. // Demonstration of "visitor" pattern -// {main: patterns.visitor.BeeAndFlowers} +// {java patterns.visitor.BeeAndFlowers} package patterns.visitor; import java.util.*; import java.util.function.*; diff --git a/patterns/visualobserver/BoxObserver.java b/patterns/visualobserver/BoxObserver.java index e29ba9628..ee002ea5c 100644 --- a/patterns/visualobserver/BoxObserver.java +++ b/patterns/visualobserver/BoxObserver.java @@ -4,7 +4,7 @@ // Visit http://mindviewinc.com/Books/OnJava/ for more book information. // Demonstration of Observer pattern using // Java's built-in observer classes -// {main: patterns.visualobserver.BoxObserver} +// {java patterns.visualobserver.BoxObserver} package patterns.visualobserver; import javax.swing.*; import java.awt.*; diff --git a/polymorphism/Frog.java b/polymorphism/Frog.java index 86ff42ce3..89e4de3f9 100644 --- a/polymorphism/Frog.java +++ b/polymorphism/Frog.java @@ -3,7 +3,7 @@ // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. // Cleanup and inheritance -// {main: polymorphism.Frog} +// {java polymorphism.Frog} package polymorphism; class Characteristic { diff --git a/polymorphism/PrivateOverride.java b/polymorphism/PrivateOverride.java index 1f5eef034..86240c9a4 100644 --- a/polymorphism/PrivateOverride.java +++ b/polymorphism/PrivateOverride.java @@ -3,7 +3,7 @@ // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. // Trying to override a private method -// {main: polymorphism.PrivateOverride} +// {java polymorphism.PrivateOverride} package polymorphism; public class PrivateOverride { diff --git a/polymorphism/Sandwich.java b/polymorphism/Sandwich.java index 7c507f471..965878056 100644 --- a/polymorphism/Sandwich.java +++ b/polymorphism/Sandwich.java @@ -3,7 +3,7 @@ // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. // Order of constructor calls -// {main: polymorphism.Sandwich} +// {java polymorphism.Sandwich} package polymorphism; class Meal { diff --git a/polymorphism/music/Music.java b/polymorphism/music/Music.java index d12b01c7f..1ac678c1d 100644 --- a/polymorphism/music/Music.java +++ b/polymorphism/music/Music.java @@ -3,7 +3,7 @@ // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. // Inheritance & upcasting -// {main: polymorphism.music.Music} +// {java polymorphism.music.Music} package polymorphism.music; public class Music { diff --git a/polymorphism/music/Music2.java b/polymorphism/music/Music2.java index a9fe50783..97b5530ae 100644 --- a/polymorphism/music/Music2.java +++ b/polymorphism/music/Music2.java @@ -3,7 +3,7 @@ // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. // Overloading instead of upcasting -// {main: polymorphism.music.Music2} +// {java polymorphism.music.Music2} package polymorphism.music; class Stringed extends Instrument { diff --git a/polymorphism/music3/Music3.java b/polymorphism/music3/Music3.java index 1fe3903ca..601c8f921 100644 --- a/polymorphism/music3/Music3.java +++ b/polymorphism/music3/Music3.java @@ -3,7 +3,7 @@ // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. // An extensible program -// {main: polymorphism.music3.Music3} +// {java polymorphism.music3.Music3} package polymorphism.music3; import polymorphism.music.Note; diff --git a/reuse/CADSystem.java b/reuse/CADSystem.java index 05085f91a..f090060d0 100644 --- a/reuse/CADSystem.java +++ b/reuse/CADSystem.java @@ -3,7 +3,7 @@ // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. // Ensuring proper cleanup -// {main: reuse.CADSystem} +// {java reuse.CADSystem} package reuse; class Shape { diff --git a/serialization/xfiles/ThawAlien.java b/serialization/xfiles/ThawAlien.java index 75baba0b1..bae803ad5 100644 --- a/serialization/xfiles/ThawAlien.java +++ b/serialization/xfiles/ThawAlien.java @@ -3,7 +3,7 @@ // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. // Recover a serialized file -// {main: serialization.xfiles.ThawAlien} +// {java serialization.xfiles.ThawAlien} // {RunFirst: FreezeAlien} package serialization.xfiles; import java.io.*; diff --git a/staticchecking/dr/DogsAndRobots.java b/staticchecking/dr/DogsAndRobots.java index 67f68e82f..f9928f566 100644 --- a/staticchecking/dr/DogsAndRobots.java +++ b/staticchecking/dr/DogsAndRobots.java @@ -2,7 +2,7 @@ // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. -// {main: staticchecking.dr.DogsAndRobots} +// {java staticchecking.dr.DogsAndRobots} package staticchecking.dr; interface Speaks { void talk(); } diff --git a/staticchecking/drc/DogAndRobotCollections.java b/staticchecking/drc/DogAndRobotCollections.java index 06c62a782..4afc25fdd 100644 --- a/staticchecking/drc/DogAndRobotCollections.java +++ b/staticchecking/drc/DogAndRobotCollections.java @@ -2,7 +2,7 @@ // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. -// {main: staticchecking.drc.DogAndRobotCollections} +// {java staticchecking.drc.DogAndRobotCollections} package staticchecking.drc; import java.util.*; diff --git a/staticchecking/latent/Latent.java b/staticchecking/latent/Latent.java index bd9e8606c..18574d106 100644 --- a/staticchecking/latent/Latent.java +++ b/staticchecking/latent/Latent.java @@ -2,7 +2,7 @@ // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. -// {main: staticchecking.latent.Latent} +// {java staticchecking.latent.Latent} package staticchecking.latent; import java.lang.reflect.*; diff --git a/staticchecking/petspeak/PetSpeak.java b/staticchecking/petspeak/PetSpeak.java index b2847bb4a..c6599c8a5 100644 --- a/staticchecking/petspeak/PetSpeak.java +++ b/staticchecking/petspeak/PetSpeak.java @@ -3,7 +3,7 @@ // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. // Speaking pets in Java -// {main: staticchecking.petspeak.PetSpeak} +// {java staticchecking.petspeak.PetSpeak} package staticchecking.petspeak; interface Pet { diff --git a/threads/CriticalSection.java b/threads/CriticalSection.java index 18f04b172..cbb7d3e07 100644 --- a/threads/CriticalSection.java +++ b/threads/CriticalSection.java @@ -6,7 +6,7 @@ // Synchronizing blocks instead of entire methods. Also // demonstrates protection of a non-thread-safe class // with a thread-safe one. -// {main: threads.CriticalSection} +// {java threads.CriticalSection} package threads; import java.util.concurrent.*; import java.util.concurrent.atomic.*; diff --git a/threads/ExplicitCriticalSection.java b/threads/ExplicitCriticalSection.java index 557e6327f..039cb074e 100644 --- a/threads/ExplicitCriticalSection.java +++ b/threads/ExplicitCriticalSection.java @@ -4,7 +4,7 @@ // Visit http://mindviewinc.com/Books/OnJava/ for more book information. // {ThrowsException} on a multiprocessor machine // Using explicit Lock objects to create critical sections -// {main: threads.ExplicitCriticalSection} +// {java threads.ExplicitCriticalSection} package threads; import java.util.concurrent.locks.*; diff --git a/threads/restaurant2/RestaurantWithQueues.java b/threads/restaurant2/RestaurantWithQueues.java index cff6191c9..c089e4bca 100644 --- a/threads/restaurant2/RestaurantWithQueues.java +++ b/threads/restaurant2/RestaurantWithQueues.java @@ -2,8 +2,7 @@ // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. -// {Args: 5} -// {main: threads.restaurant2.RestaurantWithQueues} +// {java threads.restaurant2.RestaurantWithQueues 5} package threads.restaurant2; import enums.menu.*; import java.util.concurrent.*; diff --git a/typeinfo/FamilyVsExactType.java b/typeinfo/FamilyVsExactType.java index 33f3a8626..cced9fba6 100644 --- a/typeinfo/FamilyVsExactType.java +++ b/typeinfo/FamilyVsExactType.java @@ -3,7 +3,7 @@ // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. // The difference between instanceof and class -// {main: typeinfo.FamilyVsExactType} +// {java typeinfo.FamilyVsExactType} package typeinfo; class Base {} diff --git a/typeinfo/pets/LiteralPetCreator.java b/typeinfo/pets/LiteralPetCreator.java index 7c75e49e3..67c928acd 100644 --- a/typeinfo/pets/LiteralPetCreator.java +++ b/typeinfo/pets/LiteralPetCreator.java @@ -3,7 +3,7 @@ // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. // Using class literals -// {main: typeinfo.pets.LiteralPetCreator} +// {java typeinfo.pets.LiteralPetCreator} package typeinfo.pets; import java.util.*; diff --git a/typeinfo/toys/GenericToyTest.java b/typeinfo/toys/GenericToyTest.java index 009bf7ce0..943e253db 100644 --- a/typeinfo/toys/GenericToyTest.java +++ b/typeinfo/toys/GenericToyTest.java @@ -3,7 +3,7 @@ // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. // Testing class Class -// {main: typeinfo.toys.GenericToyTest} +// {java typeinfo.toys.GenericToyTest} package typeinfo.toys; public class GenericToyTest { diff --git a/typeinfo/toys/ToyTest.java b/typeinfo/toys/ToyTest.java index b3e3f0e33..f3a38cc59 100644 --- a/typeinfo/toys/ToyTest.java +++ b/typeinfo/toys/ToyTest.java @@ -3,7 +3,7 @@ // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. // Testing class Class -// {main: typeinfo.toys.ToyTest} +// {java typeinfo.toys.ToyTest} package typeinfo.toys; interface HasBatteries {} diff --git a/verify_output.py b/verify_output.py index 376692c9d..088ca6a35 100644 --- a/verify_output.py +++ b/verify_output.py @@ -102,17 +102,18 @@ def no_match(input_text): return True # Chain of responsibility: strategies = [ - # Filter Retain result for rest of chain - (exact_match, False), - (ignore_dates, True ), - (ignore_memory_addresses, True ), - (sort_lines, False), - (ignore_digits, False), - (sort_words, False), - (unique_lines, False), - (unique_words, False), - (words_only, False), - (no_match, False), + # Filter # Retain result + # for rest of chain + (exact_match, False), + (ignore_dates, True), + (ignore_memory_addresses, True), + (sort_lines, False), + (ignore_digits, False), + (sort_words, False), + (unique_lines, False), + (unique_words, False), + (words_only, False), + (no_match, False), ] @@ -142,8 +143,8 @@ def find_output_match(self, javafile, embedded_output, generated_output): with Validator.compare_output.open('a') as batch: batch.write("subl " + str(tfile) + "\n") with tfile.open('w') as trace_file: - trace_file.write(str(embedded_output) + "\n\n") - trace_file.write("=== Actual ===\n\n") + trace_file.write(javafile.read_text() + "\n\n") + trace_file.write("// === Actual ===\n\n") trace_file.write(str(generated_output)) return if retain: From dc3172ce90246844cc4d35905a8beac64b730efd Mon Sep 17 00:00:00 2001 From: Bruce Eckel Date: Thu, 28 Jul 2016 13:42:03 -0600 Subject: [PATCH 051/320] More switching to {java command line} --- assertions/Assert1.java | 2 +- assertions/Assert2.java | 2 +- build.gradle | 6 ------ collectionsindepth/ListPerformance.java | 2 +- collectionsindepth/MapPerformance.java | 2 +- collectionsindepth/RandomBounds.java | 2 +- collectionsindepth/SetPerformance.java | 2 +- compression/GZIPcompress.java | 2 +- compression/ZipCompress.java | 2 +- enums/VendingMachine.java | 2 +- innerclasses/GreenhouseController.java | 2 +- logging/ConfigureLogging.java | 3 ++- newio/ChannelCopy.java | 2 +- newio/TransferTo.java | 2 +- strings/JGrep.java | 3 ++- strings/TestRegularExpression.java | 3 ++- threads/BankTellerSimulation.java | 2 +- threads/DeadlockingDiningPhilosophers.java | 2 +- threads/FixedDiningPhilosophers.java | 2 +- threads/GreenhouseScheduler.java | 2 +- threads/SerialNumberChecker.java | 2 +- typeinfo/ShowMethods.java | 2 +- 22 files changed, 24 insertions(+), 27 deletions(-) diff --git a/assertions/Assert1.java b/assertions/Assert1.java index 1822490a1..a0e0a8c5a 100644 --- a/assertions/Assert1.java +++ b/assertions/Assert1.java @@ -4,7 +4,7 @@ // Visit http://mindviewinc.com/Books/OnJava/ for more book information. // Non-informative style of assert // Must run with -ea: -// {JVMArgs: -ea} +// {java -ea Assert1} // {ThrowsException} public class Assert1 { diff --git a/assertions/Assert2.java b/assertions/Assert2.java index bccefc77a..7d5cddcdb 100644 --- a/assertions/Assert2.java +++ b/assertions/Assert2.java @@ -3,7 +3,7 @@ // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. // Assert with an information-expression -// {JVMArgs: -ea} +// {java Assert2 -ea} // {ThrowsException} public class Assert2 { diff --git a/build.gradle b/build.gradle index 59db6ef40..932e62d97 100644 --- a/build.gradle +++ b/build.gradle @@ -41,12 +41,6 @@ class Tags { errorOutputExpected = hasTag('ErrorOutputExpected') validateByHand = hasTag('ValidateByHand') ignoreOutput = hasTag('IgnoreOutput') - def argString = extract('Args:') - if(argString) - args = argString.split(' ') - def jvmArgString = extract('JVMArgs:') - if(jvmArgString) - jVMArgs = jvmArgString.split(' ') exec = extract('Exec:') runFirst = extract('RunFirst:') lines.each { diff --git a/collectionsindepth/ListPerformance.java b/collectionsindepth/ListPerformance.java index 82401fbaa..1459f5fa5 100644 --- a/collectionsindepth/ListPerformance.java +++ b/collectionsindepth/ListPerformance.java @@ -4,7 +4,7 @@ // Visit http://mindviewinc.com/Books/OnJava/ for more book information. // Demonstrates performance differences in Lists // Small to keep build testing short: -// {Args: 100 500} +// {java ListPerformance 100 500} import java.util.*; import onjava.*; diff --git a/collectionsindepth/MapPerformance.java b/collectionsindepth/MapPerformance.java index 0981a55eb..6105f92ce 100644 --- a/collectionsindepth/MapPerformance.java +++ b/collectionsindepth/MapPerformance.java @@ -4,7 +4,7 @@ // Visit http://mindviewinc.com/Books/OnJava/ for more book information. // Demonstrates performance differences in Maps // Small to keep build testing short: -// {Args: 100 5000} +// {java MapPerformance 100 5000} import java.util.*; public class MapPerformance { diff --git a/collectionsindepth/RandomBounds.java b/collectionsindepth/RandomBounds.java index 83e316a65..fee3b6097 100644 --- a/collectionsindepth/RandomBounds.java +++ b/collectionsindepth/RandomBounds.java @@ -3,7 +3,7 @@ // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. // Does Math.random() produce 0.0 and 1.0? -// {Args: lower} +// {java RandomBounds lower} import onjava.*; public class RandomBounds { diff --git a/collectionsindepth/SetPerformance.java b/collectionsindepth/SetPerformance.java index 17077b907..add404f9a 100644 --- a/collectionsindepth/SetPerformance.java +++ b/collectionsindepth/SetPerformance.java @@ -4,7 +4,7 @@ // Visit http://mindviewinc.com/Books/OnJava/ for more book information. // Demonstrates performance differences in Sets // Small to keep build testing short: -// {Args: 100 5000} +// {java SetPerformance 100 5000} import java.util.*; public class SetPerformance { diff --git a/compression/GZIPcompress.java b/compression/GZIPcompress.java index 9539c0b47..dce891401 100644 --- a/compression/GZIPcompress.java +++ b/compression/GZIPcompress.java @@ -2,7 +2,7 @@ // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. -// {Args: GZIPcompress.java} +// {java GZIPcompress GZIPcompress.java} // {ValidateByHand} import java.util.zip.*; import java.io.*; diff --git a/compression/ZipCompress.java b/compression/ZipCompress.java index 267f0fc26..41dd4702a 100644 --- a/compression/ZipCompress.java +++ b/compression/ZipCompress.java @@ -4,7 +4,7 @@ // Visit http://mindviewinc.com/Books/OnJava/ for more book information. // Uses Zip compression to compress any // number of files given on the command line -// {Args: ZipCompress.java} +// {java ZipCompress ZipCompress.java} // {ValidateByHand} import java.util.zip.*; import java.io.*; diff --git a/enums/VendingMachine.java b/enums/VendingMachine.java index f52705554..d78fde2e3 100644 --- a/enums/VendingMachine.java +++ b/enums/VendingMachine.java @@ -2,7 +2,7 @@ // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. -// {Args: VendingMachineInput.txt} +// {java VendingMachine VendingMachineInput.txt} import java.util.*; import java.io.IOException; import java.util.function.*; diff --git a/innerclasses/GreenhouseController.java b/innerclasses/GreenhouseController.java index 5f1cd43ec..d3fbfddbf 100644 --- a/innerclasses/GreenhouseController.java +++ b/innerclasses/GreenhouseController.java @@ -3,7 +3,7 @@ // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. // Configure and execute the greenhouse system -// {Args: 5000} +// {java GreenhouseController 5000} import innerclasses.controller.*; public class GreenhouseController { diff --git a/logging/ConfigureLogging.java b/logging/ConfigureLogging.java index 654f2abb8..1e1f6bf30 100644 --- a/logging/ConfigureLogging.java +++ b/logging/ConfigureLogging.java @@ -2,7 +2,8 @@ // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. -// {JVMArgs: -Djava.util.logging.config.file=log.prop} +// {java ConfigureLogging +// -Djava.util.logging.config.file=log.prop} // {ErrorOutputExpected} import java.util.logging.*; diff --git a/newio/ChannelCopy.java b/newio/ChannelCopy.java index 9af679cc5..062633460 100644 --- a/newio/ChannelCopy.java +++ b/newio/ChannelCopy.java @@ -3,7 +3,7 @@ // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. // Copying a file using channels and buffers -// {Args: ChannelCopy.java test.txt} +// {java ChannelCopy ChannelCopy.java test.txt} import java.nio.*; import java.nio.channels.*; import java.io.*; diff --git a/newio/TransferTo.java b/newio/TransferTo.java index 786955c03..723acaab5 100644 --- a/newio/TransferTo.java +++ b/newio/TransferTo.java @@ -3,7 +3,7 @@ // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. // Using transferTo() between channels -// {Args: TransferTo.java TransferTo.txt} +// {java TransferTo TransferTo.java TransferTo.txt} import java.nio.channels.*; import java.io.*; diff --git a/strings/JGrep.java b/strings/JGrep.java index a0380d363..a0a04775d 100644 --- a/strings/JGrep.java +++ b/strings/JGrep.java @@ -3,7 +3,8 @@ // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. // A very simple version of the "grep" program -// {Args: WhitherStringBuilder.java 'return|for|String'} +// {java JGrep +// WhitherStringBuilder.java 'return|for|String'} import java.util.regex.*; import java.nio.file.*; import java.util.stream.*; diff --git a/strings/TestRegularExpression.java b/strings/TestRegularExpression.java index 1570cde26..2ae1aaadd 100644 --- a/strings/TestRegularExpression.java +++ b/strings/TestRegularExpression.java @@ -3,7 +3,8 @@ // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. // Simple regular expression demonstration -// {Args: abcabcabcdefabc "abc+" "(abc)+" } +// {java TestRegularExpression +// abcabcabcdefabc "abc+" "(abc)+" } import java.util.regex.*; public class TestRegularExpression { diff --git a/threads/BankTellerSimulation.java b/threads/BankTellerSimulation.java index 357290c86..fc272968c 100644 --- a/threads/BankTellerSimulation.java +++ b/threads/BankTellerSimulation.java @@ -3,7 +3,7 @@ // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. // Using queues and multithreading -// {Args: 5} +// {java BankTellerSimulation 5} import java.util.concurrent.*; import java.util.*; diff --git a/threads/DeadlockingDiningPhilosophers.java b/threads/DeadlockingDiningPhilosophers.java index bb713db77..53a4c38f6 100644 --- a/threads/DeadlockingDiningPhilosophers.java +++ b/threads/DeadlockingDiningPhilosophers.java @@ -3,7 +3,7 @@ // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. // Demonstrates how deadlock can be hidden in a program -// {Args: 0 5 timeout} +// {java DeadlockingDiningPhilosophers 0 5 timeout} import java.util.concurrent.*; public class DeadlockingDiningPhilosophers { diff --git a/threads/FixedDiningPhilosophers.java b/threads/FixedDiningPhilosophers.java index 96923e0ee..0bac9ed95 100644 --- a/threads/FixedDiningPhilosophers.java +++ b/threads/FixedDiningPhilosophers.java @@ -3,7 +3,7 @@ // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. // Dining philosophers without deadlock -// {Args: 5 5 timeout} +// {java FixedDiningPhilosophers 5 5 timeout} import java.util.concurrent.*; public class FixedDiningPhilosophers { diff --git a/threads/GreenhouseScheduler.java b/threads/GreenhouseScheduler.java index 9be4ea88d..4770fa8c1 100644 --- a/threads/GreenhouseScheduler.java +++ b/threads/GreenhouseScheduler.java @@ -4,7 +4,7 @@ // Visit http://mindviewinc.com/Books/OnJava/ for more book information. // Rewriting innerclasses/GreenhouseController.java // to use a ScheduledThreadPoolExecutor -// {Args: 5000} +// {java GreenhouseScheduler 5000} import java.util.concurrent.*; import java.util.*; diff --git a/threads/SerialNumberChecker.java b/threads/SerialNumberChecker.java index 76fe5e55d..dbe0b12f2 100644 --- a/threads/SerialNumberChecker.java +++ b/threads/SerialNumberChecker.java @@ -4,7 +4,7 @@ // Visit http://mindviewinc.com/Books/OnJava/ for more book information. // Operations that might seem safe are not, // when threads are present -// {Args: 4} +// {java SerialNumberChecker 4} import java.util.concurrent.*; // Reuses storage so we don't run out of memory: diff --git a/typeinfo/ShowMethods.java b/typeinfo/ShowMethods.java index bd99b43aa..ac9eb9f7f 100644 --- a/typeinfo/ShowMethods.java +++ b/typeinfo/ShowMethods.java @@ -4,7 +4,7 @@ // Visit http://mindviewinc.com/Books/OnJava/ for more book information. // Using reflection to show all the methods of a class, // even if the methods are defined in the base class -// {Args: ShowMethods} +// {java ShowMethods ShowMethods} import java.lang.reflect.*; import java.util.regex.*; From 0c45f7e1eb036b5be245b882ff1c118eeedc5236 Mon Sep 17 00:00:00 2001 From: Bruce Eckel Date: Thu, 28 Jul 2016 16:47:35 -0600 Subject: [PATCH 052/320] Changed exec to javap --- build.gradle | 8 ++++---- enums/NotClasses.java | 2 +- standardio/OSExecuteDemo.java | 2 +- threads/Atomicity.java | 2 +- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/build.gradle b/build.gradle index 932e62d97..1dd6b5668 100644 --- a/build.gradle +++ b/build.gradle @@ -14,7 +14,7 @@ class Tags { String javaCmd = null List args = [] List jVMArgs = [] - String exec = null + String javap = null String runFirst = null String outputLine = null private List lines @@ -41,7 +41,7 @@ class Tags { errorOutputExpected = hasTag('ErrorOutputExpected') validateByHand = hasTag('ValidateByHand') ignoreOutput = hasTag('IgnoreOutput') - exec = extract('Exec:') + javap = extract('javap') # Includes only arguments to command runFirst = extract('RunFirst:') lines.each { if(it =~ /\\/* Output:/) { @@ -77,7 +77,7 @@ class Tags { javaCmd || args || jVMArgs || - exec || + javap || runFirst } public String toString() { @@ -99,7 +99,7 @@ class Tags { javaCmd args jVMArgs - exec + javap runFirst """.split().each { str -> if(this[str]) diff --git a/enums/NotClasses.java b/enums/NotClasses.java index 801592212..810e6d052 100644 --- a/enums/NotClasses.java +++ b/enums/NotClasses.java @@ -2,7 +2,7 @@ // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. -// {Exec: javap -c LikeClasses} +// {javap -c LikeClasses} enum LikeClasses { WINKEN { diff --git a/standardio/OSExecuteDemo.java b/standardio/OSExecuteDemo.java index a9724f481..826a80889 100644 --- a/standardio/OSExecuteDemo.java +++ b/standardio/OSExecuteDemo.java @@ -3,7 +3,7 @@ // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. // Demonstrates standard I/O redirection -// {Exec: javap -cp build/classes/main OSExecuteDemo} +// {javap -cp build/classes/main OSExecuteDemo} import onjava.*; public class OSExecuteDemo {} diff --git a/threads/Atomicity.java b/threads/Atomicity.java index 96586503f..bfdce338c 100644 --- a/threads/Atomicity.java +++ b/threads/Atomicity.java @@ -2,7 +2,7 @@ // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. -// {Exec: javap -c Atomicity} +// {javap -c Atomicity} public class Atomicity { int i; From bc32de7c53bd65ef2b6c61cef818a3059ed9d763 Mon Sep 17 00:00:00 2001 From: Bruce Eckel Date: Thu, 28 Jul 2016 16:55:57 -0600 Subject: [PATCH 053/320] fixed wrong comment symbol --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 1dd6b5668..0abfcce98 100644 --- a/build.gradle +++ b/build.gradle @@ -41,7 +41,7 @@ class Tags { errorOutputExpected = hasTag('ErrorOutputExpected') validateByHand = hasTag('ValidateByHand') ignoreOutput = hasTag('IgnoreOutput') - javap = extract('javap') # Includes only arguments to command + javap = extract('javap') // Includes only arguments to command runFirst = extract('RunFirst:') lines.each { if(it =~ /\\/* Output:/) { From ce7b993052cf7d5a24d3d43aa8c132f38d09021b Mon Sep 17 00:00:00 2001 From: Bruce Eckel Date: Sat, 30 Jul 2016 10:05:07 -0600 Subject: [PATCH 054/320] TEMPORARILY IGNORE JAVAP FILES --- build.gradle | 3 +-- gg.bat | 1 + 2 files changed, 2 insertions(+), 2 deletions(-) create mode 100644 gg.bat diff --git a/build.gradle b/build.gradle index 0abfcce98..add96953a 100644 --- a/build.gradle +++ b/build.gradle @@ -1,5 +1,4 @@ import org.apache.tools.ant.util.TeeOutputStream -// TODO: test for tags that span multiple lines boolean debug = false class Tags { @@ -136,7 +135,7 @@ subprojects { Tags tags = new Tags(it.readLines()) if(debug && tags.hasTags()) println tags - + if(tags.javap) return // TEMPORARILY IGNORE JAVAP FILES UNTIL PROBLEM FIXED // Add tasks for java sources with main methods if ((tags.hasMainMethod || tags.javaCmd) && (!tags.compileTimeError)) { diff --git a/gg.bat b/gg.bat new file mode 100644 index 000000000..af92dd6e0 --- /dev/null +++ b/gg.bat @@ -0,0 +1 @@ +gradlew %* From 9961c7b71b2be61cf31e7067c837f675fb87d0eb Mon Sep 17 00:00:00 2001 From: Bruce Eckel Date: Sat, 30 Jul 2016 14:24:12 -0600 Subject: [PATCH 055/320] Updated to version 3 snapshot v 2.14.1 was acting flaky under windows, forcing me to reboot frequently. --- gradle/wrapper/gradle-wrapper.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 4341a60e5..d29761def 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-2.14.1-all.zip +distributionUrl=https\://services.gradle.org/distributions-snapshots/gradle-3.1-20160730000026+0000-bin.zip From 322f396fb20fe3be3e2b0e32a46dfa250bf9f4b4 Mon Sep 17 00:00:00 2001 From: Justin Ryan Date: Sun, 31 Jul 2016 02:25:33 -0700 Subject: [PATCH 056/320] Using block instead of individual lines Fix extract to identify more exactly on marker (i.e. not matching javap when looking for java) Generalize JavaExec task, so logic can be shared between java and javap tasks Added tools.jar to classpath Avoid using reserved variable name tasks. --- build.gradle | 141 +++++++++++++++++++++++++++++---------------------- 1 file changed, 79 insertions(+), 62 deletions(-) diff --git a/build.gradle b/build.gradle index 0abfcce98..124441262 100644 --- a/build.gradle +++ b/build.gradle @@ -1,6 +1,7 @@ +import org.gradle.internal.jvm.Jvm import org.apache.tools.ant.util.TeeOutputStream // TODO: test for tags that span multiple lines -boolean debug = false +boolean debug = false class Tags { Boolean hasMainMethod = false @@ -17,13 +18,12 @@ class Tags { String javap = null String runFirst = null String outputLine = null - private List lines private String block - def Tags(List lines) { - this.lines = lines - block = lines.join('') + def Tags(File file) { + block = file.text hasMainMethod = block.contains('main(String[] args)') - fileRoot = lines[0].split("/")[-1] - ".java" + def firstLine = block.substring(0, block.indexOf("\n")) + fileRoot = firstLine.split("/")[-1] - ".java" mainClass = fileRoot javaCmd = extract('java') if(javaCmd) { @@ -43,27 +43,30 @@ class Tags { ignoreOutput = hasTag('IgnoreOutput') javap = extract('javap') // Includes only arguments to command runFirst = extract('RunFirst:') - lines.each { - if(it =~ /\\/* Output:/) { - outputLine = it.trim() - } - } + outputLine = extractOutputLine() } private def hasTag(String marker) { return block.contains("// {" + marker + "}") } + + def extractOutputLine() { + if (!block.contains("/* Output:")) { + return null + } else { + return "/* Output:" + } + } + private def extract(String marker) { - if(!block.contains("// {" + marker)) + // Assume some whitespace is after marker + if(!block.contains("// {${marker} ")) return null - def re = "\\/\\/ \\{" + marker + /[^}]+}/ - def tagline = block =~ re - if(tagline.getCount()) { - def rtrim = tagline[0].reverse().dropWhile{ it != '}'}.reverse()[0..-2] - def ltrim = rtrim - ("// {" + marker) - ltrim = ltrim.replaceAll("//", " ") - return ltrim.trim() + def matcher = (block =~ /\/\/ \{${marker}\s+([^}]+)/) + if (matcher) { + def matched = matcher[0][1].trim() + return matched.replaceAll("\n?//", "") } else { - println "Searching for: " + re + println "Searching for: " + matcher println block System.exit(1) } @@ -82,11 +85,10 @@ class Tags { } public String toString() { String result = "" - for(ln in lines) + block.eachLine{ ln -> if(ln.startsWith("//") || ln.startsWith("package ")) result += ln + "\n" - else - break + } """ hasMainMethod compileTimeError @@ -129,57 +131,72 @@ subprojects { } } - List tasks = [] + List createdTasks = [] - projectDir.eachFileRecurse { - if (it.name.endsWith('.java')) { + projectDir.eachFileRecurse { file -> + if (file.name.endsWith('.java')) { - Tags tags = new Tags(it.readLines()) + Tags tags = new Tags(file) if(debug && tags.hasTags()) println tags - // Add tasks for java sources with main methods - if ((tags.hasMainMethod || tags.javaCmd) && (!tags.compileTimeError)) { - - if (!tags.validateByHand) { - // Only add tasks that we know we can run successfully to the task list - tasks.add(tags.fileRoot) + // Exclude java sources that will not compile + if (tags.compileTimeError) { + sourceSets.main.java.excludes.add(it.name) + } else { + JavaExec javaTask = null + // Add tasks for java sources with main methods + if (tags.hasMainMethod || tags.javaCmd) { + + javaTask = tasks.create(name: tags.fileRoot, type: JavaExec, dependsOn: tags.runFirst) { + main = tags.mainClass + classpath = sourceSets.main.runtimeClasspath + args = tags.args + jvmArgs = tags.jVMArgs + } + } else if (tags.javap) { + // Create task for running javap + javaTask = tasks.create(name: "${tags.fileRoot}", type: JavaExec, dependsOn: tags.runFirst) { + main = "com.sun.tools.javap.Main" + classpath = sourceSets.main.runtimeClasspath + files(Jvm.current().toolsJar) + // Assuming javap represents all the args and there's no need to jVMArgs + args tags.javap.split() + } } - String basePath = it.absolutePath.replaceAll('\\.java', '') - File outFile = new File(basePath + '.out') - File errFile = new File(basePath + '.err') - - task "$tags.fileRoot"(type: JavaExec, dependsOn: tags.runFirst) { - main = tags.mainClass - classpath = sourceSets.main.runtimeClasspath - args = tags.args - jvmArgs = tags.jVMArgs - ignoreExitValue = tags.validateByHand || tags.throwsException - doFirst { - if(outFile.exists()) - outFile.delete() - if(tags.outputLine) - outFile << tags.outputLine + "\n" - - standardOutput = new TeeOutputStream(new FileOutputStream(outFile, true), System.out) - errorOutput = new TeeOutputStream(new FileOutputStream(errFile), System.err) + if (javaTask) { + def baseName = file.name.substring(0, file.name.lastIndexOf('.')) + File outFile = new File(file.parentFile, baseName + '.out') + File errFile = new File(file.parentFile, baseName + '.err') + + javaTask.configure { + ignoreExitValue = tags.validateByHand || tags.throwsException + doFirst { + if(outFile.exists()) + outFile.delete() + if(tags.outputLine) + outFile << tags.outputLine + "\n" + + standardOutput = new TeeOutputStream(new FileOutputStream(outFile, true), System.out) + errorOutput = new TeeOutputStream(new FileOutputStream(errFile), System.err) + } + doLast { + if(outFile.size() == 0) + outFile.delete() + else if(!outFile.text.contains("/* Output:")) + outFile.delete() + if(errFile.size() == 0) errFile.delete() + } } - doLast { - if(outFile.size() == 0) - outFile.delete() - else if(!outFile.text.contains("/* Output:")) - outFile.delete() - if(errFile.size() == 0) errFile.delete() + + if (!tags.validateByHand) { + // Only add tasks that we know we can run successfully to the task list + createdTasks.add(javaTask) } } } - // Exclude java sources that will not compile - if (tags.compileTimeError) { - sourceSets.main.java.excludes.add(it.name) - } } } - task run(dependsOn: tasks) + task run(dependsOn: createdTasks) } configure(subprojects - project(':onjava')) { From bfb9929fbd959c6d87ecaa0aa19160a34f0f6491 Mon Sep 17 00:00:00 2001 From: Justin Ryan Date: Sun, 31 Jul 2016 10:21:28 -0700 Subject: [PATCH 057/320] Fix reference to file, instead of it. --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index e3b386dff..9c6c8475a 100644 --- a/build.gradle +++ b/build.gradle @@ -140,7 +140,7 @@ subprojects { // Exclude java sources that will not compile if (tags.compileTimeError) { - sourceSets.main.java.excludes.add(it.name) + sourceSets.main.java.excludes.add(file.name) } else { JavaExec javaTask = null // Add tasks for java sources with main methods From e14f9174fe96d7a89a2e7f3b4d81e1e236ac70a9 Mon Sep 17 00:00:00 2001 From: Justin Ryan Date: Sun, 31 Jul 2016 18:11:25 -0700 Subject: [PATCH 058/320] Use a regex to capture the whole Output line --- build.gradle | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/build.gradle b/build.gradle index 9c6c8475a..d6bc74e0f 100644 --- a/build.gradle +++ b/build.gradle @@ -49,10 +49,11 @@ class Tags { } def extractOutputLine() { - if (!block.contains("/* Output:")) { - return null + def matcher = (block =~ /(?m)^(\/\* Output:.*)$/) + if (matcher) { + return matcher[0][1] } else { - return "/* Output:" + return null } } From 3f0d825723d25a1203f39108a5329c09d9396535 Mon Sep 17 00:00:00 2001 From: Justin Ryan Date: Mon, 1 Aug 2016 23:05:22 -0700 Subject: [PATCH 059/320] Remove ^M from fileroot --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index d6bc74e0f..aaccc5da9 100644 --- a/build.gradle +++ b/build.gradle @@ -22,7 +22,7 @@ class Tags { block = file.text hasMainMethod = block.contains('main(String[] args)') def firstLine = block.substring(0, block.indexOf("\n")) - fileRoot = firstLine.split("/")[-1] - ".java" + fileRoot = (firstLine.split("/")[-1] - ".java").trim() // Remove \r if it exists mainClass = fileRoot javaCmd = extract('java') if(javaCmd) { From 6e1cf33f9407d936340403555f9d9d659a3ee1d8 Mon Sep 17 00:00:00 2001 From: Bruce Eckel Date: Tue, 2 Aug 2016 09:12:22 -0600 Subject: [PATCH 060/320] Fix verify as per James --- build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/build.gradle b/build.gradle index aaccc5da9..2001d544c 100644 --- a/build.gradle +++ b/build.gradle @@ -1,6 +1,6 @@ import org.gradle.internal.jvm.Jvm import org.apache.tools.ant.util.TeeOutputStream -boolean debug = false +boolean debug = false class Tags { Boolean hasMainMethod = false @@ -205,7 +205,7 @@ configure(subprojects - project(':onjava')) { } } -task verify(type:Exec) { +task verify(type:Exec) << { println("execute 'gradlew run' first") commandLine 'python', 'verify_output.py' } From 61d9e213172d36553f95cb35b5c898a5ce18fa23 Mon Sep 17 00:00:00 2001 From: Bruce Eckel Date: Tue, 2 Aug 2016 11:00:06 -0600 Subject: [PATCH 061/320] Updated as per Justin's explanation --- build.gradle | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/build.gradle b/build.gradle index 2001d544c..44780f016 100644 --- a/build.gradle +++ b/build.gradle @@ -205,7 +205,9 @@ configure(subprojects - project(':onjava')) { } } -task verify(type:Exec) << { - println("execute 'gradlew run' first") +task verify(type:Exec) { commandLine 'python', 'verify_output.py' + doFirst { + println("execute 'gradlew run' first") + } } From 6ba51b055ca3e142e751c5bc6512badc8bc5ec3c Mon Sep 17 00:00:00 2001 From: Bruce Eckel Date: Tue, 2 Aug 2016 11:52:46 -0600 Subject: [PATCH 062/320] Change chapter title --- exceptions/TryAnything.java | 2 +- functional/Closure3.java | 2 +- functional/Closure5.java | 2 +- functional/Closure7.java | 2 +- functional/Closure9.java | 2 +- generics/Erased.java | 2 +- generics/HijackedInterface.java | 2 +- generics/MultipleInterfaceVariants.java | 2 +- generics/NonCovariantGenerics.java | 2 +- housekeeping/OverloadingVarargs2.java | 2 +- interfaces/AttemptToUseBasic.java | 2 +- polymorphism/PrivateOverride2.java | 2 +- reuse/Lisa.java | 2 +- .../AssociativeArray.java | 2 +- {collectionsindepth => understandingcollections}/Bits.java | 2 +- .../CanonicalMapping.java | 2 +- .../CollectionMethods.java | 2 +- .../CountedString.java | 2 +- .../Enumerations.java | 2 +- .../FailFast.java | 2 +- .../FillMapTest.java | 2 +- .../FillingLists.java | 4 ++-- .../Groundhog.java | 2 +- .../Groundhog2.java | 2 +- .../IndividualTest.java | 2 +- .../LinkedHashMapDemo.java | 2 +- .../ListPerformance.java | 2 +- .../ListSortSearch.java | 2 +- {collectionsindepth => understandingcollections}/Lists.java | 2 +- .../MapEntry.java | 2 +- .../MapPerformance.java | 2 +- {collectionsindepth => understandingcollections}/Maps.java | 2 +- .../Prediction.java | 2 +- .../QueueBehavior.java | 2 +- .../RandomBounds.java | 2 +- .../ReadOnly.java | 2 +- .../References.java | 2 +- .../SetPerformance.java | 2 +- .../SimpleDeques.java | 2 +- .../SimpleHashMap.java | 2 +- {collectionsindepth => understandingcollections}/SlowMap.java | 2 +- .../SortedMapDemo.java | 2 +- .../SortedSetDemo.java | 2 +- .../SpringDetector.java | 2 +- .../SpringDetector2.java | 2 +- {collectionsindepth => understandingcollections}/Stacks.java | 2 +- .../StreamFillMaps.java | 2 +- .../StringHashCode.java | 2 +- .../SuppliersCollectionTest.java | 2 +- .../Synchronization.java | 2 +- {collectionsindepth => understandingcollections}/Test.java | 2 +- .../TestParam.java | 2 +- {collectionsindepth => understandingcollections}/Tester.java | 2 +- .../ToDoList.java | 2 +- .../TypesForSets.java | 2 +- .../Unsupported.java | 2 +- .../Utilities.java | 2 +- {collectionsindepth => understandingcollections}/build.gradle | 0 58 files changed, 58 insertions(+), 58 deletions(-) rename {collectionsindepth => understandingcollections}/AssociativeArray.java (97%) rename {collectionsindepth => understandingcollections}/Bits.java (98%) rename {collectionsindepth => understandingcollections}/CanonicalMapping.java (96%) rename {collectionsindepth => understandingcollections}/CollectionMethods.java (98%) rename {collectionsindepth => understandingcollections}/CountedString.java (97%) rename {collectionsindepth => understandingcollections}/Enumerations.java (94%) rename {collectionsindepth => understandingcollections}/FailFast.java (93%) rename {collectionsindepth => understandingcollections}/FillMapTest.java (95%) rename {collectionsindepth => understandingcollections}/FillingLists.java (89%) rename {collectionsindepth => understandingcollections}/Groundhog.java (90%) rename {collectionsindepth => understandingcollections}/Groundhog2.java (92%) rename {collectionsindepth => understandingcollections}/IndividualTest.java (93%) rename {collectionsindepth => understandingcollections}/LinkedHashMapDemo.java (95%) rename {collectionsindepth => understandingcollections}/ListPerformance.java (99%) rename {collectionsindepth => understandingcollections}/ListSortSearch.java (97%) rename {collectionsindepth => understandingcollections}/Lists.java (99%) rename {collectionsindepth => understandingcollections}/MapEntry.java (96%) rename {collectionsindepth => understandingcollections}/MapPerformance.java (98%) rename {collectionsindepth => understandingcollections}/Maps.java (98%) rename {collectionsindepth => understandingcollections}/Prediction.java (92%) rename {collectionsindepth => understandingcollections}/QueueBehavior.java (96%) rename {collectionsindepth => understandingcollections}/RandomBounds.java (95%) rename {collectionsindepth => understandingcollections}/ReadOnly.java (97%) rename {collectionsindepth => understandingcollections}/References.java (98%) rename {collectionsindepth => understandingcollections}/SetPerformance.java (97%) rename {collectionsindepth => understandingcollections}/SimpleDeques.java (97%) rename {collectionsindepth => understandingcollections}/SimpleHashMap.java (98%) rename {collectionsindepth => understandingcollections}/SlowMap.java (97%) rename {collectionsindepth => understandingcollections}/SortedMapDemo.java (96%) rename {collectionsindepth => understandingcollections}/SortedSetDemo.java (96%) rename {collectionsindepth => understandingcollections}/SpringDetector.java (96%) rename {collectionsindepth => understandingcollections}/SpringDetector2.java (93%) rename {collectionsindepth => understandingcollections}/Stacks.java (98%) rename {collectionsindepth => understandingcollections}/StreamFillMaps.java (96%) rename {collectionsindepth => understandingcollections}/StringHashCode.java (90%) rename {collectionsindepth => understandingcollections}/SuppliersCollectionTest.java (97%) rename {collectionsindepth => understandingcollections}/Synchronization.java (94%) rename {collectionsindepth => understandingcollections}/Test.java (92%) rename {collectionsindepth => understandingcollections}/TestParam.java (95%) rename {collectionsindepth => understandingcollections}/Tester.java (98%) rename {collectionsindepth => understandingcollections}/ToDoList.java (97%) rename {collectionsindepth => understandingcollections}/TypesForSets.java (98%) rename {collectionsindepth => understandingcollections}/Unsupported.java (98%) rename {collectionsindepth => understandingcollections}/Utilities.java (98%) rename {collectionsindepth => understandingcollections}/build.gradle (100%) diff --git a/exceptions/TryAnything.java b/exceptions/TryAnything.java index 92656a698..6ccf9b554 100644 --- a/exceptions/TryAnything.java +++ b/exceptions/TryAnything.java @@ -2,7 +2,7 @@ // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. -// {CompileTimeError} (Won't compile) +// {CompileTimeError} (Will not compile) class Anything {} diff --git a/functional/Closure3.java b/functional/Closure3.java index 0a90848e6..7700838ba 100644 --- a/functional/Closure3.java +++ b/functional/Closure3.java @@ -2,7 +2,7 @@ // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. -// {CompileTimeError} (Won't compile) +// {CompileTimeError} (Will not compile) import java.util.function.*; public class Closure3 { diff --git a/functional/Closure5.java b/functional/Closure5.java index f0da51852..d16d1e3c7 100644 --- a/functional/Closure5.java +++ b/functional/Closure5.java @@ -2,7 +2,7 @@ // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. -// {CompileTimeError} (Won't compile) +// {CompileTimeError} (Will not compile) import java.util.function.*; public class Closure5 { diff --git a/functional/Closure7.java b/functional/Closure7.java index c9e514c57..e0036ece0 100644 --- a/functional/Closure7.java +++ b/functional/Closure7.java @@ -2,7 +2,7 @@ // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. -// {CompileTimeError} (Won't compile) +// {CompileTimeError} (Will not compile) import java.util.function.*; public class Closure7 { diff --git a/functional/Closure9.java b/functional/Closure9.java index 0201321e6..391f042fb 100644 --- a/functional/Closure9.java +++ b/functional/Closure9.java @@ -2,7 +2,7 @@ // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. -// {CompileTimeError} (Won't compile) +// {CompileTimeError} (Will not compile) import java.util.*; import java.util.function.*; diff --git a/generics/Erased.java b/generics/Erased.java index ff0976632..12fa95fc0 100644 --- a/generics/Erased.java +++ b/generics/Erased.java @@ -2,7 +2,7 @@ // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. -// {CompileTimeError} (Won't compile) +// {CompileTimeError} (Will not compile) public class Erased { private final int SIZE = 100; diff --git a/generics/HijackedInterface.java b/generics/HijackedInterface.java index 843694fa6..305c08e7c 100644 --- a/generics/HijackedInterface.java +++ b/generics/HijackedInterface.java @@ -2,7 +2,7 @@ // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. -// {CompileTimeError} (Won't compile) +// {CompileTimeError} (Will not compile) class Cat extends ComparablePet implements Comparable{ diff --git a/generics/MultipleInterfaceVariants.java b/generics/MultipleInterfaceVariants.java index e65baefd9..035c79566 100644 --- a/generics/MultipleInterfaceVariants.java +++ b/generics/MultipleInterfaceVariants.java @@ -2,7 +2,7 @@ // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. -// {CompileTimeError} (Won't compile) +// {CompileTimeError} (Will not compile) interface Payable {} diff --git a/generics/NonCovariantGenerics.java b/generics/NonCovariantGenerics.java index a79223ee4..e5b656f73 100644 --- a/generics/NonCovariantGenerics.java +++ b/generics/NonCovariantGenerics.java @@ -2,7 +2,7 @@ // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. -// {CompileTimeError} (Won't compile) +// {CompileTimeError} (Will not compile) import java.util.*; public class NonCovariantGenerics { diff --git a/housekeeping/OverloadingVarargs2.java b/housekeeping/OverloadingVarargs2.java index 00fa37aae..9b4c4ef6e 100644 --- a/housekeeping/OverloadingVarargs2.java +++ b/housekeeping/OverloadingVarargs2.java @@ -2,7 +2,7 @@ // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. -// {CompileTimeError} (Won't compile) +// {CompileTimeError} (Will not compile) public class OverloadingVarargs2 { static void f(float i, Character... args) { diff --git a/interfaces/AttemptToUseBasic.java b/interfaces/AttemptToUseBasic.java index ab1decf9a..07a23cd6c 100644 --- a/interfaces/AttemptToUseBasic.java +++ b/interfaces/AttemptToUseBasic.java @@ -2,7 +2,7 @@ // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. -// {CompileTimeError} (Won't compile) +// {CompileTimeError} (Will not compile) public class AttemptToUseBasic { Basic b = new Basic(); diff --git a/polymorphism/PrivateOverride2.java b/polymorphism/PrivateOverride2.java index a3d31fe08..e886f9489 100644 --- a/polymorphism/PrivateOverride2.java +++ b/polymorphism/PrivateOverride2.java @@ -3,7 +3,7 @@ // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. // Detecting a mistaken override using @Override -// {CompileTimeError} (Won't compile) +// {CompileTimeError} (Will not compile) package polymorphism; public class PrivateOverride2 { diff --git a/reuse/Lisa.java b/reuse/Lisa.java index e1301d19f..92201a89b 100644 --- a/reuse/Lisa.java +++ b/reuse/Lisa.java @@ -2,7 +2,7 @@ // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. -// {CompileTimeError} (Won't compile) +// {CompileTimeError} (Will not compile) class Lisa extends Homer { @Override void doh(Milhouse m) { diff --git a/collectionsindepth/AssociativeArray.java b/understandingcollections/AssociativeArray.java similarity index 97% rename from collectionsindepth/AssociativeArray.java rename to understandingcollections/AssociativeArray.java index cbc7448bd..0801dbe73 100644 --- a/collectionsindepth/AssociativeArray.java +++ b/understandingcollections/AssociativeArray.java @@ -1,4 +1,4 @@ -// collectionsindepth/AssociativeArray.java +// understandingcollections/AssociativeArray.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. diff --git a/collectionsindepth/Bits.java b/understandingcollections/Bits.java similarity index 98% rename from collectionsindepth/Bits.java rename to understandingcollections/Bits.java index 6e85e60ea..edcc6d3f8 100644 --- a/collectionsindepth/Bits.java +++ b/understandingcollections/Bits.java @@ -1,4 +1,4 @@ -// collectionsindepth/Bits.java +// understandingcollections/Bits.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. diff --git a/collectionsindepth/CanonicalMapping.java b/understandingcollections/CanonicalMapping.java similarity index 96% rename from collectionsindepth/CanonicalMapping.java rename to understandingcollections/CanonicalMapping.java index a1b241ac5..3d2b0158f 100644 --- a/collectionsindepth/CanonicalMapping.java +++ b/understandingcollections/CanonicalMapping.java @@ -1,4 +1,4 @@ -// collectionsindepth/CanonicalMapping.java +// understandingcollections/CanonicalMapping.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. diff --git a/collectionsindepth/CollectionMethods.java b/understandingcollections/CollectionMethods.java similarity index 98% rename from collectionsindepth/CollectionMethods.java rename to understandingcollections/CollectionMethods.java index a25e43585..c8f97f443 100644 --- a/collectionsindepth/CollectionMethods.java +++ b/understandingcollections/CollectionMethods.java @@ -1,4 +1,4 @@ -// collectionsindepth/CollectionMethods.java +// understandingcollections/CollectionMethods.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. diff --git a/collectionsindepth/CountedString.java b/understandingcollections/CountedString.java similarity index 97% rename from collectionsindepth/CountedString.java rename to understandingcollections/CountedString.java index 8c1bb480e..5c58d6e80 100644 --- a/collectionsindepth/CountedString.java +++ b/understandingcollections/CountedString.java @@ -1,4 +1,4 @@ -// collectionsindepth/CountedString.java +// understandingcollections/CountedString.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. diff --git a/collectionsindepth/Enumerations.java b/understandingcollections/Enumerations.java similarity index 94% rename from collectionsindepth/Enumerations.java rename to understandingcollections/Enumerations.java index 531ae0a42..d87328218 100644 --- a/collectionsindepth/Enumerations.java +++ b/understandingcollections/Enumerations.java @@ -1,4 +1,4 @@ -// collectionsindepth/Enumerations.java +// understandingcollections/Enumerations.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. diff --git a/collectionsindepth/FailFast.java b/understandingcollections/FailFast.java similarity index 93% rename from collectionsindepth/FailFast.java rename to understandingcollections/FailFast.java index 60a4244ce..94def8c77 100644 --- a/collectionsindepth/FailFast.java +++ b/understandingcollections/FailFast.java @@ -1,4 +1,4 @@ -// collectionsindepth/FailFast.java +// understandingcollections/FailFast.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. diff --git a/collectionsindepth/FillMapTest.java b/understandingcollections/FillMapTest.java similarity index 95% rename from collectionsindepth/FillMapTest.java rename to understandingcollections/FillMapTest.java index f44181534..cc964c9d4 100644 --- a/collectionsindepth/FillMapTest.java +++ b/understandingcollections/FillMapTest.java @@ -1,4 +1,4 @@ -// collectionsindepth/FillMapTest.java +// understandingcollections/FillMapTest.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. diff --git a/collectionsindepth/FillingLists.java b/understandingcollections/FillingLists.java similarity index 89% rename from collectionsindepth/FillingLists.java rename to understandingcollections/FillingLists.java index b4c4640bc..c310f900b 100644 --- a/collectionsindepth/FillingLists.java +++ b/understandingcollections/FillingLists.java @@ -1,8 +1,8 @@ -// collectionsindepth/FillingLists.java +// understandingcollections/FillingLists.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. -// The Collections.fill() & Collections.nCopies() methods +// The Collections.fill() + Collections.nCopies() methods import java.util.*; class StringAddress { diff --git a/collectionsindepth/Groundhog.java b/understandingcollections/Groundhog.java similarity index 90% rename from collectionsindepth/Groundhog.java rename to understandingcollections/Groundhog.java index 2b0f5a4cb..d7bc30f0a 100644 --- a/collectionsindepth/Groundhog.java +++ b/understandingcollections/Groundhog.java @@ -1,4 +1,4 @@ -// collectionsindepth/Groundhog.java +// understandingcollections/Groundhog.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. diff --git a/collectionsindepth/Groundhog2.java b/understandingcollections/Groundhog2.java similarity index 92% rename from collectionsindepth/Groundhog2.java rename to understandingcollections/Groundhog2.java index 256e0768e..2be094c2c 100644 --- a/collectionsindepth/Groundhog2.java +++ b/understandingcollections/Groundhog2.java @@ -1,4 +1,4 @@ -// collectionsindepth/Groundhog2.java +// understandingcollections/Groundhog2.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. diff --git a/collectionsindepth/IndividualTest.java b/understandingcollections/IndividualTest.java similarity index 93% rename from collectionsindepth/IndividualTest.java rename to understandingcollections/IndividualTest.java index 972fdcc97..704233d8e 100644 --- a/collectionsindepth/IndividualTest.java +++ b/understandingcollections/IndividualTest.java @@ -1,4 +1,4 @@ -// collectionsindepth/IndividualTest.java +// understandingcollections/IndividualTest.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. diff --git a/collectionsindepth/LinkedHashMapDemo.java b/understandingcollections/LinkedHashMapDemo.java similarity index 95% rename from collectionsindepth/LinkedHashMapDemo.java rename to understandingcollections/LinkedHashMapDemo.java index 0c886e054..46a4e6a9f 100644 --- a/collectionsindepth/LinkedHashMapDemo.java +++ b/understandingcollections/LinkedHashMapDemo.java @@ -1,4 +1,4 @@ -// collectionsindepth/LinkedHashMapDemo.java +// understandingcollections/LinkedHashMapDemo.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. diff --git a/collectionsindepth/ListPerformance.java b/understandingcollections/ListPerformance.java similarity index 99% rename from collectionsindepth/ListPerformance.java rename to understandingcollections/ListPerformance.java index 1459f5fa5..2c0b1f99d 100644 --- a/collectionsindepth/ListPerformance.java +++ b/understandingcollections/ListPerformance.java @@ -1,4 +1,4 @@ -// collectionsindepth/ListPerformance.java +// understandingcollections/ListPerformance.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. diff --git a/collectionsindepth/ListSortSearch.java b/understandingcollections/ListSortSearch.java similarity index 97% rename from collectionsindepth/ListSortSearch.java rename to understandingcollections/ListSortSearch.java index 5811de417..2beb14cbd 100644 --- a/collectionsindepth/ListSortSearch.java +++ b/understandingcollections/ListSortSearch.java @@ -1,4 +1,4 @@ -// collectionsindepth/ListSortSearch.java +// understandingcollections/ListSortSearch.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. diff --git a/collectionsindepth/Lists.java b/understandingcollections/Lists.java similarity index 99% rename from collectionsindepth/Lists.java rename to understandingcollections/Lists.java index ecd55649b..d7ffe5a9c 100644 --- a/collectionsindepth/Lists.java +++ b/understandingcollections/Lists.java @@ -1,4 +1,4 @@ -// collectionsindepth/Lists.java +// understandingcollections/Lists.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. diff --git a/collectionsindepth/MapEntry.java b/understandingcollections/MapEntry.java similarity index 96% rename from collectionsindepth/MapEntry.java rename to understandingcollections/MapEntry.java index c14712c7e..0f87f129f 100644 --- a/collectionsindepth/MapEntry.java +++ b/understandingcollections/MapEntry.java @@ -1,4 +1,4 @@ -// collectionsindepth/MapEntry.java +// understandingcollections/MapEntry.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. diff --git a/collectionsindepth/MapPerformance.java b/understandingcollections/MapPerformance.java similarity index 98% rename from collectionsindepth/MapPerformance.java rename to understandingcollections/MapPerformance.java index 6105f92ce..1a0b108d9 100644 --- a/collectionsindepth/MapPerformance.java +++ b/understandingcollections/MapPerformance.java @@ -1,4 +1,4 @@ -// collectionsindepth/MapPerformance.java +// understandingcollections/MapPerformance.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. diff --git a/collectionsindepth/Maps.java b/understandingcollections/Maps.java similarity index 98% rename from collectionsindepth/Maps.java rename to understandingcollections/Maps.java index a78c38bac..005a609ec 100644 --- a/collectionsindepth/Maps.java +++ b/understandingcollections/Maps.java @@ -1,4 +1,4 @@ -// collectionsindepth/Maps.java +// understandingcollections/Maps.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. diff --git a/collectionsindepth/Prediction.java b/understandingcollections/Prediction.java similarity index 92% rename from collectionsindepth/Prediction.java rename to understandingcollections/Prediction.java index 4cbb27f66..76579d485 100644 --- a/collectionsindepth/Prediction.java +++ b/understandingcollections/Prediction.java @@ -1,4 +1,4 @@ -// collectionsindepth/Prediction.java +// understandingcollections/Prediction.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. diff --git a/collectionsindepth/QueueBehavior.java b/understandingcollections/QueueBehavior.java similarity index 96% rename from collectionsindepth/QueueBehavior.java rename to understandingcollections/QueueBehavior.java index 63ebffffa..7179aa4a8 100644 --- a/collectionsindepth/QueueBehavior.java +++ b/understandingcollections/QueueBehavior.java @@ -1,4 +1,4 @@ -// collectionsindepth/QueueBehavior.java +// understandingcollections/QueueBehavior.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. diff --git a/collectionsindepth/RandomBounds.java b/understandingcollections/RandomBounds.java similarity index 95% rename from collectionsindepth/RandomBounds.java rename to understandingcollections/RandomBounds.java index fee3b6097..b464854d7 100644 --- a/collectionsindepth/RandomBounds.java +++ b/understandingcollections/RandomBounds.java @@ -1,4 +1,4 @@ -// collectionsindepth/RandomBounds.java +// understandingcollections/RandomBounds.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. diff --git a/collectionsindepth/ReadOnly.java b/understandingcollections/ReadOnly.java similarity index 97% rename from collectionsindepth/ReadOnly.java rename to understandingcollections/ReadOnly.java index d8fc78511..74c78746b 100644 --- a/collectionsindepth/ReadOnly.java +++ b/understandingcollections/ReadOnly.java @@ -1,4 +1,4 @@ -// collectionsindepth/ReadOnly.java +// understandingcollections/ReadOnly.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. diff --git a/collectionsindepth/References.java b/understandingcollections/References.java similarity index 98% rename from collectionsindepth/References.java rename to understandingcollections/References.java index 37610b04c..6cef4538e 100644 --- a/collectionsindepth/References.java +++ b/understandingcollections/References.java @@ -1,4 +1,4 @@ -// collectionsindepth/References.java +// understandingcollections/References.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. diff --git a/collectionsindepth/SetPerformance.java b/understandingcollections/SetPerformance.java similarity index 97% rename from collectionsindepth/SetPerformance.java rename to understandingcollections/SetPerformance.java index add404f9a..d354a97b6 100644 --- a/collectionsindepth/SetPerformance.java +++ b/understandingcollections/SetPerformance.java @@ -1,4 +1,4 @@ -// collectionsindepth/SetPerformance.java +// understandingcollections/SetPerformance.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. diff --git a/collectionsindepth/SimpleDeques.java b/understandingcollections/SimpleDeques.java similarity index 97% rename from collectionsindepth/SimpleDeques.java rename to understandingcollections/SimpleDeques.java index 3ac961dcd..7474a4096 100644 --- a/collectionsindepth/SimpleDeques.java +++ b/understandingcollections/SimpleDeques.java @@ -1,4 +1,4 @@ -// collectionsindepth/SimpleDeques.java +// understandingcollections/SimpleDeques.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. diff --git a/collectionsindepth/SimpleHashMap.java b/understandingcollections/SimpleHashMap.java similarity index 98% rename from collectionsindepth/SimpleHashMap.java rename to understandingcollections/SimpleHashMap.java index f1c5b3311..5878e411c 100644 --- a/collectionsindepth/SimpleHashMap.java +++ b/understandingcollections/SimpleHashMap.java @@ -1,4 +1,4 @@ -// collectionsindepth/SimpleHashMap.java +// understandingcollections/SimpleHashMap.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. diff --git a/collectionsindepth/SlowMap.java b/understandingcollections/SlowMap.java similarity index 97% rename from collectionsindepth/SlowMap.java rename to understandingcollections/SlowMap.java index e80d14a0f..d8978dd9f 100644 --- a/collectionsindepth/SlowMap.java +++ b/understandingcollections/SlowMap.java @@ -1,4 +1,4 @@ -// collectionsindepth/SlowMap.java +// understandingcollections/SlowMap.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. diff --git a/collectionsindepth/SortedMapDemo.java b/understandingcollections/SortedMapDemo.java similarity index 96% rename from collectionsindepth/SortedMapDemo.java rename to understandingcollections/SortedMapDemo.java index 9635fccea..9b6161b6b 100644 --- a/collectionsindepth/SortedMapDemo.java +++ b/understandingcollections/SortedMapDemo.java @@ -1,4 +1,4 @@ -// collectionsindepth/SortedMapDemo.java +// understandingcollections/SortedMapDemo.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. diff --git a/collectionsindepth/SortedSetDemo.java b/understandingcollections/SortedSetDemo.java similarity index 96% rename from collectionsindepth/SortedSetDemo.java rename to understandingcollections/SortedSetDemo.java index 6dad6425f..5a7a6c742 100644 --- a/collectionsindepth/SortedSetDemo.java +++ b/understandingcollections/SortedSetDemo.java @@ -1,4 +1,4 @@ -// collectionsindepth/SortedSetDemo.java +// understandingcollections/SortedSetDemo.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. diff --git a/collectionsindepth/SpringDetector.java b/understandingcollections/SpringDetector.java similarity index 96% rename from collectionsindepth/SpringDetector.java rename to understandingcollections/SpringDetector.java index 7a4aaa8b4..fc941dd50 100644 --- a/collectionsindepth/SpringDetector.java +++ b/understandingcollections/SpringDetector.java @@ -1,4 +1,4 @@ -// collectionsindepth/SpringDetector.java +// understandingcollections/SpringDetector.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. diff --git a/collectionsindepth/SpringDetector2.java b/understandingcollections/SpringDetector2.java similarity index 93% rename from collectionsindepth/SpringDetector2.java rename to understandingcollections/SpringDetector2.java index 830159bf5..0f6a026f4 100644 --- a/collectionsindepth/SpringDetector2.java +++ b/understandingcollections/SpringDetector2.java @@ -1,4 +1,4 @@ -// collectionsindepth/SpringDetector2.java +// understandingcollections/SpringDetector2.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. diff --git a/collectionsindepth/Stacks.java b/understandingcollections/Stacks.java similarity index 98% rename from collectionsindepth/Stacks.java rename to understandingcollections/Stacks.java index 2f857dd1c..ca122c602 100644 --- a/collectionsindepth/Stacks.java +++ b/understandingcollections/Stacks.java @@ -1,4 +1,4 @@ -// collectionsindepth/Stacks.java +// understandingcollections/Stacks.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. diff --git a/collectionsindepth/StreamFillMaps.java b/understandingcollections/StreamFillMaps.java similarity index 96% rename from collectionsindepth/StreamFillMaps.java rename to understandingcollections/StreamFillMaps.java index 0b2c56d23..db09800dd 100644 --- a/collectionsindepth/StreamFillMaps.java +++ b/understandingcollections/StreamFillMaps.java @@ -1,4 +1,4 @@ -// collectionsindepth/StreamFillMaps.java +// understandingcollections/StreamFillMaps.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. diff --git a/collectionsindepth/StringHashCode.java b/understandingcollections/StringHashCode.java similarity index 90% rename from collectionsindepth/StringHashCode.java rename to understandingcollections/StringHashCode.java index ad29e3174..69367ab13 100644 --- a/collectionsindepth/StringHashCode.java +++ b/understandingcollections/StringHashCode.java @@ -1,4 +1,4 @@ -// collectionsindepth/StringHashCode.java +// understandingcollections/StringHashCode.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. diff --git a/collectionsindepth/SuppliersCollectionTest.java b/understandingcollections/SuppliersCollectionTest.java similarity index 97% rename from collectionsindepth/SuppliersCollectionTest.java rename to understandingcollections/SuppliersCollectionTest.java index 4c4d447a0..0a361a24e 100644 --- a/collectionsindepth/SuppliersCollectionTest.java +++ b/understandingcollections/SuppliersCollectionTest.java @@ -1,4 +1,4 @@ -// collectionsindepth/SuppliersCollectionTest.java +// understandingcollections/SuppliersCollectionTest.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. diff --git a/collectionsindepth/Synchronization.java b/understandingcollections/Synchronization.java similarity index 94% rename from collectionsindepth/Synchronization.java rename to understandingcollections/Synchronization.java index 9d2adcfd0..9b0f3e29e 100644 --- a/collectionsindepth/Synchronization.java +++ b/understandingcollections/Synchronization.java @@ -1,4 +1,4 @@ -// collectionsindepth/Synchronization.java +// understandingcollections/Synchronization.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. diff --git a/collectionsindepth/Test.java b/understandingcollections/Test.java similarity index 92% rename from collectionsindepth/Test.java rename to understandingcollections/Test.java index 0a9f1b98b..d634cb13f 100644 --- a/collectionsindepth/Test.java +++ b/understandingcollections/Test.java @@ -1,4 +1,4 @@ -// collectionsindepth/Test.java +// understandingcollections/Test.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. diff --git a/collectionsindepth/TestParam.java b/understandingcollections/TestParam.java similarity index 95% rename from collectionsindepth/TestParam.java rename to understandingcollections/TestParam.java index bbf1ae824..f7bc64bfa 100644 --- a/collectionsindepth/TestParam.java +++ b/understandingcollections/TestParam.java @@ -1,4 +1,4 @@ -// collectionsindepth/TestParam.java +// understandingcollections/TestParam.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. diff --git a/collectionsindepth/Tester.java b/understandingcollections/Tester.java similarity index 98% rename from collectionsindepth/Tester.java rename to understandingcollections/Tester.java index abc49add7..150f3bc73 100644 --- a/collectionsindepth/Tester.java +++ b/understandingcollections/Tester.java @@ -1,4 +1,4 @@ -// collectionsindepth/Tester.java +// understandingcollections/Tester.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. diff --git a/collectionsindepth/ToDoList.java b/understandingcollections/ToDoList.java similarity index 97% rename from collectionsindepth/ToDoList.java rename to understandingcollections/ToDoList.java index fc97aa1cf..636420b09 100644 --- a/collectionsindepth/ToDoList.java +++ b/understandingcollections/ToDoList.java @@ -1,4 +1,4 @@ -// collectionsindepth/ToDoList.java +// understandingcollections/ToDoList.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. diff --git a/collectionsindepth/TypesForSets.java b/understandingcollections/TypesForSets.java similarity index 98% rename from collectionsindepth/TypesForSets.java rename to understandingcollections/TypesForSets.java index 7fe2ea171..f34e63d06 100644 --- a/collectionsindepth/TypesForSets.java +++ b/understandingcollections/TypesForSets.java @@ -1,4 +1,4 @@ -// collectionsindepth/TypesForSets.java +// understandingcollections/TypesForSets.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. diff --git a/collectionsindepth/Unsupported.java b/understandingcollections/Unsupported.java similarity index 98% rename from collectionsindepth/Unsupported.java rename to understandingcollections/Unsupported.java index 18e52cc1d..b0ed26001 100644 --- a/collectionsindepth/Unsupported.java +++ b/understandingcollections/Unsupported.java @@ -1,4 +1,4 @@ -// collectionsindepth/Unsupported.java +// understandingcollections/Unsupported.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. diff --git a/collectionsindepth/Utilities.java b/understandingcollections/Utilities.java similarity index 98% rename from collectionsindepth/Utilities.java rename to understandingcollections/Utilities.java index 2c45de60b..c4a15f2c4 100644 --- a/collectionsindepth/Utilities.java +++ b/understandingcollections/Utilities.java @@ -1,4 +1,4 @@ -// collectionsindepth/Utilities.java +// understandingcollections/Utilities.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. diff --git a/collectionsindepth/build.gradle b/understandingcollections/build.gradle similarity index 100% rename from collectionsindepth/build.gradle rename to understandingcollections/build.gradle From 6a9bef0598be30e0d966826a703ce6b9148b3ca6 Mon Sep 17 00:00:00 2001 From: Bruce Eckel Date: Tue, 2 Aug 2016 15:46:42 -0600 Subject: [PATCH 063/320] Create README.md --- README.md | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 README.md diff --git a/README.md b/README.md new file mode 100644 index 000000000..8eb51ece8 --- /dev/null +++ b/README.md @@ -0,0 +1,20 @@ +To compile and run these programs, you only need JDK 8 installed. +Invoking `gradlew` will automatically download and install Gradle. +Gradle will also install all additional libraries necessary to compile +and run the Java examples in the book. + +To compile everything, the command is: + +`gradlew build` + +To run everything (including compiling if necessary), the command is: + +`gradlew run` + +To compile only a single chapter (including dependencies), use for example: + +`gradlew :strings:build` + +To run only a single chapter, say: + +`gradlew :strings:run` From 1a6938773d7e2c763e43dc831495166c635e6d7d Mon Sep 17 00:00:00 2001 From: Bruce Eckel Date: Tue, 2 Aug 2016 15:52:30 -0600 Subject: [PATCH 064/320] Update README.md --- README.md | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/README.md b/README.md index 8eb51ece8..a179d8702 100644 --- a/README.md +++ b/README.md @@ -18,3 +18,16 @@ To compile only a single chapter (including dependencies), use for example: To run only a single chapter, say: `gradlew :strings:run` + +Gradle can also be used to run a single program. Here, we run the **ReplacingStringTokenizer.java** +program in the **strings** chapter subdirectory: + +`gradlew :strings:ReplacingStringTokenizer` + +However, if the file name is unique throughout the book (the majority are), you can just give the +program name, like this: + +`gradlew ReplacingStringTokenizer` + +Note that all these commands are run from the base directory where the example code is installed, and where you find the +`gradlew` script. From 40a29c5e1c0fe7c31d4180925bc22a9179a606ac Mon Sep 17 00:00:00 2001 From: Bruce Eckel Date: Tue, 2 Aug 2016 15:53:45 -0600 Subject: [PATCH 065/320] Update README.md --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index a179d8702..186e9fa7f 100644 --- a/README.md +++ b/README.md @@ -31,3 +31,5 @@ program name, like this: Note that all these commands are run from the base directory where the example code is installed, and where you find the `gradlew` script. + +You can learn about other options by just typing `gradlew` with no arguments. From 1e306a6736d6b03e8a57d4d42b3c3f0105ec0ecb Mon Sep 17 00:00:00 2001 From: Bruce Eckel Date: Wed, 3 Aug 2016 06:06:59 -0600 Subject: [PATCH 066/320] Update to release candidate 1 of Gradle 3.0 --- gradle/wrapper/gradle-wrapper.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index d29761def..e6d6d557e 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions-snapshots/gradle-3.1-20160730000026+0000-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-3.0-rc-1-bin.zip From dba7cc874e1e2ccc38b626946c61b286172b07fe Mon Sep 17 00:00:00 2001 From: James Ward Date: Wed, 3 Aug 2016 13:24:58 -0600 Subject: [PATCH 067/320] add jmh plugin --- build.gradle | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 44780f016..462ac6bb6 100644 --- a/build.gradle +++ b/build.gradle @@ -1,3 +1,15 @@ +buildscript { + repositories { + mavenLocal() + jcenter() + mavenCentral() + } +} + +plugins { + id 'me.champeau.gradle.jmh' version '0.3.0' +} + import org.gradle.internal.jvm.Jvm import org.apache.tools.ant.util.TeeOutputStream boolean debug = false @@ -111,8 +123,8 @@ class Tags { } } - subprojects { + apply plugin: 'me.champeau.gradle.jmh' apply plugin: 'java' sourceCompatibility = '1.8' From 7b93ad90aa0b025bc16722fda798d28099afe7d3 Mon Sep 17 00:00:00 2001 From: Bruce Eckel Date: Fri, 5 Aug 2016 12:41:54 -0600 Subject: [PATCH 068/320] Non-working MapPerformanceJMH.java To try to figure out how to get it to work. --- threads/HorseRace.java | 59 +++++++---------- .../jmhtests/MapPerformanceJMH.java | 66 +++++++++++++++++++ 2 files changed, 91 insertions(+), 34 deletions(-) create mode 100644 understandingcollections/jmhtests/MapPerformanceJMH.java diff --git a/threads/HorseRace.java b/threads/HorseRace.java index e76fb77af..8b0bbbec1 100644 --- a/threads/HorseRace.java +++ b/threads/HorseRace.java @@ -42,7 +42,7 @@ public String tracks() { } public class HorseRace { - static final int FINISH_LINE = 75; + static final int FINISH_LINE = 60; private List horses = new ArrayList<>(); private ExecutorService exec = Executors.newCachedThreadPool(); @@ -90,7 +90,7 @@ public static void main(String[] args) { } /* Output: (First and Last 18 Lines) =========================================================== -================ += 0 **1 2 @@ -99,47 +99,38 @@ public static void main(String[] args) { *5 **6 =========================================================== -================ += **0 ***1 -**2 -**3 -***4 -*5 +*2 +*3 +****4 +**5 ****6 =========================================================== -================ += **0 ...________...________...________...________... -*********************************************************** -*******6 +**********************************************6 =========================================================== -================ -*********************************************************** -**********0 -*********************************************************** -**********1 -*********************************************************** -***********2 += +**************************************************0 +*************************************************1 +*********************************************2 *********************************************************** -***************3 -********************************************************4 -*********************************************************5 -*********************************************************** -*******6 +3 +*****************************************************4 +*****************************************************5 +***********************************************6 =========================================================== -================ -*********************************************************** -***********0 -*********************************************************** -**********1 += +****************************************************0 +*************************************************1 +***********************************************2 *********************************************************** -************2 -*********************************************************** -*****************3 -*********************************************************4 -**********************************************************5 -*********************************************************** -*******6 +*3 +*******************************************************4 +*******************************************************5 +***********************************************6 Horse 3 won! */ diff --git a/understandingcollections/jmhtests/MapPerformanceJMH.java b/understandingcollections/jmhtests/MapPerformanceJMH.java new file mode 100644 index 000000000..2e50d4499 --- /dev/null +++ b/understandingcollections/jmhtests/MapPerformanceJMH.java @@ -0,0 +1,66 @@ +// understandingcollections/jmhtests/MapPerformanceJMH.java +// (c)2016 MindView LLC: see Copyright.txt +// We make no guarantees that this code is fit for any purpose. +// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Demonstrates performance differences in Maps +package understandingcollections.jmhtests; +import org.openjdk.jmh.annotations.*; +import org.openjdk.jmh.infra.Blackhole; +import java.util.*; + +@State(Scope.Thread) +public class MapPerformanceJMH { + private Map map; + + @Param({"hashmap", "treemap"}) + private String type; + + private int begin; + private int end; + + @Setup + public void setup() { + if (type.equals("hashmap")) { + map = new HashMap(); + } else if (type.equals("treemap")) { + map = new TreeMap(); + } else { + throw new IllegalStateException("Unknown type: " + type); + } + + begin = 1; + end = 256; + for (int i = begin; i < end; i++) { + map.put(i, i); + } + } + + @Benchmark + public void get(Blackhole bh) { + for (int i = begin; i < end; i++) { + bh.consume(map.get(i)); + } + } + +// These are incomplete placeholders from the +// original MapPerformance.jaava: +/* @Benchmark + int put() { + for(int i = 0; i < loops; i++) { + map.clear(); + for(int j = 0; j < size; j++) + map.put(j, j); + } + return loops * size; + }*/ + +/* @Benchmark + int iterate() { + for(int i = 0; i < loops; i ++) { + Iterator it = map.entrySet().iterator(); + while(it.hasNext()) + it.next(); + } + }*/ + +} From e1da0ed798c4fcd0003f6096300c50be4d815bd0 Mon Sep 17 00:00:00 2001 From: James Ward Date: Fri, 5 Aug 2016 13:55:39 -0600 Subject: [PATCH 069/320] set jmh dep and srcdir --- build.gradle | 10 ++++++++++ understandingcollections/build.gradle | 4 ++++ 2 files changed, 14 insertions(+) diff --git a/build.gradle b/build.gradle index 462ac6bb6..2885564b1 100644 --- a/build.gradle +++ b/build.gradle @@ -141,6 +141,15 @@ subprojects { srcDir projectDir } } + jmh { + java { + srcDir projectDir + } + } + } + + jmh { + jmhVersion = '1.12' } List createdTasks = [] @@ -214,6 +223,7 @@ subprojects { configure(subprojects - project(':onjava')) { dependencies { compile project(':onjava') + compile 'org.openjdk.jmh:jmh-core:1.12' } } diff --git a/understandingcollections/build.gradle b/understandingcollections/build.gradle index 3f51fbe83..1db84bc1f 100644 --- a/understandingcollections/build.gradle +++ b/understandingcollections/build.gradle @@ -2,3 +2,7 @@ dependencies { compile project(':typeinfo') compile project(':collections') } + +jmh { + include = 'understandingcollections.jmhtests.*' +} From f66316bc248a77e744912433e2860eae7ff87c1b Mon Sep 17 00:00:00 2001 From: James Ward Date: Fri, 5 Aug 2016 14:39:40 -0600 Subject: [PATCH 070/320] add repos --- build.gradle | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/build.gradle b/build.gradle index 2885564b1..453cd0a9c 100644 --- a/build.gradle +++ b/build.gradle @@ -132,6 +132,7 @@ subprojects { repositories { mavenLocal() + jcenter() mavenCentral() } @@ -220,6 +221,12 @@ subprojects { task run(dependsOn: createdTasks) } +repositories { + mavenLocal() + jcenter() + mavenCentral() +} + configure(subprojects - project(':onjava')) { dependencies { compile project(':onjava') From 71a6aa7e711079ad606bd91cd90609575533c77e Mon Sep 17 00:00:00 2001 From: Bruce Eckel Date: Fri, 5 Aug 2016 16:07:30 -0600 Subject: [PATCH 071/320] Initial Reasonable JMH example working --- .../jmhtests/MapPerformance.java | 81 +++++++++++++++++++ .../jmhtests/MapPerformanceJMH.java | 66 --------------- 2 files changed, 81 insertions(+), 66 deletions(-) create mode 100644 understandingcollections/jmhtests/MapPerformance.java delete mode 100644 understandingcollections/jmhtests/MapPerformanceJMH.java diff --git a/understandingcollections/jmhtests/MapPerformance.java b/understandingcollections/jmhtests/MapPerformance.java new file mode 100644 index 000000000..7b6bea7bf --- /dev/null +++ b/understandingcollections/jmhtests/MapPerformance.java @@ -0,0 +1,81 @@ +// understandingcollections/jmhtests/MapPerformance.java +// (c)2016 MindView LLC: see Copyright.txt +// We make no guarantees that this code is fit for any purpose. +// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Performance differences between Maps +package understandingcollections.jmhtests; +import org.openjdk.jmh.annotations.*; +import org.openjdk.jmh.infra.Blackhole; +import java.util.*; +import static java.util.concurrent.TimeUnit.*; + +@State(Scope.Thread) +@Warmup(iterations = 5, time = 1, timeUnit = SECONDS) +@Measurement(iterations = 5, time = 1, timeUnit = SECONDS) +@Fork(1) +@BenchmarkMode(Mode.AverageTime) +@OutputTimeUnit(NANOSECONDS) +public class MapPerformance { + private Map map; + + @Param({"hashmap", "treemap", "linkedhashmap", + "identityhashmap", "weakhashmap", "hashtable"}) + private String type; + + private int begin; + private int end; + + @Setup + public void setup() { + switch(type) { + case "hashmap": + map = new HashMap<>(); + break; + case "treemap": + map = new TreeMap<>(); + break; + case "linkedhashmap": + map = new LinkedHashMap<>(); + break; + case "identityhashmap": + map = new IdentityHashMap<>(); + break; + case "weakhashmap": + map = new WeakHashMap<>(); + break; + case "hashtable": + map = new Hashtable<>(); + break; + default: + throw new IllegalStateException("Unknown " + type); + } + + begin = 1; + end = 256; + for (int i = begin; i < end; i++) { + map.put(i, i); + } + } + + @Benchmark + public void get(Blackhole bh) { + for (int i = begin; i < end; i++) { + bh.consume(map.get(i)); + } + } + + @Benchmark + public void put(Blackhole bh) { + for (int i = begin; i < end; i++) { + bh.consume(map.put(i, i)); + } + } + + @Benchmark + public void iterate(Blackhole bh) { + Iterator it = map.entrySet().iterator(); + while(it.hasNext()) + bh.consume(it.next()); + } + +} diff --git a/understandingcollections/jmhtests/MapPerformanceJMH.java b/understandingcollections/jmhtests/MapPerformanceJMH.java deleted file mode 100644 index 2e50d4499..000000000 --- a/understandingcollections/jmhtests/MapPerformanceJMH.java +++ /dev/null @@ -1,66 +0,0 @@ -// understandingcollections/jmhtests/MapPerformanceJMH.java -// (c)2016 MindView LLC: see Copyright.txt -// We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. -// Demonstrates performance differences in Maps -package understandingcollections.jmhtests; -import org.openjdk.jmh.annotations.*; -import org.openjdk.jmh.infra.Blackhole; -import java.util.*; - -@State(Scope.Thread) -public class MapPerformanceJMH { - private Map map; - - @Param({"hashmap", "treemap"}) - private String type; - - private int begin; - private int end; - - @Setup - public void setup() { - if (type.equals("hashmap")) { - map = new HashMap(); - } else if (type.equals("treemap")) { - map = new TreeMap(); - } else { - throw new IllegalStateException("Unknown type: " + type); - } - - begin = 1; - end = 256; - for (int i = begin; i < end; i++) { - map.put(i, i); - } - } - - @Benchmark - public void get(Blackhole bh) { - for (int i = begin; i < end; i++) { - bh.consume(map.get(i)); - } - } - -// These are incomplete placeholders from the -// original MapPerformance.jaava: -/* @Benchmark - int put() { - for(int i = 0; i < loops; i++) { - map.clear(); - for(int j = 0; j < size; j++) - map.put(j, j); - } - return loops * size; - }*/ - -/* @Benchmark - int iterate() { - for(int i = 0; i < loops; i ++) { - Iterator it = map.entrySet().iterator(); - while(it.hasNext()) - it.next(); - } - }*/ - -} From d9e652be5b17ba6c10e1793fb5565ec367950dfd Mon Sep 17 00:00:00 2001 From: Bruce Eckel Date: Sat, 6 Aug 2016 11:30:08 -0600 Subject: [PATCH 072/320] Refactoring Maps.java benchmark --- understandingcollections/MapPerformance.java | 82 ------------------- .../{MapPerformance.java => Maps.java} | 24 +++--- 2 files changed, 12 insertions(+), 94 deletions(-) delete mode 100644 understandingcollections/MapPerformance.java rename understandingcollections/jmhtests/{MapPerformance.java => Maps.java} (79%) diff --git a/understandingcollections/MapPerformance.java b/understandingcollections/MapPerformance.java deleted file mode 100644 index 1a0b108d9..000000000 --- a/understandingcollections/MapPerformance.java +++ /dev/null @@ -1,82 +0,0 @@ -// understandingcollections/MapPerformance.java -// (c)2016 MindView LLC: see Copyright.txt -// We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. -// Demonstrates performance differences in Maps -// Small to keep build testing short: -// {java MapPerformance 100 5000} -import java.util.*; - -public class MapPerformance { - static List>> tests = - new ArrayList<>(); - static { - tests.add(new Test>("put") { - @Override - int test(Map map, TestParam tp) { - int loops = tp.loops; - int size = tp.size; - for(int i = 0; i < loops; i++) { - map.clear(); - for(int j = 0; j < size; j++) - map.put(j, j); - } - return loops * size; - } - }); - tests.add(new Test>("get") { - @Override - int test(Map map, TestParam tp) { - int loops = tp.loops; - int span = tp.size * 2; - for(int i = 0; i < loops; i++) - for(int j = 0; j < span; j++) - map.get(j); - return loops * span; - } - }); - tests.add(new Test>("iterate") { - @Override - int test(Map map, TestParam tp) { - int loops = tp.loops * 10; - for(int i = 0; i < loops; i ++) { - Iterator it = map.entrySet().iterator(); - while(it.hasNext()) - it.next(); - } - return loops * map.size(); - } - }); - } - public static void main(String[] args) { - if(args.length > 0) - Tester.defaultParams = TestParam.array(args); - Tester.run(new TreeMap<>(), tests); - Tester.run(new HashMap<>(), tests); - Tester.run(new LinkedHashMap<>(),tests); - Tester.run( - new IdentityHashMap<>(), tests); - Tester.run(new WeakHashMap<>(), tests); - Tester.run(new Hashtable<>(), tests); - } -} -/* Output: ----------- TreeMap ---------- - size put get iterate - 100 286 152 35 ----------- HashMap ---------- - size put get iterate - 100 86 38 44 -------- LinkedHashMap ------- - size put get iterate - 100 92 27 28 ------- IdentityHashMap ------ - size put get iterate - 100 298 101 42 --------- WeakHashMap -------- - size put get iterate - 100 88 36 57 ---------- Hashtable --------- - size put get iterate - 100 98 52 46 -*/ diff --git a/understandingcollections/jmhtests/MapPerformance.java b/understandingcollections/jmhtests/Maps.java similarity index 79% rename from understandingcollections/jmhtests/MapPerformance.java rename to understandingcollections/jmhtests/Maps.java index 7b6bea7bf..76ca06ec7 100644 --- a/understandingcollections/jmhtests/MapPerformance.java +++ b/understandingcollections/jmhtests/Maps.java @@ -1,4 +1,4 @@ -// understandingcollections/jmhtests/MapPerformance.java +// understandingcollections/jmhtests/Maps.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. @@ -15,11 +15,11 @@ @Fork(1) @BenchmarkMode(Mode.AverageTime) @OutputTimeUnit(NANOSECONDS) -public class MapPerformance { +public class Maps { private Map map; - @Param({"hashmap", "treemap", "linkedhashmap", - "identityhashmap", "weakhashmap", "hashtable"}) + @Param({"HashMap", "TreeMap", "LinkedHashMap", + "IdentityHashMap", "WeakHashMap", "Hashtable",}) private String type; private int begin; @@ -28,22 +28,22 @@ public class MapPerformance { @Setup public void setup() { switch(type) { - case "hashmap": + case "HashMap": map = new HashMap<>(); break; - case "treemap": + case "TreeMap": map = new TreeMap<>(); break; - case "linkedhashmap": + case "LinkedHashMap": map = new LinkedHashMap<>(); break; - case "identityhashmap": + case "IdentityHashMap": map = new IdentityHashMap<>(); break; - case "weakhashmap": + case "WeakHashMap": map = new WeakHashMap<>(); break; - case "hashtable": + case "Hashtable": map = new Hashtable<>(); break; default: @@ -65,9 +65,9 @@ public void get(Blackhole bh) { } @Benchmark - public void put(Blackhole bh) { + public void put() { for (int i = begin; i < end; i++) { - bh.consume(map.put(i, i)); + map.put(i, i); } } From dd72625ffadbed0cdf23ec6ca034deeae45dd809 Mon Sep 17 00:00:00 2001 From: Bruce Eckel Date: Sun, 7 Aug 2016 17:42:08 -0600 Subject: [PATCH 073/320] Experimentally commented out 2nd "repositories" section --- build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/build.gradle b/build.gradle index 453cd0a9c..fd21143da 100644 --- a/build.gradle +++ b/build.gradle @@ -221,11 +221,11 @@ subprojects { task run(dependsOn: createdTasks) } -repositories { +/*repositories { mavenLocal() jcenter() mavenCentral() -} +}*/ configure(subprojects - project(':onjava')) { dependencies { From 9db018422dc08497c80577292a8963a69129eb90 Mon Sep 17 00:00:00 2001 From: Bruce Eckel Date: Tue, 9 Aug 2016 09:19:45 -0600 Subject: [PATCH 074/320] Also run :understandingcollections:jmh --- .travis.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index fab9b5b3b..d0efebd21 100644 --- a/.travis.yml +++ b/.travis.yml @@ -2,4 +2,6 @@ language: java jdk: - oraclejdk8 install: true -script: ./gradlew --parallel --stacktrace run +script: + - ./gradlew --parallel --stacktrace run + - ./gradlew --parallel --stacktrace :understandingcollections:jmh From 0346fc747b955a1c7fd010767de25b0cebd1bdce Mon Sep 17 00:00:00 2001 From: Bruce Eckel Date: Tue, 9 Aug 2016 09:57:23 -0600 Subject: [PATCH 075/320] Also run :understandingcollections:jmh --- appveyor.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/appveyor.yml b/appveyor.yml index 78c7d35f3..702506a71 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -1,4 +1,5 @@ build_script: - gradlew.bat --parallel --stacktrace run + - gradlew.bat --parallel --stacktrace :understandingcollections:jmh test: off From a17f939fd9f9e31b1ca688f61543931cb0d3a8a5 Mon Sep 17 00:00:00 2001 From: Bruce Eckel Date: Tue, 9 Aug 2016 10:21:47 -0600 Subject: [PATCH 076/320] Added the rest of the performance tests Will probably need tweaking. --- .../RandomBounds.java | 16 +- .../{Lists.java => ListOps.java} | 4 +- understandingcollections/ListPerformance.java | 211 ------------------ .../{Maps.java => MapOps.java} | 4 +- understandingcollections/SetPerformance.java | 70 ------ understandingcollections/Test.java | 13 -- understandingcollections/TestParam.java | 30 --- understandingcollections/Tester.java | 84 ------- understandingcollections/jmhtests/Lists.java | 81 +++++++ understandingcollections/jmhtests/Maps.java | 7 +- understandingcollections/jmhtests/Queues.java | 62 +++++ understandingcollections/jmhtests/Sets.java | 63 ++++++ 12 files changed, 217 insertions(+), 428 deletions(-) rename {understandingcollections => control}/RandomBounds.java (69%) rename understandingcollections/{Lists.java => ListOps.java} (98%) delete mode 100644 understandingcollections/ListPerformance.java rename understandingcollections/{Maps.java => MapOps.java} (97%) delete mode 100644 understandingcollections/SetPerformance.java delete mode 100644 understandingcollections/Test.java delete mode 100644 understandingcollections/TestParam.java delete mode 100644 understandingcollections/Tester.java create mode 100644 understandingcollections/jmhtests/Lists.java create mode 100644 understandingcollections/jmhtests/Queues.java create mode 100644 understandingcollections/jmhtests/Sets.java diff --git a/understandingcollections/RandomBounds.java b/control/RandomBounds.java similarity index 69% rename from understandingcollections/RandomBounds.java rename to control/RandomBounds.java index b464854d7..3ea7e9668 100644 --- a/understandingcollections/RandomBounds.java +++ b/control/RandomBounds.java @@ -1,4 +1,4 @@ -// understandingcollections/RandomBounds.java +// control/RandomBounds.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. @@ -7,16 +7,9 @@ import onjava.*; public class RandomBounds { - static void usage() { - System.out.println("Usage:"); - System.out.println("\tRandomBounds lower"); - System.out.println("\tRandomBounds upper"); - System.exit(1); - } public static void main(String[] args) { - if(args.length != 1) usage(); new TimedAbort(3); - switch(args[0]) { + switch(args.length == 0 ? "" : args[0]) { case "lower": while(Math.random() != 0.0) ; // Keep trying @@ -28,7 +21,10 @@ public static void main(String[] args) { System.out.println("Produced 1.0!"); break; default: - usage(); + System.out.println("Usage:"); + System.out.println("\tRandomBounds lower"); + System.out.println("\tRandomBounds upper"); + System.exit(1); } } } diff --git a/understandingcollections/Lists.java b/understandingcollections/ListOps.java similarity index 98% rename from understandingcollections/Lists.java rename to understandingcollections/ListOps.java index d7ffe5a9c..03de5f35f 100644 --- a/understandingcollections/Lists.java +++ b/understandingcollections/ListOps.java @@ -1,4 +1,4 @@ -// understandingcollections/Lists.java +// understandingcollections/ListOps.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. @@ -6,7 +6,7 @@ import java.util.*; import onjava.*; -public class Lists { +public class ListOps { private static boolean b; private static String s; private static int i; diff --git a/understandingcollections/ListPerformance.java b/understandingcollections/ListPerformance.java deleted file mode 100644 index 2c0b1f99d..000000000 --- a/understandingcollections/ListPerformance.java +++ /dev/null @@ -1,211 +0,0 @@ -// understandingcollections/ListPerformance.java -// (c)2016 MindView LLC: see Copyright.txt -// We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. -// Demonstrates performance differences in Lists -// Small to keep build testing short: -// {java ListPerformance 100 500} -import java.util.*; -import onjava.*; - -public class ListPerformance { - static SplittableRandom rand = new SplittableRandom(); - static int reps = 1000; - static List>> tests = - new ArrayList<>(); - static List>> qTests = - new ArrayList<>(); - static { - tests.add(new Test>("add") { - @Override - int test(List list, TestParam tp) { - int loops = tp.loops; - int listSize = tp.size; - for(int i = 0; i < loops; i++) { - list.clear(); - for(int j = 0; j < listSize; j++) - list.add(j); - } - return loops * listSize; - } - }); - tests.add(new Test>("get") { - @Override - int test(List list, TestParam tp) { - int loops = tp.loops * reps; - int listSize = list.size(); - for(int i = 0; i < loops; i++) - list.get(rand.nextInt(listSize)); - return loops; - } - }); - tests.add(new Test>("set") { - @Override - int test(List list, TestParam tp) { - int loops = tp.loops * reps; - int listSize = list.size(); - for(int i = 0; i < loops; i++) - list.set(rand.nextInt(listSize), 47); - return loops; - } - }); - tests.add(new Test>("iteradd") { - @Override - int test(List list, TestParam tp) { - final int LOOPS = 1000000; - int half = list.size() / 2; - ListIterator it = - list.listIterator(half); - for(int i = 0; i < LOOPS; i++) - it.add(47); - return LOOPS; - } - }); - tests.add(new Test>("insert") { - @Override - int test(List list, TestParam tp) { - int loops = tp.loops; - for(int i = 0; i < loops; i++) - list.add(5, 47); // Minimize random-access cost - return loops; - } - }); - tests.add(new Test>("remove") { - @Override - int test(List list, TestParam tp) { - int loops = tp.loops; - int size = tp.size; - for(int i = 0; i < loops; i++) { - list.clear(); - list.addAll(new CountingIntegerList(size)); - while(list.size() > 5) - list.remove(5); // Minimize random-access cost - } - return loops * size; - } - }); - // Tests for queue behavior: - qTests.add(new Test>("addFirst") { - @Override - int test(LinkedList list, TestParam tp) { - int loops = tp.loops; - int size = tp.size; - for(int i = 0; i < loops; i++) { - list.clear(); - for(int j = 0; j < size; j++) - list.addFirst(47); - } - return loops * size; - } - }); - qTests.add(new Test>("addLast") { - @Override - int test(LinkedList list, TestParam tp) { - int loops = tp.loops; - int size = tp.size; - for(int i = 0; i < loops; i++) { - list.clear(); - for(int j = 0; j < size; j++) - list.addLast(47); - } - return loops * size; - } - }); - qTests.add( - new Test>("rmFirst") { - @Override - int test(LinkedList list, TestParam tp) { - int loops = tp.loops; - int size = tp.size; - for(int i = 0; i < loops; i++) { - list.clear(); - list.addAll(new CountingIntegerList(size)); - while(list.size() > 0) - list.removeFirst(); - } - return loops * size; - } - }); - qTests.add(new Test>("rmLast") { - @Override - int test(LinkedList list, TestParam tp) { - int loops = tp.loops; - int size = tp.size; - for(int i = 0; i < loops; i++) { - list.clear(); - list.addAll(new CountingIntegerList(size)); - while(list.size() > 0) - list.removeLast(); - } - return loops * size; - } - }); - } - static class ListTester extends Tester> { - public ListTester(List collection, - List>> tests) { - super(collection, tests); - } - // Fill to the appropriate size before each test: - @Override - protected List initialize(int size) { - collection.clear(); - collection.addAll(new CountingIntegerList(size)); - return collection; - } - // Convenience method: - public static void run(List list, - List>> tests) { - new ListTester(list, tests).timedTest(); - } - } - public static void main(String[] args) { - if(args.length > 0) - Tester.defaultParams = TestParam.array(args); - // Can only do these two tests on an array: - Tester> arrayTest = - new Tester>(null, - tests.subList(1, 3)) { - // This is called before each test. It - // produces a non-resizeable array-backed list: - @Override protected - List initialize(int size) { - Integer[] ia = new Integer[size]; - Arrays.setAll(ia, new Count.Integer()::get); - return Arrays.asList(ia); - } - }; - arrayTest.setHeadline("Array as List"); - arrayTest.timedTest(); - Tester.defaultParams= TestParam.array( - 10, 5000, 100, 5000, 1000, 1000, 10000, 200); - if(args.length > 0) - Tester.defaultParams = TestParam.array(args); - ListTester.run(new ArrayList<>(), tests); - ListTester.run(new LinkedList<>(), tests); - ListTester.run(new Vector<>(), tests); - Tester.fieldWidth = 12; - Tester> qTest = - new Tester>( - new LinkedList<>(), qTests); - qTest.setHeadline("Queue tests"); - qTest.timedTest(); - } -} -/* Output: ---- Array as List --- - size get set - 100 50 68 ---------------------- ArrayList --------------------- - size add get set iteradd insert remove - 100 60 76 74 103 0 360 ---------------------- LinkedList --------------------- - size add get set iteradd insert remove - 100 200 166 114 201 0 120 ------------------------ Vector ----------------------- - size add get set iteradd insert remove - 100 60 76 84 159 0 220 --------------------- Queue tests -------------------- - size addFirst addLast rmFirst rmLast - 100 80 160 100 120 -*/ diff --git a/understandingcollections/Maps.java b/understandingcollections/MapOps.java similarity index 97% rename from understandingcollections/Maps.java rename to understandingcollections/MapOps.java index 005a609ec..58b711cf9 100644 --- a/understandingcollections/Maps.java +++ b/understandingcollections/MapOps.java @@ -1,4 +1,4 @@ -// understandingcollections/Maps.java +// understandingcollections/MapOps.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. @@ -7,7 +7,7 @@ import java.util.*; import onjava.*; -public class Maps { +public class MapOps { public static void printKeys(Map map) { System.out.print("Size = " + map.size() + ", "); System.out.print("Keys: "); diff --git a/understandingcollections/SetPerformance.java b/understandingcollections/SetPerformance.java deleted file mode 100644 index d354a97b6..000000000 --- a/understandingcollections/SetPerformance.java +++ /dev/null @@ -1,70 +0,0 @@ -// understandingcollections/SetPerformance.java -// (c)2016 MindView LLC: see Copyright.txt -// We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. -// Demonstrates performance differences in Sets -// Small to keep build testing short: -// {java SetPerformance 100 5000} -import java.util.*; - -public class SetPerformance { - static List>> tests = - new ArrayList<>(); - static { - tests.add(new Test>("add") { - @Override - int test(Set set, TestParam tp) { - int loops = tp.loops; - int size = tp.size; - for(int i = 0; i < loops; i++) { - set.clear(); - for(int j = 0; j < size; j++) - set.add(j); - } - return loops * size; - } - }); - tests.add(new Test>("contains") { - @Override - int test(Set set, TestParam tp) { - int loops = tp.loops; - int span = tp.size * 2; - for(int i = 0; i < loops; i++) - for(int j = 0; j < span; j++) - set.contains(j); - return loops * span; - } - }); - tests.add(new Test>("iterate") { - @Override - int test(Set set, TestParam tp) { - int loops = tp.loops * 10; - for(int i = 0; i < loops; i++) { - Iterator it = set.iterator(); - while(it.hasNext()) - it.next(); - } - return loops * set.size(); - } - }); - } - public static void main(String[] args) { - if(args.length > 0) - Tester.defaultParams = TestParam.array(args); - Tester.fieldWidth = 10; - Tester.run(new TreeSet<>(), tests); - Tester.run(new HashSet<>(), tests); - Tester.run(new LinkedHashSet<>(), tests); - } -} -/* Output: -------------- TreeSet ------------- - size add contains iterate - 100 256 162 31 -------------- HashSet ------------- - size add contains iterate - 100 88 58 43 ----------- LinkedHashSet ---------- - size add contains iterate - 100 100 46 23 -*/ diff --git a/understandingcollections/Test.java b/understandingcollections/Test.java deleted file mode 100644 index d634cb13f..000000000 --- a/understandingcollections/Test.java +++ /dev/null @@ -1,13 +0,0 @@ -// understandingcollections/Test.java -// (c)2016 MindView LLC: see Copyright.txt -// We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. -// Framework for performing timed tests of collections - -public abstract class Test { - String name; - public Test(String name) { this.name = name; } - // Override this method for different tests. - // Returns actual number of repetitions of test. - abstract int test(C collection, TestParam tp); -} diff --git a/understandingcollections/TestParam.java b/understandingcollections/TestParam.java deleted file mode 100644 index f7bc64bfa..000000000 --- a/understandingcollections/TestParam.java +++ /dev/null @@ -1,30 +0,0 @@ -// understandingcollections/TestParam.java -// (c)2016 MindView LLC: see Copyright.txt -// We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. -// A "data transfer object." - -public class TestParam { - public final int size; - public final int loops; - public TestParam(int size, int loops) { - this.size = size; - this.loops = loops; - } - // Create an array of TestParam from a varargs sequence: - public static TestParam[] array(int... values) { - int size = values.length/2; - TestParam[] result = new TestParam[size]; - int n = 0; - for(int i = 0; i < size; i++) - result[i] = new TestParam(values[n++], values[n++]); - return result; - } - // Convert a String array to a TestParam array: - public static TestParam[] array(String[] values) { - int[] vals = new int[values.length]; - for(int i = 0; i < vals.length; i++) - vals[i] = Integer.decode(values[i]); - return array(vals); - } -} diff --git a/understandingcollections/Tester.java b/understandingcollections/Tester.java deleted file mode 100644 index 150f3bc73..000000000 --- a/understandingcollections/Tester.java +++ /dev/null @@ -1,84 +0,0 @@ -// understandingcollections/Tester.java -// (c)2016 MindView LLC: see Copyright.txt -// We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. -// Applies Test objects to lists of different collections -import java.util.*; -import java.time.*; - -public class Tester { - public static int fieldWidth = 8; - public static - TestParam[] defaultParams= TestParam.array( - 10, 5000, 100, 5000, 1000, 5000, 10000, 500); - // Override this to modify pre-test initialization: - protected C initialize(int size) { return collection; } - protected C collection; - private String headline = ""; - private List> tests; - private static int sizeWidth = 5; - private static String sizeField = "%" + sizeWidth + "s"; - private TestParam[] paramList = defaultParams; - public Tester(C collection, List> tests) { - this.collection = collection; - this.tests = tests; - if(collection != null) - headline = collection.getClass().getSimpleName(); - } - public Tester(C collection, List> tests, - TestParam[] paramList) { - this(collection, tests); - this.paramList = paramList; - } - public void setHeadline(String newHeadline) { - headline = newHeadline; - } - // Generic methods for convenience : - public static - void run(C cntnr, List> tests) { - new Tester<>(cntnr, tests).timedTest(); - } - public static void run(C cntnr, - List> tests, TestParam[] paramList) { - new Tester<>(cntnr, tests, paramList).timedTest(); - } - private void displayHeader() { - // Calculate width and pad with '-': - int width = fieldWidth * tests.size() + sizeWidth; - int dashLength = width - headline.length() - 1; - StringBuilder head = new StringBuilder(width); - for(int i = 0; i < dashLength/2; i++) - head.append('-'); - head.append(' '); - head.append(headline); - head.append(' '); - for(int i = 0; i < dashLength/2; i++) - head.append('-'); - System.out.println(head); - // Print column headers: - System.out.format(sizeField, "size"); - for(Test test : tests) - System.out.format( - "%" + fieldWidth + "s", test.name); - System.out.println(); - } - // Run the tests for this collection: - public void timedTest() { - displayHeader(); - for(TestParam param : paramList) { - System.out.format(sizeField, param.size); - for(Test test : tests) { - C kontainer = initialize(param.size); - Instant start = Instant.now(); - // Call the overriden method: - int reps = test.test(kontainer, param); - Duration elapsed = - Duration.between(start, Instant.now()); - Duration timePerRep = elapsed.dividedBy(reps); - System.out.format("%" + fieldWidth + "d", - timePerRep.toNanos()); - } - System.out.println(); - } - } -} diff --git a/understandingcollections/jmhtests/Lists.java b/understandingcollections/jmhtests/Lists.java new file mode 100644 index 000000000..296164dca --- /dev/null +++ b/understandingcollections/jmhtests/Lists.java @@ -0,0 +1,81 @@ +// understandingcollections/jmhtests/Lists.java +// (c)2016 MindView LLC: see Copyright.txt +// We make no guarantees that this code is fit for any purpose. +// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Demonstrates performance differences in Lists +package understandingcollections.jmhtests; +import org.openjdk.jmh.annotations.*; +import org.openjdk.jmh.infra.Blackhole; +import java.util.*; +import static java.util.concurrent.TimeUnit.*; + +@State(Scope.Thread) +@Warmup(iterations = 5, time = 1, timeUnit = SECONDS) +@Measurement(iterations = 5, time = 1, timeUnit = SECONDS) +@Fork(1) +@BenchmarkMode(Mode.AverageTime) +@OutputTimeUnit(MICROSECONDS) +public class Lists { + private List list; + + @Param({"ArrayList", "LinkedList", "Vector"}) + private String type; + + private int begin; + private int end; + + @Setup + public void setup() { + switch(type) { + case "ArrayList": + list = new ArrayList<>(); + break; + case "LinkedList": + list = new LinkedList<>(); + break; + case "Vector": + list = new Vector<>(); + break; + default: + throw new IllegalStateException("Unknown " + type); + } + begin = 0; + end = 256; + for(int i = begin; i < end; i++) { + list.add(i); + } + } + @Benchmark + public void add() { + for(int i = begin; i < end; i++) + list.add(i); + } + @Benchmark + public void get(Blackhole bh) { + for(int i = begin; i < end; i++) + bh.consume(list.get(i)); + } + @Benchmark + public void set() { + for(int i = begin; i < end; i++) + list.set(i, 47); + } + @Benchmark + public void iteradd() { + int half = list.size() / 2; + ListIterator it = + list.listIterator(half); + for(int i = begin; i < end; i++) + it.add(47); + } + @Benchmark + public void insert() { + for(int i = begin; i < end; i++) + list.add(5, 47); + } + @Benchmark + public void remove() { + while(list.size() > 5) + list.remove(5); + } +} diff --git a/understandingcollections/jmhtests/Maps.java b/understandingcollections/jmhtests/Maps.java index 76ca06ec7..9a9022b66 100644 --- a/understandingcollections/jmhtests/Maps.java +++ b/understandingcollections/jmhtests/Maps.java @@ -14,7 +14,7 @@ @Measurement(iterations = 5, time = 1, timeUnit = SECONDS) @Fork(1) @BenchmarkMode(Mode.AverageTime) -@OutputTimeUnit(NANOSECONDS) +@OutputTimeUnit(MICROSECONDS) public class Maps { private Map map; @@ -49,33 +49,28 @@ public void setup() { default: throw new IllegalStateException("Unknown " + type); } - begin = 1; end = 256; for (int i = begin; i < end; i++) { map.put(i, i); } } - @Benchmark public void get(Blackhole bh) { for (int i = begin; i < end; i++) { bh.consume(map.get(i)); } } - @Benchmark public void put() { for (int i = begin; i < end; i++) { map.put(i, i); } } - @Benchmark public void iterate(Blackhole bh) { Iterator it = map.entrySet().iterator(); while(it.hasNext()) bh.consume(it.next()); } - } diff --git a/understandingcollections/jmhtests/Queues.java b/understandingcollections/jmhtests/Queues.java new file mode 100644 index 000000000..1428b07a1 --- /dev/null +++ b/understandingcollections/jmhtests/Queues.java @@ -0,0 +1,62 @@ +// understandingcollections/jmhtests/Queues.java +// (c)2016 MindView LLC: see Copyright.txt +// We make no guarantees that this code is fit for any purpose. +// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Demonstrates performance differences in Queues +package understandingcollections.jmhtests; +import org.openjdk.jmh.annotations.*; +import org.openjdk.jmh.infra.Blackhole; +import java.util.*; +import static java.util.concurrent.TimeUnit.*; + +@State(Scope.Thread) +@Warmup(iterations = 5, time = 1, timeUnit = SECONDS) +@Measurement(iterations = 5, time = 1, timeUnit = SECONDS) +@Fork(1) +@BenchmarkMode(Mode.AverageTime) +@OutputTimeUnit(MICROSECONDS) +public class Queues { + private LinkedList queue; + + @Param({"LinkedList"}) + private String type; + + private int begin; + private int end; + + @Setup + public void setup() { + switch(type) { + case "LinkedList": + queue = new LinkedList<>(); + break; + default: + throw new IllegalStateException("Unknown " + type); + } + begin = 1; + end = 256; + for(int i = begin; i < end; i++) { + queue.add(i); + } + } + @Benchmark + public void queue_addFirst() { + for(int i = begin; i < end; i++) + queue.addFirst(47); + } + @Benchmark + public void queue_addLast() { + for(int i = begin; i < end; i++) + queue.addLast(47); + } + @Benchmark + public void queue_removeFirst(Blackhole bh) { + while(queue.size() > 0) + bh.consume(queue.removeFirst()); + } + @Benchmark + public void queue_removeLast(Blackhole bh) { + while(queue.size() > 0) + bh.consume(queue.removeLast()); + } +} diff --git a/understandingcollections/jmhtests/Sets.java b/understandingcollections/jmhtests/Sets.java new file mode 100644 index 000000000..3cb94322a --- /dev/null +++ b/understandingcollections/jmhtests/Sets.java @@ -0,0 +1,63 @@ +// understandingcollections/jmhtests/Sets.java +// (c)2016 MindView LLC: see Copyright.txt +// We make no guarantees that this code is fit for any purpose. +// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Demonstrates performance differences in Sets +package understandingcollections.jmhtests; +import org.openjdk.jmh.annotations.*; +import org.openjdk.jmh.infra.Blackhole; +import java.util.*; +import static java.util.concurrent.TimeUnit.*; + +@State(Scope.Thread) +@Warmup(iterations = 5, time = 1, timeUnit = SECONDS) +@Measurement(iterations = 5, time = 1, timeUnit = SECONDS) +@Fork(1) +@BenchmarkMode(Mode.AverageTime) +@OutputTimeUnit(MICROSECONDS) +public class Sets { + private Set set; + + @Param({"HashSet", "TreeSet", "LinkedHashSet"}) + private String type; + + private int begin; + private int end; + + @Setup + public void setup() { + switch(type) { + case "HashSet": + set = new HashSet<>(); + break; + case "TreeSet": + set = new TreeSet<>(); + break; + case "LinkedHashSet": + set = new LinkedHashSet<>(); + break; + default: + throw new IllegalStateException("Unknown " + type); + } + begin = 1; + end = 256; + for (int i = begin; i < end; i++) + set.add(i); + } + @Benchmark + public void add() { + for(int i = begin; i < end; i++) + set.add(i); + } + @Benchmark + public void contains(Blackhole bh) { + for(int i = begin; i < end; i++) + bh.consume(set.contains(i)); + } + @Benchmark + public void iterate(Blackhole bh) { + Iterator it = set.iterator(); + while(it.hasNext()) + bh.consume(it.next()); + } +} From 1feee27c31a549d593224657daecb38f06e58a70 Mon Sep 17 00:00:00 2001 From: Bruce Eckel Date: Tue, 9 Aug 2016 11:42:12 -0600 Subject: [PATCH 077/320] Bump JMH version to most current --- build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/build.gradle b/build.gradle index fd21143da..670c67022 100644 --- a/build.gradle +++ b/build.gradle @@ -150,7 +150,7 @@ subprojects { } jmh { - jmhVersion = '1.12' + jmhVersion = '1.13' } List createdTasks = [] @@ -230,7 +230,7 @@ subprojects { configure(subprojects - project(':onjava')) { dependencies { compile project(':onjava') - compile 'org.openjdk.jmh:jmh-core:1.12' + compile 'org.openjdk.jmh:jmh-core:1.13' } } From de9342c930ff8a1e6ccd8858bfde3c5a87039839 Mon Sep 17 00:00:00 2001 From: Bruce Eckel Date: Tue, 9 Aug 2016 11:49:57 -0600 Subject: [PATCH 078/320] JMH version now defined in only one place --- build.gradle | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/build.gradle b/build.gradle index 670c67022..417541f93 100644 --- a/build.gradle +++ b/build.gradle @@ -221,16 +221,10 @@ subprojects { task run(dependsOn: createdTasks) } -/*repositories { - mavenLocal() - jcenter() - mavenCentral() -}*/ - configure(subprojects - project(':onjava')) { dependencies { compile project(':onjava') - compile 'org.openjdk.jmh:jmh-core:1.13' + compile "org.openjdk.jmh:jmh-core:${jmh.jmhVersion}" } } From 003be8a5972d309df54c6e2990b3a83d23125709 Mon Sep 17 00:00:00 2001 From: Bruce Eckel Date: Tue, 9 Aug 2016 13:34:35 -0600 Subject: [PATCH 079/320] Added "Verifying Your Code" Chapter Incorporated/Removed associated appendices --- unittesting/build.gradle | 3 --- {assertions => verifying}/Assert1.java | 2 +- {assertions => verifying}/Assert2.java | 2 +- {logging => verifying}/ConfigureLogging.java | 2 +- {logging => verifying}/CustomHandler.java | 2 +- {logging => verifying}/InfoLogging.java | 2 +- {logging => verifying}/InfoLogging2.java | 2 +- {unittesting => verifying}/JUnitDemo.java | 3 +-- {assertions => verifying}/LoaderAssertions.java | 2 +- {logging => verifying}/LogToFile.java | 2 +- {logging => verifying}/LogToFile2.java | 2 +- {logging => verifying}/LoggingLevelManipulation.java | 2 +- {logging => verifying}/LoggingLevels.java | 2 +- {logging => verifying}/MultipleHandlers.java | 2 +- {logging => verifying}/MultipleHandlers2.java | 2 +- {logging => verifying}/PrintableLogRecord.java | 2 +- {assertions => verifying}/Queue.java | 3 +-- {debugging => verifying}/SimpleDebugging.java | 2 +- {logging => verifying}/SimpleFilter.java | 2 +- {logging => verifying}/SimpleFormatterExample.java | 2 +- {assertions => verifying}/build.gradle | 0 {logging => verifying}/log.prop | 2 +- 22 files changed, 20 insertions(+), 25 deletions(-) delete mode 100644 unittesting/build.gradle rename {assertions => verifying}/Assert1.java (94%) rename {assertions => verifying}/Assert2.java (95%) rename {logging => verifying}/ConfigureLogging.java (98%) rename {logging => verifying}/CustomHandler.java (97%) rename {logging => verifying}/InfoLogging.java (94%) rename {logging => verifying}/InfoLogging2.java (95%) rename {unittesting => verifying}/JUnitDemo.java (97%) rename {assertions => verifying}/LoaderAssertions.java (95%) rename {logging => verifying}/LogToFile.java (95%) rename {logging => verifying}/LogToFile2.java (96%) rename {logging => verifying}/LoggingLevelManipulation.java (99%) rename {logging => verifying}/LoggingLevels.java (98%) rename {logging => verifying}/MultipleHandlers.java (95%) rename {logging => verifying}/MultipleHandlers2.java (95%) rename {logging => verifying}/PrintableLogRecord.java (97%) rename {assertions => verifying}/Queue.java (98%) rename {debugging => verifying}/SimpleDebugging.java (96%) rename {logging => verifying}/SimpleFilter.java (97%) rename {logging => verifying}/SimpleFormatterExample.java (96%) rename {assertions => verifying}/build.gradle (100%) rename {logging => verifying}/log.prop (97%) diff --git a/unittesting/build.gradle b/unittesting/build.gradle deleted file mode 100644 index 7b6876d6e..000000000 --- a/unittesting/build.gradle +++ /dev/null @@ -1,3 +0,0 @@ -dependencies { - compile 'junit:junit:4.12' -} diff --git a/assertions/Assert1.java b/verifying/Assert1.java similarity index 94% rename from assertions/Assert1.java rename to verifying/Assert1.java index a0e0a8c5a..3ccef65e6 100644 --- a/assertions/Assert1.java +++ b/verifying/Assert1.java @@ -1,4 +1,4 @@ -// assertions/Assert1.java +// verifying/Assert1.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. diff --git a/assertions/Assert2.java b/verifying/Assert2.java similarity index 95% rename from assertions/Assert2.java rename to verifying/Assert2.java index 7d5cddcdb..e8475ea24 100644 --- a/assertions/Assert2.java +++ b/verifying/Assert2.java @@ -1,4 +1,4 @@ -// assertions/Assert2.java +// verifying/Assert2.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. diff --git a/logging/ConfigureLogging.java b/verifying/ConfigureLogging.java similarity index 98% rename from logging/ConfigureLogging.java rename to verifying/ConfigureLogging.java index 1e1f6bf30..5d174299f 100644 --- a/logging/ConfigureLogging.java +++ b/verifying/ConfigureLogging.java @@ -1,4 +1,4 @@ -// logging/ConfigureLogging.java +// verifying/ConfigureLogging.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. diff --git a/logging/CustomHandler.java b/verifying/CustomHandler.java similarity index 97% rename from logging/CustomHandler.java rename to verifying/CustomHandler.java index 823e092ce..e52b705ce 100644 --- a/logging/CustomHandler.java +++ b/verifying/CustomHandler.java @@ -1,4 +1,4 @@ -// logging/CustomHandler.java +// verifying/CustomHandler.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. diff --git a/logging/InfoLogging.java b/verifying/InfoLogging.java similarity index 94% rename from logging/InfoLogging.java rename to verifying/InfoLogging.java index 7fa19444c..352eeab4f 100644 --- a/logging/InfoLogging.java +++ b/verifying/InfoLogging.java @@ -1,4 +1,4 @@ -// logging/InfoLogging.java +// verifying/InfoLogging.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. diff --git a/logging/InfoLogging2.java b/verifying/InfoLogging2.java similarity index 95% rename from logging/InfoLogging2.java rename to verifying/InfoLogging2.java index dd4c93d39..5c422b3f9 100644 --- a/logging/InfoLogging2.java +++ b/verifying/InfoLogging2.java @@ -1,4 +1,4 @@ -// logging/InfoLogging2.java +// verifying/InfoLogging2.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. diff --git a/unittesting/JUnitDemo.java b/verifying/JUnitDemo.java similarity index 97% rename from unittesting/JUnitDemo.java rename to verifying/JUnitDemo.java index 8ad0a8466..59aa70bf3 100644 --- a/unittesting/JUnitDemo.java +++ b/verifying/JUnitDemo.java @@ -1,9 +1,8 @@ -// unittesting/JUnitDemo.java +// verifying/JUnitDemo.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. // Simple use of JUnit to test ArrayList -// (Install libraries from junit.org) import java.util.*; import org.junit.Test; import static org.junit.Assert.assertEquals; diff --git a/assertions/LoaderAssertions.java b/verifying/LoaderAssertions.java similarity index 95% rename from assertions/LoaderAssertions.java rename to verifying/LoaderAssertions.java index 28b640ffa..e9414d94f 100644 --- a/assertions/LoaderAssertions.java +++ b/verifying/LoaderAssertions.java @@ -1,4 +1,4 @@ -// assertions/LoaderAssertions.java +// verifying/LoaderAssertions.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. diff --git a/logging/LogToFile.java b/verifying/LogToFile.java similarity index 95% rename from logging/LogToFile.java rename to verifying/LogToFile.java index 22b408618..81bb58132 100644 --- a/logging/LogToFile.java +++ b/verifying/LogToFile.java @@ -1,4 +1,4 @@ -// logging/LogToFile.java +// verifying/LogToFile.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. diff --git a/logging/LogToFile2.java b/verifying/LogToFile2.java similarity index 96% rename from logging/LogToFile2.java rename to verifying/LogToFile2.java index b561e298d..39e6d685a 100644 --- a/logging/LogToFile2.java +++ b/verifying/LogToFile2.java @@ -1,4 +1,4 @@ -// logging/LogToFile2.java +// verifying/LogToFile2.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. diff --git a/logging/LoggingLevelManipulation.java b/verifying/LoggingLevelManipulation.java similarity index 99% rename from logging/LoggingLevelManipulation.java rename to verifying/LoggingLevelManipulation.java index ec00a4859..157590d81 100644 --- a/logging/LoggingLevelManipulation.java +++ b/verifying/LoggingLevelManipulation.java @@ -1,4 +1,4 @@ -// logging/LoggingLevelManipulation.java +// verifying/LoggingLevelManipulation.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. diff --git a/logging/LoggingLevels.java b/verifying/LoggingLevels.java similarity index 98% rename from logging/LoggingLevels.java rename to verifying/LoggingLevels.java index 362c8133d..552b7b63a 100644 --- a/logging/LoggingLevels.java +++ b/verifying/LoggingLevels.java @@ -1,4 +1,4 @@ -// logging/LoggingLevels.java +// verifying/LoggingLevels.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. diff --git a/logging/MultipleHandlers.java b/verifying/MultipleHandlers.java similarity index 95% rename from logging/MultipleHandlers.java rename to verifying/MultipleHandlers.java index 1c5335dc2..6be245cf8 100644 --- a/logging/MultipleHandlers.java +++ b/verifying/MultipleHandlers.java @@ -1,4 +1,4 @@ -// logging/MultipleHandlers.java +// verifying/MultipleHandlers.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. diff --git a/logging/MultipleHandlers2.java b/verifying/MultipleHandlers2.java similarity index 95% rename from logging/MultipleHandlers2.java rename to verifying/MultipleHandlers2.java index 8177a1aaf..d4098a9e4 100644 --- a/logging/MultipleHandlers2.java +++ b/verifying/MultipleHandlers2.java @@ -1,4 +1,4 @@ -// logging/MultipleHandlers2.java +// verifying/MultipleHandlers2.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. diff --git a/logging/PrintableLogRecord.java b/verifying/PrintableLogRecord.java similarity index 97% rename from logging/PrintableLogRecord.java rename to verifying/PrintableLogRecord.java index 3de032b29..06d8f4fe9 100644 --- a/logging/PrintableLogRecord.java +++ b/verifying/PrintableLogRecord.java @@ -1,4 +1,4 @@ -// logging/PrintableLogRecord.java +// verifying/PrintableLogRecord.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. diff --git a/assertions/Queue.java b/verifying/Queue.java similarity index 98% rename from assertions/Queue.java rename to verifying/Queue.java index 8d6b43567..6138dc44a 100644 --- a/assertions/Queue.java +++ b/verifying/Queue.java @@ -1,10 +1,9 @@ -// assertions/Queue.java +// verifying/Queue.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. // Demonstration of Design by Contract (DbC) // combined with white-box unit testing -// (Install libraries from www.junit.org) import java.util.*; import org.junit.Test; import static org.junit.Assert.assertEquals; diff --git a/debugging/SimpleDebugging.java b/verifying/SimpleDebugging.java similarity index 96% rename from debugging/SimpleDebugging.java rename to verifying/SimpleDebugging.java index 4a78dc95c..f5568d8b2 100644 --- a/debugging/SimpleDebugging.java +++ b/verifying/SimpleDebugging.java @@ -1,4 +1,4 @@ -// debugging/SimpleDebugging.java +// verifying/SimpleDebugging.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. diff --git a/logging/SimpleFilter.java b/verifying/SimpleFilter.java similarity index 97% rename from logging/SimpleFilter.java rename to verifying/SimpleFilter.java index 106008f76..eb461933c 100644 --- a/logging/SimpleFilter.java +++ b/verifying/SimpleFilter.java @@ -1,4 +1,4 @@ -// logging/SimpleFilter.java +// verifying/SimpleFilter.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. diff --git a/logging/SimpleFormatterExample.java b/verifying/SimpleFormatterExample.java similarity index 96% rename from logging/SimpleFormatterExample.java rename to verifying/SimpleFormatterExample.java index cfbb7a99a..3c8a1dfda 100644 --- a/logging/SimpleFormatterExample.java +++ b/verifying/SimpleFormatterExample.java @@ -1,4 +1,4 @@ -// logging/SimpleFormatterExample.java +// verifying/SimpleFormatterExample.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. diff --git a/assertions/build.gradle b/verifying/build.gradle similarity index 100% rename from assertions/build.gradle rename to verifying/build.gradle diff --git a/logging/log.prop b/verifying/log.prop similarity index 97% rename from logging/log.prop rename to verifying/log.prop index 59f2f7ff5..aa3556a65 100644 --- a/logging/log.prop +++ b/verifying/log.prop @@ -1,4 +1,4 @@ -// logging/log.prop +// verifying/log.prop #### Configuration File #### # Global Params # Handlers installed for the root logger From a2cb2486f5114d015021a221d8c8e0cb7d355346 Mon Sep 17 00:00:00 2001 From: Bruce Eckel Date: Tue, 9 Aug 2016 16:15:05 -0600 Subject: [PATCH 080/320] log4j added to dependencies --- build.gradle | 2 ++ 1 file changed, 2 insertions(+) diff --git a/build.gradle b/build.gradle index 417541f93..5b6097b74 100644 --- a/build.gradle +++ b/build.gradle @@ -225,6 +225,8 @@ configure(subprojects - project(':onjava')) { dependencies { compile project(':onjava') compile "org.openjdk.jmh:jmh-core:${jmh.jmhVersion}" + compile group: 'org.apache.logging.log4j', name: 'log4j-api', version: '2.6.2' + compile group: 'org.apache.logging.log4j', name: 'log4j-core', version: '2.6.2' } } From abf72d07102b9bbcab1c5cd0c9550efbbd21bee5 Mon Sep 17 00:00:00 2001 From: Bruce Eckel Date: Tue, 9 Aug 2016 17:51:55 -0600 Subject: [PATCH 081/320] Logging section not failing log4j2.xml is still not being seen, though --- verifying/ConfigureLogging.java | 102 ------------- verifying/CustomHandler.java | 47 ------ verifying/InfoLogging.java | 6 +- verifying/InfoLogging2.java | 21 --- verifying/LogToFile.java | 22 --- verifying/LogToFile2.java | 24 ---- verifying/LoggingLevelManipulation.java | 184 ------------------------ verifying/LoggingLevels.java | 33 ++--- verifying/MultipleHandlers.java | 27 ---- verifying/MultipleHandlers2.java | 26 ---- verifying/PrintableLogRecord.java | 60 -------- verifying/SimpleFilter.java | 45 ------ verifying/SimpleFormatterExample.java | 38 ----- verifying/log.prop | 32 ----- verifying/log4j2.xml | 14 ++ 15 files changed, 34 insertions(+), 647 deletions(-) delete mode 100644 verifying/ConfigureLogging.java delete mode 100644 verifying/CustomHandler.java delete mode 100644 verifying/InfoLogging2.java delete mode 100644 verifying/LogToFile.java delete mode 100644 verifying/LogToFile2.java delete mode 100644 verifying/LoggingLevelManipulation.java delete mode 100644 verifying/MultipleHandlers.java delete mode 100644 verifying/MultipleHandlers2.java delete mode 100644 verifying/PrintableLogRecord.java delete mode 100644 verifying/SimpleFilter.java delete mode 100644 verifying/SimpleFormatterExample.java delete mode 100644 verifying/log.prop create mode 100644 verifying/log4j2.xml diff --git a/verifying/ConfigureLogging.java b/verifying/ConfigureLogging.java deleted file mode 100644 index 5d174299f..000000000 --- a/verifying/ConfigureLogging.java +++ /dev/null @@ -1,102 +0,0 @@ -// verifying/ConfigureLogging.java -// (c)2016 MindView LLC: see Copyright.txt -// We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. -// {java ConfigureLogging -// -Djava.util.logging.config.file=log.prop} -// {ErrorOutputExpected} -import java.util.logging.*; - -public class ConfigureLogging { - static Logger - lgr = Logger.getLogger("com"), - lgr2 = Logger.getLogger("com.mindviewinc"), - util= Logger.getLogger("onjava"), - test= Logger.getLogger("com.mindviewinc.test"), - rand = Logger.getLogger("random"); - public ConfigureLogging() { - /* - Set Additional formatters, Filters and - Handlers for the loggers here. You cannot - specify the Handlers for loggers except - the root logger from the configuration - file. - */ - } - public static void main(String[] args) { - sendLogMessages(lgr); - sendLogMessages(lgr2); - sendLogMessages(util); - sendLogMessages(test); - sendLogMessages(rand); - } - private static void - sendLogMessages(Logger logger) { - System.out.println(" Logger Name : " - + logger.getName() + " Level: " - + logger.getLevel()); - logger.finest("Finest"); - logger.finer("Finer"); - logger.fine("Fine"); - logger.config("Config"); - logger.info("Info"); - logger.warning("Warning"); - logger.severe("Severe"); - } -} -/* Output: - Logger Name : com Level: null - Logger Name : com.mindviewinc Level: FINEST - Logger Name : onjava Level: INFO - Logger Name : com.mindviewinc.test Level: FINER - Logger Name : random Level: SEVERE -___[ Error Output ]___ -Jul 27, 2016 10:50:38 AM ConfigureLogging sendLogMessages -FINEST: Finest -Jul 27, 2016 10:50:38 AM ConfigureLogging sendLogMessages -FINER: Finer -Jul 27, 2016 10:50:38 AM ConfigureLogging sendLogMessages -FINE: Fine -Jul 27, 2016 10:50:38 AM ConfigureLogging sendLogMessages -CONFIG: Config -Jul 27, 2016 10:50:38 AM ConfigureLogging sendLogMessages -INFO: Info -Jul 27, 2016 10:50:38 AM ConfigureLogging sendLogMessages -WARNING: Warning -Jul 27, 2016 10:50:38 AM ConfigureLogging sendLogMessages -SEVERE: Severe -Jul 27, 2016 10:50:38 AM ConfigureLogging sendLogMessages -FINEST: Finest -Jul 27, 2016 10:50:38 AM ConfigureLogging sendLogMessages -FINER: Finer -Jul 27, 2016 10:50:38 AM ConfigureLogging sendLogMessages -FINE: Fine -Jul 27, 2016 10:50:38 AM ConfigureLogging sendLogMessages -CONFIG: Config -Jul 27, 2016 10:50:38 AM ConfigureLogging sendLogMessages -INFO: Info -Jul 27, 2016 10:50:38 AM ConfigureLogging sendLogMessages -WARNING: Warning -Jul 27, 2016 10:50:38 AM ConfigureLogging sendLogMessages -SEVERE: Severe -Jul 27, 2016 10:50:38 AM ConfigureLogging sendLogMessages -INFO: Info -Jul 27, 2016 10:50:38 AM ConfigureLogging sendLogMessages -WARNING: Warning -Jul 27, 2016 10:50:38 AM ConfigureLogging sendLogMessages -SEVERE: Severe -Jul 27, 2016 10:50:38 AM ConfigureLogging sendLogMessages -FINER: Finer -Jul 27, 2016 10:50:38 AM ConfigureLogging sendLogMessages -FINE: Fine -Jul 27, 2016 10:50:38 AM ConfigureLogging sendLogMessages -CONFIG: Config -Jul 27, 2016 10:50:38 AM ConfigureLogging sendLogMessages -INFO: Info -Jul 27, 2016 10:50:38 AM ConfigureLogging sendLogMessages -WARNING: Warning -Jul 27, 2016 10:50:38 AM ConfigureLogging sendLogMessages -SEVERE: Severe -Jul 27, 2016 10:50:38 AM ConfigureLogging sendLogMessages -SEVERE: Severe -*/ diff --git a/verifying/CustomHandler.java b/verifying/CustomHandler.java deleted file mode 100644 index e52b705ce..000000000 --- a/verifying/CustomHandler.java +++ /dev/null @@ -1,47 +0,0 @@ -// verifying/CustomHandler.java -// (c)2016 MindView LLC: see Copyright.txt -// We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. -// How to write custom handler -// {ErrorOutputExpected} -import java.util.logging.*; -import java.util.*; - -public class CustomHandler { - private static Logger logger = - Logger.getLogger("CustomHandler"); - private static List trace = - new ArrayList<>(); - public static void main(String[] args) { - logger.addHandler(new Handler() { - @Override - public void publish(LogRecord logRecord) { - trace.add(logRecord.getLevel() + ":"); - trace.add(logRecord.getSourceClassName() - + ":"); - trace.add( - logRecord.getSourceMethodName() +":"); - trace.add("<" + logRecord.getMessage() - + ">"); - trace.add("\n"); - } - @Override - public void flush() {} - @Override - public void close() {} - }); - logger.warning("Logging Warning"); - logger.info("Logging Info"); - System.out.print(trace); - } -} -/* Output: -[WARNING:, CustomHandler:, main:, , -, INFO:, CustomHandler:, main:, , -] -___[ Error Output ]___ -Jul 27, 2016 10:50:39 AM CustomHandler main -WARNING: Logging Warning -Jul 27, 2016 10:50:39 AM CustomHandler main -INFO: Logging Info -*/ diff --git a/verifying/InfoLogging.java b/verifying/InfoLogging.java index 352eeab4f..d56ee75d1 100644 --- a/verifying/InfoLogging.java +++ b/verifying/InfoLogging.java @@ -3,11 +3,11 @@ // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. // {ErrorOutputExpected} -import java.util.logging.*; +import org.apache.logging.log4j.*; public class InfoLogging { - private static Logger logger = - Logger.getLogger("InfoLogging"); + private static final Logger logger = + LogManager.getLogger(InfoLogging.class); public static void main(String[] args) { logger.info("Logging: INFO-level message"); } diff --git a/verifying/InfoLogging2.java b/verifying/InfoLogging2.java deleted file mode 100644 index 5c422b3f9..000000000 --- a/verifying/InfoLogging2.java +++ /dev/null @@ -1,21 +0,0 @@ -// verifying/InfoLogging2.java -// (c)2016 MindView LLC: see Copyright.txt -// We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. -// Guaranteeing proper class and method names -// {ErrorOutputExpected} -import java.util.logging.*; - -public class InfoLogging2 { - private static Logger logger = - Logger.getLogger("InfoLogging2"); - public static void main(String[] args) { - logger.logp(Level.INFO, "InfoLogging2", - "main", "Logging an INFO-level message"); - } -} -/* Output: -___[ Error Output ]___ -Jul 27, 2016 10:50:40 AM InfoLogging2 main -INFO: Logging an INFO-level message -*/ diff --git a/verifying/LogToFile.java b/verifying/LogToFile.java deleted file mode 100644 index 81bb58132..000000000 --- a/verifying/LogToFile.java +++ /dev/null @@ -1,22 +0,0 @@ -// verifying/LogToFile.java -// (c)2016 MindView LLC: see Copyright.txt -// We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. -// {ErrorOutputExpected} -import java.util.logging.*; - -public class LogToFile { - private static Logger logger = - Logger.getLogger("LogToFile"); - public static void - main(String[] args) throws Exception { - logger.addHandler( - new FileHandler("LogToFile.xml")); - logger.info("A message logged to the file"); - } -} -/* Output: -___[ Error Output ]___ -Jul 27, 2016 10:50:41 AM LogToFile main -INFO: A message logged to the file -*/ diff --git a/verifying/LogToFile2.java b/verifying/LogToFile2.java deleted file mode 100644 index 39e6d685a..000000000 --- a/verifying/LogToFile2.java +++ /dev/null @@ -1,24 +0,0 @@ -// verifying/LogToFile2.java -// (c)2016 MindView LLC: see Copyright.txt -// We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. -// {ErrorOutputExpected} -import java.util.logging.*; - -public class LogToFile2 { - private static Logger logger = - Logger.getLogger("LogToFile2"); - public static void - main(String[] args) throws Exception { - FileHandler logFile = - new FileHandler("LogToFile2.txt"); - logFile.setFormatter(new SimpleFormatter()); - logger.addHandler(logFile); - logger.info("A message logged to the file"); - } -} -/* Output: -___[ Error Output ]___ -Jul 27, 2016 10:50:41 AM LogToFile2 main -INFO: A message logged to the file -*/ diff --git a/verifying/LoggingLevelManipulation.java b/verifying/LoggingLevelManipulation.java deleted file mode 100644 index 157590d81..000000000 --- a/verifying/LoggingLevelManipulation.java +++ /dev/null @@ -1,184 +0,0 @@ -// verifying/LoggingLevelManipulation.java -// (c)2016 MindView LLC: see Copyright.txt -// We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. -// {ErrorOutputExpected} -import java.util.logging.Level; -import java.util.logging.Logger; - -public class LoggingLevelManipulation { - private static Logger - lgr = Logger.getLogger("com"), - lgr2 = Logger.getLogger("com.mindviewinc"), - util= Logger.getLogger("onjava"), - test= Logger.getLogger("com.mindviewinc.test"), - rand = Logger.getLogger("random"); - static void printLogMessages(Logger logger) { - logger.finest(logger.getName() + " Finest"); - logger.finer(logger.getName() + " Finer"); - logger.fine(logger.getName() + " Fine"); - logger.config(logger.getName() + " Config"); - logger.info(logger.getName() + " Info"); - logger.warning(logger.getName()+" Warning"); - logger.severe(logger.getName() + " Severe"); - } - static void logMessages() { - printLogMessages(lgr); - printLogMessages(lgr2); - printLogMessages(util); - printLogMessages(test); - printLogMessages(rand); - } - static void printLevels() { - System.out.println(" -- printing levels -- " - + lgr.getName() - + " : " + lgr.getLevel() - + " " + lgr2.getName() - + " : " + lgr2.getLevel() - + " " + util.getName() - + " : " + util.getLevel() - + " " + test.getName() - + " : " + test.getLevel() - + " " + rand.getName() - + " : " + rand.getLevel()); - } - public static void main(String[] args) { - printLevels(); - lgr.setLevel(Level.SEVERE); - printLevels(); - System.out.println("net level: SEVERE"); - logMessages(); - util.setLevel(Level.FINEST); - test.setLevel(Level.FINEST); - rand.setLevel(Level.FINEST); - printLevels(); - System.out.println( - "individual loggers set to FINEST"); - logMessages(); - lgr.setLevel(Level.FINEST); - printLevels(); - System.out.println("net level: FINEST"); - logMessages(); - } -} -/* Output: - -- printing levels -- com : null com.mindviewinc : null -onjava : null com.mindviewinc.test : null random : null - -- printing levels -- com : SEVERE com.mindviewinc : null -onjava : null com.mindviewinc.test : null random : null -net level: SEVERE - -- printing levels -- com : SEVERE com.mindviewinc : null -onjava : FINEST com.mindviewinc.test : FINEST random : -FINEST -individual loggers set to FINEST - -- printing levels -- com : FINEST com.mindviewinc : null -onjava : FINEST com.mindviewinc.test : FINEST random : -FINEST -net level: FINEST -___[ Error Output ]___ -Jul 27, 2016 10:50:42 AM LoggingLevelManipulation -printLogMessages -SEVERE: com Severe -Jul 27, 2016 10:50:42 AM LoggingLevelManipulation -printLogMessages -SEVERE: com.mindviewinc Severe -Jul 27, 2016 10:50:42 AM LoggingLevelManipulation -printLogMessages -INFO: onjava Info -Jul 27, 2016 10:50:42 AM LoggingLevelManipulation -printLogMessages -WARNING: onjava Warning -Jul 27, 2016 10:50:42 AM LoggingLevelManipulation -printLogMessages -SEVERE: onjava Severe -Jul 27, 2016 10:50:42 AM LoggingLevelManipulation -printLogMessages -SEVERE: com.mindviewinc.test Severe -Jul 27, 2016 10:50:42 AM LoggingLevelManipulation -printLogMessages -INFO: random Info -Jul 27, 2016 10:50:42 AM LoggingLevelManipulation -printLogMessages -WARNING: random Warning -Jul 27, 2016 10:50:42 AM LoggingLevelManipulation -printLogMessages -SEVERE: random Severe -Jul 27, 2016 10:50:42 AM LoggingLevelManipulation -printLogMessages -SEVERE: com Severe -Jul 27, 2016 10:50:42 AM LoggingLevelManipulation -printLogMessages -SEVERE: com.mindviewinc Severe -Jul 27, 2016 10:50:42 AM LoggingLevelManipulation -printLogMessages -INFO: onjava Info -Jul 27, 2016 10:50:42 AM LoggingLevelManipulation -printLogMessages -WARNING: onjava Warning -Jul 27, 2016 10:50:42 AM LoggingLevelManipulation -printLogMessages -SEVERE: onjava Severe -Jul 27, 2016 10:50:42 AM LoggingLevelManipulation -printLogMessages -INFO: com.mindviewinc.test Info -Jul 27, 2016 10:50:42 AM LoggingLevelManipulation -printLogMessages -WARNING: com.mindviewinc.test Warning -Jul 27, 2016 10:50:42 AM LoggingLevelManipulation -printLogMessages -SEVERE: com.mindviewinc.test Severe -Jul 27, 2016 10:50:42 AM LoggingLevelManipulation -printLogMessages -INFO: random Info -Jul 27, 2016 10:50:42 AM LoggingLevelManipulation -printLogMessages -WARNING: random Warning -Jul 27, 2016 10:50:42 AM LoggingLevelManipulation -printLogMessages -SEVERE: random Severe -Jul 27, 2016 10:50:42 AM LoggingLevelManipulation -printLogMessages -INFO: com Info -Jul 27, 2016 10:50:42 AM LoggingLevelManipulation -printLogMessages -WARNING: com Warning -Jul 27, 2016 10:50:42 AM LoggingLevelManipulation -printLogMessages -SEVERE: com Severe -Jul 27, 2016 10:50:42 AM LoggingLevelManipulation -printLogMessages -INFO: com.mindviewinc Info -Jul 27, 2016 10:50:42 AM LoggingLevelManipulation -printLogMessages -WARNING: com.mindviewinc Warning -Jul 27, 2016 10:50:42 AM LoggingLevelManipulation -printLogMessages -SEVERE: com.mindviewinc Severe -Jul 27, 2016 10:50:42 AM LoggingLevelManipulation -printLogMessages -INFO: onjava Info -Jul 27, 2016 10:50:42 AM LoggingLevelManipulation -printLogMessages -WARNING: onjava Warning -Jul 27, 2016 10:50:42 AM LoggingLevelManipulation -printLogMessages -SEVERE: onjava Severe -Jul 27, 2016 10:50:42 AM LoggingLevelManipulation -printLogMessages -INFO: com.mindviewinc.test Info -Jul 27, 2016 10:50:42 AM LoggingLevelManipulation -printLogMessages -WARNING: com.mindviewinc.test Warning -Jul 27, 2016 10:50:42 AM LoggingLevelManipulation -printLogMessages -SEVERE: com.mindviewinc.test Severe -Jul 27, 2016 10:50:42 AM LoggingLevelManipulation -printLogMessages -INFO: random Info -Jul 27, 2016 10:50:42 AM LoggingLevelManipulation -printLogMessages -WARNING: random Warning -Jul 27, 2016 10:50:42 AM LoggingLevelManipulation -printLogMessages -SEVERE: random Severe -*/ diff --git a/verifying/LoggingLevels.java b/verifying/LoggingLevels.java index 552b7b63a..ede87cbe5 100644 --- a/verifying/LoggingLevels.java +++ b/verifying/LoggingLevels.java @@ -3,35 +3,36 @@ // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. // {ErrorOutputExpected} -import java.util.logging.Level; -import java.util.logging.Logger; +import org.apache.logging.log4j.*; +import org.apache.logging.log4j.spi.*; +import org.apache.logging.log4j.core.config.Configurator; public class LoggingLevels { private static Logger - lgr = Logger.getLogger("com"), - lgr2 = Logger.getLogger("com.mindviewinc"), - util= Logger.getLogger("onjava"), - test= Logger.getLogger("com.mindviewinc.test"), - rand = Logger.getLogger("random"); + lgr = LogManager.getLogger("com"), + lgr2 = LogManager.getLogger("com.mindviewinc"), + util= LogManager.getLogger("onjava"), + test= LogManager.getLogger("com.mindviewinc.test"), + rand = LogManager.getLogger("random"); private static void logMessages() { lgr.info("com : info"); lgr2.info("com.mindviewinc : info"); util.info("util : info"); - test.severe("test : severe"); + test.fatal("test : fatal"); rand.info("random : info"); } public static void main(String[] args) { - lgr.setLevel(Level.SEVERE); - System.out.println("com level: SEVERE"); + Configurator.setLevel("com", Level.FATAL); + System.out.println("com level: FATAL"); logMessages(); - util.setLevel(Level.FINEST); - test.setLevel(Level.FINEST); - rand.setLevel(Level.FINEST); + Configurator.setLevel("onjava", Level.TRACE); + Configurator.setLevel("com.mindviewinc.test", Level.TRACE); + Configurator.setLevel("random", Level.TRACE); System.out.println( - "individual loggers set to FINEST"); + "individual loggers set to TRACE"); logMessages(); - lgr.setLevel(Level.SEVERE); - System.out.println("com level: SEVERE"); + Configurator.setLevel("com", Level.FATAL); + System.out.println("com level: FATAL"); logMessages(); } } diff --git a/verifying/MultipleHandlers.java b/verifying/MultipleHandlers.java deleted file mode 100644 index 6be245cf8..000000000 --- a/verifying/MultipleHandlers.java +++ /dev/null @@ -1,27 +0,0 @@ -// verifying/MultipleHandlers.java -// (c)2016 MindView LLC: see Copyright.txt -// We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. -// {ErrorOutputExpected} -import java.util.logging.*; - -public class MultipleHandlers { - private static Logger logger = - Logger.getLogger("MultipleHandlers"); - public static void - main(String[] args) throws Exception { - FileHandler logFile = - new FileHandler("MultipleHandlers.xml"); - logger.addHandler(logFile); - logger.addHandler(new ConsoleHandler()); - logger.warning( - "Output to multiple handlers"); - } -} -/* Output: -___[ Error Output ]___ -Jul 27, 2016 10:50:43 AM MultipleHandlers main -WARNING: Output to multiple handlers -Jul 27, 2016 10:50:43 AM MultipleHandlers main -WARNING: Output to multiple handlers -*/ diff --git a/verifying/MultipleHandlers2.java b/verifying/MultipleHandlers2.java deleted file mode 100644 index d4098a9e4..000000000 --- a/verifying/MultipleHandlers2.java +++ /dev/null @@ -1,26 +0,0 @@ -// verifying/MultipleHandlers2.java -// (c)2016 MindView LLC: see Copyright.txt -// We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. -// {ErrorOutputExpected} -import java.util.logging.*; - -public class MultipleHandlers2 { - private static Logger logger = - Logger.getLogger("MultipleHandlers2"); - public static void - main(String[] args) throws Exception { - FileHandler logFile = - new FileHandler("MultipleHandlers2.xml"); - logger.addHandler(logFile); - logger.addHandler(new ConsoleHandler()); - logger.setUseParentHandlers(false); - logger.warning( - "Output to multiple handlers"); - } -} -/* Output: -___[ Error Output ]___ -Jul 27, 2016 10:50:43 AM MultipleHandlers2 main -WARNING: Output to multiple handlers -*/ diff --git a/verifying/PrintableLogRecord.java b/verifying/PrintableLogRecord.java deleted file mode 100644 index 06d8f4fe9..000000000 --- a/verifying/PrintableLogRecord.java +++ /dev/null @@ -1,60 +0,0 @@ -// verifying/PrintableLogRecord.java -// (c)2016 MindView LLC: see Copyright.txt -// We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. -// Override LogRecord toString() -import java.util.logging.*; - -public class PrintableLogRecord extends LogRecord { - public PrintableLogRecord(Level level, String str) { - super(level, str); - } - @Override - public String toString() { - String result = "Level<" + getLevel()+ ">\n" - + "LoggerName<" + getLoggerName() + ">\n" - + "Message<" + getMessage() + ">\n" - + "CurrentMillis<" + getMillis() + ">\n" - + "Params"; - Object[] objParams = getParameters(); - if(objParams == null) - result += "\n"; - else - for(int i = 0; i < objParams.length; i++) - result += " Param # <" + i + " value "+ - objParams[i].toString() + ">\n"; - result += "ResourceBundle<" - + getResourceBundle() - + ">\nResourceBundleName<" - + getResourceBundleName() - + ">\nSequenceNumber<" - + getSequenceNumber() - + ">\nSourceClassName<" - + getSourceClassName() - + ">\nSourceMethodName<" - + getSourceMethodName() - + ">\nThread Id<" + getThreadID() - + ">\nThrown<" + getThrown() + ">"; - return result; - } - public static void main(String[] args) { - PrintableLogRecord logRecord = - new PrintableLogRecord( - Level.FINEST, "Simple Log Record"); - System.out.println(logRecord); - } -} -/* Output: -Level -LoggerName -Message -CurrentMillis<1469638244376> -Params -ResourceBundle -ResourceBundleName -SequenceNumber<0> -SourceClassName -SourceMethodName -Thread Id<1> -Thrown -*/ diff --git a/verifying/SimpleFilter.java b/verifying/SimpleFilter.java deleted file mode 100644 index eb461933c..000000000 --- a/verifying/SimpleFilter.java +++ /dev/null @@ -1,45 +0,0 @@ -// verifying/SimpleFilter.java -// (c)2016 MindView LLC: see Copyright.txt -// We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. -// {ErrorOutputExpected} -import java.util.logging.*; - -public class SimpleFilter { - private static Logger logger = - Logger.getLogger("SimpleFilter"); - static class Duck {}; - static class Wombat {}; - static void sendLogMessages() { - logger.log(Level.WARNING, - "A duck in the house!", new Duck()); - logger.log(Level.WARNING, - "A Wombat at large!", new Wombat()); - } - public static void main(String[] args) { - sendLogMessages(); - logger.setFilter(record -> { - Object[] params = - record.getParameters(); - if(params == null) - return true; // No parameters - if(record.getParameters()[0] - instanceof Duck) - return true; // Only log Ducks - return false; - }); - logger.info("After setting filter.."); - sendLogMessages(); - } -} -/* Output: -___[ Error Output ]___ -Jul 27, 2016 10:50:44 AM SimpleFilter sendLogMessages -WARNING: A duck in the house! -Jul 27, 2016 10:50:44 AM SimpleFilter sendLogMessages -WARNING: A Wombat at large! -Jul 27, 2016 10:50:44 AM SimpleFilter main -INFO: After setting filter.. -Jul 27, 2016 10:50:44 AM SimpleFilter sendLogMessages -WARNING: A duck in the house! -*/ diff --git a/verifying/SimpleFormatterExample.java b/verifying/SimpleFormatterExample.java deleted file mode 100644 index 3c8a1dfda..000000000 --- a/verifying/SimpleFormatterExample.java +++ /dev/null @@ -1,38 +0,0 @@ -// verifying/SimpleFormatterExample.java -// (c)2016 MindView LLC: see Copyright.txt -// We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. -// {ErrorOutputExpected} -import java.util.logging.*; - -public class SimpleFormatterExample { - private static Logger logger = - Logger.getLogger("SimpleFormatterExample"); - private static void logMessages() { - logger.info("Line One"); - logger.info("Line Two"); - } - public static void main(String[] args) { - logger.setUseParentHandlers(false); - Handler conHdlr = new ConsoleHandler(); - conHdlr.setFormatter(new Formatter() { - public String format(LogRecord record) { - return record.getLevel() + " : " - + record.getSourceClassName() - + " -:- " - + record.getSourceMethodName() - + " -:- " - + record.getMessage() + "\n"; - } - }); - logger.addHandler(conHdlr); - logMessages(); - } -} -/* Output: -___[ Error Output ]___ -INFO : SimpleFormatterExample -:- logMessages -:- Line -One -INFO : SimpleFormatterExample -:- logMessages -:- Line -Two -*/ diff --git a/verifying/log.prop b/verifying/log.prop deleted file mode 100644 index aa3556a65..000000000 --- a/verifying/log.prop +++ /dev/null @@ -1,32 +0,0 @@ -// verifying/log.prop -#### Configuration File #### -# Global Params -# Handlers installed for the root logger -handlers= java.util.logging.ConsoleHandler java.util.logging.FileHandler -# Level for root logger--is used by any logger -# that does not have its level set -.level= FINEST -# Initialization class--the public no-arg constructor -# of this class is called by the Logging framework -config = ConfigureLogging - -# Configure FileHandler -# Logging file name - %u specifies unique -java.util.logging.FileHandler.pattern = java%g.log -# Write 100000 bytes before rotating this file -java.util.logging.FileHandler.limit = 100000 -# Number of rotating files -java.util.logging.FileHandler.count = 3 -# Formatter for this FileHandler -java.util.logging.FileHandler.formatter = java.util.logging.SimpleFormatter - -# Configure ConsoleHandler -java.util.logging.ConsoleHandler.level = FINEST -java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter - -# Set Logger Levels # -net.level=SEVERE -com.mindviewinc.level = FINEST -onjava.level = INFO -com.mindviewinc.test.level = FINER -random.level= SEVERE diff --git a/verifying/log4j2.xml b/verifying/log4j2.xml new file mode 100644 index 000000000..5db2c883f --- /dev/null +++ b/verifying/log4j2.xml @@ -0,0 +1,14 @@ +// verifying/log4j2.xml + + + + + + + + + + + + + From 79279957dc6c426b4b6cab85a79bac4c5dbde87f Mon Sep 17 00:00:00 2001 From: Bruce Eckel Date: Wed, 10 Aug 2016 10:36:16 -0600 Subject: [PATCH 082/320] Combined all subproject build.gradles into master --- build.gradle | 69 +++++++++++++++++++++++++++ collections/build.gradle | 3 -- generics/build.gradle | 3 -- hiding/build.gradle | 3 -- interfaces/build.gradle | 3 -- references/build.gradle | 3 -- serialization/build.gradle | 9 ---- settings.gradle | 3 +- strings/build.gradle | 3 -- threads/build.gradle | 3 -- understandingcollections/build.gradle | 8 ---- verifying/build.gradle | 3 -- 12 files changed, 71 insertions(+), 42 deletions(-) delete mode 100644 collections/build.gradle delete mode 100644 generics/build.gradle delete mode 100644 hiding/build.gradle delete mode 100644 interfaces/build.gradle delete mode 100644 references/build.gradle delete mode 100644 serialization/build.gradle delete mode 100644 strings/build.gradle delete mode 100644 threads/build.gradle delete mode 100644 understandingcollections/build.gradle delete mode 100644 verifying/build.gradle diff --git a/build.gradle b/build.gradle index 5b6097b74..b457434a8 100644 --- a/build.gradle +++ b/build.gradle @@ -221,6 +221,75 @@ subprojects { task run(dependsOn: createdTasks) } +project(':verifying') { + dependencies { + compile 'junit:junit:4.12' + } +} + +project(':understandingcollections') { + dependencies { + compile project(':typeinfo') + compile project(':collections') + } + jmh { + include = 'understandingcollections.jmhtests.*' + } +} + +project(':threads') { + dependencies { + compile project(':enums') + } +} + +project(':strings') { + dependencies { + compile project(':generics') + } +} + +project(':serialization') { + configurations.all { + resolutionStrategy { + force 'xml-apis:xml-apis:1.0.b2' + } + } + dependencies { + compile 'com.io7m.xom:xom:1.2.10' + } +} + +project(':references') { + dependencies { + compile 'junit:junit:4.12' + } +} + +project(':interfaces') { + dependencies { + compile project(':polymorphism') + } +} + +project(':hiding') { + dependencies { + compile project(':com') + } +} + +project(':generics') { + dependencies { + compile project(':typeinfo') + } +} + +project(':collections') { + dependencies { + compile project(':typeinfo') + } +} + configure(subprojects - project(':onjava')) { dependencies { compile project(':onjava') diff --git a/collections/build.gradle b/collections/build.gradle deleted file mode 100644 index 6b3f49b58..000000000 --- a/collections/build.gradle +++ /dev/null @@ -1,3 +0,0 @@ -dependencies { - compile project(':typeinfo') -} diff --git a/generics/build.gradle b/generics/build.gradle deleted file mode 100644 index 6b3f49b58..000000000 --- a/generics/build.gradle +++ /dev/null @@ -1,3 +0,0 @@ -dependencies { - compile project(':typeinfo') -} diff --git a/hiding/build.gradle b/hiding/build.gradle deleted file mode 100644 index f1b2e23ad..000000000 --- a/hiding/build.gradle +++ /dev/null @@ -1,3 +0,0 @@ -dependencies { - compile project(':com') -} diff --git a/interfaces/build.gradle b/interfaces/build.gradle deleted file mode 100644 index 2730e045f..000000000 --- a/interfaces/build.gradle +++ /dev/null @@ -1,3 +0,0 @@ -dependencies { - compile project(':polymorphism') -} diff --git a/references/build.gradle b/references/build.gradle deleted file mode 100644 index 7b6876d6e..000000000 --- a/references/build.gradle +++ /dev/null @@ -1,3 +0,0 @@ -dependencies { - compile 'junit:junit:4.12' -} diff --git a/serialization/build.gradle b/serialization/build.gradle deleted file mode 100644 index 042afca5c..000000000 --- a/serialization/build.gradle +++ /dev/null @@ -1,9 +0,0 @@ -configurations.all { - resolutionStrategy { - force 'xml-apis:xml-apis:1.0.b2' - } -} - -dependencies { - compile 'com.io7m.xom:xom:1.2.10' -} diff --git a/settings.gradle b/settings.gradle index 247e44520..376ca1053 100644 --- a/settings.gradle +++ b/settings.gradle @@ -4,7 +4,8 @@ def isSubproject = { File file -> !file.name.contains('.gradle') && !file.name.contains('.idea') && !file.name.contains('build') && - !file.name.contains('gradle') + !file.name.contains('gradle') && + !file.name.contains('test') } String[] subprojects = rootDir.listFiles().findAll(isSubproject).collect { it.name } diff --git a/strings/build.gradle b/strings/build.gradle deleted file mode 100644 index 40df7aba3..000000000 --- a/strings/build.gradle +++ /dev/null @@ -1,3 +0,0 @@ -dependencies { - compile project(':generics') -} diff --git a/threads/build.gradle b/threads/build.gradle deleted file mode 100644 index da12aa0a3..000000000 --- a/threads/build.gradle +++ /dev/null @@ -1,3 +0,0 @@ -dependencies { - compile project(':enums') -} diff --git a/understandingcollections/build.gradle b/understandingcollections/build.gradle deleted file mode 100644 index 1db84bc1f..000000000 --- a/understandingcollections/build.gradle +++ /dev/null @@ -1,8 +0,0 @@ -dependencies { - compile project(':typeinfo') - compile project(':collections') -} - -jmh { - include = 'understandingcollections.jmhtests.*' -} diff --git a/verifying/build.gradle b/verifying/build.gradle deleted file mode 100644 index 7b6876d6e..000000000 --- a/verifying/build.gradle +++ /dev/null @@ -1,3 +0,0 @@ -dependencies { - compile 'junit:junit:4.12' -} From e0e7ced3d71934ba8f3bf9ff4e051b2b745c35eb Mon Sep 17 00:00:00 2001 From: Bruce Eckel Date: Wed, 10 Aug 2016 13:10:16 -0600 Subject: [PATCH 083/320] Temporarily adding "test" directory --- build.gradle | 2 - test/ConfigureLogging.java | 102 ++++++++++++++++ test/CustomHandler.java | 47 ++++++++ test/InfoLogging.java | 19 +++ test/InfoLogging2.java | 21 ++++ test/LogToFile.java | 22 ++++ test/LogToFile2.java | 24 ++++ test/LoggingLevelManipulation.java | 184 +++++++++++++++++++++++++++++ test/LoggingLevels.java | 61 ++++++++++ test/MultipleHandlers.java | 27 +++++ test/MultipleHandlers2.java | 26 ++++ test/PrintableLogRecord.java | 60 ++++++++++ test/SimpleFilter.java | 45 +++++++ test/SimpleFormatterExample.java | 38 ++++++ test/log.prop | 32 +++++ 15 files changed, 708 insertions(+), 2 deletions(-) create mode 100644 test/ConfigureLogging.java create mode 100644 test/CustomHandler.java create mode 100644 test/InfoLogging.java create mode 100644 test/InfoLogging2.java create mode 100644 test/LogToFile.java create mode 100644 test/LogToFile2.java create mode 100644 test/LoggingLevelManipulation.java create mode 100644 test/LoggingLevels.java create mode 100644 test/MultipleHandlers.java create mode 100644 test/MultipleHandlers2.java create mode 100644 test/PrintableLogRecord.java create mode 100644 test/SimpleFilter.java create mode 100644 test/SimpleFormatterExample.java create mode 100644 test/log.prop diff --git a/build.gradle b/build.gradle index b457434a8..c3238c840 100644 --- a/build.gradle +++ b/build.gradle @@ -59,7 +59,6 @@ class Tags { private def hasTag(String marker) { return block.contains("// {" + marker + "}") } - def extractOutputLine() { def matcher = (block =~ /(?m)^(\/\* Output:.*)$/) if (matcher) { @@ -68,7 +67,6 @@ class Tags { return null } } - private def extract(String marker) { // Assume some whitespace is after marker if(!block.contains("// {${marker} ")) diff --git a/test/ConfigureLogging.java b/test/ConfigureLogging.java new file mode 100644 index 000000000..fbf0958d2 --- /dev/null +++ b/test/ConfigureLogging.java @@ -0,0 +1,102 @@ +// test/ConfigureLogging.java +// (c)2016 MindView LLC: see Copyright.txt +// We make no guarantees that this code is fit for any purpose. +// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// {java ConfigureLogging +// -Djava.util.logging.config.file=log.prop} +// {ErrorOutputExpected} +import java.util.logging.*; + +public class ConfigureLogging { + static Logger + lgr = Logger.getLogger("com"), + lgr2 = Logger.getLogger("com.mindviewinc"), + util= Logger.getLogger("onjava"), + test= Logger.getLogger("com.mindviewinc.test"), + rand = Logger.getLogger("random"); + public ConfigureLogging() { + /* + Set Additional formatters, Filters and + Handlers for the loggers here. You cannot + specify the Handlers for loggers except + the root logger from the configuration + file. + */ + } + public static void main(String[] args) { + sendLogMessages(lgr); + sendLogMessages(lgr2); + sendLogMessages(util); + sendLogMessages(test); + sendLogMessages(rand); + } + private static void + sendLogMessages(Logger logger) { + System.out.println(" Logger Name : " + + logger.getName() + " Level: " + + logger.getLevel()); + logger.finest("Finest"); + logger.finer("Finer"); + logger.fine("Fine"); + logger.config("Config"); + logger.info("Info"); + logger.warning("Warning"); + logger.severe("Severe"); + } +} +/* Output: + Logger Name : com Level: null + Logger Name : com.mindviewinc Level: FINEST + Logger Name : onjava Level: INFO + Logger Name : com.mindviewinc.test Level: FINER + Logger Name : random Level: SEVERE +___[ Error Output ]___ +Jul 27, 2016 10:50:38 AM ConfigureLogging sendLogMessages +FINEST: Finest +Jul 27, 2016 10:50:38 AM ConfigureLogging sendLogMessages +FINER: Finer +Jul 27, 2016 10:50:38 AM ConfigureLogging sendLogMessages +FINE: Fine +Jul 27, 2016 10:50:38 AM ConfigureLogging sendLogMessages +CONFIG: Config +Jul 27, 2016 10:50:38 AM ConfigureLogging sendLogMessages +INFO: Info +Jul 27, 2016 10:50:38 AM ConfigureLogging sendLogMessages +WARNING: Warning +Jul 27, 2016 10:50:38 AM ConfigureLogging sendLogMessages +SEVERE: Severe +Jul 27, 2016 10:50:38 AM ConfigureLogging sendLogMessages +FINEST: Finest +Jul 27, 2016 10:50:38 AM ConfigureLogging sendLogMessages +FINER: Finer +Jul 27, 2016 10:50:38 AM ConfigureLogging sendLogMessages +FINE: Fine +Jul 27, 2016 10:50:38 AM ConfigureLogging sendLogMessages +CONFIG: Config +Jul 27, 2016 10:50:38 AM ConfigureLogging sendLogMessages +INFO: Info +Jul 27, 2016 10:50:38 AM ConfigureLogging sendLogMessages +WARNING: Warning +Jul 27, 2016 10:50:38 AM ConfigureLogging sendLogMessages +SEVERE: Severe +Jul 27, 2016 10:50:38 AM ConfigureLogging sendLogMessages +INFO: Info +Jul 27, 2016 10:50:38 AM ConfigureLogging sendLogMessages +WARNING: Warning +Jul 27, 2016 10:50:38 AM ConfigureLogging sendLogMessages +SEVERE: Severe +Jul 27, 2016 10:50:38 AM ConfigureLogging sendLogMessages +FINER: Finer +Jul 27, 2016 10:50:38 AM ConfigureLogging sendLogMessages +FINE: Fine +Jul 27, 2016 10:50:38 AM ConfigureLogging sendLogMessages +CONFIG: Config +Jul 27, 2016 10:50:38 AM ConfigureLogging sendLogMessages +INFO: Info +Jul 27, 2016 10:50:38 AM ConfigureLogging sendLogMessages +WARNING: Warning +Jul 27, 2016 10:50:38 AM ConfigureLogging sendLogMessages +SEVERE: Severe +Jul 27, 2016 10:50:38 AM ConfigureLogging sendLogMessages +SEVERE: Severe +*/ diff --git a/test/CustomHandler.java b/test/CustomHandler.java new file mode 100644 index 000000000..94cea7f3d --- /dev/null +++ b/test/CustomHandler.java @@ -0,0 +1,47 @@ +// test/CustomHandler.java +// (c)2016 MindView LLC: see Copyright.txt +// We make no guarantees that this code is fit for any purpose. +// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// How to write custom handler +// {ErrorOutputExpected} +import java.util.logging.*; +import java.util.*; + +public class CustomHandler { + private static Logger logger = + Logger.getLogger("CustomHandler"); + private static List trace = + new ArrayList<>(); + public static void main(String[] args) { + logger.addHandler(new Handler() { + @Override + public void publish(LogRecord logRecord) { + trace.add(logRecord.getLevel() + ":"); + trace.add(logRecord.getSourceClassName() + + ":"); + trace.add( + logRecord.getSourceMethodName() +":"); + trace.add("<" + logRecord.getMessage() + + ">"); + trace.add("\n"); + } + @Override + public void flush() {} + @Override + public void close() {} + }); + logger.warning("Logging Warning"); + logger.info("Logging Info"); + System.out.print(trace); + } +} +/* Output: +[WARNING:, CustomHandler:, main:, , +, INFO:, CustomHandler:, main:, , +] +___[ Error Output ]___ +Jul 27, 2016 10:50:39 AM CustomHandler main +WARNING: Logging Warning +Jul 27, 2016 10:50:39 AM CustomHandler main +INFO: Logging Info +*/ diff --git a/test/InfoLogging.java b/test/InfoLogging.java new file mode 100644 index 000000000..52258727b --- /dev/null +++ b/test/InfoLogging.java @@ -0,0 +1,19 @@ +// test/InfoLogging.java +// (c)2016 MindView LLC: see Copyright.txt +// We make no guarantees that this code is fit for any purpose. +// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// {ErrorOutputExpected} +import java.util.logging.*; + +public class InfoLogging { + private static Logger logger = + Logger.getLogger("InfoLogging"); + public static void main(String[] args) { + logger.info("Logging: INFO-level message"); + } +} +/* Output: +___[ Error Output ]___ +Jul 27, 2016 10:50:39 AM InfoLogging main +INFO: Logging: INFO-level message +*/ diff --git a/test/InfoLogging2.java b/test/InfoLogging2.java new file mode 100644 index 000000000..1579d7961 --- /dev/null +++ b/test/InfoLogging2.java @@ -0,0 +1,21 @@ +// test/InfoLogging2.java +// (c)2016 MindView LLC: see Copyright.txt +// We make no guarantees that this code is fit for any purpose. +// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Guaranteeing proper class and method names +// {ErrorOutputExpected} +import java.util.logging.*; + +public class InfoLogging2 { + private static Logger logger = + Logger.getLogger("InfoLogging2"); + public static void main(String[] args) { + logger.logp(Level.INFO, "InfoLogging2", + "main", "Logging an INFO-level message"); + } +} +/* Output: +___[ Error Output ]___ +Jul 27, 2016 10:50:40 AM InfoLogging2 main +INFO: Logging an INFO-level message +*/ diff --git a/test/LogToFile.java b/test/LogToFile.java new file mode 100644 index 000000000..3b070998b --- /dev/null +++ b/test/LogToFile.java @@ -0,0 +1,22 @@ +// test/LogToFile.java +// (c)2016 MindView LLC: see Copyright.txt +// We make no guarantees that this code is fit for any purpose. +// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// {ErrorOutputExpected} +import java.util.logging.*; + +public class LogToFile { + private static Logger logger = + Logger.getLogger("LogToFile"); + public static void + main(String[] args) throws Exception { + logger.addHandler( + new FileHandler("LogToFile.xml")); + logger.info("A message logged to the file"); + } +} +/* Output: +___[ Error Output ]___ +Jul 27, 2016 10:50:41 AM LogToFile main +INFO: A message logged to the file +*/ diff --git a/test/LogToFile2.java b/test/LogToFile2.java new file mode 100644 index 000000000..f53bf61e7 --- /dev/null +++ b/test/LogToFile2.java @@ -0,0 +1,24 @@ +// test/LogToFile2.java +// (c)2016 MindView LLC: see Copyright.txt +// We make no guarantees that this code is fit for any purpose. +// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// {ErrorOutputExpected} +import java.util.logging.*; + +public class LogToFile2 { + private static Logger logger = + Logger.getLogger("LogToFile2"); + public static void + main(String[] args) throws Exception { + FileHandler logFile = + new FileHandler("LogToFile2.txt"); + logFile.setFormatter(new SimpleFormatter()); + logger.addHandler(logFile); + logger.info("A message logged to the file"); + } +} +/* Output: +___[ Error Output ]___ +Jul 27, 2016 10:50:41 AM LogToFile2 main +INFO: A message logged to the file +*/ diff --git a/test/LoggingLevelManipulation.java b/test/LoggingLevelManipulation.java new file mode 100644 index 000000000..ad4f1a326 --- /dev/null +++ b/test/LoggingLevelManipulation.java @@ -0,0 +1,184 @@ +// test/LoggingLevelManipulation.java +// (c)2016 MindView LLC: see Copyright.txt +// We make no guarantees that this code is fit for any purpose. +// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// {ErrorOutputExpected} +import java.util.logging.Level; +import java.util.logging.Logger; + +public class LoggingLevelManipulation { + private static Logger + lgr = Logger.getLogger("com"), + lgr2 = Logger.getLogger("com.mindviewinc"), + util= Logger.getLogger("onjava"), + test= Logger.getLogger("com.mindviewinc.test"), + rand = Logger.getLogger("random"); + static void printLogMessages(Logger logger) { + logger.finest(logger.getName() + " Finest"); + logger.finer(logger.getName() + " Finer"); + logger.fine(logger.getName() + " Fine"); + logger.config(logger.getName() + " Config"); + logger.info(logger.getName() + " Info"); + logger.warning(logger.getName()+" Warning"); + logger.severe(logger.getName() + " Severe"); + } + static void logMessages() { + printLogMessages(lgr); + printLogMessages(lgr2); + printLogMessages(util); + printLogMessages(test); + printLogMessages(rand); + } + static void printLevels() { + System.out.println(" -- printing levels -- " + + lgr.getName() + + " : " + lgr.getLevel() + + " " + lgr2.getName() + + " : " + lgr2.getLevel() + + " " + util.getName() + + " : " + util.getLevel() + + " " + test.getName() + + " : " + test.getLevel() + + " " + rand.getName() + + " : " + rand.getLevel()); + } + public static void main(String[] args) { + printLevels(); + lgr.setLevel(Level.SEVERE); + printLevels(); + System.out.println("net level: SEVERE"); + logMessages(); + util.setLevel(Level.FINEST); + test.setLevel(Level.FINEST); + rand.setLevel(Level.FINEST); + printLevels(); + System.out.println( + "individual loggers set to FINEST"); + logMessages(); + lgr.setLevel(Level.FINEST); + printLevels(); + System.out.println("net level: FINEST"); + logMessages(); + } +} +/* Output: + -- printing levels -- com : null com.mindviewinc : null +onjava : null com.mindviewinc.test : null random : null + -- printing levels -- com : SEVERE com.mindviewinc : null +onjava : null com.mindviewinc.test : null random : null +net level: SEVERE + -- printing levels -- com : SEVERE com.mindviewinc : null +onjava : FINEST com.mindviewinc.test : FINEST random : +FINEST +individual loggers set to FINEST + -- printing levels -- com : FINEST com.mindviewinc : null +onjava : FINEST com.mindviewinc.test : FINEST random : +FINEST +net level: FINEST +___[ Error Output ]___ +Jul 27, 2016 10:50:42 AM LoggingLevelManipulation +printLogMessages +SEVERE: com Severe +Jul 27, 2016 10:50:42 AM LoggingLevelManipulation +printLogMessages +SEVERE: com.mindviewinc Severe +Jul 27, 2016 10:50:42 AM LoggingLevelManipulation +printLogMessages +INFO: onjava Info +Jul 27, 2016 10:50:42 AM LoggingLevelManipulation +printLogMessages +WARNING: onjava Warning +Jul 27, 2016 10:50:42 AM LoggingLevelManipulation +printLogMessages +SEVERE: onjava Severe +Jul 27, 2016 10:50:42 AM LoggingLevelManipulation +printLogMessages +SEVERE: com.mindviewinc.test Severe +Jul 27, 2016 10:50:42 AM LoggingLevelManipulation +printLogMessages +INFO: random Info +Jul 27, 2016 10:50:42 AM LoggingLevelManipulation +printLogMessages +WARNING: random Warning +Jul 27, 2016 10:50:42 AM LoggingLevelManipulation +printLogMessages +SEVERE: random Severe +Jul 27, 2016 10:50:42 AM LoggingLevelManipulation +printLogMessages +SEVERE: com Severe +Jul 27, 2016 10:50:42 AM LoggingLevelManipulation +printLogMessages +SEVERE: com.mindviewinc Severe +Jul 27, 2016 10:50:42 AM LoggingLevelManipulation +printLogMessages +INFO: onjava Info +Jul 27, 2016 10:50:42 AM LoggingLevelManipulation +printLogMessages +WARNING: onjava Warning +Jul 27, 2016 10:50:42 AM LoggingLevelManipulation +printLogMessages +SEVERE: onjava Severe +Jul 27, 2016 10:50:42 AM LoggingLevelManipulation +printLogMessages +INFO: com.mindviewinc.test Info +Jul 27, 2016 10:50:42 AM LoggingLevelManipulation +printLogMessages +WARNING: com.mindviewinc.test Warning +Jul 27, 2016 10:50:42 AM LoggingLevelManipulation +printLogMessages +SEVERE: com.mindviewinc.test Severe +Jul 27, 2016 10:50:42 AM LoggingLevelManipulation +printLogMessages +INFO: random Info +Jul 27, 2016 10:50:42 AM LoggingLevelManipulation +printLogMessages +WARNING: random Warning +Jul 27, 2016 10:50:42 AM LoggingLevelManipulation +printLogMessages +SEVERE: random Severe +Jul 27, 2016 10:50:42 AM LoggingLevelManipulation +printLogMessages +INFO: com Info +Jul 27, 2016 10:50:42 AM LoggingLevelManipulation +printLogMessages +WARNING: com Warning +Jul 27, 2016 10:50:42 AM LoggingLevelManipulation +printLogMessages +SEVERE: com Severe +Jul 27, 2016 10:50:42 AM LoggingLevelManipulation +printLogMessages +INFO: com.mindviewinc Info +Jul 27, 2016 10:50:42 AM LoggingLevelManipulation +printLogMessages +WARNING: com.mindviewinc Warning +Jul 27, 2016 10:50:42 AM LoggingLevelManipulation +printLogMessages +SEVERE: com.mindviewinc Severe +Jul 27, 2016 10:50:42 AM LoggingLevelManipulation +printLogMessages +INFO: onjava Info +Jul 27, 2016 10:50:42 AM LoggingLevelManipulation +printLogMessages +WARNING: onjava Warning +Jul 27, 2016 10:50:42 AM LoggingLevelManipulation +printLogMessages +SEVERE: onjava Severe +Jul 27, 2016 10:50:42 AM LoggingLevelManipulation +printLogMessages +INFO: com.mindviewinc.test Info +Jul 27, 2016 10:50:42 AM LoggingLevelManipulation +printLogMessages +WARNING: com.mindviewinc.test Warning +Jul 27, 2016 10:50:42 AM LoggingLevelManipulation +printLogMessages +SEVERE: com.mindviewinc.test Severe +Jul 27, 2016 10:50:42 AM LoggingLevelManipulation +printLogMessages +INFO: random Info +Jul 27, 2016 10:50:42 AM LoggingLevelManipulation +printLogMessages +WARNING: random Warning +Jul 27, 2016 10:50:42 AM LoggingLevelManipulation +printLogMessages +SEVERE: random Severe +*/ diff --git a/test/LoggingLevels.java b/test/LoggingLevels.java new file mode 100644 index 000000000..308aeaeec --- /dev/null +++ b/test/LoggingLevels.java @@ -0,0 +1,61 @@ +// test/LoggingLevels.java +// (c)2016 MindView LLC: see Copyright.txt +// We make no guarantees that this code is fit for any purpose. +// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// {ErrorOutputExpected} +import java.util.logging.Level; +import java.util.logging.Logger; + +public class LoggingLevels { + private static Logger + lgr = Logger.getLogger("com"), + lgr2 = Logger.getLogger("com.mindviewinc"), + util= Logger.getLogger("onjava"), + test= Logger.getLogger("com.mindviewinc.test"), + rand = Logger.getLogger("random"); + private static void logMessages() { + lgr.info("com : info"); + lgr2.info("com.mindviewinc : info"); + util.info("util : info"); + test.severe("test : severe"); + rand.info("random : info"); + } + public static void main(String[] args) { + lgr.setLevel(Level.SEVERE); + System.out.println("com level: SEVERE"); + logMessages(); + util.setLevel(Level.FINEST); + test.setLevel(Level.FINEST); + rand.setLevel(Level.FINEST); + System.out.println( + "individual loggers set to FINEST"); + logMessages(); + lgr.setLevel(Level.SEVERE); + System.out.println("com level: SEVERE"); + logMessages(); + } +} +/* Output: +com level: SEVERE +individual loggers set to FINEST +com level: SEVERE +___[ Error Output ]___ +Jul 27, 2016 10:50:42 AM LoggingLevels logMessages +INFO: util : info +Jul 27, 2016 10:50:42 AM LoggingLevels logMessages +SEVERE: test : severe +Jul 27, 2016 10:50:42 AM LoggingLevels logMessages +INFO: random : info +Jul 27, 2016 10:50:42 AM LoggingLevels logMessages +INFO: util : info +Jul 27, 2016 10:50:42 AM LoggingLevels logMessages +SEVERE: test : severe +Jul 27, 2016 10:50:42 AM LoggingLevels logMessages +INFO: random : info +Jul 27, 2016 10:50:42 AM LoggingLevels logMessages +INFO: util : info +Jul 27, 2016 10:50:42 AM LoggingLevels logMessages +SEVERE: test : severe +Jul 27, 2016 10:50:42 AM LoggingLevels logMessages +INFO: random : info +*/ diff --git a/test/MultipleHandlers.java b/test/MultipleHandlers.java new file mode 100644 index 000000000..ee71bb225 --- /dev/null +++ b/test/MultipleHandlers.java @@ -0,0 +1,27 @@ +// test/MultipleHandlers.java +// (c)2016 MindView LLC: see Copyright.txt +// We make no guarantees that this code is fit for any purpose. +// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// {ErrorOutputExpected} +import java.util.logging.*; + +public class MultipleHandlers { + private static Logger logger = + Logger.getLogger("MultipleHandlers"); + public static void + main(String[] args) throws Exception { + FileHandler logFile = + new FileHandler("MultipleHandlers.xml"); + logger.addHandler(logFile); + logger.addHandler(new ConsoleHandler()); + logger.warning( + "Output to multiple handlers"); + } +} +/* Output: +___[ Error Output ]___ +Jul 27, 2016 10:50:43 AM MultipleHandlers main +WARNING: Output to multiple handlers +Jul 27, 2016 10:50:43 AM MultipleHandlers main +WARNING: Output to multiple handlers +*/ diff --git a/test/MultipleHandlers2.java b/test/MultipleHandlers2.java new file mode 100644 index 000000000..2e714d4ed --- /dev/null +++ b/test/MultipleHandlers2.java @@ -0,0 +1,26 @@ +// test/MultipleHandlers2.java +// (c)2016 MindView LLC: see Copyright.txt +// We make no guarantees that this code is fit for any purpose. +// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// {ErrorOutputExpected} +import java.util.logging.*; + +public class MultipleHandlers2 { + private static Logger logger = + Logger.getLogger("MultipleHandlers2"); + public static void + main(String[] args) throws Exception { + FileHandler logFile = + new FileHandler("MultipleHandlers2.xml"); + logger.addHandler(logFile); + logger.addHandler(new ConsoleHandler()); + logger.setUseParentHandlers(false); + logger.warning( + "Output to multiple handlers"); + } +} +/* Output: +___[ Error Output ]___ +Jul 27, 2016 10:50:43 AM MultipleHandlers2 main +WARNING: Output to multiple handlers +*/ diff --git a/test/PrintableLogRecord.java b/test/PrintableLogRecord.java new file mode 100644 index 000000000..a88bb7a44 --- /dev/null +++ b/test/PrintableLogRecord.java @@ -0,0 +1,60 @@ +// test/PrintableLogRecord.java +// (c)2016 MindView LLC: see Copyright.txt +// We make no guarantees that this code is fit for any purpose. +// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Override LogRecord toString() +import java.util.logging.*; + +public class PrintableLogRecord extends LogRecord { + public PrintableLogRecord(Level level, String str) { + super(level, str); + } + @Override + public String toString() { + String result = "Level<" + getLevel()+ ">\n" + + "LoggerName<" + getLoggerName() + ">\n" + + "Message<" + getMessage() + ">\n" + + "CurrentMillis<" + getMillis() + ">\n" + + "Params"; + Object[] objParams = getParameters(); + if(objParams == null) + result += "\n"; + else + for(int i = 0; i < objParams.length; i++) + result += " Param # <" + i + " value "+ + objParams[i].toString() + ">\n"; + result += "ResourceBundle<" + + getResourceBundle() + + ">\nResourceBundleName<" + + getResourceBundleName() + + ">\nSequenceNumber<" + + getSequenceNumber() + + ">\nSourceClassName<" + + getSourceClassName() + + ">\nSourceMethodName<" + + getSourceMethodName() + + ">\nThread Id<" + getThreadID() + + ">\nThrown<" + getThrown() + ">"; + return result; + } + public static void main(String[] args) { + PrintableLogRecord logRecord = + new PrintableLogRecord( + Level.FINEST, "Simple Log Record"); + System.out.println(logRecord); + } +} +/* Output: +Level +LoggerName +Message +CurrentMillis<1469638244376> +Params +ResourceBundle +ResourceBundleName +SequenceNumber<0> +SourceClassName +SourceMethodName +Thread Id<1> +Thrown +*/ diff --git a/test/SimpleFilter.java b/test/SimpleFilter.java new file mode 100644 index 000000000..7c34ce195 --- /dev/null +++ b/test/SimpleFilter.java @@ -0,0 +1,45 @@ +// test/SimpleFilter.java +// (c)2016 MindView LLC: see Copyright.txt +// We make no guarantees that this code is fit for any purpose. +// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// {ErrorOutputExpected} +import java.util.logging.*; + +public class SimpleFilter { + private static Logger logger = + Logger.getLogger("SimpleFilter"); + static class Duck {}; + static class Wombat {}; + static void sendLogMessages() { + logger.log(Level.WARNING, + "A duck in the house!", new Duck()); + logger.log(Level.WARNING, + "A Wombat at large!", new Wombat()); + } + public static void main(String[] args) { + sendLogMessages(); + logger.setFilter(record -> { + Object[] params = + record.getParameters(); + if(params == null) + return true; // No parameters + if(record.getParameters()[0] + instanceof Duck) + return true; // Only log Ducks + return false; + }); + logger.info("After setting filter.."); + sendLogMessages(); + } +} +/* Output: +___[ Error Output ]___ +Jul 27, 2016 10:50:44 AM SimpleFilter sendLogMessages +WARNING: A duck in the house! +Jul 27, 2016 10:50:44 AM SimpleFilter sendLogMessages +WARNING: A Wombat at large! +Jul 27, 2016 10:50:44 AM SimpleFilter main +INFO: After setting filter.. +Jul 27, 2016 10:50:44 AM SimpleFilter sendLogMessages +WARNING: A duck in the house! +*/ diff --git a/test/SimpleFormatterExample.java b/test/SimpleFormatterExample.java new file mode 100644 index 000000000..81f7b83bd --- /dev/null +++ b/test/SimpleFormatterExample.java @@ -0,0 +1,38 @@ +// test/SimpleFormatterExample.java +// (c)2016 MindView LLC: see Copyright.txt +// We make no guarantees that this code is fit for any purpose. +// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// {ErrorOutputExpected} +import java.util.logging.*; + +public class SimpleFormatterExample { + private static Logger logger = + Logger.getLogger("SimpleFormatterExample"); + private static void logMessages() { + logger.info("Line One"); + logger.info("Line Two"); + } + public static void main(String[] args) { + logger.setUseParentHandlers(false); + Handler conHdlr = new ConsoleHandler(); + conHdlr.setFormatter(new Formatter() { + public String format(LogRecord record) { + return record.getLevel() + " : " + + record.getSourceClassName() + + " -:- " + + record.getSourceMethodName() + + " -:- " + + record.getMessage() + "\n"; + } + }); + logger.addHandler(conHdlr); + logMessages(); + } +} +/* Output: +___[ Error Output ]___ +INFO : SimpleFormatterExample -:- logMessages -:- Line +One +INFO : SimpleFormatterExample -:- logMessages -:- Line +Two +*/ diff --git a/test/log.prop b/test/log.prop new file mode 100644 index 000000000..c9c33b1bc --- /dev/null +++ b/test/log.prop @@ -0,0 +1,32 @@ +// test/log.prop +#### Configuration File #### +# Global Params +# Handlers installed for the root logger +handlers= java.util.logging.ConsoleHandler java.util.logging.FileHandler +# Level for root logger--is used by any logger +# that does not have its level set +.level= FINEST +# Initialization class--the public no-arg constructor +# of this class is called by the Logging framework +config = ConfigureLogging + +# Configure FileHandler +# Logging file name - %u specifies unique +java.util.logging.FileHandler.pattern = java%g.log +# Write 100000 bytes before rotating this file +java.util.logging.FileHandler.limit = 100000 +# Number of rotating files +java.util.logging.FileHandler.count = 3 +# Formatter for this FileHandler +java.util.logging.FileHandler.formatter = java.util.logging.SimpleFormatter + +# Configure ConsoleHandler +java.util.logging.ConsoleHandler.level = FINEST +java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter + +# Set Logger Levels # +net.level=SEVERE +com.mindviewinc.level = FINEST +onjava.level = INFO +com.mindviewinc.test.level = FINER +random.level= SEVERE From b0b9fa34999ef25b34b78dd532db95f59a1e0259 Mon Sep 17 00:00:00 2001 From: Bruce Eckel Date: Wed, 10 Aug 2016 15:38:02 -0600 Subject: [PATCH 084/320] Added jmh support in "Verifying Your Code" --- build.gradle | 3 +++ 1 file changed, 3 insertions(+) diff --git a/build.gradle b/build.gradle index c3238c840..4ac4dec67 100644 --- a/build.gradle +++ b/build.gradle @@ -223,6 +223,9 @@ project(':verifying') { dependencies { compile 'junit:junit:4.12' } + jmh { + include = 'verifying.jmhtests.*' + } } project(':understandingcollections') { From 6b1dcd12bc75935bbfaecd708b82fd78dc26cb2d Mon Sep 17 00:00:00 2001 From: Bruce Eckel Date: Wed, 10 Aug 2016 15:59:47 -0600 Subject: [PATCH 085/320] Moved Benchmarking intro to "Verifying" --- {arrays => verifying}/BadMicroBenchmark.java | 2 +- {arrays => verifying}/BadMicroBenchmark2.java | 2 +- {arrays => verifying}/BadMicroBenchmark3.java | 2 +- verifying/jmhtests/ParallelSetAll.java | 24 +++++++++++++++++++ 4 files changed, 27 insertions(+), 3 deletions(-) rename {arrays => verifying}/BadMicroBenchmark.java (94%) rename {arrays => verifying}/BadMicroBenchmark2.java (94%) rename {arrays => verifying}/BadMicroBenchmark3.java (96%) create mode 100644 verifying/jmhtests/ParallelSetAll.java diff --git a/arrays/BadMicroBenchmark.java b/verifying/BadMicroBenchmark.java similarity index 94% rename from arrays/BadMicroBenchmark.java rename to verifying/BadMicroBenchmark.java index bdcb26c1c..f19cf716d 100644 --- a/arrays/BadMicroBenchmark.java +++ b/verifying/BadMicroBenchmark.java @@ -1,4 +1,4 @@ -// arrays/BadMicroBenchmark.java +// verifying/BadMicroBenchmark.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. diff --git a/arrays/BadMicroBenchmark2.java b/verifying/BadMicroBenchmark2.java similarity index 94% rename from arrays/BadMicroBenchmark2.java rename to verifying/BadMicroBenchmark2.java index 17315eda3..ca5f6d6dd 100644 --- a/arrays/BadMicroBenchmark2.java +++ b/verifying/BadMicroBenchmark2.java @@ -1,4 +1,4 @@ -// arrays/BadMicroBenchmark2.java +// verifying/BadMicroBenchmark2.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. diff --git a/arrays/BadMicroBenchmark3.java b/verifying/BadMicroBenchmark3.java similarity index 96% rename from arrays/BadMicroBenchmark3.java rename to verifying/BadMicroBenchmark3.java index aa36f5bc3..876b8fa5a 100644 --- a/arrays/BadMicroBenchmark3.java +++ b/verifying/BadMicroBenchmark3.java @@ -1,4 +1,4 @@ -// arrays/BadMicroBenchmark3.java +// verifying/BadMicroBenchmark3.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. diff --git a/verifying/jmhtests/ParallelSetAll.java b/verifying/jmhtests/ParallelSetAll.java new file mode 100644 index 000000000..ddc281fe1 --- /dev/null +++ b/verifying/jmhtests/ParallelSetAll.java @@ -0,0 +1,24 @@ +// verifying/jmhtests/ParallelSetAll.java +// (c)2016 MindView LLC: see Copyright.txt +// We make no guarantees that this code is fit for any purpose. +// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +package verifying.jmhtests; +import java.util.*; +import org.openjdk.jmh.annotations.*; + +@State(Scope.Thread) +public class ParallelSetAll { + private long[] la; + @Setup + public void setup() { + la = new long[20_000_000]; + } + @Benchmark + public void setAll() { + Arrays.setAll(la, n -> n); + } + @Benchmark + public void parallelSetAll() { + Arrays.parallelSetAll(la, n -> n); + } +} From 84b2e631007289466eda254440f69d1dd453cab3 Mon Sep 17 00:00:00 2001 From: Bruce Eckel Date: Thu, 11 Aug 2016 11:19:48 -0600 Subject: [PATCH 086/320] Test ParallelSetAll.java on single-cpu machine --- .travis.yml | 2 +- appveyor.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index d0efebd21..f2fb92aec 100644 --- a/.travis.yml +++ b/.travis.yml @@ -4,4 +4,4 @@ jdk: install: true script: - ./gradlew --parallel --stacktrace run - - ./gradlew --parallel --stacktrace :understandingcollections:jmh + - ./gradlew --parallel --stacktrace :verifying:jmh diff --git a/appveyor.yml b/appveyor.yml index 702506a71..87b353301 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -1,5 +1,5 @@ build_script: - gradlew.bat --parallel --stacktrace run - - gradlew.bat --parallel --stacktrace :understandingcollections:jmh + - gradlew.bat --parallel --stacktrace :verifying:jmh test: off From 363abe4586001c3770e02256da235bab03ead9ce Mon Sep 17 00:00:00 2001 From: Bruce Eckel Date: Fri, 12 Aug 2016 13:37:34 -0600 Subject: [PATCH 087/320] Added description line --- build.gradle | 1 + 1 file changed, 1 insertion(+) diff --git a/build.gradle b/build.gradle index 4ac4dec67..e2728eb48 100644 --- a/build.gradle +++ b/build.gradle @@ -301,6 +301,7 @@ configure(subprojects - project(':onjava')) { } task verify(type:Exec) { + description 'Uses Python tool to verify example output' commandLine 'python', 'verify_output.py' doFirst { println("execute 'gradlew run' first") From a454e23de4d29f103eee8a049daf4e4eb5a5bb30 Mon Sep 17 00:00:00 2001 From: Bruce Eckel Date: Mon, 15 Aug 2016 17:10:52 -0600 Subject: [PATCH 088/320] Started Guava Preconditions, new JUnit features --- build.gradle | 1 + verifying/GuavaPreconditions.java | 14 ++++++ verifying/Queue.java | 8 ++-- .../{JUnitDemo.java => SimpleJUnit.java} | 47 ++++++++----------- 4 files changed, 39 insertions(+), 31 deletions(-) create mode 100644 verifying/GuavaPreconditions.java rename verifying/{JUnitDemo.java => SimpleJUnit.java} (69%) diff --git a/build.gradle b/build.gradle index e2728eb48..a9cb134ad 100644 --- a/build.gradle +++ b/build.gradle @@ -294,6 +294,7 @@ project(':collections') { configure(subprojects - project(':onjava')) { dependencies { compile project(':onjava') + compile group: 'com.google.guava', name: 'guava', version: '19.0' compile "org.openjdk.jmh:jmh-core:${jmh.jmhVersion}" compile group: 'org.apache.logging.log4j', name: 'log4j-api', version: '2.6.2' compile group: 'org.apache.logging.log4j', name: 'log4j-core', version: '2.6.2' diff --git a/verifying/GuavaPreconditions.java b/verifying/GuavaPreconditions.java new file mode 100644 index 000000000..5dabcd210 --- /dev/null +++ b/verifying/GuavaPreconditions.java @@ -0,0 +1,14 @@ +// verifying/GuavaPreconditions.java +// (c)2016 MindView LLC: see Copyright.txt +// We make no guarantees that this code is fit for any purpose. +// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Demonstrating Guava Preconditions +import static com.google.common.base.Preconditions.*; + +public class GuavaPreconditions { + + public static void main(String[] args) { + } +} +/* Output: +*/ diff --git a/verifying/Queue.java b/verifying/Queue.java index 6138dc44a..cb7e2aae8 100644 --- a/verifying/Queue.java +++ b/verifying/Queue.java @@ -97,7 +97,7 @@ public static class WhiteBoxTest { private int i = 0; public WhiteBoxTest() { while(i < 5) // Preload with some data - queue.put("" + i++); + queue.put(Integer.toString(i++)); } // Support methods: private void showFullness() { @@ -118,7 +118,7 @@ public void full() { System.out.println(queue.get()); System.out.println(queue.get()); while(!queue.full()) - queue.put("" + i++); + queue.put(Integer.toString(i++)); String msg = ""; try { queue.put(""); @@ -160,7 +160,7 @@ public void nullPut() { public void circularity() { System.out.println("testCircularity"); while(!queue.full()) - queue.put("" + i++); + queue.put(Integer.toString(i++)); showFullness(); // White-box testing accesses private field: assertTrue(queue.wrapped); @@ -168,7 +168,7 @@ public void circularity() { System.out.println(queue.get()); showEmptiness(); while(!queue.full()) - queue.put("" + i++); + queue.put(Integer.toString(i++)); showFullness(); while(!queue.empty()) System.out.println(queue.get()); diff --git a/verifying/JUnitDemo.java b/verifying/SimpleJUnit.java similarity index 69% rename from verifying/JUnitDemo.java rename to verifying/SimpleJUnit.java index 59aa70bf3..3dd52d634 100644 --- a/verifying/JUnitDemo.java +++ b/verifying/SimpleJUnit.java @@ -1,13 +1,11 @@ -// verifying/JUnitDemo.java +// verifying/SimpleJUnit.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. // Simple use of JUnit to test ArrayList import java.util.*; -import org.junit.Test; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; -import static java.lang.System.out; +import org.junit.*; +import static org.junit.Assert.*; // So we can see the list objects being created, // and keep track of when they are cleaned up: @@ -15,33 +13,28 @@ class CountedList extends ArrayList { private static int counter = 0; private int id = counter++; public CountedList() { - out.println("CountedList #" + id); + System.out.println("CountedList #" + id); } public int getId() { return id; } } -public class JUnitDemo { - private CountedList list = new CountedList(); - // You can use the constructor instead of setUp(): - public JUnitDemo() { +public class SimpleJUnit { + private CountedList list; + @Before + public void initialize() { + list = new CountedList(); + System.out.println("Set up for " + list.getId()); for(int i = 0; i < 3; i++) - list.add("" + i); + list.add(Integer.toString(i)); } - // Thus, setUp() is optional, but is run right - // before the test: - protected void setUp() { - out.println("Set up for " + list.getId()); - } - // tearDown() is also optional, and is called after - // each test. setUp() and tearDown() can be either - // protected or public: - public void tearDown() { - out.println("Tearing down " + list.getId()); + @After + public void cleanup() { + System.out.println("Cleaning up " + list.getId()); } // All tests are marked with the @Test annotation: @Test public void insert() { - out.println("Running testInsert()"); + System.out.println("Running testInsert()"); assertEquals(list.size(), 3); list.add(1, "Insert"); assertEquals(list.size(), 4); @@ -49,7 +42,7 @@ public void insert() { } @Test public void replace() { - out.println("Running testReplace()"); + System.out.println("Running testReplace()"); assertEquals(list.size(), 3); list.set(1, "Replace"); assertEquals(list.size(), 3); @@ -68,12 +61,12 @@ void compare(ArrayList lst, String[] strs) { } @Test public void order() { - out.println("Running testOrder()"); + System.out.println("Running testOrder()"); compare(list, new String[] { "0", "1", "2" }); } @Test public void remove() { - out.println("Running testRemove()"); + System.out.println("Running testRemove()"); assertEquals(list.size(), 3); list.remove(1); assertEquals(list.size(), 2); @@ -81,7 +74,7 @@ public void remove() { } @Test public void addAll() { - out.println("Running testAddAll()"); + System.out.println("Running testAddAll()"); list.addAll(Arrays.asList(new String[] { "An", "African", "Swallow"})); assertEquals(list.size(), 6); @@ -91,7 +84,7 @@ public void addAll() { public static void main(String[] args) { // Invoke JUnit on the class: org.junit.runner.JUnitCore.runClasses( - JUnitDemo.class); + SimpleJUnit.class); } } /* Output: From a45ba31a98fdb536d5a0978d97d88ef7e92e2026 Mon Sep 17 00:00:00 2001 From: Bruce Eckel Date: Tue, 16 Aug 2016 14:23:39 -0600 Subject: [PATCH 089/320] Moved Junit dependency into "subprojects" --- build.gradle | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/build.gradle b/build.gradle index a9cb134ad..311380a1b 100644 --- a/build.gradle +++ b/build.gradle @@ -134,6 +134,10 @@ subprojects { mavenCentral() } + dependencies { + compile 'junit:junit:4.12' + } + sourceSets { main { java { @@ -220,9 +224,6 @@ subprojects { } project(':verifying') { - dependencies { - compile 'junit:junit:4.12' - } jmh { include = 'verifying.jmhtests.*' } @@ -261,12 +262,6 @@ project(':serialization') { } } -project(':references') { - dependencies { - compile 'junit:junit:4.12' - } -} - project(':interfaces') { dependencies { compile project(':polymorphism') From dd67261553b748f8cd89715f0a27d7a4bed070d4 Mon Sep 17 00:00:00 2001 From: Bruce Eckel Date: Tue, 16 Aug 2016 16:49:37 -0600 Subject: [PATCH 090/320] Added Andres Almiray JMH changes and also buildScan --- build.gradle | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 311380a1b..b0cecebbd 100644 --- a/build.gradle +++ b/build.gradle @@ -7,7 +7,9 @@ buildscript { } plugins { - id 'me.champeau.gradle.jmh' version '0.3.0' + id 'com.gradle.build-scan' version '1.0' // Should be first in list + id 'com.github.johnrengelman.shadow' version '1.2.3' + id 'me.champeau.gradle.jmh' version '0.3.1' } import org.gradle.internal.jvm.Jvm @@ -122,6 +124,7 @@ class Tags { } subprojects { + apply plugin: 'com.github.johnrengelman.shadow' apply plugin: 'me.champeau.gradle.jmh' apply plugin: 'java' @@ -153,6 +156,7 @@ subprojects { jmh { jmhVersion = '1.13' + duplicateClassesStrategy = 'warn' } List createdTasks = [] @@ -303,3 +307,8 @@ task verify(type:Exec) { println("execute 'gradlew run' first") } } + +buildScan { + licenseAgreementUrl = 'https://gradle.com/terms-of-service' + licenseAgree = 'yes' +} From 69dec45d88a4478339e18d0078564597140e7163 Mon Sep 17 00:00:00 2001 From: Bruce Eckel Date: Tue, 16 Aug 2016 18:03:03 -0600 Subject: [PATCH 091/320] Upgraded to Gradle 3.0 --- gradle/wrapper/gradle-wrapper.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index e6d6d557e..b50c952a6 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-3.0-rc-1-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-3.0-bin.zip From 0345f21650fb5a85b25ae33ea2dfa790ea3160d9 Mon Sep 17 00:00:00 2001 From: Bruce Eckel Date: Tue, 16 Aug 2016 18:03:29 -0600 Subject: [PATCH 092/320] Moving to SLF4J --- build.gradle | 4 ++++ verifying/InfoLogging.java | 19 ------------------- verifying/SLF4JLogging.java | 16 ++++++++++++++++ verifying/SimpleJUnit.java | 4 ++-- verifying/log4j2.xml | 14 -------------- 5 files changed, 22 insertions(+), 35 deletions(-) delete mode 100644 verifying/InfoLogging.java create mode 100644 verifying/SLF4JLogging.java delete mode 100644 verifying/log4j2.xml diff --git a/build.gradle b/build.gradle index b0cecebbd..9bb419243 100644 --- a/build.gradle +++ b/build.gradle @@ -139,6 +139,10 @@ subprojects { dependencies { compile 'junit:junit:4.12' + compile group: 'org.slf4j', name: 'slf4j-api', version: '1.7.+' + compile group: 'ch.qos.logback', name: 'logback-classic', version: '1.+' + // You can also use the JDK's built-in logging as the back end: + // compile group: 'org.slf4j', name: 'slf4j-jdk14', version: '1.7.5' } sourceSets { diff --git a/verifying/InfoLogging.java b/verifying/InfoLogging.java deleted file mode 100644 index d56ee75d1..000000000 --- a/verifying/InfoLogging.java +++ /dev/null @@ -1,19 +0,0 @@ -// verifying/InfoLogging.java -// (c)2016 MindView LLC: see Copyright.txt -// We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. -// {ErrorOutputExpected} -import org.apache.logging.log4j.*; - -public class InfoLogging { - private static final Logger logger = - LogManager.getLogger(InfoLogging.class); - public static void main(String[] args) { - logger.info("Logging: INFO-level message"); - } -} -/* Output: -___[ Error Output ]___ -Jul 27, 2016 10:50:39 AM InfoLogging main -INFO: Logging: INFO-level message -*/ diff --git a/verifying/SLF4JLogging.java b/verifying/SLF4JLogging.java new file mode 100644 index 000000000..304646e50 --- /dev/null +++ b/verifying/SLF4JLogging.java @@ -0,0 +1,16 @@ +// verifying/SLF4JLogging.java +// (c)2016 MindView LLC: see Copyright.txt +// We make no guarantees that this code is fit for any purpose. +// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +import org.slf4j.*; + +public class SLF4JLogging { + private static final Logger logger = + LoggerFactory.getLogger(SLF4JLogging.class); + public static void main(String[] args) { + logger.info("hello logging"); + } +} +/* Output: +17:58:42.798 [main] INFO SLF4JLogging - hello logging +*/ diff --git a/verifying/SimpleJUnit.java b/verifying/SimpleJUnit.java index 3dd52d634..3f7e2b595 100644 --- a/verifying/SimpleJUnit.java +++ b/verifying/SimpleJUnit.java @@ -7,8 +7,8 @@ import org.junit.*; import static org.junit.Assert.*; -// So we can see the list objects being created, -// and keep track of when they are cleaned up: +// Keeps track of list objects as they are +// created and cleaned up: class CountedList extends ArrayList { private static int counter = 0; private int id = counter++; diff --git a/verifying/log4j2.xml b/verifying/log4j2.xml deleted file mode 100644 index 5db2c883f..000000000 --- a/verifying/log4j2.xml +++ /dev/null @@ -1,14 +0,0 @@ -// verifying/log4j2.xml - - - - - - - - - - - - - From e7bf71ea3a364d98979fbbca3727fbddaa44084b Mon Sep 17 00:00:00 2001 From: Bruce Eckel Date: Tue, 16 Aug 2016 21:43:15 -0600 Subject: [PATCH 093/320] SLF4J support --- build.gradle | 4 +-- verifying/LoggingLevels.java | 62 ------------------------------------ verifying/SLF4JLevels.java | 23 +++++++++++++ verifying/logback.xml | 12 +++++++ 4 files changed, 37 insertions(+), 64 deletions(-) delete mode 100644 verifying/LoggingLevels.java create mode 100644 verifying/SLF4JLevels.java create mode 100644 verifying/logback.xml diff --git a/build.gradle b/build.gradle index 9bb419243..ceb919c46 100644 --- a/build.gradle +++ b/build.gradle @@ -299,8 +299,8 @@ configure(subprojects - project(':onjava')) { compile project(':onjava') compile group: 'com.google.guava', name: 'guava', version: '19.0' compile "org.openjdk.jmh:jmh-core:${jmh.jmhVersion}" - compile group: 'org.apache.logging.log4j', name: 'log4j-api', version: '2.6.2' - compile group: 'org.apache.logging.log4j', name: 'log4j-core', version: '2.6.2' + //compile group: 'org.apache.logging.log4j', name: 'log4j-api', version: '2.6.2' + //compile group: 'org.apache.logging.log4j', name: 'log4j-core', version: '2.6.2' } } diff --git a/verifying/LoggingLevels.java b/verifying/LoggingLevels.java deleted file mode 100644 index ede87cbe5..000000000 --- a/verifying/LoggingLevels.java +++ /dev/null @@ -1,62 +0,0 @@ -// verifying/LoggingLevels.java -// (c)2016 MindView LLC: see Copyright.txt -// We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. -// {ErrorOutputExpected} -import org.apache.logging.log4j.*; -import org.apache.logging.log4j.spi.*; -import org.apache.logging.log4j.core.config.Configurator; - -public class LoggingLevels { - private static Logger - lgr = LogManager.getLogger("com"), - lgr2 = LogManager.getLogger("com.mindviewinc"), - util= LogManager.getLogger("onjava"), - test= LogManager.getLogger("com.mindviewinc.test"), - rand = LogManager.getLogger("random"); - private static void logMessages() { - lgr.info("com : info"); - lgr2.info("com.mindviewinc : info"); - util.info("util : info"); - test.fatal("test : fatal"); - rand.info("random : info"); - } - public static void main(String[] args) { - Configurator.setLevel("com", Level.FATAL); - System.out.println("com level: FATAL"); - logMessages(); - Configurator.setLevel("onjava", Level.TRACE); - Configurator.setLevel("com.mindviewinc.test", Level.TRACE); - Configurator.setLevel("random", Level.TRACE); - System.out.println( - "individual loggers set to TRACE"); - logMessages(); - Configurator.setLevel("com", Level.FATAL); - System.out.println("com level: FATAL"); - logMessages(); - } -} -/* Output: -com level: SEVERE -individual loggers set to FINEST -com level: SEVERE -___[ Error Output ]___ -Jul 27, 2016 10:50:42 AM LoggingLevels logMessages -INFO: util : info -Jul 27, 2016 10:50:42 AM LoggingLevels logMessages -SEVERE: test : severe -Jul 27, 2016 10:50:42 AM LoggingLevels logMessages -INFO: random : info -Jul 27, 2016 10:50:42 AM LoggingLevels logMessages -INFO: util : info -Jul 27, 2016 10:50:42 AM LoggingLevels logMessages -SEVERE: test : severe -Jul 27, 2016 10:50:42 AM LoggingLevels logMessages -INFO: random : info -Jul 27, 2016 10:50:42 AM LoggingLevels logMessages -INFO: util : info -Jul 27, 2016 10:50:42 AM LoggingLevels logMessages -SEVERE: test : severe -Jul 27, 2016 10:50:42 AM LoggingLevels logMessages -INFO: random : info -*/ diff --git a/verifying/SLF4JLevels.java b/verifying/SLF4JLevels.java new file mode 100644 index 000000000..3816ab06c --- /dev/null +++ b/verifying/SLF4JLevels.java @@ -0,0 +1,23 @@ +// verifying/SLF4JLevels.java +// (c)2016 MindView LLC: see Copyright.txt +// We make no guarantees that this code is fit for any purpose. +// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +import org.slf4j.*; + +public class SLF4JLevels { + private static final Logger logger = + LoggerFactory.getLogger(SLF4JLevels.class); + public static void main(String[] args) { + logger.trace("level: trace"); + logger.debug("level: debug"); + logger.info("level: info"); + logger.warn("level: warn"); + logger.error("level: error"); + } +} +/* Output: +20:09:34.499 [main] DEBUG SLF4JLevels - level: debug +20:09:34.502 [main] INFO SLF4JLevels - level: info +20:09:34.502 [main] WARN SLF4JLevels - level: warn +20:09:34.502 [main] ERROR SLF4JLevels - level: error +*/ diff --git a/verifying/logback.xml b/verifying/logback.xml new file mode 100644 index 000000000..6b18546d9 --- /dev/null +++ b/verifying/logback.xml @@ -0,0 +1,12 @@ + + + + + %d{yyyy-MM-dd'T'HH:mm:ss.SSS} [%thread] %-5level %logger - %msg%n + + + + + + + \ No newline at end of file From 0dbbb64ef7d46a481fb64c376add6d69e0ebfb6a Mon Sep 17 00:00:00 2001 From: Bruce Eckel Date: Thu, 18 Aug 2016 11:05:53 -0600 Subject: [PATCH 094/320] Changed jmhtests to jmh --- build.gradle | 4 ++-- understandingcollections/{jmhtests => jmh}/Lists.java | 4 ++-- understandingcollections/{jmhtests => jmh}/Maps.java | 4 ++-- understandingcollections/{jmhtests => jmh}/Queues.java | 4 ++-- understandingcollections/{jmhtests => jmh}/Sets.java | 4 ++-- verifying/{jmhtests => jmh}/ParallelSetAll.java | 4 ++-- verifying/logback.xml | 2 +- 7 files changed, 13 insertions(+), 13 deletions(-) rename understandingcollections/{jmhtests => jmh}/Lists.java (95%) rename understandingcollections/{jmhtests => jmh}/Maps.java (95%) rename understandingcollections/{jmhtests => jmh}/Queues.java (94%) rename understandingcollections/{jmhtests => jmh}/Sets.java (94%) rename verifying/{jmhtests => jmh}/ParallelSetAll.java (88%) diff --git a/build.gradle b/build.gradle index ceb919c46..e7e9acdc1 100644 --- a/build.gradle +++ b/build.gradle @@ -233,7 +233,7 @@ subprojects { project(':verifying') { jmh { - include = 'verifying.jmhtests.*' + include = 'verifying.jmh.*' } } @@ -243,7 +243,7 @@ project(':understandingcollections') { compile project(':collections') } jmh { - include = 'understandingcollections.jmhtests.*' + include = 'understandingcollections.jmh.*' } } diff --git a/understandingcollections/jmhtests/Lists.java b/understandingcollections/jmh/Lists.java similarity index 95% rename from understandingcollections/jmhtests/Lists.java rename to understandingcollections/jmh/Lists.java index 296164dca..710a57507 100644 --- a/understandingcollections/jmhtests/Lists.java +++ b/understandingcollections/jmh/Lists.java @@ -1,9 +1,9 @@ -// understandingcollections/jmhtests/Lists.java +// understandingcollections/jmh/Lists.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. // Demonstrates performance differences in Lists -package understandingcollections.jmhtests; +package understandingcollections.jmh; import org.openjdk.jmh.annotations.*; import org.openjdk.jmh.infra.Blackhole; import java.util.*; diff --git a/understandingcollections/jmhtests/Maps.java b/understandingcollections/jmh/Maps.java similarity index 95% rename from understandingcollections/jmhtests/Maps.java rename to understandingcollections/jmh/Maps.java index 9a9022b66..99130f4bb 100644 --- a/understandingcollections/jmhtests/Maps.java +++ b/understandingcollections/jmh/Maps.java @@ -1,9 +1,9 @@ -// understandingcollections/jmhtests/Maps.java +// understandingcollections/jmh/Maps.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. // Performance differences between Maps -package understandingcollections.jmhtests; +package understandingcollections.jmh; import org.openjdk.jmh.annotations.*; import org.openjdk.jmh.infra.Blackhole; import java.util.*; diff --git a/understandingcollections/jmhtests/Queues.java b/understandingcollections/jmh/Queues.java similarity index 94% rename from understandingcollections/jmhtests/Queues.java rename to understandingcollections/jmh/Queues.java index 1428b07a1..6d0c3617b 100644 --- a/understandingcollections/jmhtests/Queues.java +++ b/understandingcollections/jmh/Queues.java @@ -1,9 +1,9 @@ -// understandingcollections/jmhtests/Queues.java +// understandingcollections/jmh/Queues.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. // Demonstrates performance differences in Queues -package understandingcollections.jmhtests; +package understandingcollections.jmh; import org.openjdk.jmh.annotations.*; import org.openjdk.jmh.infra.Blackhole; import java.util.*; diff --git a/understandingcollections/jmhtests/Sets.java b/understandingcollections/jmh/Sets.java similarity index 94% rename from understandingcollections/jmhtests/Sets.java rename to understandingcollections/jmh/Sets.java index 3cb94322a..085311e05 100644 --- a/understandingcollections/jmhtests/Sets.java +++ b/understandingcollections/jmh/Sets.java @@ -1,9 +1,9 @@ -// understandingcollections/jmhtests/Sets.java +// understandingcollections/jmh/Sets.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. // Demonstrates performance differences in Sets -package understandingcollections.jmhtests; +package understandingcollections.jmh; import org.openjdk.jmh.annotations.*; import org.openjdk.jmh.infra.Blackhole; import java.util.*; diff --git a/verifying/jmhtests/ParallelSetAll.java b/verifying/jmh/ParallelSetAll.java similarity index 88% rename from verifying/jmhtests/ParallelSetAll.java rename to verifying/jmh/ParallelSetAll.java index ddc281fe1..c91e3c284 100644 --- a/verifying/jmhtests/ParallelSetAll.java +++ b/verifying/jmh/ParallelSetAll.java @@ -1,8 +1,8 @@ -// verifying/jmhtests/ParallelSetAll.java +// verifying/jmh/ParallelSetAll.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. -package verifying.jmhtests; +package verifying.jmh; import java.util.*; import org.openjdk.jmh.annotations.*; diff --git a/verifying/logback.xml b/verifying/logback.xml index 6b18546d9..73904abbc 100644 --- a/verifying/logback.xml +++ b/verifying/logback.xml @@ -9,4 +9,4 @@ - \ No newline at end of file + From cfaacad48c5e379a79c2d103bfa5d47b4ce4bf8f Mon Sep 17 00:00:00 2001 From: Bruce Eckel Date: Fri, 19 Aug 2016 08:21:09 -0600 Subject: [PATCH 095/320] TDD section (not great yet, but runs) --- verifying/StringInverter.java | 8 ++++ verifying/StringInverter1.java | 21 ++++++++++ verifying/StringInverter2.java | 28 ++++++++++++++ verifying/StringInverter3.java | 27 +++++++++++++ verifying/StringInverter4.java | 29 ++++++++++++++ verifying/StringInverterTest.java | 64 +++++++++++++++++++++++++++++++ verifying/logback.xml | 2 +- 7 files changed, 178 insertions(+), 1 deletion(-) create mode 100644 verifying/StringInverter.java create mode 100644 verifying/StringInverter1.java create mode 100644 verifying/StringInverter2.java create mode 100644 verifying/StringInverter3.java create mode 100644 verifying/StringInverter4.java create mode 100644 verifying/StringInverterTest.java diff --git a/verifying/StringInverter.java b/verifying/StringInverter.java new file mode 100644 index 000000000..f30962867 --- /dev/null +++ b/verifying/StringInverter.java @@ -0,0 +1,8 @@ +// verifying/StringInverter.java +// (c)2016 MindView LLC: see Copyright.txt +// We make no guarantees that this code is fit for any purpose. +// Visit http://mindviewinc.com/Books/OnJava/ for more book information. + +interface StringInverter { + public String invert(String str); +} diff --git a/verifying/StringInverter1.java b/verifying/StringInverter1.java new file mode 100644 index 000000000..b89f0d45b --- /dev/null +++ b/verifying/StringInverter1.java @@ -0,0 +1,21 @@ +// verifying/StringInverter1.java +// (c)2016 MindView LLC: see Copyright.txt +// We make no guarantees that this code is fit for any purpose. +// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// {java StringInverterTest StringInverter1} + +public class StringInverter1 implements StringInverter { + public String invert(String str) { return ""; } +} +/* Output: +StringInverter1 has 3 FAILURES: +Failure 1: +allowedCharacters_Fail(StringInverterTest) +Expected exception: java.lang.RuntimeException +Failure 2: +basicInversion_Succeed(StringInverterTest) +expected:<[]> but was:<[eXIT, pURSUED BY A bEAR.]> +Failure 3: +lengthLessThan26_Fail(StringInverterTest) +Expected exception: java.lang.RuntimeException +*/ diff --git a/verifying/StringInverter2.java b/verifying/StringInverter2.java new file mode 100644 index 000000000..2799f31c4 --- /dev/null +++ b/verifying/StringInverter2.java @@ -0,0 +1,28 @@ +// verifying/StringInverter2.java +// (c)2016 MindView LLC: see Copyright.txt +// We make no guarantees that this code is fit for any purpose. +// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// {java StringInverterTest StringInverter2} +import static java.lang.Character.*; + +public class StringInverter2 implements StringInverter { + public String invert(String str) { + String result = ""; + for(int i = 0; i < str.length(); i++) { + char c = str.charAt(i); + result += isUpperCase(c) ? + toLowerCase(c) : + toUpperCase(c); + } + return result; + } +} +/* Output: +StringInverter2 has 2 FAILURES: +Failure 1: +allowedCharacters_Fail(StringInverterTest) +Expected exception: java.lang.RuntimeException +Failure 2: +lengthLessThan26_Fail(StringInverterTest) +Expected exception: java.lang.RuntimeException +*/ diff --git a/verifying/StringInverter3.java b/verifying/StringInverter3.java new file mode 100644 index 000000000..d907e84e3 --- /dev/null +++ b/verifying/StringInverter3.java @@ -0,0 +1,27 @@ +// verifying/StringInverter3.java +// (c)2016 MindView LLC: see Copyright.txt +// We make no guarantees that this code is fit for any purpose. +// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// {java StringInverterTest StringInverter3} +import static java.lang.Character.*; + +public class StringInverter3 implements StringInverter { + public String invert(String str) { + if(str.length() > 25) + throw new RuntimeException("argument too long!"); + String result = ""; + for(int i = 0; i < str.length(); i++) { + char c = str.charAt(i); + result += isUpperCase(c) ? + toLowerCase(c) : + toUpperCase(c); + } + return result; + } +} +/* Output: +StringInverter3 has 1 FAILURES: +Failure 1: +allowedCharacters_Fail(StringInverterTest) +Expected exception: java.lang.RuntimeException +*/ diff --git a/verifying/StringInverter4.java b/verifying/StringInverter4.java new file mode 100644 index 000000000..21616f2c3 --- /dev/null +++ b/verifying/StringInverter4.java @@ -0,0 +1,29 @@ +// verifying/StringInverter4.java +// (c)2016 MindView LLC: see Copyright.txt +// We make no guarantees that this code is fit for any purpose. +// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// {java StringInverterTest StringInverter4} +import static java.lang.Character.*; + +public class StringInverter4 implements StringInverter { + static final String allowed = + "abcdefghijklmnopqrstuvwxyz ,." + + "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; + public String invert(String str) { + if(str.length() > 25) + throw new RuntimeException("argument too long!"); + String result = ""; + for(int i = 0; i < str.length(); i++) { + char c = str.charAt(i); + if(allowed.indexOf(c) == -1) + throw new RuntimeException(c + " Not allowed"); + result += isUpperCase(c) ? + toLowerCase(c) : + toUpperCase(c); + } + return result; + } +} +/* Output: +StringInverter4 has 0 FAILURES: +*/ diff --git a/verifying/StringInverterTest.java b/verifying/StringInverterTest.java new file mode 100644 index 000000000..30c1ebd2a --- /dev/null +++ b/verifying/StringInverterTest.java @@ -0,0 +1,64 @@ +// verifying/StringInverterTest.java +// (c)2016 MindView LLC: see Copyright.txt +// We make no guarantees that this code is fit for any purpose. +// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// {ValidateByHand} // Don't run by itself +import java.util.*; +import org.junit.*; +import static org.junit.Assert.*; +import org.junit.runner.*; +import org.junit.runner.notification.Failure; + +public class StringInverterTest { + static StringInverter inverter; + @Test + public final void basicInversion_Succeed() { + String in = "Exit, Pursued by a Bear."; + String out = "eXIT, pURSUED BY A bEAR."; + assertEquals(inverter.invert(in), out); + } + @Test(expected = ComparisonFailure.class) + public final void basicInversion_Fail() { + assertEquals(inverter.invert("X"), "X"); + } + @Test(expected = RuntimeException.class) + public final void allowedCharacters_Fail() { + inverter.invert(";-_()*&^%$#@!~`"); + inverter.invert("0123456789"); + } + /*@Test + public final void allowedCharacters_Succeed() { + inverter.invert("abcdefghijklmnopqrstuvwxyz ,."); + inverter.invert("ABCDEFGHIJKLMNOPQRSTUVWXYZ ,."); + assertTrue(true); // No exception thrown + }*/ + @Test(expected = RuntimeException.class) + public final void lengthLessThan26_Fail() { + String str = "xxxxxxxxxxxxxxxxxxxxxxxxxx"; + assertTrue(str.length() > 25); + inverter.invert(str); + } + @Test + public final void lengthLessThan26_Succeed() { + String str = "xxxxxxxxxxxxxxxxxxxxxxxxx"; + assertTrue(str.length() < 26); + inverter.invert(str); + assertTrue(true); // No exception thrown + } + public static void main(String[] args) throws Exception{ + assertEquals(args.length, 1); + inverter = (StringInverter) + Class.forName(args[0]).newInstance(); + Result result = JUnitCore.runClasses( + StringInverterTest.class); + List failures = result.getFailures(); + System.out.printf("%s has %d FAILURES:\n", + args[0], failures.size()); + int count = 1; + for(Failure f : failures) { + System.out.printf("Failure %d:\n", count++); + System.out.println(f.getDescription()); + System.out.println(f.getMessage()); + } + } +} diff --git a/verifying/logback.xml b/verifying/logback.xml index 73904abbc..6b18546d9 100644 --- a/verifying/logback.xml +++ b/verifying/logback.xml @@ -9,4 +9,4 @@ - + \ No newline at end of file From f52ebcad753c4b2178ac3c73814be21f542d0432 Mon Sep 17 00:00:00 2001 From: Bruce Eckel Date: Fri, 19 Aug 2016 11:33:53 -0600 Subject: [PATCH 096/320] commented out the gradle.build-scan --- build.gradle | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/build.gradle b/build.gradle index e7e9acdc1..2e6000ce4 100644 --- a/build.gradle +++ b/build.gradle @@ -7,7 +7,7 @@ buildscript { } plugins { - id 'com.gradle.build-scan' version '1.0' // Should be first in list + // id 'com.gradle.build-scan' version '1.0' // Should be first in list id 'com.github.johnrengelman.shadow' version '1.2.3' id 'me.champeau.gradle.jmh' version '0.3.1' } @@ -312,7 +312,7 @@ task verify(type:Exec) { } } -buildScan { +/*buildScan { licenseAgreementUrl = 'https://gradle.com/terms-of-service' licenseAgree = 'yes' -} +}*/ From 07512f29d8e538995c5f1adce56d8dfb7f409324 Mon Sep 17 00:00:00 2001 From: Bruce Eckel Date: Fri, 19 Aug 2016 15:36:00 -0600 Subject: [PATCH 097/320] build sort of working for tests, testable files in packages --- build.gradle | 65 +++++++++++++++++++++++++++++---- verifying/FirstJUnit5Tests.java | 14 +++++++ verifying/Queue.java | 1 + verifying/SimpleJUnit.java | 1 + 4 files changed, 74 insertions(+), 7 deletions(-) create mode 100644 verifying/FirstJUnit5Tests.java diff --git a/build.gradle b/build.gradle index 2e6000ce4..fcae312ca 100644 --- a/build.gradle +++ b/build.gradle @@ -4,10 +4,12 @@ buildscript { jcenter() mavenCentral() } + dependencies { + classpath 'org.junit.platform:junit-platform-gradle-plugin:1.0.0-M2' + } } plugins { - // id 'com.gradle.build-scan' version '1.0' // Should be first in list id 'com.github.johnrengelman.shadow' version '1.2.3' id 'me.champeau.gradle.jmh' version '0.3.1' } @@ -123,10 +125,16 @@ class Tags { } } +ext.junit4Version = '4.12' +ext.junitVintageVersion = '4.12.0-M2' +ext.junitPlatformVersion = '1.0.0-M2' +ext.junitJupiterVersion = '5.0.0-M2' + subprojects { apply plugin: 'com.github.johnrengelman.shadow' apply plugin: 'me.champeau.gradle.jmh' apply plugin: 'java' + apply plugin: 'org.junit.platform.gradle.plugin' sourceCompatibility = '1.8' targetCompatibility = '1.8' @@ -138,26 +146,72 @@ subprojects { } dependencies { - compile 'junit:junit:4.12' + //compile 'junit:junit:4.12' compile group: 'org.slf4j', name: 'slf4j-api', version: '1.7.+' compile group: 'ch.qos.logback', name: 'logback-classic', version: '1.+' // You can also use the JDK's built-in logging as the back end: // compile group: 'org.slf4j', name: 'slf4j-jdk14', version: '1.7.5' + + // JUnit Jupiter API and TestEngine implementation +/* testCompile("org.junit.jupiter:junit-jupiter-api:${junitJupiterVersion}") + testRuntime("org.junit.jupiter:junit-jupiter-engine:${junitJupiterVersion}") + + // If you also want to support JUnit 3 and JUnit 4 tests + testCompile("junit:junit:${junit4Version}") + testRuntime("org.junit.vintage:junit-vintage-engine:${junitVintageVersion}")*/ + testCompile "org.junit.jupiter:junit-jupiter-api:5.0.0-M2" + testRuntime "org.junit.jupiter:junit-jupiter-engine:5.0.0-M2" + testCompile "junit:junit:4.12" + testRuntime "org.junit.vintage:junit-vintage-engine:4.12.0-M2" + } + + junitPlatform { + // platformVersion '1.0.0-SNAPSHOT' + //engines { + // include 'junit-jupiter', 'junit-vintage' + // exclude 'custom-engine' + //} +/* tags { + // include 'fast' + exclude 'slow' + }*/ + //includeClassNamePattern '.*Test' + includeClassNamePattern '.*' + // enableStandardTestTask true + // reportsDir "build/test-results/junit-platform" // this is the default + //logManager 'org.apache.logging.log4j.jul.LogManager' } sourceSets { main { java { srcDir projectDir + exclude "*Test.java" + exclude "*Tests.java" + exclude "*JUnit.java" + exclude "StringInverter*.java" + exclude "Queue.java" } +/* filter { + }*/ } jmh { java { srcDir projectDir } } + test { + java { + srcDir projectDir + } + } } + /*test { + testClassesDir = sourceSets.main.output.classesDir + classpath = sourceSets.main.runtimeClasspath + }*/ + jmh { jmhVersion = '1.13' duplicateClassesStrategy = 'warn' @@ -299,6 +353,8 @@ configure(subprojects - project(':onjava')) { compile project(':onjava') compile group: 'com.google.guava', name: 'guava', version: '19.0' compile "org.openjdk.jmh:jmh-core:${jmh.jmhVersion}" + compile 'org.junit.platform:junit-platform-gradle-plugin:1.0.0-M2' + //compile group: 'org.apache.logging.log4j', name: 'log4j-api', version: '2.6.2' //compile group: 'org.apache.logging.log4j', name: 'log4j-core', version: '2.6.2' } @@ -311,8 +367,3 @@ task verify(type:Exec) { println("execute 'gradlew run' first") } } - -/*buildScan { - licenseAgreementUrl = 'https://gradle.com/terms-of-service' - licenseAgree = 'yes' -}*/ diff --git a/verifying/FirstJUnit5Tests.java b/verifying/FirstJUnit5Tests.java new file mode 100644 index 000000000..da6546a34 --- /dev/null +++ b/verifying/FirstJUnit5Tests.java @@ -0,0 +1,14 @@ +// verifying/FirstJUnit5Tests.java +// (c)2016 MindView LLC: see Copyright.txt +// We make no guarantees that this code is fit for any purpose. +// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +package verifying; +import static org.junit.jupiter.api.Assertions.assertEquals; +import org.junit.jupiter.api.Test; + +class FirstJUnit5Tests { + @Test + void myFirstTest() { + assertEquals(2, 1 + 1); + } +} diff --git a/verifying/Queue.java b/verifying/Queue.java index cb7e2aae8..82236699e 100644 --- a/verifying/Queue.java +++ b/verifying/Queue.java @@ -4,6 +4,7 @@ // Visit http://mindviewinc.com/Books/OnJava/ for more book information. // Demonstration of Design by Contract (DbC) // combined with white-box unit testing +package verifying; import java.util.*; import org.junit.Test; import static org.junit.Assert.assertEquals; diff --git a/verifying/SimpleJUnit.java b/verifying/SimpleJUnit.java index 3f7e2b595..1009be051 100644 --- a/verifying/SimpleJUnit.java +++ b/verifying/SimpleJUnit.java @@ -3,6 +3,7 @@ // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. // Simple use of JUnit to test ArrayList +package verifying; import java.util.*; import org.junit.*; import static org.junit.Assert.*; From b947d10cbeede8a9d770b4a15cf75a05f103e149 Mon Sep 17 00:00:00 2001 From: James Ward Date: Fri, 19 Aug 2016 17:16:23 -0600 Subject: [PATCH 098/320] add resources that includes *.xml --- build.gradle | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/build.gradle b/build.gradle index fcae312ca..8ad7cfb80 100644 --- a/build.gradle +++ b/build.gradle @@ -192,8 +192,10 @@ subprojects { exclude "StringInverter*.java" exclude "Queue.java" } -/* filter { - }*/ + resources { + srcDir projectDir + include '*.xml' + } } jmh { java { From e5071c517554c52d6caed8e76e286a49158dca96 Mon Sep 17 00:00:00 2001 From: Bruce Eckel Date: Tue, 23 Aug 2016 09:33:05 -0600 Subject: [PATCH 099/320] Name and path changes to help track down {CompileTimeError} issue --- arrays/{Prefix1.java => ParallelPrefix1.java} | 4 +- arrays/{Prefix2.java => ParallelPrefix2.java} | 4 +- ...rallelPrefix.java => ParallelPrefix3.java} | 4 +- arrays/ParallelSort.java | 26 --- arrays/PythonLists.py | 2 +- arrays/jmh/ParallelSort.java | 25 +++ build.gradle | 1 + verifying/BadMicroBenchmark.java | 5 +- verifying/BadMicroBenchmark2.java | 5 +- verifying/BadMicroBenchmark3.java | 9 +- verifying/Queue.java | 151 +----------------- verifying/QueueTest.java | 144 +++++++++++++++++ verifying/SLF4JLevels.java | 26 +-- verifying/SLF4JLogging.java | 7 +- verifying/SimpleJUnit.java | 4 +- onjava/TimeIt.java => verifying/Time.java | 7 +- verifying/logback.xml | 7 +- 17 files changed, 217 insertions(+), 214 deletions(-) rename arrays/{Prefix1.java => ParallelPrefix1.java} (91%) rename arrays/{Prefix2.java => ParallelPrefix2.java} (89%) rename arrays/{ParallelPrefix.java => ParallelPrefix3.java} (90%) delete mode 100644 arrays/ParallelSort.java create mode 100644 arrays/jmh/ParallelSort.java create mode 100644 verifying/QueueTest.java rename onjava/TimeIt.java => verifying/Time.java (80%) diff --git a/arrays/Prefix1.java b/arrays/ParallelPrefix1.java similarity index 91% rename from arrays/Prefix1.java rename to arrays/ParallelPrefix1.java index fa3629a3c..85b55267f 100644 --- a/arrays/Prefix1.java +++ b/arrays/ParallelPrefix1.java @@ -1,4 +1,4 @@ -// arrays/Prefix1.java +// arrays/ParallelPrefix1.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. @@ -6,7 +6,7 @@ import onjava.*; import static onjava.ArrayShow.*; -public class Prefix1 { +public class ParallelPrefix1 { public static void main(String[] args) { int[] nums = new Count.int_().array(10); show(nums); diff --git a/arrays/Prefix2.java b/arrays/ParallelPrefix2.java similarity index 89% rename from arrays/Prefix2.java rename to arrays/ParallelPrefix2.java index 645482697..8dec930a9 100644 --- a/arrays/Prefix2.java +++ b/arrays/ParallelPrefix2.java @@ -1,4 +1,4 @@ -// arrays/Prefix2.java +// arrays/ParallelPrefix2.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. @@ -6,7 +6,7 @@ import onjava.*; import static onjava.ArrayShow.*; -public class Prefix2 { +public class ParallelPrefix2 { public static void main(String[] args) { String[] strings = new Rand.String(1).array(8); show(strings); diff --git a/arrays/ParallelPrefix.java b/arrays/ParallelPrefix3.java similarity index 90% rename from arrays/ParallelPrefix.java rename to arrays/ParallelPrefix3.java index 6c5a63cd1..bd46fcdd1 100644 --- a/arrays/ParallelPrefix.java +++ b/arrays/ParallelPrefix3.java @@ -1,10 +1,10 @@ -// arrays/ParallelPrefix.java +// arrays/ParallelPrefix3.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. import java.util.*; -public class ParallelPrefix { +public class ParallelPrefix3 { static final int SIZE = 10_000_000; public static void main(String[] args) { long[] nums = new long[SIZE]; diff --git a/arrays/ParallelSort.java b/arrays/ParallelSort.java deleted file mode 100644 index 970878aae..000000000 --- a/arrays/ParallelSort.java +++ /dev/null @@ -1,26 +0,0 @@ -// arrays/ParallelSort.java -// (c)2016 MindView LLC: see Copyright.txt -// We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. -import java.util.*; -import java.time.*; -import onjava.*; -import static onjava.TimeIt.*; - -public class ParallelSort { - static final int SZ = 10_000_000; - public static void main(String[] args) { - int[] ia1 = new Rand.int_().array(SZ); - int[] ia2 = Arrays.copyOf(ia1, ia1.length); - System.out.print("sort(): "); - long millis1 = timeIt(() -> Arrays.sort(ia1)); - System.out.print("parallelSort(): "); - long millis2 = timeIt(() -> Arrays.parallelSort(ia2)); - System.out.println(millis1/millis2); - } -} -/* Output: -sort(): 1237 -parallelSort(): 344 -3 -*/ diff --git a/arrays/PythonLists.py b/arrays/PythonLists.py index 2d8ed47e8..f7d7fbe11 100644 --- a/arrays/PythonLists.py +++ b/arrays/PythonLists.py @@ -14,7 +14,7 @@ print(aSlice) # [3, 4] class MyList(list): # Inherit from list - # Define a method, 'this' pointer is explicit: + # Define a method; 'this' pointer is explicit: def getReversed(self): reversed = self[:] # Copy list using slices reversed.reverse() # Built-in list method diff --git a/arrays/jmh/ParallelSort.java b/arrays/jmh/ParallelSort.java new file mode 100644 index 000000000..b02de40c2 --- /dev/null +++ b/arrays/jmh/ParallelSort.java @@ -0,0 +1,25 @@ +// arrays/jmh/ParallelSort.java +// (c)2016 MindView LLC: see Copyright.txt +// We make no guarantees that this code is fit for any purpose. +// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +package arrays.jmh; +import java.util.*; +import onjava.*; +import org.openjdk.jmh.annotations.*; + +@State(Scope.Thread) +public class ParallelSort { + private long[] la; + @Setup + public void setup() { + la = new Rand.long_().array(100_000); + } + @Benchmark + public void sort() { + Arrays.sort(la); + } + @Benchmark + public void parallelSort() { + Arrays.parallelSort(la); + } +} diff --git a/build.gradle b/build.gradle index 8ad7cfb80..5bda862c2 100644 --- a/build.gradle +++ b/build.gradle @@ -229,6 +229,7 @@ subprojects { // Exclude java sources that will not compile if (tags.compileTimeError) { + println ">>> Excluding " + file.name sourceSets.main.java.excludes.add(file.name) } else { JavaExec javaTask = null diff --git a/verifying/BadMicroBenchmark.java b/verifying/BadMicroBenchmark.java index f19cf716d..be79f3da5 100644 --- a/verifying/BadMicroBenchmark.java +++ b/verifying/BadMicroBenchmark.java @@ -3,16 +3,15 @@ // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. import java.util.*; -import static onjava.TimeIt.*; public class BadMicroBenchmark { static final int SIZE = 20_000_000; public static void main(String[] args) { long[] la = new long[SIZE]; System.out.print("setAll: "); - timeIt(() -> Arrays.setAll(la, n -> n)); + Time.it(() -> Arrays.setAll(la, n -> n)); System.out.print("parallelSetAll: "); - timeIt(() -> Arrays.parallelSetAll(la, n -> n)); + Time.it(() -> Arrays.parallelSetAll(la, n -> n)); } } /* Output: diff --git a/verifying/BadMicroBenchmark2.java b/verifying/BadMicroBenchmark2.java index ca5f6d6dd..5b3121c46 100644 --- a/verifying/BadMicroBenchmark2.java +++ b/verifying/BadMicroBenchmark2.java @@ -4,16 +4,15 @@ // Visit http://mindviewinc.com/Books/OnJava/ for more book information. // Reversing the test order import java.util.*; -import static onjava.TimeIt.*; public class BadMicroBenchmark2 { static final int SIZE = 20_000_000; public static void main(String[] args) { long[] la = new long[SIZE]; System.out.print("parallelSetAll: "); - timeIt(() -> Arrays.parallelSetAll(la, n -> n)); + Time.it(() -> Arrays.parallelSetAll(la, n -> n)); System.out.print("setAll: "); - timeIt(() -> Arrays.setAll(la, n -> n)); + Time.it(() -> Arrays.setAll(la, n -> n)); } } /* Output: diff --git a/verifying/BadMicroBenchmark3.java b/verifying/BadMicroBenchmark3.java index 876b8fa5a..cba94d84c 100644 --- a/verifying/BadMicroBenchmark3.java +++ b/verifying/BadMicroBenchmark3.java @@ -4,7 +4,6 @@ // Visit http://mindviewinc.com/Books/OnJava/ for more book information. // Relying on a common resource import java.util.*; -import static onjava.TimeIt.*; public class BadMicroBenchmark3 { static final int SIZE = 20_000_000; @@ -12,17 +11,17 @@ public static void main(String[] args) { long[] la = new long[SIZE]; Random r = new Random(); System.out.print("parallelSetAll: "); - timeIt(() -> + Time.it(() -> Arrays.parallelSetAll(la, n -> r.nextLong())); System.out.print("setAll: "); - timeIt(() -> + Time.it(() -> Arrays.setAll(la, n -> r.nextLong())); SplittableRandom sr = new SplittableRandom(); System.out.print("parallelSetAll: "); - timeIt(() -> + Time.it(() -> Arrays.parallelSetAll(la, n -> sr.nextLong())); System.out.print("setAll: "); - timeIt(() -> + Time.it(() -> Arrays.setAll(la, n -> sr.nextLong())); } } diff --git a/verifying/Queue.java b/verifying/Queue.java index 82236699e..4f90d2432 100644 --- a/verifying/Queue.java +++ b/verifying/Queue.java @@ -3,13 +3,8 @@ // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. // Demonstration of Design by Contract (DbC) -// combined with white-box unit testing package verifying; import java.util.*; -import org.junit.Test; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; -import static org.junit.Assert.assertFalse; public class Queue { private Object[] data; @@ -33,6 +28,7 @@ public boolean empty() { public boolean full() { return wrapped && in == out; } + public boolean isWrapped() { return wrapped; } public void put(Object item) { precondition(item != null, "put() null item"); precondition(!full(), "put() into full Queue"); @@ -84,153 +80,10 @@ private boolean invariant() { "non-null outside of queue range: " + dump()); return true; } - private String dump() { + public String dump() { return "in = " + in + ", out = " + out + ", full() = " + full() + ", empty() = " + empty() + ", queue = " + Arrays.asList(data); } - // JUnit testing. - // As an inner class, this has access to privates: - public static class WhiteBoxTest { - private Queue queue = new Queue(10); - private int i = 0; - public WhiteBoxTest() { - while(i < 5) // Preload with some data - queue.put(Integer.toString(i++)); - } - // Support methods: - private void showFullness() { - assertTrue(queue.full()); - assertFalse(queue.empty()); - // Dump is private, white-box testing allows access: - System.out.println(queue.dump()); - } - private void showEmptiness() { - assertFalse(queue.full()); - assertTrue(queue.empty()); - System.out.println(queue.dump()); - } - @Test - public void full() { - System.out.println("testFull"); - System.out.println(queue.dump()); - System.out.println(queue.get()); - System.out.println(queue.get()); - while(!queue.full()) - queue.put(Integer.toString(i++)); - String msg = ""; - try { - queue.put(""); - } catch(QueueException e) { - msg = e.getMessage(); - System.out.println(msg); - } - assertEquals(msg, "put() into full Queue"); - showFullness(); - } - @Test - public void empty() { - System.out.println("testEmpty"); - while(!queue.empty()) - System.out.println(queue.get()); - String msg = ""; - try { - queue.get(); - } catch(QueueException e) { - msg = e.getMessage(); - System.out.println(msg); - } - assertEquals(msg, "get() from empty Queue"); - showEmptiness(); - } - @Test - public void nullPut() { - System.out.println("testNullPut"); - String msg = ""; - try { - queue.put(null); - } catch(QueueException e) { - msg = e.getMessage(); - System.out.println(msg); - } - assertEquals(msg, "put() null item"); - } - @Test - public void circularity() { - System.out.println("testCircularity"); - while(!queue.full()) - queue.put(Integer.toString(i++)); - showFullness(); - // White-box testing accesses private field: - assertTrue(queue.wrapped); - while(!queue.empty()) - System.out.println(queue.get()); - showEmptiness(); - while(!queue.full()) - queue.put(Integer.toString(i++)); - showFullness(); - while(!queue.empty()) - System.out.println(queue.get()); - showEmptiness(); - } - } - public static void main(String[] args) { - org.junit.runner.JUnitCore.runClasses( - Queue.WhiteBoxTest.class); - } -} -/* Output: -testNullPut -put() null item -testCircularity -in = 0, out = 0, full() = true, empty() = false, queue = -[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -in = 0, out = 0, full() = false, empty() = true, queue = -[null, null, null, null, null, null, null, null, null, -null] -in = 0, out = 0, full() = true, empty() = false, queue = -[10, 11, 12, 13, 14, 15, 16, 17, 18, 19] -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -in = 0, out = 0, full() = false, empty() = true, queue = -[null, null, null, null, null, null, null, null, null, -null] -testFull -in = 5, out = 0, full() = false, empty() = false, queue = -[0, 1, 2, 3, 4, null, null, null, null, null] -0 -1 -put() into full Queue -in = 2, out = 2, full() = true, empty() = false, queue = -[10, 11, 2, 3, 4, 5, 6, 7, 8, 9] -testEmpty -0 -1 -2 -3 -4 -get() from empty Queue -in = 5, out = 5, full() = false, empty() = true, queue = -[null, null, null, null, null, null, null, null, null, -null] -*/ diff --git a/verifying/QueueTest.java b/verifying/QueueTest.java new file mode 100644 index 000000000..5036b7f66 --- /dev/null +++ b/verifying/QueueTest.java @@ -0,0 +1,144 @@ +// verifying/QueueTest.java +// (c)2016 MindView LLC: see Copyright.txt +// We make no guarantees that this code is fit for any purpose. +// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +package verifying; +import verifying.Queue; +import org.junit.Test; +import static org.junit.Assert.*; + +public class QueueTest { + private Queue queue = new Queue(10); + private int i = 0; + @Before + public void initialize() { + while(i < 5) // Preload with some data + queue.put(Integer.toString(i++)); + } + // Support methods: + private void showFullness() { + assertTrue(queue.full()); + assertFalse(queue.empty()); + System.out.println(queue.dump()); + } + private void showEmptiness() { + assertFalse(queue.full()); + assertTrue(queue.empty()); + System.out.println(queue.dump()); + } + @Test + public void full() { + System.out.println("testFull"); + System.out.println(queue.dump()); + System.out.println(queue.get()); + System.out.println(queue.get()); + while(!queue.full()) + queue.put(Integer.toString(i++)); + String msg = ""; + try { + queue.put(""); + } catch(QueueException e) { + msg = e.getMessage(); + System.out.println(msg); + } + assertEquals(msg, "put() into full Queue"); + showFullness(); + } + @Test + public void empty() { + System.out.println("testEmpty"); + while(!queue.empty()) + System.out.println(queue.get()); + String msg = ""; + try { + queue.get(); + } catch(QueueException e) { + msg = e.getMessage(); + System.out.println(msg); + } + assertEquals(msg, "get() from empty Queue"); + showEmptiness(); + } + @Test + public void nullPut() { + System.out.println("testNullPut"); + String msg = ""; + try { + queue.put(null); + } catch(QueueException e) { + msg = e.getMessage(); + System.out.println(msg); + } + assertEquals(msg, "put() null item"); + } + @Test + public void circularity() { + System.out.println("testCircularity"); + while(!queue.full()) + queue.put(Integer.toString(i++)); + showFullness(); + assertTrue(queue.isWrapped()); + while(!queue.empty()) + System.out.println(queue.get()); + showEmptiness(); + while(!queue.full()) + queue.put(Integer.toString(i++)); + showFullness(); + while(!queue.empty()) + System.out.println(queue.get()); + showEmptiness(); + } +} +/* Output: +testNullPut +put() null item +testCircularity +in = 0, out = 0, full() = true, empty() = false, queue = +[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +in = 0, out = 0, full() = false, empty() = true, queue = +[null, null, null, null, null, null, null, null, null, +null] +in = 0, out = 0, full() = true, empty() = false, queue = +[10, 11, 12, 13, 14, 15, 16, 17, 18, 19] +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +in = 0, out = 0, full() = false, empty() = true, queue = +[null, null, null, null, null, null, null, null, null, +null] +testFull +in = 5, out = 0, full() = false, empty() = false, queue = +[0, 1, 2, 3, 4, null, null, null, null, null] +0 +1 +put() into full Queue +in = 2, out = 2, full() = true, empty() = false, queue = +[10, 11, 2, 3, 4, 5, 6, 7, 8, 9] +testEmpty +0 +1 +2 +3 +4 +get() from empty Queue +in = 5, out = 5, full() = false, empty() = true, queue = +[null, null, null, null, null, null, null, null, null, +null] +*/ diff --git a/verifying/SLF4JLevels.java b/verifying/SLF4JLevels.java index 3816ab06c..8c17ca3ba 100644 --- a/verifying/SLF4JLevels.java +++ b/verifying/SLF4JLevels.java @@ -5,19 +5,25 @@ import org.slf4j.*; public class SLF4JLevels { - private static final Logger logger = + private static final Logger log = LoggerFactory.getLogger(SLF4JLevels.class); public static void main(String[] args) { - logger.trace("level: trace"); - logger.debug("level: debug"); - logger.info("level: info"); - logger.warn("level: warn"); - logger.error("level: error"); + log.trace("Hello"); + log.debug("Logging"); + log.info("Using"); + log.warn("the SLF4J"); + log.error("Facade"); } } /* Output: -20:09:34.499 [main] DEBUG SLF4JLevels - level: debug -20:09:34.502 [main] INFO SLF4JLevels - level: info -20:09:34.502 [main] WARN SLF4JLevels - level: warn -20:09:34.502 [main] ERROR SLF4JLevels - level: error +2016-08-22T14:33:01.951 +[main] TRACE SLF4JLevels - Hello +2016-08-22T14:33:01.954 +[main] DEBUG SLF4JLevels - Logging +2016-08-22T14:33:01.954 +[main] INFO SLF4JLevels - Using +2016-08-22T14:33:01.955 +[main] WARN SLF4JLevels - the SLF4J +2016-08-22T14:33:01.955 +[main] ERROR SLF4JLevels - Facade */ diff --git a/verifying/SLF4JLogging.java b/verifying/SLF4JLogging.java index 304646e50..423895d06 100644 --- a/verifying/SLF4JLogging.java +++ b/verifying/SLF4JLogging.java @@ -5,12 +5,13 @@ import org.slf4j.*; public class SLF4JLogging { - private static final Logger logger = + private static final Logger log = LoggerFactory.getLogger(SLF4JLogging.class); public static void main(String[] args) { - logger.info("hello logging"); + log.info("hello logging"); } } /* Output: -17:58:42.798 [main] INFO SLF4JLogging - hello logging +2016-08-22T14:42:44.177 +[main] INFO SLF4JLogging - hello logging */ diff --git a/verifying/SimpleJUnit.java b/verifying/SimpleJUnit.java index 1009be051..7d98eff7a 100644 --- a/verifying/SimpleJUnit.java +++ b/verifying/SimpleJUnit.java @@ -82,11 +82,11 @@ public void addAll() { compare(list, new String[] { "0", "1", "2", "An", "African", "Swallow" }); } - public static void main(String[] args) { +/* public static void main(String[] args) { // Invoke JUnit on the class: org.junit.runner.JUnitCore.runClasses( SimpleJUnit.class); - } + } */ } /* Output: CountedList #0 diff --git a/onjava/TimeIt.java b/verifying/Time.java similarity index 80% rename from onjava/TimeIt.java rename to verifying/Time.java index e48625f3c..a5332fc06 100644 --- a/onjava/TimeIt.java +++ b/verifying/Time.java @@ -1,12 +1,11 @@ -// onjava/TimeIt.java +// verifying/Time.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. -package onjava; import java.util.concurrent.*; -public interface TimeIt { - static long timeIt(Runnable test) { +public interface Time { + static long it(Runnable test) { long start = System.nanoTime(); test.run(); long delta = System.nanoTime() - start; diff --git a/verifying/logback.xml b/verifying/logback.xml index 6b18546d9..0a774e446 100644 --- a/verifying/logback.xml +++ b/verifying/logback.xml @@ -1,8 +1,11 @@ - + - %d{yyyy-MM-dd'T'HH:mm:ss.SSS} [%thread] %-5level %logger - %msg%n + +%d{yyyy-MM-dd'T'HH:mm:ss.SSS} +[%thread] %-5level %logger - %msg%n From e89d177b0827c9b10f6dab672dbb25b9c346dbe8 Mon Sep 17 00:00:00 2001 From: Bruce Eckel Date: Tue, 23 Aug 2016 10:44:52 -0600 Subject: [PATCH 100/320] Flailing by adding lines to try to get it to build --- build.gradle | 2 ++ 1 file changed, 2 insertions(+) diff --git a/build.gradle b/build.gradle index 5bda862c2..94327bfd4 100644 --- a/build.gradle +++ b/build.gradle @@ -163,6 +163,8 @@ subprojects { testRuntime "org.junit.jupiter:junit-jupiter-engine:5.0.0-M2" testCompile "junit:junit:4.12" testRuntime "org.junit.vintage:junit-vintage-engine:4.12.0-M2" +/* compile "org.junit.jupiter:junit-jupiter-api:5.0.0-M2" + compile "org.junit.vintage:junit-vintage-engine:4.12.0-M2"*/ } junitPlatform { From 2161792f9978e84b7e699c33e871934859dc731c Mon Sep 17 00:00:00 2001 From: Bruce Eckel Date: Tue, 23 Aug 2016 12:33:38 -0600 Subject: [PATCH 101/320] moving to Junit 5 --- build.gradle | 17 ++++++++++------- references/DeepCopy.java | 4 ++-- verifying/FirstJUnit5Tests.java | 4 ++-- verifying/QueueTest.java | 4 ++-- verifying/SimpleJUnit.java | 4 ++-- verifying/StringInverterTest.java | 8 ++++---- 6 files changed, 22 insertions(+), 19 deletions(-) diff --git a/build.gradle b/build.gradle index 94327bfd4..795121517 100644 --- a/build.gradle +++ b/build.gradle @@ -125,10 +125,12 @@ class Tags { } } -ext.junit4Version = '4.12' -ext.junitVintageVersion = '4.12.0-M2' -ext.junitPlatformVersion = '1.0.0-M2' -ext.junitJupiterVersion = '5.0.0-M2' +ext { + junit4Version = '4.12' + junitVintageVersion = '4.12.0-M2' + junitPlatformVersion = '1.0.0-M2' + junitJupiterVersion = '5.0.0-M2' +} subprojects { apply plugin: 'com.github.johnrengelman.shadow' @@ -146,7 +148,7 @@ subprojects { } dependencies { - //compile 'junit:junit:4.12' + // compile 'junit:junit:4.12' compile group: 'org.slf4j', name: 'slf4j-api', version: '1.7.+' compile group: 'ch.qos.logback', name: 'logback-classic', version: '1.+' // You can also use the JDK's built-in logging as the back end: @@ -159,11 +161,12 @@ subprojects { // If you also want to support JUnit 3 and JUnit 4 tests testCompile("junit:junit:${junit4Version}") testRuntime("org.junit.vintage:junit-vintage-engine:${junitVintageVersion}")*/ + compile "org.junit.jupiter:junit-jupiter-api:5.0.0-M2" testCompile "org.junit.jupiter:junit-jupiter-api:5.0.0-M2" testRuntime "org.junit.jupiter:junit-jupiter-engine:5.0.0-M2" - testCompile "junit:junit:4.12" +/* testCompile "junit:junit:4.12" testRuntime "org.junit.vintage:junit-vintage-engine:4.12.0-M2" -/* compile "org.junit.jupiter:junit-jupiter-api:5.0.0-M2" +*//* compile "org.junit.jupiter:junit-jupiter-api:5.0.0-M2" compile "org.junit.vintage:junit-vintage-engine:4.12.0-M2"*/ } diff --git a/references/DeepCopy.java b/references/DeepCopy.java index 0976d6dc6..ba4db549c 100644 --- a/references/DeepCopy.java +++ b/references/DeepCopy.java @@ -4,8 +4,8 @@ // Visit http://mindviewinc.com/Books/OnJava/ for more book information. // Cloning a composed object // (Install libraries from junit.org) -import org.junit.Test; -import static org.junit.Assert.assertEquals; +import org.junit.jupiter.api.*; +import static org.junit.jupiter.api.Assertions.*; class DepthReading implements Cloneable { private double depth; diff --git a/verifying/FirstJUnit5Tests.java b/verifying/FirstJUnit5Tests.java index da6546a34..c4ced5d99 100644 --- a/verifying/FirstJUnit5Tests.java +++ b/verifying/FirstJUnit5Tests.java @@ -3,8 +3,8 @@ // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. package verifying; -import static org.junit.jupiter.api.Assertions.assertEquals; -import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.*; +import static org.junit.jupiter.api.Assertions.*; class FirstJUnit5Tests { @Test diff --git a/verifying/QueueTest.java b/verifying/QueueTest.java index 5036b7f66..423cd66f2 100644 --- a/verifying/QueueTest.java +++ b/verifying/QueueTest.java @@ -4,8 +4,8 @@ // Visit http://mindviewinc.com/Books/OnJava/ for more book information. package verifying; import verifying.Queue; -import org.junit.Test; -import static org.junit.Assert.*; +import org.junit.jupiter.api.*; +import static org.junit.jupiter.api.Assertions.*; public class QueueTest { private Queue queue = new Queue(10); diff --git a/verifying/SimpleJUnit.java b/verifying/SimpleJUnit.java index 7d98eff7a..a01aa36ec 100644 --- a/verifying/SimpleJUnit.java +++ b/verifying/SimpleJUnit.java @@ -5,8 +5,8 @@ // Simple use of JUnit to test ArrayList package verifying; import java.util.*; -import org.junit.*; -import static org.junit.Assert.*; +import org.junit.jupiter.api.*; +import static org.junit.jupiter.api.Assertions.*; // Keeps track of list objects as they are // created and cleaned up: diff --git a/verifying/StringInverterTest.java b/verifying/StringInverterTest.java index 30c1ebd2a..76bd8a6b0 100644 --- a/verifying/StringInverterTest.java +++ b/verifying/StringInverterTest.java @@ -4,10 +4,10 @@ // Visit http://mindviewinc.com/Books/OnJava/ for more book information. // {ValidateByHand} // Don't run by itself import java.util.*; -import org.junit.*; -import static org.junit.Assert.*; -import org.junit.runner.*; -import org.junit.runner.notification.Failure; +import org.junit.jupiter.api.*; +import static org.junit.jupiter.api.Assertions.*; +import org.junit.jupiter.runner.*; +import org.junit.jupiter.runner.notification.Failure; public class StringInverterTest { static StringInverter inverter; From 2ca00a4fa5e6b84904a731a7a94ee0365312bfd7 Mon Sep 17 00:00:00 2001 From: Bruce Eckel Date: Tue, 23 Aug 2016 16:48:02 -0600 Subject: [PATCH 102/320] Closer to working with JUnit5 --- build.gradle | 2 +- test/ConfigureLogging.java | 102 ---------------- test/CustomHandler.java | 47 -------- test/InfoLogging.java | 19 --- test/InfoLogging2.java | 21 ---- test/LogToFile.java | 22 ---- test/LogToFile2.java | 24 ---- test/LoggingLevelManipulation.java | 184 ----------------------------- test/LoggingLevels.java | 61 ---------- test/MultipleHandlers.java | 27 ----- test/MultipleHandlers2.java | 26 ---- test/PrintableLogRecord.java | 60 ---------- test/SimpleFilter.java | 45 ------- test/SimpleFormatterExample.java | 38 ------ test/log.prop | 32 ----- verifying/Queue.java | 1 + verifying/QueueTest.java | 4 +- verifying/SimpleJUnit.java | 8 +- verifying/StringInverterTest.java | 33 +++--- 19 files changed, 27 insertions(+), 729 deletions(-) delete mode 100644 test/ConfigureLogging.java delete mode 100644 test/CustomHandler.java delete mode 100644 test/InfoLogging.java delete mode 100644 test/InfoLogging2.java delete mode 100644 test/LogToFile.java delete mode 100644 test/LogToFile2.java delete mode 100644 test/LoggingLevelManipulation.java delete mode 100644 test/LoggingLevels.java delete mode 100644 test/MultipleHandlers.java delete mode 100644 test/MultipleHandlers2.java delete mode 100644 test/PrintableLogRecord.java delete mode 100644 test/SimpleFilter.java delete mode 100644 test/SimpleFormatterExample.java delete mode 100644 test/log.prop diff --git a/build.gradle b/build.gradle index 795121517..bae50d8ab 100644 --- a/build.gradle +++ b/build.gradle @@ -161,7 +161,7 @@ subprojects { // If you also want to support JUnit 3 and JUnit 4 tests testCompile("junit:junit:${junit4Version}") testRuntime("org.junit.vintage:junit-vintage-engine:${junitVintageVersion}")*/ - compile "org.junit.jupiter:junit-jupiter-api:5.0.0-M2" + compile "org.junit.jupiter:junit-jupiter-api:5.0.0-M2" testCompile "org.junit.jupiter:junit-jupiter-api:5.0.0-M2" testRuntime "org.junit.jupiter:junit-jupiter-engine:5.0.0-M2" /* testCompile "junit:junit:4.12" diff --git a/test/ConfigureLogging.java b/test/ConfigureLogging.java deleted file mode 100644 index fbf0958d2..000000000 --- a/test/ConfigureLogging.java +++ /dev/null @@ -1,102 +0,0 @@ -// test/ConfigureLogging.java -// (c)2016 MindView LLC: see Copyright.txt -// We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. -// {java ConfigureLogging -// -Djava.util.logging.config.file=log.prop} -// {ErrorOutputExpected} -import java.util.logging.*; - -public class ConfigureLogging { - static Logger - lgr = Logger.getLogger("com"), - lgr2 = Logger.getLogger("com.mindviewinc"), - util= Logger.getLogger("onjava"), - test= Logger.getLogger("com.mindviewinc.test"), - rand = Logger.getLogger("random"); - public ConfigureLogging() { - /* - Set Additional formatters, Filters and - Handlers for the loggers here. You cannot - specify the Handlers for loggers except - the root logger from the configuration - file. - */ - } - public static void main(String[] args) { - sendLogMessages(lgr); - sendLogMessages(lgr2); - sendLogMessages(util); - sendLogMessages(test); - sendLogMessages(rand); - } - private static void - sendLogMessages(Logger logger) { - System.out.println(" Logger Name : " - + logger.getName() + " Level: " - + logger.getLevel()); - logger.finest("Finest"); - logger.finer("Finer"); - logger.fine("Fine"); - logger.config("Config"); - logger.info("Info"); - logger.warning("Warning"); - logger.severe("Severe"); - } -} -/* Output: - Logger Name : com Level: null - Logger Name : com.mindviewinc Level: FINEST - Logger Name : onjava Level: INFO - Logger Name : com.mindviewinc.test Level: FINER - Logger Name : random Level: SEVERE -___[ Error Output ]___ -Jul 27, 2016 10:50:38 AM ConfigureLogging sendLogMessages -FINEST: Finest -Jul 27, 2016 10:50:38 AM ConfigureLogging sendLogMessages -FINER: Finer -Jul 27, 2016 10:50:38 AM ConfigureLogging sendLogMessages -FINE: Fine -Jul 27, 2016 10:50:38 AM ConfigureLogging sendLogMessages -CONFIG: Config -Jul 27, 2016 10:50:38 AM ConfigureLogging sendLogMessages -INFO: Info -Jul 27, 2016 10:50:38 AM ConfigureLogging sendLogMessages -WARNING: Warning -Jul 27, 2016 10:50:38 AM ConfigureLogging sendLogMessages -SEVERE: Severe -Jul 27, 2016 10:50:38 AM ConfigureLogging sendLogMessages -FINEST: Finest -Jul 27, 2016 10:50:38 AM ConfigureLogging sendLogMessages -FINER: Finer -Jul 27, 2016 10:50:38 AM ConfigureLogging sendLogMessages -FINE: Fine -Jul 27, 2016 10:50:38 AM ConfigureLogging sendLogMessages -CONFIG: Config -Jul 27, 2016 10:50:38 AM ConfigureLogging sendLogMessages -INFO: Info -Jul 27, 2016 10:50:38 AM ConfigureLogging sendLogMessages -WARNING: Warning -Jul 27, 2016 10:50:38 AM ConfigureLogging sendLogMessages -SEVERE: Severe -Jul 27, 2016 10:50:38 AM ConfigureLogging sendLogMessages -INFO: Info -Jul 27, 2016 10:50:38 AM ConfigureLogging sendLogMessages -WARNING: Warning -Jul 27, 2016 10:50:38 AM ConfigureLogging sendLogMessages -SEVERE: Severe -Jul 27, 2016 10:50:38 AM ConfigureLogging sendLogMessages -FINER: Finer -Jul 27, 2016 10:50:38 AM ConfigureLogging sendLogMessages -FINE: Fine -Jul 27, 2016 10:50:38 AM ConfigureLogging sendLogMessages -CONFIG: Config -Jul 27, 2016 10:50:38 AM ConfigureLogging sendLogMessages -INFO: Info -Jul 27, 2016 10:50:38 AM ConfigureLogging sendLogMessages -WARNING: Warning -Jul 27, 2016 10:50:38 AM ConfigureLogging sendLogMessages -SEVERE: Severe -Jul 27, 2016 10:50:38 AM ConfigureLogging sendLogMessages -SEVERE: Severe -*/ diff --git a/test/CustomHandler.java b/test/CustomHandler.java deleted file mode 100644 index 94cea7f3d..000000000 --- a/test/CustomHandler.java +++ /dev/null @@ -1,47 +0,0 @@ -// test/CustomHandler.java -// (c)2016 MindView LLC: see Copyright.txt -// We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. -// How to write custom handler -// {ErrorOutputExpected} -import java.util.logging.*; -import java.util.*; - -public class CustomHandler { - private static Logger logger = - Logger.getLogger("CustomHandler"); - private static List trace = - new ArrayList<>(); - public static void main(String[] args) { - logger.addHandler(new Handler() { - @Override - public void publish(LogRecord logRecord) { - trace.add(logRecord.getLevel() + ":"); - trace.add(logRecord.getSourceClassName() - + ":"); - trace.add( - logRecord.getSourceMethodName() +":"); - trace.add("<" + logRecord.getMessage() - + ">"); - trace.add("\n"); - } - @Override - public void flush() {} - @Override - public void close() {} - }); - logger.warning("Logging Warning"); - logger.info("Logging Info"); - System.out.print(trace); - } -} -/* Output: -[WARNING:, CustomHandler:, main:, , -, INFO:, CustomHandler:, main:, , -] -___[ Error Output ]___ -Jul 27, 2016 10:50:39 AM CustomHandler main -WARNING: Logging Warning -Jul 27, 2016 10:50:39 AM CustomHandler main -INFO: Logging Info -*/ diff --git a/test/InfoLogging.java b/test/InfoLogging.java deleted file mode 100644 index 52258727b..000000000 --- a/test/InfoLogging.java +++ /dev/null @@ -1,19 +0,0 @@ -// test/InfoLogging.java -// (c)2016 MindView LLC: see Copyright.txt -// We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. -// {ErrorOutputExpected} -import java.util.logging.*; - -public class InfoLogging { - private static Logger logger = - Logger.getLogger("InfoLogging"); - public static void main(String[] args) { - logger.info("Logging: INFO-level message"); - } -} -/* Output: -___[ Error Output ]___ -Jul 27, 2016 10:50:39 AM InfoLogging main -INFO: Logging: INFO-level message -*/ diff --git a/test/InfoLogging2.java b/test/InfoLogging2.java deleted file mode 100644 index 1579d7961..000000000 --- a/test/InfoLogging2.java +++ /dev/null @@ -1,21 +0,0 @@ -// test/InfoLogging2.java -// (c)2016 MindView LLC: see Copyright.txt -// We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. -// Guaranteeing proper class and method names -// {ErrorOutputExpected} -import java.util.logging.*; - -public class InfoLogging2 { - private static Logger logger = - Logger.getLogger("InfoLogging2"); - public static void main(String[] args) { - logger.logp(Level.INFO, "InfoLogging2", - "main", "Logging an INFO-level message"); - } -} -/* Output: -___[ Error Output ]___ -Jul 27, 2016 10:50:40 AM InfoLogging2 main -INFO: Logging an INFO-level message -*/ diff --git a/test/LogToFile.java b/test/LogToFile.java deleted file mode 100644 index 3b070998b..000000000 --- a/test/LogToFile.java +++ /dev/null @@ -1,22 +0,0 @@ -// test/LogToFile.java -// (c)2016 MindView LLC: see Copyright.txt -// We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. -// {ErrorOutputExpected} -import java.util.logging.*; - -public class LogToFile { - private static Logger logger = - Logger.getLogger("LogToFile"); - public static void - main(String[] args) throws Exception { - logger.addHandler( - new FileHandler("LogToFile.xml")); - logger.info("A message logged to the file"); - } -} -/* Output: -___[ Error Output ]___ -Jul 27, 2016 10:50:41 AM LogToFile main -INFO: A message logged to the file -*/ diff --git a/test/LogToFile2.java b/test/LogToFile2.java deleted file mode 100644 index f53bf61e7..000000000 --- a/test/LogToFile2.java +++ /dev/null @@ -1,24 +0,0 @@ -// test/LogToFile2.java -// (c)2016 MindView LLC: see Copyright.txt -// We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. -// {ErrorOutputExpected} -import java.util.logging.*; - -public class LogToFile2 { - private static Logger logger = - Logger.getLogger("LogToFile2"); - public static void - main(String[] args) throws Exception { - FileHandler logFile = - new FileHandler("LogToFile2.txt"); - logFile.setFormatter(new SimpleFormatter()); - logger.addHandler(logFile); - logger.info("A message logged to the file"); - } -} -/* Output: -___[ Error Output ]___ -Jul 27, 2016 10:50:41 AM LogToFile2 main -INFO: A message logged to the file -*/ diff --git a/test/LoggingLevelManipulation.java b/test/LoggingLevelManipulation.java deleted file mode 100644 index ad4f1a326..000000000 --- a/test/LoggingLevelManipulation.java +++ /dev/null @@ -1,184 +0,0 @@ -// test/LoggingLevelManipulation.java -// (c)2016 MindView LLC: see Copyright.txt -// We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. -// {ErrorOutputExpected} -import java.util.logging.Level; -import java.util.logging.Logger; - -public class LoggingLevelManipulation { - private static Logger - lgr = Logger.getLogger("com"), - lgr2 = Logger.getLogger("com.mindviewinc"), - util= Logger.getLogger("onjava"), - test= Logger.getLogger("com.mindviewinc.test"), - rand = Logger.getLogger("random"); - static void printLogMessages(Logger logger) { - logger.finest(logger.getName() + " Finest"); - logger.finer(logger.getName() + " Finer"); - logger.fine(logger.getName() + " Fine"); - logger.config(logger.getName() + " Config"); - logger.info(logger.getName() + " Info"); - logger.warning(logger.getName()+" Warning"); - logger.severe(logger.getName() + " Severe"); - } - static void logMessages() { - printLogMessages(lgr); - printLogMessages(lgr2); - printLogMessages(util); - printLogMessages(test); - printLogMessages(rand); - } - static void printLevels() { - System.out.println(" -- printing levels -- " - + lgr.getName() - + " : " + lgr.getLevel() - + " " + lgr2.getName() - + " : " + lgr2.getLevel() - + " " + util.getName() - + " : " + util.getLevel() - + " " + test.getName() - + " : " + test.getLevel() - + " " + rand.getName() - + " : " + rand.getLevel()); - } - public static void main(String[] args) { - printLevels(); - lgr.setLevel(Level.SEVERE); - printLevels(); - System.out.println("net level: SEVERE"); - logMessages(); - util.setLevel(Level.FINEST); - test.setLevel(Level.FINEST); - rand.setLevel(Level.FINEST); - printLevels(); - System.out.println( - "individual loggers set to FINEST"); - logMessages(); - lgr.setLevel(Level.FINEST); - printLevels(); - System.out.println("net level: FINEST"); - logMessages(); - } -} -/* Output: - -- printing levels -- com : null com.mindviewinc : null -onjava : null com.mindviewinc.test : null random : null - -- printing levels -- com : SEVERE com.mindviewinc : null -onjava : null com.mindviewinc.test : null random : null -net level: SEVERE - -- printing levels -- com : SEVERE com.mindviewinc : null -onjava : FINEST com.mindviewinc.test : FINEST random : -FINEST -individual loggers set to FINEST - -- printing levels -- com : FINEST com.mindviewinc : null -onjava : FINEST com.mindviewinc.test : FINEST random : -FINEST -net level: FINEST -___[ Error Output ]___ -Jul 27, 2016 10:50:42 AM LoggingLevelManipulation -printLogMessages -SEVERE: com Severe -Jul 27, 2016 10:50:42 AM LoggingLevelManipulation -printLogMessages -SEVERE: com.mindviewinc Severe -Jul 27, 2016 10:50:42 AM LoggingLevelManipulation -printLogMessages -INFO: onjava Info -Jul 27, 2016 10:50:42 AM LoggingLevelManipulation -printLogMessages -WARNING: onjava Warning -Jul 27, 2016 10:50:42 AM LoggingLevelManipulation -printLogMessages -SEVERE: onjava Severe -Jul 27, 2016 10:50:42 AM LoggingLevelManipulation -printLogMessages -SEVERE: com.mindviewinc.test Severe -Jul 27, 2016 10:50:42 AM LoggingLevelManipulation -printLogMessages -INFO: random Info -Jul 27, 2016 10:50:42 AM LoggingLevelManipulation -printLogMessages -WARNING: random Warning -Jul 27, 2016 10:50:42 AM LoggingLevelManipulation -printLogMessages -SEVERE: random Severe -Jul 27, 2016 10:50:42 AM LoggingLevelManipulation -printLogMessages -SEVERE: com Severe -Jul 27, 2016 10:50:42 AM LoggingLevelManipulation -printLogMessages -SEVERE: com.mindviewinc Severe -Jul 27, 2016 10:50:42 AM LoggingLevelManipulation -printLogMessages -INFO: onjava Info -Jul 27, 2016 10:50:42 AM LoggingLevelManipulation -printLogMessages -WARNING: onjava Warning -Jul 27, 2016 10:50:42 AM LoggingLevelManipulation -printLogMessages -SEVERE: onjava Severe -Jul 27, 2016 10:50:42 AM LoggingLevelManipulation -printLogMessages -INFO: com.mindviewinc.test Info -Jul 27, 2016 10:50:42 AM LoggingLevelManipulation -printLogMessages -WARNING: com.mindviewinc.test Warning -Jul 27, 2016 10:50:42 AM LoggingLevelManipulation -printLogMessages -SEVERE: com.mindviewinc.test Severe -Jul 27, 2016 10:50:42 AM LoggingLevelManipulation -printLogMessages -INFO: random Info -Jul 27, 2016 10:50:42 AM LoggingLevelManipulation -printLogMessages -WARNING: random Warning -Jul 27, 2016 10:50:42 AM LoggingLevelManipulation -printLogMessages -SEVERE: random Severe -Jul 27, 2016 10:50:42 AM LoggingLevelManipulation -printLogMessages -INFO: com Info -Jul 27, 2016 10:50:42 AM LoggingLevelManipulation -printLogMessages -WARNING: com Warning -Jul 27, 2016 10:50:42 AM LoggingLevelManipulation -printLogMessages -SEVERE: com Severe -Jul 27, 2016 10:50:42 AM LoggingLevelManipulation -printLogMessages -INFO: com.mindviewinc Info -Jul 27, 2016 10:50:42 AM LoggingLevelManipulation -printLogMessages -WARNING: com.mindviewinc Warning -Jul 27, 2016 10:50:42 AM LoggingLevelManipulation -printLogMessages -SEVERE: com.mindviewinc Severe -Jul 27, 2016 10:50:42 AM LoggingLevelManipulation -printLogMessages -INFO: onjava Info -Jul 27, 2016 10:50:42 AM LoggingLevelManipulation -printLogMessages -WARNING: onjava Warning -Jul 27, 2016 10:50:42 AM LoggingLevelManipulation -printLogMessages -SEVERE: onjava Severe -Jul 27, 2016 10:50:42 AM LoggingLevelManipulation -printLogMessages -INFO: com.mindviewinc.test Info -Jul 27, 2016 10:50:42 AM LoggingLevelManipulation -printLogMessages -WARNING: com.mindviewinc.test Warning -Jul 27, 2016 10:50:42 AM LoggingLevelManipulation -printLogMessages -SEVERE: com.mindviewinc.test Severe -Jul 27, 2016 10:50:42 AM LoggingLevelManipulation -printLogMessages -INFO: random Info -Jul 27, 2016 10:50:42 AM LoggingLevelManipulation -printLogMessages -WARNING: random Warning -Jul 27, 2016 10:50:42 AM LoggingLevelManipulation -printLogMessages -SEVERE: random Severe -*/ diff --git a/test/LoggingLevels.java b/test/LoggingLevels.java deleted file mode 100644 index 308aeaeec..000000000 --- a/test/LoggingLevels.java +++ /dev/null @@ -1,61 +0,0 @@ -// test/LoggingLevels.java -// (c)2016 MindView LLC: see Copyright.txt -// We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. -// {ErrorOutputExpected} -import java.util.logging.Level; -import java.util.logging.Logger; - -public class LoggingLevels { - private static Logger - lgr = Logger.getLogger("com"), - lgr2 = Logger.getLogger("com.mindviewinc"), - util= Logger.getLogger("onjava"), - test= Logger.getLogger("com.mindviewinc.test"), - rand = Logger.getLogger("random"); - private static void logMessages() { - lgr.info("com : info"); - lgr2.info("com.mindviewinc : info"); - util.info("util : info"); - test.severe("test : severe"); - rand.info("random : info"); - } - public static void main(String[] args) { - lgr.setLevel(Level.SEVERE); - System.out.println("com level: SEVERE"); - logMessages(); - util.setLevel(Level.FINEST); - test.setLevel(Level.FINEST); - rand.setLevel(Level.FINEST); - System.out.println( - "individual loggers set to FINEST"); - logMessages(); - lgr.setLevel(Level.SEVERE); - System.out.println("com level: SEVERE"); - logMessages(); - } -} -/* Output: -com level: SEVERE -individual loggers set to FINEST -com level: SEVERE -___[ Error Output ]___ -Jul 27, 2016 10:50:42 AM LoggingLevels logMessages -INFO: util : info -Jul 27, 2016 10:50:42 AM LoggingLevels logMessages -SEVERE: test : severe -Jul 27, 2016 10:50:42 AM LoggingLevels logMessages -INFO: random : info -Jul 27, 2016 10:50:42 AM LoggingLevels logMessages -INFO: util : info -Jul 27, 2016 10:50:42 AM LoggingLevels logMessages -SEVERE: test : severe -Jul 27, 2016 10:50:42 AM LoggingLevels logMessages -INFO: random : info -Jul 27, 2016 10:50:42 AM LoggingLevels logMessages -INFO: util : info -Jul 27, 2016 10:50:42 AM LoggingLevels logMessages -SEVERE: test : severe -Jul 27, 2016 10:50:42 AM LoggingLevels logMessages -INFO: random : info -*/ diff --git a/test/MultipleHandlers.java b/test/MultipleHandlers.java deleted file mode 100644 index ee71bb225..000000000 --- a/test/MultipleHandlers.java +++ /dev/null @@ -1,27 +0,0 @@ -// test/MultipleHandlers.java -// (c)2016 MindView LLC: see Copyright.txt -// We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. -// {ErrorOutputExpected} -import java.util.logging.*; - -public class MultipleHandlers { - private static Logger logger = - Logger.getLogger("MultipleHandlers"); - public static void - main(String[] args) throws Exception { - FileHandler logFile = - new FileHandler("MultipleHandlers.xml"); - logger.addHandler(logFile); - logger.addHandler(new ConsoleHandler()); - logger.warning( - "Output to multiple handlers"); - } -} -/* Output: -___[ Error Output ]___ -Jul 27, 2016 10:50:43 AM MultipleHandlers main -WARNING: Output to multiple handlers -Jul 27, 2016 10:50:43 AM MultipleHandlers main -WARNING: Output to multiple handlers -*/ diff --git a/test/MultipleHandlers2.java b/test/MultipleHandlers2.java deleted file mode 100644 index 2e714d4ed..000000000 --- a/test/MultipleHandlers2.java +++ /dev/null @@ -1,26 +0,0 @@ -// test/MultipleHandlers2.java -// (c)2016 MindView LLC: see Copyright.txt -// We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. -// {ErrorOutputExpected} -import java.util.logging.*; - -public class MultipleHandlers2 { - private static Logger logger = - Logger.getLogger("MultipleHandlers2"); - public static void - main(String[] args) throws Exception { - FileHandler logFile = - new FileHandler("MultipleHandlers2.xml"); - logger.addHandler(logFile); - logger.addHandler(new ConsoleHandler()); - logger.setUseParentHandlers(false); - logger.warning( - "Output to multiple handlers"); - } -} -/* Output: -___[ Error Output ]___ -Jul 27, 2016 10:50:43 AM MultipleHandlers2 main -WARNING: Output to multiple handlers -*/ diff --git a/test/PrintableLogRecord.java b/test/PrintableLogRecord.java deleted file mode 100644 index a88bb7a44..000000000 --- a/test/PrintableLogRecord.java +++ /dev/null @@ -1,60 +0,0 @@ -// test/PrintableLogRecord.java -// (c)2016 MindView LLC: see Copyright.txt -// We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. -// Override LogRecord toString() -import java.util.logging.*; - -public class PrintableLogRecord extends LogRecord { - public PrintableLogRecord(Level level, String str) { - super(level, str); - } - @Override - public String toString() { - String result = "Level<" + getLevel()+ ">\n" - + "LoggerName<" + getLoggerName() + ">\n" - + "Message<" + getMessage() + ">\n" - + "CurrentMillis<" + getMillis() + ">\n" - + "Params"; - Object[] objParams = getParameters(); - if(objParams == null) - result += "\n"; - else - for(int i = 0; i < objParams.length; i++) - result += " Param # <" + i + " value "+ - objParams[i].toString() + ">\n"; - result += "ResourceBundle<" - + getResourceBundle() - + ">\nResourceBundleName<" - + getResourceBundleName() - + ">\nSequenceNumber<" - + getSequenceNumber() - + ">\nSourceClassName<" - + getSourceClassName() - + ">\nSourceMethodName<" - + getSourceMethodName() - + ">\nThread Id<" + getThreadID() - + ">\nThrown<" + getThrown() + ">"; - return result; - } - public static void main(String[] args) { - PrintableLogRecord logRecord = - new PrintableLogRecord( - Level.FINEST, "Simple Log Record"); - System.out.println(logRecord); - } -} -/* Output: -Level -LoggerName -Message -CurrentMillis<1469638244376> -Params -ResourceBundle -ResourceBundleName -SequenceNumber<0> -SourceClassName -SourceMethodName -Thread Id<1> -Thrown -*/ diff --git a/test/SimpleFilter.java b/test/SimpleFilter.java deleted file mode 100644 index 7c34ce195..000000000 --- a/test/SimpleFilter.java +++ /dev/null @@ -1,45 +0,0 @@ -// test/SimpleFilter.java -// (c)2016 MindView LLC: see Copyright.txt -// We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. -// {ErrorOutputExpected} -import java.util.logging.*; - -public class SimpleFilter { - private static Logger logger = - Logger.getLogger("SimpleFilter"); - static class Duck {}; - static class Wombat {}; - static void sendLogMessages() { - logger.log(Level.WARNING, - "A duck in the house!", new Duck()); - logger.log(Level.WARNING, - "A Wombat at large!", new Wombat()); - } - public static void main(String[] args) { - sendLogMessages(); - logger.setFilter(record -> { - Object[] params = - record.getParameters(); - if(params == null) - return true; // No parameters - if(record.getParameters()[0] - instanceof Duck) - return true; // Only log Ducks - return false; - }); - logger.info("After setting filter.."); - sendLogMessages(); - } -} -/* Output: -___[ Error Output ]___ -Jul 27, 2016 10:50:44 AM SimpleFilter sendLogMessages -WARNING: A duck in the house! -Jul 27, 2016 10:50:44 AM SimpleFilter sendLogMessages -WARNING: A Wombat at large! -Jul 27, 2016 10:50:44 AM SimpleFilter main -INFO: After setting filter.. -Jul 27, 2016 10:50:44 AM SimpleFilter sendLogMessages -WARNING: A duck in the house! -*/ diff --git a/test/SimpleFormatterExample.java b/test/SimpleFormatterExample.java deleted file mode 100644 index 81f7b83bd..000000000 --- a/test/SimpleFormatterExample.java +++ /dev/null @@ -1,38 +0,0 @@ -// test/SimpleFormatterExample.java -// (c)2016 MindView LLC: see Copyright.txt -// We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. -// {ErrorOutputExpected} -import java.util.logging.*; - -public class SimpleFormatterExample { - private static Logger logger = - Logger.getLogger("SimpleFormatterExample"); - private static void logMessages() { - logger.info("Line One"); - logger.info("Line Two"); - } - public static void main(String[] args) { - logger.setUseParentHandlers(false); - Handler conHdlr = new ConsoleHandler(); - conHdlr.setFormatter(new Formatter() { - public String format(LogRecord record) { - return record.getLevel() + " : " - + record.getSourceClassName() - + " -:- " - + record.getSourceMethodName() - + " -:- " - + record.getMessage() + "\n"; - } - }); - logger.addHandler(conHdlr); - logMessages(); - } -} -/* Output: -___[ Error Output ]___ -INFO : SimpleFormatterExample -:- logMessages -:- Line -One -INFO : SimpleFormatterExample -:- logMessages -:- Line -Two -*/ diff --git a/test/log.prop b/test/log.prop deleted file mode 100644 index c9c33b1bc..000000000 --- a/test/log.prop +++ /dev/null @@ -1,32 +0,0 @@ -// test/log.prop -#### Configuration File #### -# Global Params -# Handlers installed for the root logger -handlers= java.util.logging.ConsoleHandler java.util.logging.FileHandler -# Level for root logger--is used by any logger -# that does not have its level set -.level= FINEST -# Initialization class--the public no-arg constructor -# of this class is called by the Logging framework -config = ConfigureLogging - -# Configure FileHandler -# Logging file name - %u specifies unique -java.util.logging.FileHandler.pattern = java%g.log -# Write 100000 bytes before rotating this file -java.util.logging.FileHandler.limit = 100000 -# Number of rotating files -java.util.logging.FileHandler.count = 3 -# Formatter for this FileHandler -java.util.logging.FileHandler.formatter = java.util.logging.SimpleFormatter - -# Configure ConsoleHandler -java.util.logging.ConsoleHandler.level = FINEST -java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter - -# Set Logger Levels # -net.level=SEVERE -com.mindviewinc.level = FINEST -onjava.level = INFO -com.mindviewinc.test.level = FINER -random.level= SEVERE diff --git a/verifying/Queue.java b/verifying/Queue.java index 4f90d2432..ca46f4508 100644 --- a/verifying/Queue.java +++ b/verifying/Queue.java @@ -87,3 +87,4 @@ public String dump() { ", empty() = " + empty() + ", queue = " + Arrays.asList(data); } +} diff --git a/verifying/QueueTest.java b/verifying/QueueTest.java index 423cd66f2..8982132d8 100644 --- a/verifying/QueueTest.java +++ b/verifying/QueueTest.java @@ -3,14 +3,14 @@ // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. package verifying; -import verifying.Queue; +import verifying.Queue.*; import org.junit.jupiter.api.*; import static org.junit.jupiter.api.Assertions.*; public class QueueTest { private Queue queue = new Queue(10); private int i = 0; - @Before + @BeforeEach public void initialize() { while(i < 5) // Preload with some data queue.put(Integer.toString(i++)); diff --git a/verifying/SimpleJUnit.java b/verifying/SimpleJUnit.java index a01aa36ec..5037979ec 100644 --- a/verifying/SimpleJUnit.java +++ b/verifying/SimpleJUnit.java @@ -21,14 +21,14 @@ public CountedList() { public class SimpleJUnit { private CountedList list; - @Before + @BeforeEach public void initialize() { list = new CountedList(); System.out.println("Set up for " + list.getId()); for(int i = 0; i < 3; i++) list.add(Integer.toString(i)); } - @After + @AfterEach public void cleanup() { System.out.println("Cleaning up " + list.getId()); } @@ -55,8 +55,8 @@ public void replace() { private void compare(ArrayList lst, String[] strs) { String[] array = (String[])lst.toArray(); - assertTrue("Arrays not the same length", - array.length == strs.length); + assertTrue(array.length == strs.length, + "Arrays not the same length"); for(int i = 0; i < array.length; i++) assertEquals(strs[i], array[i]); } diff --git a/verifying/StringInverterTest.java b/verifying/StringInverterTest.java index 76bd8a6b0..7910cb9f0 100644 --- a/verifying/StringInverterTest.java +++ b/verifying/StringInverterTest.java @@ -6,8 +6,7 @@ import java.util.*; import org.junit.jupiter.api.*; import static org.junit.jupiter.api.Assertions.*; -import org.junit.jupiter.runner.*; -import org.junit.jupiter.runner.notification.Failure; +// import org.junit.platform.runner.JUnitPlatform; public class StringInverterTest { static StringInverter inverter; @@ -17,39 +16,44 @@ public final void basicInversion_Succeed() { String out = "eXIT, pURSUED BY A bEAR."; assertEquals(inverter.invert(in), out); } - @Test(expected = ComparisonFailure.class) + @Test public final void basicInversion_Fail() { - assertEquals(inverter.invert("X"), "X"); + expectThrows(RuntimeException.class, () -> { + assertEquals(inverter.invert("X"), "X"); + }); } - @Test(expected = RuntimeException.class) + @Test public final void allowedCharacters_Fail() { - inverter.invert(";-_()*&^%$#@!~`"); - inverter.invert("0123456789"); + expectThrows(RuntimeException.class, () -> { + inverter.invert(";-_()*&^%$#@!~`"); + inverter.invert("0123456789"); + }); } - /*@Test + @Test public final void allowedCharacters_Succeed() { inverter.invert("abcdefghijklmnopqrstuvwxyz ,."); inverter.invert("ABCDEFGHIJKLMNOPQRSTUVWXYZ ,."); - assertTrue(true); // No exception thrown - }*/ - @Test(expected = RuntimeException.class) + } + @Test public final void lengthLessThan26_Fail() { String str = "xxxxxxxxxxxxxxxxxxxxxxxxxx"; assertTrue(str.length() > 25); - inverter.invert(str); + expectThrows(RuntimeException.class, () -> { + inverter.invert(str); + }); } @Test public final void lengthLessThan26_Succeed() { String str = "xxxxxxxxxxxxxxxxxxxxxxxxx"; assertTrue(str.length() < 26); inverter.invert(str); - assertTrue(true); // No exception thrown } + /* public static void main(String[] args) throws Exception{ assertEquals(args.length, 1); inverter = (StringInverter) Class.forName(args[0]).newInstance(); - Result result = JUnitCore.runClasses( + Result result = org.junit.runner.JUnitCore.runClasses( StringInverterTest.class); List failures = result.getFailures(); System.out.printf("%s has %d FAILURES:\n", @@ -61,4 +65,5 @@ public static void main(String[] args) throws Exception{ System.out.println(f.getMessage()); } } + */ } From 336d85c4cca4f3a73eb2de2ee7c0fbfd7dea4ab6 Mon Sep 17 00:00:00 2001 From: Bruce Eckel Date: Wed, 24 Aug 2016 16:28:10 -0600 Subject: [PATCH 103/320] Trying to get everything to build with JUnit5 --- build.gradle | 8 +- generics/Amphibian.java | 5 + generics/ApplyTest.java | 23 ---- generics/FilledList.java | 28 ++++ generics/FilledListMaker.java | 23 ---- generics/MultipleInterfaceVariants.java | 1 + generics/Shape.java | 19 +++ generics/SimpleQueue.java | 2 +- generics/Square.java | 5 + generics/TupleTest.java | 3 - generics/UseList.java | 1 + generics/Vehicle.java | 5 + references/DeepCopy.java | 125 ------------------ references/DeepCopyTest.java | 28 ++++ references/DepthReading.java | 29 ++++ references/OceanReading.java | 48 +++++++ references/TemperatureReading.java | 33 +++++ verifying/CountedList.java | 17 +++ ...{SimpleJUnit.java => CountedListTest.java} | 18 +-- verifying/Queue.java | 4 - verifying/QueueException.java | 9 ++ verifying/QueueTest.java | 2 +- 22 files changed, 238 insertions(+), 198 deletions(-) create mode 100644 generics/Amphibian.java create mode 100644 generics/FilledList.java delete mode 100644 generics/FilledListMaker.java create mode 100644 generics/Shape.java create mode 100644 generics/Square.java create mode 100644 generics/Vehicle.java delete mode 100644 references/DeepCopy.java create mode 100644 references/DeepCopyTest.java create mode 100644 references/DepthReading.java create mode 100644 references/OceanReading.java create mode 100644 references/TemperatureReading.java create mode 100644 verifying/CountedList.java rename verifying/{SimpleJUnit.java => CountedListTest.java} (86%) create mode 100644 verifying/QueueException.java diff --git a/build.gradle b/build.gradle index bae50d8ab..116148145 100644 --- a/build.gradle +++ b/build.gradle @@ -191,11 +191,11 @@ subprojects { main { java { srcDir projectDir - exclude "*Test.java" + // exclude "*Test.java" exclude "*Tests.java" exclude "*JUnit.java" exclude "StringInverter*.java" - exclude "Queue.java" + // exclude "Queue.java" } resources { srcDir projectDir @@ -207,11 +207,11 @@ subprojects { srcDir projectDir } } - test { +/* test { java { srcDir projectDir } - } + }*/ } /*test { diff --git a/generics/Amphibian.java b/generics/Amphibian.java new file mode 100644 index 000000000..6809ef71a --- /dev/null +++ b/generics/Amphibian.java @@ -0,0 +1,5 @@ +// generics/Amphibian.java +// (c)2016 MindView LLC: see Copyright.txt +// We make no guarantees that this code is fit for any purpose. +// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +public class Amphibian {} diff --git a/generics/ApplyTest.java b/generics/ApplyTest.java index 2bf45ad03..aa273cd87 100644 --- a/generics/ApplyTest.java +++ b/generics/ApplyTest.java @@ -6,29 +6,6 @@ import java.util.function.*; import onjava.*; -class Shape { - private static long counter = 0; - private final long id = counter++; - @Override - public String toString() { - return getClass().getSimpleName() + " " + id; - } - public void rotate() { - System.out.println(this + " rotate"); - } - public void resize(int newSize) { - System.out.println(this + " resize " + newSize); - } -} - -class Square extends Shape {} - -class FilledList extends ArrayList { - public FilledList(Supplier gen, int size) { - Suppliers.fill(this, gen, size); - } -} - public class ApplyTest { public static void main(String[] args) throws Exception { List shapes = diff --git a/generics/FilledList.java b/generics/FilledList.java new file mode 100644 index 000000000..efffa3bb6 --- /dev/null +++ b/generics/FilledList.java @@ -0,0 +1,28 @@ +// generics/FilledList.java +// (c)2016 MindView LLC: see Copyright.txt +// We make no guarantees that this code is fit for any purpose. +// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +import java.util.*; +import java.util.function.*; +import onjava.*; + +class FilledList extends ArrayList { + public FilledList(Supplier gen, int size) { + Suppliers.fill(this, gen, size); + } + public FilledList(T t, int size) { + for(int i = 0; i < size; i++) + this.add(t); + } + public static void main(String[] args) { + List list = new FilledList<>("Hello", 4); + System.out.println(list); + // Supplier version: + List ilist = new FilledList<>(() -> 47, 4); + System.out.println(ilist); + } +} +/* Output: +[Hello, Hello, Hello, Hello] +[47, 47, 47, 47] +*/ diff --git a/generics/FilledListMaker.java b/generics/FilledListMaker.java deleted file mode 100644 index 853931136..000000000 --- a/generics/FilledListMaker.java +++ /dev/null @@ -1,23 +0,0 @@ -// generics/FilledListMaker.java -// (c)2016 MindView LLC: see Copyright.txt -// We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. -import java.util.*; - -public class FilledListMaker { - List create(T t, int n) { - List result = new ArrayList<>(); - for(int i = 0; i < n; i++) - result.add(t); - return result; - } - public static void main(String[] args) { - FilledListMaker stringMaker = - new FilledListMaker<>(); - List list = stringMaker.create("Hello", 4); - System.out.println(list); - } -} -/* Output: -[Hello, Hello, Hello, Hello] -*/ diff --git a/generics/MultipleInterfaceVariants.java b/generics/MultipleInterfaceVariants.java index 035c79566..8badc8435 100644 --- a/generics/MultipleInterfaceVariants.java +++ b/generics/MultipleInterfaceVariants.java @@ -3,6 +3,7 @@ // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. // {CompileTimeError} (Will not compile) +package generics; interface Payable {} diff --git a/generics/Shape.java b/generics/Shape.java new file mode 100644 index 000000000..42363deeb --- /dev/null +++ b/generics/Shape.java @@ -0,0 +1,19 @@ +// generics/Shape.java +// (c)2016 MindView LLC: see Copyright.txt +// We make no guarantees that this code is fit for any purpose. +// Visit http://mindviewinc.com/Books/OnJava/ for more book information. + +public class Shape { + private static long counter = 0; + private final long id = counter++; + @Override + public String toString() { + return getClass().getSimpleName() + " " + id; + } + public void rotate() { + System.out.println(this + " rotate"); + } + public void resize(int newSize) { + System.out.println(this + " resize " + newSize); + } +} diff --git a/generics/SimpleQueue.java b/generics/SimpleQueue.java index 87f643845..385b438b9 100644 --- a/generics/SimpleQueue.java +++ b/generics/SimpleQueue.java @@ -2,7 +2,7 @@ // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. -// A different kind of collection that is Iterable +// A different kind of Iterable collection import java.util.*; public class SimpleQueue implements Iterable { diff --git a/generics/Square.java b/generics/Square.java new file mode 100644 index 000000000..9aa16d803 --- /dev/null +++ b/generics/Square.java @@ -0,0 +1,5 @@ +// generics/Square.java +// (c)2016 MindView LLC: see Copyright.txt +// We make no guarantees that this code is fit for any purpose. +// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +public class Square extends Shape {} diff --git a/generics/TupleTest.java b/generics/TupleTest.java index fee02b251..351269802 100644 --- a/generics/TupleTest.java +++ b/generics/TupleTest.java @@ -4,9 +4,6 @@ // Visit http://mindviewinc.com/Books/OnJava/ for more book information. import onjava.*; -class Amphibian {} -class Vehicle {} - public class TupleTest { static Tuple2 f() { // Autoboxing converts the int to Integer: diff --git a/generics/UseList.java b/generics/UseList.java index 29a7e53ff..e526b7437 100644 --- a/generics/UseList.java +++ b/generics/UseList.java @@ -3,6 +3,7 @@ // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. // {CompileTimeError} (Will not compile) +import java.util.*; public class UseList { void f(List v) {} diff --git a/generics/Vehicle.java b/generics/Vehicle.java new file mode 100644 index 000000000..0e742ca45 --- /dev/null +++ b/generics/Vehicle.java @@ -0,0 +1,5 @@ +// generics/Vehicle.java +// (c)2016 MindView LLC: see Copyright.txt +// We make no guarantees that this code is fit for any purpose. +// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +public class Vehicle {} diff --git a/references/DeepCopy.java b/references/DeepCopy.java deleted file mode 100644 index ba4db549c..000000000 --- a/references/DeepCopy.java +++ /dev/null @@ -1,125 +0,0 @@ -// references/DeepCopy.java -// (c)2016 MindView LLC: see Copyright.txt -// We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. -// Cloning a composed object -// (Install libraries from junit.org) -import org.junit.jupiter.api.*; -import static org.junit.jupiter.api.Assertions.*; - -class DepthReading implements Cloneable { - private double depth; - public DepthReading(double depth) { - this.depth = depth; - } - @Override - public DepthReading clone() { - try { - return (DepthReading)super.clone(); - } catch(CloneNotSupportedException e) { - throw new RuntimeException(e); - } - } - public double getDepth() { return depth; } - public void setDepth(double depth) { - this.depth = depth; - } - @Override - public String toString() { - return String.valueOf(depth); - } -} - -class TemperatureReading implements Cloneable { - private long time; - private double temperature; - public TemperatureReading(double temperature) { - time = System.currentTimeMillis(); - this.temperature = temperature; - } - @Override - public TemperatureReading clone() { - try { - return (TemperatureReading)super.clone(); - } catch(CloneNotSupportedException e) { - throw new RuntimeException(e); - } - } - public double getTemperature() { - return temperature; - } - public void setTemperature(double temp) { - this.temperature = temp; - } - @Override - public String toString() { - return String.valueOf(temperature); - } -} - -class OceanReading implements Cloneable { - private DepthReading depth; - private TemperatureReading temperature; - public - OceanReading(double tdata, double ddata) { - temperature = new TemperatureReading(tdata); - depth = new DepthReading(ddata); - } - @Override - public OceanReading clone() { - OceanReading or = null; - try { - or = (OceanReading)super.clone(); - } catch(CloneNotSupportedException e) { - throw new RuntimeException(e); - } - // Must clone references: - or.depth = (DepthReading)or.depth.clone(); - or.temperature = - (TemperatureReading)or.temperature.clone(); - return or; - } - public TemperatureReading getTemperatureReading() { - return temperature; - } - public void - setTemperatureReading(TemperatureReading tr) { - temperature = tr; - } - public DepthReading getDepthReading() { - return depth; - } - public void setDepthReading(DepthReading dr) { - this.depth = dr; - } - @Override - public String toString() { - return "temperature: " + temperature + - ", depth: " + depth; - } -} - -public class DeepCopy { - @Test - public void testClone() { - OceanReading reading = - new OceanReading(33.9, 100.5); - // Now clone it: - OceanReading clone = reading.clone(); - TemperatureReading tr = - clone.getTemperatureReading(); - tr.setTemperature(tr.getTemperature() + 1); - clone.setTemperatureReading(tr); - DepthReading dr = clone.getDepthReading(); - dr.setDepth(dr.getDepth() + 1); - clone.setDepthReading(dr); - assertEquals(reading.toString(), - "temperature: 33.9, depth: 100.5"); - assertEquals(clone.toString(), - "temperature: 34.9, depth: 101.5"); - } - public static void main(String[] args) { - org.junit.runner.JUnitCore.runClasses( - DeepCopy.class); - } -} diff --git a/references/DeepCopyTest.java b/references/DeepCopyTest.java new file mode 100644 index 000000000..93e0daa2e --- /dev/null +++ b/references/DeepCopyTest.java @@ -0,0 +1,28 @@ +// references/DeepCopyTest.java +// (c)2016 MindView LLC: see Copyright.txt +// We make no guarantees that this code is fit for any purpose. +// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +package references; +import org.junit.jupiter.api.*; +import static org.junit.jupiter.api.Assertions.*; + +public class DeepCopyTest { + @Test + public void testClone() { + OceanReading reading = + new OceanReading(33.9, 100.5); + // Now clone it: + OceanReading clone = reading.clone(); + TemperatureReading tr = + clone.getTemperatureReading(); + tr.setTemperature(tr.getTemperature() + 1); + clone.setTemperatureReading(tr); + DepthReading dr = clone.getDepthReading(); + dr.setDepth(dr.getDepth() + 1); + clone.setDepthReading(dr); + assertEquals(reading.toString(), + "temperature: 33.9, depth: 100.5"); + assertEquals(clone.toString(), + "temperature: 34.9, depth: 101.5"); + } +} diff --git a/references/DepthReading.java b/references/DepthReading.java new file mode 100644 index 000000000..6de997570 --- /dev/null +++ b/references/DepthReading.java @@ -0,0 +1,29 @@ +// references/DepthReading.java +// (c)2016 MindView LLC: see Copyright.txt +// We make no guarantees that this code is fit for any purpose. +// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Cloning a composed object +package references; + +public class DepthReading implements Cloneable { + private double depth; + public DepthReading(double depth) { + this.depth = depth; + } + @Override + public DepthReading clone() { + try { + return (DepthReading)super.clone(); + } catch(CloneNotSupportedException e) { + throw new RuntimeException(e); + } + } + public double getDepth() { return depth; } + public void setDepth(double depth) { + this.depth = depth; + } + @Override + public String toString() { + return String.valueOf(depth); + } +} diff --git a/references/OceanReading.java b/references/OceanReading.java new file mode 100644 index 000000000..cfd6aafa8 --- /dev/null +++ b/references/OceanReading.java @@ -0,0 +1,48 @@ +// references/OceanReading.java +// (c)2016 MindView LLC: see Copyright.txt +// We make no guarantees that this code is fit for any purpose. +// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Cloning a composed object +package references; + +public class OceanReading implements Cloneable { + private DepthReading depth; + private TemperatureReading temperature; + public + OceanReading(double tdata, double ddata) { + temperature = new TemperatureReading(tdata); + depth = new DepthReading(ddata); + } + @Override + public OceanReading clone() { + OceanReading or = null; + try { + or = (OceanReading)super.clone(); + } catch(CloneNotSupportedException e) { + throw new RuntimeException(e); + } + // Must clone references: + or.depth = (DepthReading)or.depth.clone(); + or.temperature = + (TemperatureReading)or.temperature.clone(); + return or; + } + public TemperatureReading getTemperatureReading() { + return temperature; + } + public void + setTemperatureReading(TemperatureReading tr) { + temperature = tr; + } + public DepthReading getDepthReading() { + return depth; + } + public void setDepthReading(DepthReading dr) { + this.depth = dr; + } + @Override + public String toString() { + return "temperature: " + temperature + + ", depth: " + depth; + } +} diff --git a/references/TemperatureReading.java b/references/TemperatureReading.java new file mode 100644 index 000000000..b533497ff --- /dev/null +++ b/references/TemperatureReading.java @@ -0,0 +1,33 @@ +// references/TemperatureReading.java +// (c)2016 MindView LLC: see Copyright.txt +// We make no guarantees that this code is fit for any purpose. +// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Cloning a composed object +package references; + +public class TemperatureReading implements Cloneable { + private long time; + private double temperature; + public TemperatureReading(double temperature) { + time = System.currentTimeMillis(); + this.temperature = temperature; + } + @Override + public TemperatureReading clone() { + try { + return (TemperatureReading)super.clone(); + } catch(CloneNotSupportedException e) { + throw new RuntimeException(e); + } + } + public double getTemperature() { + return temperature; + } + public void setTemperature(double temp) { + this.temperature = temp; + } + @Override + public String toString() { + return String.valueOf(temperature); + } +} diff --git a/verifying/CountedList.java b/verifying/CountedList.java new file mode 100644 index 000000000..23b47f677 --- /dev/null +++ b/verifying/CountedList.java @@ -0,0 +1,17 @@ +// verifying/CountedList.java +// (c)2016 MindView LLC: see Copyright.txt +// We make no guarantees that this code is fit for any purpose. +// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// A List that keeps track of how many +// of itself are created. +package verifying; +import java.util.*; + +public class CountedList extends ArrayList { + private static int counter = 0; + private int id = counter++; + public CountedList() { + System.out.println("CountedList #" + id); + } + public int getId() { return id; } +} diff --git a/verifying/SimpleJUnit.java b/verifying/CountedListTest.java similarity index 86% rename from verifying/SimpleJUnit.java rename to verifying/CountedListTest.java index 5037979ec..8ed45d524 100644 --- a/verifying/SimpleJUnit.java +++ b/verifying/CountedListTest.java @@ -1,25 +1,15 @@ -// verifying/SimpleJUnit.java +// verifying/CountedListTest.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. -// Simple use of JUnit to test ArrayList +// Simple use of JUnit to test CountedList. package verifying; import java.util.*; +//import verifying.CountedList; import org.junit.jupiter.api.*; import static org.junit.jupiter.api.Assertions.*; -// Keeps track of list objects as they are -// created and cleaned up: -class CountedList extends ArrayList { - private static int counter = 0; - private int id = counter++; - public CountedList() { - System.out.println("CountedList #" + id); - } - public int getId() { return id; } -} - -public class SimpleJUnit { +public class CountedListTest { private CountedList list; @BeforeEach public void initialize() { diff --git a/verifying/Queue.java b/verifying/Queue.java index ca46f4508..a2ccd6940 100644 --- a/verifying/Queue.java +++ b/verifying/Queue.java @@ -13,10 +13,6 @@ public class Queue { out = 0; // Next gettable object // Has it wrapped around the circular queue? private boolean wrapped = false; - public static class - QueueException extends RuntimeException { - public QueueException(String why) { super(why); } - } public Queue(int size) { data = new Object[size]; // Must be true after construction: diff --git a/verifying/QueueException.java b/verifying/QueueException.java new file mode 100644 index 000000000..276be650e --- /dev/null +++ b/verifying/QueueException.java @@ -0,0 +1,9 @@ +// verifying/QueueException.java +// (c)2016 MindView LLC: see Copyright.txt +// We make no guarantees that this code is fit for any purpose. +// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +package verifying; + +public class QueueException extends RuntimeException { + public QueueException(String why) { super(why); } +} diff --git a/verifying/QueueTest.java b/verifying/QueueTest.java index 8982132d8..ba9374475 100644 --- a/verifying/QueueTest.java +++ b/verifying/QueueTest.java @@ -3,7 +3,7 @@ // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. package verifying; -import verifying.Queue.*; +import verifying.Queue; import org.junit.jupiter.api.*; import static org.junit.jupiter.api.Assertions.*; From 27fdeacf4cf74b356e1d527ba7235862d565b535 Mon Sep 17 00:00:00 2001 From: Bruce Eckel Date: Fri, 26 Aug 2016 16:34:59 -0600 Subject: [PATCH 104/320] Changed to _verify_output --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 116148145..699c25f22 100644 --- a/build.gradle +++ b/build.gradle @@ -370,7 +370,7 @@ configure(subprojects - project(':onjava')) { task verify(type:Exec) { description 'Uses Python tool to verify example output' - commandLine 'python', 'verify_output.py' + commandLine 'python', '_verify_output.py' doFirst { println("execute 'gradlew run' first") } From 9c838f918bc2adfa0517a349fe5768b0bfff75df Mon Sep 17 00:00:00 2001 From: Bruce Eckel Date: Sat, 27 Aug 2016 10:12:56 -0600 Subject: [PATCH 105/320] TDD almost working, build.gradle cleaned up some --- verify_output.py => _verify_output.py | 0 build.gradle | 35 +++------- verifying/CountedListTest.java | 10 +-- verifying/DynamicStringInverterTests.java | 80 +++++++++++++++++++++++ verifying/FirstJUnit5Tests.java | 9 +-- verifying/StringInverter.java | 1 + verifying/StringInverter1.java | 2 +- verifying/StringInverter2.java | 2 +- verifying/StringInverter3.java | 2 +- verifying/StringInverter4.java | 2 +- verifying/StringInverterTest.java | 69 ------------------- 11 files changed, 100 insertions(+), 112 deletions(-) rename verify_output.py => _verify_output.py (100%) create mode 100644 verifying/DynamicStringInverterTests.java delete mode 100644 verifying/StringInverterTest.java diff --git a/verify_output.py b/_verify_output.py similarity index 100% rename from verify_output.py rename to _verify_output.py diff --git a/build.gradle b/build.gradle index 699c25f22..671310d16 100644 --- a/build.gradle +++ b/build.gradle @@ -126,9 +126,6 @@ class Tags { } ext { - junit4Version = '4.12' - junitVintageVersion = '4.12.0-M2' - junitPlatformVersion = '1.0.0-M2' junitJupiterVersion = '5.0.0-M2' } @@ -148,26 +145,16 @@ subprojects { } dependencies { - // compile 'junit:junit:4.12' + // Logging: compile group: 'org.slf4j', name: 'slf4j-api', version: '1.7.+' compile group: 'ch.qos.logback', name: 'logback-classic', version: '1.+' // You can also use the JDK's built-in logging as the back end: // compile group: 'org.slf4j', name: 'slf4j-jdk14', version: '1.7.5' - // JUnit Jupiter API and TestEngine implementation -/* testCompile("org.junit.jupiter:junit-jupiter-api:${junitJupiterVersion}") - testRuntime("org.junit.jupiter:junit-jupiter-engine:${junitJupiterVersion}") - - // If you also want to support JUnit 3 and JUnit 4 tests - testCompile("junit:junit:${junit4Version}") - testRuntime("org.junit.vintage:junit-vintage-engine:${junitVintageVersion}")*/ - compile "org.junit.jupiter:junit-jupiter-api:5.0.0-M2" - testCompile "org.junit.jupiter:junit-jupiter-api:5.0.0-M2" - testRuntime "org.junit.jupiter:junit-jupiter-engine:5.0.0-M2" -/* testCompile "junit:junit:4.12" - testRuntime "org.junit.vintage:junit-vintage-engine:4.12.0-M2" -*//* compile "org.junit.jupiter:junit-jupiter-api:5.0.0-M2" - compile "org.junit.vintage:junit-vintage-engine:4.12.0-M2"*/ + // JUnit testing: + compile "org.junit.jupiter:junit-jupiter-api:${junitJupiterVersion}" + testCompile "org.junit.jupiter:junit-jupiter-api:${junitJupiterVersion}" + testRuntime "org.junit.jupiter:junit-jupiter-engine:${junitJupiterVersion}" } junitPlatform { @@ -191,11 +178,8 @@ subprojects { main { java { srcDir projectDir - // exclude "*Test.java" - exclude "*Tests.java" - exclude "*JUnit.java" - exclude "StringInverter*.java" - // exclude "Queue.java" + // Remove this when it's working: + exclude "DynamicStringInverterTests.java" } resources { srcDir projectDir @@ -234,7 +218,7 @@ subprojects { // Exclude java sources that will not compile if (tags.compileTimeError) { - println ">>> Excluding " + file.name + // println ">>> Excluding " + file.name sourceSets.main.java.excludes.add(file.name) } else { JavaExec javaTask = null @@ -362,9 +346,6 @@ configure(subprojects - project(':onjava')) { compile group: 'com.google.guava', name: 'guava', version: '19.0' compile "org.openjdk.jmh:jmh-core:${jmh.jmhVersion}" compile 'org.junit.platform:junit-platform-gradle-plugin:1.0.0-M2' - - //compile group: 'org.apache.logging.log4j', name: 'log4j-api', version: '2.6.2' - //compile group: 'org.apache.logging.log4j', name: 'log4j-core', version: '2.6.2' } } diff --git a/verifying/CountedListTest.java b/verifying/CountedListTest.java index 8ed45d524..76d20cc17 100644 --- a/verifying/CountedListTest.java +++ b/verifying/CountedListTest.java @@ -5,7 +5,6 @@ // Simple use of JUnit to test CountedList. package verifying; import java.util.*; -//import verifying.CountedList; import org.junit.jupiter.api.*; import static org.junit.jupiter.api.Assertions.*; @@ -43,8 +42,8 @@ public void replace() { // as it isn't annotated with @Test, it will not // be automatically executed by JUnit. private - void compare(ArrayList lst, String[] strs) { - String[] array = (String[])lst.toArray(); + void compare(List lst, String[] strs) { + String[] array = lst.toArray(new String[0]); assertTrue(array.length == strs.length, "Arrays not the same length"); for(int i = 0; i < array.length; i++) @@ -72,11 +71,6 @@ public void addAll() { compare(list, new String[] { "0", "1", "2", "An", "African", "Swallow" }); } -/* public static void main(String[] args) { - // Invoke JUnit on the class: - org.junit.runner.JUnitCore.runClasses( - SimpleJUnit.class); - } */ } /* Output: CountedList #0 diff --git a/verifying/DynamicStringInverterTests.java b/verifying/DynamicStringInverterTests.java new file mode 100644 index 000000000..4ac6a36fe --- /dev/null +++ b/verifying/DynamicStringInverterTests.java @@ -0,0 +1,80 @@ +// verifying/DynamicStringInverterTests.java +// (c)2016 MindView LLC: see Copyright.txt +// We make no guarantees that this code is fit for any purpose. +// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +package verifying; +import java.util.*; +import java.util.function.*; +import java.util.stream.*; +import org.junit.jupiter.api.*; +import static org.junit.jupiter.api.Assertions.*; +import static org.junit.jupiter.api.DynamicTest.*; + +class DynamicStringInverterTests { + Stream + multiple_version_test(Consumer test) { + List versions = Arrays.asList( + new StringInverter1(), new StringInverter2(), + new StringInverter3(), new StringInverter4()); + return DynamicTest.stream(versions.iterator(), + (version) -> version.getClass().getSimpleName(), + test + ); + } + + @TestFactory + Stream basicInversion_Succeed() { + return multiple_version_test( (version) -> { + String in = "Exit, Pursued by a Bear."; + String out = "eXIT, pURSUED BY A bEAR."; + assertEquals(version.invert(in), out); + }); + } + + @TestFactory + Stream basicInversion_Fail() { + return multiple_version_test( (version) -> { + expectThrows(RuntimeException.class, () -> { + assertEquals(version.invert("X"), "X"); + }); + }); + } + + @TestFactory + Stream allowedCharacters_Fail() { + return multiple_version_test( (version) -> { + expectThrows(RuntimeException.class, () -> { + version.invert(";-_()*&^%$#@!~`"); + version.invert("0123456789"); + }); + }); + } + + @TestFactory + Stream allowedCharacters_Succeed() { + return multiple_version_test( (version) -> { + version.invert("abcdefghijklmnopqrstuvwxyz ,."); + version.invert("ABCDEFGHIJKLMNOPQRSTUVWXYZ ,."); + }); + } + + @TestFactory + Stream lengthLessThan26_Fail() { + return multiple_version_test( (version) -> { + String str = "xxxxxxxxxxxxxxxxxxxxxxxxxx"; + assertTrue(str.length() > 25); + expectThrows(RuntimeException.class, () -> { + version.invert(str); + }); + }); + } + + @TestFactory + Stream lengthLessThan26_Succeed() { + return multiple_version_test( (version) -> { + String str = "xxxxxxxxxxxxxxxxxxxxxxxxx"; + assertTrue(str.length() < 26); + version.invert(str); + }); + } +} diff --git a/verifying/FirstJUnit5Tests.java b/verifying/FirstJUnit5Tests.java index c4ced5d99..486661c86 100644 --- a/verifying/FirstJUnit5Tests.java +++ b/verifying/FirstJUnit5Tests.java @@ -7,8 +7,9 @@ import static org.junit.jupiter.api.Assertions.*; class FirstJUnit5Tests { - @Test - void myFirstTest() { - assertEquals(2, 1 + 1); - } + @Test + void myFirstTest() { + System.out.println("FirstJUnit5Tests"); + assertEquals(2, 1 + 1); + } } diff --git a/verifying/StringInverter.java b/verifying/StringInverter.java index f30962867..2ca5189d3 100644 --- a/verifying/StringInverter.java +++ b/verifying/StringInverter.java @@ -2,6 +2,7 @@ // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. +package verifying; interface StringInverter { public String invert(String str); diff --git a/verifying/StringInverter1.java b/verifying/StringInverter1.java index b89f0d45b..91b0567c5 100644 --- a/verifying/StringInverter1.java +++ b/verifying/StringInverter1.java @@ -2,7 +2,7 @@ // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. -// {java StringInverterTest StringInverter1} +package verifying; public class StringInverter1 implements StringInverter { public String invert(String str) { return ""; } diff --git a/verifying/StringInverter2.java b/verifying/StringInverter2.java index 2799f31c4..80a27b067 100644 --- a/verifying/StringInverter2.java +++ b/verifying/StringInverter2.java @@ -2,7 +2,7 @@ // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. -// {java StringInverterTest StringInverter2} +package verifying; import static java.lang.Character.*; public class StringInverter2 implements StringInverter { diff --git a/verifying/StringInverter3.java b/verifying/StringInverter3.java index d907e84e3..d445a87f7 100644 --- a/verifying/StringInverter3.java +++ b/verifying/StringInverter3.java @@ -2,7 +2,7 @@ // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. -// {java StringInverterTest StringInverter3} +package verifying; import static java.lang.Character.*; public class StringInverter3 implements StringInverter { diff --git a/verifying/StringInverter4.java b/verifying/StringInverter4.java index 21616f2c3..9012eaad3 100644 --- a/verifying/StringInverter4.java +++ b/verifying/StringInverter4.java @@ -2,7 +2,7 @@ // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. -// {java StringInverterTest StringInverter4} +package verifying; import static java.lang.Character.*; public class StringInverter4 implements StringInverter { diff --git a/verifying/StringInverterTest.java b/verifying/StringInverterTest.java deleted file mode 100644 index 7910cb9f0..000000000 --- a/verifying/StringInverterTest.java +++ /dev/null @@ -1,69 +0,0 @@ -// verifying/StringInverterTest.java -// (c)2016 MindView LLC: see Copyright.txt -// We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. -// {ValidateByHand} // Don't run by itself -import java.util.*; -import org.junit.jupiter.api.*; -import static org.junit.jupiter.api.Assertions.*; -// import org.junit.platform.runner.JUnitPlatform; - -public class StringInverterTest { - static StringInverter inverter; - @Test - public final void basicInversion_Succeed() { - String in = "Exit, Pursued by a Bear."; - String out = "eXIT, pURSUED BY A bEAR."; - assertEquals(inverter.invert(in), out); - } - @Test - public final void basicInversion_Fail() { - expectThrows(RuntimeException.class, () -> { - assertEquals(inverter.invert("X"), "X"); - }); - } - @Test - public final void allowedCharacters_Fail() { - expectThrows(RuntimeException.class, () -> { - inverter.invert(";-_()*&^%$#@!~`"); - inverter.invert("0123456789"); - }); - } - @Test - public final void allowedCharacters_Succeed() { - inverter.invert("abcdefghijklmnopqrstuvwxyz ,."); - inverter.invert("ABCDEFGHIJKLMNOPQRSTUVWXYZ ,."); - } - @Test - public final void lengthLessThan26_Fail() { - String str = "xxxxxxxxxxxxxxxxxxxxxxxxxx"; - assertTrue(str.length() > 25); - expectThrows(RuntimeException.class, () -> { - inverter.invert(str); - }); - } - @Test - public final void lengthLessThan26_Succeed() { - String str = "xxxxxxxxxxxxxxxxxxxxxxxxx"; - assertTrue(str.length() < 26); - inverter.invert(str); - } - /* - public static void main(String[] args) throws Exception{ - assertEquals(args.length, 1); - inverter = (StringInverter) - Class.forName(args[0]).newInstance(); - Result result = org.junit.runner.JUnitCore.runClasses( - StringInverterTest.class); - List failures = result.getFailures(); - System.out.printf("%s has %d FAILURES:\n", - args[0], failures.size()); - int count = 1; - for(Failure f : failures) { - System.out.printf("Failure %d:\n", count++); - System.out.println(f.getDescription()); - System.out.println(f.getMessage()); - } - } - */ -} From 941213aae885cfac77670389c911a1d66657faeb Mon Sep 17 00:00:00 2001 From: Bruce Eckel Date: Sun, 28 Aug 2016 06:13:56 -0600 Subject: [PATCH 106/320] TDD Much better now --- build.gradle | 2 +- gradle.properties | 1 - verifying/DynamicStringInverterTests.java | 130 +++++++++++++++------- verifying/StringInverter1.java | 12 -- verifying/StringInverter2.java | 9 -- verifying/StringInverter3.java | 8 +- verifying/StringInverter4.java | 5 +- verifying/StringInverterTests.java | 52 +++++++++ 8 files changed, 143 insertions(+), 76 deletions(-) create mode 100644 verifying/StringInverterTests.java diff --git a/build.gradle b/build.gradle index 671310d16..7a421ec6e 100644 --- a/build.gradle +++ b/build.gradle @@ -179,7 +179,7 @@ subprojects { java { srcDir projectDir // Remove this when it's working: - exclude "DynamicStringInverterTests.java" + // exclude "DynamicStringInverterTests.java" } resources { srcDir projectDir diff --git a/gradle.properties b/gradle.properties index 41f55a530..f97ebb7d3 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,2 +1 @@ -org.gradle.daemon=true org.gradle.parallel=true diff --git a/verifying/DynamicStringInverterTests.java b/verifying/DynamicStringInverterTests.java index 4ac6a36fe..462c440ab 100644 --- a/verifying/DynamicStringInverterTests.java +++ b/verifying/DynamicStringInverterTests.java @@ -11,70 +11,116 @@ import static org.junit.jupiter.api.DynamicTest.*; class DynamicStringInverterTests { + // Combine operations to prevent code duplication: Stream - multiple_version_test(Consumer test) { + testVersions(String id, Consumer test) { List versions = Arrays.asList( new StringInverter1(), new StringInverter2(), new StringInverter3(), new StringInverter4()); return DynamicTest.stream(versions.iterator(), (version) -> version.getClass().getSimpleName(), - test + (stringInverter) -> { + System.out.println( + stringInverter.getClass().getSimpleName() + + ": " + id + ); + try { // Capture failing tests + test.accept(stringInverter); + } catch(Error | Exception e) { + System.out.println(e.getMessage()); + } + } ); } - + void isTrue(String description, boolean assertion) { + System.out.print(description + ": "); + System.out.println(assertion); + } + void isEqual(String lval, String rval) { + System.out.print(lval + " equals " + rval); + if(!lval.equals(rval)) + System.out.println(" FAIL"); + else + System.out.println(); + } + @BeforeAll + static void startMsg() { + System.out.println( + ">>> Starting DynamicStringInverterTests <<<"); + } + @AfterAll + static void endMsg() { + System.out.println( + ">>> Finished DynamicStringInverterTests <<<"); + } @TestFactory Stream basicInversion_Succeed() { - return multiple_version_test( (version) -> { - String in = "Exit, Pursued by a Bear."; - String out = "eXIT, pURSUED BY A bEAR."; - assertEquals(version.invert(in), out); - }); + return testVersions( + "A Basic Inversion that Succeeds", + (version) -> { + String in = "Exit, Pursued by a Bear."; + String out = "eXIT, pURSUED BY A bEAR."; + isEqual(version.invert(in), out); + } + ); } - @TestFactory Stream basicInversion_Fail() { - return multiple_version_test( (version) -> { - expectThrows(RuntimeException.class, () -> { - assertEquals(version.invert("X"), "X"); - }); - }); + return testVersions( + "A Basic Inversion that Fails", + (version) -> isEqual(version.invert("X"), "X")); } - @TestFactory Stream allowedCharacters_Fail() { - return multiple_version_test( (version) -> { - expectThrows(RuntimeException.class, () -> { - version.invert(";-_()*&^%$#@!~`"); - version.invert("0123456789"); - }); - }); + return testVersions( + "Disallowed characters (throws exception)", + (version) -> { + try { + version.invert(";-_()*&^%$#@!~`"); + version.invert("0123456789"); + System.out.println("Success"); + } catch(Exception e) { + System.out.println("FAIL: " + e.getMessage()); + } + } + ); } - @TestFactory Stream allowedCharacters_Succeed() { - return multiple_version_test( (version) -> { - version.invert("abcdefghijklmnopqrstuvwxyz ,."); - version.invert("ABCDEFGHIJKLMNOPQRSTUVWXYZ ,."); - }); + return testVersions( + "Allowed Characters (Succeeds)", + (version) -> { + version.invert("abcdefghijklmnopqrstuvwxyz ,."); + version.invert("ABCDEFGHIJKLMNOPQRSTUVWXYZ ,."); + } + ); } - @TestFactory - Stream lengthLessThan26_Fail() { - return multiple_version_test( (version) -> { - String str = "xxxxxxxxxxxxxxxxxxxxxxxxxx"; - assertTrue(str.length() > 25); - expectThrows(RuntimeException.class, () -> { - version.invert(str); - }); - }); + Stream lengthLessThan31_Fail() { + return testVersions( + "Length must be less than 31 (Throws Exception)", + (version) -> { + String str = "xxxxxxxxxxxxxxxxxxxxxxxxxx"; + assertTrue(str.length() > 30); + try { + version.invert(str); + System.out.println("Success"); + } catch(Exception e) { + System.out.println("FAIL: " + e.getMessage()); + } + } + ); } - @TestFactory - Stream lengthLessThan26_Succeed() { - return multiple_version_test( (version) -> { - String str = "xxxxxxxxxxxxxxxxxxxxxxxxx"; - assertTrue(str.length() < 26); - version.invert(str); - }); + Stream lengthLessThan31_Succeed() { + String str = "xxxxxxxxxxxxxxxxxxxxxxxxx"; + assertTrue(str.length() < 31); + return testVersions( + "Length must be less than 31 (Succeeds)", + (version) -> { + version.invert(str); + System.out.println("Success"); + } + ); } } diff --git a/verifying/StringInverter1.java b/verifying/StringInverter1.java index 91b0567c5..b1d03ecb4 100644 --- a/verifying/StringInverter1.java +++ b/verifying/StringInverter1.java @@ -7,15 +7,3 @@ public class StringInverter1 implements StringInverter { public String invert(String str) { return ""; } } -/* Output: -StringInverter1 has 3 FAILURES: -Failure 1: -allowedCharacters_Fail(StringInverterTest) -Expected exception: java.lang.RuntimeException -Failure 2: -basicInversion_Succeed(StringInverterTest) -expected:<[]> but was:<[eXIT, pURSUED BY A bEAR.]> -Failure 3: -lengthLessThan26_Fail(StringInverterTest) -Expected exception: java.lang.RuntimeException -*/ diff --git a/verifying/StringInverter2.java b/verifying/StringInverter2.java index 80a27b067..6f1d515da 100644 --- a/verifying/StringInverter2.java +++ b/verifying/StringInverter2.java @@ -17,12 +17,3 @@ public String invert(String str) { return result; } } -/* Output: -StringInverter2 has 2 FAILURES: -Failure 1: -allowedCharacters_Fail(StringInverterTest) -Expected exception: java.lang.RuntimeException -Failure 2: -lengthLessThan26_Fail(StringInverterTest) -Expected exception: java.lang.RuntimeException -*/ diff --git a/verifying/StringInverter3.java b/verifying/StringInverter3.java index d445a87f7..7d577482f 100644 --- a/verifying/StringInverter3.java +++ b/verifying/StringInverter3.java @@ -7,7 +7,7 @@ public class StringInverter3 implements StringInverter { public String invert(String str) { - if(str.length() > 25) + if(str.length() > 30) throw new RuntimeException("argument too long!"); String result = ""; for(int i = 0; i < str.length(); i++) { @@ -19,9 +19,3 @@ public String invert(String str) { return result; } } -/* Output: -StringInverter3 has 1 FAILURES: -Failure 1: -allowedCharacters_Fail(StringInverterTest) -Expected exception: java.lang.RuntimeException -*/ diff --git a/verifying/StringInverter4.java b/verifying/StringInverter4.java index 9012eaad3..2d6d6cbf5 100644 --- a/verifying/StringInverter4.java +++ b/verifying/StringInverter4.java @@ -10,7 +10,7 @@ public class StringInverter4 implements StringInverter { "abcdefghijklmnopqrstuvwxyz ,." + "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; public String invert(String str) { - if(str.length() > 25) + if(str.length() > 30) throw new RuntimeException("argument too long!"); String result = ""; for(int i = 0; i < str.length(); i++) { @@ -24,6 +24,3 @@ public String invert(String str) { return result; } } -/* Output: -StringInverter4 has 0 FAILURES: -*/ diff --git a/verifying/StringInverterTests.java b/verifying/StringInverterTests.java new file mode 100644 index 000000000..7315cfe3c --- /dev/null +++ b/verifying/StringInverterTests.java @@ -0,0 +1,52 @@ +// verifying/StringInverterTests.java +// (c)2016 MindView LLC: see Copyright.txt +// We make no guarantees that this code is fit for any purpose. +// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +package verifying; +import java.util.*; +import org.junit.jupiter.api.*; +import static org.junit.jupiter.api.Assertions.*; + +public class StringInverterTests { + StringInverter inverter = new StringInverter4(); + @Test + void basicInversion_Succeed() { + String in = "Exit, Pursued by a Bear."; + String out = "eXIT, pURSUED BY A bEAR."; + assertEquals(inverter.invert(in), out); + } + @Test + void basicInversion_Fail() { + expectThrows(Error.class, () -> { + assertEquals(inverter.invert("X"), "X"); + }); + } + @Test + void allowedCharacters_Fail() { + expectThrows(RuntimeException.class, () -> { + inverter.invert(";-_()*&^%$#@!~`"); + inverter.invert("0123456789"); + }); + } + @Test + void allowedCharacters_Succeed() { + String lowcase = "abcdefghijklmnopqrstuvwxyz ,."; + String upcase = "ABCDEFGHIJKLMNOPQRSTUVWXYZ ,."; + assertEquals(inverter.invert(lowcase), upcase); + assertEquals(inverter.invert(upcase), lowcase); + } + @Test + void lengthLessThan31_Fail() { + String str = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; + assertTrue(str.length() > 30); + expectThrows(RuntimeException.class, () -> { + inverter.invert(str); + }); + } + @Test + void lengthLessThan31_Succeed() { + String str = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; + assertTrue(str.length() < 31); + inverter.invert(str); + } +} From 33a529c41765d356cd704b788acf0bbc9c7f6413 Mon Sep 17 00:00:00 2001 From: Bruce Eckel Date: Mon, 29 Aug 2016 07:27:53 -0600 Subject: [PATCH 107/320] Chapter name and order change --- build.gradle | 4 +- network/SimpleClient.java | 7 +- network/SimpleServer.java | 4 +- {verifying => validating}/Assert1.java | 2 +- {verifying => validating}/Assert2.java | 2 +- .../BadMicroBenchmark.java | 2 +- .../BadMicroBenchmark2.java | 2 +- .../BadMicroBenchmark3.java | 2 +- {verifying => validating}/CountedList.java | 4 +- .../CountedListTest.java | 4 +- validating/DynamicStringInverterTests.java | 121 +++++++++++++++++ .../FirstJUnit5Tests.java | 4 +- .../GuavaPreconditions.java | 2 +- .../Inverter1.java | 8 +- .../Inverter2.java | 6 +- .../Inverter3.java | 6 +- .../Inverter4.java | 6 +- .../LoaderAssertions.java | 2 +- {verifying => validating}/Queue.java | 4 +- {verifying => validating}/QueueException.java | 4 +- {verifying => validating}/QueueTest.java | 6 +- {verifying => validating}/SLF4JLevels.java | 2 +- {verifying => validating}/SLF4JLogging.java | 2 +- .../SimpleDebugging.java | 2 +- {verifying => validating}/StringInverter.java | 4 +- .../StringInverterTests.java | 39 ++++-- {verifying => validating}/Time.java | 2 +- .../jmh/ParallelSetAll.java | 4 +- {verifying => validating}/logback.xml | 0 verifying/DynamicStringInverterTests.java | 126 ------------------ 30 files changed, 195 insertions(+), 188 deletions(-) rename {verifying => validating}/Assert1.java (94%) rename {verifying => validating}/Assert2.java (95%) rename {verifying => validating}/BadMicroBenchmark.java (93%) rename {verifying => validating}/BadMicroBenchmark2.java (94%) rename {verifying => validating}/BadMicroBenchmark3.java (96%) rename {verifying => validating}/CountedList.java (90%) rename {verifying => validating}/CountedListTest.java (97%) create mode 100644 validating/DynamicStringInverterTests.java rename {verifying => validating}/FirstJUnit5Tests.java (87%) rename {verifying => validating}/GuavaPreconditions.java (90%) rename verifying/StringInverter1.java => validating/Inverter1.java (53%) rename verifying/StringInverter2.java => validating/Inverter2.java (81%) rename verifying/StringInverter3.java => validating/Inverter3.java (83%) rename verifying/StringInverter4.java => validating/Inverter4.java (87%) rename {verifying => validating}/LoaderAssertions.java (95%) rename {verifying => validating}/Queue.java (98%) rename {verifying => validating}/QueueException.java (84%) rename {verifying => validating}/QueueTest.java (97%) rename {verifying => validating}/SLF4JLevels.java (96%) rename {verifying => validating}/SLF4JLogging.java (93%) rename {verifying => validating}/SimpleDebugging.java (96%) rename {verifying => validating}/StringInverter.java (82%) rename {verifying => validating}/StringInverterTests.java (58%) rename {verifying => validating}/Time.java (95%) rename {verifying => validating}/jmh/ParallelSetAll.java (89%) rename {verifying => validating}/logback.xml (100%) delete mode 100644 verifying/DynamicStringInverterTests.java diff --git a/build.gradle b/build.gradle index 7a421ec6e..162354dc0 100644 --- a/build.gradle +++ b/build.gradle @@ -277,9 +277,9 @@ subprojects { task run(dependsOn: createdTasks) } -project(':verifying') { +project(':validating') { jmh { - include = 'verifying.jmh.*' + include = 'validating.jmh.*' } } diff --git a/network/SimpleClient.java b/network/SimpleClient.java index ae6abd159..4fc4eed48 100644 --- a/network/SimpleClient.java +++ b/network/SimpleClient.java @@ -11,9 +11,8 @@ public class SimpleClient { public static void main(String[] args) throws IOException { - // Passing null to getByName() produces the - // special "Local Loopback" IP address, for - // testing on one machine w/o a network: + // Produce the "Local Loopback" IP address + // for testing on one machine w/o a network: InetAddress addr = InetAddress.getLoopbackAddress(); System.out.println("addr = " + addr); @@ -35,7 +34,7 @@ public class SimpleClient { new OutputStreamWriter( socket.getOutputStream())),true); for(int i = 0; i < 10; i ++) { - out.println("howdy " + i); + out.println("hello " + i); String str = in.readLine(); System.out.println(str); } diff --git a/network/SimpleServer.java b/network/SimpleServer.java index 9295fd495..b4ce86f3b 100644 --- a/network/SimpleServer.java +++ b/network/SimpleServer.java @@ -2,7 +2,7 @@ // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. -// Just echoes whatever the client sends +// Echoes what the client sends // {ValidateByHand} import java.io.*; import java.net.*; @@ -30,7 +30,7 @@ public class SimpleServer { new PrintWriter( new BufferedWriter( new OutputStreamWriter( - socket.getOutputStream())),true); + socket.getOutputStream())), true); while (true) { String str = in.readLine(); if(str.equals("END")) break; diff --git a/verifying/Assert1.java b/validating/Assert1.java similarity index 94% rename from verifying/Assert1.java rename to validating/Assert1.java index 3ccef65e6..ea6d8277f 100644 --- a/verifying/Assert1.java +++ b/validating/Assert1.java @@ -1,4 +1,4 @@ -// verifying/Assert1.java +// validating/Assert1.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. diff --git a/verifying/Assert2.java b/validating/Assert2.java similarity index 95% rename from verifying/Assert2.java rename to validating/Assert2.java index e8475ea24..64e72e593 100644 --- a/verifying/Assert2.java +++ b/validating/Assert2.java @@ -1,4 +1,4 @@ -// verifying/Assert2.java +// validating/Assert2.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. diff --git a/verifying/BadMicroBenchmark.java b/validating/BadMicroBenchmark.java similarity index 93% rename from verifying/BadMicroBenchmark.java rename to validating/BadMicroBenchmark.java index be79f3da5..2948e4175 100644 --- a/verifying/BadMicroBenchmark.java +++ b/validating/BadMicroBenchmark.java @@ -1,4 +1,4 @@ -// verifying/BadMicroBenchmark.java +// validating/BadMicroBenchmark.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. diff --git a/verifying/BadMicroBenchmark2.java b/validating/BadMicroBenchmark2.java similarity index 94% rename from verifying/BadMicroBenchmark2.java rename to validating/BadMicroBenchmark2.java index 5b3121c46..e171f086b 100644 --- a/verifying/BadMicroBenchmark2.java +++ b/validating/BadMicroBenchmark2.java @@ -1,4 +1,4 @@ -// verifying/BadMicroBenchmark2.java +// validating/BadMicroBenchmark2.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. diff --git a/verifying/BadMicroBenchmark3.java b/validating/BadMicroBenchmark3.java similarity index 96% rename from verifying/BadMicroBenchmark3.java rename to validating/BadMicroBenchmark3.java index cba94d84c..43e47c86c 100644 --- a/verifying/BadMicroBenchmark3.java +++ b/validating/BadMicroBenchmark3.java @@ -1,4 +1,4 @@ -// verifying/BadMicroBenchmark3.java +// validating/BadMicroBenchmark3.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. diff --git a/verifying/CountedList.java b/validating/CountedList.java similarity index 90% rename from verifying/CountedList.java rename to validating/CountedList.java index 23b47f677..7cf17cc17 100644 --- a/verifying/CountedList.java +++ b/validating/CountedList.java @@ -1,10 +1,10 @@ -// verifying/CountedList.java +// validating/CountedList.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. // A List that keeps track of how many // of itself are created. -package verifying; +package validating; import java.util.*; public class CountedList extends ArrayList { diff --git a/verifying/CountedListTest.java b/validating/CountedListTest.java similarity index 97% rename from verifying/CountedListTest.java rename to validating/CountedListTest.java index 76d20cc17..f20014bb9 100644 --- a/verifying/CountedListTest.java +++ b/validating/CountedListTest.java @@ -1,9 +1,9 @@ -// verifying/CountedListTest.java +// validating/CountedListTest.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. // Simple use of JUnit to test CountedList. -package verifying; +package validating; import java.util.*; import org.junit.jupiter.api.*; import static org.junit.jupiter.api.Assertions.*; diff --git a/validating/DynamicStringInverterTests.java b/validating/DynamicStringInverterTests.java new file mode 100644 index 000000000..f095cf51a --- /dev/null +++ b/validating/DynamicStringInverterTests.java @@ -0,0 +1,121 @@ +// validating/DynamicStringInverterTests.java +// (c)2016 MindView LLC: see Copyright.txt +// We make no guarantees that this code is fit for any purpose. +// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +package validating; +import java.util.*; +import java.util.function.*; +import java.util.stream.*; +import org.junit.jupiter.api.*; +import static org.junit.jupiter.api.Assertions.*; +import static org.junit.jupiter.api.DynamicTest.*; + +class DynamicStringInverterTests { + // Combine operations to prevent code duplication: + Stream testVersions(String id, + Function test) { + List versions = Arrays.asList( + new Inverter1(), new Inverter2(), + new Inverter3(), new Inverter4()); + return DynamicTest.stream( + versions.iterator(), + inverter -> inverter.getClass().getSimpleName(), + inverter -> { + System.out.println( + inverter.getClass().getSimpleName() + ": " + id + ); + try { + if(test.apply(inverter) != "fail") + System.out.println("Success"); + } catch(Exception | Error e) { + System.out.println("Exception: " + e.getMessage()); + } + } + ); + } + String isEqual(String lval, String rval) { + if(lval.equals(rval)) + return "success"; + System.out.println("FAIL: " + lval + " != " + rval); + return "fail"; + } + @BeforeAll + static void startMsg() { + System.out.println( + ">>> Starting DynamicStringInverterTests <<<"); + } + @AfterAll + static void endMsg() { + System.out.println( + ">>> Finished DynamicStringInverterTests <<<"); + } + @TestFactory + Stream basicInversion1() { + String in = "Exit, Pursued by a Bear."; + String out = "eXIT, pURSUED BY A bEAR."; + return testVersions( + "Basic inversion (should succeed)", + inverter -> isEqual(inverter.invert(in), out) + ); + } + @TestFactory + Stream basicInversion2() { + return testVersions( + "Basic inversion (should fail)", + inverter -> isEqual(inverter.invert("X"), "X")); + } + @TestFactory + Stream disallowedCharacters() { + String disallowed = ";-_()*&^%$#@!~`0123456789"; + return testVersions( + "Disallowed characters", + inverter -> { + String result = disallowed.chars() + .mapToObj(c -> { + String cc = Character.toString((char)c); + try { + inverter.invert(cc); + return ""; + } catch(RuntimeException e) { + return cc; + } + }).collect(Collectors.joining("")); + if(result.length() == 0) + return "success"; + System.out.println("Bad characters: " + result); + return "fail"; + } + ); + } + @TestFactory + Stream allowedCharacters() { + String lowcase = "abcdefghijklmnopqrstuvwxyz ,."; + String upcase = "ABCDEFGHIJKLMNOPQRSTUVWXYZ ,."; + return testVersions( + "Allowed characters (should succeed)", + inverter -> { + assertEquals(inverter.invert(lowcase), upcase); + assertEquals(inverter.invert(upcase), lowcase); + return "success"; + } + ); + } + @TestFactory + Stream lengthNoGreaterThan30() { + String str = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; + assertTrue(str.length() > 30); + return testVersions( + "Length must be less than 31 (throws exception)", + inverter -> inverter.invert(str) + ); + } + @TestFactory + Stream lengthLessThan31() { + String str = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; + assertTrue(str.length() < 31); + return testVersions( + "Length must be less than 31 (should succeed)", + inverter -> inverter.invert(str) + ); + } +} diff --git a/verifying/FirstJUnit5Tests.java b/validating/FirstJUnit5Tests.java similarity index 87% rename from verifying/FirstJUnit5Tests.java rename to validating/FirstJUnit5Tests.java index 486661c86..c3f71dfdb 100644 --- a/verifying/FirstJUnit5Tests.java +++ b/validating/FirstJUnit5Tests.java @@ -1,8 +1,8 @@ -// verifying/FirstJUnit5Tests.java +// validating/FirstJUnit5Tests.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. -package verifying; +package validating; import org.junit.jupiter.api.*; import static org.junit.jupiter.api.Assertions.*; diff --git a/verifying/GuavaPreconditions.java b/validating/GuavaPreconditions.java similarity index 90% rename from verifying/GuavaPreconditions.java rename to validating/GuavaPreconditions.java index 5dabcd210..2b39b1be0 100644 --- a/verifying/GuavaPreconditions.java +++ b/validating/GuavaPreconditions.java @@ -1,4 +1,4 @@ -// verifying/GuavaPreconditions.java +// validating/GuavaPreconditions.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. diff --git a/verifying/StringInverter1.java b/validating/Inverter1.java similarity index 53% rename from verifying/StringInverter1.java rename to validating/Inverter1.java index b1d03ecb4..0fd6286c5 100644 --- a/verifying/StringInverter1.java +++ b/validating/Inverter1.java @@ -1,9 +1,9 @@ -// verifying/StringInverter1.java +// validating/Inverter1.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. -package verifying; +package validating; -public class StringInverter1 implements StringInverter { - public String invert(String str) { return ""; } +public class Inverter1 implements StringInverter { + public String invert(String str) { return str; } } diff --git a/verifying/StringInverter2.java b/validating/Inverter2.java similarity index 81% rename from verifying/StringInverter2.java rename to validating/Inverter2.java index 6f1d515da..6c966e667 100644 --- a/verifying/StringInverter2.java +++ b/validating/Inverter2.java @@ -1,11 +1,11 @@ -// verifying/StringInverter2.java +// validating/Inverter2.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. -package verifying; +package validating; import static java.lang.Character.*; -public class StringInverter2 implements StringInverter { +public class Inverter2 implements StringInverter { public String invert(String str) { String result = ""; for(int i = 0; i < str.length(); i++) { diff --git a/verifying/StringInverter3.java b/validating/Inverter3.java similarity index 83% rename from verifying/StringInverter3.java rename to validating/Inverter3.java index 7d577482f..208fff517 100644 --- a/verifying/StringInverter3.java +++ b/validating/Inverter3.java @@ -1,11 +1,11 @@ -// verifying/StringInverter3.java +// validating/Inverter3.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. -package verifying; +package validating; import static java.lang.Character.*; -public class StringInverter3 implements StringInverter { +public class Inverter3 implements StringInverter { public String invert(String str) { if(str.length() > 30) throw new RuntimeException("argument too long!"); diff --git a/verifying/StringInverter4.java b/validating/Inverter4.java similarity index 87% rename from verifying/StringInverter4.java rename to validating/Inverter4.java index 2d6d6cbf5..ce52b0bb8 100644 --- a/verifying/StringInverter4.java +++ b/validating/Inverter4.java @@ -1,11 +1,11 @@ -// verifying/StringInverter4.java +// validating/Inverter4.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. -package verifying; +package validating; import static java.lang.Character.*; -public class StringInverter4 implements StringInverter { +public class Inverter4 implements StringInverter { static final String allowed = "abcdefghijklmnopqrstuvwxyz ,." + "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; diff --git a/verifying/LoaderAssertions.java b/validating/LoaderAssertions.java similarity index 95% rename from verifying/LoaderAssertions.java rename to validating/LoaderAssertions.java index e9414d94f..8fe0b377a 100644 --- a/verifying/LoaderAssertions.java +++ b/validating/LoaderAssertions.java @@ -1,4 +1,4 @@ -// verifying/LoaderAssertions.java +// validating/LoaderAssertions.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. diff --git a/verifying/Queue.java b/validating/Queue.java similarity index 98% rename from verifying/Queue.java rename to validating/Queue.java index a2ccd6940..01b4db18d 100644 --- a/verifying/Queue.java +++ b/validating/Queue.java @@ -1,9 +1,9 @@ -// verifying/Queue.java +// validating/Queue.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. // Demonstration of Design by Contract (DbC) -package verifying; +package validating; import java.util.*; public class Queue { diff --git a/verifying/QueueException.java b/validating/QueueException.java similarity index 84% rename from verifying/QueueException.java rename to validating/QueueException.java index 276be650e..d381d7c8c 100644 --- a/verifying/QueueException.java +++ b/validating/QueueException.java @@ -1,8 +1,8 @@ -// verifying/QueueException.java +// validating/QueueException.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. -package verifying; +package validating; public class QueueException extends RuntimeException { public QueueException(String why) { super(why); } diff --git a/verifying/QueueTest.java b/validating/QueueTest.java similarity index 97% rename from verifying/QueueTest.java rename to validating/QueueTest.java index ba9374475..9c5b11cf1 100644 --- a/verifying/QueueTest.java +++ b/validating/QueueTest.java @@ -1,9 +1,9 @@ -// verifying/QueueTest.java +// validating/QueueTest.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. -package verifying; -import verifying.Queue; +package validating; +//import validating.Queue; import org.junit.jupiter.api.*; import static org.junit.jupiter.api.Assertions.*; diff --git a/verifying/SLF4JLevels.java b/validating/SLF4JLevels.java similarity index 96% rename from verifying/SLF4JLevels.java rename to validating/SLF4JLevels.java index 8c17ca3ba..e1b2e11d9 100644 --- a/verifying/SLF4JLevels.java +++ b/validating/SLF4JLevels.java @@ -1,4 +1,4 @@ -// verifying/SLF4JLevels.java +// validating/SLF4JLevels.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. diff --git a/verifying/SLF4JLogging.java b/validating/SLF4JLogging.java similarity index 93% rename from verifying/SLF4JLogging.java rename to validating/SLF4JLogging.java index 423895d06..2d3b5a05d 100644 --- a/verifying/SLF4JLogging.java +++ b/validating/SLF4JLogging.java @@ -1,4 +1,4 @@ -// verifying/SLF4JLogging.java +// validating/SLF4JLogging.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. diff --git a/verifying/SimpleDebugging.java b/validating/SimpleDebugging.java similarity index 96% rename from verifying/SimpleDebugging.java rename to validating/SimpleDebugging.java index f5568d8b2..70d9437d5 100644 --- a/verifying/SimpleDebugging.java +++ b/validating/SimpleDebugging.java @@ -1,4 +1,4 @@ -// verifying/SimpleDebugging.java +// validating/SimpleDebugging.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. diff --git a/verifying/StringInverter.java b/validating/StringInverter.java similarity index 82% rename from verifying/StringInverter.java rename to validating/StringInverter.java index 2ca5189d3..dd2373778 100644 --- a/verifying/StringInverter.java +++ b/validating/StringInverter.java @@ -1,8 +1,8 @@ -// verifying/StringInverter.java +// validating/StringInverter.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. -package verifying; +package validating; interface StringInverter { public String invert(String str); diff --git a/verifying/StringInverterTests.java b/validating/StringInverterTests.java similarity index 58% rename from verifying/StringInverterTests.java rename to validating/StringInverterTests.java index 7315cfe3c..85565d0d3 100644 --- a/verifying/StringInverterTests.java +++ b/validating/StringInverterTests.java @@ -1,42 +1,55 @@ -// verifying/StringInverterTests.java +// validating/StringInverterTests.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. -package verifying; +package validating; import java.util.*; +import java.util.stream.*; import org.junit.jupiter.api.*; import static org.junit.jupiter.api.Assertions.*; public class StringInverterTests { - StringInverter inverter = new StringInverter4(); + StringInverter inverter = new Inverter4(); + @BeforeAll + static void startMsg() { + System.out.println(">>> StringInverterTests <<<"); + } @Test - void basicInversion_Succeed() { + void basicInversion1() { String in = "Exit, Pursued by a Bear."; String out = "eXIT, pURSUED BY A bEAR."; assertEquals(inverter.invert(in), out); } @Test - void basicInversion_Fail() { + void basicInversion2() { expectThrows(Error.class, () -> { assertEquals(inverter.invert("X"), "X"); }); } @Test - void allowedCharacters_Fail() { - expectThrows(RuntimeException.class, () -> { - inverter.invert(";-_()*&^%$#@!~`"); - inverter.invert("0123456789"); - }); + void disallowedCharacters() { + String disallowed = ";-_()*&^%$#@!~`0123456789"; + String result = disallowed.chars() + .mapToObj(c -> { + String cc = Character.toString((char)c); + try { + inverter.invert(cc); + return ""; + } catch(RuntimeException e) { + return cc; + } + }).collect(Collectors.joining("")); + assertEquals(result, disallowed); } @Test - void allowedCharacters_Succeed() { + void allowedCharacters() { String lowcase = "abcdefghijklmnopqrstuvwxyz ,."; String upcase = "ABCDEFGHIJKLMNOPQRSTUVWXYZ ,."; assertEquals(inverter.invert(lowcase), upcase); assertEquals(inverter.invert(upcase), lowcase); } @Test - void lengthLessThan31_Fail() { + void lengthNoGreaterThan30() { String str = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; assertTrue(str.length() > 30); expectThrows(RuntimeException.class, () -> { @@ -44,7 +57,7 @@ void lengthLessThan31_Fail() { }); } @Test - void lengthLessThan31_Succeed() { + void lengthLessThan31() { String str = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; assertTrue(str.length() < 31); inverter.invert(str); diff --git a/verifying/Time.java b/validating/Time.java similarity index 95% rename from verifying/Time.java rename to validating/Time.java index a5332fc06..6b1a8893e 100644 --- a/verifying/Time.java +++ b/validating/Time.java @@ -1,4 +1,4 @@ -// verifying/Time.java +// validating/Time.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. diff --git a/verifying/jmh/ParallelSetAll.java b/validating/jmh/ParallelSetAll.java similarity index 89% rename from verifying/jmh/ParallelSetAll.java rename to validating/jmh/ParallelSetAll.java index c91e3c284..8e7c76f2f 100644 --- a/verifying/jmh/ParallelSetAll.java +++ b/validating/jmh/ParallelSetAll.java @@ -1,8 +1,8 @@ -// verifying/jmh/ParallelSetAll.java +// validating/jmh/ParallelSetAll.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. -package verifying.jmh; +package validating.jmh; import java.util.*; import org.openjdk.jmh.annotations.*; diff --git a/verifying/logback.xml b/validating/logback.xml similarity index 100% rename from verifying/logback.xml rename to validating/logback.xml diff --git a/verifying/DynamicStringInverterTests.java b/verifying/DynamicStringInverterTests.java deleted file mode 100644 index 462c440ab..000000000 --- a/verifying/DynamicStringInverterTests.java +++ /dev/null @@ -1,126 +0,0 @@ -// verifying/DynamicStringInverterTests.java -// (c)2016 MindView LLC: see Copyright.txt -// We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. -package verifying; -import java.util.*; -import java.util.function.*; -import java.util.stream.*; -import org.junit.jupiter.api.*; -import static org.junit.jupiter.api.Assertions.*; -import static org.junit.jupiter.api.DynamicTest.*; - -class DynamicStringInverterTests { - // Combine operations to prevent code duplication: - Stream - testVersions(String id, Consumer test) { - List versions = Arrays.asList( - new StringInverter1(), new StringInverter2(), - new StringInverter3(), new StringInverter4()); - return DynamicTest.stream(versions.iterator(), - (version) -> version.getClass().getSimpleName(), - (stringInverter) -> { - System.out.println( - stringInverter.getClass().getSimpleName() + - ": " + id - ); - try { // Capture failing tests - test.accept(stringInverter); - } catch(Error | Exception e) { - System.out.println(e.getMessage()); - } - } - ); - } - void isTrue(String description, boolean assertion) { - System.out.print(description + ": "); - System.out.println(assertion); - } - void isEqual(String lval, String rval) { - System.out.print(lval + " equals " + rval); - if(!lval.equals(rval)) - System.out.println(" FAIL"); - else - System.out.println(); - } - @BeforeAll - static void startMsg() { - System.out.println( - ">>> Starting DynamicStringInverterTests <<<"); - } - @AfterAll - static void endMsg() { - System.out.println( - ">>> Finished DynamicStringInverterTests <<<"); - } - @TestFactory - Stream basicInversion_Succeed() { - return testVersions( - "A Basic Inversion that Succeeds", - (version) -> { - String in = "Exit, Pursued by a Bear."; - String out = "eXIT, pURSUED BY A bEAR."; - isEqual(version.invert(in), out); - } - ); - } - @TestFactory - Stream basicInversion_Fail() { - return testVersions( - "A Basic Inversion that Fails", - (version) -> isEqual(version.invert("X"), "X")); - } - @TestFactory - Stream allowedCharacters_Fail() { - return testVersions( - "Disallowed characters (throws exception)", - (version) -> { - try { - version.invert(";-_()*&^%$#@!~`"); - version.invert("0123456789"); - System.out.println("Success"); - } catch(Exception e) { - System.out.println("FAIL: " + e.getMessage()); - } - } - ); - } - @TestFactory - Stream allowedCharacters_Succeed() { - return testVersions( - "Allowed Characters (Succeeds)", - (version) -> { - version.invert("abcdefghijklmnopqrstuvwxyz ,."); - version.invert("ABCDEFGHIJKLMNOPQRSTUVWXYZ ,."); - } - ); - } - @TestFactory - Stream lengthLessThan31_Fail() { - return testVersions( - "Length must be less than 31 (Throws Exception)", - (version) -> { - String str = "xxxxxxxxxxxxxxxxxxxxxxxxxx"; - assertTrue(str.length() > 30); - try { - version.invert(str); - System.out.println("Success"); - } catch(Exception e) { - System.out.println("FAIL: " + e.getMessage()); - } - } - ); - } - @TestFactory - Stream lengthLessThan31_Succeed() { - String str = "xxxxxxxxxxxxxxxxxxxxxxxxx"; - assertTrue(str.length() < 31); - return testVersions( - "Length must be less than 31 (Succeeds)", - (version) -> { - version.invert(str); - System.out.println("Success"); - } - ); - } -} From 666343e0ba2de27e13202c0913fe72e264298932 Mon Sep 17 00:00:00 2001 From: Bruce Eckel Date: Mon, 29 Aug 2016 08:55:28 -0600 Subject: [PATCH 108/320] Comment to force update --- build.gradle | 1 + 1 file changed, 1 insertion(+) diff --git a/build.gradle b/build.gradle index 162354dc0..eee2a3305 100644 --- a/build.gradle +++ b/build.gradle @@ -277,6 +277,7 @@ subprojects { task run(dependsOn: createdTasks) } +// Note change of chapter name project(':validating') { jmh { include = 'validating.jmh.*' From aaf9b4b78bfbadc6c506b4cb8ad2b8e9154ba216 Mon Sep 17 00:00:00 2001 From: Bruce Eckel Date: Mon, 29 Aug 2016 09:06:00 -0600 Subject: [PATCH 109/320] chapter name change --- .travis.yml | 2 +- appveyor.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index f2fb92aec..db7cbb5d8 100644 --- a/.travis.yml +++ b/.travis.yml @@ -4,4 +4,4 @@ jdk: install: true script: - ./gradlew --parallel --stacktrace run - - ./gradlew --parallel --stacktrace :verifying:jmh + - ./gradlew --parallel --stacktrace :validating:jmh diff --git a/appveyor.yml b/appveyor.yml index 87b353301..dfdf8f616 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -1,5 +1,5 @@ build_script: - gradlew.bat --parallel --stacktrace run - - gradlew.bat --parallel --stacktrace :verifying:jmh + - gradlew.bat --parallel --stacktrace :validating:jmh test: off From ea67cacd65f186a1dc605be81237767239c0fb84 Mon Sep 17 00:00:00 2001 From: Bruce Eckel Date: Tue, 30 Aug 2016 11:03:38 -0600 Subject: [PATCH 110/320] Tiny edit --- build.gradle | 1 - 1 file changed, 1 deletion(-) diff --git a/build.gradle b/build.gradle index eee2a3305..162354dc0 100644 --- a/build.gradle +++ b/build.gradle @@ -277,7 +277,6 @@ subprojects { task run(dependsOn: createdTasks) } -// Note change of chapter name project(':validating') { jmh { include = 'validating.jmh.*' From c497c389e331c1d5a982d85d03c948a3c6618e1c Mon Sep 17 00:00:00 2001 From: Bruce Eckel Date: Wed, 31 Aug 2016 12:30:03 -0600 Subject: [PATCH 111/320] edits & improvements --- network/ChatterClient.java | 9 +- network/ChatterServer.java | 2 +- network/Dgram.java | 3 +- network/MultiSimpleClient.java | 15 +-- network/MultiSimpleServer.java | 14 +-- validating/CountedList.java | 3 +- validating/CountedListTest.java | 33 +++--- validating/DynamicStringInverterTests.java | 7 +- validating/FirstJUnit5Tests.java | 15 --- validating/GuavaAssertions.java | 48 +++++++++ validating/GuavaPreconditions.java | 111 ++++++++++++++++++++- 11 files changed, 198 insertions(+), 62 deletions(-) delete mode 100644 validating/FirstJUnit5Tests.java create mode 100644 validating/GuavaAssertions.java diff --git a/network/ChatterClient.java b/network/ChatterClient.java index 13ec4c4d3..8fdc8112a 100644 --- a/network/ChatterClient.java +++ b/network/ChatterClient.java @@ -4,7 +4,7 @@ // Visit http://mindviewinc.com/Books/OnJava/ for more book information. // {ValidateByHand} // Tests the ChatterServer by starting multiple -// clients, each of which sends datagrams +// clients, each of which sends datagrams. import java.net.*; import java.io.*; import onjava.*; @@ -37,12 +37,11 @@ public ChatterClient(int identifier) { public void sendAndEcho(String msg) { try { // Make and send a datagram: - s.send(Dgram.toDatagram(msg, - hostAddress, - ChatterServer.INPORT)); + s.send(Dgram.toDatagram( + msg, hostAddress, ChatterServer.INPORT)); // Block until it echoes back: s.receive(dp); - // Print out the echoed contents: + // Display the echoed contents: String rcvd = "Client #" + id + ", rcvd from " + dp.getAddress() + ", " + diff --git a/network/ChatterServer.java b/network/ChatterServer.java index c1e47ff65..f14920410 100644 --- a/network/ChatterServer.java +++ b/network/ChatterServer.java @@ -31,7 +31,7 @@ public ChatterServer() { "Echoed: " + rcvd; // Extract the address and port from the // received datagram to find out where to - // send it back: + // send it back to: DatagramPacket echo = Dgram.toDatagram(echoString, dp.getAddress(), dp.getPort()); diff --git a/network/Dgram.java b/network/Dgram.java index f4d96ae82..fdb92abe8 100644 --- a/network/Dgram.java +++ b/network/Dgram.java @@ -2,8 +2,7 @@ // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. -// Converts back and forth -// between Strings and DataGramPackets +// Converts between Strings and DataGramPackets import java.net.*; public class Dgram { diff --git a/network/MultiSimpleClient.java b/network/MultiSimpleClient.java index 18a41e5e4..71e5fb9bb 100644 --- a/network/MultiSimpleClient.java +++ b/network/MultiSimpleClient.java @@ -46,7 +46,9 @@ public SimpleClientThread(InetAddress addr) { // constructor: try { socket.close(); - } catch(IOException e2) {} + } catch(IOException e2) { + throw new RuntimeException(e2); + } } // Otherwise the socket will be closed by // the run() method of the thread. @@ -61,11 +63,14 @@ public void run() { } out.println("END"); } catch(IOException e) { + throw new RuntimeException(e); } finally { // Always close it: try { socket.close(); - } catch(IOException e) {} + } catch(IOException e) { + throw new RuntimeException(e); + } threadcount--; // Ending this thread } } @@ -77,11 +82,9 @@ public class MultiSimpleClient { main(String[] args) throws IOException, InterruptedException { new TimedAbort(5); // Terminate after 5 seconds - InetAddress addr = - InetAddress.getByName(null); + InetAddress addr = InetAddress.getByName(null); while(true) { - if(SimpleClientThread.threadCount() - < MAX_THREADS) + if(SimpleClientThread.threadCount() < MAX_THREADS) new SimpleClientThread(addr); Thread.sleep(100); } diff --git a/network/MultiSimpleServer.java b/network/MultiSimpleServer.java index 3a6bea587..236d39f9c 100644 --- a/network/MultiSimpleServer.java +++ b/network/MultiSimpleServer.java @@ -2,7 +2,7 @@ // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. -// Uses multithreading to handle any number of clients +// Uses threads to handle any number of clients // {ValidateByHand} import java.io.*; import java.net.*; @@ -25,10 +25,9 @@ public ServeOneSimple(Socket s) new BufferedWriter( new OutputStreamWriter( socket.getOutputStream())), true); - // If any of the above calls throw an - // exception, the caller is responsible for - // closing the socket. Otherwise the thread - // will close it. + // If any of the above calls throw an exception, + // the caller is responsible for closing the + // socket. Otherwise the thread closes it. start(); // Calls run() } @Override @@ -42,10 +41,13 @@ public void run() { } System.out.println("closing..."); } catch (IOException e) { + throw new RuntimeException(e); } finally { try { socket.close(); - } catch(IOException e) {} + } catch(IOException e) { + throw new RuntimeException(e); + } } } } diff --git a/validating/CountedList.java b/validating/CountedList.java index 7cf17cc17..83317589f 100644 --- a/validating/CountedList.java +++ b/validating/CountedList.java @@ -2,8 +2,7 @@ // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. -// A List that keeps track of how many -// of itself are created. +// Keeps track of how many of itself are created. package validating; import java.util.*; diff --git a/validating/CountedListTest.java b/validating/CountedListTest.java index f20014bb9..8544fd4a4 100644 --- a/validating/CountedListTest.java +++ b/validating/CountedListTest.java @@ -10,6 +10,14 @@ public class CountedListTest { private CountedList list; + @BeforeAll + static void beforeAllMsg() { + System.out.println(">>> Starting CountedListTest"); + } + @AfterAll + static void afterAllMsg() { + System.out.println(">>> Finished CountedListTest"); + } @BeforeEach public void initialize() { list = new CountedList(); @@ -21,7 +29,6 @@ public void initialize() { public void cleanup() { System.out.println("Cleaning up " + list.getId()); } - // All tests are marked with the @Test annotation: @Test public void insert() { System.out.println("Running testInsert()"); @@ -38,16 +45,12 @@ public void replace() { assertEquals(list.size(), 3); assertEquals(list.get(1), "Replace"); } - // A helper method to reduce code duplication. As long - // as it isn't annotated with @Test, it will not - // be automatically executed by JUnit. + // A helper method to simplify the code. As + // long as it isn't annotated with @Test, it will + // not be automatically executed by JUnit. private void compare(List lst, String[] strs) { - String[] array = lst.toArray(new String[0]); - assertTrue(array.length == strs.length, - "Arrays not the same length"); - for(int i = 0; i < array.length; i++) - assertEquals(strs[i], array[i]); + assertArrayEquals(lst.toArray(new String[0]), strs); } @Test public void order() { @@ -72,15 +75,3 @@ public void addAll() { "An", "African", "Swallow" }); } } -/* Output: -CountedList #0 -Running testAddAll() -CountedList #1 -Running testInsert() -CountedList #2 -Running testRemove() -CountedList #3 -Running testOrder() -CountedList #4 -Running testReplace() -*/ diff --git a/validating/DynamicStringInverterTests.java b/validating/DynamicStringInverterTests.java index f095cf51a..0e9abe277 100644 --- a/validating/DynamicStringInverterTests.java +++ b/validating/DynamicStringInverterTests.java @@ -22,13 +22,14 @@ Stream testVersions(String id, inverter -> inverter.getClass().getSimpleName(), inverter -> { System.out.println( - inverter.getClass().getSimpleName() + ": " + id - ); + inverter.getClass().getSimpleName() + + ": " + id); try { if(test.apply(inverter) != "fail") System.out.println("Success"); } catch(Exception | Error e) { - System.out.println("Exception: " + e.getMessage()); + System.out.println( + "Exception: " + e.getMessage()); } } ); diff --git a/validating/FirstJUnit5Tests.java b/validating/FirstJUnit5Tests.java deleted file mode 100644 index c3f71dfdb..000000000 --- a/validating/FirstJUnit5Tests.java +++ /dev/null @@ -1,15 +0,0 @@ -// validating/FirstJUnit5Tests.java -// (c)2016 MindView LLC: see Copyright.txt -// We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. -package validating; -import org.junit.jupiter.api.*; -import static org.junit.jupiter.api.Assertions.*; - -class FirstJUnit5Tests { - @Test - void myFirstTest() { - System.out.println("FirstJUnit5Tests"); - assertEquals(2, 1 + 1); - } -} diff --git a/validating/GuavaAssertions.java b/validating/GuavaAssertions.java new file mode 100644 index 000000000..c16792822 --- /dev/null +++ b/validating/GuavaAssertions.java @@ -0,0 +1,48 @@ +// validating/GuavaAssertions.java +// (c)2016 MindView LLC: see Copyright.txt +// We make no guarantees that this code is fit for any purpose. +// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Assertions that are always enabled. +import com.google.common.base.*; +import static com.google.common.base.Verify.*; + +public class GuavaAssertions { + public static void main(String[] args) { + verify(2 + 2 == 4); + try { + verify(1 + 2 == 4); + } catch(VerifyException e) { + System.out.println(e); + } + try { + verify(1 + 2 == 4, "Bad math"); + } catch(VerifyException e) { + System.out.println(e.getMessage()); + } + try { + verify(1 + 2 == 4, "Bad math: %s", "not 4"); + } catch(VerifyException e) { + System.out.println(e.getMessage()); + } + String s = ""; + s = verifyNotNull(s); + s = null; + try { + verifyNotNull(s); + } catch(VerifyException e) { + System.out.println(e.getMessage()); + } + try { + verifyNotNull(s, "Shouldn't be null: %s", "arg s"); + } catch(VerifyException e) { + System.out.println(e.getMessage()); + } + } +} +/* Output: +com.google.common.base.VerifyException +Bad math +Bad math: not 4 +expected a non-null reference +Shouldn't be null: arg s +*/ diff --git a/validating/GuavaPreconditions.java b/validating/GuavaPreconditions.java index 2b39b1be0..bcea196c3 100644 --- a/validating/GuavaPreconditions.java +++ b/validating/GuavaPreconditions.java @@ -3,12 +3,121 @@ // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. // Demonstrating Guava Preconditions +import java.util.function.*; import static com.google.common.base.Preconditions.*; public class GuavaPreconditions { - + void g(String s) { + checkState(s.length() > 6); + System.out.println("Success: " + s); + } + static void test(Consumer c, String s) { + try { + System.out.println(s); + c.accept(s); + System.out.println("Success"); + } catch(Exception e) { + String type = e.getClass().getSimpleName(); + String msg = e.getMessage(); + System.out.println(type + + (msg == null ? "" : ": " + msg)); + } + } public static void main(String[] args) { + test((s) -> s = checkNotNull(s), "X"); + test((s) -> s = checkNotNull(s), null); + test((s) -> s = checkNotNull(s, "s was null"), null); + test((s) -> s = checkNotNull( + s, "s was null, %s %s", "arg2", "arg3"), null); + + test((s) -> checkArgument(s == "Fozzie"), "Fozzie"); + test((s) -> checkArgument(s == "Fozzie"), "X"); + test((s) -> checkArgument(s == "Fozzie"), null); + test((s) -> checkArgument( + s == "Fozzie", "Bear Left!"), null); + test((s) -> checkArgument( + s == "Fozzie", "Bear Left! %s Right!", "Frog"), + null); + + test((s) -> checkState(s.length() > 6), "Mortimer"); + test((s) -> checkState(s.length() > 6), "Mort"); + test((s) -> checkState(s.length() > 6), null); + + test((s) -> + checkElementIndex(6, s.length()), "Robert"); + test((s) -> + checkElementIndex(6, s.length()), "Bob"); + test((s) -> + checkElementIndex(6, s.length()), null); + + test((s) -> + checkPositionIndex(6, s.length()), "Robert"); + test((s) -> + checkPositionIndex(6, s.length()), "Bob"); + test((s) -> + checkPositionIndex(6, s.length()), null); + + test((s) -> checkPositionIndexes( + 0, 6, s.length()), "Hieronymus"); + test((s) -> checkPositionIndexes( + 0, 10, s.length()), "Hieronymus"); + test((s) -> checkPositionIndexes( + 0, 11, s.length()), "Hieronymus"); + test((s) -> checkPositionIndexes( + -1, 6, s.length()), "Hieronymus"); + test((s) -> checkPositionIndexes( + 7, 6, s.length()), "Hieronymus"); + test((s) -> checkPositionIndexes( + 0, 6, s.length()), null); } } /* Output: +X +Success +null +NullPointerException +null +NullPointerException: s was null +null +NullPointerException: s was null, arg2 arg3 +Fozzie +Success +X +IllegalArgumentException +null +IllegalArgumentException +null +IllegalArgumentException: Bear Left! +null +IllegalArgumentException: Bear Left! Frog Right! +Mortimer +Success +Mort +IllegalStateException +null +NullPointerException +Robert +IndexOutOfBoundsException: index (6) must be less than size (6) +Bob +IndexOutOfBoundsException: index (6) must be less than size (3) +null +NullPointerException +Robert +Success +Bob +IndexOutOfBoundsException: index (6) must not be greater than size (3) +null +NullPointerException +Hieronymus +Success +Hieronymus +Success +Hieronymus +IndexOutOfBoundsException: end index (11) must not be greater than size (10) +Hieronymus +IndexOutOfBoundsException: start index (-1) must not be negative +Hieronymus +IndexOutOfBoundsException: end index (6) must not be less than start index (7) +null +NullPointerException */ From 04c08103f3c107c3cd401c0d8945b1d291f73d42 Mon Sep 17 00:00:00 2001 From: Bruce Eckel Date: Thu, 1 Sep 2016 14:54:30 -0600 Subject: [PATCH 112/320] Added support for checkstyle Not polished, but it works. --- build.gradle | 9 +++ checkstyle.xml | 178 +++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 187 insertions(+) create mode 100644 checkstyle.xml diff --git a/build.gradle b/build.gradle index 162354dc0..58fa9a36d 100644 --- a/build.gradle +++ b/build.gradle @@ -134,6 +134,7 @@ subprojects { apply plugin: 'me.champeau.gradle.jmh' apply plugin: 'java' apply plugin: 'org.junit.platform.gradle.plugin' + apply plugin: 'checkstyle' sourceCompatibility = '1.8' targetCompatibility = '1.8' @@ -174,6 +175,14 @@ subprojects { //logManager 'org.apache.logging.log4j.jul.LogManager' } + // See: http://blog.jessitron.com/2012/07/using-checkstyle-in-gradle.html + // https://github.com/checkstyle/checkstyle/blob/master/src/main/resources/google_checks.xml + // http://checkstyle.sourceforge.net/reports/google-java-style.html + checkstyle { + configFile = new File(rootDir, "checkstyle.xml") + toolVersion = '6.7' + } + sourceSets { main { java { diff --git a/checkstyle.xml b/checkstyle.xml new file mode 100644 index 000000000..a53318faa --- /dev/null +++ b/checkstyle.xml @@ -0,0 +1,178 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From 543409a58e9e0112b75407b4669c8ea544fa96dc Mon Sep 17 00:00:00 2001 From: Bruce Eckel Date: Thu, 1 Sep 2016 15:14:44 -0600 Subject: [PATCH 113/320] Put tests in the "tests" subdirectory --- build.gradle | 29 +++---------------- references/{ => tests}/DeepCopyTest.java | 2 +- validating/{ => tests}/CountedListTest.java | 2 +- .../DynamicStringInverterTests.java | 2 +- validating/{ => tests}/QueueTest.java | 3 +- .../{ => tests}/StringInverterTests.java | 2 +- 6 files changed, 9 insertions(+), 31 deletions(-) rename references/{ => tests}/DeepCopyTest.java (95%) rename validating/{ => tests}/CountedListTest.java (98%) rename validating/{ => tests}/DynamicStringInverterTests.java (98%) rename validating/{ => tests}/QueueTest.java (98%) rename validating/{ => tests}/StringInverterTests.java (97%) diff --git a/build.gradle b/build.gradle index 58fa9a36d..809e0339a 100644 --- a/build.gradle +++ b/build.gradle @@ -159,20 +159,7 @@ subprojects { } junitPlatform { - // platformVersion '1.0.0-SNAPSHOT' - //engines { - // include 'junit-jupiter', 'junit-vintage' - // exclude 'custom-engine' - //} -/* tags { - // include 'fast' - exclude 'slow' - }*/ - //includeClassNamePattern '.*Test' includeClassNamePattern '.*' - // enableStandardTestTask true - // reportsDir "build/test-results/junit-platform" // this is the default - //logManager 'org.apache.logging.log4j.jul.LogManager' } // See: http://blog.jessitron.com/2012/07/using-checkstyle-in-gradle.html @@ -187,8 +174,7 @@ subprojects { main { java { srcDir projectDir - // Remove this when it's working: - // exclude "DynamicStringInverterTests.java" + exclude "tests/**" } resources { srcDir projectDir @@ -200,18 +186,13 @@ subprojects { srcDir projectDir } } -/* test { + test { java { - srcDir projectDir + srcDir new File(projectDir, "tests") } - }*/ + } } - /*test { - testClassesDir = sourceSets.main.output.classesDir - classpath = sourceSets.main.runtimeClasspath - }*/ - jmh { jmhVersion = '1.13' duplicateClassesStrategy = 'warn' @@ -227,13 +208,11 @@ subprojects { // Exclude java sources that will not compile if (tags.compileTimeError) { - // println ">>> Excluding " + file.name sourceSets.main.java.excludes.add(file.name) } else { JavaExec javaTask = null // Add tasks for java sources with main methods if (tags.hasMainMethod || tags.javaCmd) { - javaTask = tasks.create(name: tags.fileRoot, type: JavaExec, dependsOn: tags.runFirst) { main = tags.mainClass classpath = sourceSets.main.runtimeClasspath diff --git a/references/DeepCopyTest.java b/references/tests/DeepCopyTest.java similarity index 95% rename from references/DeepCopyTest.java rename to references/tests/DeepCopyTest.java index 93e0daa2e..4f1506884 100644 --- a/references/DeepCopyTest.java +++ b/references/tests/DeepCopyTest.java @@ -1,4 +1,4 @@ -// references/DeepCopyTest.java +// references/tests/DeepCopyTest.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. diff --git a/validating/CountedListTest.java b/validating/tests/CountedListTest.java similarity index 98% rename from validating/CountedListTest.java rename to validating/tests/CountedListTest.java index 8544fd4a4..44263c687 100644 --- a/validating/CountedListTest.java +++ b/validating/tests/CountedListTest.java @@ -1,4 +1,4 @@ -// validating/CountedListTest.java +// validating/tests/CountedListTest.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. diff --git a/validating/DynamicStringInverterTests.java b/validating/tests/DynamicStringInverterTests.java similarity index 98% rename from validating/DynamicStringInverterTests.java rename to validating/tests/DynamicStringInverterTests.java index 0e9abe277..30ead8d3d 100644 --- a/validating/DynamicStringInverterTests.java +++ b/validating/tests/DynamicStringInverterTests.java @@ -1,4 +1,4 @@ -// validating/DynamicStringInverterTests.java +// validating/tests/DynamicStringInverterTests.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. diff --git a/validating/QueueTest.java b/validating/tests/QueueTest.java similarity index 98% rename from validating/QueueTest.java rename to validating/tests/QueueTest.java index 9c5b11cf1..dc63effa7 100644 --- a/validating/QueueTest.java +++ b/validating/tests/QueueTest.java @@ -1,9 +1,8 @@ -// validating/QueueTest.java +// validating/tests/QueueTest.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. package validating; -//import validating.Queue; import org.junit.jupiter.api.*; import static org.junit.jupiter.api.Assertions.*; diff --git a/validating/StringInverterTests.java b/validating/tests/StringInverterTests.java similarity index 97% rename from validating/StringInverterTests.java rename to validating/tests/StringInverterTests.java index 85565d0d3..fc5d29acb 100644 --- a/validating/StringInverterTests.java +++ b/validating/tests/StringInverterTests.java @@ -1,4 +1,4 @@ -// validating/StringInverterTests.java +// validating/tests/StringInverterTests.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. From 22b4982a30fbf6fe1ddc6487a45884565dce2f85 Mon Sep 17 00:00:00 2001 From: bfrasure Date: Thu, 1 Sep 2016 17:05:02 -0600 Subject: [PATCH 114/320] Store test output in $projectName/tests/report.txt --- build.gradle | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/build.gradle b/build.gradle index 809e0339a..16d689d1b 100644 --- a/build.gradle +++ b/build.gradle @@ -263,6 +263,26 @@ subprojects { } } task run(dependsOn: createdTasks) + + /* Store test output in $projectName/tests + JUnit 5's junitPlatformTest runs as a "javaExec" rather than a "test", + so we can't hook into the before/after test behavior. + */ + tasks.findByPath(":$name:junitPlatformTest").configure{ + File testDir = new File(project.name + "/tests") + if ( testDir.exists() ) { + File outFile = new File(testDir, 'report.txt') + doFirst{ + standardOutput = new TeeOutputStream(new FileOutputStream(outFile, true), System.out) + } + doLast { + if(outFile.size() == 0) + outFile.delete() + else if(outFile.text.contains("0 tests found")) + outFile.delete() + } + } + } } project(':validating') { From e6dd2198de68ac854ee96dfb3b27ce2daa14eda1 Mon Sep 17 00:00:00 2001 From: Bruce Eckel Date: Thu, 1 Sep 2016 21:30:15 -0600 Subject: [PATCH 115/320] Commented out checkstyle and findbugs --- build.gradle | 49 +++++++++----- checkstyle.xml | 178 ------------------------------------------------- go.bat | 3 +- 3 files changed, 34 insertions(+), 196 deletions(-) delete mode 100644 checkstyle.xml diff --git a/build.gradle b/build.gradle index 16d689d1b..e5c51d655 100644 --- a/build.gradle +++ b/build.gradle @@ -134,7 +134,8 @@ subprojects { apply plugin: 'me.champeau.gradle.jmh' apply plugin: 'java' apply plugin: 'org.junit.platform.gradle.plugin' - apply plugin: 'checkstyle' + //apply plugin: 'checkstyle' + //apply plugin: 'findbugs' sourceCompatibility = '1.8' targetCompatibility = '1.8' @@ -165,11 +166,27 @@ subprojects { // See: http://blog.jessitron.com/2012/07/using-checkstyle-in-gradle.html // https://github.com/checkstyle/checkstyle/blob/master/src/main/resources/google_checks.xml // http://checkstyle.sourceforge.net/reports/google-java-style.html - checkstyle { - configFile = new File(rootDir, "checkstyle.xml") +/* checkstyle { + // configFile = new File(rootDir, "checkstyle.xml") toolVersion = '6.7' + }*/ + +/* findbugsMain { + reports { + xml.enabled = false + html.enabled = true + } + ignoreFailures = true } + findbugsJmh { + reports { + xml.enabled = false + html.enabled = true + } + ignoreFailures = true + } +*/ sourceSets { main { java { @@ -268,20 +285,20 @@ subprojects { JUnit 5's junitPlatformTest runs as a "javaExec" rather than a "test", so we can't hook into the before/after test behavior. */ - tasks.findByPath(":$name:junitPlatformTest").configure{ - File testDir = new File(project.name + "/tests") - if ( testDir.exists() ) { - File outFile = new File(testDir, 'report.txt') - doFirst{ - standardOutput = new TeeOutputStream(new FileOutputStream(outFile, true), System.out) - } - doLast { - if(outFile.size() == 0) - outFile.delete() - else if(outFile.text.contains("0 tests found")) - outFile.delete() + tasks.findByPath(":$name:junitPlatformTest").configure { + File testDir = new File(project.name + "/tests") + if(testDir.exists()) { + File outFile = new File(testDir, 'report.txt') + doFirst { + standardOutput = new TeeOutputStream(new FileOutputStream(outFile, true), System.out) + } + doLast { + if(outFile.size() == 0) + outFile.delete() + else if(outFile.text.contains("0 tests found")) + outFile.delete() + } } - } } } diff --git a/checkstyle.xml b/checkstyle.xml deleted file mode 100644 index a53318faa..000000000 --- a/checkstyle.xml +++ /dev/null @@ -1,178 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/go.bat b/go.bat index 957d931c9..cd3994741 100644 --- a/go.bat +++ b/go.bat @@ -1,3 +1,2 @@ -gradlew --parallel --daemon run > output.txt 2> errors.txt -START /min "C:\Program Files\Windows Media Player\wmplayer.exe" %windir%\media\Alarm07.wav +gradlew --no-daemon run > output.txt 2> errors.txt rem find . -size 0 -type f From 11610b827066496289584e7bcdbd0648f4969f8c Mon Sep 17 00:00:00 2001 From: Bruce Eckel Date: Sat, 3 Sep 2016 12:17:25 -0600 Subject: [PATCH 116/320] Further try-with-resources rewrite --- network/ChatterClient.java | 15 +++++++-------- network/ChatterServer.java | 11 ++++------- 2 files changed, 11 insertions(+), 15 deletions(-) diff --git a/network/ChatterClient.java b/network/ChatterClient.java index 8fdc8112a..1ef77057d 100644 --- a/network/ChatterClient.java +++ b/network/ChatterClient.java @@ -10,8 +10,6 @@ import onjava.*; public class ChatterClient extends Thread { - // Can listen & send on the same socket: - private DatagramSocket s; private InetAddress hostAddress; private byte[] buf = new byte[1000]; private DatagramPacket dp = @@ -21,21 +19,19 @@ public class ChatterClient extends Thread { public ChatterClient(int identifier) { id = identifier; try { - // Auto-assign port number: - s = new DatagramSocket(); hostAddress = InetAddress.getByName("localhost"); } catch(UnknownHostException e) { System.err.println("Cannot find host"); System.exit(1); - } catch(SocketException e) { - System.err.println("Can't open socket"); - throw new RuntimeException(e); } System.out.println("ChatterClient starting"); } public void sendAndEcho(String msg) { - try { + try ( + // Auto-assign port number: + DatagramSocket s = new DatagramSocket(); + ) { // Make and send a datagram: s.send(Dgram.toDatagram( msg, hostAddress, ChatterServer.INPORT)); @@ -48,6 +44,9 @@ public void sendAndEcho(String msg) { dp.getPort() + ": " + Dgram.toString(dp); System.out.println(rcvd); + } catch(SocketException e) { + System.err.println("Can't open socket"); + throw new RuntimeException(e); } catch(IOException e) { throw new RuntimeException(e); } diff --git a/network/ChatterServer.java b/network/ChatterServer.java index f14920410..e56d234eb 100644 --- a/network/ChatterServer.java +++ b/network/ChatterServer.java @@ -13,12 +13,12 @@ public class ChatterServer { private byte[] buf = new byte[1000]; private DatagramPacket dp = new DatagramPacket(buf, buf.length); - // Can listen & send on the same socket: - private DatagramSocket socket; public ChatterServer() { - try { - socket = new DatagramSocket(INPORT); + // Can listen & send on the same socket: + try ( + DatagramSocket socket = new DatagramSocket(INPORT) + ) { System.out.println("Server started"); while(true) { // Block until a datagram appears: @@ -37,9 +37,6 @@ public ChatterServer() { dp.getAddress(), dp.getPort()); socket.send(echo); } - } catch(SocketException e) { - System.err.println("Can't open socket"); - System.exit(1); } catch(IOException e) { System.out.println("Communication error"); throw new RuntimeException(e); From 704bac09f462834dc8bdaee38767edfd536fe92b Mon Sep 17 00:00:00 2001 From: Bruce Eckel Date: Sat, 3 Sep 2016 12:18:15 -0600 Subject: [PATCH 117/320] Bill's changes and formatting --- network/MultiSimpleClient.java | 67 +++++++++++----------------------- network/MultiSimpleServer.java | 66 ++++++++++++--------------------- network/SimpleClient.java | 21 ++++------- network/SimpleServer.java | 50 ++++++++++--------------- 4 files changed, 72 insertions(+), 132 deletions(-) diff --git a/network/MultiSimpleClient.java b/network/MultiSimpleClient.java index 71e5fb9bb..334808b22 100644 --- a/network/MultiSimpleClient.java +++ b/network/MultiSimpleClient.java @@ -2,75 +2,50 @@ // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. -// Testing MultiSimpleServer with multiple clients +// Testing MultiSimpleServer with multiple clients. // {ValidateByHand} import java.net.*; import java.io.*; import onjava.*; -class SimpleClientThread extends Thread { - private Socket socket; - private BufferedReader in; - private PrintWriter out; +class SimpleClientThread implements Runnable { + private InetAddress address; private static int counter = 0; private int id = counter++; private static int threadcount = 0; public static int threadCount() { return threadcount; } - public SimpleClientThread(InetAddress addr) { + public SimpleClientThread(InetAddress address) { System.out.println("Making client " + id); + this.address = address; threadcount++; - try { - socket = - new Socket(addr, MultiSimpleServer.PORT); - } catch(IOException e) { - // If the creation of the socket fails, - // nothing needs cleanup. - } - try { - in = + } + @Override + public void run() { + try ( + Socket socket = + new Socket(address, MultiSimpleServer.PORT); + BufferedReader in = new BufferedReader( new InputStreamReader( socket.getInputStream())); - // Enable auto-flush: - out = + PrintWriter out = new PrintWriter( new BufferedWriter( new OutputStreamWriter( - socket.getOutputStream())), true); - start(); - } catch(IOException e) { - // The socket should be closed on any - // failures other than the socket - // constructor: - try { - socket.close(); - } catch(IOException e2) { - throw new RuntimeException(e2); - } - } - // Otherwise the socket will be closed by - // the run() method of the thread. - } - @Override - public void run() { - try { - for(int i = 0; i < 25; i++) { + // Enable auto-flush: + socket.getOutputStream())), true) + ) { + for (int i = 0; i < 25; i++) { out.println("Client " + id + ": " + i); String str = in.readLine(); System.out.println(str); } out.println("END"); - } catch(IOException e) { - throw new RuntimeException(e); + } catch (IOException ex) { + throw new RuntimeException(ex); } finally { - // Always close it: - try { - socket.close(); - } catch(IOException e) { - throw new RuntimeException(e); - } threadcount--; // Ending this thread } } @@ -82,10 +57,10 @@ public class MultiSimpleClient { main(String[] args) throws IOException, InterruptedException { new TimedAbort(5); // Terminate after 5 seconds - InetAddress addr = InetAddress.getByName(null); + InetAddress address = InetAddress.getByName(null); while(true) { if(SimpleClientThread.threadCount() < MAX_THREADS) - new SimpleClientThread(addr); + new SimpleClientThread(address); Thread.sleep(100); } } diff --git a/network/MultiSimpleServer.java b/network/MultiSimpleServer.java index 236d39f9c..2a0688522 100644 --- a/network/MultiSimpleServer.java +++ b/network/MultiSimpleServer.java @@ -2,52 +2,42 @@ // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. -// Uses threads to handle any number of clients +// Uses threads to handle any number of clients. // {ValidateByHand} import java.io.*; import java.net.*; import onjava.*; -class ServeOneSimple extends Thread { - private Socket socket; - private BufferedReader in; - private PrintWriter out; - public ServeOneSimple(Socket s) - throws IOException { - socket = s; - in = - new BufferedReader( - new InputStreamReader( - socket.getInputStream())); - // Enable auto-flush: - out = - new PrintWriter( - new BufferedWriter( - new OutputStreamWriter( - socket.getOutputStream())), true); - // If any of the above calls throw an exception, - // the caller is responsible for closing the - // socket. Otherwise the thread closes it. - start(); // Calls run() +class ServeOneSimple implements Runnable { + private ServerSocket ss; + public + ServeOneSimple(ServerSocket ss) throws IOException { + this.ss = ss; } @Override public void run() { - try { + try ( + Socket socket = ss.accept(); + BufferedReader in = + new BufferedReader( + new InputStreamReader( + socket.getInputStream())); + PrintWriter out = + new PrintWriter( + new BufferedWriter( + new OutputStreamWriter( + // Enable auto-flush: + socket.getOutputStream())), true) + ) { while (true) { String str = in.readLine(); if(str.equals("END")) break; System.out.println("Echoing: " + str); out.println(str); } - System.out.println("closing..."); + System.out.println("closing socket..."); } catch (IOException e) { throw new RuntimeException(e); - } finally { - try { - socket.close(); - } catch(IOException e) { - throw new RuntimeException(e); - } } } } @@ -57,22 +47,12 @@ public class MultiSimpleServer { public static void main(String[] args) throws IOException { new TimedAbort(5); // Terminate after 5 seconds - ServerSocket s = new ServerSocket(PORT); System.out.println("Server Started"); - try { + try (ServerSocket ss = new ServerSocket(PORT)){ + // Block until a connection occurs: while(true) { - // Blocks until a connection occurs: - Socket socket = s.accept(); - try { - new ServeOneSimple(socket); - } catch(IOException e) { - // If it fails, close the socket, - // otherwise the thread will close it: - socket.close(); - } + new ServeOneSimple(ss); } - } finally { - s.close(); } } } diff --git a/network/SimpleClient.java b/network/SimpleClient.java index 4fc4eed48..41e05dad9 100644 --- a/network/SimpleClient.java +++ b/network/SimpleClient.java @@ -3,7 +3,7 @@ // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. // Sends lines to the server and -// reads lines the server sends +// reads lines the server sends. // {ValidateByHand} import java.net.*; import java.io.*; @@ -16,32 +16,27 @@ public class SimpleClient { InetAddress addr = InetAddress.getLoopbackAddress(); System.out.println("addr = " + addr); - Socket socket = - new Socket(addr, SimpleServer.PORT); - // Guard everything in a try-finally to make - // sure that the socket is closed: - try { - System.out.println("socket = " + socket); + // TWR will sure that the socket is closed: + try ( + Socket socket = new Socket(addr, SimpleServer.PORT); BufferedReader in = new BufferedReader( new InputStreamReader( socket.getInputStream())); - // Output is automatically flushed - // by PrintWriter: PrintWriter out = new PrintWriter( new BufferedWriter( new OutputStreamWriter( - socket.getOutputStream())),true); + // Enable auto-flush: + socket.getOutputStream())), true); + ) { + System.out.println("socket: " + socket); for(int i = 0; i < 10; i ++) { out.println("hello " + i); String str = in.readLine(); System.out.println(str); } out.println("END"); - } finally { - System.out.println("closing..."); - socket.close(); } } } diff --git a/network/SimpleServer.java b/network/SimpleServer.java index b4ce86f3b..01c4905f6 100644 --- a/network/SimpleServer.java +++ b/network/SimpleServer.java @@ -2,7 +2,7 @@ // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. -// Echoes what the client sends +// Echoes what the client sends. // {ValidateByHand} import java.io.*; import java.net.*; @@ -12,38 +12,28 @@ public class SimpleServer { public static final int PORT = 8080; public static void main(String[] args) throws IOException { - ServerSocket s = new ServerSocket(PORT); - System.out.println("Started: " + s); - try { + try ( + ServerSocket s = new ServerSocket(PORT); // Blocks until a connection occurs: Socket socket = s.accept(); - try { - System.out.println( - "Connection accepted: "+ socket); - BufferedReader in = - new BufferedReader( - new InputStreamReader( - socket.getInputStream())); - // Output is automatically flushed - // by PrintWriter: - PrintWriter out = - new PrintWriter( - new BufferedWriter( - new OutputStreamWriter( - socket.getOutputStream())), true); - while (true) { - String str = in.readLine(); - if(str.equals("END")) break; - System.out.println("Echoing: " + str); - out.println(str); - } - // Always close the two sockets... - } finally { - System.out.println("closing..."); - socket.close(); + BufferedReader in = + new BufferedReader( + new InputStreamReader( + socket.getInputStream())); + PrintWriter out = + new PrintWriter( + new BufferedWriter( + new OutputStreamWriter( + // Enable auto-flush: + socket.getOutputStream())), true) + ) { + System.out.println("Connection: " + socket); + while (true) { + String str = in.readLine(); + if(str.equals("END")) break; + System.out.println("Echoing: " + str); + out.println(str); } - } finally { - s.close(); } } } From 13a6e2c5e6f0d23988b1177c461b2aaf0e5ae1ea Mon Sep 17 00:00:00 2001 From: Bruce Eckel Date: Sat, 3 Sep 2016 13:24:33 -0600 Subject: [PATCH 118/320] Put necessary files in packages Also fixed a small compile bug (can't use static in @BeforeEach) --- go.bat | 3 ++- network/ChatterClient.java | 1 + network/ChatterServer.java | 1 + network/Dgram.java | 1 + network/MultiSimpleClient.java | 1 + network/MultiSimpleServer.java | 1 + network/SimpleClient.java | 1 + network/SimpleServer.java | 1 + network/WhoAmI.java | 3 +-- network/tests/SimpleTcpTests.java | 45 +++++++++++++++++++++++++++++++ 10 files changed, 55 insertions(+), 3 deletions(-) create mode 100644 network/tests/SimpleTcpTests.java diff --git a/go.bat b/go.bat index cd3994741..957d931c9 100644 --- a/go.bat +++ b/go.bat @@ -1,2 +1,3 @@ -gradlew --no-daemon run > output.txt 2> errors.txt +gradlew --parallel --daemon run > output.txt 2> errors.txt +START /min "C:\Program Files\Windows Media Player\wmplayer.exe" %windir%\media\Alarm07.wav rem find . -size 0 -type f diff --git a/network/ChatterClient.java b/network/ChatterClient.java index 1ef77057d..964adba33 100644 --- a/network/ChatterClient.java +++ b/network/ChatterClient.java @@ -5,6 +5,7 @@ // {ValidateByHand} // Tests the ChatterServer by starting multiple // clients, each of which sends datagrams. +package network; import java.net.*; import java.io.*; import onjava.*; diff --git a/network/ChatterServer.java b/network/ChatterServer.java index e56d234eb..669f45dc8 100644 --- a/network/ChatterServer.java +++ b/network/ChatterServer.java @@ -4,6 +4,7 @@ // Visit http://mindviewinc.com/Books/OnJava/ for more book information. // {ValidateByHand} // A server that echoes datagrams +package network; import java.net.*; import java.io.*; import onjava.*; diff --git a/network/Dgram.java b/network/Dgram.java index fdb92abe8..e1544ae63 100644 --- a/network/Dgram.java +++ b/network/Dgram.java @@ -3,6 +3,7 @@ // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. // Converts between Strings and DataGramPackets +package network; import java.net.*; public class Dgram { diff --git a/network/MultiSimpleClient.java b/network/MultiSimpleClient.java index 334808b22..2c0be6303 100644 --- a/network/MultiSimpleClient.java +++ b/network/MultiSimpleClient.java @@ -4,6 +4,7 @@ // Visit http://mindviewinc.com/Books/OnJava/ for more book information. // Testing MultiSimpleServer with multiple clients. // {ValidateByHand} +package network; import java.net.*; import java.io.*; import onjava.*; diff --git a/network/MultiSimpleServer.java b/network/MultiSimpleServer.java index 2a0688522..c8b891cc7 100644 --- a/network/MultiSimpleServer.java +++ b/network/MultiSimpleServer.java @@ -4,6 +4,7 @@ // Visit http://mindviewinc.com/Books/OnJava/ for more book information. // Uses threads to handle any number of clients. // {ValidateByHand} +package network; import java.io.*; import java.net.*; import onjava.*; diff --git a/network/SimpleClient.java b/network/SimpleClient.java index 41e05dad9..f943a6e09 100644 --- a/network/SimpleClient.java +++ b/network/SimpleClient.java @@ -5,6 +5,7 @@ // Sends lines to the server and // reads lines the server sends. // {ValidateByHand} +package network; import java.net.*; import java.io.*; diff --git a/network/SimpleServer.java b/network/SimpleServer.java index 01c4905f6..a325d8b99 100644 --- a/network/SimpleServer.java +++ b/network/SimpleServer.java @@ -4,6 +4,7 @@ // Visit http://mindviewinc.com/Books/OnJava/ for more book information. // Echoes what the client sends. // {ValidateByHand} +package network; import java.io.*; import java.net.*; diff --git a/network/WhoAmI.java b/network/WhoAmI.java index 5cc8ff99f..5ded836f1 100644 --- a/network/WhoAmI.java +++ b/network/WhoAmI.java @@ -2,8 +2,7 @@ // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. -// Finds out your machine name and network address -// when you're connected to the Internet +// Discovers your machine name and network address. import java.net.*; public class WhoAmI { diff --git a/network/tests/SimpleTcpTests.java b/network/tests/SimpleTcpTests.java new file mode 100644 index 000000000..3113f0e07 --- /dev/null +++ b/network/tests/SimpleTcpTests.java @@ -0,0 +1,45 @@ +// network/tests/SimpleTcpTests.java +// (c)2016 MindView LLC: see Copyright.txt +// We make no guarantees that this code is fit for any purpose. +// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +package network; +import java.util.*; +import java.util.stream.*; +import org.junit.jupiter.api.*; +import static org.junit.jupiter.api.Assertions.*; +import onjava.*; + +public class SimpleTcpTests { + + @BeforeAll + static void startMsg() { + System.out.println(">>> Network Tests <<<"); + } + + @BeforeEach + void setupServer () { } + + @Test + void basicTest() throws Exception { + SimpleServer server = new SimpleServer(); + SimpleClient client = new SimpleClient(); + client.main(null); + assertTrue(false); // Fail until there are good assertions in the test + } + + @Test + void multiTest() throws Exception { + MultiSimpleClient client = new MultiSimpleClient(); + MultiSimpleServer server = new MultiSimpleServer(); + client.main(null); + assertTrue(false); // Fail until there are good assertions in the test + } + + @Test + void chatterTest() throws Exception { + ChatterServer server = new ChatterServer(); + ChatterClient.main(null); + assertTrue(false); // Fail until there are good assertions in the test + } + +} From 6df70d51b3512c91e9167b53e55f82e994c8fa6f Mon Sep 17 00:00:00 2001 From: bfrasure Date: Mon, 5 Sep 2016 21:28:31 -0600 Subject: [PATCH 119/320] +RMITests & put remote classes in package --- remote/DisplayPerfectTime.java | 2 ++ remote/PerfectTime.java | 2 ++ remote/PerfectTimeImpl.java | 2 ++ remote/PerfectTimeServer.java | 2 ++ remote/tests/RMITests.java | 25 +++++++++++++++++++++++++ 5 files changed, 33 insertions(+) create mode 100644 remote/tests/RMITests.java diff --git a/remote/DisplayPerfectTime.java b/remote/DisplayPerfectTime.java index 060a387b5..7b86e5b80 100644 --- a/remote/DisplayPerfectTime.java +++ b/remote/DisplayPerfectTime.java @@ -4,6 +4,8 @@ // Visit http://mindviewinc.com/Books/OnJava/ for more book information. // Uses remote object PerfectTime // {ValidateByHand} +package remote; + import java.rmi.registry.*; public class DisplayPerfectTime { diff --git a/remote/PerfectTime.java b/remote/PerfectTime.java index eb02be2cd..8b8ec9f0b 100644 --- a/remote/PerfectTime.java +++ b/remote/PerfectTime.java @@ -3,6 +3,8 @@ // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. // The PerfectTime remote interface +package remote; + import java.rmi.*; public interface PerfectTime extends Remote { diff --git a/remote/PerfectTimeImpl.java b/remote/PerfectTimeImpl.java index 8342b0c17..6cdf5e9e8 100644 --- a/remote/PerfectTimeImpl.java +++ b/remote/PerfectTimeImpl.java @@ -3,6 +3,8 @@ // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. // Implementing the PerfectTime remote object +package remote; + import java.rmi.RemoteException; public class PerfectTimeImpl implements PerfectTime { diff --git a/remote/PerfectTimeServer.java b/remote/PerfectTimeServer.java index ec07c775f..b71a10256 100644 --- a/remote/PerfectTimeServer.java +++ b/remote/PerfectTimeServer.java @@ -4,6 +4,8 @@ // Visit http://mindviewinc.com/Books/OnJava/ for more book information. // Server for the PerfectTime remote object // {ValidateByHand} +package remote; + import java.rmi.registry.Registry; import java.rmi.registry.LocateRegistry; import java.rmi.RemoteException; diff --git a/remote/tests/RMITests.java b/remote/tests/RMITests.java new file mode 100644 index 000000000..4e1f7fd50 --- /dev/null +++ b/remote/tests/RMITests.java @@ -0,0 +1,25 @@ +// remote/tests/RMITests.java +// (c)2016 MindView LLC: see Copyright.txt +// We make no guarantees that this code is fit for any purpose. +// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +package remote; + +import java.rmi.registry.*; + +import org.junit.jupiter.api.*; +import org.junit.jupiter.api.TestInfo; + +public class RMITests { + @Test + void test_remote_time() throws Exception { + LocateRegistry.createRegistry(1099); + PerfectTimeServer timeServer = new PerfectTimeServer(); + timeServer.main(null); + Registry reg = + LocateRegistry.getRegistry("localhost"); + PerfectTime pt = + (PerfectTime) reg.lookup("PerfectTime"); + for (int i = 0; i < 10; i++) + System.out.println("Time: " + pt.getPerfectTime()); + } +} From 073f20e2219921e98d6f7aae16ff339a9ac04572 Mon Sep 17 00:00:00 2001 From: Bruce Eckel Date: Tue, 6 Sep 2016 12:32:51 -0600 Subject: [PATCH 120/320] Reorganized network appendix. try-with-finally reformatting --- annotations/ifx/IfaceExtractorProcessor.java | 8 +-- compression/GZIPcompress.java | 22 +++++---- compression/ZipCompress.java | 42 +++++++++------- exceptions/AutoCloseableDetails.java | 6 ++- exceptions/BodyException.java | 6 ++- exceptions/CloseExceptions.java | 8 +-- exceptions/ConstructorException.java | 8 +-- exceptions/StreamsAreAutoCloseable.java | 10 ++-- exceptions/TryAnything.java | 4 +- exceptions/TryWithResources.java | 6 ++- files/StreamInAndOut.java | 10 ++-- iostreams/BasicFileOutput.java | 14 +++--- iostreams/BufferedInputFile.java | 6 ++- iostreams/FileOutputShortcut.java | 12 +++-- iostreams/FormattedMemoryInput.java | 12 +++-- iostreams/StoringAndRecoveringData.java | 16 +++--- iostreams/TestEOF.java | 8 +-- iostreams/UsingRandomAccessFile.java | 18 ++++--- network/ChatterClient.java | 33 +++---------- network/ChatterServer.java | 15 ++---- ...ultiSimpleServer.java => MultiServer.java} | 49 ++++++++++--------- network/SimpleClient.java | 23 +++++---- ...tiSimpleClient.java => SimpleClient2.java} | 26 ++-------- network/SimpleServer.java | 30 +++++++----- network/tests/ChatterTest.java | 21 ++++++++ network/tests/MultiTest.java | 26 ++++++++++ network/tests/SimpleTcpTests.java | 45 ----------------- network/tests/TestSimpleServerClient.java | 20 ++++++++ newio/BufferToText.java | 36 +++++++++----- newio/ChannelCopy.java | 10 ++-- newio/FileLocking.java | 8 +-- newio/LargeMappedFiles.java | 6 ++- newio/TransferTo.java | 10 ++-- onjava/OSExecute.java | 12 +++-- references/Compete.java | 20 +++++--- serialization/AStoreCADState.java | 8 +-- serialization/Blip3.java | 12 +++-- serialization/Blips.java | 12 +++-- serialization/Logon.java | 12 +++-- serialization/MyWorld.java | 38 ++++++++------ serialization/RecoverCADState.java | 8 +-- serialization/Worm.java | 30 +++++++----- standardio/Redirecting.java | 12 +++-- validating/tests/CountedListTest.java | 24 +++++++++ 44 files changed, 438 insertions(+), 324 deletions(-) rename network/{MultiSimpleServer.java => MultiServer.java} (50%) rename network/{MultiSimpleClient.java => SimpleClient2.java} (64%) create mode 100644 network/tests/ChatterTest.java create mode 100644 network/tests/MultiTest.java delete mode 100644 network/tests/SimpleTcpTests.java create mode 100644 network/tests/TestSimpleServerClient.java diff --git a/annotations/ifx/IfaceExtractorProcessor.java b/annotations/ifx/IfaceExtractorProcessor.java index a0e92df97..06a95e421 100644 --- a/annotations/ifx/IfaceExtractorProcessor.java +++ b/annotations/ifx/IfaceExtractorProcessor.java @@ -50,9 +50,11 @@ public class IfaceExtractorProcessor } private void writeInterfaceFile(String interfaceName) { - try(Writer writer = processingEnv.getFiler() - .createSourceFile(interfaceName) - .openWriter()) { + try( + Writer writer = processingEnv.getFiler() + .createSourceFile(interfaceName) + .openWriter() + ) { String packageName = elementUtils .getPackageOf(interfaceMethods .get(0)).toString(); diff --git a/compression/GZIPcompress.java b/compression/GZIPcompress.java index dce891401..7ab5c376e 100644 --- a/compression/GZIPcompress.java +++ b/compression/GZIPcompress.java @@ -17,21 +17,25 @@ public class GZIPcompress { "the file to test.gz"); System.exit(1); } - try(InputStream in = new BufferedInputStream( - new FileInputStream(args[0])); - BufferedOutputStream out = - new BufferedOutputStream( - new GZIPOutputStream( - new FileOutputStream("test.gz")))) { + try( + InputStream in = new BufferedInputStream( + new FileInputStream(args[0])); + BufferedOutputStream out = + new BufferedOutputStream( + new GZIPOutputStream( + new FileOutputStream("test.gz"))) + ) { System.out.println("Writing file"); int c; while((c = in.read()) != -1) out.write(c); } System.out.println("Reading file"); - try(BufferedReader in2 = new BufferedReader( - new InputStreamReader(new GZIPInputStream( - new FileInputStream("test.gz"))))) { + try( + BufferedReader in2 = new BufferedReader( + new InputStreamReader(new GZIPInputStream( + new FileInputStream("test.gz")))) + ) { String s; while((s = in2.readLine()) != null) System.out.println(s); diff --git a/compression/ZipCompress.java b/compression/ZipCompress.java index 41dd4702a..86631bbe6 100644 --- a/compression/ZipCompress.java +++ b/compression/ZipCompress.java @@ -13,19 +13,23 @@ public class ZipCompress { public static void main(String[] args) throws IOException { - try(FileOutputStream f = - new FileOutputStream("test.zip"); - CheckedOutputStream csum = - new CheckedOutputStream(f, new Adler32()); - ZipOutputStream zos = new ZipOutputStream(csum); - BufferedOutputStream out = - new BufferedOutputStream(zos)) { + try( + FileOutputStream f = + new FileOutputStream("test.zip"); + CheckedOutputStream csum = + new CheckedOutputStream(f, new Adler32()); + ZipOutputStream zos = new ZipOutputStream(csum); + BufferedOutputStream out = + new BufferedOutputStream(zos) + ) { zos.setComment("A test of Java Zipping"); // No corresponding getComment(), though. for(String arg : args) { System.out.println("Writing file " + arg); - try(InputStream in = new BufferedInputStream( - new FileInputStream(arg))) { + try( + InputStream in = new BufferedInputStream( + new FileInputStream(arg)) + ) { zos.putNextEntry(new ZipEntry(arg)); int c; while((c = in.read()) != -1) @@ -39,13 +43,15 @@ public class ZipCompress { } // Now extract the files: System.out.println("Reading file"); - try(FileInputStream fi = - new FileInputStream("test.zip"); - CheckedInputStream csumi = - new CheckedInputStream(fi, new Adler32()); - ZipInputStream in2 = new ZipInputStream(csumi); - BufferedInputStream bis = - new BufferedInputStream(in2)) { + try( + FileInputStream fi = + new FileInputStream("test.zip"); + CheckedInputStream csumi = + new CheckedInputStream(fi, new Adler32()); + ZipInputStream in2 = new ZipInputStream(csumi); + BufferedInputStream bis = + new BufferedInputStream(in2) + ) { ZipEntry ze; while((ze = in2.getNextEntry()) != null) { System.out.println("Reading file " + ze); @@ -58,7 +64,9 @@ public class ZipCompress { "Checksum: "+csumi.getChecksum().getValue()); } // Alternative way to open and read Zip files: - try(ZipFile zf = new ZipFile("test.zip")) { + try( + ZipFile zf = new ZipFile("test.zip") + ) { Enumeration e = zf.entries(); while(e.hasMoreElements()) { ZipEntry ze2 = (ZipEntry)e.nextElement(); diff --git a/exceptions/AutoCloseableDetails.java b/exceptions/AutoCloseableDetails.java index 698c0237b..af4981505 100644 --- a/exceptions/AutoCloseableDetails.java +++ b/exceptions/AutoCloseableDetails.java @@ -18,8 +18,10 @@ class Second extends Reporter {} public class AutoCloseableDetails { public static void main(String[] args) { - try(First f = new First(); - Second s = new Second()) { + try( + First f = new First(); + Second s = new Second() + ) { } } } diff --git a/exceptions/BodyException.java b/exceptions/BodyException.java index 12d953d2d..7b0fce9ee 100644 --- a/exceptions/BodyException.java +++ b/exceptions/BodyException.java @@ -7,8 +7,10 @@ class Third extends Reporter {} public class BodyException { public static void main(String[] args) { - try(First f = new First(); - Second s2 = new Second()) { + try( + First f = new First(); + Second s2 = new Second() + ) { System.out.println("In body"); Third t = new Third(); new SecondExcept(); diff --git a/exceptions/CloseExceptions.java b/exceptions/CloseExceptions.java index 60ebd0855..6c72df2ba 100644 --- a/exceptions/CloseExceptions.java +++ b/exceptions/CloseExceptions.java @@ -25,9 +25,11 @@ public void close() throws CloseException { public class CloseExceptions { public static void main(String[] args) { - try(First f = new First(); - Closer c = new Closer(); - Second s = new Second()) { + try( + First f = new First(); + Closer c = new Closer(); + Second s = new Second() + ) { System.out.println("In body"); } catch(CloseException e) { System.out.println("Caught: " + e); diff --git a/exceptions/ConstructorException.java b/exceptions/ConstructorException.java index 8d970cbee..4a56f0d17 100644 --- a/exceptions/ConstructorException.java +++ b/exceptions/ConstructorException.java @@ -14,9 +14,11 @@ public SecondExcept() throws CE { public class ConstructorException { public static void main(String[] args) { - try(First f = new First(); - SecondExcept s = new SecondExcept(); - Second s2 = new Second()) { + try( + First f = new First(); + SecondExcept s = new SecondExcept(); + Second s2 = new Second() + ) { System.out.println("In body"); } catch(CE e) { System.out.println("Caught: " + e); diff --git a/exceptions/StreamsAreAutoCloseable.java b/exceptions/StreamsAreAutoCloseable.java index 153c73a9a..0fc3617c9 100644 --- a/exceptions/StreamsAreAutoCloseable.java +++ b/exceptions/StreamsAreAutoCloseable.java @@ -9,10 +9,12 @@ public class StreamsAreAutoCloseable { public static void main(String[] args) throws IOException{ - try(Stream in = Files.lines( - Paths.get("StreamsAreAutoCloseable.java")); - PrintWriter outfile = new PrintWriter( - "Results.txt");) { // (1) + try( + Stream in = Files.lines( + Paths.get("StreamsAreAutoCloseable.java")); + PrintWriter outfile = new PrintWriter( + "Results.txt"); // (1) + ) { in.skip(5) .limit(1) .map(String::toLowerCase) diff --git a/exceptions/TryAnything.java b/exceptions/TryAnything.java index 6ccf9b554..bef675732 100644 --- a/exceptions/TryAnything.java +++ b/exceptions/TryAnything.java @@ -8,7 +8,9 @@ class Anything {} public class TryAnything { public static void main(String[] args) { - try(Anything a = new Anything()) { + try( + Anything a = new Anything() + ) { } } } diff --git a/exceptions/TryWithResources.java b/exceptions/TryWithResources.java index 1063cde8d..367b1626d 100644 --- a/exceptions/TryWithResources.java +++ b/exceptions/TryWithResources.java @@ -6,8 +6,10 @@ public class TryWithResources { public static void main(String[] args) { - try(InputStream in = new FileInputStream( - new File("TryWithResources.java"))) { + try( + InputStream in = new FileInputStream( + new File("TryWithResources.java")) + ) { int contents = in.read(); // Process contents } catch(IOException e) { diff --git a/files/StreamInAndOut.java b/files/StreamInAndOut.java index 1984e6e61..6210addbb 100644 --- a/files/StreamInAndOut.java +++ b/files/StreamInAndOut.java @@ -8,10 +8,12 @@ public class StreamInAndOut { public static void main(String[] args) { - try(Stream input = - Files.lines(Paths.get("StreamInAndOut.java")); - PrintWriter output = - new PrintWriter("StreamInAndOut.txt")) { + try( + Stream input = + Files.lines(Paths.get("StreamInAndOut.java")); + PrintWriter output = + new PrintWriter("StreamInAndOut.txt") + ) { input .map(String::toUpperCase) .forEachOrdered(output::println); diff --git a/iostreams/BasicFileOutput.java b/iostreams/BasicFileOutput.java index ee7d91e5b..490cb58c8 100644 --- a/iostreams/BasicFileOutput.java +++ b/iostreams/BasicFileOutput.java @@ -9,12 +9,14 @@ public class BasicFileOutput { static String file = "BasicFileOutput.dat"; public static void main(String[] args) throws IOException { - try(BufferedReader in = new BufferedReader( - new StringReader( - BufferedInputFile.read( - "BasicFileOutput.java"))); - PrintWriter out = new PrintWriter( - new BufferedWriter(new FileWriter(file)))) { + try( + BufferedReader in = new BufferedReader( + new StringReader( + BufferedInputFile.read( + "BasicFileOutput.java"))); + PrintWriter out = new PrintWriter( + new BufferedWriter(new FileWriter(file))) + ) { int lineCount = 1; String s; while((s = in.readLine()) != null ) diff --git a/iostreams/BufferedInputFile.java b/iostreams/BufferedInputFile.java index 5b9f5f0e3..4e3871ee1 100644 --- a/iostreams/BufferedInputFile.java +++ b/iostreams/BufferedInputFile.java @@ -8,8 +8,10 @@ public class BufferedInputFile { public static String read(String filename) throws IOException { - try(BufferedReader in = new BufferedReader( - new FileReader(filename))) { + try( + BufferedReader in = new BufferedReader( + new FileReader(filename)) + ) { String s; StringBuilder sb = new StringBuilder(); while((s = in.readLine())!= null) diff --git a/iostreams/FileOutputShortcut.java b/iostreams/FileOutputShortcut.java index b1f6c2c95..de0a30488 100644 --- a/iostreams/FileOutputShortcut.java +++ b/iostreams/FileOutputShortcut.java @@ -9,11 +9,13 @@ public class FileOutputShortcut { static String file = "FileOutputShortcut.dat"; public static void main(String[] args) throws IOException { - try(BufferedReader in = new BufferedReader( - new StringReader(BufferedInputFile.read( - "FileOutputShortcut.java"))); - // Here's the shortcut: - PrintWriter out = new PrintWriter(file)) { + try( + BufferedReader in = new BufferedReader( + new StringReader(BufferedInputFile.read( + "FileOutputShortcut.java"))); + // Here's the shortcut: + PrintWriter out = new PrintWriter(file) + ) { int lineCount = 1; String s; while((s = in.readLine()) != null ) diff --git a/iostreams/FormattedMemoryInput.java b/iostreams/FormattedMemoryInput.java index c61453acd..73a511fc4 100644 --- a/iostreams/FormattedMemoryInput.java +++ b/iostreams/FormattedMemoryInput.java @@ -8,11 +8,13 @@ public class FormattedMemoryInput { public static void main(String[] args) throws IOException { - try(DataInputStream in = new DataInputStream( - new ByteArrayInputStream( - BufferedInputFile.read( - "FormattedMemoryInput.java") - .getBytes()))) { + try( + DataInputStream in = new DataInputStream( + new ByteArrayInputStream( + BufferedInputFile.read( + "FormattedMemoryInput.java") + .getBytes())) + ) { while(true) System.out.write((char)in.readByte()); } catch(EOFException e) { diff --git a/iostreams/StoringAndRecoveringData.java b/iostreams/StoringAndRecoveringData.java index b5a000965..8e0800627 100644 --- a/iostreams/StoringAndRecoveringData.java +++ b/iostreams/StoringAndRecoveringData.java @@ -7,17 +7,21 @@ public class StoringAndRecoveringData { public static void main(String[] args) throws IOException { - try(DataOutputStream out = new DataOutputStream( - new BufferedOutputStream( - new FileOutputStream("Data.txt")))) { + try( + DataOutputStream out = new DataOutputStream( + new BufferedOutputStream( + new FileOutputStream("Data.txt"))) + ) { out.writeDouble(3.14159); out.writeUTF("That was pi"); out.writeDouble(1.41413); out.writeUTF("Square root of 2"); } - try(DataInputStream in = new DataInputStream( - new BufferedInputStream( - new FileInputStream("Data.txt")))) { + try( + DataInputStream in = new DataInputStream( + new BufferedInputStream( + new FileInputStream("Data.txt"))) + ) { System.out.println(in.readDouble()); // Only readUTF() will recover the // Java-UTF String properly: diff --git a/iostreams/TestEOF.java b/iostreams/TestEOF.java index aa1df1e6c..ea1168cd5 100644 --- a/iostreams/TestEOF.java +++ b/iostreams/TestEOF.java @@ -9,9 +9,11 @@ public class TestEOF { public static void main(String[] args) throws IOException { - try(DataInputStream in = new DataInputStream( - new BufferedInputStream( - new FileInputStream("TestEOF.java")))) { + try( + DataInputStream in = new DataInputStream( + new BufferedInputStream( + new FileInputStream("TestEOF.java"))) + ) { while(in.available() != 0) System.out.write(in.readByte()); } diff --git a/iostreams/UsingRandomAccessFile.java b/iostreams/UsingRandomAccessFile.java index d7a6e0e79..6dcdd7e26 100644 --- a/iostreams/UsingRandomAccessFile.java +++ b/iostreams/UsingRandomAccessFile.java @@ -7,8 +7,10 @@ public class UsingRandomAccessFile { static String file = "rtest.dat"; static void display() throws IOException { - try(RandomAccessFile rf = - new RandomAccessFile(file, "r")) { + try( + RandomAccessFile rf = + new RandomAccessFile(file, "r") + ) { for(int i = 0; i < 7; i++) System.out.println( "Value " + i + ": " + rf.readDouble()); @@ -17,16 +19,20 @@ static void display() throws IOException { } public static void main(String[] args) throws IOException { - try(RandomAccessFile rf = - new RandomAccessFile(file, "rw")) { + try( + RandomAccessFile rf = + new RandomAccessFile(file, "rw") + ) { for(int i = 0; i < 7; i++) rf.writeDouble(i*1.414); rf.writeUTF("The end of the file"); rf.close(); display(); } - try(RandomAccessFile rf = - new RandomAccessFile(file, "rw")) { + try( + RandomAccessFile rf = + new RandomAccessFile(file, "rw") + ) { rf.seek(5*8); rf.writeDouble(47.0001); rf.close(); diff --git a/network/ChatterClient.java b/network/ChatterClient.java index 964adba33..403361548 100644 --- a/network/ChatterClient.java +++ b/network/ChatterClient.java @@ -2,31 +2,22 @@ // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. -// {ValidateByHand} -// Tests the ChatterServer by starting multiple -// clients, each of which sends datagrams. +// Starts multiple clients, each of which sends datagrams. package network; import java.net.*; import java.io.*; -import onjava.*; -public class ChatterClient extends Thread { +public class ChatterClient implements Runnable { private InetAddress hostAddress; private byte[] buf = new byte[1000]; private DatagramPacket dp = new DatagramPacket(buf, buf.length); - private int id; + private static int counter = 0; + private int id = counter++; - public ChatterClient(int identifier) { - id = identifier; - try { - hostAddress = - InetAddress.getByName("localhost"); - } catch(UnknownHostException e) { - System.err.println("Cannot find host"); - System.exit(1); - } - System.out.println("ChatterClient starting"); + public ChatterClient(InetAddress hostAddress) { + this.hostAddress = hostAddress; + System.out.println("ChatterClient #" + id + " starting"); } public void sendAndEcho(String msg) { try ( @@ -45,21 +36,13 @@ public void sendAndEcho(String msg) { dp.getPort() + ": " + Dgram.toString(dp); System.out.println(rcvd); - } catch(SocketException e) { - System.err.println("Can't open socket"); - throw new RuntimeException(e); } catch(IOException e) { throw new RuntimeException(e); } } @Override public void run() { - for(int i = 0; i <= 25; i++) + for(int i = 0; i <= 5; i++) sendAndEcho("Client #" + id + ", message #" + i); } - public static void main(String[] args) { - new TimedAbort(5); // Terminate after 5 seconds - for(int i = 0; i <= 10; i++) - new ChatterClient(i).start(); - } } diff --git a/network/ChatterServer.java b/network/ChatterServer.java index 669f45dc8..72974cf6c 100644 --- a/network/ChatterServer.java +++ b/network/ChatterServer.java @@ -2,20 +2,18 @@ // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. -// {ValidateByHand} // A server that echoes datagrams package network; import java.net.*; import java.io.*; -import onjava.*; -public class ChatterServer { +public class ChatterServer implements Runnable { static final int INPORT = 1711; private byte[] buf = new byte[1000]; private DatagramPacket dp = new DatagramPacket(buf, buf.length); - public ChatterServer() { + public void run() { // Can listen & send on the same socket: try ( DatagramSocket socket = new DatagramSocket(INPORT) @@ -38,13 +36,6 @@ public ChatterServer() { dp.getAddress(), dp.getPort()); socket.send(echo); } - } catch(IOException e) { - System.out.println("Communication error"); - throw new RuntimeException(e); - } - } - public static void main(String[] args) { - new TimedAbort(5); // Terminate after 5 seconds - new ChatterServer(); + } catch(IOException e) { throw new RuntimeException(e); } } } diff --git a/network/MultiSimpleServer.java b/network/MultiServer.java similarity index 50% rename from network/MultiSimpleServer.java rename to network/MultiServer.java index c8b891cc7..e13756e27 100644 --- a/network/MultiSimpleServer.java +++ b/network/MultiServer.java @@ -1,18 +1,18 @@ -// network/MultiSimpleServer.java +// network/MultiServer.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. // Uses threads to handle any number of clients. -// {ValidateByHand} package network; import java.io.*; import java.net.*; -import onjava.*; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; -class ServeOneSimple implements Runnable { +class ServeOne implements Runnable { private ServerSocket ss; - public - ServeOneSimple(ServerSocket ss) throws IOException { + static final int PORT = 8080; + public ServeOne(ServerSocket ss) throws IOException { this.ss = ss; } @Override @@ -27,33 +27,34 @@ public void run() { new PrintWriter( new BufferedWriter( new OutputStreamWriter( - // Enable auto-flush: + // Boolean enables auto-flush socket.getOutputStream())), true) ) { - while (true) { - String str = in.readLine(); - if(str.equals("END")) break; - System.out.println("Echoing: " + str); - out.println(str); - } - System.out.println("closing socket..."); + in.lines().anyMatch(message -> { + if (message.equals("END")) { + System.out.println("Received END. Closing Socket."); + return true; + } + System.out.println("Message : " + message); + out.println(message); + return false; + }); } catch (IOException e) { throw new RuntimeException(e); } } } -public class MultiSimpleServer { - static final int PORT = 8080; - public static void - main(String[] args) throws IOException { - new TimedAbort(5); // Terminate after 5 seconds - System.out.println("Server Started"); - try (ServerSocket ss = new ServerSocket(PORT)){ - // Block until a connection occurs: - while(true) { - new ServeOneSimple(ss); +public class MultiServer implements Runnable { + private ExecutorService pool; + public void run() { + pool = Executors.newFixedThreadPool(30); + try (ServerSocket ss = new ServerSocket(ServeOne.PORT)) { + while (true) { + pool.submit(new ServeOne(ss)); } + } catch (IOException e) { + throw new RuntimeException(e); } } } diff --git a/network/SimpleClient.java b/network/SimpleClient.java index f943a6e09..601d6646b 100644 --- a/network/SimpleClient.java +++ b/network/SimpleClient.java @@ -4,22 +4,19 @@ // Visit http://mindviewinc.com/Books/OnJava/ for more book information. // Sends lines to the server and // reads lines the server sends. -// {ValidateByHand} package network; import java.net.*; import java.io.*; -public class SimpleClient { - public static void - main(String[] args) throws IOException { - // Produce the "Local Loopback" IP address - // for testing on one machine w/o a network: - InetAddress addr = - InetAddress.getLoopbackAddress(); - System.out.println("addr = " + addr); - // TWR will sure that the socket is closed: +public class SimpleClient implements Runnable { + private InetAddress hostAddress; + public SimpleClient(InetAddress hostAddress) { + this.hostAddress = hostAddress; + } + public void run() { + System.out.println("hostAddress = " + hostAddress); try ( - Socket socket = new Socket(addr, SimpleServer.PORT); + Socket socket = new Socket(hostAddress, SimpleServer.PORT); BufferedReader in = new BufferedReader( new InputStreamReader( @@ -35,9 +32,11 @@ public class SimpleClient { for(int i = 0; i < 10; i ++) { out.println("hello " + i); String str = in.readLine(); - System.out.println(str); + System.out.println("client Message : " + str); } out.println("END"); + } catch (IOException e) { + throw new RuntimeException(e); } } } diff --git a/network/MultiSimpleClient.java b/network/SimpleClient2.java similarity index 64% rename from network/MultiSimpleClient.java rename to network/SimpleClient2.java index 2c0be6303..0f6e0f79a 100644 --- a/network/MultiSimpleClient.java +++ b/network/SimpleClient2.java @@ -1,15 +1,12 @@ -// network/MultiSimpleClient.java +// network/SimpleClient2.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. -// Testing MultiSimpleServer with multiple clients. -// {ValidateByHand} package network; import java.net.*; import java.io.*; -import onjava.*; -class SimpleClientThread implements Runnable { +public class SimpleClient2 implements Runnable { private InetAddress address; private static int counter = 0; private int id = counter++; @@ -17,7 +14,7 @@ class SimpleClientThread implements Runnable { public static int threadCount() { return threadcount; } - public SimpleClientThread(InetAddress address) { + public SimpleClient2(InetAddress address) { System.out.println("Making client " + id); this.address = address; threadcount++; @@ -26,7 +23,7 @@ public SimpleClientThread(InetAddress address) { public void run() { try ( Socket socket = - new Socket(address, MultiSimpleServer.PORT); + new Socket(address, ServeOne.PORT); BufferedReader in = new BufferedReader( new InputStreamReader( @@ -51,18 +48,3 @@ public void run() { } } } - -public class MultiSimpleClient { - static final int MAX_THREADS = 40; - public static void - main(String[] args) throws IOException, - InterruptedException { - new TimedAbort(5); // Terminate after 5 seconds - InetAddress address = InetAddress.getByName(null); - while(true) { - if(SimpleClientThread.threadCount() < MAX_THREADS) - new SimpleClientThread(address); - Thread.sleep(100); - } - } -} diff --git a/network/SimpleServer.java b/network/SimpleServer.java index a325d8b99..719aed7f0 100644 --- a/network/SimpleServer.java +++ b/network/SimpleServer.java @@ -3,24 +3,23 @@ // We make no guarantees that this code is fit for any purpose. // Visit http://mindviewinc.com/Books/OnJava/ for more book information. // Echoes what the client sends. -// {ValidateByHand} package network; import java.io.*; import java.net.*; -public class SimpleServer { +public class SimpleServer implements Runnable { // Choose a port outside of the range 1-1024: public static final int PORT = 8080; - public static void - main(String[] args) throws IOException { + + public void run() { try ( ServerSocket s = new ServerSocket(PORT); // Blocks until a connection occurs: Socket socket = s.accept(); BufferedReader in = - new BufferedReader( - new InputStreamReader( - socket.getInputStream())); + new BufferedReader( + new InputStreamReader( + socket.getInputStream())); PrintWriter out = new PrintWriter( new BufferedWriter( @@ -29,12 +28,17 @@ public class SimpleServer { socket.getOutputStream())), true) ) { System.out.println("Connection: " + socket); - while (true) { - String str = in.readLine(); - if(str.equals("END")) break; - System.out.println("Echoing: " + str); - out.println(str); - } + in.lines().anyMatch(message->{ + if (message.equals("END")) { + System.out.println("Received END. Closing Socket."); + return true; + } + System.out.println("Server Response: " + message); + out.println(message); + return false; + }); + } catch (IOException e) { + throw new RuntimeException(e); } } } diff --git a/network/tests/ChatterTest.java b/network/tests/ChatterTest.java new file mode 100644 index 000000000..1175b5935 --- /dev/null +++ b/network/tests/ChatterTest.java @@ -0,0 +1,21 @@ +// network/tests/ChatterTest.java +// (c)2016 MindView LLC: see Copyright.txt +// We make no guarantees that this code is fit for any purpose. +// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +package network; +import java.net.*; +import org.junit.jupiter.api.*; + +public class ChatterTest { + @BeforeAll + static void startMsg() { + System.out.println(">>> ChatterTest"); + } + @Test + void chatterTest() throws Exception { + // <* These need to be handed to an executor: *> + new ChatterServer(); + new ChatterClient(InetAddress.getLocalHost()); + // No exceptions means success + } +} diff --git a/network/tests/MultiTest.java b/network/tests/MultiTest.java new file mode 100644 index 000000000..175e6fb4d --- /dev/null +++ b/network/tests/MultiTest.java @@ -0,0 +1,26 @@ +// network/tests/MultiTest.java +// (c)2016 MindView LLC: see Copyright.txt +// We make no guarantees that this code is fit for any purpose. +// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +package network; +import java.net.*; +import org.junit.jupiter.api.*; + +public class MultiTest { + @BeforeAll + static void startMsg() { + System.out.println(">>> MultiClientTest"); + } + @Test + void multiTest() throws Exception { + final int MAX_THREADS = 40; + new MultiServer(); + InetAddress address = InetAddress.getByName(null); + while(true) { + if(SimpleClient2.threadCount() < MAX_THREADS) + new SimpleClient2(address); + Thread.sleep(100); + } + // No exceptions mean success + } +} diff --git a/network/tests/SimpleTcpTests.java b/network/tests/SimpleTcpTests.java deleted file mode 100644 index 3113f0e07..000000000 --- a/network/tests/SimpleTcpTests.java +++ /dev/null @@ -1,45 +0,0 @@ -// network/tests/SimpleTcpTests.java -// (c)2016 MindView LLC: see Copyright.txt -// We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. -package network; -import java.util.*; -import java.util.stream.*; -import org.junit.jupiter.api.*; -import static org.junit.jupiter.api.Assertions.*; -import onjava.*; - -public class SimpleTcpTests { - - @BeforeAll - static void startMsg() { - System.out.println(">>> Network Tests <<<"); - } - - @BeforeEach - void setupServer () { } - - @Test - void basicTest() throws Exception { - SimpleServer server = new SimpleServer(); - SimpleClient client = new SimpleClient(); - client.main(null); - assertTrue(false); // Fail until there are good assertions in the test - } - - @Test - void multiTest() throws Exception { - MultiSimpleClient client = new MultiSimpleClient(); - MultiSimpleServer server = new MultiSimpleServer(); - client.main(null); - assertTrue(false); // Fail until there are good assertions in the test - } - - @Test - void chatterTest() throws Exception { - ChatterServer server = new ChatterServer(); - ChatterClient.main(null); - assertTrue(false); // Fail until there are good assertions in the test - } - -} diff --git a/network/tests/TestSimpleServerClient.java b/network/tests/TestSimpleServerClient.java new file mode 100644 index 000000000..33c79f45c --- /dev/null +++ b/network/tests/TestSimpleServerClient.java @@ -0,0 +1,20 @@ +// network/tests/TestSimpleServerClient.java +// (c)2016 MindView LLC: see Copyright.txt +// We make no guarantees that this code is fit for any purpose. +// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +package network; +import java.net.*; +import org.junit.jupiter.api.*; + +public class TestSimpleServerClient { + @BeforeAll + static void startMsg() { + System.out.println(">>> TestSimpleServerClient"); + } + @Test + void basicTest() throws Exception { + SimpleServer server = new SimpleServer(); + SimpleClient client = new SimpleClient(InetAddress.getLocalHost()); + // Success if no exceptions happen + } +} diff --git a/newio/BufferToText.java b/newio/BufferToText.java index b0184bc34..c5bc163e1 100644 --- a/newio/BufferToText.java +++ b/newio/BufferToText.java @@ -12,13 +12,17 @@ public class BufferToText { private static final int BSIZE = 1024; public static void main(String[] args) throws Exception { - try(FileChannel fc = new FileOutputStream( - "data2.txt").getChannel()) { + try( + FileChannel fc = new FileOutputStream( + "data2.txt").getChannel() + ) { fc.write(ByteBuffer.wrap("Some text".getBytes())); } ByteBuffer buff = ByteBuffer.allocate(BSIZE); - try(FileChannel fc = new FileInputStream( - "data2.txt").getChannel()) { + try( + FileChannel fc = new FileInputStream( + "data2.txt").getChannel() + ) { fc.read(buff); } buff.flip(); @@ -30,15 +34,19 @@ public class BufferToText { System.out.println("Decoded using " + encoding + ": " + Charset.forName(encoding).decode(buff)); // Or, we could encode with something that prints: - try(FileChannel fc = new FileOutputStream( - "data2.txt").getChannel()) { + try( + FileChannel fc = new FileOutputStream( + "data2.txt").getChannel() + ) { fc.write(ByteBuffer.wrap( "Some text".getBytes("UTF-16BE"))); } // Now try reading again: buff.clear(); - try(FileChannel fc = new FileInputStream( - "data2.txt").getChannel()) { + try( + FileChannel fc = new FileInputStream( + "data2.txt").getChannel() + ) { fc.read(buff); } buff.flip(); @@ -46,14 +54,18 @@ public class BufferToText { // Use a CharBuffer to write through: buff = ByteBuffer.allocate(24); // More than needed buff.asCharBuffer().put("Some text"); - try(FileChannel fc = new FileOutputStream( - "data2.txt").getChannel()) { + try( + FileChannel fc = new FileOutputStream( + "data2.txt").getChannel() + ) { fc.write(buff); } // Read and display: buff.clear(); - try(FileChannel fc = new FileInputStream( - "data2.txt").getChannel()) { + try( + FileChannel fc = new FileInputStream( + "data2.txt").getChannel() + ) { fc.read(buff); } buff.flip(); diff --git a/newio/ChannelCopy.java b/newio/ChannelCopy.java index 062633460..c3747482c 100644 --- a/newio/ChannelCopy.java +++ b/newio/ChannelCopy.java @@ -17,10 +17,12 @@ public class ChannelCopy { "arguments: sourcefile destfile"); System.exit(1); } - try(FileChannel in = new FileInputStream( - args[0]).getChannel(); - FileChannel out = new FileOutputStream( - args[1]).getChannel()) { + try( + FileChannel in = new FileInputStream( + args[0]).getChannel(); + FileChannel out = new FileOutputStream( + args[1]).getChannel() + ) { ByteBuffer buffer = ByteBuffer.allocate(BSIZE); while(in.read(buffer) != -1) { buffer.flip(); // Prepare for writing diff --git a/newio/FileLocking.java b/newio/FileLocking.java index 0cfd1cd5e..68e044d6f 100644 --- a/newio/FileLocking.java +++ b/newio/FileLocking.java @@ -9,9 +9,11 @@ public class FileLocking { public static void main(String[] args) throws Exception { - try(FileOutputStream fos = - new FileOutputStream("file.txt"); - FileLock fl = fos.getChannel().tryLock()) { + try( + FileOutputStream fos = + new FileOutputStream("file.txt"); + FileLock fl = fos.getChannel().tryLock() + ) { if(fl != null) { System.out.println("Locked File"); TimeUnit.MILLISECONDS.sleep(100); diff --git a/newio/LargeMappedFiles.java b/newio/LargeMappedFiles.java index 2b9e9ad2e..ff8455390 100644 --- a/newio/LargeMappedFiles.java +++ b/newio/LargeMappedFiles.java @@ -11,8 +11,10 @@ public class LargeMappedFiles { static int length = 0x8000000; // 128 MB public static void main(String[] args) throws Exception { - try(RandomAccessFile tdat = - new RandomAccessFile("test.dat", "rw")) { + try( + RandomAccessFile tdat = + new RandomAccessFile("test.dat", "rw") + ) { MappedByteBuffer out = tdat.getChannel() .map(FileChannel.MapMode.READ_WRITE, 0, length); for(int i = 0; i < length; i++) diff --git a/newio/TransferTo.java b/newio/TransferTo.java index 723acaab5..b2b883f07 100644 --- a/newio/TransferTo.java +++ b/newio/TransferTo.java @@ -15,10 +15,12 @@ public class TransferTo { "arguments: sourcefile destfile"); System.exit(1); } - try(FileChannel in = new FileInputStream( - args[0]).getChannel(); - FileChannel out = new FileOutputStream( - args[1]).getChannel()) { + try( + FileChannel in = new FileInputStream( + args[0]).getChannel(); + FileChannel out = new FileOutputStream( + args[1]).getChannel() + ) { in.transferTo(0, in.size(), out); // Or: // out.transferFrom(in, 0, in.size()); diff --git a/onjava/OSExecute.java b/onjava/OSExecute.java index 5ba9195b7..6c9a59549 100644 --- a/onjava/OSExecute.java +++ b/onjava/OSExecute.java @@ -13,11 +13,13 @@ public static void command(String command) { try { Process process = new ProcessBuilder(command.split(" ")).start(); - try(BufferedReader results = new BufferedReader( - new InputStreamReader(process.getInputStream())); - BufferedReader errors = new BufferedReader( - new InputStreamReader( - process.getErrorStream()))) { + try( + BufferedReader results = new BufferedReader( + new InputStreamReader(process.getInputStream())); + BufferedReader errors = new BufferedReader( + new InputStreamReader( + process.getErrorStream())) + ) { String s; while((s = results.readLine())!= null) System.out.println(s); diff --git a/references/Compete.java b/references/Compete.java index a2ffe5051..6adfba592 100644 --- a/references/Compete.java +++ b/references/Compete.java @@ -47,18 +47,22 @@ public class Compete { for(int i = 0; i < SIZE; i++) b[i] = new Thing4(); long t1 = System.currentTimeMillis(); - try(ByteArrayOutputStream buf = - new ByteArrayOutputStream(); - ObjectOutputStream oos = - new ObjectOutputStream(buf)) { + try( + ByteArrayOutputStream buf = + new ByteArrayOutputStream(); + ObjectOutputStream oos = + new ObjectOutputStream(buf) + ) { for(Thing2 a1 : a) { oos.writeObject(a1); } // Now get copies: - try(ObjectInputStream in = - new ObjectInputStream( - new ByteArrayInputStream( - buf.toByteArray()))) { + try( + ObjectInputStream in = + new ObjectInputStream( + new ByteArrayInputStream( + buf.toByteArray())) + ) { Thing2[] c = new Thing2[SIZE]; for(int i = 0; i < SIZE; i++) c[i] = (Thing2)in.readObject(); diff --git a/serialization/AStoreCADState.java b/serialization/AStoreCADState.java index b0c207327..395bfd009 100644 --- a/serialization/AStoreCADState.java +++ b/serialization/AStoreCADState.java @@ -87,9 +87,11 @@ public class AStoreCADState { for(int i = 0; i < 10; i++) ((Shape)shapes.get(i)).setColor(Shape.GREEN); // Save the state vector: - try(ObjectOutputStream out = - new ObjectOutputStream( - new FileOutputStream("CADState.dat"))) { + try( + ObjectOutputStream out = + new ObjectOutputStream( + new FileOutputStream("CADState.dat")) + ) { out.writeObject(shapeTypes); Line.serializeStaticState(out); out.writeObject(shapes); diff --git a/serialization/Blip3.java b/serialization/Blip3.java index 7e13b58b8..518cbaa27 100644 --- a/serialization/Blip3.java +++ b/serialization/Blip3.java @@ -42,15 +42,19 @@ public void readExternal(ObjectInput in) System.out.println("Constructing objects:"); Blip3 b3 = new Blip3("A String ", 47); System.out.println(b3); - try(ObjectOutputStream o = new ObjectOutputStream( - new FileOutputStream("Blip3.serialized"))) { + try( + ObjectOutputStream o = new ObjectOutputStream( + new FileOutputStream("Blip3.serialized")) + ) { System.out.println("Saving object:"); o.writeObject(b3); } // Now get it back: System.out.println("Recovering b3:"); - try(ObjectInputStream in = new ObjectInputStream( - new FileInputStream("Blip3.serialized"))) { + try( + ObjectInputStream in = new ObjectInputStream( + new FileInputStream("Blip3.serialized")) + ) { b3 = (Blip3)in.readObject(); } System.out.println(b3); diff --git a/serialization/Blips.java b/serialization/Blips.java index 4e81ca34d..db59af9f2 100644 --- a/serialization/Blips.java +++ b/serialization/Blips.java @@ -44,16 +44,20 @@ public class Blips { System.out.println("Constructing objects:"); Blip1 b1 = new Blip1(); Blip2 b2 = new Blip2(); - try(ObjectOutputStream o = new ObjectOutputStream( - new FileOutputStream("Blips.serialized"))) { + try( + ObjectOutputStream o = new ObjectOutputStream( + new FileOutputStream("Blips.serialized")) + ) { System.out.println("Saving objects:"); o.writeObject(b1); o.writeObject(b2); } // Now get them back: System.out.println("Recovering b1:"); - try(ObjectInputStream in = new ObjectInputStream( - new FileInputStream("Blips.serialized"))) { + try( + ObjectInputStream in = new ObjectInputStream( + new FileInputStream("Blips.serialized")) + ) { b1 = (Blip1)in.readObject(); } // OOPS! Throws an exception: diff --git a/serialization/Logon.java b/serialization/Logon.java index 71f3840e9..3071bb9f2 100644 --- a/serialization/Logon.java +++ b/serialization/Logon.java @@ -24,14 +24,18 @@ public String toString() { main(String[] args) throws Exception { Logon a = new Logon("Hulk", "myLittlePony"); System.out.println("logon a = " + a); - try(ObjectOutputStream o = new ObjectOutputStream( - new FileOutputStream("Logon.dat"))) { + try( + ObjectOutputStream o = new ObjectOutputStream( + new FileOutputStream("Logon.dat")) + ) { o.writeObject(a); } TimeUnit.SECONDS.sleep(1); // Delay // Now get them back: - try(ObjectInputStream in = new ObjectInputStream( - new FileInputStream("Logon.dat"))) { + try( + ObjectInputStream in = new ObjectInputStream( + new FileInputStream("Logon.dat")) + ) { System.out.println( "Recovering object at " + new Date()); a = (Logon)in.readObject(); diff --git a/serialization/MyWorld.java b/serialization/MyWorld.java index f5e601703..9d12a1e81 100644 --- a/serialization/MyWorld.java +++ b/serialization/MyWorld.java @@ -31,27 +31,33 @@ public class MyWorld { animals.add(new Animal("Ralph the hamster", house)); animals.add(new Animal("Molly the cat", house)); System.out.println("animals: " + animals); - try(ByteArrayOutputStream buf1 = - new ByteArrayOutputStream(); - ObjectOutputStream o1 = - new ObjectOutputStream(buf1)) { + try( + ByteArrayOutputStream buf1 = + new ByteArrayOutputStream(); + ObjectOutputStream o1 = + new ObjectOutputStream(buf1) + ) { o1.writeObject(animals); o1.writeObject(animals); // Write a 2nd set // Write to a different stream: - try(ByteArrayOutputStream buf2 = - new ByteArrayOutputStream(); - ObjectOutputStream o2 = - new ObjectOutputStream(buf2)) { + try( + ByteArrayOutputStream buf2 = + new ByteArrayOutputStream(); + ObjectOutputStream o2 = + new ObjectOutputStream(buf2) + ) { o2.writeObject(animals); // Now get them back: - try(ObjectInputStream in1 = - new ObjectInputStream( - new ByteArrayInputStream( - buf1.toByteArray())); - ObjectInputStream in2 = - new ObjectInputStream( - new ByteArrayInputStream( - buf2.toByteArray()))) { + try( + ObjectInputStream in1 = + new ObjectInputStream( + new ByteArrayInputStream( + buf1.toByteArray())); + ObjectInputStream in2 = + new ObjectInputStream( + new ByteArrayInputStream( + buf2.toByteArray())) + ) { List animals1 = (List)in1.readObject(), animals2 = (List)in1.readObject(), diff --git a/serialization/RecoverCADState.java b/serialization/RecoverCADState.java index 10bda437d..d7c43a8ab 100644 --- a/serialization/RecoverCADState.java +++ b/serialization/RecoverCADState.java @@ -11,9 +11,11 @@ public class RecoverCADState { @SuppressWarnings("unchecked") public static void main(String[] args) throws Exception { - try(ObjectInputStream in = - new ObjectInputStream( - new FileInputStream("CADState.dat"))) { + try( + ObjectInputStream in = + new ObjectInputStream( + new FileInputStream("CADState.dat")) + ) { // Read in the same order they were written: List> shapeTypes = (List>)in.readObject(); diff --git a/serialization/Worm.java b/serialization/Worm.java index e384494bd..ebe0a3fe6 100644 --- a/serialization/Worm.java +++ b/serialization/Worm.java @@ -51,27 +51,35 @@ public String toString() { IOException { Worm w = new Worm(6, 'a'); System.out.println("w = " + w); - try(ObjectOutputStream out = new ObjectOutputStream( - new FileOutputStream("worm.dat"))) { + try( + ObjectOutputStream out = new ObjectOutputStream( + new FileOutputStream("worm.dat")) + ) { out.writeObject("Worm storage\n"); out.writeObject(w); } - try(ObjectInputStream in = new ObjectInputStream( - new FileInputStream("worm.dat"))) { + try( + ObjectInputStream in = new ObjectInputStream( + new FileInputStream("worm.dat")) + ) { String s = (String)in.readObject(); Worm w2 = (Worm)in.readObject(); System.out.println(s + "w2 = " + w2); } - try(ByteArrayOutputStream bout = - new ByteArrayOutputStream(); - ObjectOutputStream out2 = - new ObjectOutputStream(bout)) { + try( + ByteArrayOutputStream bout = + new ByteArrayOutputStream(); + ObjectOutputStream out2 = + new ObjectOutputStream(bout) + ) { out2.writeObject("Worm storage\n"); out2.writeObject(w); out2.flush(); - try(ObjectInputStream in2 = new ObjectInputStream( - new ByteArrayInputStream( - bout.toByteArray()))) { + try( + ObjectInputStream in2 = new ObjectInputStream( + new ByteArrayInputStream( + bout.toByteArray())) + ) { String s = (String)in2.readObject(); Worm w3 = (Worm)in2.readObject(); System.out.println(s + "w3 = " + w3); diff --git a/standardio/Redirecting.java b/standardio/Redirecting.java index 5f647bc54..b531d40f0 100644 --- a/standardio/Redirecting.java +++ b/standardio/Redirecting.java @@ -9,11 +9,13 @@ public class Redirecting { public static void main(String[] args) throws IOException { PrintStream console = System.out; - try(BufferedInputStream in = new BufferedInputStream( - new FileInputStream("Redirecting.java")); - PrintStream out = new PrintStream( - new BufferedOutputStream( - new FileOutputStream("Redirecting.txt")))) { + try( + BufferedInputStream in = new BufferedInputStream( + new FileInputStream("Redirecting.java")); + PrintStream out = new PrintStream( + new BufferedOutputStream( + new FileOutputStream("Redirecting.txt"))) + ) { System.setIn(in); System.setOut(out); System.setErr(out); diff --git a/validating/tests/CountedListTest.java b/validating/tests/CountedListTest.java index 44263c687..a1000e48d 100644 --- a/validating/tests/CountedListTest.java +++ b/validating/tests/CountedListTest.java @@ -75,3 +75,27 @@ public void addAll() { "An", "African", "Swallow" }); } } +/* Output: +>>> Starting CountedListTest +CountedList #0 +Set up for 0 +Running testRemove() +Cleaning up 0 +CountedList #1 +Set up for 1 +Running testReplace() +Cleaning up 1 +CountedList #2 +Set up for 2 +Running testAddAll() +Cleaning up 2 +CountedList #3 +Set up for 3 +Running testInsert() +Cleaning up 3 +CountedList #4 +Set up for 4 +Running testOrder() +Cleaning up 4 +>>> Finished CountedListTest +*/ From 46211235c38d260ff35af534196ac8e86ec0ffb7 Mon Sep 17 00:00:00 2001 From: Bruce Eckel Date: Fri, 23 Sep 2016 13:23:35 -0600 Subject: [PATCH 121/320] Copyright and jmh testing --- HelloDate.java | 2 +- annotations/AtUnitComposition.java | 2 +- annotations/AtUnitExample1.java | 2 +- annotations/AtUnitExample2.java | 2 +- annotations/AtUnitExample3.java | 2 +- annotations/AtUnitExample4.java | 2 +- annotations/AtUnitExample5.java | 2 +- annotations/AtUnitExternalTest.java | 2 +- annotations/HashSetTest.java | 2 +- annotations/PasswordUtils.java | 2 +- annotations/SimulatingNull.java | 2 +- annotations/StackL.java | 2 +- annotations/StackLStringTest.java | 2 +- annotations/Testable.java | 2 +- annotations/UseCase.java | 2 +- annotations/UseCaseTracker.java | 2 +- annotations/database/Constraints.java | 2 +- annotations/database/DBTable.java | 2 +- annotations/database/Member.java | 2 +- annotations/database/SQLInteger.java | 2 +- annotations/database/SQLString.java | 2 +- annotations/database/TableCreator.java | 2 +- annotations/database/Uniqueness.java | 2 +- annotations/ifx/ExtractInterface.java | 2 +- annotations/ifx/IfaceExtractorProcessor.java | 2 +- annotations/ifx/Multiplier.java | 2 +- annotations/simplest/Simple.java | 2 +- annotations/simplest/SimpleProcessor.java | 2 +- annotations/simplest/SimpleTest.java | 2 +- arrays/AlphabeticSearch.java | 2 +- arrays/ArrayCopying.java | 2 +- arrays/ArrayOfGenericType.java | 2 +- arrays/ArrayOfGenerics.java | 2 +- arrays/ArrayOptions.java | 2 +- arrays/ArraySearching.java | 2 +- arrays/AssemblingMultidimensionalArrays.java | 2 +- arrays/AutoboxingArrays.java | 2 +- arrays/CollectionComparison.java | 2 +- arrays/CompType.java | 2 +- arrays/ComparatorTest.java | 2 +- arrays/ComparingArrays.java | 2 +- arrays/CountUpward.java | 2 +- arrays/FillingArrays.java | 2 +- arrays/IceCream.java | 2 +- arrays/ModifyExisting.java | 2 +- arrays/MultiDimWrapperArray.java | 2 +- arrays/MultidimensionalObjectArrays.java | 2 +- arrays/MultidimensionalPrimitiveArray.java | 2 +- arrays/ParallelPrefix1.java | 2 +- arrays/ParallelPrefix2.java | 2 +- arrays/ParallelPrefix3.java | 2 +- arrays/ParallelSetAll.java | 2 +- arrays/ParameterizedArrayType.java | 2 +- arrays/PythonLists.py | 2 +- arrays/RaggedArray.java | 2 +- arrays/Reverse.java | 2 +- arrays/SimpleSetAll.java | 2 +- arrays/StreamFromArray.java | 2 +- arrays/StringSorting.java | 2 +- arrays/TestConvertTo.java | 2 +- arrays/TestCount.java | 2 +- arrays/TestRand.java | 2 +- arrays/ThreeDWithNew.java | 2 +- arrays/jmh/ParallelSort.java | 2 +- collections/AdapterMethodIdiom.java | 2 +- collections/AddingGroups.java | 2 +- collections/ApplesAndOrangesWithGenerics.java | 2 +- .../ApplesAndOrangesWithoutGenerics.java | 2 +- collections/ArrayIsNotIterable.java | 2 +- collections/AsListInference.java | 2 +- collections/CollectionMethods.java | 2 +- collections/CollectionSequence.java | 2 +- collections/CrossCollectionIteration.java | 2 +- collections/CrossCollectionIteration2.java | 2 +- collections/EnvironmentVariables.java | 2 +- collections/ForInCollections.java | 2 +- collections/GenericsAndUpcasting.java | 2 +- collections/InterfaceVsIterator.java | 2 +- collections/IterableClass.java | 2 +- collections/LinkedListFeatures.java | 2 +- collections/ListFeatures.java | 2 +- collections/ListIteration.java | 2 +- collections/MapOfList.java | 2 +- collections/ModifyingArraysAsList.java | 2 +- collections/MultiIterableClass.java | 2 +- collections/NonCollectionSequence.java | 2 +- collections/PetMap.java | 2 +- collections/PrintingCollections.java | 2 +- collections/PriorityQueueDemo.java | 2 +- collections/QueueDemo.java | 2 +- collections/SetOfInteger.java | 2 +- collections/SetOfString.java | 2 +- collections/SetOperations.java | 2 +- collections/SimpleCollection.java | 2 +- collections/SimpleIteration.java | 2 +- collections/SortedSetOfString.java | 2 +- collections/StackCollision.java | 2 +- collections/StackTest.java | 2 +- collections/StackTest2.java | 2 +- collections/Statistics.java | 2 +- collections/UniqueWords.java | 2 +- collections/UniqueWordsAlphabetic.java | 2 +- com/mindviewinc/simple/List.java | 2 +- com/mindviewinc/simple/Vector.java | 2 +- compression/GZIPcompress.java | 2 +- compression/ZipCompress.java | 2 +- control/BreakAndContinue.java | 2 +- control/CommaOperator.java | 2 +- control/ForInFloat.java | 2 +- control/ForInInt.java | 2 +- control/ForInString.java | 2 +- control/IfElse.java | 2 +- control/LabeledFor.java | 2 +- control/LabeledWhile.java | 2 +- control/ListCharacters.java | 2 +- control/RandomBounds.java | 2 +- control/StringSwitch.java | 2 +- control/TestWithReturn.java | 2 +- control/TrueFalse.java | 2 +- control/VowelsAndConsonants.java | 2 +- control/WhileTest.java | 2 +- enums/AlarmPoints.java | 2 +- enums/BigEnumSet.java | 2 +- enums/Burrito.java | 2 +- enums/CarWash.java | 2 +- enums/Competitor.java | 2 +- enums/ConstantSpecificMethod.java | 2 +- enums/EnumClass.java | 2 +- enums/EnumMaps.java | 2 +- enums/EnumSets.java | 2 +- enums/Input.java | 2 +- enums/NonEnum.java | 2 +- enums/NotClasses.java | 2 +- enums/Outcome.java | 2 +- enums/OverrideConstantSpecific.java | 2 +- enums/OzWitch.java | 2 +- enums/PostOffice.java | 2 +- enums/RandomTest.java | 2 +- enums/Reflection.java | 2 +- enums/RoShamBo.java | 2 +- enums/RoShamBo1.java | 2 +- enums/RoShamBo2.java | 2 +- enums/RoShamBo3.java | 2 +- enums/RoShamBo4.java | 2 +- enums/RoShamBo5.java | 2 +- enums/RoShamBo6.java | 2 +- enums/SecurityCategory.java | 2 +- enums/SpaceShip.java | 2 +- enums/Spiciness.java | 2 +- enums/TrafficLight.java | 2 +- enums/UpcastEnum.java | 2 +- enums/VendingMachine.java | 2 +- enums/cartoons/EnumImplementation.java | 2 +- enums/menu/Course.java | 2 +- enums/menu/Food.java | 2 +- enums/menu/Meal.java | 2 +- enums/menu/Meal2.java | 2 +- enums/menu/TypeOfFood.java | 2 +- exceptions/AlwaysFinally.java | 2 +- exceptions/AutoCloseableDetails.java | 2 +- exceptions/BodyException.java | 2 +- exceptions/Cleanup.java | 2 +- exceptions/CleanupIdiom.java | 2 +- exceptions/CloseExceptions.java | 2 +- exceptions/ConstructorException.java | 2 +- exceptions/DynamicFields.java | 2 +- exceptions/ExceptionMethods.java | 2 +- exceptions/ExceptionSilencer.java | 2 +- exceptions/ExtraFeatures.java | 2 +- exceptions/FinallyWorks.java | 2 +- exceptions/FullConstructors.java | 2 +- exceptions/Human.java | 2 +- exceptions/InheritingExceptions.java | 2 +- exceptions/InputFile.java | 2 +- exceptions/InputFile2.java | 2 +- exceptions/LoggingExceptions.java | 2 +- exceptions/LoggingExceptions2.java | 2 +- exceptions/LostMessage.java | 2 +- exceptions/MainException.java | 2 +- exceptions/MessyExceptions.java | 2 +- exceptions/MultiCatch.java | 2 +- exceptions/MultiCatch2.java | 2 +- exceptions/MultipleReturns.java | 2 +- exceptions/NeverCaught.java | 2 +- exceptions/OnOffException1.java | 2 +- exceptions/OnOffException2.java | 2 +- exceptions/OnOffSwitch.java | 2 +- exceptions/PreciseRethrow.java | 2 +- exceptions/RethrowNew.java | 2 +- exceptions/Rethrowing.java | 2 +- exceptions/SameHandler.java | 2 +- exceptions/StormyInning.java | 2 +- exceptions/StreamsAreAutoCloseable.java | 2 +- exceptions/Switch.java | 2 +- exceptions/TryAnything.java | 2 +- exceptions/TryWithResources.java | 2 +- exceptions/TurnOffChecking.java | 2 +- exceptions/WhoCalled.java | 2 +- exceptions/WithFinally.java | 2 +- files/AddAndSubtractPaths.java | 2 +- files/Directories.java | 2 +- files/File_System.java | 2 +- files/Find.java | 2 +- files/ListOfLines.java | 2 +- files/PartsOfPaths.java | 2 +- files/PathAnalysis.java | 2 +- files/PathInfo.java | 2 +- files/PathWatcher.java | 2 +- files/ReadLineStream.java | 2 +- files/StreamInAndOut.java | 2 +- files/TreeWatcher.java | 2 +- files/Writing.java | 2 +- functional/AnonymousClosure.java | 2 +- functional/BiConsumerPermutations.java | 2 +- functional/ClassFunctionals.java | 2 +- functional/Closure1.java | 2 +- functional/Closure2.java | 2 +- functional/Closure3.java | 2 +- functional/Closure4.java | 2 +- functional/Closure5.java | 2 +- functional/Closure6.java | 2 +- functional/Closure7.java | 2 +- functional/Closure8.java | 2 +- functional/Closure9.java | 2 +- functional/ConsumeFunction.java | 2 +- functional/CtorReference.java | 2 +- functional/CurriedIntAdd.java | 2 +- functional/Curry3Args.java | 2 +- functional/CurryingAndPartials.java | 2 +- functional/FunctionComposition.java | 2 +- functional/FunctionVariants.java | 2 +- functional/FunctionWithWrapped.java | 2 +- functional/FunctionalAnnotation.java | 2 +- functional/IntCall.java | 2 +- functional/LambdaExpressions.java | 2 +- functional/MethodConversion.java | 2 +- functional/MethodReferences.java | 2 +- functional/MultiUnbound.java | 2 +- functional/PredicateComposition.java | 2 +- functional/ProduceFunction.java | 2 +- functional/RecursiveFactorial.java | 2 +- functional/RecursiveFibonacci.java | 2 +- functional/RunnableMethodReference.java | 2 +- functional/SharedStorage.java | 2 +- functional/Strategize.java | 2 +- functional/TransformFunction.java | 2 +- functional/TriFunction.java | 2 +- functional/TriFunctionTest.java | 2 +- functional/UnboundMethodReference.java | 2 +- generics/Amphibian.java | 2 +- generics/Apply.java | 2 +- generics/ApplyFunctional.java | 2 +- generics/ApplyTest.java | 2 +- generics/ArrayMaker.java | 2 +- generics/ArrayOfGeneric.java | 2 +- generics/ArrayOfGenericReference.java | 2 +- generics/BankTeller.java | 2 +- generics/BasicBounds.java | 2 +- generics/BasicHolder.java | 2 +- generics/BasicSupplierDemo.java | 2 +- generics/ByteSet.java | 2 +- generics/CRGWithBasicHolder.java | 2 +- generics/CaptureConversion.java | 2 +- generics/CheckedList.java | 2 +- generics/ClassCasting.java | 2 +- generics/ClassTypeCapture.java | 2 +- generics/ComparablePet.java | 2 +- generics/CompilerIntelligence.java | 2 +- generics/CountedObject.java | 2 +- generics/CovariantArrays.java | 2 +- generics/CovariantReturnTypes.java | 2 +- generics/CreatorGeneric.java | 2 +- generics/CuriouslyRecurringGeneric.java | 2 +- generics/Diamond.java | 2 +- generics/DogsAndRobotMethodReferences.java | 2 +- generics/DogsAndRobots.cpp | 2 +- generics/DogsAndRobots.java | 2 +- generics/DogsAndRobots.py | 2 +- generics/DynamicProxyMixin.java | 2 +- generics/EpicBattle.java | 2 +- generics/Erased.java | 2 +- generics/ErasedTypeEquivalence.java | 2 +- generics/ErasureAndInheritance.java | 2 +- generics/FactoryConstraint.java | 2 +- generics/Fibonacci.java | 2 +- generics/FilledList.java | 2 +- generics/GenericArray.java | 2 +- generics/GenericArray2.java | 2 +- generics/GenericArrayWithTypeToken.java | 2 +- generics/GenericCast.java | 2 +- generics/GenericHolder.java | 2 +- generics/GenericHolder2.java | 2 +- generics/GenericMethods.java | 2 +- generics/GenericReading.java | 2 +- generics/GenericVarargs.java | 2 +- generics/GenericsAndCovariance.java | 2 +- generics/GenericsAndReturnTypes.java | 2 +- generics/HasF.java | 2 +- generics/HijackedInterface.java | 2 +- generics/Holder.java | 2 +- generics/Holder1.java | 2 +- generics/InheritBounds.java | 2 +- generics/InstantiateGenericType.cpp | 2 +- generics/InstantiateGenericType.java | 2 +- generics/IterableFibonacci.java | 2 +- generics/LatentReflection.java | 2 +- generics/LinkedStack.java | 2 +- generics/ListMaker.java | 2 +- generics/ListOfGenerics.java | 2 +- generics/ListOfInt.java | 2 +- generics/LostInformation.java | 2 +- generics/Manipulation.java | 2 +- generics/Manipulator2.java | 2 +- generics/Manipulator3.java | 2 +- generics/Mixins.cpp | 2 +- generics/Mixins.java | 2 +- generics/MultipleInterfaceVariants.java | 2 +- generics/NeedCasting.java | 2 +- generics/NonCovariantGenerics.java | 2 +- generics/NotSelfBounded.java | 2 +- generics/ObjectHolder.java | 2 +- generics/OrdinaryArguments.java | 2 +- generics/Performs.java | 2 +- generics/PlainGenericInheritance.java | 2 +- generics/PrimitiveGenericTest.java | 2 +- generics/RandomList.java | 2 +- generics/RestrictedComparablePets.java | 2 +- generics/ReturnGenericType.java | 2 +- generics/SelfBounding.java | 2 +- .../SelfBoundingAndCovariantArguments.java | 2 +- generics/SelfBoundingMethods.java | 2 +- generics/Shape.java | 2 +- generics/SimpleDogsAndRobots.java | 2 +- generics/SimpleHolder.java | 2 +- generics/SimpleQueue.java | 2 +- generics/Square.java | 2 +- generics/Store.java | 2 +- generics/SuperTypeWildcards.java | 2 +- generics/Templates.cpp | 2 +- generics/ThrowGenericException.java | 2 +- generics/TupleList.java | 2 +- generics/TupleTest.java | 2 +- generics/TupleTest2.java | 2 +- generics/UnboundedWildcards1.java | 2 +- generics/UnboundedWildcards2.java | 2 +- generics/Unconstrained.java | 2 +- generics/UseList.java | 2 +- generics/UseList2.java | 2 +- generics/Vehicle.java | 2 +- generics/WatercolorSets.java | 2 +- generics/Wildcards.java | 2 +- generics/coffee/Americano.java | 2 +- generics/coffee/Breve.java | 2 +- generics/coffee/Cappuccino.java | 2 +- generics/coffee/Coffee.java | 2 +- generics/coffee/CoffeeSupplier.java | 2 +- generics/coffee/Latte.java | 2 +- generics/coffee/Mocha.java | 2 +- generics/decorator/Decoration.java | 2 +- generics/dogsandrobots.go | 2 +- generics/watercolors/Watercolors.java | 2 +- hiding/Cake.java | 2 +- hiding/ChocolateChip.java | 2 +- hiding/ChocolateChip2.java | 2 +- hiding/Dinner.java | 2 +- hiding/FullQualification.java | 2 +- hiding/IceCream.java | 2 +- hiding/ImportedMyClass.java | 2 +- hiding/LibTest.java | 2 +- hiding/Lunch.java | 2 +- hiding/OrganizedByAccess.java | 2 +- hiding/Pie.java | 2 +- hiding/QualifiedMyClass.java | 2 +- hiding/SingleImport.java | 2 +- hiding/cookie2/Cookie.java | 2 +- hiding/dessert/Cookie.java | 2 +- hiding/mypackage/MyClass.java | 2 +- housekeeping/Apricot.java | 2 +- housekeeping/ArrayClassObj.java | 2 +- housekeeping/ArrayInit.java | 2 +- housekeeping/ArrayNew.java | 2 +- housekeeping/ArraysOfPrimitives.java | 2 +- housekeeping/AutoboxingVarargs.java | 2 +- housekeeping/BananaPeel.java | 2 +- housekeeping/Burrito.java | 2 +- housekeeping/Counter.java | 2 +- housekeeping/DefaultConstructor.java | 2 +- housekeeping/Demotion.java | 2 +- housekeeping/DynamicArray.java | 2 +- housekeeping/EnumOrder.java | 2 +- housekeeping/ExplicitStatic.java | 2 +- housekeeping/Flower.java | 2 +- housekeeping/InitialValues.java | 2 +- housekeeping/InitialValues2.java | 2 +- housekeeping/Leaf.java | 2 +- housekeeping/Measurement.java | 2 +- housekeeping/MethodInit.java | 2 +- housekeeping/MethodInit2.java | 2 +- housekeeping/MethodInit3.java | 2 +- housekeeping/Mugs.java | 2 +- housekeeping/NewVarArgs.java | 2 +- housekeeping/NoSynthesis.java | 2 +- housekeeping/OptionalTrailingArguments.java | 2 +- housekeeping/OrderOfInitialization.java | 2 +- housekeeping/Overloading.java | 2 +- housekeeping/OverloadingOrder.java | 2 +- housekeeping/OverloadingVarargs.java | 2 +- housekeeping/OverloadingVarargs2.java | 2 +- housekeeping/OverloadingVarargs3.java | 2 +- housekeeping/PassingThis.java | 2 +- housekeeping/PrimitiveOverloading.java | 2 +- housekeeping/SimpleConstructor.java | 2 +- housekeeping/SimpleConstructor2.java | 2 +- housekeeping/SimpleEnumUse.java | 2 +- housekeeping/Spiciness.java | 2 +- housekeeping/Spoon.java | 2 +- housekeeping/StaticInitialization.java | 2 +- housekeeping/TerminationCondition.java | 2 +- housekeeping/VarArgs.java | 2 +- housekeeping/VarargType.java | 2 +- innerclasses/AnonymousConstructor.java | 2 +- innerclasses/BigEgg.java | 2 +- innerclasses/BigEgg2.java | 2 +- innerclasses/Callbacks.java | 2 +- innerclasses/ClassInInterface.java | 2 +- innerclasses/Contents.java | 2 +- innerclasses/Destination.java | 2 +- innerclasses/DotNew.java | 2 +- innerclasses/DotThis.java | 2 +- innerclasses/GreenhouseController.java | 2 +- innerclasses/GreenhouseControls.java | 2 +- innerclasses/InheritInner.java | 2 +- innerclasses/LocalInnerClass.java | 2 +- innerclasses/MultiImplementation.java | 2 +- innerclasses/MultiNestingAccess.java | 2 +- innerclasses/Parcel1.java | 2 +- innerclasses/Parcel10.java | 2 +- innerclasses/Parcel11.java | 2 +- innerclasses/Parcel2.java | 2 +- innerclasses/Parcel3.java | 2 +- innerclasses/Parcel5.java | 2 +- innerclasses/Parcel6.java | 2 +- innerclasses/Parcel7.java | 2 +- innerclasses/Parcel7b.java | 2 +- innerclasses/Parcel8.java | 2 +- innerclasses/Parcel9.java | 2 +- innerclasses/Sequence.java | 2 +- innerclasses/TestBed.java | 2 +- innerclasses/TestParcel.java | 2 +- innerclasses/Wrapping.java | 2 +- innerclasses/controller/Controller.java | 2 +- innerclasses/controller/Event.java | 2 +- innerclasses/mui/MultiInterfaces.java | 2 +- interfaces/AbstractAccess.java | 2 +- interfaces/AbstractWithoutAbstracts.java | 2 +- interfaces/AdaptedRandomDoubles.java | 2 +- interfaces/Adventure.java | 2 +- interfaces/AnImplementation.java | 2 +- interfaces/AnInterface.java | 2 +- interfaces/Applicator.java | 2 +- interfaces/AttemptToUseBasic.java | 2 +- interfaces/Basic.java | 2 +- interfaces/Basic2.java | 2 +- interfaces/Factories.java | 2 +- interfaces/Games.java | 2 +- interfaces/HorrorShow.java | 2 +- interfaces/Implementation2.java | 2 +- interfaces/ImplementingAnInterface.java | 2 +- interfaces/Instantiable.java | 2 +- interfaces/InterfaceCollision.java | 2 +- interfaces/InterfaceWithDefault.java | 2 +- interfaces/Jim.java | 2 +- interfaces/MICollision.java | 2 +- interfaces/Machine.java | 2 +- interfaces/Months.java | 2 +- interfaces/MultipleInheritance.java | 2 +- interfaces/PureInterface.java | 2 +- interfaces/RandVals.java | 2 +- interfaces/RandomDoubles.java | 2 +- interfaces/RandomWords.java | 2 +- interfaces/TestRandVals.java | 2 +- interfaces/filters/BandPass.java | 2 +- interfaces/filters/Filter.java | 2 +- interfaces/filters/HighPass.java | 2 +- interfaces/filters/LowPass.java | 2 +- interfaces/filters/Waveform.java | 2 +- interfaces/interfaceprocessor/Applicator.java | 2 +- .../interfaceprocessor/FilterProcessor.java | 2 +- interfaces/interfaceprocessor/Processor.java | 2 +- .../interfaceprocessor/StringProcessor.java | 2 +- interfaces/music4/Music4.java | 2 +- interfaces/music5/Music5.java | 2 +- interfaces/nesting/NestingInterfaces.java | 2 +- iostreams/BasicFileOutput.java | 2 +- iostreams/BufferedInputFile.java | 2 +- iostreams/FileOutputShortcut.java | 2 +- iostreams/FormattedMemoryInput.java | 2 +- iostreams/MemoryInput.java | 2 +- iostreams/StoringAndRecoveringData.java | 2 +- iostreams/TestEOF.java | 2 +- iostreams/UsingRandomAccessFile.java | 2 +- network/ChatterClient.java | 2 +- network/ChatterServer.java | 2 +- network/Dgram.java | 2 +- network/LocalHost.java | 2 +- network/MultiServer.java | 2 +- network/SimpleClient.java | 2 +- network/SimpleClient2.java | 2 +- network/SimpleServer.java | 2 +- network/WhoAmI.java | 2 +- network/tests/ChatterTest.java | 2 +- network/tests/MultiTest.java | 2 +- network/tests/TestSimpleServerClient.java | 2 +- newio/AvailableCharSets.java | 2 +- newio/BufferToText.java | 2 +- newio/ChannelCopy.java | 2 +- newio/Endians.java | 2 +- newio/FileLocking.java | 2 +- newio/GetData.java | 2 +- newio/IntBufferDemo.java | 2 +- newio/LargeMappedFiles.java | 2 +- newio/LockingMappedFiles.java | 2 +- newio/TransferTo.java | 2 +- newio/UsingBuffers.java | 2 +- newio/ViewBuffers.java | 2 +- objects/Documentation1.java | 2 +- objects/Documentation2.java | 2 +- objects/Documentation3.java | 2 +- objects/HelloDate.java | 2 +- objects/ShowProperties.java | 2 +- onjava/ArrayShow.java | 2 +- onjava/BasicSupplier.java | 2 +- onjava/CollectionMethodDifferences.java | 2 +- onjava/ConvertTo.java | 2 +- onjava/Count.java | 2 +- onjava/CountMap.java | 2 +- onjava/CountingIntegerList.java | 2 +- onjava/Countries.java | 2 +- onjava/Enums.java | 2 +- onjava/FillMap.java | 2 +- onjava/Hex.java | 2 +- onjava/MouseClick.java | 2 +- onjava/Null.java | 2 +- onjava/OSExecute.java | 2 +- onjava/OSExecuteException.java | 2 +- onjava/Operation.java | 2 +- onjava/Pair.java | 2 +- onjava/ProcessFiles.java | 2 +- onjava/Rand.java | 2 +- onjava/Range.java | 2 +- onjava/Repeat.java | 2 +- onjava/RmDir.java | 2 +- onjava/Sets.java | 2 +- onjava/Sleep.java | 2 +- onjava/Stack.java | 2 +- onjava/Suppliers.java | 2 +- onjava/TimedAbort.java | 2 +- onjava/Tuple.java | 2 +- onjava/Tuple2.java | 2 +- onjava/Tuple3.java | 2 +- onjava/Tuple4.java | 2 +- onjava/Tuple5.java | 2 +- onjava/TypeCounter.java | 2 +- onjava/atunit/AtUnit.java | 2 +- onjava/atunit/ClassNameFinder.java | 2 +- onjava/atunit/Test.java | 2 +- onjava/atunit/TestObjectCleanup.java | 2 +- onjava/atunit/TestObjectCreate.java | 2 +- onjava/atunit/TestProperty.java | 2 +- operators/AllOps.java | 2 +- operators/Assignment.java | 2 +- operators/AutoInc.java | 2 +- operators/BitManipulation.java | 2 +- operators/Bool.java | 2 +- operators/Casting.java | 2 +- operators/CastingNumbers.java | 2 +- operators/EqualsMethod.java | 2 +- operators/EqualsMethod2.java | 2 +- operators/Equivalence.java | 2 +- operators/Exponents.java | 2 +- operators/Literals.java | 2 +- operators/MathOps.java | 2 +- operators/Overflow.java | 2 +- operators/PassObject.java | 2 +- operators/Precedence.java | 2 +- operators/RoundingNumbers.java | 2 +- operators/ShortCircuit.java | 2 +- operators/StringOperators.java | 2 +- operators/TernaryIfElse.java | 2 +- operators/URShift.java | 2 +- operators/Underscores.java | 2 +- patterns/CommandPattern.java | 2 +- patterns/Facade.java | 2 +- patterns/PaperScissorsRock.java | 2 +- patterns/ProxyDemo.java | 2 +- patterns/ShapeFactory2.java | 2 +- patterns/StateDemo.java | 2 +- patterns/TemplateMethod.java | 2 +- patterns/absfactory/GameEnvironment.java | 2 +- patterns/adapt/Adapter.java | 2 +- patterns/chain/ChainOfResponsibility.java | 2 +- patterns/doubledispatch/Aluminum.java | 2 +- patterns/doubledispatch/Cardboard.java | 2 +- patterns/doubledispatch/DoubleDispatch.java | 2 +- patterns/doubledispatch/Glass.java | 2 +- patterns/doubledispatch/Paper.java | 2 +- patterns/doubledispatch/TypedBin.java | 2 +- patterns/doubledispatch/TypedBinMember.java | 2 +- patterns/dynatrash/DynaTrash.java | 2 +- patterns/factory/ShapeFactory1.java | 2 +- patterns/observer/ObservedFlower.java | 2 +- patterns/recyclea/RecycleA.java | 2 +- patterns/recycleb/RecycleB.java | 2 +- patterns/recyclec/RecycleC.java | 2 +- patterns/state/StateMachineDemo.java | 2 +- patterns/strategy/StrategyPattern.java | 2 +- patterns/strategy/StrategyPattern2.java | 2 +- patterns/trash/Aluminum.java | 2 +- patterns/trash/Cardboard.java | 2 +- patterns/trash/Fillable.java | 2 +- patterns/trash/FillableList.java | 2 +- patterns/trash/Glass.java | 2 +- patterns/trash/Paper.java | 2 +- patterns/trash/ParseTrash.java | 2 +- patterns/trash/Trash.java | 2 +- patterns/trashvisitor/Aluminum.java | 2 +- patterns/trashvisitor/Cardboard.java | 2 +- patterns/trashvisitor/Glass.java | 2 +- patterns/trashvisitor/Paper.java | 2 +- patterns/trashvisitor/TrashVisitor.java | 2 +- patterns/trashvisitor/Visitable.java | 2 +- patterns/trashvisitor/Visitor.java | 2 +- patterns/visitor/BeeAndFlowers.java | 2 +- patterns/visualobserver/BoxObserver.java | 2 +- polymorphism/CovariantReturn.java | 2 +- polymorphism/FieldAccess.java | 2 +- polymorphism/Frog.java | 2 +- polymorphism/PolyConstructors.java | 2 +- polymorphism/PrivateOverride.java | 2 +- polymorphism/PrivateOverride2.java | 2 +- polymorphism/RTTI.java | 2 +- polymorphism/ReferenceCounting.java | 2 +- polymorphism/Sandwich.java | 2 +- polymorphism/Shapes.java | 2 +- polymorphism/StaticPolymorphism.java | 2 +- polymorphism/Transmogrify.java | 2 +- polymorphism/music/Instrument.java | 2 +- polymorphism/music/Music.java | 2 +- polymorphism/music/Music2.java | 2 +- polymorphism/music/Note.java | 2 +- polymorphism/music/Wind.java | 2 +- polymorphism/music3/Music3.java | 2 +- polymorphism/shape/Circle.java | 2 +- polymorphism/shape/RandomShapes.java | 2 +- polymorphism/shape/Shape.java | 2 +- polymorphism/shape/Square.java | 2 +- polymorphism/shape/Triangle.java | 2 +- preferences/PreferencesDemo.java | 2 +- references/AddingClone.java | 2 +- references/Alias1.java | 2 +- references/Alias2.java | 2 +- references/CheckCloneable.java | 2 +- references/CloneArrayList.java | 2 +- references/Compete.java | 2 +- references/CopyConstructor.java | 2 +- references/DepthReading.java | 2 +- references/HorrorFlick.java | 2 +- references/Immutable1.java | 2 +- references/Immutable2.java | 2 +- references/ImmutableInteger.java | 2 +- references/ImmutableStrings.java | 2 +- references/MutableInteger.java | 2 +- references/OceanReading.java | 2 +- references/PassReferences.java | 2 +- references/SimplerMutableInteger.java | 2 +- references/Snake.java | 2 +- references/Stringer.java | 2 +- references/TemperatureReading.java | 2 +- references/tests/DeepCopyTest.java | 2 +- remote/DisplayPerfectTime.java | 3 +- remote/PerfectTime.java | 3 +- remote/PerfectTimeImpl.java | 3 +- remote/PerfectTimeServer.java | 3 +- reuse/Bath.java | 2 +- reuse/Beetle.java | 2 +- reuse/BlankFinal.java | 2 +- reuse/CADSystem.java | 2 +- reuse/Car.java | 2 +- reuse/Cartoon.java | 2 +- reuse/Chess.java | 2 +- reuse/Detergent.java | 2 +- reuse/FinalArguments.java | 2 +- reuse/FinalData.java | 2 +- reuse/FinalOverridingIllusion.java | 2 +- reuse/Hide.java | 2 +- reuse/Jurassic.java | 2 +- reuse/Lisa.java | 2 +- reuse/Orc.java | 2 +- reuse/PlaceSetting.java | 2 +- reuse/SpaceShip.java | 2 +- reuse/SpaceShipControls.java | 2 +- reuse/SpaceShipDelegation.java | 2 +- reuse/SprinklerSystem.java | 2 +- reuse/Wind.java | 2 +- serialization/APerson.java | 2 +- serialization/AStoreCADState.java | 2 +- serialization/Alien.java | 2 +- serialization/Blip3.java | 2 +- serialization/Blips.java | 2 +- serialization/FreezeAlien.java | 2 +- serialization/Logon.java | 2 +- serialization/MyWorld.java | 2 +- serialization/People.java | 2 +- serialization/RecoverCADState.java | 2 +- serialization/SerialCtl.java | 2 +- serialization/Worm.java | 2 +- serialization/xfiles/ThawAlien.java | 2 +- standardio/ChangeSystemOut.java | 2 +- standardio/Echo.java | 2 +- standardio/OSExecuteDemo.java | 2 +- standardio/Redirecting.java | 2 +- staticchecking/DogsAndRobots.cpp | 2 +- staticchecking/DogsAndRobots.py | 2 +- staticchecking/NoBasePetSpeak.py | 2 +- staticchecking/PetSpeak.py | 2 +- staticchecking/dogsandrobots.go | 2 +- staticchecking/dr/DogsAndRobots.java | 2 +- .../drc/DogAndRobotCollections.java | 2 +- staticchecking/latent/Latent.java | 2 +- staticchecking/petspeak.go | 2 +- staticchecking/petspeak/PetSpeak.java | 2 +- streams/ArrayStreams.java | 2 +- streams/Bubble.java | 2 +- streams/Bubbles.java | 2 +- streams/CollectionToStream.java | 2 +- streams/CreatingOptionals.java | 2 +- streams/Duplicator.java | 2 +- streams/Fibonacci.java | 2 +- streams/FileToWords.java | 2 +- streams/FileToWordsBuilder.java | 2 +- streams/FileToWordsRegexp.java | 2 +- streams/FileToWordsTest.java | 2 +- streams/FlatMap.java | 2 +- streams/ForEach.java | 2 +- streams/FunctionMap.java | 2 +- streams/FunctionMap2.java | 2 +- streams/FunctionMap3.java | 2 +- streams/Generator.java | 2 +- streams/ImperativeRandoms.java | 2 +- streams/Informational.java | 2 +- streams/LastElement.java | 2 +- streams/Looping.java | 2 +- streams/Machine2.java | 2 +- streams/MapCollector.java | 2 +- streams/Matching.java | 2 +- streams/NumericStreamInfo.java | 2 +- streams/OptionalBasics.java | 2 +- streams/OptionalFilter.java | 2 +- streams/OptionalFlatMap.java | 2 +- streams/OptionalMap.java | 2 +- streams/Optionals.java | 2 +- streams/OptionalsFromEmptyStreams.java | 2 +- streams/Peeking.java | 2 +- streams/Prime.java | 2 +- streams/RandInts.java | 2 +- streams/RandomGenerators.java | 2 +- streams/RandomWords.java | 2 +- streams/Randoms.java | 2 +- streams/Ranges.java | 2 +- streams/Reduce.java | 2 +- streams/SelectElement.java | 2 +- streams/Signal.java | 2 +- streams/SortedComparator.java | 2 +- streams/SpecialCollector.java | 2 +- streams/StreamOf.java | 2 +- streams/StreamOfOptionals.java | 2 +- streams/StreamOfRandoms.java | 2 +- streams/StreamOfStreams.java | 2 +- streams/TreeSetOfWords.java | 2 +- strings/ArrayListDisplay.java | 2 +- strings/BetterRead.java | 2 +- strings/Concatenation.java | 2 +- strings/Conversion.java | 2 +- strings/DatabaseException.java | 2 +- strings/Finding.java | 2 +- strings/Groups.java | 2 +- strings/Immutable.java | 2 +- strings/InfiniteRecursion.java | 2 +- strings/IntegerMatch.java | 2 +- strings/JGrep.java | 2 +- strings/ReFlags.java | 2 +- strings/ReceiptBuilder.java | 2 +- strings/Replacing.java | 2 +- strings/ReplacingStringTokenizer.java | 2 +- strings/Resetting.java | 2 +- strings/Rudolph.java | 2 +- strings/ScannerDelimiter.java | 2 +- strings/SimpleFormat.java | 2 +- strings/SimpleRead.java | 2 +- strings/SplitDemo.java | 2 +- strings/Splitting.java | 2 +- strings/StartEnd.java | 2 +- strings/TestRegularExpression.java | 2 +- strings/TheReplacements.java | 2 +- strings/ThreatAnalyzer.java | 2 +- strings/Turtle.java | 2 +- strings/UsingStringBuilder.java | 2 +- strings/WhitherStringBuilder.java | 2 +- threads/AtomicEvenSupplier.java | 2 +- threads/AtomicIntegerTest.java | 2 +- threads/Atomicity.java | 2 +- threads/AtomicityTest.java | 2 +- threads/AttemptLocking.java | 2 +- threads/BankTellerSimulation.java | 2 +- threads/CachedThreadPool.java | 2 +- threads/CachedThreadPool2.java | 2 +- threads/CachedThreadPool3.java | 2 +- threads/CaptureUncaughtException.java | 2 +- threads/CarBuilder.java | 2 +- threads/Chopstick.java | 2 +- threads/CollectionToStream.java | 2 +- threads/CountingStream.java | 2 +- threads/CountingTask.java | 2 +- threads/CriticalSection.java | 2 +- threads/DeadlockingDiningPhilosophers.java | 2 +- threads/DelayQueueDemo.java | 2 +- threads/EvenChecker.java | 2 +- threads/EvenSupplier.java | 2 +- threads/ExceptionThread.java | 2 +- threads/ExplicitCriticalSection.java | 2 +- threads/FixedDiningPhilosophers.java | 2 +- threads/Futures.java | 2 +- threads/GreenhouseScheduler.java | 2 +- threads/HorseRace.java | 2 +- threads/IntSupplier.java | 2 +- threads/InterferingTask.java | 2 +- threads/LambdasAndMethodReferences.java | 2 +- threads/MoreTasksAfterShutdown.java | 2 +- threads/MutexEvenSupplier.java | 2 +- threads/NaiveExceptionHandling.java | 2 +- threads/NumberOfProcessors.java | 2 +- threads/ParallelStreamPuzzle.java | 2 +- threads/ParallelStreamPuzzle2.java | 2 +- threads/ParallelStreamPuzzle3.java | 2 +- threads/Philosopher.java | 2 +- threads/Prime.java | 2 +- threads/PriorityBlockingQueueDemo.java | 2 +- threads/QuittableTask.java | 2 +- threads/QuittingTasks.java | 2 +- threads/Restaurant.java | 2 +- threads/SerialNumberChecker.java | 2 +- threads/SerialNumberSupplier.java | 2 +- threads/SettingDefaultHandler.java | 2 +- threads/SingleThreadExecutor.java | 2 +- threads/SingleThreadExecutor2.java | 2 +- threads/SingleThreadExecutor3.java | 2 +- threads/SleepAndPrintTask.java | 2 +- threads/Summing.java | 2 +- threads/Summing2.java | 2 +- threads/Summing3.java | 2 +- threads/Summing4.java | 2 +- threads/SwallowedException.java | 2 +- threads/SyncObject.java | 2 +- threads/SynchronizedEvenSupplier.java | 2 +- threads/ThreadSize.java | 2 +- threads/ToastOMatic.java | 2 +- threads/WorkStealingPool.java | 2 +- threads/restaurant2/RestaurantWithQueues.java | 2 +- typeinfo/AnonymousImplementation.java | 2 +- typeinfo/BoundedClassReferences.java | 2 +- typeinfo/ClassCasts.java | 2 +- typeinfo/ClassInitialization.java | 2 +- typeinfo/DynamicSupplier.java | 2 +- typeinfo/FamilyVsExactType.java | 2 +- typeinfo/GenericClassReferences.java | 2 +- typeinfo/HiddenImplementation.java | 2 +- typeinfo/InnerImplementation.java | 2 +- typeinfo/InterfaceViolation.java | 2 +- typeinfo/ModifyingPrivateFields.java | 2 +- typeinfo/NullRobot.java | 2 +- typeinfo/Operation.java | 2 +- typeinfo/Person.java | 2 +- typeinfo/PetCount.java | 2 +- typeinfo/PetCount2.java | 2 +- typeinfo/PetCount3.java | 2 +- typeinfo/PetCount4.java | 2 +- typeinfo/Position.java | 2 +- typeinfo/RegisteredFactories.java | 2 +- typeinfo/Robot.java | 2 +- typeinfo/SelectingMethods.java | 2 +- typeinfo/Shapes.java | 2 +- typeinfo/ShowMethods.java | 2 +- typeinfo/SimpleDynamicProxy.java | 2 +- typeinfo/SimpleProxyDemo.java | 2 +- typeinfo/SnowRemovalRobot.java | 2 +- typeinfo/Staff.java | 2 +- typeinfo/SweetShop.java | 2 +- typeinfo/WildcardClassReferences.java | 2 +- typeinfo/interfacea/A.java | 2 +- typeinfo/packageaccess/HiddenC.java | 2 +- typeinfo/pets/Cat.java | 2 +- typeinfo/pets/Cymric.java | 2 +- typeinfo/pets/Dog.java | 2 +- typeinfo/pets/EgyptianMau.java | 2 +- typeinfo/pets/ForNameCreator.java | 2 +- typeinfo/pets/Hamster.java | 2 +- typeinfo/pets/Individual.java | 2 +- typeinfo/pets/LiteralPetCreator.java | 2 +- typeinfo/pets/Manx.java | 2 +- typeinfo/pets/Mouse.java | 2 +- typeinfo/pets/Mutt.java | 2 +- typeinfo/pets/Person.java | 2 +- typeinfo/pets/Pet.java | 2 +- typeinfo/pets/PetCreator.java | 2 +- typeinfo/pets/Pets.java | 2 +- typeinfo/pets/Pug.java | 2 +- typeinfo/pets/Rat.java | 2 +- typeinfo/pets/Rodent.java | 2 +- typeinfo/toys/GenericToyTest.java | 2 +- typeinfo/toys/ToyTest.java | 2 +- .../AssociativeArray.java | 2 +- understandingcollections/Bits.java | 2 +- .../CanonicalMapping.java | 2 +- .../CollectionMethods.java | 2 +- understandingcollections/CountedString.java | 2 +- understandingcollections/Enumerations.java | 2 +- understandingcollections/FailFast.java | 2 +- understandingcollections/FillMapTest.java | 2 +- understandingcollections/FillingLists.java | 2 +- understandingcollections/Groundhog.java | 2 +- understandingcollections/Groundhog2.java | 2 +- understandingcollections/IndividualTest.java | 2 +- .../LinkedHashMapDemo.java | 2 +- understandingcollections/ListOps.java | 2 +- understandingcollections/ListSortSearch.java | 2 +- understandingcollections/MapEntry.java | 2 +- understandingcollections/MapOps.java | 2 +- understandingcollections/Prediction.java | 2 +- understandingcollections/QueueBehavior.java | 2 +- understandingcollections/ReadOnly.java | 2 +- understandingcollections/References.java | 2 +- understandingcollections/SimpleDeques.java | 2 +- understandingcollections/SimpleHashMap.java | 2 +- understandingcollections/SlowMap.java | 2 +- understandingcollections/SortedMapDemo.java | 2 +- understandingcollections/SortedSetDemo.java | 2 +- understandingcollections/SpringDetector.java | 2 +- understandingcollections/SpringDetector2.java | 2 +- understandingcollections/Stacks.java | 2 +- understandingcollections/StreamFillMaps.java | 2 +- understandingcollections/StringHashCode.java | 2 +- .../SuppliersCollectionTest.java | 2 +- understandingcollections/Synchronization.java | 2 +- understandingcollections/ToDoList.java | 2 +- understandingcollections/TypesForSets.java | 2 +- understandingcollections/Unsupported.java | 2 +- understandingcollections/Utilities.java | 2 +- understandingcollections/jmh/Lists.java | 2 +- understandingcollections/jmh/Maps.java | 2 +- understandingcollections/jmh/Queues.java | 2 +- understandingcollections/jmh/Sets.java | 2 +- validating/Assert1.java | 4 +- validating/Assert2.java | 2 +- validating/BadMicroBenchmark.java | 2 +- validating/BadMicroBenchmark2.java | 2 +- validating/BadMicroBenchmark3.java | 2 +- validating/CountedList.java | 2 +- validating/GuavaAssertions.java | 2 +- validating/GuavaPreconditions.java | 54 +++++++++---------- validating/Inverter1.java | 2 +- validating/Inverter2.java | 2 +- validating/Inverter3.java | 2 +- validating/Inverter4.java | 2 +- validating/LoaderAssertions.java | 2 +- validating/NonNullConstruction.java | 18 +++++++ validating/Queue.java | 2 +- validating/QueueException.java | 2 +- validating/SLF4JLevels.java | 2 +- validating/SLF4JLogging.java | 2 +- validating/SimpleDebugging.java | 3 +- validating/StringInverter.java | 2 +- validating/Time.java | 2 +- validating/jmh/ParallelSetAll.java | 2 +- validating/jmh/ParallelSetAllBetter.java | 27 ++++++++++ validating/tests/CountedListTest.java | 2 +- .../tests/DynamicStringInverterTests.java | 2 +- validating/tests/QueueTest.java | 2 +- validating/tests/StringInverterTests.java | 2 +- 988 files changed, 1057 insertions(+), 1019 deletions(-) create mode 100644 validating/NonNullConstruction.java create mode 100644 validating/jmh/ParallelSetAllBetter.java diff --git a/HelloDate.java b/HelloDate.java index dce03d0ba..9b14605be 100644 --- a/HelloDate.java +++ b/HelloDate.java @@ -1,7 +1,7 @@ // HelloDate.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.util.*; public class HelloDate { diff --git a/annotations/AtUnitComposition.java b/annotations/AtUnitComposition.java index bab704faf..87ecb6922 100644 --- a/annotations/AtUnitComposition.java +++ b/annotations/AtUnitComposition.java @@ -1,7 +1,7 @@ // annotations/AtUnitComposition.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Creating non-embedded tests // {java onjava.atunit.AtUnit // build/classes/main/annotations/AtUnitComposition.class} diff --git a/annotations/AtUnitExample1.java b/annotations/AtUnitExample1.java index d8573bfae..facc85e95 100644 --- a/annotations/AtUnitExample1.java +++ b/annotations/AtUnitExample1.java @@ -1,7 +1,7 @@ // annotations/AtUnitExample1.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // {java onjava.atunit.AtUnit // build/classes/main/annotations/AtUnitExample1.class} package annotations; diff --git a/annotations/AtUnitExample2.java b/annotations/AtUnitExample2.java index 37b745673..c84667bbf 100644 --- a/annotations/AtUnitExample2.java +++ b/annotations/AtUnitExample2.java @@ -1,7 +1,7 @@ // annotations/AtUnitExample2.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Assertions and exceptions can be used in @Tests // {java onjava.atunit.AtUnit // build/classes/main/annotations/AtUnitExample2.class} diff --git a/annotations/AtUnitExample3.java b/annotations/AtUnitExample3.java index d253c6a2c..5c1635fc0 100644 --- a/annotations/AtUnitExample3.java +++ b/annotations/AtUnitExample3.java @@ -1,7 +1,7 @@ // annotations/AtUnitExample3.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // {java onjava.atunit.AtUnit // build/classes/main/annotations/AtUnitExample3.class} package annotations; diff --git a/annotations/AtUnitExample4.java b/annotations/AtUnitExample4.java index 935d0eee4..066182f2e 100644 --- a/annotations/AtUnitExample4.java +++ b/annotations/AtUnitExample4.java @@ -1,7 +1,7 @@ // annotations/AtUnitExample4.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // {java onjava.atunit.AtUnit // build/classes/main/annotations/AtUnitExample4.class} package annotations; diff --git a/annotations/AtUnitExample5.java b/annotations/AtUnitExample5.java index 972970582..b43141eaa 100644 --- a/annotations/AtUnitExample5.java +++ b/annotations/AtUnitExample5.java @@ -1,7 +1,7 @@ // annotations/AtUnitExample5.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // {java onjava.atunit.AtUnit // build/classes/main/annotations/AtUnitExample5.class} package annotations; diff --git a/annotations/AtUnitExternalTest.java b/annotations/AtUnitExternalTest.java index a58909bed..c7659c6f4 100644 --- a/annotations/AtUnitExternalTest.java +++ b/annotations/AtUnitExternalTest.java @@ -1,7 +1,7 @@ // annotations/AtUnitExternalTest.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Creating non-embedded tests // {java onjava.atunit.AtUnit // build/classes/main/annotations/AtUnitExternalTest.class} diff --git a/annotations/HashSetTest.java b/annotations/HashSetTest.java index 553378ea4..7ea3ce2c6 100644 --- a/annotations/HashSetTest.java +++ b/annotations/HashSetTest.java @@ -1,7 +1,7 @@ // annotations/HashSetTest.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // {java onjava.atunit.AtUnit // build/classes/main/annotations/HashSetTest.class} package annotations; diff --git a/annotations/PasswordUtils.java b/annotations/PasswordUtils.java index 46c17e0aa..b59681112 100644 --- a/annotations/PasswordUtils.java +++ b/annotations/PasswordUtils.java @@ -1,7 +1,7 @@ // annotations/PasswordUtils.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.util.*; public class PasswordUtils { diff --git a/annotations/SimulatingNull.java b/annotations/SimulatingNull.java index 263052be2..7b63b9468 100644 --- a/annotations/SimulatingNull.java +++ b/annotations/SimulatingNull.java @@ -1,7 +1,7 @@ // annotations/SimulatingNull.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.lang.annotation.*; @Target(ElementType.METHOD) diff --git a/annotations/StackL.java b/annotations/StackL.java index 4ae80f9ee..348871ab5 100644 --- a/annotations/StackL.java +++ b/annotations/StackL.java @@ -1,7 +1,7 @@ // annotations/StackL.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // A stack built on a linkedList package annotations; import java.util.*; diff --git a/annotations/StackLStringTest.java b/annotations/StackLStringTest.java index 5ceda09cd..62e7783ba 100644 --- a/annotations/StackLStringTest.java +++ b/annotations/StackLStringTest.java @@ -1,7 +1,7 @@ // annotations/StackLStringTest.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Applying @Unit to generics // {java onjava.atunit.AtUnit // build/classes/main/annotations/StackLStringTest.class} diff --git a/annotations/Testable.java b/annotations/Testable.java index 369f2768c..721dabad9 100644 --- a/annotations/Testable.java +++ b/annotations/Testable.java @@ -1,7 +1,7 @@ // annotations/Testable.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. package annotations; import onjava.atunit.*; diff --git a/annotations/UseCase.java b/annotations/UseCase.java index c59a14633..7dc851a37 100644 --- a/annotations/UseCase.java +++ b/annotations/UseCase.java @@ -1,7 +1,7 @@ // annotations/UseCase.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.lang.annotation.*; @Target(ElementType.METHOD) diff --git a/annotations/UseCaseTracker.java b/annotations/UseCaseTracker.java index 91da32e58..84a2e21ff 100644 --- a/annotations/UseCaseTracker.java +++ b/annotations/UseCaseTracker.java @@ -1,7 +1,7 @@ // annotations/UseCaseTracker.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.lang.reflect.*; import java.util.*; diff --git a/annotations/database/Constraints.java b/annotations/database/Constraints.java index b16105e54..156882336 100644 --- a/annotations/database/Constraints.java +++ b/annotations/database/Constraints.java @@ -1,7 +1,7 @@ // annotations/database/Constraints.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. package annotations.database; import java.lang.annotation.*; diff --git a/annotations/database/DBTable.java b/annotations/database/DBTable.java index 2ff972fb6..8cdad9b68 100644 --- a/annotations/database/DBTable.java +++ b/annotations/database/DBTable.java @@ -1,7 +1,7 @@ // annotations/database/DBTable.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. package annotations.database; import java.lang.annotation.*; diff --git a/annotations/database/Member.java b/annotations/database/Member.java index c4475e906..b49c2c594 100644 --- a/annotations/database/Member.java +++ b/annotations/database/Member.java @@ -1,7 +1,7 @@ // annotations/database/Member.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. package annotations.database; @DBTable(name = "MEMBER") diff --git a/annotations/database/SQLInteger.java b/annotations/database/SQLInteger.java index cffcb86b0..ecd7b5f4d 100644 --- a/annotations/database/SQLInteger.java +++ b/annotations/database/SQLInteger.java @@ -1,7 +1,7 @@ // annotations/database/SQLInteger.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. package annotations.database; import java.lang.annotation.*; diff --git a/annotations/database/SQLString.java b/annotations/database/SQLString.java index fbb6195aa..0df7eb11f 100644 --- a/annotations/database/SQLString.java +++ b/annotations/database/SQLString.java @@ -1,7 +1,7 @@ // annotations/database/SQLString.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. package annotations.database; import java.lang.annotation.*; diff --git a/annotations/database/TableCreator.java b/annotations/database/TableCreator.java index eeb80705e..b513e3787 100644 --- a/annotations/database/TableCreator.java +++ b/annotations/database/TableCreator.java @@ -1,7 +1,7 @@ // annotations/database/TableCreator.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Reflection-based annotation processor // {java annotations.database.TableCreator // annotations.database.Member} diff --git a/annotations/database/Uniqueness.java b/annotations/database/Uniqueness.java index 2ede0e41b..b1adc3196 100644 --- a/annotations/database/Uniqueness.java +++ b/annotations/database/Uniqueness.java @@ -1,7 +1,7 @@ // annotations/database/Uniqueness.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Sample of nested annotations package annotations.database; diff --git a/annotations/ifx/ExtractInterface.java b/annotations/ifx/ExtractInterface.java index 68c320380..bef18673c 100644 --- a/annotations/ifx/ExtractInterface.java +++ b/annotations/ifx/ExtractInterface.java @@ -1,7 +1,7 @@ // annotations/ifx/ExtractInterface.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // javac-based annotation processing package annotations.ifx; import java.lang.annotation.*; diff --git a/annotations/ifx/IfaceExtractorProcessor.java b/annotations/ifx/IfaceExtractorProcessor.java index 06a95e421..9177a048f 100644 --- a/annotations/ifx/IfaceExtractorProcessor.java +++ b/annotations/ifx/IfaceExtractorProcessor.java @@ -1,7 +1,7 @@ // annotations/ifx/IfaceExtractorProcessor.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // javac-based annotation processing package annotations.ifx; import javax.annotation.processing.*; diff --git a/annotations/ifx/Multiplier.java b/annotations/ifx/Multiplier.java index 71322e11e..dc128bf73 100644 --- a/annotations/ifx/Multiplier.java +++ b/annotations/ifx/Multiplier.java @@ -1,7 +1,7 @@ // annotations/ifx/Multiplier.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // javac-based annotation processing // {java annotations.ifx.Multiplier} package annotations.ifx; diff --git a/annotations/simplest/Simple.java b/annotations/simplest/Simple.java index 7e1b8ce96..db5ba7bcc 100644 --- a/annotations/simplest/Simple.java +++ b/annotations/simplest/Simple.java @@ -1,7 +1,7 @@ // annotations/simplest/Simple.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // A bare-bones annotation package annotations.simplest; import java.lang.annotation.Retention; diff --git a/annotations/simplest/SimpleProcessor.java b/annotations/simplest/SimpleProcessor.java index b42f2d6ef..a362a3e86 100644 --- a/annotations/simplest/SimpleProcessor.java +++ b/annotations/simplest/SimpleProcessor.java @@ -1,7 +1,7 @@ // annotations/simplest/SimpleProcessor.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // A bare-bones annotation processor package annotations.simplest; import javax.annotation.processing.*; diff --git a/annotations/simplest/SimpleTest.java b/annotations/simplest/SimpleTest.java index 4a991d50d..e2477c1b1 100644 --- a/annotations/simplest/SimpleTest.java +++ b/annotations/simplest/SimpleTest.java @@ -1,7 +1,7 @@ // annotations/simplest/SimpleTest.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Test the "Simple" annotation // {java annotations.simplest.SimpleTest} package annotations.simplest; diff --git a/arrays/AlphabeticSearch.java b/arrays/AlphabeticSearch.java index 6b5d87ee3..1ede5c2f8 100644 --- a/arrays/AlphabeticSearch.java +++ b/arrays/AlphabeticSearch.java @@ -1,7 +1,7 @@ // arrays/AlphabeticSearch.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Searching with a Comparator import java.util.*; import onjava.*; diff --git a/arrays/ArrayCopying.java b/arrays/ArrayCopying.java index 459aaa17c..88b842329 100644 --- a/arrays/ArrayCopying.java +++ b/arrays/ArrayCopying.java @@ -1,7 +1,7 @@ // arrays/ArrayCopying.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Demonstrate Arrays.copy() and Arrays.copyOf() import java.util.*; import onjava.*; diff --git a/arrays/ArrayOfGenericType.java b/arrays/ArrayOfGenericType.java index bd89ffddf..01b4ee4c0 100644 --- a/arrays/ArrayOfGenericType.java +++ b/arrays/ArrayOfGenericType.java @@ -1,7 +1,7 @@ // arrays/ArrayOfGenericType.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. public class ArrayOfGenericType { T[] array; // OK diff --git a/arrays/ArrayOfGenerics.java b/arrays/ArrayOfGenerics.java index b205e82b5..9b9e31a60 100644 --- a/arrays/ArrayOfGenerics.java +++ b/arrays/ArrayOfGenerics.java @@ -1,7 +1,7 @@ // arrays/ArrayOfGenerics.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.util.*; public class ArrayOfGenerics { diff --git a/arrays/ArrayOptions.java b/arrays/ArrayOptions.java index 2107cae9d..c4ebd1875 100644 --- a/arrays/ArrayOptions.java +++ b/arrays/ArrayOptions.java @@ -1,7 +1,7 @@ // arrays/ArrayOptions.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Initialization & re-assignment of arrays import java.util.*; import static onjava.ArrayShow.*; diff --git a/arrays/ArraySearching.java b/arrays/ArraySearching.java index b76bade69..baf7878fb 100644 --- a/arrays/ArraySearching.java +++ b/arrays/ArraySearching.java @@ -1,7 +1,7 @@ // arrays/ArraySearching.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Using Arrays.binarySearch() import java.util.*; import onjava.*; diff --git a/arrays/AssemblingMultidimensionalArrays.java b/arrays/AssemblingMultidimensionalArrays.java index 5667961f7..aadfd0550 100644 --- a/arrays/AssemblingMultidimensionalArrays.java +++ b/arrays/AssemblingMultidimensionalArrays.java @@ -1,7 +1,7 @@ // arrays/AssemblingMultidimensionalArrays.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Creating multidimensional arrays import java.util.*; diff --git a/arrays/AutoboxingArrays.java b/arrays/AutoboxingArrays.java index 08cbe7133..b39f4e8dc 100644 --- a/arrays/AutoboxingArrays.java +++ b/arrays/AutoboxingArrays.java @@ -1,7 +1,7 @@ // arrays/AutoboxingArrays.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.util.*; public class AutoboxingArrays { diff --git a/arrays/CollectionComparison.java b/arrays/CollectionComparison.java index 51ae19ade..f37bcda59 100644 --- a/arrays/CollectionComparison.java +++ b/arrays/CollectionComparison.java @@ -1,7 +1,7 @@ // arrays/CollectionComparison.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.util.*; import onjava.*; import static onjava.ArrayShow.*; diff --git a/arrays/CompType.java b/arrays/CompType.java index ae13e85ea..21b4fa2ad 100644 --- a/arrays/CompType.java +++ b/arrays/CompType.java @@ -1,7 +1,7 @@ // arrays/CompType.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Implementing Comparable in a class import java.util.*; import java.util.function.*; diff --git a/arrays/ComparatorTest.java b/arrays/ComparatorTest.java index 07cc0a922..c981a673c 100644 --- a/arrays/ComparatorTest.java +++ b/arrays/ComparatorTest.java @@ -1,7 +1,7 @@ // arrays/ComparatorTest.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Implementing a Comparator for a class import java.util.*; import onjava.*; diff --git a/arrays/ComparingArrays.java b/arrays/ComparingArrays.java index 0a31fb9cf..b146e3ddd 100644 --- a/arrays/ComparingArrays.java +++ b/arrays/ComparingArrays.java @@ -1,7 +1,7 @@ // arrays/ComparingArrays.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Using Arrays.equals() import java.util.*; import onjava.*; diff --git a/arrays/CountUpward.java b/arrays/CountUpward.java index 79f7afa1c..a49a0a137 100644 --- a/arrays/CountUpward.java +++ b/arrays/CountUpward.java @@ -1,7 +1,7 @@ // arrays/CountUpward.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.util.*; import java.util.stream.*; import static onjava.ArrayShow.*; diff --git a/arrays/FillingArrays.java b/arrays/FillingArrays.java index 6a7a247cd..91df974ce 100644 --- a/arrays/FillingArrays.java +++ b/arrays/FillingArrays.java @@ -1,7 +1,7 @@ // arrays/FillingArrays.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Using Arrays.fill() import java.util.*; import static onjava.ArrayShow.*; diff --git a/arrays/IceCream.java b/arrays/IceCream.java index 3db2a2f4c..c47e3afb6 100644 --- a/arrays/IceCream.java +++ b/arrays/IceCream.java @@ -1,7 +1,7 @@ // arrays/IceCream.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Returning arrays from methods import java.util.*; import static onjava.ArrayShow.*; diff --git a/arrays/ModifyExisting.java b/arrays/ModifyExisting.java index 1199c7056..664c4fe6a 100644 --- a/arrays/ModifyExisting.java +++ b/arrays/ModifyExisting.java @@ -1,7 +1,7 @@ // arrays/ModifyExisting.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.util.*; import onjava.*; import static onjava.ArrayShow.*; diff --git a/arrays/MultiDimWrapperArray.java b/arrays/MultiDimWrapperArray.java index 9c6c927a2..2bab4e837 100644 --- a/arrays/MultiDimWrapperArray.java +++ b/arrays/MultiDimWrapperArray.java @@ -1,7 +1,7 @@ // arrays/MultiDimWrapperArray.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Multidimensional arrays of "wrapper" objects import java.util.*; diff --git a/arrays/MultidimensionalObjectArrays.java b/arrays/MultidimensionalObjectArrays.java index 465e5ea25..a288d1768 100644 --- a/arrays/MultidimensionalObjectArrays.java +++ b/arrays/MultidimensionalObjectArrays.java @@ -1,7 +1,7 @@ // arrays/MultidimensionalObjectArrays.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.util.*; public class MultidimensionalObjectArrays { diff --git a/arrays/MultidimensionalPrimitiveArray.java b/arrays/MultidimensionalPrimitiveArray.java index 1162f60fa..35f3fa1b7 100644 --- a/arrays/MultidimensionalPrimitiveArray.java +++ b/arrays/MultidimensionalPrimitiveArray.java @@ -1,7 +1,7 @@ // arrays/MultidimensionalPrimitiveArray.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.util.*; public class MultidimensionalPrimitiveArray { diff --git a/arrays/ParallelPrefix1.java b/arrays/ParallelPrefix1.java index 85b55267f..1e3a45b83 100644 --- a/arrays/ParallelPrefix1.java +++ b/arrays/ParallelPrefix1.java @@ -1,7 +1,7 @@ // arrays/ParallelPrefix1.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.util.*; import onjava.*; import static onjava.ArrayShow.*; diff --git a/arrays/ParallelPrefix2.java b/arrays/ParallelPrefix2.java index 8dec930a9..e8c27b36e 100644 --- a/arrays/ParallelPrefix2.java +++ b/arrays/ParallelPrefix2.java @@ -1,7 +1,7 @@ // arrays/ParallelPrefix2.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.util.*; import onjava.*; import static onjava.ArrayShow.*; diff --git a/arrays/ParallelPrefix3.java b/arrays/ParallelPrefix3.java index bd46fcdd1..0fcab413f 100644 --- a/arrays/ParallelPrefix3.java +++ b/arrays/ParallelPrefix3.java @@ -1,7 +1,7 @@ // arrays/ParallelPrefix3.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.util.*; public class ParallelPrefix3 { diff --git a/arrays/ParallelSetAll.java b/arrays/ParallelSetAll.java index a72850329..cda4a8a07 100644 --- a/arrays/ParallelSetAll.java +++ b/arrays/ParallelSetAll.java @@ -1,7 +1,7 @@ // arrays/ParallelSetAll.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.util.*; import onjava.*; diff --git a/arrays/ParameterizedArrayType.java b/arrays/ParameterizedArrayType.java index b8fff08a1..dba0bd468 100644 --- a/arrays/ParameterizedArrayType.java +++ b/arrays/ParameterizedArrayType.java @@ -1,7 +1,7 @@ // arrays/ParameterizedArrayType.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. class ClassParameter { public T[] f(T[] arg) { return arg; } diff --git a/arrays/PythonLists.py b/arrays/PythonLists.py index f7d7fbe11..ead7ab7be 100644 --- a/arrays/PythonLists.py +++ b/arrays/PythonLists.py @@ -1,7 +1,7 @@ # arrays/PythonLists.py # (c)2016 MindView LLC: see Copyright.txt # We make no guarantees that this code is fit for any purpose. -# Visit http://mindviewinc.com/Books/OnJava/ for more book information. +# Visit http://OnJava8.com for more book information. aList = [1, 2, 3, 4, 5] print(type(aList)) # diff --git a/arrays/RaggedArray.java b/arrays/RaggedArray.java index b09d99b4e..b667a2b95 100644 --- a/arrays/RaggedArray.java +++ b/arrays/RaggedArray.java @@ -1,7 +1,7 @@ // arrays/RaggedArray.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.util.*; public class RaggedArray { diff --git a/arrays/Reverse.java b/arrays/Reverse.java index 1862dd524..e7aa535c4 100644 --- a/arrays/Reverse.java +++ b/arrays/Reverse.java @@ -1,7 +1,7 @@ // arrays/Reverse.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // The Collections.reverseOrder() Comparator import java.util.*; import onjava.*; diff --git a/arrays/SimpleSetAll.java b/arrays/SimpleSetAll.java index 698fc0c3d..74cccbe42 100644 --- a/arrays/SimpleSetAll.java +++ b/arrays/SimpleSetAll.java @@ -1,7 +1,7 @@ // arrays/SimpleSetAll.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.util.*; import static onjava.ArrayShow.*; diff --git a/arrays/StreamFromArray.java b/arrays/StreamFromArray.java index 9808bdaad..b5c5176f8 100644 --- a/arrays/StreamFromArray.java +++ b/arrays/StreamFromArray.java @@ -1,7 +1,7 @@ // arrays/StreamFromArray.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.util.*; import onjava.*; diff --git a/arrays/StringSorting.java b/arrays/StringSorting.java index c07325a41..58224f57d 100644 --- a/arrays/StringSorting.java +++ b/arrays/StringSorting.java @@ -1,7 +1,7 @@ // arrays/StringSorting.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Sorting an array of Strings import java.util.*; import onjava.*; diff --git a/arrays/TestConvertTo.java b/arrays/TestConvertTo.java index 1970be8bb..fe3126880 100644 --- a/arrays/TestConvertTo.java +++ b/arrays/TestConvertTo.java @@ -1,7 +1,7 @@ // arrays/TestConvertTo.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.util.*; import onjava.*; import static onjava.ArrayShow.*; diff --git a/arrays/TestCount.java b/arrays/TestCount.java index 89b0cf39f..ba02c0460 100644 --- a/arrays/TestCount.java +++ b/arrays/TestCount.java @@ -1,7 +1,7 @@ // arrays/TestCount.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Test counting generators import java.util.*; import java.util.stream.*; diff --git a/arrays/TestRand.java b/arrays/TestRand.java index 43e1695b4..f9d61ef2a 100644 --- a/arrays/TestRand.java +++ b/arrays/TestRand.java @@ -1,7 +1,7 @@ // arrays/TestRand.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Test random generators import java.util.*; import java.util.stream.*; diff --git a/arrays/ThreeDWithNew.java b/arrays/ThreeDWithNew.java index ca175fa29..dcc3a0ade 100644 --- a/arrays/ThreeDWithNew.java +++ b/arrays/ThreeDWithNew.java @@ -1,7 +1,7 @@ // arrays/ThreeDWithNew.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.util.*; public class ThreeDWithNew { diff --git a/arrays/jmh/ParallelSort.java b/arrays/jmh/ParallelSort.java index b02de40c2..20216fa33 100644 --- a/arrays/jmh/ParallelSort.java +++ b/arrays/jmh/ParallelSort.java @@ -1,7 +1,7 @@ // arrays/jmh/ParallelSort.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. package arrays.jmh; import java.util.*; import onjava.*; diff --git a/collections/AdapterMethodIdiom.java b/collections/AdapterMethodIdiom.java index 5d7d4a272..6944c5263 100644 --- a/collections/AdapterMethodIdiom.java +++ b/collections/AdapterMethodIdiom.java @@ -1,7 +1,7 @@ // collections/AdapterMethodIdiom.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // The "Adapter Method" idiom uses for-in // with additional kinds of Iterables import java.util.*; diff --git a/collections/AddingGroups.java b/collections/AddingGroups.java index 9551639ff..661de5bc3 100644 --- a/collections/AddingGroups.java +++ b/collections/AddingGroups.java @@ -1,7 +1,7 @@ // collections/AddingGroups.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Adding groups of elements to Collection objects import java.util.*; diff --git a/collections/ApplesAndOrangesWithGenerics.java b/collections/ApplesAndOrangesWithGenerics.java index ee5db4f04..3d2e955c5 100644 --- a/collections/ApplesAndOrangesWithGenerics.java +++ b/collections/ApplesAndOrangesWithGenerics.java @@ -1,7 +1,7 @@ // collections/ApplesAndOrangesWithGenerics.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.util.*; public class ApplesAndOrangesWithGenerics { diff --git a/collections/ApplesAndOrangesWithoutGenerics.java b/collections/ApplesAndOrangesWithoutGenerics.java index 2b16df219..f003d5fda 100644 --- a/collections/ApplesAndOrangesWithoutGenerics.java +++ b/collections/ApplesAndOrangesWithoutGenerics.java @@ -1,7 +1,7 @@ // collections/ApplesAndOrangesWithoutGenerics.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Simple collection use (suppressing compiler warnings) // {ThrowsException} import java.util.*; diff --git a/collections/ArrayIsNotIterable.java b/collections/ArrayIsNotIterable.java index 87177d448..e87af4a3d 100644 --- a/collections/ArrayIsNotIterable.java +++ b/collections/ArrayIsNotIterable.java @@ -1,7 +1,7 @@ // collections/ArrayIsNotIterable.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.util.*; public class ArrayIsNotIterable { diff --git a/collections/AsListInference.java b/collections/AsListInference.java index 1d47b3c50..5d58ae1f0 100644 --- a/collections/AsListInference.java +++ b/collections/AsListInference.java @@ -1,7 +1,7 @@ // collections/AsListInference.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.util.*; class Snow {} diff --git a/collections/CollectionMethods.java b/collections/CollectionMethods.java index 7339f93af..0a6986cf6 100644 --- a/collections/CollectionMethods.java +++ b/collections/CollectionMethods.java @@ -1,7 +1,7 @@ // collections/CollectionMethods.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import onjava.*; public class CollectionMethods { diff --git a/collections/CollectionSequence.java b/collections/CollectionSequence.java index a444be712..0bfbd265b 100644 --- a/collections/CollectionSequence.java +++ b/collections/CollectionSequence.java @@ -1,7 +1,7 @@ // collections/CollectionSequence.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import typeinfo.pets.*; import java.util.*; diff --git a/collections/CrossCollectionIteration.java b/collections/CrossCollectionIteration.java index 470da4a27..e2dec7a17 100644 --- a/collections/CrossCollectionIteration.java +++ b/collections/CrossCollectionIteration.java @@ -1,7 +1,7 @@ // collections/CrossCollectionIteration.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import typeinfo.pets.*; import java.util.*; diff --git a/collections/CrossCollectionIteration2.java b/collections/CrossCollectionIteration2.java index 8eb85f072..45616c65b 100644 --- a/collections/CrossCollectionIteration2.java +++ b/collections/CrossCollectionIteration2.java @@ -1,7 +1,7 @@ // collections/CrossCollectionIteration2.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import typeinfo.pets.*; import java.util.*; diff --git a/collections/EnvironmentVariables.java b/collections/EnvironmentVariables.java index a8f7bb6ec..99723fd8f 100644 --- a/collections/EnvironmentVariables.java +++ b/collections/EnvironmentVariables.java @@ -1,7 +1,7 @@ // collections/EnvironmentVariables.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // {ValidateByHand} import java.util.*; diff --git a/collections/ForInCollections.java b/collections/ForInCollections.java index b37f17666..c52bce871 100644 --- a/collections/ForInCollections.java +++ b/collections/ForInCollections.java @@ -1,7 +1,7 @@ // collections/ForInCollections.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // All collections work with for-in import java.util.*; diff --git a/collections/GenericsAndUpcasting.java b/collections/GenericsAndUpcasting.java index df42b729f..70a70c891 100644 --- a/collections/GenericsAndUpcasting.java +++ b/collections/GenericsAndUpcasting.java @@ -1,7 +1,7 @@ // collections/GenericsAndUpcasting.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.util.*; class GrannySmith extends Apple {} diff --git a/collections/InterfaceVsIterator.java b/collections/InterfaceVsIterator.java index eda990c20..2e68ecb2c 100644 --- a/collections/InterfaceVsIterator.java +++ b/collections/InterfaceVsIterator.java @@ -1,7 +1,7 @@ // collections/InterfaceVsIterator.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import typeinfo.pets.*; import java.util.*; diff --git a/collections/IterableClass.java b/collections/IterableClass.java index 8f1d43faf..d0bf49082 100644 --- a/collections/IterableClass.java +++ b/collections/IterableClass.java @@ -1,7 +1,7 @@ // collections/IterableClass.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Anything Iterable works with for-in import java.util.*; diff --git a/collections/LinkedListFeatures.java b/collections/LinkedListFeatures.java index 3e794e817..24e181471 100644 --- a/collections/LinkedListFeatures.java +++ b/collections/LinkedListFeatures.java @@ -1,7 +1,7 @@ // collections/LinkedListFeatures.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import typeinfo.pets.*; import java.util.*; diff --git a/collections/ListFeatures.java b/collections/ListFeatures.java index 68c32664c..eeb5ddb89 100644 --- a/collections/ListFeatures.java +++ b/collections/ListFeatures.java @@ -1,7 +1,7 @@ // collections/ListFeatures.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import typeinfo.pets.*; import java.util.*; diff --git a/collections/ListIteration.java b/collections/ListIteration.java index 0754768f8..57d52fed6 100644 --- a/collections/ListIteration.java +++ b/collections/ListIteration.java @@ -1,7 +1,7 @@ // collections/ListIteration.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import typeinfo.pets.*; import java.util.*; diff --git a/collections/MapOfList.java b/collections/MapOfList.java index d6ca5e298..35ed1c2df 100644 --- a/collections/MapOfList.java +++ b/collections/MapOfList.java @@ -1,7 +1,7 @@ // collections/MapOfList.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // {java collections.MapOfList} package collections; import typeinfo.pets.*; diff --git a/collections/ModifyingArraysAsList.java b/collections/ModifyingArraysAsList.java index 9c3fd86e7..3d4d1d5bf 100644 --- a/collections/ModifyingArraysAsList.java +++ b/collections/ModifyingArraysAsList.java @@ -1,7 +1,7 @@ // collections/ModifyingArraysAsList.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.util.*; public class ModifyingArraysAsList { diff --git a/collections/MultiIterableClass.java b/collections/MultiIterableClass.java index 00f4245fb..2a2a6c563 100644 --- a/collections/MultiIterableClass.java +++ b/collections/MultiIterableClass.java @@ -1,7 +1,7 @@ // collections/MultiIterableClass.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Adding several Adapter Methods import java.util.*; diff --git a/collections/NonCollectionSequence.java b/collections/NonCollectionSequence.java index 5ca490cfc..564174598 100644 --- a/collections/NonCollectionSequence.java +++ b/collections/NonCollectionSequence.java @@ -1,7 +1,7 @@ // collections/NonCollectionSequence.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import typeinfo.pets.*; import java.util.*; diff --git a/collections/PetMap.java b/collections/PetMap.java index e229ff8ba..ec1605859 100644 --- a/collections/PetMap.java +++ b/collections/PetMap.java @@ -1,7 +1,7 @@ // collections/PetMap.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import typeinfo.pets.*; import java.util.*; diff --git a/collections/PrintingCollections.java b/collections/PrintingCollections.java index c5d75af45..7c8b3c731 100644 --- a/collections/PrintingCollections.java +++ b/collections/PrintingCollections.java @@ -1,7 +1,7 @@ // collections/PrintingCollections.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Collections print themselves automatically import java.util.*; diff --git a/collections/PriorityQueueDemo.java b/collections/PriorityQueueDemo.java index 3527e97a2..abc6f0f33 100644 --- a/collections/PriorityQueueDemo.java +++ b/collections/PriorityQueueDemo.java @@ -1,7 +1,7 @@ // collections/PriorityQueueDemo.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.util.*; public class PriorityQueueDemo { diff --git a/collections/QueueDemo.java b/collections/QueueDemo.java index 066decc24..d1155d6c8 100644 --- a/collections/QueueDemo.java +++ b/collections/QueueDemo.java @@ -1,7 +1,7 @@ // collections/QueueDemo.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Upcasting to a Queue from a LinkedList import java.util.*; diff --git a/collections/SetOfInteger.java b/collections/SetOfInteger.java index 2135fea7e..b16b39913 100644 --- a/collections/SetOfInteger.java +++ b/collections/SetOfInteger.java @@ -1,7 +1,7 @@ // collections/SetOfInteger.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.util.*; public class SetOfInteger { diff --git a/collections/SetOfString.java b/collections/SetOfString.java index 4d0201b8f..1407bbd61 100644 --- a/collections/SetOfString.java +++ b/collections/SetOfString.java @@ -1,7 +1,7 @@ // collections/SetOfString.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.util.*; public class SetOfString { diff --git a/collections/SetOperations.java b/collections/SetOperations.java index 72a2f98ce..492b48a08 100644 --- a/collections/SetOperations.java +++ b/collections/SetOperations.java @@ -1,7 +1,7 @@ // collections/SetOperations.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.util.*; public class SetOperations { diff --git a/collections/SimpleCollection.java b/collections/SimpleCollection.java index 8fb2347e2..758584a8d 100644 --- a/collections/SimpleCollection.java +++ b/collections/SimpleCollection.java @@ -1,7 +1,7 @@ // collections/SimpleCollection.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.util.*; public class SimpleCollection { diff --git a/collections/SimpleIteration.java b/collections/SimpleIteration.java index 071339ca1..814b4e57b 100644 --- a/collections/SimpleIteration.java +++ b/collections/SimpleIteration.java @@ -1,7 +1,7 @@ // collections/SimpleIteration.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import typeinfo.pets.*; import java.util.*; diff --git a/collections/SortedSetOfString.java b/collections/SortedSetOfString.java index 139a74695..3f885ff7f 100644 --- a/collections/SortedSetOfString.java +++ b/collections/SortedSetOfString.java @@ -1,7 +1,7 @@ // collections/SortedSetOfString.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.util.*; public class SortedSetOfString { diff --git a/collections/StackCollision.java b/collections/StackCollision.java index b6d0986a6..96863cf07 100644 --- a/collections/StackCollision.java +++ b/collections/StackCollision.java @@ -1,7 +1,7 @@ // collections/StackCollision.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. public class StackCollision { public static void main(String[] args) { diff --git a/collections/StackTest.java b/collections/StackTest.java index 86c308ec0..5ca489e95 100644 --- a/collections/StackTest.java +++ b/collections/StackTest.java @@ -1,7 +1,7 @@ // collections/StackTest.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.util.*; public class StackTest { diff --git a/collections/StackTest2.java b/collections/StackTest2.java index f36c62b1a..d8a15a944 100644 --- a/collections/StackTest2.java +++ b/collections/StackTest2.java @@ -1,7 +1,7 @@ // collections/StackTest2.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import onjava.*; public class StackTest2 { diff --git a/collections/Statistics.java b/collections/Statistics.java index 862b17d08..c22ed96c0 100644 --- a/collections/Statistics.java +++ b/collections/Statistics.java @@ -1,7 +1,7 @@ // collections/Statistics.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Simple demonstration of HashMap import java.util.*; diff --git a/collections/UniqueWords.java b/collections/UniqueWords.java index f8c3b096d..3713c5cd3 100644 --- a/collections/UniqueWords.java +++ b/collections/UniqueWords.java @@ -1,7 +1,7 @@ // collections/UniqueWords.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.util.*; import java.nio.file.*; diff --git a/collections/UniqueWordsAlphabetic.java b/collections/UniqueWordsAlphabetic.java index 584fa6506..bc6ffcf3c 100644 --- a/collections/UniqueWordsAlphabetic.java +++ b/collections/UniqueWordsAlphabetic.java @@ -1,7 +1,7 @@ // collections/UniqueWordsAlphabetic.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Producing an alphabetic listing import java.util.*; import java.nio.file.*; diff --git a/com/mindviewinc/simple/List.java b/com/mindviewinc/simple/List.java index 8f9d5787b..6e59515e6 100644 --- a/com/mindviewinc/simple/List.java +++ b/com/mindviewinc/simple/List.java @@ -1,7 +1,7 @@ // com/mindviewinc/simple/List.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Creating a package package com.mindviewinc.simple; diff --git a/com/mindviewinc/simple/Vector.java b/com/mindviewinc/simple/Vector.java index 086b13392..a2fda6eee 100644 --- a/com/mindviewinc/simple/Vector.java +++ b/com/mindviewinc/simple/Vector.java @@ -1,7 +1,7 @@ // com/mindviewinc/simple/Vector.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Creating a package package com.mindviewinc.simple; diff --git a/compression/GZIPcompress.java b/compression/GZIPcompress.java index 7ab5c376e..170a8b9e3 100644 --- a/compression/GZIPcompress.java +++ b/compression/GZIPcompress.java @@ -1,7 +1,7 @@ // compression/GZIPcompress.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // {java GZIPcompress GZIPcompress.java} // {ValidateByHand} import java.util.zip.*; diff --git a/compression/ZipCompress.java b/compression/ZipCompress.java index 86631bbe6..86927f9c2 100644 --- a/compression/ZipCompress.java +++ b/compression/ZipCompress.java @@ -1,7 +1,7 @@ // compression/ZipCompress.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Uses Zip compression to compress any // number of files given on the command line // {java ZipCompress ZipCompress.java} diff --git a/control/BreakAndContinue.java b/control/BreakAndContinue.java index 82a369cc4..80a42c2f5 100644 --- a/control/BreakAndContinue.java +++ b/control/BreakAndContinue.java @@ -1,7 +1,7 @@ // control/BreakAndContinue.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Break and continue keywords import static onjava.Range.*; diff --git a/control/CommaOperator.java b/control/CommaOperator.java index 811637334..18d2caee5 100644 --- a/control/CommaOperator.java +++ b/control/CommaOperator.java @@ -1,7 +1,7 @@ // control/CommaOperator.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. public class CommaOperator { public static void main(String[] args) { diff --git a/control/ForInFloat.java b/control/ForInFloat.java index 3288b3fe9..8b3b4591a 100644 --- a/control/ForInFloat.java +++ b/control/ForInFloat.java @@ -1,7 +1,7 @@ // control/ForInFloat.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.util.*; public class ForInFloat { diff --git a/control/ForInInt.java b/control/ForInInt.java index bca55ebf7..b28ef53ec 100644 --- a/control/ForInInt.java +++ b/control/ForInInt.java @@ -1,7 +1,7 @@ // control/ForInInt.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import static onjava.Range.*; public class ForInInt { diff --git a/control/ForInString.java b/control/ForInString.java index 41d4de810..0ebbbb5a4 100644 --- a/control/ForInString.java +++ b/control/ForInString.java @@ -1,7 +1,7 @@ // control/ForInString.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. public class ForInString { public static void main(String[] args) { diff --git a/control/IfElse.java b/control/IfElse.java index 2aaa3bb11..279f8f5b3 100644 --- a/control/IfElse.java +++ b/control/IfElse.java @@ -1,7 +1,7 @@ // control/IfElse.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. public class IfElse { static int result = 0; diff --git a/control/LabeledFor.java b/control/LabeledFor.java index 4ce2ca01e..5f863c3b0 100644 --- a/control/LabeledFor.java +++ b/control/LabeledFor.java @@ -1,7 +1,7 @@ // control/LabeledFor.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // For loops with "labeled break" and "labeled continue." public class LabeledFor { diff --git a/control/LabeledWhile.java b/control/LabeledWhile.java index 4ebb27c57..4cc4f86b4 100644 --- a/control/LabeledWhile.java +++ b/control/LabeledWhile.java @@ -1,7 +1,7 @@ // control/LabeledWhile.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // "While" with "labeled break" and "labeled continue." public class LabeledWhile { diff --git a/control/ListCharacters.java b/control/ListCharacters.java index 281c9e4e7..3e08f5e9f 100644 --- a/control/ListCharacters.java +++ b/control/ListCharacters.java @@ -1,7 +1,7 @@ // control/ListCharacters.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // List all the lowercase ASCII letters public class ListCharacters { diff --git a/control/RandomBounds.java b/control/RandomBounds.java index 3ea7e9668..cb3b47b40 100644 --- a/control/RandomBounds.java +++ b/control/RandomBounds.java @@ -1,7 +1,7 @@ // control/RandomBounds.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Does Math.random() produce 0.0 and 1.0? // {java RandomBounds lower} import onjava.*; diff --git a/control/StringSwitch.java b/control/StringSwitch.java index 24772ca98..7771d0170 100644 --- a/control/StringSwitch.java +++ b/control/StringSwitch.java @@ -1,7 +1,7 @@ // control/StringSwitch.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. public class StringSwitch { public static void main(String[] args) { diff --git a/control/TestWithReturn.java b/control/TestWithReturn.java index 33c61893e..e6c609eaf 100644 --- a/control/TestWithReturn.java +++ b/control/TestWithReturn.java @@ -1,7 +1,7 @@ // control/TestWithReturn.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. public class TestWithReturn { static int test(int testval, int target) { diff --git a/control/TrueFalse.java b/control/TrueFalse.java index 9321ef1a1..89097229c 100644 --- a/control/TrueFalse.java +++ b/control/TrueFalse.java @@ -1,7 +1,7 @@ // control/TrueFalse.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. public class TrueFalse { public static void main(String[] args) { diff --git a/control/VowelsAndConsonants.java b/control/VowelsAndConsonants.java index fbe9a631d..2272bc100 100644 --- a/control/VowelsAndConsonants.java +++ b/control/VowelsAndConsonants.java @@ -1,7 +1,7 @@ // control/VowelsAndConsonants.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Demonstrates the switch statement import java.util.*; diff --git a/control/WhileTest.java b/control/WhileTest.java index a85418d75..b54450b05 100644 --- a/control/WhileTest.java +++ b/control/WhileTest.java @@ -1,7 +1,7 @@ // control/WhileTest.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Demonstrates the while loop public class WhileTest { diff --git a/enums/AlarmPoints.java b/enums/AlarmPoints.java index 84e95d3d0..b906a9ccc 100644 --- a/enums/AlarmPoints.java +++ b/enums/AlarmPoints.java @@ -1,7 +1,7 @@ // enums/AlarmPoints.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. package enums; public enum AlarmPoints { STAIR1, STAIR2, LOBBY, OFFICE1, OFFICE2, OFFICE3, diff --git a/enums/BigEnumSet.java b/enums/BigEnumSet.java index 4aabae130..565d99376 100644 --- a/enums/BigEnumSet.java +++ b/enums/BigEnumSet.java @@ -1,7 +1,7 @@ // enums/BigEnumSet.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.util.*; public class BigEnumSet { diff --git a/enums/Burrito.java b/enums/Burrito.java index aff22b78a..25e1ac644 100644 --- a/enums/Burrito.java +++ b/enums/Burrito.java @@ -1,7 +1,7 @@ // enums/Burrito.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // {java enums.Burrito} package enums; import static enums.Spiciness.*; diff --git a/enums/CarWash.java b/enums/CarWash.java index 47c9f9e3c..bb478cf1e 100644 --- a/enums/CarWash.java +++ b/enums/CarWash.java @@ -1,7 +1,7 @@ // enums/CarWash.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.util.*; public class CarWash { diff --git a/enums/Competitor.java b/enums/Competitor.java index 234008d4f..e25cadbb1 100644 --- a/enums/Competitor.java +++ b/enums/Competitor.java @@ -1,7 +1,7 @@ // enums/Competitor.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Switching one enum on another package enums; diff --git a/enums/ConstantSpecificMethod.java b/enums/ConstantSpecificMethod.java index 0946337ba..80f9c12f1 100644 --- a/enums/ConstantSpecificMethod.java +++ b/enums/ConstantSpecificMethod.java @@ -1,7 +1,7 @@ // enums/ConstantSpecificMethod.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.util.*; import java.text.*; diff --git a/enums/EnumClass.java b/enums/EnumClass.java index e44203d3f..c92bab209 100644 --- a/enums/EnumClass.java +++ b/enums/EnumClass.java @@ -1,7 +1,7 @@ // enums/EnumClass.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Capabilities of the Enum class enum Shrubbery { GROUND, CRAWLING, HANGING } diff --git a/enums/EnumMaps.java b/enums/EnumMaps.java index 3698f85f3..b041bbf7f 100644 --- a/enums/EnumMaps.java +++ b/enums/EnumMaps.java @@ -1,7 +1,7 @@ // enums/EnumMaps.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Basics of EnumMaps // {java enums.EnumMaps} package enums; diff --git a/enums/EnumSets.java b/enums/EnumSets.java index f394b1dbc..58cd71847 100644 --- a/enums/EnumSets.java +++ b/enums/EnumSets.java @@ -1,7 +1,7 @@ // enums/EnumSets.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Operations on EnumSets // {java enums.EnumSets} package enums; diff --git a/enums/Input.java b/enums/Input.java index 56dc2dc90..db6f52cc0 100644 --- a/enums/Input.java +++ b/enums/Input.java @@ -1,7 +1,7 @@ // enums/Input.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.util.*; public enum Input { diff --git a/enums/NonEnum.java b/enums/NonEnum.java index ddfcc0ad2..4011afca2 100644 --- a/enums/NonEnum.java +++ b/enums/NonEnum.java @@ -1,7 +1,7 @@ // enums/NonEnum.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. public class NonEnum { public static void main(String[] args) { diff --git a/enums/NotClasses.java b/enums/NotClasses.java index 810e6d052..049704ab6 100644 --- a/enums/NotClasses.java +++ b/enums/NotClasses.java @@ -1,7 +1,7 @@ // enums/NotClasses.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // {javap -c LikeClasses} enum LikeClasses { diff --git a/enums/Outcome.java b/enums/Outcome.java index 5255ee6ea..4d8448d9b 100644 --- a/enums/Outcome.java +++ b/enums/Outcome.java @@ -1,6 +1,6 @@ // enums/Outcome.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. package enums; public enum Outcome { WIN, LOSE, DRAW } diff --git a/enums/OverrideConstantSpecific.java b/enums/OverrideConstantSpecific.java index d3a9824db..62f4d2a1c 100644 --- a/enums/OverrideConstantSpecific.java +++ b/enums/OverrideConstantSpecific.java @@ -1,7 +1,7 @@ // enums/OverrideConstantSpecific.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. public enum OverrideConstantSpecific { NUT, BOLT, diff --git a/enums/OzWitch.java b/enums/OzWitch.java index 9d56b7fb3..b7df47ade 100644 --- a/enums/OzWitch.java +++ b/enums/OzWitch.java @@ -1,7 +1,7 @@ // enums/OzWitch.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // The witches in the land of Oz public enum OzWitch { diff --git a/enums/PostOffice.java b/enums/PostOffice.java index b975b9048..6be649315 100644 --- a/enums/PostOffice.java +++ b/enums/PostOffice.java @@ -1,7 +1,7 @@ // enums/PostOffice.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Modeling a post office import java.util.*; import onjava.*; diff --git a/enums/RandomTest.java b/enums/RandomTest.java index aae5cabaa..874be3163 100644 --- a/enums/RandomTest.java +++ b/enums/RandomTest.java @@ -1,7 +1,7 @@ // enums/RandomTest.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import onjava.*; enum Activity { SITTING, LYING, STANDING, HOPPING, diff --git a/enums/Reflection.java b/enums/Reflection.java index 88601c963..8e6b93077 100644 --- a/enums/Reflection.java +++ b/enums/Reflection.java @@ -1,7 +1,7 @@ // enums/Reflection.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Analyzing enums using reflection import java.lang.reflect.*; import java.util.*; diff --git a/enums/RoShamBo.java b/enums/RoShamBo.java index 168b32020..ed8d47820 100644 --- a/enums/RoShamBo.java +++ b/enums/RoShamBo.java @@ -1,7 +1,7 @@ // enums/RoShamBo.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Common tools for RoShamBo examples package enums; import onjava.*; diff --git a/enums/RoShamBo1.java b/enums/RoShamBo1.java index 4dc1c3d5b..bb141c81b 100644 --- a/enums/RoShamBo1.java +++ b/enums/RoShamBo1.java @@ -1,7 +1,7 @@ // enums/RoShamBo1.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Demonstration of multiple dispatching // {java enums.RoShamBo1} package enums; diff --git a/enums/RoShamBo2.java b/enums/RoShamBo2.java index 0da102e40..432051766 100644 --- a/enums/RoShamBo2.java +++ b/enums/RoShamBo2.java @@ -1,7 +1,7 @@ // enums/RoShamBo2.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Switching one enum on another // {java enums.RoShamBo2} package enums; diff --git a/enums/RoShamBo3.java b/enums/RoShamBo3.java index c502f65fa..1a25b9069 100644 --- a/enums/RoShamBo3.java +++ b/enums/RoShamBo3.java @@ -1,7 +1,7 @@ // enums/RoShamBo3.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Using constant-specific methods // {java enums.RoShamBo3} package enums; diff --git a/enums/RoShamBo4.java b/enums/RoShamBo4.java index 60d9f25c8..e76ddfefc 100644 --- a/enums/RoShamBo4.java +++ b/enums/RoShamBo4.java @@ -1,7 +1,7 @@ // enums/RoShamBo4.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // {java enums.RoShamBo4} package enums; diff --git a/enums/RoShamBo5.java b/enums/RoShamBo5.java index 2206d181d..2d5114f71 100644 --- a/enums/RoShamBo5.java +++ b/enums/RoShamBo5.java @@ -1,7 +1,7 @@ // enums/RoShamBo5.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Multiple dispatching using an EnumMap of EnumMaps // {java enums.RoShamBo5} package enums; diff --git a/enums/RoShamBo6.java b/enums/RoShamBo6.java index a74784c05..99c4ec8b9 100644 --- a/enums/RoShamBo6.java +++ b/enums/RoShamBo6.java @@ -1,7 +1,7 @@ // enums/RoShamBo6.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Enums using "tables" instead of multiple dispatch // {java enums.RoShamBo6} package enums; diff --git a/enums/SecurityCategory.java b/enums/SecurityCategory.java index 469af033a..2ba65569d 100644 --- a/enums/SecurityCategory.java +++ b/enums/SecurityCategory.java @@ -1,7 +1,7 @@ // enums/SecurityCategory.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // More succinct subcategorization of enums import onjava.*; diff --git a/enums/SpaceShip.java b/enums/SpaceShip.java index 9ff2e3b76..22cd8f8b7 100644 --- a/enums/SpaceShip.java +++ b/enums/SpaceShip.java @@ -1,7 +1,7 @@ // enums/SpaceShip.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.util.stream.*; public enum SpaceShip { diff --git a/enums/Spiciness.java b/enums/Spiciness.java index 5eedaf3e7..43aefdf2f 100644 --- a/enums/Spiciness.java +++ b/enums/Spiciness.java @@ -1,7 +1,7 @@ // enums/Spiciness.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. package enums; public enum Spiciness { diff --git a/enums/TrafficLight.java b/enums/TrafficLight.java index f315f8d27..4ca4813dd 100644 --- a/enums/TrafficLight.java +++ b/enums/TrafficLight.java @@ -1,7 +1,7 @@ // enums/TrafficLight.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Enums in switch statements // Define an enum type: diff --git a/enums/UpcastEnum.java b/enums/UpcastEnum.java index 85745cecd..d5cca2c97 100644 --- a/enums/UpcastEnum.java +++ b/enums/UpcastEnum.java @@ -1,7 +1,7 @@ // enums/UpcastEnum.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // No values() method if you upcast an enum enum Search { HITHER, YON } diff --git a/enums/VendingMachine.java b/enums/VendingMachine.java index d78fde2e3..db27a45a0 100644 --- a/enums/VendingMachine.java +++ b/enums/VendingMachine.java @@ -1,7 +1,7 @@ // enums/VendingMachine.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // {java VendingMachine VendingMachineInput.txt} import java.util.*; import java.io.IOException; diff --git a/enums/cartoons/EnumImplementation.java b/enums/cartoons/EnumImplementation.java index 40cd6cfb9..15a7c24af 100644 --- a/enums/cartoons/EnumImplementation.java +++ b/enums/cartoons/EnumImplementation.java @@ -1,7 +1,7 @@ // enums/cartoons/EnumImplementation.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // An enum can implement an interface // {java enums.cartoons.EnumImplementation} package enums.cartoons; diff --git a/enums/menu/Course.java b/enums/menu/Course.java index ed5ae1d9f..ea97f62da 100644 --- a/enums/menu/Course.java +++ b/enums/menu/Course.java @@ -1,7 +1,7 @@ // enums/menu/Course.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. package enums.menu; import onjava.*; diff --git a/enums/menu/Food.java b/enums/menu/Food.java index 4c2266789..49db38678 100644 --- a/enums/menu/Food.java +++ b/enums/menu/Food.java @@ -1,7 +1,7 @@ // enums/menu/Food.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Subcategorization of enums within interfaces package enums.menu; diff --git a/enums/menu/Meal.java b/enums/menu/Meal.java index 2baab82d1..efb3b40b1 100644 --- a/enums/menu/Meal.java +++ b/enums/menu/Meal.java @@ -1,7 +1,7 @@ // enums/menu/Meal.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // {java enums.menu.Meal} package enums.menu; diff --git a/enums/menu/Meal2.java b/enums/menu/Meal2.java index 52737655f..2214a94c9 100644 --- a/enums/menu/Meal2.java +++ b/enums/menu/Meal2.java @@ -1,7 +1,7 @@ // enums/menu/Meal2.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // {java enums.menu.Meal2} package enums.menu; import onjava.*; diff --git a/enums/menu/TypeOfFood.java b/enums/menu/TypeOfFood.java index c40175596..6e5ba899f 100644 --- a/enums/menu/TypeOfFood.java +++ b/enums/menu/TypeOfFood.java @@ -1,7 +1,7 @@ // enums/menu/TypeOfFood.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // {java enums.menu.TypeOfFood} package enums.menu; import static enums.menu.Food.*; diff --git a/exceptions/AlwaysFinally.java b/exceptions/AlwaysFinally.java index 29ab2b7ee..16f2333ee 100644 --- a/exceptions/AlwaysFinally.java +++ b/exceptions/AlwaysFinally.java @@ -1,7 +1,7 @@ // exceptions/AlwaysFinally.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Finally is always executed class FourException extends Exception {} diff --git a/exceptions/AutoCloseableDetails.java b/exceptions/AutoCloseableDetails.java index af4981505..76c67af66 100644 --- a/exceptions/AutoCloseableDetails.java +++ b/exceptions/AutoCloseableDetails.java @@ -1,7 +1,7 @@ // exceptions/AutoCloseableDetails.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. class Reporter implements AutoCloseable { String name = getClass().getSimpleName(); diff --git a/exceptions/BodyException.java b/exceptions/BodyException.java index 7b0fce9ee..38679bb24 100644 --- a/exceptions/BodyException.java +++ b/exceptions/BodyException.java @@ -1,7 +1,7 @@ // exceptions/BodyException.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. class Third extends Reporter {} diff --git a/exceptions/Cleanup.java b/exceptions/Cleanup.java index 43be678fe..fe29d6b1e 100644 --- a/exceptions/Cleanup.java +++ b/exceptions/Cleanup.java @@ -1,7 +1,7 @@ // exceptions/Cleanup.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Guaranteeing proper cleanup of a resource public class Cleanup { diff --git a/exceptions/CleanupIdiom.java b/exceptions/CleanupIdiom.java index 2728d0458..75613e48c 100644 --- a/exceptions/CleanupIdiom.java +++ b/exceptions/CleanupIdiom.java @@ -1,7 +1,7 @@ // exceptions/CleanupIdiom.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Disposable objects must be followed by a try-finally class NeedsCleanup { // Construction can't fail diff --git a/exceptions/CloseExceptions.java b/exceptions/CloseExceptions.java index 6c72df2ba..638aa0cd4 100644 --- a/exceptions/CloseExceptions.java +++ b/exceptions/CloseExceptions.java @@ -1,7 +1,7 @@ // exceptions/CloseExceptions.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. class CloseException extends Exception {} diff --git a/exceptions/ConstructorException.java b/exceptions/ConstructorException.java index 4a56f0d17..09ec36fc8 100644 --- a/exceptions/ConstructorException.java +++ b/exceptions/ConstructorException.java @@ -1,7 +1,7 @@ // exceptions/ConstructorException.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. class CE extends Exception {} diff --git a/exceptions/DynamicFields.java b/exceptions/DynamicFields.java index 1e115500f..0aa7056d9 100644 --- a/exceptions/DynamicFields.java +++ b/exceptions/DynamicFields.java @@ -1,7 +1,7 @@ // exceptions/DynamicFields.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // A Class that dynamically adds fields to itself to // demonstrate exception chaining diff --git a/exceptions/ExceptionMethods.java b/exceptions/ExceptionMethods.java index ac4c62610..b8067424f 100644 --- a/exceptions/ExceptionMethods.java +++ b/exceptions/ExceptionMethods.java @@ -1,7 +1,7 @@ // exceptions/ExceptionMethods.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Demonstrating the Exception Methods public class ExceptionMethods { diff --git a/exceptions/ExceptionSilencer.java b/exceptions/ExceptionSilencer.java index d65a3b5a4..d0e8df611 100644 --- a/exceptions/ExceptionSilencer.java +++ b/exceptions/ExceptionSilencer.java @@ -1,7 +1,7 @@ // exceptions/ExceptionSilencer.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. public class ExceptionSilencer { public static void main(String[] args) { diff --git a/exceptions/ExtraFeatures.java b/exceptions/ExtraFeatures.java index 1dc318f05..04c0f59ba 100644 --- a/exceptions/ExtraFeatures.java +++ b/exceptions/ExtraFeatures.java @@ -1,7 +1,7 @@ // exceptions/ExtraFeatures.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Further embellishment of exception classes class MyException2 extends Exception { diff --git a/exceptions/FinallyWorks.java b/exceptions/FinallyWorks.java index 9856af23f..9c3a6c239 100644 --- a/exceptions/FinallyWorks.java +++ b/exceptions/FinallyWorks.java @@ -1,7 +1,7 @@ // exceptions/FinallyWorks.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // The finally clause is always executed class ThreeException extends Exception {} diff --git a/exceptions/FullConstructors.java b/exceptions/FullConstructors.java index 2bff925aa..9936573bd 100644 --- a/exceptions/FullConstructors.java +++ b/exceptions/FullConstructors.java @@ -1,7 +1,7 @@ // exceptions/FullConstructors.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. class MyException extends Exception { public MyException() {} diff --git a/exceptions/Human.java b/exceptions/Human.java index a382a908c..b989c268f 100644 --- a/exceptions/Human.java +++ b/exceptions/Human.java @@ -1,7 +1,7 @@ // exceptions/Human.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Catching exception hierarchies class Annoyance extends Exception {} diff --git a/exceptions/InheritingExceptions.java b/exceptions/InheritingExceptions.java index 2e853411b..55a7a2510 100644 --- a/exceptions/InheritingExceptions.java +++ b/exceptions/InheritingExceptions.java @@ -1,7 +1,7 @@ // exceptions/InheritingExceptions.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Creating your own exceptions class SimpleException extends Exception {} diff --git a/exceptions/InputFile.java b/exceptions/InputFile.java index 7522d8488..a9fba8de6 100644 --- a/exceptions/InputFile.java +++ b/exceptions/InputFile.java @@ -1,7 +1,7 @@ // exceptions/InputFile.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Paying attention to exceptions in constructors import java.io.*; diff --git a/exceptions/InputFile2.java b/exceptions/InputFile2.java index 2544da604..834547cce 100644 --- a/exceptions/InputFile2.java +++ b/exceptions/InputFile2.java @@ -1,7 +1,7 @@ // exceptions/InputFile2.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.io.*; import java.nio.file.*; import java.util.stream.*; diff --git a/exceptions/LoggingExceptions.java b/exceptions/LoggingExceptions.java index 6797400f5..d279388fd 100644 --- a/exceptions/LoggingExceptions.java +++ b/exceptions/LoggingExceptions.java @@ -1,7 +1,7 @@ // exceptions/LoggingExceptions.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // An exception that reports through a Logger // {ErrorOutputExpected} import java.util.logging.*; diff --git a/exceptions/LoggingExceptions2.java b/exceptions/LoggingExceptions2.java index ab99446cb..586622e7b 100644 --- a/exceptions/LoggingExceptions2.java +++ b/exceptions/LoggingExceptions2.java @@ -1,7 +1,7 @@ // exceptions/LoggingExceptions2.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Logging caught exceptions // {ErrorOutputExpected} import java.util.logging.*; diff --git a/exceptions/LostMessage.java b/exceptions/LostMessage.java index e4876e670..145cc85fb 100644 --- a/exceptions/LostMessage.java +++ b/exceptions/LostMessage.java @@ -1,7 +1,7 @@ // exceptions/LostMessage.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // How an exception can be lost class VeryImportantException extends Exception { diff --git a/exceptions/MainException.java b/exceptions/MainException.java index d42e01a8b..7749aa2a0 100644 --- a/exceptions/MainException.java +++ b/exceptions/MainException.java @@ -1,7 +1,7 @@ // exceptions/MainException.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.util.*; import java.nio.file.*; diff --git a/exceptions/MessyExceptions.java b/exceptions/MessyExceptions.java index a672556ce..25c0648e4 100644 --- a/exceptions/MessyExceptions.java +++ b/exceptions/MessyExceptions.java @@ -1,7 +1,7 @@ // exceptions/MessyExceptions.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.io.*; public class MessyExceptions { diff --git a/exceptions/MultiCatch.java b/exceptions/MultiCatch.java index 74e3667bb..76405b438 100644 --- a/exceptions/MultiCatch.java +++ b/exceptions/MultiCatch.java @@ -1,7 +1,7 @@ // exceptions/MultiCatch.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. public class MultiCatch { void x() throws Except1, Except2, Except3, Except4 {} diff --git a/exceptions/MultiCatch2.java b/exceptions/MultiCatch2.java index b997d48e9..8e4914057 100644 --- a/exceptions/MultiCatch2.java +++ b/exceptions/MultiCatch2.java @@ -1,7 +1,7 @@ // exceptions/MultiCatch2.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. public class MultiCatch2 { void x() throws Except1, Except2, Except3, Except4 {} diff --git a/exceptions/MultipleReturns.java b/exceptions/MultipleReturns.java index 0b201f724..cea553556 100644 --- a/exceptions/MultipleReturns.java +++ b/exceptions/MultipleReturns.java @@ -1,7 +1,7 @@ // exceptions/MultipleReturns.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. public class MultipleReturns { public static void f(int i) { diff --git a/exceptions/NeverCaught.java b/exceptions/NeverCaught.java index 974ccecdb..96d2129fb 100644 --- a/exceptions/NeverCaught.java +++ b/exceptions/NeverCaught.java @@ -1,7 +1,7 @@ // exceptions/NeverCaught.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Ignoring RuntimeExceptions // {ThrowsException} diff --git a/exceptions/OnOffException1.java b/exceptions/OnOffException1.java index e459aad26..9ff3e1afb 100644 --- a/exceptions/OnOffException1.java +++ b/exceptions/OnOffException1.java @@ -1,5 +1,5 @@ // exceptions/OnOffException1.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. public class OnOffException1 extends Exception {} diff --git a/exceptions/OnOffException2.java b/exceptions/OnOffException2.java index 22c0b6af1..cc76b45b8 100644 --- a/exceptions/OnOffException2.java +++ b/exceptions/OnOffException2.java @@ -1,5 +1,5 @@ // exceptions/OnOffException2.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. public class OnOffException2 extends Exception {} diff --git a/exceptions/OnOffSwitch.java b/exceptions/OnOffSwitch.java index cee3501b9..756da1485 100644 --- a/exceptions/OnOffSwitch.java +++ b/exceptions/OnOffSwitch.java @@ -1,7 +1,7 @@ // exceptions/OnOffSwitch.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Why use finally? public class OnOffSwitch { diff --git a/exceptions/PreciseRethrow.java b/exceptions/PreciseRethrow.java index 81f0a1cce..c5164e0e2 100644 --- a/exceptions/PreciseRethrow.java +++ b/exceptions/PreciseRethrow.java @@ -1,7 +1,7 @@ // exceptions/PreciseRethrow.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. class BaseException extends Exception {} class DerivedException extends BaseException {} diff --git a/exceptions/RethrowNew.java b/exceptions/RethrowNew.java index 8e327ffb9..fc174920f 100644 --- a/exceptions/RethrowNew.java +++ b/exceptions/RethrowNew.java @@ -1,7 +1,7 @@ // exceptions/RethrowNew.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Rethrow a different object from the one you caught class OneException extends Exception { diff --git a/exceptions/Rethrowing.java b/exceptions/Rethrowing.java index 734a61806..869dc9242 100644 --- a/exceptions/Rethrowing.java +++ b/exceptions/Rethrowing.java @@ -1,7 +1,7 @@ // exceptions/Rethrowing.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Demonstrating fillInStackTrace() public class Rethrowing { diff --git a/exceptions/SameHandler.java b/exceptions/SameHandler.java index 9b319bfa9..230083d6d 100644 --- a/exceptions/SameHandler.java +++ b/exceptions/SameHandler.java @@ -1,7 +1,7 @@ // exceptions/SameHandler.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. class EBase1 extends Exception {} class Except1 extends EBase1 {} diff --git a/exceptions/StormyInning.java b/exceptions/StormyInning.java index 6a792bd2d..c1db52223 100644 --- a/exceptions/StormyInning.java +++ b/exceptions/StormyInning.java @@ -1,7 +1,7 @@ // exceptions/StormyInning.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Overridden methods can throw only the exceptions // specified in their base-class versions, or exceptions // derived from the base-class exceptions diff --git a/exceptions/StreamsAreAutoCloseable.java b/exceptions/StreamsAreAutoCloseable.java index 0fc3617c9..8c69144ed 100644 --- a/exceptions/StreamsAreAutoCloseable.java +++ b/exceptions/StreamsAreAutoCloseable.java @@ -1,7 +1,7 @@ // exceptions/StreamsAreAutoCloseable.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.io.*; import java.nio.file.*; import java.util.stream.*; diff --git a/exceptions/Switch.java b/exceptions/Switch.java index ead8ba04a..d525ac3cb 100644 --- a/exceptions/Switch.java +++ b/exceptions/Switch.java @@ -1,7 +1,7 @@ // exceptions/Switch.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. public class Switch { private boolean state = false; diff --git a/exceptions/TryAnything.java b/exceptions/TryAnything.java index bef675732..edf0d1e65 100644 --- a/exceptions/TryAnything.java +++ b/exceptions/TryAnything.java @@ -1,7 +1,7 @@ // exceptions/TryAnything.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // {CompileTimeError} (Will not compile) class Anything {} diff --git a/exceptions/TryWithResources.java b/exceptions/TryWithResources.java index 367b1626d..776ebe38c 100644 --- a/exceptions/TryWithResources.java +++ b/exceptions/TryWithResources.java @@ -1,7 +1,7 @@ // exceptions/TryWithResources.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.io.*; public class TryWithResources { diff --git a/exceptions/TurnOffChecking.java b/exceptions/TurnOffChecking.java index 7f916aee2..4ad43fb3f 100644 --- a/exceptions/TurnOffChecking.java +++ b/exceptions/TurnOffChecking.java @@ -1,7 +1,7 @@ // exceptions/TurnOffChecking.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // "Turning off" Checked exceptions import java.io.*; diff --git a/exceptions/WhoCalled.java b/exceptions/WhoCalled.java index dbe1ff7c8..a3d18973a 100644 --- a/exceptions/WhoCalled.java +++ b/exceptions/WhoCalled.java @@ -1,7 +1,7 @@ // exceptions/WhoCalled.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Programmatic access to stack trace information public class WhoCalled { diff --git a/exceptions/WithFinally.java b/exceptions/WithFinally.java index 40bb5c276..e699d4f71 100644 --- a/exceptions/WithFinally.java +++ b/exceptions/WithFinally.java @@ -1,7 +1,7 @@ // exceptions/WithFinally.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Finally Guarantees cleanup public class WithFinally { diff --git a/files/AddAndSubtractPaths.java b/files/AddAndSubtractPaths.java index 55506f698..c8587fcde 100644 --- a/files/AddAndSubtractPaths.java +++ b/files/AddAndSubtractPaths.java @@ -1,7 +1,7 @@ // files/AddAndSubtractPaths.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.nio.file.*; import java.io.IOException; diff --git a/files/Directories.java b/files/Directories.java index 62724c3e9..2b26fa605 100644 --- a/files/Directories.java +++ b/files/Directories.java @@ -1,7 +1,7 @@ // files/Directories.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.util.*; import java.nio.file.*; import onjava.RmDir; diff --git a/files/File_System.java b/files/File_System.java index 24014ae22..b8cf516a0 100644 --- a/files/File_System.java +++ b/files/File_System.java @@ -1,7 +1,7 @@ // files/File_System.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.nio.file.*; public class File_System { diff --git a/files/Find.java b/files/Find.java index 35d0b4d3d..57b0d8d87 100644 --- a/files/Find.java +++ b/files/Find.java @@ -1,7 +1,7 @@ // files/Find.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.nio.file.*; public class Find { diff --git a/files/ListOfLines.java b/files/ListOfLines.java index 21c4ebc0b..d3f8f5590 100644 --- a/files/ListOfLines.java +++ b/files/ListOfLines.java @@ -1,7 +1,7 @@ // files/ListOfLines.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.util.*; import java.nio.file.*; diff --git a/files/PartsOfPaths.java b/files/PartsOfPaths.java index 3122a05d7..f7ba7a01c 100644 --- a/files/PartsOfPaths.java +++ b/files/PartsOfPaths.java @@ -1,7 +1,7 @@ // files/PartsOfPaths.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.nio.file.*; public class PartsOfPaths { diff --git a/files/PathAnalysis.java b/files/PathAnalysis.java index 71e7ec36c..c5e5a22fd 100644 --- a/files/PathAnalysis.java +++ b/files/PathAnalysis.java @@ -1,7 +1,7 @@ // files/PathAnalysis.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.nio.file.*; import java.io.IOException; diff --git a/files/PathInfo.java b/files/PathInfo.java index 2dcdc1b04..7c77775af 100644 --- a/files/PathInfo.java +++ b/files/PathInfo.java @@ -1,7 +1,7 @@ // files/PathInfo.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.nio.file.*; import java.net.URI; import java.io.File; diff --git a/files/PathWatcher.java b/files/PathWatcher.java index bee1dcddf..c22751c29 100644 --- a/files/PathWatcher.java +++ b/files/PathWatcher.java @@ -1,7 +1,7 @@ // files/PathWatcher.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.io.IOException; import java.nio.file.*; import static java.nio.file.StandardWatchEventKinds.*; diff --git a/files/ReadLineStream.java b/files/ReadLineStream.java index be32d9d05..efb266fcd 100644 --- a/files/ReadLineStream.java +++ b/files/ReadLineStream.java @@ -1,7 +1,7 @@ // files/ReadLineStream.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.nio.file.*; public class ReadLineStream { diff --git a/files/StreamInAndOut.java b/files/StreamInAndOut.java index 6210addbb..27682fffa 100644 --- a/files/StreamInAndOut.java +++ b/files/StreamInAndOut.java @@ -1,7 +1,7 @@ // files/StreamInAndOut.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.io.*; import java.nio.file.*; import java.util.stream.*; diff --git a/files/TreeWatcher.java b/files/TreeWatcher.java index 53915d880..e45c46b7c 100644 --- a/files/TreeWatcher.java +++ b/files/TreeWatcher.java @@ -1,7 +1,7 @@ // files/TreeWatcher.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.io.IOException; import java.nio.file.*; import static java.nio.file.StandardWatchEventKinds.*; diff --git a/files/Writing.java b/files/Writing.java index f26d1fb4e..40a6a99a6 100644 --- a/files/Writing.java +++ b/files/Writing.java @@ -1,7 +1,7 @@ // files/Writing.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.util.*; import java.nio.file.*; diff --git a/functional/AnonymousClosure.java b/functional/AnonymousClosure.java index 9f5b46458..1a1ba346a 100644 --- a/functional/AnonymousClosure.java +++ b/functional/AnonymousClosure.java @@ -1,7 +1,7 @@ // functional/AnonymousClosure.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.util.function.*; public class AnonymousClosure { diff --git a/functional/BiConsumerPermutations.java b/functional/BiConsumerPermutations.java index e9f63225c..3cd01a338 100644 --- a/functional/BiConsumerPermutations.java +++ b/functional/BiConsumerPermutations.java @@ -1,7 +1,7 @@ // functional/BiConsumerPermutations.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.util.function.*; public class BiConsumerPermutations { diff --git a/functional/ClassFunctionals.java b/functional/ClassFunctionals.java index 112a74640..eb3cbdc7c 100644 --- a/functional/ClassFunctionals.java +++ b/functional/ClassFunctionals.java @@ -1,7 +1,7 @@ // functional/ClassFunctionals.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.util.*; import java.util.function.*; diff --git a/functional/Closure1.java b/functional/Closure1.java index c20798cd4..505009d2c 100644 --- a/functional/Closure1.java +++ b/functional/Closure1.java @@ -1,7 +1,7 @@ // functional/Closure1.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.util.function.*; public class Closure1 { diff --git a/functional/Closure2.java b/functional/Closure2.java index 6e1986021..cdcd9cf3f 100644 --- a/functional/Closure2.java +++ b/functional/Closure2.java @@ -1,7 +1,7 @@ // functional/Closure2.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.util.function.*; public class Closure2 { diff --git a/functional/Closure3.java b/functional/Closure3.java index 7700838ba..25fd443f2 100644 --- a/functional/Closure3.java +++ b/functional/Closure3.java @@ -1,7 +1,7 @@ // functional/Closure3.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // {CompileTimeError} (Will not compile) import java.util.function.*; diff --git a/functional/Closure4.java b/functional/Closure4.java index c253aaf86..96cdd3b97 100644 --- a/functional/Closure4.java +++ b/functional/Closure4.java @@ -1,7 +1,7 @@ // functional/Closure4.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.util.function.*; public class Closure4 { diff --git a/functional/Closure5.java b/functional/Closure5.java index d16d1e3c7..82fba7312 100644 --- a/functional/Closure5.java +++ b/functional/Closure5.java @@ -1,7 +1,7 @@ // functional/Closure5.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // {CompileTimeError} (Will not compile) import java.util.function.*; diff --git a/functional/Closure6.java b/functional/Closure6.java index 0251a3e6d..6f116d954 100644 --- a/functional/Closure6.java +++ b/functional/Closure6.java @@ -1,7 +1,7 @@ // functional/Closure6.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.util.function.*; public class Closure6 { diff --git a/functional/Closure7.java b/functional/Closure7.java index e0036ece0..4ccb0e92b 100644 --- a/functional/Closure7.java +++ b/functional/Closure7.java @@ -1,7 +1,7 @@ // functional/Closure7.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // {CompileTimeError} (Will not compile) import java.util.function.*; diff --git a/functional/Closure8.java b/functional/Closure8.java index 655dcf45f..8ecb583bd 100644 --- a/functional/Closure8.java +++ b/functional/Closure8.java @@ -1,7 +1,7 @@ // functional/Closure8.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.util.*; import java.util.function.*; diff --git a/functional/Closure9.java b/functional/Closure9.java index 391f042fb..6ed827f85 100644 --- a/functional/Closure9.java +++ b/functional/Closure9.java @@ -1,7 +1,7 @@ // functional/Closure9.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // {CompileTimeError} (Will not compile) import java.util.*; import java.util.function.*; diff --git a/functional/ConsumeFunction.java b/functional/ConsumeFunction.java index 9da3e2ceb..f7eb9a1a4 100644 --- a/functional/ConsumeFunction.java +++ b/functional/ConsumeFunction.java @@ -1,7 +1,7 @@ // functional/ConsumeFunction.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.util.function.*; class One {} diff --git a/functional/CtorReference.java b/functional/CtorReference.java index 7027d6e1f..fcf8ea753 100644 --- a/functional/CtorReference.java +++ b/functional/CtorReference.java @@ -1,7 +1,7 @@ // functional/CtorReference.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. class Dog { String name; diff --git a/functional/CurriedIntAdd.java b/functional/CurriedIntAdd.java index 041a94bef..98c740d15 100644 --- a/functional/CurriedIntAdd.java +++ b/functional/CurriedIntAdd.java @@ -1,7 +1,7 @@ // functional/CurriedIntAdd.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.util.function.*; public class CurriedIntAdd { diff --git a/functional/Curry3Args.java b/functional/Curry3Args.java index 44dc342ce..8055e3b36 100644 --- a/functional/Curry3Args.java +++ b/functional/Curry3Args.java @@ -1,7 +1,7 @@ // functional/Curry3Args.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.util.function.*; public class Curry3Args { diff --git a/functional/CurryingAndPartials.java b/functional/CurryingAndPartials.java index 01b45f671..aa5f74578 100644 --- a/functional/CurryingAndPartials.java +++ b/functional/CurryingAndPartials.java @@ -1,7 +1,7 @@ // functional/CurryingAndPartials.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.util.function.*; public class CurryingAndPartials { diff --git a/functional/FunctionComposition.java b/functional/FunctionComposition.java index 9caed6dcc..49bdcc07b 100644 --- a/functional/FunctionComposition.java +++ b/functional/FunctionComposition.java @@ -1,7 +1,7 @@ // functional/FunctionComposition.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.util.function.*; public class FunctionComposition { diff --git a/functional/FunctionVariants.java b/functional/FunctionVariants.java index ae6f544eb..d78932ca3 100644 --- a/functional/FunctionVariants.java +++ b/functional/FunctionVariants.java @@ -1,7 +1,7 @@ // functional/FunctionVariants.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.util.function.*; class Foo {} diff --git a/functional/FunctionWithWrapped.java b/functional/FunctionWithWrapped.java index 9f493f17f..5f43734ae 100644 --- a/functional/FunctionWithWrapped.java +++ b/functional/FunctionWithWrapped.java @@ -1,7 +1,7 @@ // functional/FunctionWithWrapped.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.util.function.*; public class FunctionWithWrapped { diff --git a/functional/FunctionalAnnotation.java b/functional/FunctionalAnnotation.java index 780bf78ee..31bc7d252 100644 --- a/functional/FunctionalAnnotation.java +++ b/functional/FunctionalAnnotation.java @@ -1,7 +1,7 @@ // functional/FunctionalAnnotation.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. @FunctionalInterface interface Functional { diff --git a/functional/IntCall.java b/functional/IntCall.java index ed62e3073..9748742f2 100644 --- a/functional/IntCall.java +++ b/functional/IntCall.java @@ -1,7 +1,7 @@ // functional/IntCall.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. interface IntCall { int call(int arg); diff --git a/functional/LambdaExpressions.java b/functional/LambdaExpressions.java index 23245a113..adb3f5da8 100644 --- a/functional/LambdaExpressions.java +++ b/functional/LambdaExpressions.java @@ -1,7 +1,7 @@ // functional/LambdaExpressions.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. interface Description { String brief(); diff --git a/functional/MethodConversion.java b/functional/MethodConversion.java index 2b6a7117e..e33c9a825 100644 --- a/functional/MethodConversion.java +++ b/functional/MethodConversion.java @@ -1,7 +1,7 @@ // functional/MethodConversion.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.util.function.*; class In1 {} diff --git a/functional/MethodReferences.java b/functional/MethodReferences.java index c2e4176f1..5becd3715 100644 --- a/functional/MethodReferences.java +++ b/functional/MethodReferences.java @@ -1,7 +1,7 @@ // functional/MethodReferences.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.util.*; interface Callable { // (1) diff --git a/functional/MultiUnbound.java b/functional/MultiUnbound.java index db0aef3d6..fa2ada8fc 100644 --- a/functional/MultiUnbound.java +++ b/functional/MultiUnbound.java @@ -1,7 +1,7 @@ // functional/MultiUnbound.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Unbound methods with multiple arguments class This { diff --git a/functional/PredicateComposition.java b/functional/PredicateComposition.java index 841ccf6b3..1a8bbf3ae 100644 --- a/functional/PredicateComposition.java +++ b/functional/PredicateComposition.java @@ -1,7 +1,7 @@ // functional/PredicateComposition.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.util.function.*; import java.util.stream.*; diff --git a/functional/ProduceFunction.java b/functional/ProduceFunction.java index 79f0c9c7e..5b2ce9ad5 100644 --- a/functional/ProduceFunction.java +++ b/functional/ProduceFunction.java @@ -1,7 +1,7 @@ // functional/ProduceFunction.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.util.function.*; interface diff --git a/functional/RecursiveFactorial.java b/functional/RecursiveFactorial.java index 6cb972e6d..a0ab4ca16 100644 --- a/functional/RecursiveFactorial.java +++ b/functional/RecursiveFactorial.java @@ -1,7 +1,7 @@ // functional/RecursiveFactorial.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. public class RecursiveFactorial { static IntCall fact; diff --git a/functional/RecursiveFibonacci.java b/functional/RecursiveFibonacci.java index 02ee25c1e..b7e243c83 100644 --- a/functional/RecursiveFibonacci.java +++ b/functional/RecursiveFibonacci.java @@ -1,7 +1,7 @@ // functional/RecursiveFibonacci.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. public class RecursiveFibonacci { IntCall fib; diff --git a/functional/RunnableMethodReference.java b/functional/RunnableMethodReference.java index 86700a22c..5e2304295 100644 --- a/functional/RunnableMethodReference.java +++ b/functional/RunnableMethodReference.java @@ -1,7 +1,7 @@ // functional/RunnableMethodReference.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Method references with interface Runnable class Go { diff --git a/functional/SharedStorage.java b/functional/SharedStorage.java index 08161a5a2..789255c6e 100644 --- a/functional/SharedStorage.java +++ b/functional/SharedStorage.java @@ -1,7 +1,7 @@ // functional/SharedStorage.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.util.function.*; public class SharedStorage { diff --git a/functional/Strategize.java b/functional/Strategize.java index cd046dd35..92b83a442 100644 --- a/functional/Strategize.java +++ b/functional/Strategize.java @@ -1,7 +1,7 @@ // functional/Strategize.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. interface Strategy { String approach(String msg); diff --git a/functional/TransformFunction.java b/functional/TransformFunction.java index 4b747d723..534fd98e7 100644 --- a/functional/TransformFunction.java +++ b/functional/TransformFunction.java @@ -1,7 +1,7 @@ // functional/TransformFunction.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.util.function.*; class I { diff --git a/functional/TriFunction.java b/functional/TriFunction.java index 742b0b229..3a12ce70c 100644 --- a/functional/TriFunction.java +++ b/functional/TriFunction.java @@ -1,7 +1,7 @@ // functional/TriFunction.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. @FunctionalInterface public interface TriFunction { diff --git a/functional/TriFunctionTest.java b/functional/TriFunctionTest.java index 649b74778..3b270609f 100644 --- a/functional/TriFunctionTest.java +++ b/functional/TriFunctionTest.java @@ -1,7 +1,7 @@ // functional/TriFunctionTest.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. public class TriFunctionTest { static int f(int i, long l, double d) { return 99; } diff --git a/functional/UnboundMethodReference.java b/functional/UnboundMethodReference.java index 99b72c91a..d0240dec6 100644 --- a/functional/UnboundMethodReference.java +++ b/functional/UnboundMethodReference.java @@ -1,7 +1,7 @@ // functional/UnboundMethodReference.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Method reference without an object class X { diff --git a/generics/Amphibian.java b/generics/Amphibian.java index 6809ef71a..eb9644a99 100644 --- a/generics/Amphibian.java +++ b/generics/Amphibian.java @@ -1,5 +1,5 @@ // generics/Amphibian.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. public class Amphibian {} diff --git a/generics/Apply.java b/generics/Apply.java index 115a84824..7b1e0970b 100644 --- a/generics/Apply.java +++ b/generics/Apply.java @@ -1,7 +1,7 @@ // generics/Apply.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.lang.reflect.*; import java.util.*; diff --git a/generics/ApplyFunctional.java b/generics/ApplyFunctional.java index bda661f45..68377556e 100644 --- a/generics/ApplyFunctional.java +++ b/generics/ApplyFunctional.java @@ -1,7 +1,7 @@ // generics/ApplyFunctional.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.util.*; import java.util.stream.*; import java.util.function.*; diff --git a/generics/ApplyTest.java b/generics/ApplyTest.java index aa273cd87..da39b2d83 100644 --- a/generics/ApplyTest.java +++ b/generics/ApplyTest.java @@ -1,7 +1,7 @@ // generics/ApplyTest.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.util.*; import java.util.function.*; import onjava.*; diff --git a/generics/ArrayMaker.java b/generics/ArrayMaker.java index fa33c14bc..993a6a9fe 100644 --- a/generics/ArrayMaker.java +++ b/generics/ArrayMaker.java @@ -1,7 +1,7 @@ // generics/ArrayMaker.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.lang.reflect.*; import java.util.*; diff --git a/generics/ArrayOfGeneric.java b/generics/ArrayOfGeneric.java index 43b9d4602..8f5c57add 100644 --- a/generics/ArrayOfGeneric.java +++ b/generics/ArrayOfGeneric.java @@ -1,7 +1,7 @@ // generics/ArrayOfGeneric.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. public class ArrayOfGeneric { static final int SIZE = 100; diff --git a/generics/ArrayOfGenericReference.java b/generics/ArrayOfGenericReference.java index 345a86c26..2eac659b9 100644 --- a/generics/ArrayOfGenericReference.java +++ b/generics/ArrayOfGenericReference.java @@ -1,7 +1,7 @@ // generics/ArrayOfGenericReference.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. class Generic {} diff --git a/generics/BankTeller.java b/generics/BankTeller.java index 4b282f130..22540a0e4 100644 --- a/generics/BankTeller.java +++ b/generics/BankTeller.java @@ -1,7 +1,7 @@ // generics/BankTeller.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // A very simple bank teller simulation import java.util.*; import onjava.*; diff --git a/generics/BasicBounds.java b/generics/BasicBounds.java index 2a33cc537..2e23da5c9 100644 --- a/generics/BasicBounds.java +++ b/generics/BasicBounds.java @@ -1,7 +1,7 @@ // generics/BasicBounds.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. interface HasColor { java.awt.Color getColor(); } diff --git a/generics/BasicHolder.java b/generics/BasicHolder.java index 5d63c599d..49090af5c 100644 --- a/generics/BasicHolder.java +++ b/generics/BasicHolder.java @@ -1,7 +1,7 @@ // generics/BasicHolder.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. public class BasicHolder { T element; diff --git a/generics/BasicSupplierDemo.java b/generics/BasicSupplierDemo.java index 6613fb9ee..7f63342a2 100644 --- a/generics/BasicSupplierDemo.java +++ b/generics/BasicSupplierDemo.java @@ -1,7 +1,7 @@ // generics/BasicSupplierDemo.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import onjava.*; import java.util.stream.*; diff --git a/generics/ByteSet.java b/generics/ByteSet.java index b32f83953..68d7e9c22 100644 --- a/generics/ByteSet.java +++ b/generics/ByteSet.java @@ -1,7 +1,7 @@ // generics/ByteSet.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.util.*; public class ByteSet { diff --git a/generics/CRGWithBasicHolder.java b/generics/CRGWithBasicHolder.java index 52f7f2134..d70c13cb2 100644 --- a/generics/CRGWithBasicHolder.java +++ b/generics/CRGWithBasicHolder.java @@ -1,7 +1,7 @@ // generics/CRGWithBasicHolder.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. class Subtype extends BasicHolder {} diff --git a/generics/CaptureConversion.java b/generics/CaptureConversion.java index 702e50d41..775c58825 100644 --- a/generics/CaptureConversion.java +++ b/generics/CaptureConversion.java @@ -1,7 +1,7 @@ // generics/CaptureConversion.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. public class CaptureConversion { static void f1(Holder holder) { diff --git a/generics/CheckedList.java b/generics/CheckedList.java index e287dbf00..9bdcda2ec 100644 --- a/generics/CheckedList.java +++ b/generics/CheckedList.java @@ -1,7 +1,7 @@ // generics/CheckedList.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Using Collection.checkedList() import typeinfo.pets.*; import java.util.*; diff --git a/generics/ClassCasting.java b/generics/ClassCasting.java index 62e344f6d..f5b42ad13 100644 --- a/generics/ClassCasting.java +++ b/generics/ClassCasting.java @@ -1,7 +1,7 @@ // generics/ClassCasting.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.io.*; import java.util.*; diff --git a/generics/ClassTypeCapture.java b/generics/ClassTypeCapture.java index 7d4da5307..2a829b277 100644 --- a/generics/ClassTypeCapture.java +++ b/generics/ClassTypeCapture.java @@ -1,7 +1,7 @@ // generics/ClassTypeCapture.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. class Building {} class House extends Building {} diff --git a/generics/ComparablePet.java b/generics/ComparablePet.java index 173658359..15368197d 100644 --- a/generics/ComparablePet.java +++ b/generics/ComparablePet.java @@ -1,7 +1,7 @@ // generics/ComparablePet.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. public class ComparablePet implements Comparable { diff --git a/generics/CompilerIntelligence.java b/generics/CompilerIntelligence.java index 1b9673821..85df9bf34 100644 --- a/generics/CompilerIntelligence.java +++ b/generics/CompilerIntelligence.java @@ -1,7 +1,7 @@ // generics/CompilerIntelligence.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.util.*; public class CompilerIntelligence { diff --git a/generics/CountedObject.java b/generics/CountedObject.java index b49b5e8c8..d6ed62950 100644 --- a/generics/CountedObject.java +++ b/generics/CountedObject.java @@ -1,7 +1,7 @@ // generics/CountedObject.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. public class CountedObject { private static long counter = 0; diff --git a/generics/CovariantArrays.java b/generics/CovariantArrays.java index e15120bfa..9136a0154 100644 --- a/generics/CovariantArrays.java +++ b/generics/CovariantArrays.java @@ -1,7 +1,7 @@ // generics/CovariantArrays.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. class Fruit {} class Apple extends Fruit {} diff --git a/generics/CovariantReturnTypes.java b/generics/CovariantReturnTypes.java index 4789739fc..2949faffa 100644 --- a/generics/CovariantReturnTypes.java +++ b/generics/CovariantReturnTypes.java @@ -1,7 +1,7 @@ // generics/CovariantReturnTypes.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. class Base {} class Derived extends Base {} diff --git a/generics/CreatorGeneric.java b/generics/CreatorGeneric.java index 571df572e..87713446f 100644 --- a/generics/CreatorGeneric.java +++ b/generics/CreatorGeneric.java @@ -1,7 +1,7 @@ // generics/CreatorGeneric.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. abstract class GenericWithCreate { final T element; diff --git a/generics/CuriouslyRecurringGeneric.java b/generics/CuriouslyRecurringGeneric.java index d0f6b5e44..d73b1ba4a 100644 --- a/generics/CuriouslyRecurringGeneric.java +++ b/generics/CuriouslyRecurringGeneric.java @@ -1,7 +1,7 @@ // generics/CuriouslyRecurringGeneric.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. class GenericType {} diff --git a/generics/Diamond.java b/generics/Diamond.java index 3d9465727..de58b0eb4 100644 --- a/generics/Diamond.java +++ b/generics/Diamond.java @@ -1,7 +1,7 @@ // generics/Diamond.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. class Bob {} diff --git a/generics/DogsAndRobotMethodReferences.java b/generics/DogsAndRobotMethodReferences.java index 2a2328b38..cae8c0184 100644 --- a/generics/DogsAndRobotMethodReferences.java +++ b/generics/DogsAndRobotMethodReferences.java @@ -1,7 +1,7 @@ // generics/DogsAndRobotMethodReferences.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // "Assisted Latent Typing" import typeinfo.pets.*; import java.util.function.*; diff --git a/generics/DogsAndRobots.cpp b/generics/DogsAndRobots.cpp index 354a2fa35..c3cab35b4 100644 --- a/generics/DogsAndRobots.cpp +++ b/generics/DogsAndRobots.cpp @@ -1,7 +1,7 @@ // generics/DogsAndRobots.cpp // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. #include using namespace std; diff --git a/generics/DogsAndRobots.java b/generics/DogsAndRobots.java index 2d1454526..2aa4d03d2 100644 --- a/generics/DogsAndRobots.java +++ b/generics/DogsAndRobots.java @@ -1,7 +1,7 @@ // generics/DogsAndRobots.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // No (direct) latent typing in Java import typeinfo.pets.*; diff --git a/generics/DogsAndRobots.py b/generics/DogsAndRobots.py index 33cce802a..aca33fa59 100644 --- a/generics/DogsAndRobots.py +++ b/generics/DogsAndRobots.py @@ -1,7 +1,7 @@ # generics/DogsAndRobots.py # (c)2016 MindView LLC: see Copyright.txt # We make no guarantees that this code is fit for any purpose. -# Visit http://mindviewinc.com/Books/OnJava/ for more book information. +# Visit http://OnJava8.com for more book information. class Dog: def speak(self): diff --git a/generics/DynamicProxyMixin.java b/generics/DynamicProxyMixin.java index 9f7ac0133..2c886f92d 100644 --- a/generics/DynamicProxyMixin.java +++ b/generics/DynamicProxyMixin.java @@ -1,7 +1,7 @@ // generics/DynamicProxyMixin.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.lang.reflect.*; import java.util.*; import onjava.*; diff --git a/generics/EpicBattle.java b/generics/EpicBattle.java index 87729083c..8c3e61ae7 100644 --- a/generics/EpicBattle.java +++ b/generics/EpicBattle.java @@ -1,7 +1,7 @@ // generics/EpicBattle.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Bounds in Java generics import java.util.*; diff --git a/generics/Erased.java b/generics/Erased.java index 12fa95fc0..f564bcd3c 100644 --- a/generics/Erased.java +++ b/generics/Erased.java @@ -1,7 +1,7 @@ // generics/Erased.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // {CompileTimeError} (Will not compile) public class Erased { diff --git a/generics/ErasedTypeEquivalence.java b/generics/ErasedTypeEquivalence.java index 7d3cec74d..843503b2f 100644 --- a/generics/ErasedTypeEquivalence.java +++ b/generics/ErasedTypeEquivalence.java @@ -1,7 +1,7 @@ // generics/ErasedTypeEquivalence.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.util.*; public class ErasedTypeEquivalence { diff --git a/generics/ErasureAndInheritance.java b/generics/ErasureAndInheritance.java index f31e03554..708887527 100644 --- a/generics/ErasureAndInheritance.java +++ b/generics/ErasureAndInheritance.java @@ -1,7 +1,7 @@ // generics/ErasureAndInheritance.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. class GenericBase { private T element; diff --git a/generics/FactoryConstraint.java b/generics/FactoryConstraint.java index 6e6aaa99a..45d4a8d84 100644 --- a/generics/FactoryConstraint.java +++ b/generics/FactoryConstraint.java @@ -1,7 +1,7 @@ // generics/FactoryConstraint.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.util.*; import java.util.function.*; import onjava.*; diff --git a/generics/Fibonacci.java b/generics/Fibonacci.java index 48725bd79..e0d402eaa 100644 --- a/generics/Fibonacci.java +++ b/generics/Fibonacci.java @@ -1,7 +1,7 @@ // generics/Fibonacci.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Generate a Fibonacci sequence import java.util.function.*; import java.util.stream.*; diff --git a/generics/FilledList.java b/generics/FilledList.java index efffa3bb6..7647ec4a8 100644 --- a/generics/FilledList.java +++ b/generics/FilledList.java @@ -1,7 +1,7 @@ // generics/FilledList.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.util.*; import java.util.function.*; import onjava.*; diff --git a/generics/GenericArray.java b/generics/GenericArray.java index 022630e22..cf61acf7f 100644 --- a/generics/GenericArray.java +++ b/generics/GenericArray.java @@ -1,7 +1,7 @@ // generics/GenericArray.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. public class GenericArray { private T[] array; diff --git a/generics/GenericArray2.java b/generics/GenericArray2.java index d3df5a9a1..35fff96d5 100644 --- a/generics/GenericArray2.java +++ b/generics/GenericArray2.java @@ -1,7 +1,7 @@ // generics/GenericArray2.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. public class GenericArray2 { private Object[] array; diff --git a/generics/GenericArrayWithTypeToken.java b/generics/GenericArrayWithTypeToken.java index 46e42754e..57ea150d2 100644 --- a/generics/GenericArrayWithTypeToken.java +++ b/generics/GenericArrayWithTypeToken.java @@ -1,7 +1,7 @@ // generics/GenericArrayWithTypeToken.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.lang.reflect.*; public class GenericArrayWithTypeToken { diff --git a/generics/GenericCast.java b/generics/GenericCast.java index 6c4470ce9..48428b2eb 100644 --- a/generics/GenericCast.java +++ b/generics/GenericCast.java @@ -1,7 +1,7 @@ // generics/GenericCast.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.util.stream.*; class FixedSizeStack { diff --git a/generics/GenericHolder.java b/generics/GenericHolder.java index 185d46603..d352ec638 100644 --- a/generics/GenericHolder.java +++ b/generics/GenericHolder.java @@ -1,7 +1,7 @@ // generics/GenericHolder.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. public class GenericHolder { private T a; diff --git a/generics/GenericHolder2.java b/generics/GenericHolder2.java index 8df17d677..032a9440b 100644 --- a/generics/GenericHolder2.java +++ b/generics/GenericHolder2.java @@ -1,7 +1,7 @@ // generics/GenericHolder2.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. public class GenericHolder2 { private T obj; diff --git a/generics/GenericMethods.java b/generics/GenericMethods.java index 08e41ade8..54edacb39 100644 --- a/generics/GenericMethods.java +++ b/generics/GenericMethods.java @@ -1,7 +1,7 @@ // generics/GenericMethods.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. public class GenericMethods { public void f(T x) { diff --git a/generics/GenericReading.java b/generics/GenericReading.java index 95964b23d..5b3646a4f 100644 --- a/generics/GenericReading.java +++ b/generics/GenericReading.java @@ -1,7 +1,7 @@ // generics/GenericReading.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.util.*; public class GenericReading { diff --git a/generics/GenericVarargs.java b/generics/GenericVarargs.java index e93383fcb..feed33b5a 100644 --- a/generics/GenericVarargs.java +++ b/generics/GenericVarargs.java @@ -1,7 +1,7 @@ // generics/GenericVarargs.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.util.*; public class GenericVarargs { diff --git a/generics/GenericsAndCovariance.java b/generics/GenericsAndCovariance.java index ffd906d60..b96a43a66 100644 --- a/generics/GenericsAndCovariance.java +++ b/generics/GenericsAndCovariance.java @@ -1,7 +1,7 @@ // generics/GenericsAndCovariance.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.util.*; public class GenericsAndCovariance { diff --git a/generics/GenericsAndReturnTypes.java b/generics/GenericsAndReturnTypes.java index afb05e1ae..36342dd4c 100644 --- a/generics/GenericsAndReturnTypes.java +++ b/generics/GenericsAndReturnTypes.java @@ -1,7 +1,7 @@ // generics/GenericsAndReturnTypes.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. interface GenericGetter> { T get(); diff --git a/generics/HasF.java b/generics/HasF.java index 71eb27606..f74378dce 100644 --- a/generics/HasF.java +++ b/generics/HasF.java @@ -1,7 +1,7 @@ // generics/HasF.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. public class HasF { public void f() { System.out.println("HasF.f()"); } diff --git a/generics/HijackedInterface.java b/generics/HijackedInterface.java index 305c08e7c..bb849fba3 100644 --- a/generics/HijackedInterface.java +++ b/generics/HijackedInterface.java @@ -1,7 +1,7 @@ // generics/HijackedInterface.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // {CompileTimeError} (Will not compile) class Cat diff --git a/generics/Holder.java b/generics/Holder.java index 75c6a59e6..5937a813c 100644 --- a/generics/Holder.java +++ b/generics/Holder.java @@ -1,7 +1,7 @@ // generics/Holder.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. public class Holder { private T value; diff --git a/generics/Holder1.java b/generics/Holder1.java index 767551f9c..b1f505598 100644 --- a/generics/Holder1.java +++ b/generics/Holder1.java @@ -1,7 +1,7 @@ // generics/Holder1.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. class Automobile {} diff --git a/generics/InheritBounds.java b/generics/InheritBounds.java index fea74c3d3..6cb875be2 100644 --- a/generics/InheritBounds.java +++ b/generics/InheritBounds.java @@ -1,7 +1,7 @@ // generics/InheritBounds.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. class HoldItem { T item; diff --git a/generics/InstantiateGenericType.cpp b/generics/InstantiateGenericType.cpp index b66b74af0..761935feb 100644 --- a/generics/InstantiateGenericType.cpp +++ b/generics/InstantiateGenericType.cpp @@ -1,7 +1,7 @@ // generics/InstantiateGenericType.cpp // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // C++, not Java! template class Foo { diff --git a/generics/InstantiateGenericType.java b/generics/InstantiateGenericType.java index d4a05636b..663f7a0e6 100644 --- a/generics/InstantiateGenericType.java +++ b/generics/InstantiateGenericType.java @@ -1,7 +1,7 @@ // generics/InstantiateGenericType.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.util.function.*; class ClassAsFactory implements Supplier { diff --git a/generics/IterableFibonacci.java b/generics/IterableFibonacci.java index ff34d040c..2622c5211 100644 --- a/generics/IterableFibonacci.java +++ b/generics/IterableFibonacci.java @@ -1,7 +1,7 @@ // generics/IterableFibonacci.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Adapt the Fibonacci class to make it Iterable import java.util.*; diff --git a/generics/LatentReflection.java b/generics/LatentReflection.java index 4a49a1393..5c9408a5d 100644 --- a/generics/LatentReflection.java +++ b/generics/LatentReflection.java @@ -1,7 +1,7 @@ // generics/LatentReflection.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Using reflection for latent typing import java.lang.reflect.*; diff --git a/generics/LinkedStack.java b/generics/LinkedStack.java index 8b9a9b7de..8aacf42b9 100644 --- a/generics/LinkedStack.java +++ b/generics/LinkedStack.java @@ -1,7 +1,7 @@ // generics/LinkedStack.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // A stack implemented with an internal linked structure public class LinkedStack { diff --git a/generics/ListMaker.java b/generics/ListMaker.java index 2760aaee9..df13ebb24 100644 --- a/generics/ListMaker.java +++ b/generics/ListMaker.java @@ -1,7 +1,7 @@ // generics/ListMaker.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.util.*; public class ListMaker { diff --git a/generics/ListOfGenerics.java b/generics/ListOfGenerics.java index f66997eb5..530c54a5c 100644 --- a/generics/ListOfGenerics.java +++ b/generics/ListOfGenerics.java @@ -1,7 +1,7 @@ // generics/ListOfGenerics.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.util.*; public class ListOfGenerics { diff --git a/generics/ListOfInt.java b/generics/ListOfInt.java index 0d08a5a24..9c0dab928 100644 --- a/generics/ListOfInt.java +++ b/generics/ListOfInt.java @@ -1,7 +1,7 @@ // generics/ListOfInt.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Autoboxing compensates for the inability // to use primitives in generics import java.util.*; diff --git a/generics/LostInformation.java b/generics/LostInformation.java index 140cb46e6..94791fd50 100644 --- a/generics/LostInformation.java +++ b/generics/LostInformation.java @@ -1,7 +1,7 @@ // generics/LostInformation.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.util.*; class Frob {} diff --git a/generics/Manipulation.java b/generics/Manipulation.java index 400afadab..354ab98df 100644 --- a/generics/Manipulation.java +++ b/generics/Manipulation.java @@ -1,7 +1,7 @@ // generics/Manipulation.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // {CompileTimeError} (Will not compile) class Manipulator { diff --git a/generics/Manipulator2.java b/generics/Manipulator2.java index b1f7f9693..7b00cd146 100644 --- a/generics/Manipulator2.java +++ b/generics/Manipulator2.java @@ -1,7 +1,7 @@ // generics/Manipulator2.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. class Manipulator2 { private T obj; diff --git a/generics/Manipulator3.java b/generics/Manipulator3.java index b51edcf8a..00d96ae99 100644 --- a/generics/Manipulator3.java +++ b/generics/Manipulator3.java @@ -1,7 +1,7 @@ // generics/Manipulator3.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. class Manipulator3 { private HasF obj; diff --git a/generics/Mixins.cpp b/generics/Mixins.cpp index e7bba20e5..18df5c329 100644 --- a/generics/Mixins.cpp +++ b/generics/Mixins.cpp @@ -1,7 +1,7 @@ // generics/Mixins.cpp // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. #include #include #include diff --git a/generics/Mixins.java b/generics/Mixins.java index 4183e72aa..0425145c4 100644 --- a/generics/Mixins.java +++ b/generics/Mixins.java @@ -1,7 +1,7 @@ // generics/Mixins.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.util.*; interface TimeStamped { long getStamp(); } diff --git a/generics/MultipleInterfaceVariants.java b/generics/MultipleInterfaceVariants.java index 8badc8435..f6c351038 100644 --- a/generics/MultipleInterfaceVariants.java +++ b/generics/MultipleInterfaceVariants.java @@ -1,7 +1,7 @@ // generics/MultipleInterfaceVariants.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // {CompileTimeError} (Will not compile) package generics; diff --git a/generics/NeedCasting.java b/generics/NeedCasting.java index a47ec23af..4a524c3f2 100644 --- a/generics/NeedCasting.java +++ b/generics/NeedCasting.java @@ -1,7 +1,7 @@ // generics/NeedCasting.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.io.*; import java.util.*; diff --git a/generics/NonCovariantGenerics.java b/generics/NonCovariantGenerics.java index e5b656f73..b3ab48d60 100644 --- a/generics/NonCovariantGenerics.java +++ b/generics/NonCovariantGenerics.java @@ -1,7 +1,7 @@ // generics/NonCovariantGenerics.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // {CompileTimeError} (Will not compile) import java.util.*; diff --git a/generics/NotSelfBounded.java b/generics/NotSelfBounded.java index 62370f5ac..edc1fe483 100644 --- a/generics/NotSelfBounded.java +++ b/generics/NotSelfBounded.java @@ -1,7 +1,7 @@ // generics/NotSelfBounded.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. public class NotSelfBounded { T element; diff --git a/generics/ObjectHolder.java b/generics/ObjectHolder.java index 9088db514..b56167a3b 100644 --- a/generics/ObjectHolder.java +++ b/generics/ObjectHolder.java @@ -1,7 +1,7 @@ // generics/ObjectHolder.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. public class ObjectHolder { private Object a; diff --git a/generics/OrdinaryArguments.java b/generics/OrdinaryArguments.java index 051b4eb48..66a62e511 100644 --- a/generics/OrdinaryArguments.java +++ b/generics/OrdinaryArguments.java @@ -1,7 +1,7 @@ // generics/OrdinaryArguments.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. class OrdinarySetter { void set(Base base) { diff --git a/generics/Performs.java b/generics/Performs.java index 49573e736..7fd55af7e 100644 --- a/generics/Performs.java +++ b/generics/Performs.java @@ -1,7 +1,7 @@ // generics/Performs.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. public interface Performs { void speak(); diff --git a/generics/PlainGenericInheritance.java b/generics/PlainGenericInheritance.java index 6365d6531..02202da24 100644 --- a/generics/PlainGenericInheritance.java +++ b/generics/PlainGenericInheritance.java @@ -1,7 +1,7 @@ // generics/PlainGenericInheritance.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. class GenericSetter { // Not self-bounded void set(T arg) { diff --git a/generics/PrimitiveGenericTest.java b/generics/PrimitiveGenericTest.java index 883e2512d..934c1ba35 100644 --- a/generics/PrimitiveGenericTest.java +++ b/generics/PrimitiveGenericTest.java @@ -1,7 +1,7 @@ // generics/PrimitiveGenericTest.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import onjava.*; import java.util.*; import java.util.function.*; diff --git a/generics/RandomList.java b/generics/RandomList.java index 3d68999ce..502a67fda 100644 --- a/generics/RandomList.java +++ b/generics/RandomList.java @@ -1,7 +1,7 @@ // generics/RandomList.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.util.*; import java.util.stream.*; diff --git a/generics/RestrictedComparablePets.java b/generics/RestrictedComparablePets.java index 87f4af3a2..aff84c2a7 100644 --- a/generics/RestrictedComparablePets.java +++ b/generics/RestrictedComparablePets.java @@ -1,7 +1,7 @@ // generics/RestrictedComparablePets.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. class Hamster extends ComparablePet implements Comparable { diff --git a/generics/ReturnGenericType.java b/generics/ReturnGenericType.java index 7571cc008..7813f8d6e 100644 --- a/generics/ReturnGenericType.java +++ b/generics/ReturnGenericType.java @@ -1,7 +1,7 @@ // generics/ReturnGenericType.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. class ReturnGenericType { private T obj; diff --git a/generics/SelfBounding.java b/generics/SelfBounding.java index e5e3afd0b..d021795c4 100644 --- a/generics/SelfBounding.java +++ b/generics/SelfBounding.java @@ -1,7 +1,7 @@ // generics/SelfBounding.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. class SelfBounded> { T element; diff --git a/generics/SelfBoundingAndCovariantArguments.java b/generics/SelfBoundingAndCovariantArguments.java index 89d688d02..b4db4d9b4 100644 --- a/generics/SelfBoundingAndCovariantArguments.java +++ b/generics/SelfBoundingAndCovariantArguments.java @@ -1,7 +1,7 @@ // generics/SelfBoundingAndCovariantArguments.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. interface SelfBoundSetter> { void set(T arg); diff --git a/generics/SelfBoundingMethods.java b/generics/SelfBoundingMethods.java index 87aadd0e7..28ac42987 100644 --- a/generics/SelfBoundingMethods.java +++ b/generics/SelfBoundingMethods.java @@ -1,7 +1,7 @@ // generics/SelfBoundingMethods.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. public class SelfBoundingMethods { static > T f(T arg) { diff --git a/generics/Shape.java b/generics/Shape.java index 42363deeb..5de003538 100644 --- a/generics/Shape.java +++ b/generics/Shape.java @@ -1,7 +1,7 @@ // generics/Shape.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. public class Shape { private static long counter = 0; diff --git a/generics/SimpleDogsAndRobots.java b/generics/SimpleDogsAndRobots.java index 564147d8c..d52ed0a03 100644 --- a/generics/SimpleDogsAndRobots.java +++ b/generics/SimpleDogsAndRobots.java @@ -1,7 +1,7 @@ // generics/SimpleDogsAndRobots.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Removing the generic; code still works class CommunicateSimply { diff --git a/generics/SimpleHolder.java b/generics/SimpleHolder.java index c06b67614..da2ae5386 100644 --- a/generics/SimpleHolder.java +++ b/generics/SimpleHolder.java @@ -1,7 +1,7 @@ // generics/SimpleHolder.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. public class SimpleHolder { private Object obj; diff --git a/generics/SimpleQueue.java b/generics/SimpleQueue.java index 385b438b9..a8e6620f0 100644 --- a/generics/SimpleQueue.java +++ b/generics/SimpleQueue.java @@ -1,7 +1,7 @@ // generics/SimpleQueue.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // A different kind of Iterable collection import java.util.*; diff --git a/generics/Square.java b/generics/Square.java index 9aa16d803..1dd389df5 100644 --- a/generics/Square.java +++ b/generics/Square.java @@ -1,5 +1,5 @@ // generics/Square.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. public class Square extends Shape {} diff --git a/generics/Store.java b/generics/Store.java index fe514fb38..ec447263f 100644 --- a/generics/Store.java +++ b/generics/Store.java @@ -1,7 +1,7 @@ // generics/Store.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Building a complex model using generic collections import java.util.*; import java.util.function.*; diff --git a/generics/SuperTypeWildcards.java b/generics/SuperTypeWildcards.java index 814fca82e..269c46f10 100644 --- a/generics/SuperTypeWildcards.java +++ b/generics/SuperTypeWildcards.java @@ -1,7 +1,7 @@ // generics/SuperTypeWildcards.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.util.*; public class SuperTypeWildcards { diff --git a/generics/Templates.cpp b/generics/Templates.cpp index 556c08d84..23e315a55 100644 --- a/generics/Templates.cpp +++ b/generics/Templates.cpp @@ -1,7 +1,7 @@ // generics/Templates.cpp // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. #include using namespace std; diff --git a/generics/ThrowGenericException.java b/generics/ThrowGenericException.java index 679fc8bc5..9e429b888 100644 --- a/generics/ThrowGenericException.java +++ b/generics/ThrowGenericException.java @@ -1,7 +1,7 @@ // generics/ThrowGenericException.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.util.*; interface Processor { diff --git a/generics/TupleList.java b/generics/TupleList.java index 6003fb722..aed0d76dd 100644 --- a/generics/TupleList.java +++ b/generics/TupleList.java @@ -1,7 +1,7 @@ // generics/TupleList.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Combining generic types to make complex generic types import java.util.*; import onjava.*; diff --git a/generics/TupleTest.java b/generics/TupleTest.java index 351269802..f85e51255 100644 --- a/generics/TupleTest.java +++ b/generics/TupleTest.java @@ -1,7 +1,7 @@ // generics/TupleTest.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import onjava.*; public class TupleTest { diff --git a/generics/TupleTest2.java b/generics/TupleTest2.java index c3f65cae0..581a9996d 100644 --- a/generics/TupleTest2.java +++ b/generics/TupleTest2.java @@ -1,7 +1,7 @@ // generics/TupleTest2.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import onjava.*; import static onjava.Tuple.*; diff --git a/generics/UnboundedWildcards1.java b/generics/UnboundedWildcards1.java index 513e52113..a978a87d9 100644 --- a/generics/UnboundedWildcards1.java +++ b/generics/UnboundedWildcards1.java @@ -1,7 +1,7 @@ // generics/UnboundedWildcards1.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.util.*; public class UnboundedWildcards1 { diff --git a/generics/UnboundedWildcards2.java b/generics/UnboundedWildcards2.java index a01461643..8f49eee18 100644 --- a/generics/UnboundedWildcards2.java +++ b/generics/UnboundedWildcards2.java @@ -1,7 +1,7 @@ // generics/UnboundedWildcards2.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.util.*; public class UnboundedWildcards2 { diff --git a/generics/Unconstrained.java b/generics/Unconstrained.java index 051ccdb8f..2200a9198 100644 --- a/generics/Unconstrained.java +++ b/generics/Unconstrained.java @@ -1,7 +1,7 @@ // generics/Unconstrained.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. class Other {} class BasicOther extends BasicHolder {} diff --git a/generics/UseList.java b/generics/UseList.java index e526b7437..0cceadf10 100644 --- a/generics/UseList.java +++ b/generics/UseList.java @@ -1,7 +1,7 @@ // generics/UseList.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // {CompileTimeError} (Will not compile) import java.util.*; diff --git a/generics/UseList2.java b/generics/UseList2.java index c6e05533a..25db296d6 100644 --- a/generics/UseList2.java +++ b/generics/UseList2.java @@ -1,7 +1,7 @@ // generics/UseList2.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.util.*; public class UseList2 { diff --git a/generics/Vehicle.java b/generics/Vehicle.java index 0e742ca45..3f686fa97 100644 --- a/generics/Vehicle.java +++ b/generics/Vehicle.java @@ -1,5 +1,5 @@ // generics/Vehicle.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. public class Vehicle {} diff --git a/generics/WatercolorSets.java b/generics/WatercolorSets.java index b5248eebb..011decc49 100644 --- a/generics/WatercolorSets.java +++ b/generics/WatercolorSets.java @@ -1,7 +1,7 @@ // generics/WatercolorSets.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import generics.watercolors.*; import java.util.*; import static onjava.Sets.*; diff --git a/generics/Wildcards.java b/generics/Wildcards.java index 549a93bc3..960356b5e 100644 --- a/generics/Wildcards.java +++ b/generics/Wildcards.java @@ -1,7 +1,7 @@ // generics/Wildcards.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Exploring the meaning of wildcards public class Wildcards { diff --git a/generics/coffee/Americano.java b/generics/coffee/Americano.java index f8174744d..c488757db 100644 --- a/generics/coffee/Americano.java +++ b/generics/coffee/Americano.java @@ -1,6 +1,6 @@ // generics/coffee/Americano.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. package generics.coffee; public class Americano extends Coffee {} diff --git a/generics/coffee/Breve.java b/generics/coffee/Breve.java index 8f32b139d..a2ddb382b 100644 --- a/generics/coffee/Breve.java +++ b/generics/coffee/Breve.java @@ -1,6 +1,6 @@ // generics/coffee/Breve.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. package generics.coffee; public class Breve extends Coffee {} diff --git a/generics/coffee/Cappuccino.java b/generics/coffee/Cappuccino.java index f5b936383..77c62e339 100644 --- a/generics/coffee/Cappuccino.java +++ b/generics/coffee/Cappuccino.java @@ -1,6 +1,6 @@ // generics/coffee/Cappuccino.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. package generics.coffee; public class Cappuccino extends Coffee {} diff --git a/generics/coffee/Coffee.java b/generics/coffee/Coffee.java index 81f653c7a..dd457d9e5 100644 --- a/generics/coffee/Coffee.java +++ b/generics/coffee/Coffee.java @@ -1,7 +1,7 @@ // generics/coffee/Coffee.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. package generics.coffee; public class Coffee { diff --git a/generics/coffee/CoffeeSupplier.java b/generics/coffee/CoffeeSupplier.java index 00d59cdba..4dd37cc0f 100644 --- a/generics/coffee/CoffeeSupplier.java +++ b/generics/coffee/CoffeeSupplier.java @@ -1,7 +1,7 @@ // generics/coffee/CoffeeSupplier.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // {java generics.coffee.CoffeeSupplier} package generics.coffee; import java.util.*; diff --git a/generics/coffee/Latte.java b/generics/coffee/Latte.java index 95bf319f2..5c1b54b2c 100644 --- a/generics/coffee/Latte.java +++ b/generics/coffee/Latte.java @@ -1,6 +1,6 @@ // generics/coffee/Latte.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. package generics.coffee; public class Latte extends Coffee {} diff --git a/generics/coffee/Mocha.java b/generics/coffee/Mocha.java index 9c73fcd5a..89e70627d 100644 --- a/generics/coffee/Mocha.java +++ b/generics/coffee/Mocha.java @@ -1,6 +1,6 @@ // generics/coffee/Mocha.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. package generics.coffee; public class Mocha extends Coffee {} diff --git a/generics/decorator/Decoration.java b/generics/decorator/Decoration.java index ff1bbc4a7..f1603d966 100644 --- a/generics/decorator/Decoration.java +++ b/generics/decorator/Decoration.java @@ -1,7 +1,7 @@ // generics/decorator/Decoration.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // {java generics.decorator.Decoration} package generics.decorator; import java.util.*; diff --git a/generics/dogsandrobots.go b/generics/dogsandrobots.go index 6c9493020..9466e2c7f 100644 --- a/generics/dogsandrobots.go +++ b/generics/dogsandrobots.go @@ -1,7 +1,7 @@ // generics/dogsandrobots.go // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. package main import "fmt" diff --git a/generics/watercolors/Watercolors.java b/generics/watercolors/Watercolors.java index aa5e80972..47dee9138 100644 --- a/generics/watercolors/Watercolors.java +++ b/generics/watercolors/Watercolors.java @@ -1,7 +1,7 @@ // generics/watercolors/Watercolors.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. package generics.watercolors; public enum Watercolors { diff --git a/hiding/Cake.java b/hiding/Cake.java index 833149b3c..581760f5b 100644 --- a/hiding/Cake.java +++ b/hiding/Cake.java @@ -1,7 +1,7 @@ // hiding/Cake.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Accesses a class in a separate compilation unit class Cake { diff --git a/hiding/ChocolateChip.java b/hiding/ChocolateChip.java index e058f14df..17dea4e61 100644 --- a/hiding/ChocolateChip.java +++ b/hiding/ChocolateChip.java @@ -1,7 +1,7 @@ // hiding/ChocolateChip.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Can't use package-access member from another package import hiding.dessert.*; diff --git a/hiding/ChocolateChip2.java b/hiding/ChocolateChip2.java index 96226a476..fc1540814 100644 --- a/hiding/ChocolateChip2.java +++ b/hiding/ChocolateChip2.java @@ -1,7 +1,7 @@ // hiding/ChocolateChip2.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import hiding.cookie2.*; public class ChocolateChip2 extends Cookie { diff --git a/hiding/Dinner.java b/hiding/Dinner.java index 69f6e4162..9f2fbea63 100644 --- a/hiding/Dinner.java +++ b/hiding/Dinner.java @@ -1,7 +1,7 @@ // hiding/Dinner.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Uses the library import hiding.dessert.*; diff --git a/hiding/FullQualification.java b/hiding/FullQualification.java index 9de01e4e4..96ec55de8 100644 --- a/hiding/FullQualification.java +++ b/hiding/FullQualification.java @@ -1,7 +1,7 @@ // hiding/FullQualification.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. public class FullQualification { public static void main(String[] args) { diff --git a/hiding/IceCream.java b/hiding/IceCream.java index 765b97f99..8262b256c 100644 --- a/hiding/IceCream.java +++ b/hiding/IceCream.java @@ -1,7 +1,7 @@ // hiding/IceCream.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Demonstrates "private" keyword class Sundae { diff --git a/hiding/ImportedMyClass.java b/hiding/ImportedMyClass.java index d26f347d8..10d5a0ce9 100644 --- a/hiding/ImportedMyClass.java +++ b/hiding/ImportedMyClass.java @@ -1,7 +1,7 @@ // hiding/ImportedMyClass.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import hiding.mypackage.*; public class ImportedMyClass { diff --git a/hiding/LibTest.java b/hiding/LibTest.java index 70d092a0b..f7c848c0a 100644 --- a/hiding/LibTest.java +++ b/hiding/LibTest.java @@ -1,7 +1,7 @@ // hiding/LibTest.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Uses the library import com.mindviewinc.simple.*; diff --git a/hiding/Lunch.java b/hiding/Lunch.java index e470fcc8b..a0b9e789d 100644 --- a/hiding/Lunch.java +++ b/hiding/Lunch.java @@ -1,7 +1,7 @@ // hiding/Lunch.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Demonstrates class access specifiers. Make a class // effectively private with private constructors: diff --git a/hiding/OrganizedByAccess.java b/hiding/OrganizedByAccess.java index 5709f77ae..b38d44fcf 100644 --- a/hiding/OrganizedByAccess.java +++ b/hiding/OrganizedByAccess.java @@ -1,7 +1,7 @@ // hiding/OrganizedByAccess.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. public class OrganizedByAccess { public void pub1() { /* ... */ } diff --git a/hiding/Pie.java b/hiding/Pie.java index 1cf63321e..dab8880d1 100644 --- a/hiding/Pie.java +++ b/hiding/Pie.java @@ -1,7 +1,7 @@ // hiding/Pie.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // The other class class Pie { diff --git a/hiding/QualifiedMyClass.java b/hiding/QualifiedMyClass.java index cf4a6ee54..bdf3d5e9d 100644 --- a/hiding/QualifiedMyClass.java +++ b/hiding/QualifiedMyClass.java @@ -1,7 +1,7 @@ // hiding/QualifiedMyClass.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. public class QualifiedMyClass { public static void main(String[] args) { diff --git a/hiding/SingleImport.java b/hiding/SingleImport.java index 200b4ef60..fde469a7b 100644 --- a/hiding/SingleImport.java +++ b/hiding/SingleImport.java @@ -1,7 +1,7 @@ // hiding/SingleImport.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.util.ArrayList; public class SingleImport { diff --git a/hiding/cookie2/Cookie.java b/hiding/cookie2/Cookie.java index 25865ab4d..adfca0bd1 100644 --- a/hiding/cookie2/Cookie.java +++ b/hiding/cookie2/Cookie.java @@ -1,7 +1,7 @@ // hiding/cookie2/Cookie.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. package hiding.cookie2; public class Cookie { diff --git a/hiding/dessert/Cookie.java b/hiding/dessert/Cookie.java index cb63ff698..f96819980 100644 --- a/hiding/dessert/Cookie.java +++ b/hiding/dessert/Cookie.java @@ -1,7 +1,7 @@ // hiding/dessert/Cookie.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Creates a library package hiding.dessert; diff --git a/hiding/mypackage/MyClass.java b/hiding/mypackage/MyClass.java index b4281de6b..194f81cbe 100644 --- a/hiding/mypackage/MyClass.java +++ b/hiding/mypackage/MyClass.java @@ -1,7 +1,7 @@ // hiding/mypackage/MyClass.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. package hiding.mypackage; public class MyClass { diff --git a/housekeeping/Apricot.java b/housekeeping/Apricot.java index ee15434fd..c5089867b 100644 --- a/housekeeping/Apricot.java +++ b/housekeeping/Apricot.java @@ -1,7 +1,7 @@ // housekeeping/Apricot.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. public class Apricot { void pick() { /* ... */ } void pit() { pick(); /* ... */ } diff --git a/housekeeping/ArrayClassObj.java b/housekeeping/ArrayClassObj.java index 397699ad4..0bc6c0ea9 100644 --- a/housekeeping/ArrayClassObj.java +++ b/housekeeping/ArrayClassObj.java @@ -1,7 +1,7 @@ // housekeeping/ArrayClassObj.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Creating an array of nonprimitive objects import java.util.*; diff --git a/housekeeping/ArrayInit.java b/housekeeping/ArrayInit.java index 0b59bde17..779fad0cf 100644 --- a/housekeeping/ArrayInit.java +++ b/housekeeping/ArrayInit.java @@ -1,7 +1,7 @@ // housekeeping/ArrayInit.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Array initialization import java.util.*; diff --git a/housekeeping/ArrayNew.java b/housekeeping/ArrayNew.java index 74a6466a7..f764fea74 100644 --- a/housekeeping/ArrayNew.java +++ b/housekeeping/ArrayNew.java @@ -1,7 +1,7 @@ // housekeeping/ArrayNew.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Creating arrays with new import java.util.*; diff --git a/housekeeping/ArraysOfPrimitives.java b/housekeeping/ArraysOfPrimitives.java index 665650130..1692c4c41 100644 --- a/housekeeping/ArraysOfPrimitives.java +++ b/housekeeping/ArraysOfPrimitives.java @@ -1,7 +1,7 @@ // housekeeping/ArraysOfPrimitives.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. public class ArraysOfPrimitives { public static void main(String[] args) { diff --git a/housekeeping/AutoboxingVarargs.java b/housekeeping/AutoboxingVarargs.java index 5d25d4dca..58c02c67e 100644 --- a/housekeeping/AutoboxingVarargs.java +++ b/housekeeping/AutoboxingVarargs.java @@ -1,7 +1,7 @@ // housekeeping/AutoboxingVarargs.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. public class AutoboxingVarargs { public static void f(Integer... args) { diff --git a/housekeeping/BananaPeel.java b/housekeeping/BananaPeel.java index 4eadf14b8..2ec9516cd 100644 --- a/housekeeping/BananaPeel.java +++ b/housekeeping/BananaPeel.java @@ -1,7 +1,7 @@ // housekeeping/BananaPeel.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. class Banana { void peel(int i) { /* ... */ } } diff --git a/housekeeping/Burrito.java b/housekeeping/Burrito.java index d356d48a2..ea7e5b362 100644 --- a/housekeeping/Burrito.java +++ b/housekeeping/Burrito.java @@ -1,7 +1,7 @@ // housekeeping/Burrito.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. public class Burrito { Spiciness degree; diff --git a/housekeeping/Counter.java b/housekeeping/Counter.java index 7bb5c6835..65927e68b 100644 --- a/housekeeping/Counter.java +++ b/housekeeping/Counter.java @@ -1,7 +1,7 @@ // housekeeping/Counter.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. public class Counter { int i; Counter() { i = 7; } diff --git a/housekeeping/DefaultConstructor.java b/housekeeping/DefaultConstructor.java index f74eb10c9..0f95d83bb 100644 --- a/housekeeping/DefaultConstructor.java +++ b/housekeeping/DefaultConstructor.java @@ -1,7 +1,7 @@ // housekeeping/DefaultConstructor.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. class Bird {} diff --git a/housekeeping/Demotion.java b/housekeeping/Demotion.java index cd87c11e3..0d0546591 100644 --- a/housekeeping/Demotion.java +++ b/housekeeping/Demotion.java @@ -1,7 +1,7 @@ // housekeeping/Demotion.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Demotion of primitives public class Demotion { diff --git a/housekeeping/DynamicArray.java b/housekeeping/DynamicArray.java index ac7a2770a..578ef775e 100644 --- a/housekeeping/DynamicArray.java +++ b/housekeeping/DynamicArray.java @@ -1,7 +1,7 @@ // housekeeping/DynamicArray.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Array initialization public class DynamicArray { diff --git a/housekeeping/EnumOrder.java b/housekeeping/EnumOrder.java index 7a311ff21..42244c9c9 100644 --- a/housekeeping/EnumOrder.java +++ b/housekeeping/EnumOrder.java @@ -1,7 +1,7 @@ // housekeeping/EnumOrder.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. public class EnumOrder { public static void main(String[] args) { diff --git a/housekeeping/ExplicitStatic.java b/housekeeping/ExplicitStatic.java index 761beb96c..8e86b0033 100644 --- a/housekeeping/ExplicitStatic.java +++ b/housekeeping/ExplicitStatic.java @@ -1,7 +1,7 @@ // housekeeping/ExplicitStatic.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Explicit static initialization with the "static" clause class Cup { diff --git a/housekeeping/Flower.java b/housekeeping/Flower.java index adf106caf..b7a6137f7 100644 --- a/housekeeping/Flower.java +++ b/housekeeping/Flower.java @@ -1,7 +1,7 @@ // housekeeping/Flower.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Calling constructors with "this" public class Flower { diff --git a/housekeeping/InitialValues.java b/housekeeping/InitialValues.java index 826a924c8..9c256bece 100644 --- a/housekeeping/InitialValues.java +++ b/housekeeping/InitialValues.java @@ -1,7 +1,7 @@ // housekeeping/InitialValues.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Shows default initial values public class InitialValues { diff --git a/housekeeping/InitialValues2.java b/housekeeping/InitialValues2.java index 9361381b5..710307bc0 100644 --- a/housekeeping/InitialValues2.java +++ b/housekeeping/InitialValues2.java @@ -1,7 +1,7 @@ // housekeeping/InitialValues2.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Providing explicit initial values public class InitialValues2 { diff --git a/housekeeping/Leaf.java b/housekeeping/Leaf.java index b75ae3150..a16539a48 100644 --- a/housekeeping/Leaf.java +++ b/housekeeping/Leaf.java @@ -1,7 +1,7 @@ // housekeeping/Leaf.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Simple use of the "this" keyword public class Leaf { diff --git a/housekeeping/Measurement.java b/housekeeping/Measurement.java index 20912a423..4d6be143d 100644 --- a/housekeeping/Measurement.java +++ b/housekeeping/Measurement.java @@ -1,7 +1,7 @@ // housekeeping/Measurement.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. class Depth {} public class Measurement { diff --git a/housekeeping/MethodInit.java b/housekeeping/MethodInit.java index 77edae51c..7c77bdd97 100644 --- a/housekeeping/MethodInit.java +++ b/housekeeping/MethodInit.java @@ -1,7 +1,7 @@ // housekeeping/MethodInit.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. public class MethodInit { int i = f(); int f() { return 11; } diff --git a/housekeeping/MethodInit2.java b/housekeeping/MethodInit2.java index 14f3fb02b..394ef5232 100644 --- a/housekeeping/MethodInit2.java +++ b/housekeeping/MethodInit2.java @@ -1,7 +1,7 @@ // housekeeping/MethodInit2.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. public class MethodInit2 { int i = f(); int j = g(i); diff --git a/housekeeping/MethodInit3.java b/housekeeping/MethodInit3.java index 5a39920a2..15c0f6742 100644 --- a/housekeeping/MethodInit3.java +++ b/housekeeping/MethodInit3.java @@ -1,7 +1,7 @@ // housekeeping/MethodInit3.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. public class MethodInit3 { //- int j = g(i); // Illegal forward reference int i = f(); diff --git a/housekeeping/Mugs.java b/housekeeping/Mugs.java index 645e3a771..373471a27 100644 --- a/housekeeping/Mugs.java +++ b/housekeeping/Mugs.java @@ -1,7 +1,7 @@ // housekeeping/Mugs.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Instance initialization class Mug { diff --git a/housekeeping/NewVarArgs.java b/housekeeping/NewVarArgs.java index 5f94b54d3..a1d080c6e 100644 --- a/housekeeping/NewVarArgs.java +++ b/housekeeping/NewVarArgs.java @@ -1,7 +1,7 @@ // housekeeping/NewVarArgs.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Using array syntax to create variable argument lists public class NewVarArgs { diff --git a/housekeeping/NoSynthesis.java b/housekeeping/NoSynthesis.java index ee5c1f1e6..a54483660 100644 --- a/housekeeping/NoSynthesis.java +++ b/housekeeping/NoSynthesis.java @@ -1,7 +1,7 @@ // housekeeping/NoSynthesis.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. class Bird2 { Bird2(int i) {} diff --git a/housekeeping/OptionalTrailingArguments.java b/housekeeping/OptionalTrailingArguments.java index dc96aba7c..96415c003 100644 --- a/housekeeping/OptionalTrailingArguments.java +++ b/housekeeping/OptionalTrailingArguments.java @@ -1,7 +1,7 @@ // housekeeping/OptionalTrailingArguments.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. public class OptionalTrailingArguments { static void f(int required, String... trailing) { diff --git a/housekeeping/OrderOfInitialization.java b/housekeeping/OrderOfInitialization.java index 6bb1977e5..4ac8e2179 100644 --- a/housekeeping/OrderOfInitialization.java +++ b/housekeeping/OrderOfInitialization.java @@ -1,7 +1,7 @@ // housekeeping/OrderOfInitialization.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Demonstrates initialization order // When the constructor is called to create a diff --git a/housekeeping/Overloading.java b/housekeeping/Overloading.java index 7cc506dbf..0309a5097 100644 --- a/housekeeping/Overloading.java +++ b/housekeeping/Overloading.java @@ -1,7 +1,7 @@ // housekeeping/Overloading.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Both constructor and ordinary method overloading class Tree { diff --git a/housekeeping/OverloadingOrder.java b/housekeeping/OverloadingOrder.java index 4d239dece..47a7a9237 100644 --- a/housekeeping/OverloadingOrder.java +++ b/housekeeping/OverloadingOrder.java @@ -1,7 +1,7 @@ // housekeeping/OverloadingOrder.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Overloading based on the order of the arguments public class OverloadingOrder { diff --git a/housekeeping/OverloadingVarargs.java b/housekeeping/OverloadingVarargs.java index a9757c973..444d19f09 100644 --- a/housekeeping/OverloadingVarargs.java +++ b/housekeeping/OverloadingVarargs.java @@ -1,7 +1,7 @@ // housekeeping/OverloadingVarargs.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. public class OverloadingVarargs { static void f(Character... args) { diff --git a/housekeeping/OverloadingVarargs2.java b/housekeeping/OverloadingVarargs2.java index 9b4c4ef6e..45ab88488 100644 --- a/housekeeping/OverloadingVarargs2.java +++ b/housekeeping/OverloadingVarargs2.java @@ -1,7 +1,7 @@ // housekeeping/OverloadingVarargs2.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // {CompileTimeError} (Will not compile) public class OverloadingVarargs2 { diff --git a/housekeeping/OverloadingVarargs3.java b/housekeeping/OverloadingVarargs3.java index 03db29fe8..42db03298 100644 --- a/housekeeping/OverloadingVarargs3.java +++ b/housekeeping/OverloadingVarargs3.java @@ -1,7 +1,7 @@ // housekeeping/OverloadingVarargs3.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. public class OverloadingVarargs3 { static void f(float i, Character... args) { diff --git a/housekeeping/PassingThis.java b/housekeeping/PassingThis.java index ae4310a1f..64b5b31a2 100644 --- a/housekeeping/PassingThis.java +++ b/housekeeping/PassingThis.java @@ -1,7 +1,7 @@ // housekeeping/PassingThis.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. class Person { public void eat(Apple apple) { diff --git a/housekeeping/PrimitiveOverloading.java b/housekeeping/PrimitiveOverloading.java index d8dca1517..3f4494b51 100644 --- a/housekeeping/PrimitiveOverloading.java +++ b/housekeeping/PrimitiveOverloading.java @@ -1,7 +1,7 @@ // housekeeping/PrimitiveOverloading.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Promotion of primitives and overloading public class PrimitiveOverloading { diff --git a/housekeeping/SimpleConstructor.java b/housekeeping/SimpleConstructor.java index 06a73e73f..7bee9bfe6 100644 --- a/housekeeping/SimpleConstructor.java +++ b/housekeeping/SimpleConstructor.java @@ -1,7 +1,7 @@ // housekeeping/SimpleConstructor.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Demonstration of a simple constructor class Rock { diff --git a/housekeeping/SimpleConstructor2.java b/housekeeping/SimpleConstructor2.java index e08e79e21..679571c4b 100644 --- a/housekeeping/SimpleConstructor2.java +++ b/housekeeping/SimpleConstructor2.java @@ -1,7 +1,7 @@ // housekeeping/SimpleConstructor2.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Constructors can have arguments class Rock2 { diff --git a/housekeeping/SimpleEnumUse.java b/housekeeping/SimpleEnumUse.java index bc24bddd5..72d0dbd51 100644 --- a/housekeeping/SimpleEnumUse.java +++ b/housekeeping/SimpleEnumUse.java @@ -1,7 +1,7 @@ // housekeeping/SimpleEnumUse.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. public class SimpleEnumUse { public static void main(String[] args) { diff --git a/housekeeping/Spiciness.java b/housekeeping/Spiciness.java index aeff179f4..39f7d72e4 100644 --- a/housekeeping/Spiciness.java +++ b/housekeeping/Spiciness.java @@ -1,7 +1,7 @@ // housekeeping/Spiciness.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. public enum Spiciness { NOT, MILD, MEDIUM, HOT, FLAMING diff --git a/housekeeping/Spoon.java b/housekeeping/Spoon.java index e18afe846..ef379ac13 100644 --- a/housekeeping/Spoon.java +++ b/housekeeping/Spoon.java @@ -1,7 +1,7 @@ // housekeeping/Spoon.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. public class Spoon { static int i; static { diff --git a/housekeeping/StaticInitialization.java b/housekeeping/StaticInitialization.java index e7bd12a56..82a1929ba 100644 --- a/housekeeping/StaticInitialization.java +++ b/housekeeping/StaticInitialization.java @@ -1,7 +1,7 @@ // housekeeping/StaticInitialization.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Specifying initial values in a class definition class Bowl { diff --git a/housekeeping/TerminationCondition.java b/housekeeping/TerminationCondition.java index 32d05bc34..4a316c3f0 100644 --- a/housekeeping/TerminationCondition.java +++ b/housekeeping/TerminationCondition.java @@ -1,7 +1,7 @@ // housekeeping/TerminationCondition.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Using finalize() to detect an object that // hasn't been properly cleaned up import onjava.*; diff --git a/housekeeping/VarArgs.java b/housekeeping/VarArgs.java index af8e3939d..5c323a202 100644 --- a/housekeeping/VarArgs.java +++ b/housekeeping/VarArgs.java @@ -1,7 +1,7 @@ // housekeeping/VarArgs.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Using array syntax to create variable argument lists class A {} diff --git a/housekeeping/VarargType.java b/housekeeping/VarargType.java index 67be35c33..c8c416196 100644 --- a/housekeeping/VarargType.java +++ b/housekeeping/VarargType.java @@ -1,7 +1,7 @@ // housekeeping/VarargType.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. public class VarargType { static void f(Character... args) { diff --git a/innerclasses/AnonymousConstructor.java b/innerclasses/AnonymousConstructor.java index 5398c0fc3..dd0deb8cd 100644 --- a/innerclasses/AnonymousConstructor.java +++ b/innerclasses/AnonymousConstructor.java @@ -1,7 +1,7 @@ // innerclasses/AnonymousConstructor.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Creating a constructor for an anonymous inner class abstract class Base { diff --git a/innerclasses/BigEgg.java b/innerclasses/BigEgg.java index 6f430bd37..b55ac35f2 100644 --- a/innerclasses/BigEgg.java +++ b/innerclasses/BigEgg.java @@ -1,7 +1,7 @@ // innerclasses/BigEgg.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // An inner class cannot be overriden like a method class Egg { diff --git a/innerclasses/BigEgg2.java b/innerclasses/BigEgg2.java index 5de932677..b9b4fc6e5 100644 --- a/innerclasses/BigEgg2.java +++ b/innerclasses/BigEgg2.java @@ -1,7 +1,7 @@ // innerclasses/BigEgg2.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Proper inheritance of an inner class class Egg2 { diff --git a/innerclasses/Callbacks.java b/innerclasses/Callbacks.java index 89bb33a9f..bf944f1f2 100644 --- a/innerclasses/Callbacks.java +++ b/innerclasses/Callbacks.java @@ -1,7 +1,7 @@ // innerclasses/Callbacks.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Using inner classes for callbacks // {java innerclasses.Callbacks} package innerclasses; diff --git a/innerclasses/ClassInInterface.java b/innerclasses/ClassInInterface.java index 99f409c5f..048c23ab1 100644 --- a/innerclasses/ClassInInterface.java +++ b/innerclasses/ClassInInterface.java @@ -1,7 +1,7 @@ // innerclasses/ClassInInterface.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // {java ClassInInterface$Test} public interface ClassInInterface { diff --git a/innerclasses/Contents.java b/innerclasses/Contents.java index f770e413c..874040b87 100644 --- a/innerclasses/Contents.java +++ b/innerclasses/Contents.java @@ -1,7 +1,7 @@ // innerclasses/Contents.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. public interface Contents { int value(); } diff --git a/innerclasses/Destination.java b/innerclasses/Destination.java index a87b7bb0c..be479d2ac 100644 --- a/innerclasses/Destination.java +++ b/innerclasses/Destination.java @@ -1,7 +1,7 @@ // innerclasses/Destination.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. public interface Destination { String readLabel(); } diff --git a/innerclasses/DotNew.java b/innerclasses/DotNew.java index 2846907ce..229dc2a2d 100644 --- a/innerclasses/DotNew.java +++ b/innerclasses/DotNew.java @@ -1,7 +1,7 @@ // innerclasses/DotNew.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Creating an inner class directly using the .new syntax public class DotNew { diff --git a/innerclasses/DotThis.java b/innerclasses/DotThis.java index 20b9ab8cc..ea2a37a20 100644 --- a/innerclasses/DotThis.java +++ b/innerclasses/DotThis.java @@ -1,7 +1,7 @@ // innerclasses/DotThis.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Accessing the outer-class object public class DotThis { diff --git a/innerclasses/GreenhouseController.java b/innerclasses/GreenhouseController.java index d3fbfddbf..89379f6c1 100644 --- a/innerclasses/GreenhouseController.java +++ b/innerclasses/GreenhouseController.java @@ -1,7 +1,7 @@ // innerclasses/GreenhouseController.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Configure and execute the greenhouse system // {java GreenhouseController 5000} import innerclasses.controller.*; diff --git a/innerclasses/GreenhouseControls.java b/innerclasses/GreenhouseControls.java index aac65a362..a69c9771e 100644 --- a/innerclasses/GreenhouseControls.java +++ b/innerclasses/GreenhouseControls.java @@ -1,7 +1,7 @@ // innerclasses/GreenhouseControls.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // This produces a specific application of the // control system, all in a single class. Inner // classes allow you to encapsulate different diff --git a/innerclasses/InheritInner.java b/innerclasses/InheritInner.java index 5450d5ce7..cd2cb525c 100644 --- a/innerclasses/InheritInner.java +++ b/innerclasses/InheritInner.java @@ -1,7 +1,7 @@ // innerclasses/InheritInner.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Inheriting an inner class class WithInner { diff --git a/innerclasses/LocalInnerClass.java b/innerclasses/LocalInnerClass.java index 019dd4ce2..cf52a2141 100644 --- a/innerclasses/LocalInnerClass.java +++ b/innerclasses/LocalInnerClass.java @@ -1,7 +1,7 @@ // innerclasses/LocalInnerClass.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Holds a sequence of Objects interface Counter { diff --git a/innerclasses/MultiImplementation.java b/innerclasses/MultiImplementation.java index faa4ebd53..b4577c937 100644 --- a/innerclasses/MultiImplementation.java +++ b/innerclasses/MultiImplementation.java @@ -1,7 +1,7 @@ // innerclasses/MultiImplementation.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // For concrete or abstract classes, inner classes // produce "multiple implementation inheritance" // {java innerclasses.MultiImplementation} diff --git a/innerclasses/MultiNestingAccess.java b/innerclasses/MultiNestingAccess.java index c90999ee7..79abc7dba 100644 --- a/innerclasses/MultiNestingAccess.java +++ b/innerclasses/MultiNestingAccess.java @@ -1,7 +1,7 @@ // innerclasses/MultiNestingAccess.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Nested classes can access all members of all // levels of the classes they are nested within diff --git a/innerclasses/Parcel1.java b/innerclasses/Parcel1.java index 0fe971dad..9b8f22df0 100644 --- a/innerclasses/Parcel1.java +++ b/innerclasses/Parcel1.java @@ -1,7 +1,7 @@ // innerclasses/Parcel1.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Creating inner classes public class Parcel1 { diff --git a/innerclasses/Parcel10.java b/innerclasses/Parcel10.java index 7f0bfdc24..10f13b71d 100644 --- a/innerclasses/Parcel10.java +++ b/innerclasses/Parcel10.java @@ -1,7 +1,7 @@ // innerclasses/Parcel10.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Using "instance initialization" to perform // construction on an anonymous inner class diff --git a/innerclasses/Parcel11.java b/innerclasses/Parcel11.java index 0a91afbae..d9f6f46a5 100644 --- a/innerclasses/Parcel11.java +++ b/innerclasses/Parcel11.java @@ -1,7 +1,7 @@ // innerclasses/Parcel11.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Nested classes (static inner classes) public class Parcel11 { diff --git a/innerclasses/Parcel2.java b/innerclasses/Parcel2.java index 384d00281..3e7eb4374 100644 --- a/innerclasses/Parcel2.java +++ b/innerclasses/Parcel2.java @@ -1,7 +1,7 @@ // innerclasses/Parcel2.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Returning a reference to an inner class public class Parcel2 { diff --git a/innerclasses/Parcel3.java b/innerclasses/Parcel3.java index 18435451c..75163e1d6 100644 --- a/innerclasses/Parcel3.java +++ b/innerclasses/Parcel3.java @@ -1,7 +1,7 @@ // innerclasses/Parcel3.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Using .new to create instances of inner classes public class Parcel3 { diff --git a/innerclasses/Parcel5.java b/innerclasses/Parcel5.java index fe4259752..3b4694194 100644 --- a/innerclasses/Parcel5.java +++ b/innerclasses/Parcel5.java @@ -1,7 +1,7 @@ // innerclasses/Parcel5.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Nesting a class within a method public class Parcel5 { diff --git a/innerclasses/Parcel6.java b/innerclasses/Parcel6.java index 20c9c5b65..14699c4a9 100644 --- a/innerclasses/Parcel6.java +++ b/innerclasses/Parcel6.java @@ -1,7 +1,7 @@ // innerclasses/Parcel6.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Nesting a class within a scope public class Parcel6 { diff --git a/innerclasses/Parcel7.java b/innerclasses/Parcel7.java index 363555237..e34359007 100644 --- a/innerclasses/Parcel7.java +++ b/innerclasses/Parcel7.java @@ -1,7 +1,7 @@ // innerclasses/Parcel7.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Returning an instance of an anonymous inner class public class Parcel7 { diff --git a/innerclasses/Parcel7b.java b/innerclasses/Parcel7b.java index ab194144b..99b85a259 100644 --- a/innerclasses/Parcel7b.java +++ b/innerclasses/Parcel7b.java @@ -1,7 +1,7 @@ // innerclasses/Parcel7b.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Expanded version of Parcel7.java public class Parcel7b { diff --git a/innerclasses/Parcel8.java b/innerclasses/Parcel8.java index 3846839cc..c8385b4e0 100644 --- a/innerclasses/Parcel8.java +++ b/innerclasses/Parcel8.java @@ -1,7 +1,7 @@ // innerclasses/Parcel8.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Calling the base-class constructor public class Parcel8 { diff --git a/innerclasses/Parcel9.java b/innerclasses/Parcel9.java index c68a72472..3b1362eca 100644 --- a/innerclasses/Parcel9.java +++ b/innerclasses/Parcel9.java @@ -1,7 +1,7 @@ // innerclasses/Parcel9.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. public class Parcel9 { // Argument must be final or "effectively final" diff --git a/innerclasses/Sequence.java b/innerclasses/Sequence.java index 983881a62..490a66775 100644 --- a/innerclasses/Sequence.java +++ b/innerclasses/Sequence.java @@ -1,7 +1,7 @@ // innerclasses/Sequence.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Holds a sequence of Objects interface Selector { diff --git a/innerclasses/TestBed.java b/innerclasses/TestBed.java index 87a453f43..8b4e00c43 100644 --- a/innerclasses/TestBed.java +++ b/innerclasses/TestBed.java @@ -1,7 +1,7 @@ // innerclasses/TestBed.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Putting test code in a nested class // {java TestBed$Tester} diff --git a/innerclasses/TestParcel.java b/innerclasses/TestParcel.java index c87fcd1ac..970b2c3ad 100644 --- a/innerclasses/TestParcel.java +++ b/innerclasses/TestParcel.java @@ -1,7 +1,7 @@ // innerclasses/TestParcel.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. class Parcel4 { private class PContents implements Contents { diff --git a/innerclasses/Wrapping.java b/innerclasses/Wrapping.java index 33584d4cf..272fcac72 100644 --- a/innerclasses/Wrapping.java +++ b/innerclasses/Wrapping.java @@ -1,7 +1,7 @@ // innerclasses/Wrapping.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. public class Wrapping { private int i; public Wrapping(int x) { i = x; } diff --git a/innerclasses/controller/Controller.java b/innerclasses/controller/Controller.java index 05c74b6b2..befc46eba 100644 --- a/innerclasses/controller/Controller.java +++ b/innerclasses/controller/Controller.java @@ -1,7 +1,7 @@ // innerclasses/controller/Controller.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // The reusable framework for control systems package innerclasses.controller; import java.util.*; diff --git a/innerclasses/controller/Event.java b/innerclasses/controller/Event.java index bb21a2f52..afdb45100 100644 --- a/innerclasses/controller/Event.java +++ b/innerclasses/controller/Event.java @@ -1,7 +1,7 @@ // innerclasses/controller/Event.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // The common methods for any control event package innerclasses.controller; import java.time.*; // Java 8 time classes diff --git a/innerclasses/mui/MultiInterfaces.java b/innerclasses/mui/MultiInterfaces.java index 7c7f01860..0782b7b80 100644 --- a/innerclasses/mui/MultiInterfaces.java +++ b/innerclasses/mui/MultiInterfaces.java @@ -1,7 +1,7 @@ // innerclasses/mui/MultiInterfaces.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Two ways that a class can implement multiple interfaces // {java innerclasses.mui.MultiInterfaces} package innerclasses.mui; diff --git a/interfaces/AbstractAccess.java b/interfaces/AbstractAccess.java index c58988ddd..8c72c2c57 100644 --- a/interfaces/AbstractAccess.java +++ b/interfaces/AbstractAccess.java @@ -1,7 +1,7 @@ // interfaces/AbstractAccess.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. abstract class AbstractAccess { private void m1() {} diff --git a/interfaces/AbstractWithoutAbstracts.java b/interfaces/AbstractWithoutAbstracts.java index d2a84fda9..26c98daf4 100644 --- a/interfaces/AbstractWithoutAbstracts.java +++ b/interfaces/AbstractWithoutAbstracts.java @@ -1,7 +1,7 @@ // interfaces/AbstractWithoutAbstracts.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. abstract class Basic3 { int f() { return 111; } diff --git a/interfaces/AdaptedRandomDoubles.java b/interfaces/AdaptedRandomDoubles.java index 7dd6be66e..8d7cbb6b2 100644 --- a/interfaces/AdaptedRandomDoubles.java +++ b/interfaces/AdaptedRandomDoubles.java @@ -1,7 +1,7 @@ // interfaces/AdaptedRandomDoubles.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Creating an adapter with inheritance import java.nio.*; import java.util.*; diff --git a/interfaces/Adventure.java b/interfaces/Adventure.java index dacd94148..07f42e6ae 100644 --- a/interfaces/Adventure.java +++ b/interfaces/Adventure.java @@ -1,7 +1,7 @@ // interfaces/Adventure.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Multiple interfaces interface CanFight { diff --git a/interfaces/AnImplementation.java b/interfaces/AnImplementation.java index 7b510d2ec..74a88dc60 100644 --- a/interfaces/AnImplementation.java +++ b/interfaces/AnImplementation.java @@ -1,7 +1,7 @@ // interfaces/AnImplementation.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. public class AnImplementation implements AnInterface { public void firstMethod() { diff --git a/interfaces/AnInterface.java b/interfaces/AnInterface.java index 925da5202..ae6a42782 100644 --- a/interfaces/AnInterface.java +++ b/interfaces/AnInterface.java @@ -1,7 +1,7 @@ // interfaces/AnInterface.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. interface AnInterface { void firstMethod(); diff --git a/interfaces/Applicator.java b/interfaces/Applicator.java index ce148e750..3e992f156 100644 --- a/interfaces/Applicator.java +++ b/interfaces/Applicator.java @@ -1,7 +1,7 @@ // interfaces/Applicator.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.util.*; class Processor { diff --git a/interfaces/AttemptToUseBasic.java b/interfaces/AttemptToUseBasic.java index 07a23cd6c..1f6fb6c14 100644 --- a/interfaces/AttemptToUseBasic.java +++ b/interfaces/AttemptToUseBasic.java @@ -1,7 +1,7 @@ // interfaces/AttemptToUseBasic.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // {CompileTimeError} (Will not compile) public class AttemptToUseBasic { diff --git a/interfaces/Basic.java b/interfaces/Basic.java index f11569948..d17944166 100644 --- a/interfaces/Basic.java +++ b/interfaces/Basic.java @@ -1,7 +1,7 @@ // interfaces/Basic.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. abstract class Basic { abstract void unimplemented(); diff --git a/interfaces/Basic2.java b/interfaces/Basic2.java index 5676ab638..2fac1d653 100644 --- a/interfaces/Basic2.java +++ b/interfaces/Basic2.java @@ -1,7 +1,7 @@ // interfaces/Basic2.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. abstract class Basic2 extends Basic { int f() { return 111; } diff --git a/interfaces/Factories.java b/interfaces/Factories.java index 3d42dfedc..85feb9ee7 100644 --- a/interfaces/Factories.java +++ b/interfaces/Factories.java @@ -1,7 +1,7 @@ // interfaces/Factories.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. interface Service { void method1(); diff --git a/interfaces/Games.java b/interfaces/Games.java index faa04206f..51e58dd37 100644 --- a/interfaces/Games.java +++ b/interfaces/Games.java @@ -1,7 +1,7 @@ // interfaces/Games.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // A Game framework using Factory Methods interface Game { boolean move(); } diff --git a/interfaces/HorrorShow.java b/interfaces/HorrorShow.java index 694ac6062..948f1023a 100644 --- a/interfaces/HorrorShow.java +++ b/interfaces/HorrorShow.java @@ -1,7 +1,7 @@ // interfaces/HorrorShow.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Extending an interface with inheritance interface Monster { diff --git a/interfaces/Implementation2.java b/interfaces/Implementation2.java index 0d307d9ad..73dc8e202 100644 --- a/interfaces/Implementation2.java +++ b/interfaces/Implementation2.java @@ -1,7 +1,7 @@ // interfaces/Implementation2.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. public class Implementation2 implements InterfaceWithDefault { diff --git a/interfaces/ImplementingAnInterface.java b/interfaces/ImplementingAnInterface.java index adc49b426..8c8786699 100644 --- a/interfaces/ImplementingAnInterface.java +++ b/interfaces/ImplementingAnInterface.java @@ -1,7 +1,7 @@ // interfaces/ImplementingAnInterface.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. interface Concept { // Package access void idea1(); diff --git a/interfaces/Instantiable.java b/interfaces/Instantiable.java index 80fc254d4..0567d13b2 100644 --- a/interfaces/Instantiable.java +++ b/interfaces/Instantiable.java @@ -1,7 +1,7 @@ // interfaces/Instantiable.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. abstract class Uninstantiable { abstract void f(); diff --git a/interfaces/InterfaceCollision.java b/interfaces/InterfaceCollision.java index 4d761b9bd..64d4fd31f 100644 --- a/interfaces/InterfaceCollision.java +++ b/interfaces/InterfaceCollision.java @@ -1,7 +1,7 @@ // interfaces/InterfaceCollision.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. interface I1 { void f(); } interface I2 { int f(int i); } diff --git a/interfaces/InterfaceWithDefault.java b/interfaces/InterfaceWithDefault.java index 8b378d492..7edd6862a 100644 --- a/interfaces/InterfaceWithDefault.java +++ b/interfaces/InterfaceWithDefault.java @@ -1,7 +1,7 @@ // interfaces/InterfaceWithDefault.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. interface InterfaceWithDefault { void firstMethod(); diff --git a/interfaces/Jim.java b/interfaces/Jim.java index 6867be772..992b50834 100644 --- a/interfaces/Jim.java +++ b/interfaces/Jim.java @@ -1,7 +1,7 @@ // interfaces/Jim.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.util.*; interface Jim1 { diff --git a/interfaces/MICollision.java b/interfaces/MICollision.java index f257c27d2..f033d6f55 100644 --- a/interfaces/MICollision.java +++ b/interfaces/MICollision.java @@ -1,7 +1,7 @@ // interfaces/MICollision.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.util.*; interface Bob1 { diff --git a/interfaces/Machine.java b/interfaces/Machine.java index d807bd256..ea0ac9af8 100644 --- a/interfaces/Machine.java +++ b/interfaces/Machine.java @@ -1,7 +1,7 @@ // interfaces/Machine.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.util.*; import onjava.Operation; diff --git a/interfaces/Months.java b/interfaces/Months.java index baec98922..7e716b56d 100644 --- a/interfaces/Months.java +++ b/interfaces/Months.java @@ -1,7 +1,7 @@ // interfaces/Months.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Using interfaces to create groups of constants public interface Months { diff --git a/interfaces/MultipleInheritance.java b/interfaces/MultipleInheritance.java index ce47d8b86..f90eee23e 100644 --- a/interfaces/MultipleInheritance.java +++ b/interfaces/MultipleInheritance.java @@ -1,7 +1,7 @@ // interfaces/MultipleInheritance.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.util.*; interface One { diff --git a/interfaces/PureInterface.java b/interfaces/PureInterface.java index 8b8ea0e66..12e26b8bb 100644 --- a/interfaces/PureInterface.java +++ b/interfaces/PureInterface.java @@ -1,7 +1,7 @@ // interfaces/PureInterface.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Interface only looked like this before Java 8 public interface PureInterface { diff --git a/interfaces/RandVals.java b/interfaces/RandVals.java index 756314960..7602d0fc0 100644 --- a/interfaces/RandVals.java +++ b/interfaces/RandVals.java @@ -1,7 +1,7 @@ // interfaces/RandVals.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Initializing interface fields with // non-constant initializers import java.util.*; diff --git a/interfaces/RandomDoubles.java b/interfaces/RandomDoubles.java index c393c4ae7..19619b4cb 100644 --- a/interfaces/RandomDoubles.java +++ b/interfaces/RandomDoubles.java @@ -1,7 +1,7 @@ // interfaces/RandomDoubles.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.util.*; public interface RandomDoubles { diff --git a/interfaces/RandomWords.java b/interfaces/RandomWords.java index e1769bbdf..f744fd9eb 100644 --- a/interfaces/RandomWords.java +++ b/interfaces/RandomWords.java @@ -1,7 +1,7 @@ // interfaces/RandomWords.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Implementing an interface to conform to a method import java.nio.*; import java.util.*; diff --git a/interfaces/TestRandVals.java b/interfaces/TestRandVals.java index 17467e3c1..e7104a4bb 100644 --- a/interfaces/TestRandVals.java +++ b/interfaces/TestRandVals.java @@ -1,7 +1,7 @@ // interfaces/TestRandVals.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. public class TestRandVals { public static void main(String[] args) { diff --git a/interfaces/filters/BandPass.java b/interfaces/filters/BandPass.java index 28bad56c3..cc4353440 100644 --- a/interfaces/filters/BandPass.java +++ b/interfaces/filters/BandPass.java @@ -1,7 +1,7 @@ // interfaces/filters/BandPass.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. package interfaces.filters; public class BandPass extends Filter { diff --git a/interfaces/filters/Filter.java b/interfaces/filters/Filter.java index 59b2661d5..bea65947e 100644 --- a/interfaces/filters/Filter.java +++ b/interfaces/filters/Filter.java @@ -1,7 +1,7 @@ // interfaces/filters/Filter.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. package interfaces.filters; public class Filter { diff --git a/interfaces/filters/HighPass.java b/interfaces/filters/HighPass.java index 03b1600eb..26e0bd3b3 100644 --- a/interfaces/filters/HighPass.java +++ b/interfaces/filters/HighPass.java @@ -1,7 +1,7 @@ // interfaces/filters/HighPass.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. package interfaces.filters; public class HighPass extends Filter { diff --git a/interfaces/filters/LowPass.java b/interfaces/filters/LowPass.java index 4a21ba14d..d43601930 100644 --- a/interfaces/filters/LowPass.java +++ b/interfaces/filters/LowPass.java @@ -1,7 +1,7 @@ // interfaces/filters/LowPass.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. package interfaces.filters; public class LowPass extends Filter { diff --git a/interfaces/filters/Waveform.java b/interfaces/filters/Waveform.java index b2a9d6f71..50dca4320 100644 --- a/interfaces/filters/Waveform.java +++ b/interfaces/filters/Waveform.java @@ -1,7 +1,7 @@ // interfaces/filters/Waveform.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. package interfaces.filters; public class Waveform { diff --git a/interfaces/interfaceprocessor/Applicator.java b/interfaces/interfaceprocessor/Applicator.java index 12474a77c..bcf23ecc5 100644 --- a/interfaces/interfaceprocessor/Applicator.java +++ b/interfaces/interfaceprocessor/Applicator.java @@ -1,7 +1,7 @@ // interfaces/interfaceprocessor/Applicator.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. package interfaces.interfaceprocessor; public class Applicator { diff --git a/interfaces/interfaceprocessor/FilterProcessor.java b/interfaces/interfaceprocessor/FilterProcessor.java index 5df986d2a..96475b404 100644 --- a/interfaces/interfaceprocessor/FilterProcessor.java +++ b/interfaces/interfaceprocessor/FilterProcessor.java @@ -1,7 +1,7 @@ // interfaces/interfaceprocessor/FilterProcessor.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // {java interfaces.interfaceprocessor.FilterProcessor} package interfaces.interfaceprocessor; import interfaces.filters.*; diff --git a/interfaces/interfaceprocessor/Processor.java b/interfaces/interfaceprocessor/Processor.java index e0a1ebf50..49c576e09 100644 --- a/interfaces/interfaceprocessor/Processor.java +++ b/interfaces/interfaceprocessor/Processor.java @@ -1,7 +1,7 @@ // interfaces/interfaceprocessor/Processor.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. package interfaces.interfaceprocessor; public interface Processor { diff --git a/interfaces/interfaceprocessor/StringProcessor.java b/interfaces/interfaceprocessor/StringProcessor.java index f138e6f42..3078c3156 100644 --- a/interfaces/interfaceprocessor/StringProcessor.java +++ b/interfaces/interfaceprocessor/StringProcessor.java @@ -1,7 +1,7 @@ // interfaces/interfaceprocessor/StringProcessor.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // {java interfaces.interfaceprocessor.StringProcessor} package interfaces.interfaceprocessor; import java.util.*; diff --git a/interfaces/music4/Music4.java b/interfaces/music4/Music4.java index d3077fff0..43e91e84a 100644 --- a/interfaces/music4/Music4.java +++ b/interfaces/music4/Music4.java @@ -1,7 +1,7 @@ // interfaces/music4/Music4.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Abstract classes and methods // {java interfaces.music4.Music4} package interfaces.music4; diff --git a/interfaces/music5/Music5.java b/interfaces/music5/Music5.java index 2ac4b7f8d..f2e396e0c 100644 --- a/interfaces/music5/Music5.java +++ b/interfaces/music5/Music5.java @@ -1,7 +1,7 @@ // interfaces/music5/Music5.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // {java interfaces.music5.Music5} package interfaces.music5; import polymorphism.music.Note; diff --git a/interfaces/nesting/NestingInterfaces.java b/interfaces/nesting/NestingInterfaces.java index 4b3985adc..97c5e6c87 100644 --- a/interfaces/nesting/NestingInterfaces.java +++ b/interfaces/nesting/NestingInterfaces.java @@ -1,7 +1,7 @@ // interfaces/nesting/NestingInterfaces.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // {java interfaces.nesting.NestingInterfaces} package interfaces.nesting; diff --git a/iostreams/BasicFileOutput.java b/iostreams/BasicFileOutput.java index 490cb58c8..24cbcf3d4 100644 --- a/iostreams/BasicFileOutput.java +++ b/iostreams/BasicFileOutput.java @@ -1,7 +1,7 @@ // iostreams/BasicFileOutput.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // {ValidateByHand} import java.io.*; diff --git a/iostreams/BufferedInputFile.java b/iostreams/BufferedInputFile.java index 4e3871ee1..05c6ca407 100644 --- a/iostreams/BufferedInputFile.java +++ b/iostreams/BufferedInputFile.java @@ -1,7 +1,7 @@ // iostreams/BufferedInputFile.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // {ValidateByHand} import java.io.*; diff --git a/iostreams/FileOutputShortcut.java b/iostreams/FileOutputShortcut.java index de0a30488..a52893899 100644 --- a/iostreams/FileOutputShortcut.java +++ b/iostreams/FileOutputShortcut.java @@ -1,7 +1,7 @@ // iostreams/FileOutputShortcut.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // {ValidateByHand} import java.io.*; diff --git a/iostreams/FormattedMemoryInput.java b/iostreams/FormattedMemoryInput.java index 73a511fc4..c0bf8b4cd 100644 --- a/iostreams/FormattedMemoryInput.java +++ b/iostreams/FormattedMemoryInput.java @@ -1,7 +1,7 @@ // iostreams/FormattedMemoryInput.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // {ValidateByHand} import java.io.*; diff --git a/iostreams/MemoryInput.java b/iostreams/MemoryInput.java index d2cb05336..82f332b83 100644 --- a/iostreams/MemoryInput.java +++ b/iostreams/MemoryInput.java @@ -1,7 +1,7 @@ // iostreams/MemoryInput.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // {ValidateByHand} import java.io.*; diff --git a/iostreams/StoringAndRecoveringData.java b/iostreams/StoringAndRecoveringData.java index 8e0800627..37320f249 100644 --- a/iostreams/StoringAndRecoveringData.java +++ b/iostreams/StoringAndRecoveringData.java @@ -1,7 +1,7 @@ // iostreams/StoringAndRecoveringData.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.io.*; public class StoringAndRecoveringData { diff --git a/iostreams/TestEOF.java b/iostreams/TestEOF.java index ea1168cd5..8498bfa18 100644 --- a/iostreams/TestEOF.java +++ b/iostreams/TestEOF.java @@ -1,7 +1,7 @@ // iostreams/TestEOF.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Testing for end of file // {ValidateByHand} import java.io.*; diff --git a/iostreams/UsingRandomAccessFile.java b/iostreams/UsingRandomAccessFile.java index 6dcdd7e26..c9708a9ba 100644 --- a/iostreams/UsingRandomAccessFile.java +++ b/iostreams/UsingRandomAccessFile.java @@ -1,7 +1,7 @@ // iostreams/UsingRandomAccessFile.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.io.*; public class UsingRandomAccessFile { diff --git a/network/ChatterClient.java b/network/ChatterClient.java index 403361548..f2547cfce 100644 --- a/network/ChatterClient.java +++ b/network/ChatterClient.java @@ -1,7 +1,7 @@ // network/ChatterClient.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Starts multiple clients, each of which sends datagrams. package network; import java.net.*; diff --git a/network/ChatterServer.java b/network/ChatterServer.java index 72974cf6c..a5d679db0 100644 --- a/network/ChatterServer.java +++ b/network/ChatterServer.java @@ -1,7 +1,7 @@ // network/ChatterServer.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // A server that echoes datagrams package network; import java.net.*; diff --git a/network/Dgram.java b/network/Dgram.java index e1544ae63..cfd0bafcb 100644 --- a/network/Dgram.java +++ b/network/Dgram.java @@ -1,7 +1,7 @@ // network/Dgram.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Converts between Strings and DataGramPackets package network; import java.net.*; diff --git a/network/LocalHost.java b/network/LocalHost.java index f191c1148..1da36fda3 100644 --- a/network/LocalHost.java +++ b/network/LocalHost.java @@ -1,7 +1,7 @@ // network/LocalHost.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // The local loopback IP address import java.net.*; diff --git a/network/MultiServer.java b/network/MultiServer.java index e13756e27..2038c7e8a 100644 --- a/network/MultiServer.java +++ b/network/MultiServer.java @@ -1,7 +1,7 @@ // network/MultiServer.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Uses threads to handle any number of clients. package network; import java.io.*; diff --git a/network/SimpleClient.java b/network/SimpleClient.java index 601d6646b..a38f98ce6 100644 --- a/network/SimpleClient.java +++ b/network/SimpleClient.java @@ -1,7 +1,7 @@ // network/SimpleClient.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Sends lines to the server and // reads lines the server sends. package network; diff --git a/network/SimpleClient2.java b/network/SimpleClient2.java index 0f6e0f79a..06b4b22c1 100644 --- a/network/SimpleClient2.java +++ b/network/SimpleClient2.java @@ -1,7 +1,7 @@ // network/SimpleClient2.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. package network; import java.net.*; import java.io.*; diff --git a/network/SimpleServer.java b/network/SimpleServer.java index 719aed7f0..1ee721f42 100644 --- a/network/SimpleServer.java +++ b/network/SimpleServer.java @@ -1,7 +1,7 @@ // network/SimpleServer.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Echoes what the client sends. package network; import java.io.*; diff --git a/network/WhoAmI.java b/network/WhoAmI.java index 5ded836f1..e09b56b0b 100644 --- a/network/WhoAmI.java +++ b/network/WhoAmI.java @@ -1,7 +1,7 @@ // network/WhoAmI.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Discovers your machine name and network address. import java.net.*; diff --git a/network/tests/ChatterTest.java b/network/tests/ChatterTest.java index 1175b5935..97de353cd 100644 --- a/network/tests/ChatterTest.java +++ b/network/tests/ChatterTest.java @@ -1,7 +1,7 @@ // network/tests/ChatterTest.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. package network; import java.net.*; import org.junit.jupiter.api.*; diff --git a/network/tests/MultiTest.java b/network/tests/MultiTest.java index 175e6fb4d..bb0ec1e03 100644 --- a/network/tests/MultiTest.java +++ b/network/tests/MultiTest.java @@ -1,7 +1,7 @@ // network/tests/MultiTest.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. package network; import java.net.*; import org.junit.jupiter.api.*; diff --git a/network/tests/TestSimpleServerClient.java b/network/tests/TestSimpleServerClient.java index 33c79f45c..cc3618cb8 100644 --- a/network/tests/TestSimpleServerClient.java +++ b/network/tests/TestSimpleServerClient.java @@ -1,7 +1,7 @@ // network/tests/TestSimpleServerClient.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. package network; import java.net.*; import org.junit.jupiter.api.*; diff --git a/newio/AvailableCharSets.java b/newio/AvailableCharSets.java index 00f7326e6..442ad380b 100644 --- a/newio/AvailableCharSets.java +++ b/newio/AvailableCharSets.java @@ -1,7 +1,7 @@ // newio/AvailableCharSets.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Displays Charsets and aliases import java.nio.charset.*; import java.util.*; diff --git a/newio/BufferToText.java b/newio/BufferToText.java index c5bc163e1..79aa21ebf 100644 --- a/newio/BufferToText.java +++ b/newio/BufferToText.java @@ -1,7 +1,7 @@ // newio/BufferToText.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Converting text to and from ByteBuffers import java.nio.*; import java.nio.channels.*; diff --git a/newio/ChannelCopy.java b/newio/ChannelCopy.java index c3747482c..8f335eb0e 100644 --- a/newio/ChannelCopy.java +++ b/newio/ChannelCopy.java @@ -1,7 +1,7 @@ // newio/ChannelCopy.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Copying a file using channels and buffers // {java ChannelCopy ChannelCopy.java test.txt} import java.nio.*; diff --git a/newio/Endians.java b/newio/Endians.java index a0fc87608..afa516ac7 100644 --- a/newio/Endians.java +++ b/newio/Endians.java @@ -1,7 +1,7 @@ // newio/Endians.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Endian differences and data storage import java.nio.*; import java.util.*; diff --git a/newio/FileLocking.java b/newio/FileLocking.java index 68e044d6f..a3ba350f2 100644 --- a/newio/FileLocking.java +++ b/newio/FileLocking.java @@ -1,7 +1,7 @@ // newio/FileLocking.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.nio.channels.*; import java.util.concurrent.*; import java.io.*; diff --git a/newio/GetData.java b/newio/GetData.java index 9d0421c3b..22e2001b6 100644 --- a/newio/GetData.java +++ b/newio/GetData.java @@ -1,7 +1,7 @@ // newio/GetData.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Getting different representations from a ByteBuffer import java.nio.*; diff --git a/newio/IntBufferDemo.java b/newio/IntBufferDemo.java index dd11d3ece..e0e17a7e4 100644 --- a/newio/IntBufferDemo.java +++ b/newio/IntBufferDemo.java @@ -1,7 +1,7 @@ // newio/IntBufferDemo.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Manipulating ints in a ByteBuffer with an IntBuffer import java.nio.*; diff --git a/newio/LargeMappedFiles.java b/newio/LargeMappedFiles.java index ff8455390..c9d577056 100644 --- a/newio/LargeMappedFiles.java +++ b/newio/LargeMappedFiles.java @@ -1,7 +1,7 @@ // newio/LargeMappedFiles.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Creating a very large file using mapping import java.nio.*; import java.nio.channels.*; diff --git a/newio/LockingMappedFiles.java b/newio/LockingMappedFiles.java index 20c8205b6..1f88945ae 100644 --- a/newio/LockingMappedFiles.java +++ b/newio/LockingMappedFiles.java @@ -1,7 +1,7 @@ // newio/LockingMappedFiles.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Locking portions of a mapped file import java.nio.*; import java.nio.channels.*; diff --git a/newio/TransferTo.java b/newio/TransferTo.java index b2b883f07..7680384e6 100644 --- a/newio/TransferTo.java +++ b/newio/TransferTo.java @@ -1,7 +1,7 @@ // newio/TransferTo.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Using transferTo() between channels // {java TransferTo TransferTo.java TransferTo.txt} import java.nio.channels.*; diff --git a/newio/UsingBuffers.java b/newio/UsingBuffers.java index 3acf6c7a1..b6c9209f6 100644 --- a/newio/UsingBuffers.java +++ b/newio/UsingBuffers.java @@ -1,7 +1,7 @@ // newio/UsingBuffers.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.nio.*; public class UsingBuffers { diff --git a/newio/ViewBuffers.java b/newio/ViewBuffers.java index a3fa9b057..ce6c51ee3 100644 --- a/newio/ViewBuffers.java +++ b/newio/ViewBuffers.java @@ -1,7 +1,7 @@ // newio/ViewBuffers.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.nio.*; public class ViewBuffers { diff --git a/objects/Documentation1.java b/objects/Documentation1.java index a9476975f..91ae9619d 100644 --- a/objects/Documentation1.java +++ b/objects/Documentation1.java @@ -1,7 +1,7 @@ // objects/Documentation1.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. /** A class comment */ public class Documentation1 { /** A field comment */ diff --git a/objects/Documentation2.java b/objects/Documentation2.java index 0a403f2ca..88569b348 100644 --- a/objects/Documentation2.java +++ b/objects/Documentation2.java @@ -1,7 +1,7 @@ // objects/Documentation2.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. /**
  * System.out.println(new Date());
  * 
diff --git a/objects/Documentation3.java b/objects/Documentation3.java index f69f452e6..56e01334f 100644 --- a/objects/Documentation3.java +++ b/objects/Documentation3.java @@ -1,7 +1,7 @@ // objects/Documentation3.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. /** You can even insert a list: *
    *
  1. Item one diff --git a/objects/HelloDate.java b/objects/HelloDate.java index c8d103ac0..73530bb3b 100644 --- a/objects/HelloDate.java +++ b/objects/HelloDate.java @@ -1,7 +1,7 @@ // objects/HelloDate.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.util.*; /** The first On Java example program. diff --git a/objects/ShowProperties.java b/objects/ShowProperties.java index ef3d4de27..84471df47 100644 --- a/objects/ShowProperties.java +++ b/objects/ShowProperties.java @@ -1,7 +1,7 @@ // objects/ShowProperties.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. public class ShowProperties { public static void main(String[] args) { diff --git a/onjava/ArrayShow.java b/onjava/ArrayShow.java index 078d93737..4e94ad374 100644 --- a/onjava/ArrayShow.java +++ b/onjava/ArrayShow.java @@ -1,7 +1,7 @@ // onjava/ArrayShow.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. package onjava; import java.util.*; diff --git a/onjava/BasicSupplier.java b/onjava/BasicSupplier.java index e1c7e855f..6971478f7 100644 --- a/onjava/BasicSupplier.java +++ b/onjava/BasicSupplier.java @@ -1,7 +1,7 @@ // onjava/BasicSupplier.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Supplier from a class with a no-arg constructor package onjava; import java.util.function.*; diff --git a/onjava/CollectionMethodDifferences.java b/onjava/CollectionMethodDifferences.java index dec100afb..a848b333e 100644 --- a/onjava/CollectionMethodDifferences.java +++ b/onjava/CollectionMethodDifferences.java @@ -1,7 +1,7 @@ // onjava/CollectionMethodDifferences.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // {java onjava.CollectionMethodDifferences} package onjava; import java.lang.reflect.*; diff --git a/onjava/ConvertTo.java b/onjava/ConvertTo.java index 3d4fd8504..015d636b6 100644 --- a/onjava/ConvertTo.java +++ b/onjava/ConvertTo.java @@ -1,7 +1,7 @@ // onjava/ConvertTo.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. package onjava; public interface ConvertTo { diff --git a/onjava/Count.java b/onjava/Count.java index aba219703..0a5f717e0 100644 --- a/onjava/Count.java +++ b/onjava/Count.java @@ -1,7 +1,7 @@ // onjava/Count.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Generate incremental values of different types package onjava; import java.util.*; diff --git a/onjava/CountMap.java b/onjava/CountMap.java index 72a174e88..791a2fddf 100644 --- a/onjava/CountMap.java +++ b/onjava/CountMap.java @@ -1,7 +1,7 @@ // onjava/CountMap.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Unlimited-length Map containing sample data // {java onjava.CountMap} package onjava; diff --git a/onjava/CountingIntegerList.java b/onjava/CountingIntegerList.java index c457f1b8e..f299424a9 100644 --- a/onjava/CountingIntegerList.java +++ b/onjava/CountingIntegerList.java @@ -1,7 +1,7 @@ // onjava/CountingIntegerList.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // List of any length, containing sample data // {java onjava.CountingIntegerList} package onjava; diff --git a/onjava/Countries.java b/onjava/Countries.java index e94458999..6cc8d6461 100644 --- a/onjava/Countries.java +++ b/onjava/Countries.java @@ -1,7 +1,7 @@ // onjava/Countries.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // "Flyweight" Maps and Lists of sample data // {java onjava.Countries} package onjava; diff --git a/onjava/Enums.java b/onjava/Enums.java index a9d1c85b0..26f625a2c 100644 --- a/onjava/Enums.java +++ b/onjava/Enums.java @@ -1,7 +1,7 @@ // onjava/Enums.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. package onjava; import java.util.*; diff --git a/onjava/FillMap.java b/onjava/FillMap.java index ff271d9de..880abe2c8 100644 --- a/onjava/FillMap.java +++ b/onjava/FillMap.java @@ -1,7 +1,7 @@ // onjava/FillMap.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. package onjava; import java.util.*; import java.util.function.*; diff --git a/onjava/Hex.java b/onjava/Hex.java index 29c9b0ddc..a1cbaf2b0 100644 --- a/onjava/Hex.java +++ b/onjava/Hex.java @@ -1,7 +1,7 @@ // onjava/Hex.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // {java onjava.Hex} package onjava; import java.io.*; diff --git a/onjava/MouseClick.java b/onjava/MouseClick.java index 801a8ff5d..39259efc3 100644 --- a/onjava/MouseClick.java +++ b/onjava/MouseClick.java @@ -1,7 +1,7 @@ // onjava/MouseClick.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Helper interface to allow lambda expressions package onjava; import java.awt.event.*; diff --git a/onjava/Null.java b/onjava/Null.java index 6d5cdc67b..a89f81026 100644 --- a/onjava/Null.java +++ b/onjava/Null.java @@ -1,6 +1,6 @@ // onjava/Null.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. package onjava; public interface Null {} diff --git a/onjava/OSExecute.java b/onjava/OSExecute.java index 6c9a59549..df2d1e2ae 100644 --- a/onjava/OSExecute.java +++ b/onjava/OSExecute.java @@ -1,7 +1,7 @@ // onjava/OSExecute.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Run an operating system command // and send the output to the console package onjava; diff --git a/onjava/OSExecuteException.java b/onjava/OSExecuteException.java index e8cb89192..aa3a372dd 100644 --- a/onjava/OSExecuteException.java +++ b/onjava/OSExecuteException.java @@ -1,7 +1,7 @@ // onjava/OSExecuteException.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. package onjava; public class OSExecuteException extends RuntimeException { diff --git a/onjava/Operation.java b/onjava/Operation.java index ca97d129b..804500e68 100644 --- a/onjava/Operation.java +++ b/onjava/Operation.java @@ -1,7 +1,7 @@ // onjava/Operation.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. package onjava; import java.util.*; diff --git a/onjava/Pair.java b/onjava/Pair.java index 55455e639..7eae2909d 100644 --- a/onjava/Pair.java +++ b/onjava/Pair.java @@ -1,7 +1,7 @@ // onjava/Pair.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. package onjava; public class Pair { diff --git a/onjava/ProcessFiles.java b/onjava/ProcessFiles.java index 583f27f63..c2d927541 100644 --- a/onjava/ProcessFiles.java +++ b/onjava/ProcessFiles.java @@ -1,7 +1,7 @@ // onjava/ProcessFiles.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // {ValidateByHand} // {java onjava.ProcessFiles} package onjava; diff --git a/onjava/Rand.java b/onjava/Rand.java index d8f075b4f..10dc8b215 100644 --- a/onjava/Rand.java +++ b/onjava/Rand.java @@ -1,7 +1,7 @@ // onjava/Rand.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Generate random values of different types package onjava; import java.util.*; diff --git a/onjava/Range.java b/onjava/Range.java index 70565c699..1def5045b 100644 --- a/onjava/Range.java +++ b/onjava/Range.java @@ -1,7 +1,7 @@ // onjava/Range.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Array creation methods that can be used without // qualifiers, using static imports: package onjava; diff --git a/onjava/Repeat.java b/onjava/Repeat.java index c1c954e0a..97257967f 100644 --- a/onjava/Repeat.java +++ b/onjava/Repeat.java @@ -1,7 +1,7 @@ // onjava/Repeat.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. package onjava; import static java.util.stream.IntStream.*; diff --git a/onjava/RmDir.java b/onjava/RmDir.java index 1d4e7d655..864e1454d 100644 --- a/onjava/RmDir.java +++ b/onjava/RmDir.java @@ -1,7 +1,7 @@ // onjava/RmDir.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. package onjava; import java.nio.file.*; import java.nio.file.attribute.BasicFileAttributes; diff --git a/onjava/Sets.java b/onjava/Sets.java index bdd11e2fb..4500349a6 100644 --- a/onjava/Sets.java +++ b/onjava/Sets.java @@ -1,7 +1,7 @@ // onjava/Sets.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. package onjava; import java.util.*; diff --git a/onjava/Sleep.java b/onjava/Sleep.java index d30658ae9..b3c042135 100644 --- a/onjava/Sleep.java +++ b/onjava/Sleep.java @@ -1,7 +1,7 @@ // onjava/Sleep.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Sleep for n seconds package onjava; import java.util.concurrent.*; diff --git a/onjava/Stack.java b/onjava/Stack.java index 0ef58a068..a1687606f 100644 --- a/onjava/Stack.java +++ b/onjava/Stack.java @@ -1,7 +1,7 @@ // onjava/Stack.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // A Stack class built with an ArrayDeque package onjava; import java.util.Deque; diff --git a/onjava/Suppliers.java b/onjava/Suppliers.java index c04f45270..a7c52eb78 100644 --- a/onjava/Suppliers.java +++ b/onjava/Suppliers.java @@ -1,7 +1,7 @@ // onjava/Suppliers.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // A utility to use with Suppliers package onjava; import java.util.*; diff --git a/onjava/TimedAbort.java b/onjava/TimedAbort.java index 69fbfd7c5..b4be68c16 100644 --- a/onjava/TimedAbort.java +++ b/onjava/TimedAbort.java @@ -1,7 +1,7 @@ // onjava/TimedAbort.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Terminate a program after n seconds package onjava; import java.util.*; diff --git a/onjava/Tuple.java b/onjava/Tuple.java index ac6bef81f..dc75b7983 100644 --- a/onjava/Tuple.java +++ b/onjava/Tuple.java @@ -1,7 +1,7 @@ // onjava/Tuple.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Tuple library using type argument inference package onjava; diff --git a/onjava/Tuple2.java b/onjava/Tuple2.java index 1979dc84c..ec7f86d29 100644 --- a/onjava/Tuple2.java +++ b/onjava/Tuple2.java @@ -1,7 +1,7 @@ // onjava/Tuple2.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. package onjava; public class Tuple2 { diff --git a/onjava/Tuple3.java b/onjava/Tuple3.java index f324a56d7..aeb3c4c3b 100644 --- a/onjava/Tuple3.java +++ b/onjava/Tuple3.java @@ -1,7 +1,7 @@ // onjava/Tuple3.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. package onjava; public class Tuple3 extends Tuple2 { diff --git a/onjava/Tuple4.java b/onjava/Tuple4.java index 3b95e62e6..1adb02fd6 100644 --- a/onjava/Tuple4.java +++ b/onjava/Tuple4.java @@ -1,7 +1,7 @@ // onjava/Tuple4.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. package onjava; public class Tuple4 diff --git a/onjava/Tuple5.java b/onjava/Tuple5.java index b4dc16c53..b10ebfec9 100644 --- a/onjava/Tuple5.java +++ b/onjava/Tuple5.java @@ -1,7 +1,7 @@ // onjava/Tuple5.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. package onjava; public class Tuple5 diff --git a/onjava/TypeCounter.java b/onjava/TypeCounter.java index f94a8bd49..a314ec311 100644 --- a/onjava/TypeCounter.java +++ b/onjava/TypeCounter.java @@ -1,7 +1,7 @@ // onjava/TypeCounter.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Counts instances of a type family package onjava; import java.util.*; diff --git a/onjava/atunit/AtUnit.java b/onjava/atunit/AtUnit.java index 34b1f6c5f..c22048245 100644 --- a/onjava/atunit/AtUnit.java +++ b/onjava/atunit/AtUnit.java @@ -1,7 +1,7 @@ // onjava/atunit/AtUnit.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // An annotation-based unit-test framework // {java onjava.atunit.AtUnit} package onjava.atunit; diff --git a/onjava/atunit/ClassNameFinder.java b/onjava/atunit/ClassNameFinder.java index 55e336948..8c0eff78d 100644 --- a/onjava/atunit/ClassNameFinder.java +++ b/onjava/atunit/ClassNameFinder.java @@ -1,7 +1,7 @@ // onjava/atunit/ClassNameFinder.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // {java onjava.atunit.ClassNameFinder} package onjava.atunit; import java.io.*; diff --git a/onjava/atunit/Test.java b/onjava/atunit/Test.java index 4946c4c56..f45818b09 100644 --- a/onjava/atunit/Test.java +++ b/onjava/atunit/Test.java @@ -1,7 +1,7 @@ // onjava/atunit/Test.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // The @Test tag package onjava.atunit; import java.lang.annotation.*; diff --git a/onjava/atunit/TestObjectCleanup.java b/onjava/atunit/TestObjectCleanup.java index 35c6b019c..69036c0e9 100644 --- a/onjava/atunit/TestObjectCleanup.java +++ b/onjava/atunit/TestObjectCleanup.java @@ -1,7 +1,7 @@ // onjava/atunit/TestObjectCleanup.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // The @Unit @TestObjectCleanup tag package onjava.atunit; import java.lang.annotation.*; diff --git a/onjava/atunit/TestObjectCreate.java b/onjava/atunit/TestObjectCreate.java index 8b7271b29..aa2d68ce5 100644 --- a/onjava/atunit/TestObjectCreate.java +++ b/onjava/atunit/TestObjectCreate.java @@ -1,7 +1,7 @@ // onjava/atunit/TestObjectCreate.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // The @Unit @TestObjectCreate tag package onjava.atunit; import java.lang.annotation.*; diff --git a/onjava/atunit/TestProperty.java b/onjava/atunit/TestProperty.java index d13fd5a11..04c41d825 100644 --- a/onjava/atunit/TestProperty.java +++ b/onjava/atunit/TestProperty.java @@ -1,7 +1,7 @@ // onjava/atunit/TestProperty.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // The @Unit @TestProperty tag package onjava.atunit; import java.lang.annotation.*; diff --git a/operators/AllOps.java b/operators/AllOps.java index b0afec165..59fb13dcc 100644 --- a/operators/AllOps.java +++ b/operators/AllOps.java @@ -1,7 +1,7 @@ // operators/AllOps.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Tests all operators on all primitive data types // to show which ones are accepted by the Java compiler diff --git a/operators/Assignment.java b/operators/Assignment.java index 9e57fbb6d..1ca645c89 100644 --- a/operators/Assignment.java +++ b/operators/Assignment.java @@ -1,7 +1,7 @@ // operators/Assignment.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Assignment with objects is a bit tricky class Tank { diff --git a/operators/AutoInc.java b/operators/AutoInc.java index ee1ad5878..bed3340c9 100644 --- a/operators/AutoInc.java +++ b/operators/AutoInc.java @@ -1,7 +1,7 @@ // operators/AutoInc.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Demonstrates the ++ and -- operators public class AutoInc { diff --git a/operators/BitManipulation.java b/operators/BitManipulation.java index 5541c9c23..815599a54 100644 --- a/operators/BitManipulation.java +++ b/operators/BitManipulation.java @@ -1,7 +1,7 @@ // operators/BitManipulation.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Using the bitwise operators import java.util.*; diff --git a/operators/Bool.java b/operators/Bool.java index e2b885a55..125d8f29c 100644 --- a/operators/Bool.java +++ b/operators/Bool.java @@ -1,7 +1,7 @@ // operators/Bool.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Relational and logical operators import java.util.*; diff --git a/operators/Casting.java b/operators/Casting.java index ed2bf7164..2d22475f3 100644 --- a/operators/Casting.java +++ b/operators/Casting.java @@ -1,7 +1,7 @@ // operators/Casting.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. public class Casting { public static void main(String[] args) { diff --git a/operators/CastingNumbers.java b/operators/CastingNumbers.java index 0f37c7d4d..7c2916505 100644 --- a/operators/CastingNumbers.java +++ b/operators/CastingNumbers.java @@ -1,7 +1,7 @@ // operators/CastingNumbers.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // What happens when you cast a float // or double to an integral value? diff --git a/operators/EqualsMethod.java b/operators/EqualsMethod.java index fbdb099c6..90e380066 100644 --- a/operators/EqualsMethod.java +++ b/operators/EqualsMethod.java @@ -1,7 +1,7 @@ // operators/EqualsMethod.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. public class EqualsMethod { public static void main(String[] args) { diff --git a/operators/EqualsMethod2.java b/operators/EqualsMethod2.java index 2c4f81961..857c27d55 100644 --- a/operators/EqualsMethod2.java +++ b/operators/EqualsMethod2.java @@ -1,7 +1,7 @@ // operators/EqualsMethod2.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Default equals() does not compare contents class Value { diff --git a/operators/Equivalence.java b/operators/Equivalence.java index e9fdcc701..4a0ddf9a1 100644 --- a/operators/Equivalence.java +++ b/operators/Equivalence.java @@ -1,7 +1,7 @@ // operators/Equivalence.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. public class Equivalence { public static void main(String[] args) { diff --git a/operators/Exponents.java b/operators/Exponents.java index 4881b6f3d..21a027a05 100644 --- a/operators/Exponents.java +++ b/operators/Exponents.java @@ -1,7 +1,7 @@ // operators/Exponents.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // "e" means "10 to the power." public class Exponents { diff --git a/operators/Literals.java b/operators/Literals.java index 35947e41d..c3e003da7 100644 --- a/operators/Literals.java +++ b/operators/Literals.java @@ -1,7 +1,7 @@ // operators/Literals.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. public class Literals { public static void main(String[] args) { diff --git a/operators/MathOps.java b/operators/MathOps.java index a75fd84a9..1fd7b531a 100644 --- a/operators/MathOps.java +++ b/operators/MathOps.java @@ -1,7 +1,7 @@ // operators/MathOps.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // The mathematical operators import java.util.*; diff --git a/operators/Overflow.java b/operators/Overflow.java index 4e75edcda..dfb207ad5 100644 --- a/operators/Overflow.java +++ b/operators/Overflow.java @@ -1,7 +1,7 @@ // operators/Overflow.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Surprise! Java lets you overflow public class Overflow { diff --git a/operators/PassObject.java b/operators/PassObject.java index f1e9564f2..50b7793ab 100644 --- a/operators/PassObject.java +++ b/operators/PassObject.java @@ -1,7 +1,7 @@ // operators/PassObject.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Passing objects to methods might not be // what you're used to diff --git a/operators/Precedence.java b/operators/Precedence.java index 8d3f95bd7..b77adfe51 100644 --- a/operators/Precedence.java +++ b/operators/Precedence.java @@ -1,7 +1,7 @@ // operators/Precedence.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. public class Precedence { public static void main(String[] args) { diff --git a/operators/RoundingNumbers.java b/operators/RoundingNumbers.java index c98d62813..d6ebcc32c 100644 --- a/operators/RoundingNumbers.java +++ b/operators/RoundingNumbers.java @@ -1,7 +1,7 @@ // operators/RoundingNumbers.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Rounding floats and doubles public class RoundingNumbers { diff --git a/operators/ShortCircuit.java b/operators/ShortCircuit.java index 3f58f82e2..d0c586a4d 100644 --- a/operators/ShortCircuit.java +++ b/operators/ShortCircuit.java @@ -1,7 +1,7 @@ // operators/ShortCircuit.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Short-circuiting behavior with logical operators public class ShortCircuit { diff --git a/operators/StringOperators.java b/operators/StringOperators.java index d247f9b88..65da96e06 100644 --- a/operators/StringOperators.java +++ b/operators/StringOperators.java @@ -1,7 +1,7 @@ // operators/StringOperators.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. public class StringOperators { public static void main(String[] args) { diff --git a/operators/TernaryIfElse.java b/operators/TernaryIfElse.java index 83ad41e51..d7e36fb32 100644 --- a/operators/TernaryIfElse.java +++ b/operators/TernaryIfElse.java @@ -1,7 +1,7 @@ // operators/TernaryIfElse.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. public class TernaryIfElse { static int ternary(int i) { diff --git a/operators/URShift.java b/operators/URShift.java index e2ae68ddf..51ebabe39 100644 --- a/operators/URShift.java +++ b/operators/URShift.java @@ -1,7 +1,7 @@ // operators/URShift.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Test of unsigned right shift public class URShift { diff --git a/operators/Underscores.java b/operators/Underscores.java index 36b6625c0..de9a0c1e9 100644 --- a/operators/Underscores.java +++ b/operators/Underscores.java @@ -1,7 +1,7 @@ // operators/Underscores.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. public class Underscores { public static void main(String[] args) { diff --git a/patterns/CommandPattern.java b/patterns/CommandPattern.java index 774d9d849..3bf0a508b 100644 --- a/patterns/CommandPattern.java +++ b/patterns/CommandPattern.java @@ -1,7 +1,7 @@ // patterns/CommandPattern.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.util.*; public class CommandPattern { diff --git a/patterns/Facade.java b/patterns/Facade.java index 606324a2e..0e708ff45 100644 --- a/patterns/Facade.java +++ b/patterns/Facade.java @@ -1,7 +1,7 @@ // patterns/Facade.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. class A { public A(int x) {} } class B { public B(long x) {} } diff --git a/patterns/PaperScissorsRock.java b/patterns/PaperScissorsRock.java index 29e8b0bba..247641b52 100644 --- a/patterns/PaperScissorsRock.java +++ b/patterns/PaperScissorsRock.java @@ -1,7 +1,7 @@ // patterns/PaperScissorsRock.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Demonstration of multiple dispatching import java.util.*; import java.util.function.*; diff --git a/patterns/ProxyDemo.java b/patterns/ProxyDemo.java index 1323a97fe..d7d9cd2c3 100644 --- a/patterns/ProxyDemo.java +++ b/patterns/ProxyDemo.java @@ -1,7 +1,7 @@ // patterns/ProxyDemo.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Simple demonstration of the Proxy pattern interface ProxyBase { diff --git a/patterns/ShapeFactory2.java b/patterns/ShapeFactory2.java index 692e487e8..4a66eb0ba 100644 --- a/patterns/ShapeFactory2.java +++ b/patterns/ShapeFactory2.java @@ -1,7 +1,7 @@ // patterns/ShapeFactory2.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Polymorphic factory methods import java.util.*; import java.util.function.*; diff --git a/patterns/StateDemo.java b/patterns/StateDemo.java index 4a738b9e6..e369cd1d4 100644 --- a/patterns/StateDemo.java +++ b/patterns/StateDemo.java @@ -1,7 +1,7 @@ // patterns/StateDemo.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Simple demonstration of the State pattern interface StateBase { diff --git a/patterns/TemplateMethod.java b/patterns/TemplateMethod.java index 4a98f4971..b6b6ad9ee 100644 --- a/patterns/TemplateMethod.java +++ b/patterns/TemplateMethod.java @@ -1,7 +1,7 @@ // patterns/TemplateMethod.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Simple demonstration of Template Method import java.util.stream.*; diff --git a/patterns/absfactory/GameEnvironment.java b/patterns/absfactory/GameEnvironment.java index 26f2e47ad..79ef9d185 100644 --- a/patterns/absfactory/GameEnvironment.java +++ b/patterns/absfactory/GameEnvironment.java @@ -1,7 +1,7 @@ // patterns/absfactory/GameEnvironment.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // An example of the Abstract Factory pattern // {java patterns.absfactory.GameEnvironment} package patterns.absfactory; diff --git a/patterns/adapt/Adapter.java b/patterns/adapt/Adapter.java index 7001c8781..ad699dc77 100644 --- a/patterns/adapt/Adapter.java +++ b/patterns/adapt/Adapter.java @@ -1,7 +1,7 @@ // patterns/adapt/Adapter.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Variations on the Adapter pattern // {java patterns.adapt.Adapter} package patterns.adapt; diff --git a/patterns/chain/ChainOfResponsibility.java b/patterns/chain/ChainOfResponsibility.java index f94b7cbc7..c6a75a5ef 100644 --- a/patterns/chain/ChainOfResponsibility.java +++ b/patterns/chain/ChainOfResponsibility.java @@ -1,7 +1,7 @@ // patterns/chain/ChainOfResponsibility.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Using the Functional interface // {java patterns.chain.ChainOfResponsibility} package patterns.chain; diff --git a/patterns/doubledispatch/Aluminum.java b/patterns/doubledispatch/Aluminum.java index 75d9e7245..f270036f4 100644 --- a/patterns/doubledispatch/Aluminum.java +++ b/patterns/doubledispatch/Aluminum.java @@ -1,7 +1,7 @@ // patterns/doubledispatch/Aluminum.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Aluminum for double dispatching package patterns.doubledispatch; import patterns.trash.*; diff --git a/patterns/doubledispatch/Cardboard.java b/patterns/doubledispatch/Cardboard.java index 90008eda0..fcaf4390e 100644 --- a/patterns/doubledispatch/Cardboard.java +++ b/patterns/doubledispatch/Cardboard.java @@ -1,7 +1,7 @@ // patterns/doubledispatch/Cardboard.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Cardboard for double dispatching package patterns.doubledispatch; import patterns.trash.*; diff --git a/patterns/doubledispatch/DoubleDispatch.java b/patterns/doubledispatch/DoubleDispatch.java index ea2eab506..a1e3576b7 100644 --- a/patterns/doubledispatch/DoubleDispatch.java +++ b/patterns/doubledispatch/DoubleDispatch.java @@ -1,7 +1,7 @@ // patterns/doubledispatch/DoubleDispatch.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Using multiple dispatching to handle more // than one unknown type during a method call // {java patterns.doubledispatch.DoubleDispatch} diff --git a/patterns/doubledispatch/Glass.java b/patterns/doubledispatch/Glass.java index 780aeb795..19b192a49 100644 --- a/patterns/doubledispatch/Glass.java +++ b/patterns/doubledispatch/Glass.java @@ -1,7 +1,7 @@ // patterns/doubledispatch/Glass.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Glass for double dispatching package patterns.doubledispatch; import patterns.trash.*; diff --git a/patterns/doubledispatch/Paper.java b/patterns/doubledispatch/Paper.java index befca7561..4a1af5c37 100644 --- a/patterns/doubledispatch/Paper.java +++ b/patterns/doubledispatch/Paper.java @@ -1,7 +1,7 @@ // patterns/doubledispatch/Paper.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Paper for double dispatching package patterns.doubledispatch; import patterns.trash.*; diff --git a/patterns/doubledispatch/TypedBin.java b/patterns/doubledispatch/TypedBin.java index 887e0663e..2f2119159 100644 --- a/patterns/doubledispatch/TypedBin.java +++ b/patterns/doubledispatch/TypedBin.java @@ -1,7 +1,7 @@ // patterns/doubledispatch/TypedBin.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // A List that can grab the right type package patterns.doubledispatch; import patterns.trash.*; diff --git a/patterns/doubledispatch/TypedBinMember.java b/patterns/doubledispatch/TypedBinMember.java index a34d68068..870e775a3 100644 --- a/patterns/doubledispatch/TypedBinMember.java +++ b/patterns/doubledispatch/TypedBinMember.java @@ -1,7 +1,7 @@ // patterns/doubledispatch/TypedBinMember.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // An interface for adding the double dispatching // method to the trash hierarchy without // modifying the original hierarchy diff --git a/patterns/dynatrash/DynaTrash.java b/patterns/dynatrash/DynaTrash.java index 89f240a72..b71f81b5c 100644 --- a/patterns/dynatrash/DynaTrash.java +++ b/patterns/dynatrash/DynaTrash.java @@ -1,7 +1,7 @@ // patterns/dynatrash/DynaTrash.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Using a Map of Lists and RTTI to automatically // sort trash into Lists. This solution, despite // the use of RTTI, is extensible. diff --git a/patterns/factory/ShapeFactory1.java b/patterns/factory/ShapeFactory1.java index 76706bb1d..a2c755724 100644 --- a/patterns/factory/ShapeFactory1.java +++ b/patterns/factory/ShapeFactory1.java @@ -1,7 +1,7 @@ // patterns/factory/ShapeFactory1.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // A simple static factory method // {java patterns.factory.ShapeFactory1} package patterns.factory; diff --git a/patterns/observer/ObservedFlower.java b/patterns/observer/ObservedFlower.java index 761595a55..479ca8dff 100644 --- a/patterns/observer/ObservedFlower.java +++ b/patterns/observer/ObservedFlower.java @@ -1,7 +1,7 @@ // patterns/observer/ObservedFlower.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Demonstration of "Observer" pattern // {java patterns.observer.ObservedFlower} package patterns.observer; diff --git a/patterns/recyclea/RecycleA.java b/patterns/recyclea/RecycleA.java index c8d228474..0f09b392a 100644 --- a/patterns/recyclea/RecycleA.java +++ b/patterns/recyclea/RecycleA.java @@ -1,7 +1,7 @@ // patterns/recyclea/RecycleA.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Recycling with RTTI // {java patterns.recyclea.RecycleA} package patterns.recyclea; diff --git a/patterns/recycleb/RecycleB.java b/patterns/recycleb/RecycleB.java index f5d567ce7..0b8ea0847 100644 --- a/patterns/recycleb/RecycleB.java +++ b/patterns/recycleb/RecycleB.java @@ -1,7 +1,7 @@ // patterns/recycleb/RecycleB.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // {java patterns.recycleb.RecycleB} package patterns.recycleb; import patterns.trash.*; diff --git a/patterns/recyclec/RecycleC.java b/patterns/recyclec/RecycleC.java index 3af3d0f20..d1f8c257b 100644 --- a/patterns/recyclec/RecycleC.java +++ b/patterns/recyclec/RecycleC.java @@ -1,7 +1,7 @@ // patterns/recyclec/RecycleC.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Adding more objects to the recycling problem // {java patterns.recyclec.RecycleC} package patterns.recyclec; diff --git a/patterns/state/StateMachineDemo.java b/patterns/state/StateMachineDemo.java index e6ff5c264..d184a132e 100644 --- a/patterns/state/StateMachineDemo.java +++ b/patterns/state/StateMachineDemo.java @@ -1,7 +1,7 @@ // patterns/state/StateMachineDemo.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // The StateMachine pattern and Template method // {java patterns.state.StateMachineDemo} package patterns.state; diff --git a/patterns/strategy/StrategyPattern.java b/patterns/strategy/StrategyPattern.java index e7d60b374..45f813880 100644 --- a/patterns/strategy/StrategyPattern.java +++ b/patterns/strategy/StrategyPattern.java @@ -1,7 +1,7 @@ // patterns/strategy/StrategyPattern.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // {java patterns.strategy.StrategyPattern} package patterns.strategy; import java.util.function.*; diff --git a/patterns/strategy/StrategyPattern2.java b/patterns/strategy/StrategyPattern2.java index 341447a1e..89eecdbf0 100644 --- a/patterns/strategy/StrategyPattern2.java +++ b/patterns/strategy/StrategyPattern2.java @@ -1,7 +1,7 @@ // patterns/strategy/StrategyPattern2.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // {java patterns.strategy.StrategyPattern2} package patterns.strategy; import java.util.function.*; diff --git a/patterns/trash/Aluminum.java b/patterns/trash/Aluminum.java index 17e36b269..b59de04fe 100644 --- a/patterns/trash/Aluminum.java +++ b/patterns/trash/Aluminum.java @@ -1,7 +1,7 @@ // patterns/trash/Aluminum.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. package patterns.trash; public class Aluminum extends Trash { diff --git a/patterns/trash/Cardboard.java b/patterns/trash/Cardboard.java index f15ba6a3b..122bce84e 100644 --- a/patterns/trash/Cardboard.java +++ b/patterns/trash/Cardboard.java @@ -1,7 +1,7 @@ // patterns/trash/Cardboard.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. package patterns.trash; public class Cardboard extends Trash { diff --git a/patterns/trash/Fillable.java b/patterns/trash/Fillable.java index f012fe0a0..b4f37fe0c 100644 --- a/patterns/trash/Fillable.java +++ b/patterns/trash/Fillable.java @@ -1,7 +1,7 @@ // patterns/trash/Fillable.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Any object that can be filled with Trash package patterns.trash; diff --git a/patterns/trash/FillableList.java b/patterns/trash/FillableList.java index 44822abca..349abae3c 100644 --- a/patterns/trash/FillableList.java +++ b/patterns/trash/FillableList.java @@ -1,7 +1,7 @@ // patterns/trash/FillableList.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Adapter that makes a List Fillable package patterns.trash; import java.util.*; diff --git a/patterns/trash/Glass.java b/patterns/trash/Glass.java index 8b1e21ef4..65e93bdf8 100644 --- a/patterns/trash/Glass.java +++ b/patterns/trash/Glass.java @@ -1,7 +1,7 @@ // patterns/trash/Glass.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. package patterns.trash; public class Glass extends Trash { diff --git a/patterns/trash/Paper.java b/patterns/trash/Paper.java index 023da2c81..3e7381709 100644 --- a/patterns/trash/Paper.java +++ b/patterns/trash/Paper.java @@ -1,7 +1,7 @@ // patterns/trash/Paper.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. package patterns.trash; public class Paper extends Trash { diff --git a/patterns/trash/ParseTrash.java b/patterns/trash/ParseTrash.java index f91a2cbf3..63523a395 100644 --- a/patterns/trash/ParseTrash.java +++ b/patterns/trash/ParseTrash.java @@ -1,7 +1,7 @@ // patterns/trash/ParseTrash.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Open a file and parse its contents into // Trash objects, placing each into a List // {java patterns.trash.ParseTrash} diff --git a/patterns/trash/Trash.java b/patterns/trash/Trash.java index 4ecaaf1f3..2fa226a75 100644 --- a/patterns/trash/Trash.java +++ b/patterns/trash/Trash.java @@ -1,7 +1,7 @@ // patterns/trash/Trash.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Base class for Trash recycling examples package patterns.trash; import java.util.*; diff --git a/patterns/trashvisitor/Aluminum.java b/patterns/trashvisitor/Aluminum.java index f2444f224..1e412c771 100644 --- a/patterns/trashvisitor/Aluminum.java +++ b/patterns/trashvisitor/Aluminum.java @@ -1,7 +1,7 @@ // patterns/trashvisitor/Aluminum.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Aluminum for the visitor pattern package patterns.trashvisitor; import patterns.trash.*; diff --git a/patterns/trashvisitor/Cardboard.java b/patterns/trashvisitor/Cardboard.java index 815e3b957..1d6c66fa8 100644 --- a/patterns/trashvisitor/Cardboard.java +++ b/patterns/trashvisitor/Cardboard.java @@ -1,7 +1,7 @@ // patterns/trashvisitor/Cardboard.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Cardboard for the visitor pattern package patterns.trashvisitor; import patterns.trash.*; diff --git a/patterns/trashvisitor/Glass.java b/patterns/trashvisitor/Glass.java index 85b77a41c..0c35f7de6 100644 --- a/patterns/trashvisitor/Glass.java +++ b/patterns/trashvisitor/Glass.java @@ -1,7 +1,7 @@ // patterns/trashvisitor/Glass.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Glass for the visitor pattern package patterns.trashvisitor; import patterns.trash.*; diff --git a/patterns/trashvisitor/Paper.java b/patterns/trashvisitor/Paper.java index 891478231..94fe7aa00 100644 --- a/patterns/trashvisitor/Paper.java +++ b/patterns/trashvisitor/Paper.java @@ -1,7 +1,7 @@ // patterns/trashvisitor/Paper.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Paper for the visitor pattern package patterns.trashvisitor; import patterns.trash.*; diff --git a/patterns/trashvisitor/TrashVisitor.java b/patterns/trashvisitor/TrashVisitor.java index 728348b04..73f134d49 100644 --- a/patterns/trashvisitor/TrashVisitor.java +++ b/patterns/trashvisitor/TrashVisitor.java @@ -1,7 +1,7 @@ // patterns/trashvisitor/TrashVisitor.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // {java patterns.trashvisitor.TrashVisitor} package patterns.trashvisitor; import patterns.trash.*; diff --git a/patterns/trashvisitor/Visitable.java b/patterns/trashvisitor/Visitable.java index b32d9b387..85e4a42c7 100644 --- a/patterns/trashvisitor/Visitable.java +++ b/patterns/trashvisitor/Visitable.java @@ -1,7 +1,7 @@ // patterns/trashvisitor/Visitable.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // An interface to add visitor functionality to the // Trash hierarchy without modifying the base class package patterns.trashvisitor; diff --git a/patterns/trashvisitor/Visitor.java b/patterns/trashvisitor/Visitor.java index 9344a8c1c..f6c330258 100644 --- a/patterns/trashvisitor/Visitor.java +++ b/patterns/trashvisitor/Visitor.java @@ -1,7 +1,7 @@ // patterns/trashvisitor/Visitor.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // The base interface for visitors package patterns.trashvisitor; diff --git a/patterns/visitor/BeeAndFlowers.java b/patterns/visitor/BeeAndFlowers.java index b794a424d..b94eb94b2 100644 --- a/patterns/visitor/BeeAndFlowers.java +++ b/patterns/visitor/BeeAndFlowers.java @@ -1,7 +1,7 @@ // patterns/visitor/BeeAndFlowers.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Demonstration of "visitor" pattern // {java patterns.visitor.BeeAndFlowers} package patterns.visitor; diff --git a/patterns/visualobserver/BoxObserver.java b/patterns/visualobserver/BoxObserver.java index ee002ea5c..680687312 100644 --- a/patterns/visualobserver/BoxObserver.java +++ b/patterns/visualobserver/BoxObserver.java @@ -1,7 +1,7 @@ // patterns/visualobserver/BoxObserver.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Demonstration of Observer pattern using // Java's built-in observer classes // {java patterns.visualobserver.BoxObserver} diff --git a/polymorphism/CovariantReturn.java b/polymorphism/CovariantReturn.java index aaa633664..693493e68 100644 --- a/polymorphism/CovariantReturn.java +++ b/polymorphism/CovariantReturn.java @@ -1,7 +1,7 @@ // polymorphism/CovariantReturn.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. class Grain { @Override diff --git a/polymorphism/FieldAccess.java b/polymorphism/FieldAccess.java index 9bbaa27c1..913030676 100644 --- a/polymorphism/FieldAccess.java +++ b/polymorphism/FieldAccess.java @@ -1,7 +1,7 @@ // polymorphism/FieldAccess.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Direct field access is determined at compile time class Super { diff --git a/polymorphism/Frog.java b/polymorphism/Frog.java index 89e4de3f9..de6e6c61f 100644 --- a/polymorphism/Frog.java +++ b/polymorphism/Frog.java @@ -1,7 +1,7 @@ // polymorphism/Frog.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Cleanup and inheritance // {java polymorphism.Frog} package polymorphism; diff --git a/polymorphism/PolyConstructors.java b/polymorphism/PolyConstructors.java index cfc432d41..c5882d7dc 100644 --- a/polymorphism/PolyConstructors.java +++ b/polymorphism/PolyConstructors.java @@ -1,7 +1,7 @@ // polymorphism/PolyConstructors.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Constructors and polymorphism // don't produce what you might expect diff --git a/polymorphism/PrivateOverride.java b/polymorphism/PrivateOverride.java index 86240c9a4..182943044 100644 --- a/polymorphism/PrivateOverride.java +++ b/polymorphism/PrivateOverride.java @@ -1,7 +1,7 @@ // polymorphism/PrivateOverride.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Trying to override a private method // {java polymorphism.PrivateOverride} package polymorphism; diff --git a/polymorphism/PrivateOverride2.java b/polymorphism/PrivateOverride2.java index e886f9489..341b02069 100644 --- a/polymorphism/PrivateOverride2.java +++ b/polymorphism/PrivateOverride2.java @@ -1,7 +1,7 @@ // polymorphism/PrivateOverride2.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Detecting a mistaken override using @Override // {CompileTimeError} (Will not compile) package polymorphism; diff --git a/polymorphism/RTTI.java b/polymorphism/RTTI.java index a57357653..5e1e0de73 100644 --- a/polymorphism/RTTI.java +++ b/polymorphism/RTTI.java @@ -1,7 +1,7 @@ // polymorphism/RTTI.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Downcasting & Runtime type information (RTTI) // {ThrowsException} diff --git a/polymorphism/ReferenceCounting.java b/polymorphism/ReferenceCounting.java index 093e0198c..877138488 100644 --- a/polymorphism/ReferenceCounting.java +++ b/polymorphism/ReferenceCounting.java @@ -1,7 +1,7 @@ // polymorphism/ReferenceCounting.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Cleaning up shared member objects class Shared { diff --git a/polymorphism/Sandwich.java b/polymorphism/Sandwich.java index 965878056..a88ef789f 100644 --- a/polymorphism/Sandwich.java +++ b/polymorphism/Sandwich.java @@ -1,7 +1,7 @@ // polymorphism/Sandwich.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Order of constructor calls // {java polymorphism.Sandwich} package polymorphism; diff --git a/polymorphism/Shapes.java b/polymorphism/Shapes.java index 2fb4dbd5a..5c6eea93b 100644 --- a/polymorphism/Shapes.java +++ b/polymorphism/Shapes.java @@ -1,7 +1,7 @@ // polymorphism/Shapes.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Polymorphism in Java import polymorphism.shape.*; diff --git a/polymorphism/StaticPolymorphism.java b/polymorphism/StaticPolymorphism.java index 1822d0ec7..f45bb15cb 100644 --- a/polymorphism/StaticPolymorphism.java +++ b/polymorphism/StaticPolymorphism.java @@ -1,7 +1,7 @@ // polymorphism/StaticPolymorphism.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Static methods are not polymorphic class StaticSuper { diff --git a/polymorphism/Transmogrify.java b/polymorphism/Transmogrify.java index 1fecf202e..94e0ec36a 100644 --- a/polymorphism/Transmogrify.java +++ b/polymorphism/Transmogrify.java @@ -1,7 +1,7 @@ // polymorphism/Transmogrify.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Dynamically changing the behavior of an object // via composition (the "State" design pattern) diff --git a/polymorphism/music/Instrument.java b/polymorphism/music/Instrument.java index 72bee5f6a..245d97495 100644 --- a/polymorphism/music/Instrument.java +++ b/polymorphism/music/Instrument.java @@ -1,7 +1,7 @@ // polymorphism/music/Instrument.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. package polymorphism.music; class Instrument { diff --git a/polymorphism/music/Music.java b/polymorphism/music/Music.java index 1ac678c1d..e5e7696eb 100644 --- a/polymorphism/music/Music.java +++ b/polymorphism/music/Music.java @@ -1,7 +1,7 @@ // polymorphism/music/Music.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Inheritance & upcasting // {java polymorphism.music.Music} package polymorphism.music; diff --git a/polymorphism/music/Music2.java b/polymorphism/music/Music2.java index 97b5530ae..872586fcf 100644 --- a/polymorphism/music/Music2.java +++ b/polymorphism/music/Music2.java @@ -1,7 +1,7 @@ // polymorphism/music/Music2.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Overloading instead of upcasting // {java polymorphism.music.Music2} package polymorphism.music; diff --git a/polymorphism/music/Note.java b/polymorphism/music/Note.java index 72903e392..70b9de608 100644 --- a/polymorphism/music/Note.java +++ b/polymorphism/music/Note.java @@ -1,7 +1,7 @@ // polymorphism/music/Note.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Notes to play on musical instruments package polymorphism.music; diff --git a/polymorphism/music/Wind.java b/polymorphism/music/Wind.java index 620a8f9f8..ffc5b5ba1 100644 --- a/polymorphism/music/Wind.java +++ b/polymorphism/music/Wind.java @@ -1,7 +1,7 @@ // polymorphism/music/Wind.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. package polymorphism.music; // Wind objects are instruments diff --git a/polymorphism/music3/Music3.java b/polymorphism/music3/Music3.java index 601c8f921..3994393d6 100644 --- a/polymorphism/music3/Music3.java +++ b/polymorphism/music3/Music3.java @@ -1,7 +1,7 @@ // polymorphism/music3/Music3.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // An extensible program // {java polymorphism.music3.Music3} package polymorphism.music3; diff --git a/polymorphism/shape/Circle.java b/polymorphism/shape/Circle.java index 50f392cd3..ff870ffc8 100644 --- a/polymorphism/shape/Circle.java +++ b/polymorphism/shape/Circle.java @@ -1,7 +1,7 @@ // polymorphism/shape/Circle.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. package polymorphism.shape; public class Circle extends Shape { diff --git a/polymorphism/shape/RandomShapes.java b/polymorphism/shape/RandomShapes.java index 47d940398..55b26c11a 100644 --- a/polymorphism/shape/RandomShapes.java +++ b/polymorphism/shape/RandomShapes.java @@ -1,7 +1,7 @@ // polymorphism/shape/RandomShapes.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // A "factory" that randomly creates shapes package polymorphism.shape; import java.util.*; diff --git a/polymorphism/shape/Shape.java b/polymorphism/shape/Shape.java index bcc9333f0..c8b25852f 100644 --- a/polymorphism/shape/Shape.java +++ b/polymorphism/shape/Shape.java @@ -1,7 +1,7 @@ // polymorphism/shape/Shape.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. package polymorphism.shape; public class Shape { diff --git a/polymorphism/shape/Square.java b/polymorphism/shape/Square.java index 35b30f4f7..22bb25680 100644 --- a/polymorphism/shape/Square.java +++ b/polymorphism/shape/Square.java @@ -1,7 +1,7 @@ // polymorphism/shape/Square.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. package polymorphism.shape; public class Square extends Shape { diff --git a/polymorphism/shape/Triangle.java b/polymorphism/shape/Triangle.java index 077f7cac7..2f18de719 100644 --- a/polymorphism/shape/Triangle.java +++ b/polymorphism/shape/Triangle.java @@ -1,7 +1,7 @@ // polymorphism/shape/Triangle.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. package polymorphism.shape; public class Triangle extends Shape { diff --git a/preferences/PreferencesDemo.java b/preferences/PreferencesDemo.java index 59c9edc98..ef10a6af5 100644 --- a/preferences/PreferencesDemo.java +++ b/preferences/PreferencesDemo.java @@ -1,7 +1,7 @@ // preferences/PreferencesDemo.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.util.prefs.*; public class PreferencesDemo { diff --git a/references/AddingClone.java b/references/AddingClone.java index 7fb3ba179..42f5880a2 100644 --- a/references/AddingClone.java +++ b/references/AddingClone.java @@ -1,7 +1,7 @@ // references/AddingClone.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // You must go through a few gyrations // to add cloning to your own class import java.util.*; diff --git a/references/Alias1.java b/references/Alias1.java index a2211dc11..0e0e3c8b6 100644 --- a/references/Alias1.java +++ b/references/Alias1.java @@ -1,7 +1,7 @@ // references/Alias1.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Aliasing two references to one object public class Alias1 { diff --git a/references/Alias2.java b/references/Alias2.java index 5a0494a2e..1e8538596 100644 --- a/references/Alias2.java +++ b/references/Alias2.java @@ -1,7 +1,7 @@ // references/Alias2.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Method calls implicitly alias their arguments public class Alias2 { diff --git a/references/CheckCloneable.java b/references/CheckCloneable.java index 4571dcfea..83fc0e5ab 100644 --- a/references/CheckCloneable.java +++ b/references/CheckCloneable.java @@ -1,7 +1,7 @@ // references/CheckCloneable.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Check to see if a reference can be cloned // Can't clone this -- doesn't override clone(): diff --git a/references/CloneArrayList.java b/references/CloneArrayList.java index 44209e8a9..d9e1bdbf4 100644 --- a/references/CloneArrayList.java +++ b/references/CloneArrayList.java @@ -1,7 +1,7 @@ // references/CloneArrayList.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // The clone() operation works for only a few // items in the standard Java library import java.util.*; diff --git a/references/Compete.java b/references/Compete.java index 6adfba592..0d3d96f12 100644 --- a/references/Compete.java +++ b/references/Compete.java @@ -1,7 +1,7 @@ // references/Compete.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.io.*; class Thing1 implements Serializable {} diff --git a/references/CopyConstructor.java b/references/CopyConstructor.java index 3d9106206..f8d3ce619 100644 --- a/references/CopyConstructor.java +++ b/references/CopyConstructor.java @@ -1,7 +1,7 @@ // references/CopyConstructor.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // A constructor to copy an object of the same // type, as an attempt to create a local copy import java.lang.reflect.*; diff --git a/references/DepthReading.java b/references/DepthReading.java index 6de997570..7bebef12f 100644 --- a/references/DepthReading.java +++ b/references/DepthReading.java @@ -1,7 +1,7 @@ // references/DepthReading.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Cloning a composed object package references; diff --git a/references/HorrorFlick.java b/references/HorrorFlick.java index b4ef52e12..a10cc162b 100644 --- a/references/HorrorFlick.java +++ b/references/HorrorFlick.java @@ -1,7 +1,7 @@ // references/HorrorFlick.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // You can insert Cloneability at any level of inheritance class Person {} diff --git a/references/Immutable1.java b/references/Immutable1.java index 09680dbf5..00d7640fb 100644 --- a/references/Immutable1.java +++ b/references/Immutable1.java @@ -1,7 +1,7 @@ // references/Immutable1.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Immutable objects are immune to aliasing public class Immutable1 { diff --git a/references/Immutable2.java b/references/Immutable2.java index 3f4ac6d76..8a6ed177f 100644 --- a/references/Immutable2.java +++ b/references/Immutable2.java @@ -1,7 +1,7 @@ // references/Immutable2.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // A companion class to modify immutable objects class Mutable { diff --git a/references/ImmutableInteger.java b/references/ImmutableInteger.java index cf5f544e4..516bab0a6 100644 --- a/references/ImmutableInteger.java +++ b/references/ImmutableInteger.java @@ -1,7 +1,7 @@ // references/ImmutableInteger.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // The Integer class cannot be changed import java.util.*; diff --git a/references/ImmutableStrings.java b/references/ImmutableStrings.java index 75127afd2..7872b9ab4 100644 --- a/references/ImmutableStrings.java +++ b/references/ImmutableStrings.java @@ -1,7 +1,7 @@ // references/ImmutableStrings.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Demonstrating StringBuilder public class ImmutableStrings { diff --git a/references/MutableInteger.java b/references/MutableInteger.java index e28e0cf54..fc7667d66 100644 --- a/references/MutableInteger.java +++ b/references/MutableInteger.java @@ -1,7 +1,7 @@ // references/MutableInteger.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // A changeable wrapper class import java.util.*; diff --git a/references/OceanReading.java b/references/OceanReading.java index cfd6aafa8..8ccfae7c4 100644 --- a/references/OceanReading.java +++ b/references/OceanReading.java @@ -1,7 +1,7 @@ // references/OceanReading.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Cloning a composed object package references; diff --git a/references/PassReferences.java b/references/PassReferences.java index e5b03fdda..6dbbe2bef 100644 --- a/references/PassReferences.java +++ b/references/PassReferences.java @@ -1,7 +1,7 @@ // references/PassReferences.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. public class PassReferences { public static void f(PassReferences h) { diff --git a/references/SimplerMutableInteger.java b/references/SimplerMutableInteger.java index 684499657..1f5f743d3 100644 --- a/references/SimplerMutableInteger.java +++ b/references/SimplerMutableInteger.java @@ -1,7 +1,7 @@ // references/SimplerMutableInteger.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // A trivial wrapper class import java.util.*; diff --git a/references/Snake.java b/references/Snake.java index b92c825ce..62a7d93bd 100644 --- a/references/Snake.java +++ b/references/Snake.java @@ -1,7 +1,7 @@ // references/Snake.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Tests cloning to see if reference // destinations are also cloned diff --git a/references/Stringer.java b/references/Stringer.java index 6b47d3a76..819c578e1 100644 --- a/references/Stringer.java +++ b/references/Stringer.java @@ -1,7 +1,7 @@ // references/Stringer.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. public class Stringer { public static String upcase(String s) { diff --git a/references/TemperatureReading.java b/references/TemperatureReading.java index b533497ff..ff9004f1c 100644 --- a/references/TemperatureReading.java +++ b/references/TemperatureReading.java @@ -1,7 +1,7 @@ // references/TemperatureReading.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Cloning a composed object package references; diff --git a/references/tests/DeepCopyTest.java b/references/tests/DeepCopyTest.java index 4f1506884..9cf4729b6 100644 --- a/references/tests/DeepCopyTest.java +++ b/references/tests/DeepCopyTest.java @@ -1,7 +1,7 @@ // references/tests/DeepCopyTest.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. package references; import org.junit.jupiter.api.*; import static org.junit.jupiter.api.Assertions.*; diff --git a/remote/DisplayPerfectTime.java b/remote/DisplayPerfectTime.java index 7b86e5b80..6ad055e6d 100644 --- a/remote/DisplayPerfectTime.java +++ b/remote/DisplayPerfectTime.java @@ -1,11 +1,10 @@ // remote/DisplayPerfectTime.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Uses remote object PerfectTime // {ValidateByHand} package remote; - import java.rmi.registry.*; public class DisplayPerfectTime { diff --git a/remote/PerfectTime.java b/remote/PerfectTime.java index 8b8ec9f0b..21daf2f18 100644 --- a/remote/PerfectTime.java +++ b/remote/PerfectTime.java @@ -1,10 +1,9 @@ // remote/PerfectTime.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // The PerfectTime remote interface package remote; - import java.rmi.*; public interface PerfectTime extends Remote { diff --git a/remote/PerfectTimeImpl.java b/remote/PerfectTimeImpl.java index 6cdf5e9e8..d2cc66165 100644 --- a/remote/PerfectTimeImpl.java +++ b/remote/PerfectTimeImpl.java @@ -1,10 +1,9 @@ // remote/PerfectTimeImpl.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Implementing the PerfectTime remote object package remote; - import java.rmi.RemoteException; public class PerfectTimeImpl implements PerfectTime { diff --git a/remote/PerfectTimeServer.java b/remote/PerfectTimeServer.java index b71a10256..39e76e59c 100644 --- a/remote/PerfectTimeServer.java +++ b/remote/PerfectTimeServer.java @@ -1,11 +1,10 @@ // remote/PerfectTimeServer.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Server for the PerfectTime remote object // {ValidateByHand} package remote; - import java.rmi.registry.Registry; import java.rmi.registry.LocateRegistry; import java.rmi.RemoteException; diff --git a/reuse/Bath.java b/reuse/Bath.java index 3266f8de0..5f091d530 100644 --- a/reuse/Bath.java +++ b/reuse/Bath.java @@ -1,7 +1,7 @@ // reuse/Bath.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Constructor initialization with composition class Soap { diff --git a/reuse/Beetle.java b/reuse/Beetle.java index 15dc2cebd..01823c05a 100644 --- a/reuse/Beetle.java +++ b/reuse/Beetle.java @@ -1,7 +1,7 @@ // reuse/Beetle.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // The full process of initialization class Insect { diff --git a/reuse/BlankFinal.java b/reuse/BlankFinal.java index 24e5a576a..3a23289b8 100644 --- a/reuse/BlankFinal.java +++ b/reuse/BlankFinal.java @@ -1,7 +1,7 @@ // reuse/BlankFinal.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // "Blank" final fields class Poppet { diff --git a/reuse/CADSystem.java b/reuse/CADSystem.java index f090060d0..eb26f51b4 100644 --- a/reuse/CADSystem.java +++ b/reuse/CADSystem.java @@ -1,7 +1,7 @@ // reuse/CADSystem.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Ensuring proper cleanup // {java reuse.CADSystem} package reuse; diff --git a/reuse/Car.java b/reuse/Car.java index 20e0bbe29..80e789c2e 100644 --- a/reuse/Car.java +++ b/reuse/Car.java @@ -1,7 +1,7 @@ // reuse/Car.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Composition with public objects class Engine { diff --git a/reuse/Cartoon.java b/reuse/Cartoon.java index 77a924064..93b777509 100644 --- a/reuse/Cartoon.java +++ b/reuse/Cartoon.java @@ -1,7 +1,7 @@ // reuse/Cartoon.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Constructor calls during inheritance class Art { diff --git a/reuse/Chess.java b/reuse/Chess.java index ec3cdb755..76d2917f3 100644 --- a/reuse/Chess.java +++ b/reuse/Chess.java @@ -1,7 +1,7 @@ // reuse/Chess.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Inheritance, constructors and arguments class Game { diff --git a/reuse/Detergent.java b/reuse/Detergent.java index 367315bdb..f9cc5efea 100644 --- a/reuse/Detergent.java +++ b/reuse/Detergent.java @@ -1,7 +1,7 @@ // reuse/Detergent.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Inheritance syntax & properties class Cleanser { diff --git a/reuse/FinalArguments.java b/reuse/FinalArguments.java index b648de4dd..d36bf1155 100644 --- a/reuse/FinalArguments.java +++ b/reuse/FinalArguments.java @@ -1,7 +1,7 @@ // reuse/FinalArguments.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Using "final" with method arguments class Gizmo { diff --git a/reuse/FinalData.java b/reuse/FinalData.java index 40a7895c7..04b9b8aa0 100644 --- a/reuse/FinalData.java +++ b/reuse/FinalData.java @@ -1,7 +1,7 @@ // reuse/FinalData.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // The effect of final on fields import java.util.*; diff --git a/reuse/FinalOverridingIllusion.java b/reuse/FinalOverridingIllusion.java index 15ef7e9ce..2f8de2fec 100644 --- a/reuse/FinalOverridingIllusion.java +++ b/reuse/FinalOverridingIllusion.java @@ -1,7 +1,7 @@ // reuse/FinalOverridingIllusion.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // It only looks like you can override // a private or private final method diff --git a/reuse/Hide.java b/reuse/Hide.java index 878c0f283..c6726bd15 100644 --- a/reuse/Hide.java +++ b/reuse/Hide.java @@ -1,7 +1,7 @@ // reuse/Hide.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Overloading a base-class method name in a derived // class does not hide the base-class versions diff --git a/reuse/Jurassic.java b/reuse/Jurassic.java index 1b9650269..eec987aed 100644 --- a/reuse/Jurassic.java +++ b/reuse/Jurassic.java @@ -1,7 +1,7 @@ // reuse/Jurassic.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Making an entire class final class SmallBrain {} diff --git a/reuse/Lisa.java b/reuse/Lisa.java index 92201a89b..bed8edcdf 100644 --- a/reuse/Lisa.java +++ b/reuse/Lisa.java @@ -1,7 +1,7 @@ // reuse/Lisa.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // {CompileTimeError} (Will not compile) class Lisa extends Homer { diff --git a/reuse/Orc.java b/reuse/Orc.java index 14376a483..2155f439e 100644 --- a/reuse/Orc.java +++ b/reuse/Orc.java @@ -1,7 +1,7 @@ // reuse/Orc.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // The protected keyword class Villain { diff --git a/reuse/PlaceSetting.java b/reuse/PlaceSetting.java index 9f443976a..22b28622b 100644 --- a/reuse/PlaceSetting.java +++ b/reuse/PlaceSetting.java @@ -1,7 +1,7 @@ // reuse/PlaceSetting.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Combining composition & inheritance class Plate { diff --git a/reuse/SpaceShip.java b/reuse/SpaceShip.java index 9ac426b43..bcf0aefd3 100644 --- a/reuse/SpaceShip.java +++ b/reuse/SpaceShip.java @@ -1,7 +1,7 @@ // reuse/SpaceShip.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. public class SpaceShip extends SpaceShipControls { private String name; diff --git a/reuse/SpaceShipControls.java b/reuse/SpaceShipControls.java index 077303226..b75d4fccc 100644 --- a/reuse/SpaceShipControls.java +++ b/reuse/SpaceShipControls.java @@ -1,7 +1,7 @@ // reuse/SpaceShipControls.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. public class SpaceShipControls { void up(int velocity) {} diff --git a/reuse/SpaceShipDelegation.java b/reuse/SpaceShipDelegation.java index d82f545d3..28ed44174 100644 --- a/reuse/SpaceShipDelegation.java +++ b/reuse/SpaceShipDelegation.java @@ -1,7 +1,7 @@ // reuse/SpaceShipDelegation.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. public class SpaceShipDelegation { private String name; diff --git a/reuse/SprinklerSystem.java b/reuse/SprinklerSystem.java index d967f95ec..79cd4c0bf 100644 --- a/reuse/SprinklerSystem.java +++ b/reuse/SprinklerSystem.java @@ -1,7 +1,7 @@ // reuse/SprinklerSystem.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Composition for code reuse class WaterSource { diff --git a/reuse/Wind.java b/reuse/Wind.java index 49ff6e409..b43e66c6e 100644 --- a/reuse/Wind.java +++ b/reuse/Wind.java @@ -1,7 +1,7 @@ // reuse/Wind.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Inheritance & upcasting class Instrument { diff --git a/serialization/APerson.java b/serialization/APerson.java index 0815a9bb2..0e7e0d700 100644 --- a/serialization/APerson.java +++ b/serialization/APerson.java @@ -1,7 +1,7 @@ // serialization/APerson.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Use the XOM library to write and read XML // You must install nu.xom.Node from http://www.xom.nu import nu.xom.*; diff --git a/serialization/AStoreCADState.java b/serialization/AStoreCADState.java index 395bfd009..727a4bd86 100644 --- a/serialization/AStoreCADState.java +++ b/serialization/AStoreCADState.java @@ -1,7 +1,7 @@ // serialization/AStoreCADState.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Saving the state of a fictitious CAD system import java.io.*; import java.util.*; diff --git a/serialization/Alien.java b/serialization/Alien.java index ce07a4050..625c24760 100644 --- a/serialization/Alien.java +++ b/serialization/Alien.java @@ -1,7 +1,7 @@ // serialization/Alien.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // A serializable class import java.io.*; public class Alien implements Serializable {} diff --git a/serialization/Blip3.java b/serialization/Blip3.java index 518cbaa27..69722e787 100644 --- a/serialization/Blip3.java +++ b/serialization/Blip3.java @@ -1,7 +1,7 @@ // serialization/Blip3.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Reconstructing an externalizable object import java.io.*; diff --git a/serialization/Blips.java b/serialization/Blips.java index db59af9f2..a51922ab8 100644 --- a/serialization/Blips.java +++ b/serialization/Blips.java @@ -1,7 +1,7 @@ // serialization/Blips.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Simple use of Externalizable & a pitfall import java.io.*; diff --git a/serialization/FreezeAlien.java b/serialization/FreezeAlien.java index cb2ae0194..549e7fa3d 100644 --- a/serialization/FreezeAlien.java +++ b/serialization/FreezeAlien.java @@ -1,7 +1,7 @@ // serialization/FreezeAlien.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Create a serialized output file import java.io.*; diff --git a/serialization/Logon.java b/serialization/Logon.java index 3071bb9f2..b53484243 100644 --- a/serialization/Logon.java +++ b/serialization/Logon.java @@ -1,7 +1,7 @@ // serialization/Logon.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Demonstrates the "transient" keyword import java.util.concurrent.*; import java.io.*; diff --git a/serialization/MyWorld.java b/serialization/MyWorld.java index 9d12a1e81..5035236d0 100644 --- a/serialization/MyWorld.java +++ b/serialization/MyWorld.java @@ -1,7 +1,7 @@ // serialization/MyWorld.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.io.*; import java.util.*; diff --git a/serialization/People.java b/serialization/People.java index 1211603e8..0ee1b12ac 100644 --- a/serialization/People.java +++ b/serialization/People.java @@ -1,7 +1,7 @@ // serialization/People.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // You must install nu.xom.Node from http://www.xom.nu // {RunFirst: APerson} import nu.xom.*; diff --git a/serialization/RecoverCADState.java b/serialization/RecoverCADState.java index d7c43a8ab..a2ff48b78 100644 --- a/serialization/RecoverCADState.java +++ b/serialization/RecoverCADState.java @@ -1,7 +1,7 @@ // serialization/RecoverCADState.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Restoring the state of the fictitious CAD system // {RunFirst: AStoreCADState} import java.io.*; diff --git a/serialization/SerialCtl.java b/serialization/SerialCtl.java index 198676289..ac64843f6 100644 --- a/serialization/SerialCtl.java +++ b/serialization/SerialCtl.java @@ -1,7 +1,7 @@ // serialization/SerialCtl.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Controlling serialization by adding your own // writeObject() and readObject() methods import java.io.*; diff --git a/serialization/Worm.java b/serialization/Worm.java index ebe0a3fe6..6497c6dc6 100644 --- a/serialization/Worm.java +++ b/serialization/Worm.java @@ -1,7 +1,7 @@ // serialization/Worm.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Demonstrates object serialization import java.io.*; import java.util.*; diff --git a/serialization/xfiles/ThawAlien.java b/serialization/xfiles/ThawAlien.java index bae803ad5..6f2eefaf7 100644 --- a/serialization/xfiles/ThawAlien.java +++ b/serialization/xfiles/ThawAlien.java @@ -1,7 +1,7 @@ // serialization/xfiles/ThawAlien.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Recover a serialized file // {java serialization.xfiles.ThawAlien} // {RunFirst: FreezeAlien} diff --git a/standardio/ChangeSystemOut.java b/standardio/ChangeSystemOut.java index d3943605b..55bad6dfd 100644 --- a/standardio/ChangeSystemOut.java +++ b/standardio/ChangeSystemOut.java @@ -1,7 +1,7 @@ // standardio/ChangeSystemOut.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Turn System.out into a PrintWriter import java.io.*; diff --git a/standardio/Echo.java b/standardio/Echo.java index 3fd9f2d71..6b1313c99 100644 --- a/standardio/Echo.java +++ b/standardio/Echo.java @@ -1,7 +1,7 @@ // standardio/Echo.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // How to read from standard input import java.io.*; import onjava.TimedAbort; diff --git a/standardio/OSExecuteDemo.java b/standardio/OSExecuteDemo.java index 826a80889..bd30e26b4 100644 --- a/standardio/OSExecuteDemo.java +++ b/standardio/OSExecuteDemo.java @@ -1,7 +1,7 @@ // standardio/OSExecuteDemo.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Demonstrates standard I/O redirection // {javap -cp build/classes/main OSExecuteDemo} import onjava.*; diff --git a/standardio/Redirecting.java b/standardio/Redirecting.java index b531d40f0..f43c901cf 100644 --- a/standardio/Redirecting.java +++ b/standardio/Redirecting.java @@ -1,7 +1,7 @@ // standardio/Redirecting.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Demonstrates standard I/O redirection import java.io.*; diff --git a/staticchecking/DogsAndRobots.cpp b/staticchecking/DogsAndRobots.cpp index eeb7f12e0..7057e7a66 100644 --- a/staticchecking/DogsAndRobots.cpp +++ b/staticchecking/DogsAndRobots.cpp @@ -1,7 +1,7 @@ // staticchecking/DogsAndRobots.cpp // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. #include using namespace std; diff --git a/staticchecking/DogsAndRobots.py b/staticchecking/DogsAndRobots.py index 68663e349..3102adf27 100644 --- a/staticchecking/DogsAndRobots.py +++ b/staticchecking/DogsAndRobots.py @@ -1,7 +1,7 @@ # staticchecking/DogsAndRobots.py # (c)2016 MindView LLC: see Copyright.txt # We make no guarantees that this code is fit for any purpose. -# Visit http://mindviewinc.com/Books/OnJava/ for more book information. +# Visit http://OnJava8.com for more book information. def speak(anything): anything.talk() diff --git a/staticchecking/NoBasePetSpeak.py b/staticchecking/NoBasePetSpeak.py index 6ada61896..5843fa0b2 100644 --- a/staticchecking/NoBasePetSpeak.py +++ b/staticchecking/NoBasePetSpeak.py @@ -1,7 +1,7 @@ # staticchecking/NoBasePetSpeak.py # (c)2016 MindView LLC: see Copyright.txt # We make no guarantees that this code is fit for any purpose. -# Visit http://mindviewinc.com/Books/OnJava/ for more book information. +# Visit http://OnJava8.com for more book information. # Speaking pets without base classes class Cat: diff --git a/staticchecking/PetSpeak.py b/staticchecking/PetSpeak.py index 36c8f2d3c..eb42c4ad3 100644 --- a/staticchecking/PetSpeak.py +++ b/staticchecking/PetSpeak.py @@ -1,7 +1,7 @@ # staticchecking/PetSpeak.py # (c)2016 MindView LLC: see Copyright.txt # We make no guarantees that this code is fit for any purpose. -# Visit http://mindviewinc.com/Books/OnJava/ for more book information. +# Visit http://OnJava8.com for more book information. # Speaking pets in Python class Pet: diff --git a/staticchecking/dogsandrobots.go b/staticchecking/dogsandrobots.go index fdfe72e80..db682b40b 100644 --- a/staticchecking/dogsandrobots.go +++ b/staticchecking/dogsandrobots.go @@ -1,7 +1,7 @@ // staticchecking/dogsandrobots.go // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. package main import "fmt" diff --git a/staticchecking/dr/DogsAndRobots.java b/staticchecking/dr/DogsAndRobots.java index f9928f566..606a4f24f 100644 --- a/staticchecking/dr/DogsAndRobots.java +++ b/staticchecking/dr/DogsAndRobots.java @@ -1,7 +1,7 @@ // staticchecking/dr/DogsAndRobots.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // {java staticchecking.dr.DogsAndRobots} package staticchecking.dr; diff --git a/staticchecking/drc/DogAndRobotCollections.java b/staticchecking/drc/DogAndRobotCollections.java index 4afc25fdd..a0628a833 100644 --- a/staticchecking/drc/DogAndRobotCollections.java +++ b/staticchecking/drc/DogAndRobotCollections.java @@ -1,7 +1,7 @@ // staticchecking/drc/DogAndRobotCollections.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // {java staticchecking.drc.DogAndRobotCollections} package staticchecking.drc; import java.util.*; diff --git a/staticchecking/latent/Latent.java b/staticchecking/latent/Latent.java index 18574d106..d576b4755 100644 --- a/staticchecking/latent/Latent.java +++ b/staticchecking/latent/Latent.java @@ -1,7 +1,7 @@ // staticchecking/latent/Latent.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // {java staticchecking.latent.Latent} package staticchecking.latent; import java.lang.reflect.*; diff --git a/staticchecking/petspeak.go b/staticchecking/petspeak.go index e226e8a9c..e0c3bfdf6 100644 --- a/staticchecking/petspeak.go +++ b/staticchecking/petspeak.go @@ -1,7 +1,7 @@ // staticchecking/petspeak.go // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. package main import "fmt" diff --git a/staticchecking/petspeak/PetSpeak.java b/staticchecking/petspeak/PetSpeak.java index c6599c8a5..b0b534acf 100644 --- a/staticchecking/petspeak/PetSpeak.java +++ b/staticchecking/petspeak/PetSpeak.java @@ -1,7 +1,7 @@ // staticchecking/petspeak/PetSpeak.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Speaking pets in Java // {java staticchecking.petspeak.PetSpeak} package staticchecking.petspeak; diff --git a/streams/ArrayStreams.java b/streams/ArrayStreams.java index ecfcbd230..d0a13fd01 100644 --- a/streams/ArrayStreams.java +++ b/streams/ArrayStreams.java @@ -1,7 +1,7 @@ // streams/ArrayStreams.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.util.*; import java.util.stream.*; diff --git a/streams/Bubble.java b/streams/Bubble.java index c0cba17c3..d2704dc43 100644 --- a/streams/Bubble.java +++ b/streams/Bubble.java @@ -1,7 +1,7 @@ // streams/Bubble.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.util.function.*; public class Bubble { diff --git a/streams/Bubbles.java b/streams/Bubbles.java index 89771baea..a9f2a4d61 100644 --- a/streams/Bubbles.java +++ b/streams/Bubbles.java @@ -1,7 +1,7 @@ // streams/Bubbles.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.util.stream.*; public class Bubbles { diff --git a/streams/CollectionToStream.java b/streams/CollectionToStream.java index e0453a790..860bd3a5a 100644 --- a/streams/CollectionToStream.java +++ b/streams/CollectionToStream.java @@ -1,7 +1,7 @@ // streams/CollectionToStream.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.util.*; import java.util.stream.*; diff --git a/streams/CreatingOptionals.java b/streams/CreatingOptionals.java index e7365b3f1..e53f16c1c 100644 --- a/streams/CreatingOptionals.java +++ b/streams/CreatingOptionals.java @@ -1,7 +1,7 @@ // streams/CreatingOptionals.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.util.*; import java.util.stream.*; import java.util.function.*; diff --git a/streams/Duplicator.java b/streams/Duplicator.java index e3b815bac..1ce705a1a 100644 --- a/streams/Duplicator.java +++ b/streams/Duplicator.java @@ -1,7 +1,7 @@ // streams/Duplicator.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.util.stream.*; public class Duplicator { diff --git a/streams/Fibonacci.java b/streams/Fibonacci.java index d71231733..45a323777 100644 --- a/streams/Fibonacci.java +++ b/streams/Fibonacci.java @@ -1,7 +1,7 @@ // streams/Fibonacci.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.util.stream.*; public class Fibonacci { diff --git a/streams/FileToWords.java b/streams/FileToWords.java index b4b9ed1d7..c78b27fe1 100644 --- a/streams/FileToWords.java +++ b/streams/FileToWords.java @@ -1,7 +1,7 @@ // streams/FileToWords.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.nio.file.*; import java.util.stream.*; import java.util.regex.Pattern; diff --git a/streams/FileToWordsBuilder.java b/streams/FileToWordsBuilder.java index 89619eb46..340cf998f 100644 --- a/streams/FileToWordsBuilder.java +++ b/streams/FileToWordsBuilder.java @@ -1,7 +1,7 @@ // streams/FileToWordsBuilder.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.io.*; import java.nio.file.*; import java.util.stream.*; diff --git a/streams/FileToWordsRegexp.java b/streams/FileToWordsRegexp.java index 453596f75..d7b3b6801 100644 --- a/streams/FileToWordsRegexp.java +++ b/streams/FileToWordsRegexp.java @@ -1,7 +1,7 @@ // streams/FileToWordsRegexp.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.io.*; import java.nio.file.*; import java.util.stream.*; diff --git a/streams/FileToWordsTest.java b/streams/FileToWordsTest.java index 761c1d329..1ca687248 100644 --- a/streams/FileToWordsTest.java +++ b/streams/FileToWordsTest.java @@ -1,7 +1,7 @@ // streams/FileToWordsTest.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.util.stream.*; public class FileToWordsTest { diff --git a/streams/FlatMap.java b/streams/FlatMap.java index 982e591f9..23f65215c 100644 --- a/streams/FlatMap.java +++ b/streams/FlatMap.java @@ -1,7 +1,7 @@ // streams/FlatMap.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.util.stream.*; public class FlatMap { diff --git a/streams/ForEach.java b/streams/ForEach.java index 9829125bd..ad2edd95f 100644 --- a/streams/ForEach.java +++ b/streams/ForEach.java @@ -1,7 +1,7 @@ // streams/ForEach.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.util.*; import java.util.stream.*; import static streams.RandInts.*; diff --git a/streams/FunctionMap.java b/streams/FunctionMap.java index 1321a6c36..8415c6249 100644 --- a/streams/FunctionMap.java +++ b/streams/FunctionMap.java @@ -1,7 +1,7 @@ // streams/FunctionMap.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.util.*; import java.util.stream.*; import java.util.function.*; diff --git a/streams/FunctionMap2.java b/streams/FunctionMap2.java index 445b561d9..a110e29e1 100644 --- a/streams/FunctionMap2.java +++ b/streams/FunctionMap2.java @@ -1,7 +1,7 @@ // streams/FunctionMap2.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Different input and output types import java.util.*; import java.util.stream.*; diff --git a/streams/FunctionMap3.java b/streams/FunctionMap3.java index 66dc6323a..a645160d9 100644 --- a/streams/FunctionMap3.java +++ b/streams/FunctionMap3.java @@ -1,7 +1,7 @@ // streams/FunctionMap3.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Producing numeric output streams import java.util.*; import java.util.stream.*; diff --git a/streams/Generator.java b/streams/Generator.java index 1ac5b12c2..aeecffef2 100644 --- a/streams/Generator.java +++ b/streams/Generator.java @@ -1,7 +1,7 @@ // streams/Generator.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.util.*; import java.util.function.*; import java.util.stream.*; diff --git a/streams/ImperativeRandoms.java b/streams/ImperativeRandoms.java index 386630045..76fb2d51c 100644 --- a/streams/ImperativeRandoms.java +++ b/streams/ImperativeRandoms.java @@ -1,7 +1,7 @@ // streams/ImperativeRandoms.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.util.*; public class ImperativeRandoms { diff --git a/streams/Informational.java b/streams/Informational.java index ff3691a25..0836faaf3 100644 --- a/streams/Informational.java +++ b/streams/Informational.java @@ -1,7 +1,7 @@ // streams/Informational.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.util.stream.*; import java.util.function.*; diff --git a/streams/LastElement.java b/streams/LastElement.java index cc0f3eb3a..3d04317c1 100644 --- a/streams/LastElement.java +++ b/streams/LastElement.java @@ -1,7 +1,7 @@ // streams/LastElement.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.util.*; import java.util.stream.*; diff --git a/streams/Looping.java b/streams/Looping.java index 7342550c4..377e79aef 100644 --- a/streams/Looping.java +++ b/streams/Looping.java @@ -1,7 +1,7 @@ // streams/Looping.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import static onjava.Repeat.*; public class Looping { diff --git a/streams/Machine2.java b/streams/Machine2.java index 97c71e996..356426c3d 100644 --- a/streams/Machine2.java +++ b/streams/Machine2.java @@ -1,7 +1,7 @@ // streams/Machine2.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.util.*; import onjava.Operation; diff --git a/streams/MapCollector.java b/streams/MapCollector.java index d8fea36ab..72851dafb 100644 --- a/streams/MapCollector.java +++ b/streams/MapCollector.java @@ -1,7 +1,7 @@ // streams/MapCollector.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.util.*; import java.util.stream.*; diff --git a/streams/Matching.java b/streams/Matching.java index c1f8b0b80..08e0ea0a6 100644 --- a/streams/Matching.java +++ b/streams/Matching.java @@ -1,7 +1,7 @@ // streams/Matching.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Demonstrates short-circuiting of *Match() operations import java.util.stream.*; import java.util.function.*; diff --git a/streams/NumericStreamInfo.java b/streams/NumericStreamInfo.java index 2636d0115..2e066f79f 100644 --- a/streams/NumericStreamInfo.java +++ b/streams/NumericStreamInfo.java @@ -1,7 +1,7 @@ // streams/NumericStreamInfo.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.util.stream.*; import static streams.RandInts.*; diff --git a/streams/OptionalBasics.java b/streams/OptionalBasics.java index f904adcab..5916bb800 100644 --- a/streams/OptionalBasics.java +++ b/streams/OptionalBasics.java @@ -1,7 +1,7 @@ // streams/OptionalBasics.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.util.*; import java.util.stream.*; diff --git a/streams/OptionalFilter.java b/streams/OptionalFilter.java index 0c64c21b6..2a681bd4a 100644 --- a/streams/OptionalFilter.java +++ b/streams/OptionalFilter.java @@ -1,7 +1,7 @@ // streams/OptionalFilter.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.util.*; import java.util.stream.*; import java.util.function.*; diff --git a/streams/OptionalFlatMap.java b/streams/OptionalFlatMap.java index ba0d586b4..5fc4ec364 100644 --- a/streams/OptionalFlatMap.java +++ b/streams/OptionalFlatMap.java @@ -1,7 +1,7 @@ // streams/OptionalFlatMap.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.util.*; import java.util.stream.*; import java.util.function.*; diff --git a/streams/OptionalMap.java b/streams/OptionalMap.java index 6778033a1..23bf14051 100644 --- a/streams/OptionalMap.java +++ b/streams/OptionalMap.java @@ -1,7 +1,7 @@ // streams/OptionalMap.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.util.*; import java.util.stream.*; import java.util.function.*; diff --git a/streams/Optionals.java b/streams/Optionals.java index b8604dad0..774df4b5e 100644 --- a/streams/Optionals.java +++ b/streams/Optionals.java @@ -1,7 +1,7 @@ // streams/Optionals.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.util.*; import java.util.stream.*; import java.util.function.*; diff --git a/streams/OptionalsFromEmptyStreams.java b/streams/OptionalsFromEmptyStreams.java index e5326ed70..1705450be 100644 --- a/streams/OptionalsFromEmptyStreams.java +++ b/streams/OptionalsFromEmptyStreams.java @@ -1,7 +1,7 @@ // streams/OptionalsFromEmptyStreams.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.util.*; import java.util.stream.*; diff --git a/streams/Peeking.java b/streams/Peeking.java index 67cc56eab..2510d14f7 100644 --- a/streams/Peeking.java +++ b/streams/Peeking.java @@ -1,7 +1,7 @@ // streams/Peeking.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. class Peeking { public static void diff --git a/streams/Prime.java b/streams/Prime.java index 3920ae1a4..aee81339a 100644 --- a/streams/Prime.java +++ b/streams/Prime.java @@ -1,7 +1,7 @@ // streams/Prime.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.util.stream.*; import static java.util.stream.LongStream.*; diff --git a/streams/RandInts.java b/streams/RandInts.java index 68fefd1a0..abb8b4e02 100644 --- a/streams/RandInts.java +++ b/streams/RandInts.java @@ -1,7 +1,7 @@ // streams/RandInts.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. package streams; import java.util.*; import java.util.stream.*; diff --git a/streams/RandomGenerators.java b/streams/RandomGenerators.java index e02ec0175..abebb3bad 100644 --- a/streams/RandomGenerators.java +++ b/streams/RandomGenerators.java @@ -1,7 +1,7 @@ // streams/RandomGenerators.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.util.*; import java.util.stream.*; diff --git a/streams/RandomWords.java b/streams/RandomWords.java index b72cff788..d27ce0e2d 100644 --- a/streams/RandomWords.java +++ b/streams/RandomWords.java @@ -1,7 +1,7 @@ // streams/RandomWords.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.util.*; import java.util.stream.*; import java.util.function.*; diff --git a/streams/Randoms.java b/streams/Randoms.java index e43a109d2..46b0b8772 100644 --- a/streams/Randoms.java +++ b/streams/Randoms.java @@ -1,7 +1,7 @@ // streams/Randoms.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.util.*; public class Randoms { diff --git a/streams/Ranges.java b/streams/Ranges.java index 2719bdd16..8211d70f4 100644 --- a/streams/Ranges.java +++ b/streams/Ranges.java @@ -1,7 +1,7 @@ // streams/Ranges.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import static java.util.stream.IntStream.*; public class Ranges { diff --git a/streams/Reduce.java b/streams/Reduce.java index c5acf356f..722370899 100644 --- a/streams/Reduce.java +++ b/streams/Reduce.java @@ -1,7 +1,7 @@ // streams/Reduce.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.util.*; import java.util.stream.*; diff --git a/streams/SelectElement.java b/streams/SelectElement.java index b6d240a1a..fa3df90fb 100644 --- a/streams/SelectElement.java +++ b/streams/SelectElement.java @@ -1,7 +1,7 @@ // streams/SelectElement.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.util.*; import java.util.stream.*; import static streams.RandInts.*; diff --git a/streams/Signal.java b/streams/Signal.java index 540a1d2bc..5d1bef7d4 100644 --- a/streams/Signal.java +++ b/streams/Signal.java @@ -1,7 +1,7 @@ // streams/Signal.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.util.*; import java.util.stream.*; import java.util.function.*; diff --git a/streams/SortedComparator.java b/streams/SortedComparator.java index 2fba575de..fe432bc03 100644 --- a/streams/SortedComparator.java +++ b/streams/SortedComparator.java @@ -1,7 +1,7 @@ // streams/SortedComparator.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.util.*; public class SortedComparator { diff --git a/streams/SpecialCollector.java b/streams/SpecialCollector.java index 474b09dc4..bcd0d0171 100644 --- a/streams/SpecialCollector.java +++ b/streams/SpecialCollector.java @@ -1,7 +1,7 @@ // streams/SpecialCollector.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.util.*; import java.util.stream.*; diff --git a/streams/StreamOf.java b/streams/StreamOf.java index 7a4e8428d..bc8692ab6 100644 --- a/streams/StreamOf.java +++ b/streams/StreamOf.java @@ -1,7 +1,7 @@ // streams/StreamOf.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.util.stream.*; public class StreamOf { diff --git a/streams/StreamOfOptionals.java b/streams/StreamOfOptionals.java index e3aee8b71..34e48fda9 100644 --- a/streams/StreamOfOptionals.java +++ b/streams/StreamOfOptionals.java @@ -1,7 +1,7 @@ // streams/StreamOfOptionals.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.util.*; import java.util.stream.*; diff --git a/streams/StreamOfRandoms.java b/streams/StreamOfRandoms.java index 377025e2e..54114bb99 100644 --- a/streams/StreamOfRandoms.java +++ b/streams/StreamOfRandoms.java @@ -1,7 +1,7 @@ // streams/StreamOfRandoms.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.util.*; import java.util.stream.*; diff --git a/streams/StreamOfStreams.java b/streams/StreamOfStreams.java index 79b427c28..885886017 100644 --- a/streams/StreamOfStreams.java +++ b/streams/StreamOfStreams.java @@ -1,7 +1,7 @@ // streams/StreamOfStreams.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.util.stream.*; public class StreamOfStreams { diff --git a/streams/TreeSetOfWords.java b/streams/TreeSetOfWords.java index f2e17e2a3..1cd1860bd 100644 --- a/streams/TreeSetOfWords.java +++ b/streams/TreeSetOfWords.java @@ -1,7 +1,7 @@ // streams/TreeSetOfWords.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.util.*; import java.nio.file.*; import java.util.stream.*; diff --git a/strings/ArrayListDisplay.java b/strings/ArrayListDisplay.java index 6ff519e2e..3dfe9e9c3 100644 --- a/strings/ArrayListDisplay.java +++ b/strings/ArrayListDisplay.java @@ -1,7 +1,7 @@ // strings/ArrayListDisplay.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.util.*; import java.util.stream.*; import generics.coffee.*; diff --git a/strings/BetterRead.java b/strings/BetterRead.java index 5877e9c47..0bc2e4906 100644 --- a/strings/BetterRead.java +++ b/strings/BetterRead.java @@ -1,7 +1,7 @@ // strings/BetterRead.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.util.*; public class BetterRead { diff --git a/strings/Concatenation.java b/strings/Concatenation.java index 751c3c0b2..3f5aa47f1 100644 --- a/strings/Concatenation.java +++ b/strings/Concatenation.java @@ -1,7 +1,7 @@ // strings/Concatenation.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. public class Concatenation { public static void main(String[] args) { diff --git a/strings/Conversion.java b/strings/Conversion.java index 857ca4296..425e63c95 100644 --- a/strings/Conversion.java +++ b/strings/Conversion.java @@ -1,7 +1,7 @@ // strings/Conversion.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.math.*; import java.util.*; diff --git a/strings/DatabaseException.java b/strings/DatabaseException.java index 5e046ffa9..3cd405ea3 100644 --- a/strings/DatabaseException.java +++ b/strings/DatabaseException.java @@ -1,7 +1,7 @@ // strings/DatabaseException.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. public class DatabaseException extends Exception { public DatabaseException(int transactionID, int queryID, diff --git a/strings/Finding.java b/strings/Finding.java index 4cd7922b8..142676b1b 100644 --- a/strings/Finding.java +++ b/strings/Finding.java @@ -1,7 +1,7 @@ // strings/Finding.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.util.regex.*; public class Finding { diff --git a/strings/Groups.java b/strings/Groups.java index 25668097c..0de006c13 100644 --- a/strings/Groups.java +++ b/strings/Groups.java @@ -1,7 +1,7 @@ // strings/Groups.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.util.regex.*; public class Groups { diff --git a/strings/Immutable.java b/strings/Immutable.java index b2e263c99..5e3c48f33 100644 --- a/strings/Immutable.java +++ b/strings/Immutable.java @@ -1,7 +1,7 @@ // strings/Immutable.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. public class Immutable { public static String upcase(String s) { diff --git a/strings/InfiniteRecursion.java b/strings/InfiniteRecursion.java index 769081720..aa1b23cba 100644 --- a/strings/InfiniteRecursion.java +++ b/strings/InfiniteRecursion.java @@ -1,7 +1,7 @@ // strings/InfiniteRecursion.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Accidental recursion // {ThrowsException} // {ValidateByHand} diff --git a/strings/IntegerMatch.java b/strings/IntegerMatch.java index 21c43320b..8b966c644 100644 --- a/strings/IntegerMatch.java +++ b/strings/IntegerMatch.java @@ -1,7 +1,7 @@ // strings/IntegerMatch.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. public class IntegerMatch { public static void main(String[] args) { diff --git a/strings/JGrep.java b/strings/JGrep.java index a0a04775d..bb5c3371c 100644 --- a/strings/JGrep.java +++ b/strings/JGrep.java @@ -1,7 +1,7 @@ // strings/JGrep.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // A very simple version of the "grep" program // {java JGrep // WhitherStringBuilder.java 'return|for|String'} diff --git a/strings/ReFlags.java b/strings/ReFlags.java index 886fd9254..ad278b32e 100644 --- a/strings/ReFlags.java +++ b/strings/ReFlags.java @@ -1,7 +1,7 @@ // strings/ReFlags.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.util.regex.*; public class ReFlags { diff --git a/strings/ReceiptBuilder.java b/strings/ReceiptBuilder.java index bee6b5e66..238234630 100644 --- a/strings/ReceiptBuilder.java +++ b/strings/ReceiptBuilder.java @@ -1,7 +1,7 @@ // strings/ReceiptBuilder.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.util.*; public class ReceiptBuilder { diff --git a/strings/Replacing.java b/strings/Replacing.java index e1bc965c9..b9e1e65c8 100644 --- a/strings/Replacing.java +++ b/strings/Replacing.java @@ -1,7 +1,7 @@ // strings/Replacing.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. public class Replacing { static String s = Splitting.knights; diff --git a/strings/ReplacingStringTokenizer.java b/strings/ReplacingStringTokenizer.java index 13e38fa73..5c389726b 100644 --- a/strings/ReplacingStringTokenizer.java +++ b/strings/ReplacingStringTokenizer.java @@ -1,7 +1,7 @@ // strings/ReplacingStringTokenizer.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.util.*; public class ReplacingStringTokenizer { diff --git a/strings/Resetting.java b/strings/Resetting.java index 7a1b1343f..5d921f31e 100644 --- a/strings/Resetting.java +++ b/strings/Resetting.java @@ -1,7 +1,7 @@ // strings/Resetting.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.util.regex.*; public class Resetting { diff --git a/strings/Rudolph.java b/strings/Rudolph.java index 15abd58ad..481f44539 100644 --- a/strings/Rudolph.java +++ b/strings/Rudolph.java @@ -1,7 +1,7 @@ // strings/Rudolph.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. public class Rudolph { public static void main(String[] args) { diff --git a/strings/ScannerDelimiter.java b/strings/ScannerDelimiter.java index 8e2969423..ab67e2d4f 100644 --- a/strings/ScannerDelimiter.java +++ b/strings/ScannerDelimiter.java @@ -1,7 +1,7 @@ // strings/ScannerDelimiter.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.util.*; public class ScannerDelimiter { diff --git a/strings/SimpleFormat.java b/strings/SimpleFormat.java index 8cbd21895..28d0ef4e6 100644 --- a/strings/SimpleFormat.java +++ b/strings/SimpleFormat.java @@ -1,7 +1,7 @@ // strings/SimpleFormat.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. public class SimpleFormat { public static void main(String[] args) { diff --git a/strings/SimpleRead.java b/strings/SimpleRead.java index 1d87761f8..8fc5fd638 100644 --- a/strings/SimpleRead.java +++ b/strings/SimpleRead.java @@ -1,7 +1,7 @@ // strings/SimpleRead.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.io.*; public class SimpleRead { diff --git a/strings/SplitDemo.java b/strings/SplitDemo.java index b8d388db2..4b66950b6 100644 --- a/strings/SplitDemo.java +++ b/strings/SplitDemo.java @@ -1,7 +1,7 @@ // strings/SplitDemo.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.util.regex.*; import java.util.*; diff --git a/strings/Splitting.java b/strings/Splitting.java index 0b76d123a..698cdde32 100644 --- a/strings/Splitting.java +++ b/strings/Splitting.java @@ -1,7 +1,7 @@ // strings/Splitting.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.util.*; public class Splitting { diff --git a/strings/StartEnd.java b/strings/StartEnd.java index faecde11e..d2f630744 100644 --- a/strings/StartEnd.java +++ b/strings/StartEnd.java @@ -1,7 +1,7 @@ // strings/StartEnd.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.util.regex.*; public class StartEnd { diff --git a/strings/TestRegularExpression.java b/strings/TestRegularExpression.java index 2ae1aaadd..bdf75ac34 100644 --- a/strings/TestRegularExpression.java +++ b/strings/TestRegularExpression.java @@ -1,7 +1,7 @@ // strings/TestRegularExpression.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Simple regular expression demonstration // {java TestRegularExpression // abcabcabcdefabc "abc+" "(abc)+" } diff --git a/strings/TheReplacements.java b/strings/TheReplacements.java index f35dc811f..ecbf4e1ee 100644 --- a/strings/TheReplacements.java +++ b/strings/TheReplacements.java @@ -1,7 +1,7 @@ // strings/TheReplacements.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.util.regex.*; import java.nio.file.*; import java.util.stream.*; diff --git a/strings/ThreatAnalyzer.java b/strings/ThreatAnalyzer.java index c32249455..c25f64e80 100644 --- a/strings/ThreatAnalyzer.java +++ b/strings/ThreatAnalyzer.java @@ -1,7 +1,7 @@ // strings/ThreatAnalyzer.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.util.regex.*; import java.util.*; diff --git a/strings/Turtle.java b/strings/Turtle.java index c4b29ad9b..a7a67b272 100644 --- a/strings/Turtle.java +++ b/strings/Turtle.java @@ -1,7 +1,7 @@ // strings/Turtle.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.io.*; import java.util.*; diff --git a/strings/UsingStringBuilder.java b/strings/UsingStringBuilder.java index 815c2ec08..e775be836 100644 --- a/strings/UsingStringBuilder.java +++ b/strings/UsingStringBuilder.java @@ -1,7 +1,7 @@ // strings/UsingStringBuilder.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.util.*; public class UsingStringBuilder { diff --git a/strings/WhitherStringBuilder.java b/strings/WhitherStringBuilder.java index 5c05b9884..e3c8b9bde 100644 --- a/strings/WhitherStringBuilder.java +++ b/strings/WhitherStringBuilder.java @@ -1,7 +1,7 @@ // strings/WhitherStringBuilder.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. public class WhitherStringBuilder { public String implicit(String[] fields) { diff --git a/threads/AtomicEvenSupplier.java b/threads/AtomicEvenSupplier.java index f1674d379..15e342448 100644 --- a/threads/AtomicEvenSupplier.java +++ b/threads/AtomicEvenSupplier.java @@ -1,7 +1,7 @@ // threads/AtomicEvenSupplier.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Atomic classes are occasionally useful in regular code // {IgnoreOutput} // No output validation import java.util.concurrent.atomic.*; diff --git a/threads/AtomicIntegerTest.java b/threads/AtomicIntegerTest.java index f3885c104..3b122d4a2 100644 --- a/threads/AtomicIntegerTest.java +++ b/threads/AtomicIntegerTest.java @@ -1,7 +1,7 @@ // threads/AtomicIntegerTest.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.util.concurrent.*; import java.util.concurrent.atomic.*; import java.util.*; diff --git a/threads/Atomicity.java b/threads/Atomicity.java index bfdce338c..4adcadd0c 100644 --- a/threads/Atomicity.java +++ b/threads/Atomicity.java @@ -1,7 +1,7 @@ // threads/Atomicity.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // {javap -c Atomicity} public class Atomicity { diff --git a/threads/AtomicityTest.java b/threads/AtomicityTest.java index 3f8f7f44a..9734e2010 100644 --- a/threads/AtomicityTest.java +++ b/threads/AtomicityTest.java @@ -1,7 +1,7 @@ // threads/AtomicityTest.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.util.concurrent.*; import onjava.TimedAbort; diff --git a/threads/AttemptLocking.java b/threads/AttemptLocking.java index 0990bb046..9ce120c1f 100644 --- a/threads/AttemptLocking.java +++ b/threads/AttemptLocking.java @@ -1,7 +1,7 @@ // threads/AttemptLocking.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Locks in the concurrent library allow you // to give up on trying to acquire a lock import java.util.concurrent.*; diff --git a/threads/BankTellerSimulation.java b/threads/BankTellerSimulation.java index fc272968c..1dcb0e5fb 100644 --- a/threads/BankTellerSimulation.java +++ b/threads/BankTellerSimulation.java @@ -1,7 +1,7 @@ // threads/BankTellerSimulation.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Using queues and multithreading // {java BankTellerSimulation 5} import java.util.concurrent.*; diff --git a/threads/CachedThreadPool.java b/threads/CachedThreadPool.java index a99f453b0..bca8b9e91 100644 --- a/threads/CachedThreadPool.java +++ b/threads/CachedThreadPool.java @@ -1,7 +1,7 @@ // threads/CachedThreadPool.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.util.concurrent.*; public class CachedThreadPool { diff --git a/threads/CachedThreadPool2.java b/threads/CachedThreadPool2.java index e154dc30a..9cfa97de2 100644 --- a/threads/CachedThreadPool2.java +++ b/threads/CachedThreadPool2.java @@ -1,7 +1,7 @@ // threads/CachedThreadPool2.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.util.concurrent.*; public class CachedThreadPool2 { diff --git a/threads/CachedThreadPool3.java b/threads/CachedThreadPool3.java index 7f5915555..98bf0f1c6 100644 --- a/threads/CachedThreadPool3.java +++ b/threads/CachedThreadPool3.java @@ -1,7 +1,7 @@ // threads/CachedThreadPool3.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.util.*; import java.util.concurrent.*; import java.util.stream.*; diff --git a/threads/CaptureUncaughtException.java b/threads/CaptureUncaughtException.java index aa66a3751..7ee35680d 100644 --- a/threads/CaptureUncaughtException.java +++ b/threads/CaptureUncaughtException.java @@ -1,7 +1,7 @@ // threads/CaptureUncaughtException.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.util.concurrent.*; import onjava.TimedAbort; diff --git a/threads/CarBuilder.java b/threads/CarBuilder.java index 571dbdb8e..8cb9a2633 100644 --- a/threads/CarBuilder.java +++ b/threads/CarBuilder.java @@ -1,7 +1,7 @@ // threads/CarBuilder.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // A complex example of tasks working together import java.util.concurrent.*; import java.util.*; diff --git a/threads/Chopstick.java b/threads/Chopstick.java index 9f2e10958..046d17278 100644 --- a/threads/Chopstick.java +++ b/threads/Chopstick.java @@ -1,7 +1,7 @@ // threads/Chopstick.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Chopsticks for dining philosophers public class Chopstick { diff --git a/threads/CollectionToStream.java b/threads/CollectionToStream.java index 391f81e56..0209a9b4e 100644 --- a/threads/CollectionToStream.java +++ b/threads/CollectionToStream.java @@ -1,7 +1,7 @@ // threads/CollectionToStream.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import onjava.*; import java.util.*; import java.util.stream.*; diff --git a/threads/CountingStream.java b/threads/CountingStream.java index cc52fe86c..f7e9403c6 100644 --- a/threads/CountingStream.java +++ b/threads/CountingStream.java @@ -1,7 +1,7 @@ // threads/CountingStream.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.util.*; import java.util.concurrent.*; import java.util.stream.*; diff --git a/threads/CountingTask.java b/threads/CountingTask.java index 9ac74f44f..4c1375df4 100644 --- a/threads/CountingTask.java +++ b/threads/CountingTask.java @@ -1,7 +1,7 @@ // threads/CountingTask.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.util.concurrent.*; public class CountingTask implements Callable { diff --git a/threads/CriticalSection.java b/threads/CriticalSection.java index cbb7d3e07..a653f35ed 100644 --- a/threads/CriticalSection.java +++ b/threads/CriticalSection.java @@ -1,7 +1,7 @@ // threads/CriticalSection.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // (Behavior may have changed in Java 8) // Synchronizing blocks instead of entire methods. Also // demonstrates protection of a non-thread-safe class diff --git a/threads/DeadlockingDiningPhilosophers.java b/threads/DeadlockingDiningPhilosophers.java index 53a4c38f6..6100d6613 100644 --- a/threads/DeadlockingDiningPhilosophers.java +++ b/threads/DeadlockingDiningPhilosophers.java @@ -1,7 +1,7 @@ // threads/DeadlockingDiningPhilosophers.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Demonstrates how deadlock can be hidden in a program // {java DeadlockingDiningPhilosophers 0 5 timeout} import java.util.concurrent.*; diff --git a/threads/DelayQueueDemo.java b/threads/DelayQueueDemo.java index 89ad75dcd..651bb7718 100644 --- a/threads/DelayQueueDemo.java +++ b/threads/DelayQueueDemo.java @@ -1,7 +1,7 @@ // threads/DelayQueueDemo.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.util.concurrent.*; import java.util.*; import static java.util.concurrent.TimeUnit.*; diff --git a/threads/EvenChecker.java b/threads/EvenChecker.java index 6fb775bb6..f42046fb2 100644 --- a/threads/EvenChecker.java +++ b/threads/EvenChecker.java @@ -1,7 +1,7 @@ // threads/EvenChecker.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.util.concurrent.*; public class EvenChecker implements Runnable { diff --git a/threads/EvenSupplier.java b/threads/EvenSupplier.java index edf147cde..f344bb70d 100644 --- a/threads/EvenSupplier.java +++ b/threads/EvenSupplier.java @@ -1,7 +1,7 @@ // threads/EvenSupplier.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // When threads collide import onjava.TimedAbort; diff --git a/threads/ExceptionThread.java b/threads/ExceptionThread.java index 6ebd68858..b2bb33df9 100644 --- a/threads/ExceptionThread.java +++ b/threads/ExceptionThread.java @@ -1,7 +1,7 @@ // threads/ExceptionThread.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // {ValidateByHand} // {ThrowsException} import java.util.concurrent.*; diff --git a/threads/ExplicitCriticalSection.java b/threads/ExplicitCriticalSection.java index 039cb074e..bcc32c092 100644 --- a/threads/ExplicitCriticalSection.java +++ b/threads/ExplicitCriticalSection.java @@ -1,7 +1,7 @@ // threads/ExplicitCriticalSection.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // {ThrowsException} on a multiprocessor machine // Using explicit Lock objects to create critical sections // {java threads.ExplicitCriticalSection} diff --git a/threads/FixedDiningPhilosophers.java b/threads/FixedDiningPhilosophers.java index 0bac9ed95..b321412d3 100644 --- a/threads/FixedDiningPhilosophers.java +++ b/threads/FixedDiningPhilosophers.java @@ -1,7 +1,7 @@ // threads/FixedDiningPhilosophers.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Dining philosophers without deadlock // {java FixedDiningPhilosophers 5 5 timeout} import java.util.concurrent.*; diff --git a/threads/Futures.java b/threads/Futures.java index 79434ffad..1fcf5b7da 100644 --- a/threads/Futures.java +++ b/threads/Futures.java @@ -1,7 +1,7 @@ // threads/Futures.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.util.*; import java.util.concurrent.*; import java.util.stream.*; diff --git a/threads/GreenhouseScheduler.java b/threads/GreenhouseScheduler.java index 4770fa8c1..9fc385d61 100644 --- a/threads/GreenhouseScheduler.java +++ b/threads/GreenhouseScheduler.java @@ -1,7 +1,7 @@ // threads/GreenhouseScheduler.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Rewriting innerclasses/GreenhouseController.java // to use a ScheduledThreadPoolExecutor // {java GreenhouseScheduler 5000} diff --git a/threads/HorseRace.java b/threads/HorseRace.java index 8b0bbbec1..c5ce98d12 100644 --- a/threads/HorseRace.java +++ b/threads/HorseRace.java @@ -1,7 +1,7 @@ // threads/HorseRace.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Using CyclicBarriers import java.util.concurrent.*; import java.util.*; diff --git a/threads/IntSupplier.java b/threads/IntSupplier.java index 07359d67e..e463bd027 100644 --- a/threads/IntSupplier.java +++ b/threads/IntSupplier.java @@ -1,7 +1,7 @@ // threads/IntSupplier.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. public abstract class IntSupplier { private volatile boolean canceled = false; diff --git a/threads/InterferingTask.java b/threads/InterferingTask.java index 2b88ea619..262c9dbdc 100644 --- a/threads/InterferingTask.java +++ b/threads/InterferingTask.java @@ -1,7 +1,7 @@ // threads/InterferingTask.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. public class InterferingTask implements Runnable { final int id; diff --git a/threads/LambdasAndMethodReferences.java b/threads/LambdasAndMethodReferences.java index 0eaa8062c..a37831da7 100644 --- a/threads/LambdasAndMethodReferences.java +++ b/threads/LambdasAndMethodReferences.java @@ -1,7 +1,7 @@ // threads/LambdasAndMethodReferences.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.util.concurrent.*; class NotRunnable { diff --git a/threads/MoreTasksAfterShutdown.java b/threads/MoreTasksAfterShutdown.java index 53a2d212c..1ba36d9b1 100644 --- a/threads/MoreTasksAfterShutdown.java +++ b/threads/MoreTasksAfterShutdown.java @@ -1,7 +1,7 @@ // threads/MoreTasksAfterShutdown.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.util.concurrent.*; public class MoreTasksAfterShutdown { diff --git a/threads/MutexEvenSupplier.java b/threads/MutexEvenSupplier.java index 1b15ba8dc..cbdf07c05 100644 --- a/threads/MutexEvenSupplier.java +++ b/threads/MutexEvenSupplier.java @@ -1,7 +1,7 @@ // threads/MutexEvenSupplier.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Preventing thread collisions with mutexes // {IgnoreOutput} // No output validation import java.util.concurrent.locks.*; diff --git a/threads/NaiveExceptionHandling.java b/threads/NaiveExceptionHandling.java index c2852255d..914ab3215 100644 --- a/threads/NaiveExceptionHandling.java +++ b/threads/NaiveExceptionHandling.java @@ -1,7 +1,7 @@ // threads/NaiveExceptionHandling.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // {ValidateByHand} // {ThrowsException} import java.util.concurrent.*; diff --git a/threads/NumberOfProcessors.java b/threads/NumberOfProcessors.java index 78d8306ea..7ffc8a7aa 100644 --- a/threads/NumberOfProcessors.java +++ b/threads/NumberOfProcessors.java @@ -1,7 +1,7 @@ // threads/NumberOfProcessors.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. public class NumberOfProcessors { public static void main(String[] args) { diff --git a/threads/ParallelStreamPuzzle.java b/threads/ParallelStreamPuzzle.java index c2429bf40..8798c6492 100644 --- a/threads/ParallelStreamPuzzle.java +++ b/threads/ParallelStreamPuzzle.java @@ -1,7 +1,7 @@ // threads/ParallelStreamPuzzle.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.util.*; import java.util.function.*; import java.util.stream.*; diff --git a/threads/ParallelStreamPuzzle2.java b/threads/ParallelStreamPuzzle2.java index 4468c35c9..7ced862ba 100644 --- a/threads/ParallelStreamPuzzle2.java +++ b/threads/ParallelStreamPuzzle2.java @@ -1,7 +1,7 @@ // threads/ParallelStreamPuzzle2.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.util.*; import java.util.function.*; import java.util.stream.*; diff --git a/threads/ParallelStreamPuzzle3.java b/threads/ParallelStreamPuzzle3.java index 4e822d53a..55562a0f8 100644 --- a/threads/ParallelStreamPuzzle3.java +++ b/threads/ParallelStreamPuzzle3.java @@ -1,7 +1,7 @@ // threads/ParallelStreamPuzzle3.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.util.*; import java.util.stream.*; diff --git a/threads/Philosopher.java b/threads/Philosopher.java index 61b05af05..7e33f1188 100644 --- a/threads/Philosopher.java +++ b/threads/Philosopher.java @@ -1,7 +1,7 @@ // threads/Philosopher.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // A dining philosopher import java.util.concurrent.*; import java.util.*; diff --git a/threads/Prime.java b/threads/Prime.java index 676b13c36..deed762ec 100644 --- a/threads/Prime.java +++ b/threads/Prime.java @@ -1,7 +1,7 @@ // threads/Prime.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.util.*; import java.util.stream.*; import static java.util.stream.LongStream.*; diff --git a/threads/PriorityBlockingQueueDemo.java b/threads/PriorityBlockingQueueDemo.java index 4469d4620..7eee0c8c9 100644 --- a/threads/PriorityBlockingQueueDemo.java +++ b/threads/PriorityBlockingQueueDemo.java @@ -1,7 +1,7 @@ // threads/PriorityBlockingQueueDemo.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.util.concurrent.*; import java.util.*; diff --git a/threads/QuittableTask.java b/threads/QuittableTask.java index c1cffd022..335add9c8 100644 --- a/threads/QuittableTask.java +++ b/threads/QuittableTask.java @@ -1,7 +1,7 @@ // threads/QuittableTask.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.util.concurrent.*; public class QuittableTask implements Runnable { diff --git a/threads/QuittingTasks.java b/threads/QuittingTasks.java index 4c6ecab6e..9c68bcbf5 100644 --- a/threads/QuittingTasks.java +++ b/threads/QuittingTasks.java @@ -1,7 +1,7 @@ // threads/QuittingTasks.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.util.*; import java.util.stream.*; import java.util.concurrent.*; diff --git a/threads/Restaurant.java b/threads/Restaurant.java index 42b7f750e..d2092de43 100644 --- a/threads/Restaurant.java +++ b/threads/Restaurant.java @@ -1,7 +1,7 @@ // threads/Restaurant.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // The producer-consumer approach to task cooperation import java.util.concurrent.*; diff --git a/threads/SerialNumberChecker.java b/threads/SerialNumberChecker.java index dbe0b12f2..d2283b225 100644 --- a/threads/SerialNumberChecker.java +++ b/threads/SerialNumberChecker.java @@ -1,7 +1,7 @@ // threads/SerialNumberChecker.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Operations that might seem safe are not, // when threads are present // {java SerialNumberChecker 4} diff --git a/threads/SerialNumberSupplier.java b/threads/SerialNumberSupplier.java index 39e9ce8f1..cedfe4854 100644 --- a/threads/SerialNumberSupplier.java +++ b/threads/SerialNumberSupplier.java @@ -1,7 +1,7 @@ // threads/SerialNumberSupplier.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. public class SerialNumberSupplier { private static volatile int serialNumber = 0; diff --git a/threads/SettingDefaultHandler.java b/threads/SettingDefaultHandler.java index 708a4f582..3b07bbf8f 100644 --- a/threads/SettingDefaultHandler.java +++ b/threads/SettingDefaultHandler.java @@ -1,7 +1,7 @@ // threads/SettingDefaultHandler.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.util.concurrent.*; import onjava.TimedAbort; diff --git a/threads/SingleThreadExecutor.java b/threads/SingleThreadExecutor.java index ac94e7c33..5515d98cc 100644 --- a/threads/SingleThreadExecutor.java +++ b/threads/SingleThreadExecutor.java @@ -1,7 +1,7 @@ // threads/SingleThreadExecutor.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.util.concurrent.*; public class SingleThreadExecutor { diff --git a/threads/SingleThreadExecutor2.java b/threads/SingleThreadExecutor2.java index b734dc7c7..f93183bcc 100644 --- a/threads/SingleThreadExecutor2.java +++ b/threads/SingleThreadExecutor2.java @@ -1,7 +1,7 @@ // threads/SingleThreadExecutor2.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.util.concurrent.*; public class SingleThreadExecutor2 { diff --git a/threads/SingleThreadExecutor3.java b/threads/SingleThreadExecutor3.java index 1aa62d0c7..9f5f58971 100644 --- a/threads/SingleThreadExecutor3.java +++ b/threads/SingleThreadExecutor3.java @@ -1,7 +1,7 @@ // threads/SingleThreadExecutor3.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.util.concurrent.*; public class SingleThreadExecutor3 { diff --git a/threads/SleepAndPrintTask.java b/threads/SleepAndPrintTask.java index 7c9a98bde..afedb3752 100644 --- a/threads/SleepAndPrintTask.java +++ b/threads/SleepAndPrintTask.java @@ -1,7 +1,7 @@ // threads/SleepAndPrintTask.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. public class SleepAndPrintTask implements Runnable { final int id; diff --git a/threads/Summing.java b/threads/Summing.java index 6cd86d3d6..34b4de185 100644 --- a/threads/Summing.java +++ b/threads/Summing.java @@ -1,7 +1,7 @@ // threads/Summing.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.util.stream.*; import java.util.function.*; diff --git a/threads/Summing2.java b/threads/Summing2.java index f3847e3c5..3e5f28e36 100644 --- a/threads/Summing2.java +++ b/threads/Summing2.java @@ -1,7 +1,7 @@ // threads/Summing2.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.util.*; public class Summing2 { diff --git a/threads/Summing3.java b/threads/Summing3.java index 75ca9dba3..eba4c5bef 100644 --- a/threads/Summing3.java +++ b/threads/Summing3.java @@ -1,7 +1,7 @@ // threads/Summing3.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.util.*; public class Summing3 { diff --git a/threads/Summing4.java b/threads/Summing4.java index c12836789..7cc6a63b5 100644 --- a/threads/Summing4.java +++ b/threads/Summing4.java @@ -1,7 +1,7 @@ // threads/Summing4.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.util.*; public class Summing4 { diff --git a/threads/SwallowedException.java b/threads/SwallowedException.java index ec662a094..bb34879b9 100644 --- a/threads/SwallowedException.java +++ b/threads/SwallowedException.java @@ -1,7 +1,7 @@ // threads/SwallowedException.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.util.concurrent.*; public class SwallowedException { diff --git a/threads/SyncObject.java b/threads/SyncObject.java index 79ae1d3ef..c70e949a0 100644 --- a/threads/SyncObject.java +++ b/threads/SyncObject.java @@ -1,7 +1,7 @@ // threads/SyncObject.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Synchronizing on another object class DualSynch { diff --git a/threads/SynchronizedEvenSupplier.java b/threads/SynchronizedEvenSupplier.java index e21698ef7..20555f37f 100644 --- a/threads/SynchronizedEvenSupplier.java +++ b/threads/SynchronizedEvenSupplier.java @@ -1,7 +1,7 @@ // threads/SynchronizedEvenSupplier.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Simplifying mutexes with the synchronized keyword // {IgnoreOutput} // No output validation import onjava.TimedAbort; diff --git a/threads/ThreadSize.java b/threads/ThreadSize.java index ed6f7713b..6002df845 100644 --- a/threads/ThreadSize.java +++ b/threads/ThreadSize.java @@ -1,7 +1,7 @@ // threads/ThreadSize.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // {ValidateByHand} import java.util.concurrent.*; diff --git a/threads/ToastOMatic.java b/threads/ToastOMatic.java index 9aa18b93f..89821469d 100644 --- a/threads/ToastOMatic.java +++ b/threads/ToastOMatic.java @@ -1,7 +1,7 @@ // threads/ToastOMatic.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // A toaster that uses queues import java.util.concurrent.*; import java.util.*; diff --git a/threads/WorkStealingPool.java b/threads/WorkStealingPool.java index 66c8bb806..13c8d6b43 100644 --- a/threads/WorkStealingPool.java +++ b/threads/WorkStealingPool.java @@ -1,7 +1,7 @@ // threads/WorkStealingPool.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.util.concurrent.*; class ShowThread implements Runnable { diff --git a/threads/restaurant2/RestaurantWithQueues.java b/threads/restaurant2/RestaurantWithQueues.java index c089e4bca..b3b5ed467 100644 --- a/threads/restaurant2/RestaurantWithQueues.java +++ b/threads/restaurant2/RestaurantWithQueues.java @@ -1,7 +1,7 @@ // threads/restaurant2/RestaurantWithQueues.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // {java threads.restaurant2.RestaurantWithQueues 5} package threads.restaurant2; import enums.menu.*; diff --git a/typeinfo/AnonymousImplementation.java b/typeinfo/AnonymousImplementation.java index 4c98347c0..710499e86 100644 --- a/typeinfo/AnonymousImplementation.java +++ b/typeinfo/AnonymousImplementation.java @@ -1,7 +1,7 @@ // typeinfo/AnonymousImplementation.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Anonymous inner classes can't hide from reflection import typeinfo.interfacea.*; diff --git a/typeinfo/BoundedClassReferences.java b/typeinfo/BoundedClassReferences.java index dffceaa77..6b728284e 100644 --- a/typeinfo/BoundedClassReferences.java +++ b/typeinfo/BoundedClassReferences.java @@ -1,7 +1,7 @@ // typeinfo/BoundedClassReferences.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. public class BoundedClassReferences { public static void main(String[] args) { diff --git a/typeinfo/ClassCasts.java b/typeinfo/ClassCasts.java index 8c1a2297f..c7c1f1fd7 100644 --- a/typeinfo/ClassCasts.java +++ b/typeinfo/ClassCasts.java @@ -1,7 +1,7 @@ // typeinfo/ClassCasts.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. class Building {} class House extends Building {} diff --git a/typeinfo/ClassInitialization.java b/typeinfo/ClassInitialization.java index 0c3080ba7..d0cd074bc 100644 --- a/typeinfo/ClassInitialization.java +++ b/typeinfo/ClassInitialization.java @@ -1,7 +1,7 @@ // typeinfo/ClassInitialization.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.util.*; class Initable { diff --git a/typeinfo/DynamicSupplier.java b/typeinfo/DynamicSupplier.java index 2ae0e5a31..cab2e3e9e 100644 --- a/typeinfo/DynamicSupplier.java +++ b/typeinfo/DynamicSupplier.java @@ -1,7 +1,7 @@ // typeinfo/DynamicSupplier.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.util.function.*; import java.util.stream.*; diff --git a/typeinfo/FamilyVsExactType.java b/typeinfo/FamilyVsExactType.java index cced9fba6..64e4c0470 100644 --- a/typeinfo/FamilyVsExactType.java +++ b/typeinfo/FamilyVsExactType.java @@ -1,7 +1,7 @@ // typeinfo/FamilyVsExactType.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // The difference between instanceof and class // {java typeinfo.FamilyVsExactType} package typeinfo; diff --git a/typeinfo/GenericClassReferences.java b/typeinfo/GenericClassReferences.java index fe01d9ada..a4c3b570a 100644 --- a/typeinfo/GenericClassReferences.java +++ b/typeinfo/GenericClassReferences.java @@ -1,7 +1,7 @@ // typeinfo/GenericClassReferences.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. public class GenericClassReferences { public static void main(String[] args) { diff --git a/typeinfo/HiddenImplementation.java b/typeinfo/HiddenImplementation.java index 08b75a97d..a1de7c487 100644 --- a/typeinfo/HiddenImplementation.java +++ b/typeinfo/HiddenImplementation.java @@ -1,7 +1,7 @@ // typeinfo/HiddenImplementation.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Sneaking around package hiding import typeinfo.interfacea.*; import typeinfo.packageaccess.*; diff --git a/typeinfo/InnerImplementation.java b/typeinfo/InnerImplementation.java index 4dfa5725a..e9a97f878 100644 --- a/typeinfo/InnerImplementation.java +++ b/typeinfo/InnerImplementation.java @@ -1,7 +1,7 @@ // typeinfo/InnerImplementation.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Private inner classes can't hide from reflection import typeinfo.interfacea.*; diff --git a/typeinfo/InterfaceViolation.java b/typeinfo/InterfaceViolation.java index 8d4c16f3d..a4620f660 100644 --- a/typeinfo/InterfaceViolation.java +++ b/typeinfo/InterfaceViolation.java @@ -1,7 +1,7 @@ // typeinfo/InterfaceViolation.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Sneaking around an interface import typeinfo.interfacea.*; diff --git a/typeinfo/ModifyingPrivateFields.java b/typeinfo/ModifyingPrivateFields.java index a9bf54aa8..4baa28f16 100644 --- a/typeinfo/ModifyingPrivateFields.java +++ b/typeinfo/ModifyingPrivateFields.java @@ -1,7 +1,7 @@ // typeinfo/ModifyingPrivateFields.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.lang.reflect.*; class WithPrivateFinalField { diff --git a/typeinfo/NullRobot.java b/typeinfo/NullRobot.java index 2713dcfcc..d39972b1d 100644 --- a/typeinfo/NullRobot.java +++ b/typeinfo/NullRobot.java @@ -1,7 +1,7 @@ // typeinfo/NullRobot.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Using a dynamic proxy to create an Optional import java.lang.reflect.*; import java.util.*; diff --git a/typeinfo/Operation.java b/typeinfo/Operation.java index f6c94da72..a3889cd1e 100644 --- a/typeinfo/Operation.java +++ b/typeinfo/Operation.java @@ -1,7 +1,7 @@ // typeinfo/Operation.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.util.function.*; public class Operation { diff --git a/typeinfo/Person.java b/typeinfo/Person.java index ec4f355da..356feeb69 100644 --- a/typeinfo/Person.java +++ b/typeinfo/Person.java @@ -1,7 +1,7 @@ // typeinfo/Person.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Using Optional with regular classes import onjava.*; import java.util.*; diff --git a/typeinfo/PetCount.java b/typeinfo/PetCount.java index 475cdc8f3..053b3faae 100644 --- a/typeinfo/PetCount.java +++ b/typeinfo/PetCount.java @@ -1,7 +1,7 @@ // typeinfo/PetCount.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Using instanceof import typeinfo.pets.*; import java.util.*; diff --git a/typeinfo/PetCount2.java b/typeinfo/PetCount2.java index fa1e7a11b..0adfde0d4 100644 --- a/typeinfo/PetCount2.java +++ b/typeinfo/PetCount2.java @@ -1,7 +1,7 @@ // typeinfo/PetCount2.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import typeinfo.pets.*; public class PetCount2 { diff --git a/typeinfo/PetCount3.java b/typeinfo/PetCount3.java index 74291dc47..b72181085 100644 --- a/typeinfo/PetCount3.java +++ b/typeinfo/PetCount3.java @@ -1,7 +1,7 @@ // typeinfo/PetCount3.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Using isInstance() import java.util.*; import java.util.stream.*; diff --git a/typeinfo/PetCount4.java b/typeinfo/PetCount4.java index 3b768ae2f..00f600b47 100644 --- a/typeinfo/PetCount4.java +++ b/typeinfo/PetCount4.java @@ -1,7 +1,7 @@ // typeinfo/PetCount4.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import typeinfo.pets.*; import onjava.*; diff --git a/typeinfo/Position.java b/typeinfo/Position.java index 59ed027f3..803545df7 100644 --- a/typeinfo/Position.java +++ b/typeinfo/Position.java @@ -1,7 +1,7 @@ // typeinfo/Position.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.util.*; class EmptyTitleException extends RuntimeException {} diff --git a/typeinfo/RegisteredFactories.java b/typeinfo/RegisteredFactories.java index 20859977b..5ecdc3bfd 100644 --- a/typeinfo/RegisteredFactories.java +++ b/typeinfo/RegisteredFactories.java @@ -1,7 +1,7 @@ // typeinfo/RegisteredFactories.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Registering Factories in the base class import java.util.*; import java.util.function.*; diff --git a/typeinfo/Robot.java b/typeinfo/Robot.java index a6f57fc20..180e2296e 100644 --- a/typeinfo/Robot.java +++ b/typeinfo/Robot.java @@ -1,7 +1,7 @@ // typeinfo/Robot.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import onjava.*; import java.util.*; diff --git a/typeinfo/SelectingMethods.java b/typeinfo/SelectingMethods.java index 6c7b4df77..0d878567e 100644 --- a/typeinfo/SelectingMethods.java +++ b/typeinfo/SelectingMethods.java @@ -1,7 +1,7 @@ // typeinfo/SelectingMethods.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Looking for particular methods in a dynamic proxy import java.lang.reflect.*; diff --git a/typeinfo/Shapes.java b/typeinfo/Shapes.java index 1d43e4393..94c20971e 100644 --- a/typeinfo/Shapes.java +++ b/typeinfo/Shapes.java @@ -1,7 +1,7 @@ // typeinfo/Shapes.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.util.stream.*; abstract class Shape { diff --git a/typeinfo/ShowMethods.java b/typeinfo/ShowMethods.java index ac9eb9f7f..ad9221209 100644 --- a/typeinfo/ShowMethods.java +++ b/typeinfo/ShowMethods.java @@ -1,7 +1,7 @@ // typeinfo/ShowMethods.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Using reflection to show all the methods of a class, // even if the methods are defined in the base class // {java ShowMethods ShowMethods} diff --git a/typeinfo/SimpleDynamicProxy.java b/typeinfo/SimpleDynamicProxy.java index 1ced955a9..09a014a85 100644 --- a/typeinfo/SimpleDynamicProxy.java +++ b/typeinfo/SimpleDynamicProxy.java @@ -1,7 +1,7 @@ // typeinfo/SimpleDynamicProxy.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.lang.reflect.*; class DynamicProxyHandler implements InvocationHandler { diff --git a/typeinfo/SimpleProxyDemo.java b/typeinfo/SimpleProxyDemo.java index c6fd64f86..b46f20fa0 100644 --- a/typeinfo/SimpleProxyDemo.java +++ b/typeinfo/SimpleProxyDemo.java @@ -1,7 +1,7 @@ // typeinfo/SimpleProxyDemo.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. interface Interface { void doSomething(); diff --git a/typeinfo/SnowRemovalRobot.java b/typeinfo/SnowRemovalRobot.java index 5c49e0574..852be07b1 100644 --- a/typeinfo/SnowRemovalRobot.java +++ b/typeinfo/SnowRemovalRobot.java @@ -1,7 +1,7 @@ // typeinfo/SnowRemovalRobot.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.util.*; public class SnowRemovalRobot implements Robot { diff --git a/typeinfo/Staff.java b/typeinfo/Staff.java index b05d75ef0..fc064c1dc 100644 --- a/typeinfo/Staff.java +++ b/typeinfo/Staff.java @@ -1,7 +1,7 @@ // typeinfo/Staff.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.util.*; public class Staff extends ArrayList { diff --git a/typeinfo/SweetShop.java b/typeinfo/SweetShop.java index 7d67210cb..e1b0fba3a 100644 --- a/typeinfo/SweetShop.java +++ b/typeinfo/SweetShop.java @@ -1,7 +1,7 @@ // typeinfo/SweetShop.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Examination of the way the class loader works class Cookie { diff --git a/typeinfo/WildcardClassReferences.java b/typeinfo/WildcardClassReferences.java index 986c64322..abe42d3ca 100644 --- a/typeinfo/WildcardClassReferences.java +++ b/typeinfo/WildcardClassReferences.java @@ -1,7 +1,7 @@ // typeinfo/WildcardClassReferences.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. public class WildcardClassReferences { public static void main(String[] args) { diff --git a/typeinfo/interfacea/A.java b/typeinfo/interfacea/A.java index 0086dfaa2..50f7a7f81 100644 --- a/typeinfo/interfacea/A.java +++ b/typeinfo/interfacea/A.java @@ -1,7 +1,7 @@ // typeinfo/interfacea/A.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. package typeinfo.interfacea; public interface A { diff --git a/typeinfo/packageaccess/HiddenC.java b/typeinfo/packageaccess/HiddenC.java index 086d35850..679c37d93 100644 --- a/typeinfo/packageaccess/HiddenC.java +++ b/typeinfo/packageaccess/HiddenC.java @@ -1,7 +1,7 @@ // typeinfo/packageaccess/HiddenC.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. package typeinfo.packageaccess; import typeinfo.interfacea.*; diff --git a/typeinfo/pets/Cat.java b/typeinfo/pets/Cat.java index 2bd8678e7..feb9b2bd7 100644 --- a/typeinfo/pets/Cat.java +++ b/typeinfo/pets/Cat.java @@ -1,7 +1,7 @@ // typeinfo/pets/Cat.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. package typeinfo.pets; public class Cat extends Pet { diff --git a/typeinfo/pets/Cymric.java b/typeinfo/pets/Cymric.java index c16029af7..a60f9d902 100644 --- a/typeinfo/pets/Cymric.java +++ b/typeinfo/pets/Cymric.java @@ -1,7 +1,7 @@ // typeinfo/pets/Cymric.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. package typeinfo.pets; public class Cymric extends Manx { diff --git a/typeinfo/pets/Dog.java b/typeinfo/pets/Dog.java index 6f451e548..2610b54cb 100644 --- a/typeinfo/pets/Dog.java +++ b/typeinfo/pets/Dog.java @@ -1,7 +1,7 @@ // typeinfo/pets/Dog.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. package typeinfo.pets; public class Dog extends Pet { diff --git a/typeinfo/pets/EgyptianMau.java b/typeinfo/pets/EgyptianMau.java index 82d06f179..219d9a363 100644 --- a/typeinfo/pets/EgyptianMau.java +++ b/typeinfo/pets/EgyptianMau.java @@ -1,7 +1,7 @@ // typeinfo/pets/EgyptianMau.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. package typeinfo.pets; public class EgyptianMau extends Cat { diff --git a/typeinfo/pets/ForNameCreator.java b/typeinfo/pets/ForNameCreator.java index 3799f62c9..1a7696ee8 100644 --- a/typeinfo/pets/ForNameCreator.java +++ b/typeinfo/pets/ForNameCreator.java @@ -1,7 +1,7 @@ // typeinfo/pets/ForNameCreator.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. package typeinfo.pets; import java.util.*; diff --git a/typeinfo/pets/Hamster.java b/typeinfo/pets/Hamster.java index b5a123dd0..511f486f7 100644 --- a/typeinfo/pets/Hamster.java +++ b/typeinfo/pets/Hamster.java @@ -1,7 +1,7 @@ // typeinfo/pets/Hamster.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. package typeinfo.pets; public class Hamster extends Rodent { diff --git a/typeinfo/pets/Individual.java b/typeinfo/pets/Individual.java index 23b06a232..e83794dd4 100644 --- a/typeinfo/pets/Individual.java +++ b/typeinfo/pets/Individual.java @@ -1,7 +1,7 @@ // typeinfo/pets/Individual.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. package typeinfo.pets; public class diff --git a/typeinfo/pets/LiteralPetCreator.java b/typeinfo/pets/LiteralPetCreator.java index 67c928acd..d06e6df03 100644 --- a/typeinfo/pets/LiteralPetCreator.java +++ b/typeinfo/pets/LiteralPetCreator.java @@ -1,7 +1,7 @@ // typeinfo/pets/LiteralPetCreator.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Using class literals // {java typeinfo.pets.LiteralPetCreator} package typeinfo.pets; diff --git a/typeinfo/pets/Manx.java b/typeinfo/pets/Manx.java index dace56721..c68aa1fe1 100644 --- a/typeinfo/pets/Manx.java +++ b/typeinfo/pets/Manx.java @@ -1,7 +1,7 @@ // typeinfo/pets/Manx.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. package typeinfo.pets; public class Manx extends Cat { diff --git a/typeinfo/pets/Mouse.java b/typeinfo/pets/Mouse.java index 50da28d12..89971c899 100644 --- a/typeinfo/pets/Mouse.java +++ b/typeinfo/pets/Mouse.java @@ -1,7 +1,7 @@ // typeinfo/pets/Mouse.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. package typeinfo.pets; public class Mouse extends Rodent { diff --git a/typeinfo/pets/Mutt.java b/typeinfo/pets/Mutt.java index 27fc21c45..8bce4906e 100644 --- a/typeinfo/pets/Mutt.java +++ b/typeinfo/pets/Mutt.java @@ -1,7 +1,7 @@ // typeinfo/pets/Mutt.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. package typeinfo.pets; public class Mutt extends Dog { diff --git a/typeinfo/pets/Person.java b/typeinfo/pets/Person.java index bf8005a22..dc7f5c930 100644 --- a/typeinfo/pets/Person.java +++ b/typeinfo/pets/Person.java @@ -1,7 +1,7 @@ // typeinfo/pets/Person.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. package typeinfo.pets; public class Person extends Individual { diff --git a/typeinfo/pets/Pet.java b/typeinfo/pets/Pet.java index fb8bd4815..8556e450b 100644 --- a/typeinfo/pets/Pet.java +++ b/typeinfo/pets/Pet.java @@ -1,7 +1,7 @@ // typeinfo/pets/Pet.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. package typeinfo.pets; public class Pet extends Individual { diff --git a/typeinfo/pets/PetCreator.java b/typeinfo/pets/PetCreator.java index 973f24170..5bf0c4339 100644 --- a/typeinfo/pets/PetCreator.java +++ b/typeinfo/pets/PetCreator.java @@ -1,7 +1,7 @@ // typeinfo/pets/PetCreator.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Creates random sequences of Pets package typeinfo.pets; import java.util.*; diff --git a/typeinfo/pets/Pets.java b/typeinfo/pets/Pets.java index 5d84b42fe..1da72b065 100644 --- a/typeinfo/pets/Pets.java +++ b/typeinfo/pets/Pets.java @@ -1,7 +1,7 @@ // typeinfo/pets/Pets.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Facade to produce a default PetCreator package typeinfo.pets; import java.util.*; diff --git a/typeinfo/pets/Pug.java b/typeinfo/pets/Pug.java index 5f249d6f3..c2b46dc84 100644 --- a/typeinfo/pets/Pug.java +++ b/typeinfo/pets/Pug.java @@ -1,7 +1,7 @@ // typeinfo/pets/Pug.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. package typeinfo.pets; public class Pug extends Dog { diff --git a/typeinfo/pets/Rat.java b/typeinfo/pets/Rat.java index 0eada2a03..78dd5b283 100644 --- a/typeinfo/pets/Rat.java +++ b/typeinfo/pets/Rat.java @@ -1,7 +1,7 @@ // typeinfo/pets/Rat.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. package typeinfo.pets; public class Rat extends Rodent { diff --git a/typeinfo/pets/Rodent.java b/typeinfo/pets/Rodent.java index 075bbf224..09e389696 100644 --- a/typeinfo/pets/Rodent.java +++ b/typeinfo/pets/Rodent.java @@ -1,7 +1,7 @@ // typeinfo/pets/Rodent.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. package typeinfo.pets; public class Rodent extends Pet { diff --git a/typeinfo/toys/GenericToyTest.java b/typeinfo/toys/GenericToyTest.java index 943e253db..79e4d33d7 100644 --- a/typeinfo/toys/GenericToyTest.java +++ b/typeinfo/toys/GenericToyTest.java @@ -1,7 +1,7 @@ // typeinfo/toys/GenericToyTest.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Testing class Class // {java typeinfo.toys.GenericToyTest} package typeinfo.toys; diff --git a/typeinfo/toys/ToyTest.java b/typeinfo/toys/ToyTest.java index f3a38cc59..b093ba34a 100644 --- a/typeinfo/toys/ToyTest.java +++ b/typeinfo/toys/ToyTest.java @@ -1,7 +1,7 @@ // typeinfo/toys/ToyTest.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Testing class Class // {java typeinfo.toys.ToyTest} package typeinfo.toys; diff --git a/understandingcollections/AssociativeArray.java b/understandingcollections/AssociativeArray.java index 0801dbe73..9caffdf11 100644 --- a/understandingcollections/AssociativeArray.java +++ b/understandingcollections/AssociativeArray.java @@ -1,7 +1,7 @@ // understandingcollections/AssociativeArray.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Associates keys with values public class AssociativeArray { diff --git a/understandingcollections/Bits.java b/understandingcollections/Bits.java index edcc6d3f8..3cf274b87 100644 --- a/understandingcollections/Bits.java +++ b/understandingcollections/Bits.java @@ -1,7 +1,7 @@ // understandingcollections/Bits.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Demonstration of BitSet import java.util.*; diff --git a/understandingcollections/CanonicalMapping.java b/understandingcollections/CanonicalMapping.java index 3d2b0158f..8923d91fa 100644 --- a/understandingcollections/CanonicalMapping.java +++ b/understandingcollections/CanonicalMapping.java @@ -1,7 +1,7 @@ // understandingcollections/CanonicalMapping.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Demonstrates WeakHashMap import java.util.*; diff --git a/understandingcollections/CollectionMethods.java b/understandingcollections/CollectionMethods.java index c8f97f443..f1eee0366 100644 --- a/understandingcollections/CollectionMethods.java +++ b/understandingcollections/CollectionMethods.java @@ -1,7 +1,7 @@ // understandingcollections/CollectionMethods.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Things you can do with all Collections import java.util.*; import onjava.*; diff --git a/understandingcollections/CountedString.java b/understandingcollections/CountedString.java index 5c58d6e80..a779a2baa 100644 --- a/understandingcollections/CountedString.java +++ b/understandingcollections/CountedString.java @@ -1,7 +1,7 @@ // understandingcollections/CountedString.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Creating a good hashCode() import java.util.*; diff --git a/understandingcollections/Enumerations.java b/understandingcollections/Enumerations.java index d87328218..dd40487ed 100644 --- a/understandingcollections/Enumerations.java +++ b/understandingcollections/Enumerations.java @@ -1,7 +1,7 @@ // understandingcollections/Enumerations.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Java 1.0/1.1 Vector and Enumeration import java.util.*; import onjava.*; diff --git a/understandingcollections/FailFast.java b/understandingcollections/FailFast.java index 94def8c77..f72b1dff6 100644 --- a/understandingcollections/FailFast.java +++ b/understandingcollections/FailFast.java @@ -1,7 +1,7 @@ // understandingcollections/FailFast.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Demonstrates the "fail-fast" behavior import java.util.*; diff --git a/understandingcollections/FillMapTest.java b/understandingcollections/FillMapTest.java index cc964c9d4..08dc9404b 100644 --- a/understandingcollections/FillMapTest.java +++ b/understandingcollections/FillMapTest.java @@ -1,7 +1,7 @@ // understandingcollections/FillMapTest.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.util.*; import java.util.function.*; import java.util.stream.*; diff --git a/understandingcollections/FillingLists.java b/understandingcollections/FillingLists.java index c310f900b..560c49f57 100644 --- a/understandingcollections/FillingLists.java +++ b/understandingcollections/FillingLists.java @@ -1,7 +1,7 @@ // understandingcollections/FillingLists.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // The Collections.fill() + Collections.nCopies() methods import java.util.*; diff --git a/understandingcollections/Groundhog.java b/understandingcollections/Groundhog.java index d7bc30f0a..9bbc43f81 100644 --- a/understandingcollections/Groundhog.java +++ b/understandingcollections/Groundhog.java @@ -1,7 +1,7 @@ // understandingcollections/Groundhog.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Looks plausible, but doesn't work as a HashMap key public class Groundhog { diff --git a/understandingcollections/Groundhog2.java b/understandingcollections/Groundhog2.java index 2be094c2c..7c0d05e60 100644 --- a/understandingcollections/Groundhog2.java +++ b/understandingcollections/Groundhog2.java @@ -1,7 +1,7 @@ // understandingcollections/Groundhog2.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // A class that's used as a key in a HashMap // must override hashCode() and equals() diff --git a/understandingcollections/IndividualTest.java b/understandingcollections/IndividualTest.java index 704233d8e..444de1a91 100644 --- a/understandingcollections/IndividualTest.java +++ b/understandingcollections/IndividualTest.java @@ -1,7 +1,7 @@ // understandingcollections/IndividualTest.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import collections.MapOfList; import typeinfo.pets.*; import java.util.*; diff --git a/understandingcollections/LinkedHashMapDemo.java b/understandingcollections/LinkedHashMapDemo.java index 46a4e6a9f..9691d7710 100644 --- a/understandingcollections/LinkedHashMapDemo.java +++ b/understandingcollections/LinkedHashMapDemo.java @@ -1,7 +1,7 @@ // understandingcollections/LinkedHashMapDemo.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // What you can do with a LinkedHashMap import java.util.*; import onjava.*; diff --git a/understandingcollections/ListOps.java b/understandingcollections/ListOps.java index 03de5f35f..0bcfb001b 100644 --- a/understandingcollections/ListOps.java +++ b/understandingcollections/ListOps.java @@ -1,7 +1,7 @@ // understandingcollections/ListOps.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Things you can do with Lists import java.util.*; import onjava.*; diff --git a/understandingcollections/ListSortSearch.java b/understandingcollections/ListSortSearch.java index 2beb14cbd..69d70d861 100644 --- a/understandingcollections/ListSortSearch.java +++ b/understandingcollections/ListSortSearch.java @@ -1,7 +1,7 @@ // understandingcollections/ListSortSearch.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Sorting and searching Lists with Collections utilities import java.util.*; diff --git a/understandingcollections/MapEntry.java b/understandingcollections/MapEntry.java index 0f87f129f..207ea7c4f 100644 --- a/understandingcollections/MapEntry.java +++ b/understandingcollections/MapEntry.java @@ -1,7 +1,7 @@ // understandingcollections/MapEntry.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // A simple Map.Entry for sample Map implementations import java.util.*; diff --git a/understandingcollections/MapOps.java b/understandingcollections/MapOps.java index 58b711cf9..6ad5ab704 100644 --- a/understandingcollections/MapOps.java +++ b/understandingcollections/MapOps.java @@ -1,7 +1,7 @@ // understandingcollections/MapOps.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Things you can do with Maps import java.util.concurrent.*; import java.util.*; diff --git a/understandingcollections/Prediction.java b/understandingcollections/Prediction.java index 76579d485..72d3b340d 100644 --- a/understandingcollections/Prediction.java +++ b/understandingcollections/Prediction.java @@ -1,7 +1,7 @@ // understandingcollections/Prediction.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Predicting the weather with groundhogs import java.util.*; diff --git a/understandingcollections/QueueBehavior.java b/understandingcollections/QueueBehavior.java index 7179aa4a8..ada68969c 100644 --- a/understandingcollections/QueueBehavior.java +++ b/understandingcollections/QueueBehavior.java @@ -1,7 +1,7 @@ // understandingcollections/QueueBehavior.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Compares the behavior of some of the queues import java.util.concurrent.*; import java.util.*; diff --git a/understandingcollections/ReadOnly.java b/understandingcollections/ReadOnly.java index 74c78746b..275805e38 100644 --- a/understandingcollections/ReadOnly.java +++ b/understandingcollections/ReadOnly.java @@ -1,7 +1,7 @@ // understandingcollections/ReadOnly.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Using the Collections.unmodifiable methods import java.util.*; import onjava.*; diff --git a/understandingcollections/References.java b/understandingcollections/References.java index 6cef4538e..73491ffa8 100644 --- a/understandingcollections/References.java +++ b/understandingcollections/References.java @@ -1,7 +1,7 @@ // understandingcollections/References.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Demonstrates Reference objects import java.lang.ref.*; import java.util.*; diff --git a/understandingcollections/SimpleDeques.java b/understandingcollections/SimpleDeques.java index 7474a4096..fd88a07e0 100644 --- a/understandingcollections/SimpleDeques.java +++ b/understandingcollections/SimpleDeques.java @@ -1,7 +1,7 @@ // understandingcollections/SimpleDeques.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Very basic test of Deques import java.util.concurrent.*; import java.util.*; diff --git a/understandingcollections/SimpleHashMap.java b/understandingcollections/SimpleHashMap.java index 5878e411c..49bffd5ba 100644 --- a/understandingcollections/SimpleHashMap.java +++ b/understandingcollections/SimpleHashMap.java @@ -1,7 +1,7 @@ // understandingcollections/SimpleHashMap.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // A demonstration hashed Map import java.util.*; import onjava.*; diff --git a/understandingcollections/SlowMap.java b/understandingcollections/SlowMap.java index d8978dd9f..1005b2563 100644 --- a/understandingcollections/SlowMap.java +++ b/understandingcollections/SlowMap.java @@ -1,7 +1,7 @@ // understandingcollections/SlowMap.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // A Map implemented with ArrayLists import java.util.*; import onjava.*; diff --git a/understandingcollections/SortedMapDemo.java b/understandingcollections/SortedMapDemo.java index 9b6161b6b..36a5e7fda 100644 --- a/understandingcollections/SortedMapDemo.java +++ b/understandingcollections/SortedMapDemo.java @@ -1,7 +1,7 @@ // understandingcollections/SortedMapDemo.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // What you can do with a TreeMap import java.util.*; import onjava.*; diff --git a/understandingcollections/SortedSetDemo.java b/understandingcollections/SortedSetDemo.java index 5a7a6c742..c86590bda 100644 --- a/understandingcollections/SortedSetDemo.java +++ b/understandingcollections/SortedSetDemo.java @@ -1,7 +1,7 @@ // understandingcollections/SortedSetDemo.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // What you can do with a TreeSet import java.util.*; diff --git a/understandingcollections/SpringDetector.java b/understandingcollections/SpringDetector.java index fc941dd50..486ee232a 100644 --- a/understandingcollections/SpringDetector.java +++ b/understandingcollections/SpringDetector.java @@ -1,7 +1,7 @@ // understandingcollections/SpringDetector.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // What will the weather be? import java.lang.reflect.*; import java.util.*; diff --git a/understandingcollections/SpringDetector2.java b/understandingcollections/SpringDetector2.java index 0f6a026f4..da46945a3 100644 --- a/understandingcollections/SpringDetector2.java +++ b/understandingcollections/SpringDetector2.java @@ -1,7 +1,7 @@ // understandingcollections/SpringDetector2.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // A working key public class SpringDetector2 { diff --git a/understandingcollections/Stacks.java b/understandingcollections/Stacks.java index ca122c602..8c315ac16 100644 --- a/understandingcollections/Stacks.java +++ b/understandingcollections/Stacks.java @@ -1,7 +1,7 @@ // understandingcollections/Stacks.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Demonstration of Stack Class import java.util.*; diff --git a/understandingcollections/StreamFillMaps.java b/understandingcollections/StreamFillMaps.java index db09800dd..7f1f32d78 100644 --- a/understandingcollections/StreamFillMaps.java +++ b/understandingcollections/StreamFillMaps.java @@ -1,7 +1,7 @@ // understandingcollections/StreamFillMaps.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.util.*; import java.util.function.*; import java.util.stream.*; diff --git a/understandingcollections/StringHashCode.java b/understandingcollections/StringHashCode.java index 69367ab13..813e7b951 100644 --- a/understandingcollections/StringHashCode.java +++ b/understandingcollections/StringHashCode.java @@ -1,7 +1,7 @@ // understandingcollections/StringHashCode.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. public class StringHashCode { public static void main(String[] args) { diff --git a/understandingcollections/SuppliersCollectionTest.java b/understandingcollections/SuppliersCollectionTest.java index 0a361a24e..e9c799950 100644 --- a/understandingcollections/SuppliersCollectionTest.java +++ b/understandingcollections/SuppliersCollectionTest.java @@ -1,7 +1,7 @@ // understandingcollections/SuppliersCollectionTest.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.util.*; import java.util.function.*; import java.util.stream.*; diff --git a/understandingcollections/Synchronization.java b/understandingcollections/Synchronization.java index 9b0f3e29e..47bf28248 100644 --- a/understandingcollections/Synchronization.java +++ b/understandingcollections/Synchronization.java @@ -1,7 +1,7 @@ // understandingcollections/Synchronization.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Using the Collections.synchronized methods import java.util.*; diff --git a/understandingcollections/ToDoList.java b/understandingcollections/ToDoList.java index 636420b09..20bdeed67 100644 --- a/understandingcollections/ToDoList.java +++ b/understandingcollections/ToDoList.java @@ -1,7 +1,7 @@ // understandingcollections/ToDoList.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // A more complex use of PriorityQueue import java.util.*; diff --git a/understandingcollections/TypesForSets.java b/understandingcollections/TypesForSets.java index f34e63d06..fd14711c6 100644 --- a/understandingcollections/TypesForSets.java +++ b/understandingcollections/TypesForSets.java @@ -1,7 +1,7 @@ // understandingcollections/TypesForSets.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Methods necessary to put your own type in a Set import java.util.*; import java.util.function.*; diff --git a/understandingcollections/Unsupported.java b/understandingcollections/Unsupported.java index b0ed26001..cfa2ca774 100644 --- a/understandingcollections/Unsupported.java +++ b/understandingcollections/Unsupported.java @@ -1,7 +1,7 @@ // understandingcollections/Unsupported.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Unsupported operations in Java collections import java.util.*; diff --git a/understandingcollections/Utilities.java b/understandingcollections/Utilities.java index c4a15f2c4..869280585 100644 --- a/understandingcollections/Utilities.java +++ b/understandingcollections/Utilities.java @@ -1,7 +1,7 @@ // understandingcollections/Utilities.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Simple demonstrations of the Collections utilities import java.util.*; diff --git a/understandingcollections/jmh/Lists.java b/understandingcollections/jmh/Lists.java index 710a57507..8c1b32a3d 100644 --- a/understandingcollections/jmh/Lists.java +++ b/understandingcollections/jmh/Lists.java @@ -1,7 +1,7 @@ // understandingcollections/jmh/Lists.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Demonstrates performance differences in Lists package understandingcollections.jmh; import org.openjdk.jmh.annotations.*; diff --git a/understandingcollections/jmh/Maps.java b/understandingcollections/jmh/Maps.java index 99130f4bb..79f8d26eb 100644 --- a/understandingcollections/jmh/Maps.java +++ b/understandingcollections/jmh/Maps.java @@ -1,7 +1,7 @@ // understandingcollections/jmh/Maps.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Performance differences between Maps package understandingcollections.jmh; import org.openjdk.jmh.annotations.*; diff --git a/understandingcollections/jmh/Queues.java b/understandingcollections/jmh/Queues.java index 6d0c3617b..704686c4a 100644 --- a/understandingcollections/jmh/Queues.java +++ b/understandingcollections/jmh/Queues.java @@ -1,7 +1,7 @@ // understandingcollections/jmh/Queues.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Demonstrates performance differences in Queues package understandingcollections.jmh; import org.openjdk.jmh.annotations.*; diff --git a/understandingcollections/jmh/Sets.java b/understandingcollections/jmh/Sets.java index 085311e05..f45e34b7e 100644 --- a/understandingcollections/jmh/Sets.java +++ b/understandingcollections/jmh/Sets.java @@ -1,7 +1,7 @@ // understandingcollections/jmh/Sets.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Demonstrates performance differences in Sets package understandingcollections.jmh; import org.openjdk.jmh.annotations.*; diff --git a/validating/Assert1.java b/validating/Assert1.java index ea6d8277f..723405958 100644 --- a/validating/Assert1.java +++ b/validating/Assert1.java @@ -1,9 +1,9 @@ // validating/Assert1.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Non-informative style of assert -// Must run with -ea: +// Must run using -ea flag: // {java -ea Assert1} // {ThrowsException} diff --git a/validating/Assert2.java b/validating/Assert2.java index 64e72e593..3ede3c0eb 100644 --- a/validating/Assert2.java +++ b/validating/Assert2.java @@ -1,7 +1,7 @@ // validating/Assert2.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Assert with an information-expression // {java Assert2 -ea} // {ThrowsException} diff --git a/validating/BadMicroBenchmark.java b/validating/BadMicroBenchmark.java index 2948e4175..4770d1766 100644 --- a/validating/BadMicroBenchmark.java +++ b/validating/BadMicroBenchmark.java @@ -1,7 +1,7 @@ // validating/BadMicroBenchmark.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.util.*; public class BadMicroBenchmark { diff --git a/validating/BadMicroBenchmark2.java b/validating/BadMicroBenchmark2.java index e171f086b..546e9500f 100644 --- a/validating/BadMicroBenchmark2.java +++ b/validating/BadMicroBenchmark2.java @@ -1,7 +1,7 @@ // validating/BadMicroBenchmark2.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Reversing the test order import java.util.*; diff --git a/validating/BadMicroBenchmark3.java b/validating/BadMicroBenchmark3.java index 43e47c86c..a1f6e96e0 100644 --- a/validating/BadMicroBenchmark3.java +++ b/validating/BadMicroBenchmark3.java @@ -1,7 +1,7 @@ // validating/BadMicroBenchmark3.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Relying on a common resource import java.util.*; diff --git a/validating/CountedList.java b/validating/CountedList.java index 83317589f..c6ad92927 100644 --- a/validating/CountedList.java +++ b/validating/CountedList.java @@ -1,7 +1,7 @@ // validating/CountedList.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Keeps track of how many of itself are created. package validating; import java.util.*; diff --git a/validating/GuavaAssertions.java b/validating/GuavaAssertions.java index c16792822..2adf18685 100644 --- a/validating/GuavaAssertions.java +++ b/validating/GuavaAssertions.java @@ -1,7 +1,7 @@ // validating/GuavaAssertions.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Assertions that are always enabled. import com.google.common.base.*; import static com.google.common.base.Verify.*; diff --git a/validating/GuavaPreconditions.java b/validating/GuavaPreconditions.java index bcea196c3..9434371ac 100644 --- a/validating/GuavaPreconditions.java +++ b/validating/GuavaPreconditions.java @@ -1,16 +1,12 @@ // validating/GuavaPreconditions.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Demonstrating Guava Preconditions import java.util.function.*; import static com.google.common.base.Preconditions.*; public class GuavaPreconditions { - void g(String s) { - checkState(s.length() > 6); - System.out.println("Success: " + s); - } static void test(Consumer c, String s) { try { System.out.println(s); @@ -24,50 +20,50 @@ static void test(Consumer c, String s) { } } public static void main(String[] args) { - test((s) -> s = checkNotNull(s), "X"); - test((s) -> s = checkNotNull(s), null); - test((s) -> s = checkNotNull(s, "s was null"), null); - test((s) -> s = checkNotNull( + test(s -> s = checkNotNull(s), "X"); + test(s -> s = checkNotNull(s), null); + test(s -> s = checkNotNull(s, "s was null"), null); + test(s -> s = checkNotNull( s, "s was null, %s %s", "arg2", "arg3"), null); - test((s) -> checkArgument(s == "Fozzie"), "Fozzie"); - test((s) -> checkArgument(s == "Fozzie"), "X"); - test((s) -> checkArgument(s == "Fozzie"), null); - test((s) -> checkArgument( + test(s -> checkArgument(s == "Fozzie"), "Fozzie"); + test(s -> checkArgument(s == "Fozzie"), "X"); + test(s -> checkArgument(s == "Fozzie"), null); + test(s -> checkArgument( s == "Fozzie", "Bear Left!"), null); - test((s) -> checkArgument( + test(s -> checkArgument( s == "Fozzie", "Bear Left! %s Right!", "Frog"), null); - test((s) -> checkState(s.length() > 6), "Mortimer"); - test((s) -> checkState(s.length() > 6), "Mort"); - test((s) -> checkState(s.length() > 6), null); + test(s -> checkState(s.length() > 6), "Mortimer"); + test(s -> checkState(s.length() > 6), "Mort"); + test(s -> checkState(s.length() > 6), null); - test((s) -> + test(s -> checkElementIndex(6, s.length()), "Robert"); - test((s) -> + test(s -> checkElementIndex(6, s.length()), "Bob"); - test((s) -> + test(s -> checkElementIndex(6, s.length()), null); - test((s) -> + test(s -> checkPositionIndex(6, s.length()), "Robert"); - test((s) -> + test(s -> checkPositionIndex(6, s.length()), "Bob"); - test((s) -> + test(s -> checkPositionIndex(6, s.length()), null); - test((s) -> checkPositionIndexes( + test(s -> checkPositionIndexes( 0, 6, s.length()), "Hieronymus"); - test((s) -> checkPositionIndexes( + test(s -> checkPositionIndexes( 0, 10, s.length()), "Hieronymus"); - test((s) -> checkPositionIndexes( + test(s -> checkPositionIndexes( 0, 11, s.length()), "Hieronymus"); - test((s) -> checkPositionIndexes( + test(s -> checkPositionIndexes( -1, 6, s.length()), "Hieronymus"); - test((s) -> checkPositionIndexes( + test(s -> checkPositionIndexes( 7, 6, s.length()), "Hieronymus"); - test((s) -> checkPositionIndexes( + test(s -> checkPositionIndexes( 0, 6, s.length()), null); } } diff --git a/validating/Inverter1.java b/validating/Inverter1.java index 0fd6286c5..542823054 100644 --- a/validating/Inverter1.java +++ b/validating/Inverter1.java @@ -1,7 +1,7 @@ // validating/Inverter1.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. package validating; public class Inverter1 implements StringInverter { diff --git a/validating/Inverter2.java b/validating/Inverter2.java index 6c966e667..6c82b2069 100644 --- a/validating/Inverter2.java +++ b/validating/Inverter2.java @@ -1,7 +1,7 @@ // validating/Inverter2.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. package validating; import static java.lang.Character.*; diff --git a/validating/Inverter3.java b/validating/Inverter3.java index 208fff517..8b857d5d8 100644 --- a/validating/Inverter3.java +++ b/validating/Inverter3.java @@ -1,7 +1,7 @@ // validating/Inverter3.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. package validating; import static java.lang.Character.*; diff --git a/validating/Inverter4.java b/validating/Inverter4.java index ce52b0bb8..b00a4ad2c 100644 --- a/validating/Inverter4.java +++ b/validating/Inverter4.java @@ -1,7 +1,7 @@ // validating/Inverter4.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. package validating; import static java.lang.Character.*; diff --git a/validating/LoaderAssertions.java b/validating/LoaderAssertions.java index 8fe0b377a..696eccfea 100644 --- a/validating/LoaderAssertions.java +++ b/validating/LoaderAssertions.java @@ -1,7 +1,7 @@ // validating/LoaderAssertions.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Using the class loader to enable assertions // {ThrowsException} diff --git a/validating/NonNullConstruction.java b/validating/NonNullConstruction.java new file mode 100644 index 000000000..1b2a37d64 --- /dev/null +++ b/validating/NonNullConstruction.java @@ -0,0 +1,18 @@ +// validating/NonNullConstruction.java +// (c)2016 MindView LLC: see Copyright.txt +// We make no guarantees that this code is fit for any purpose. +// Visit http://OnJava8.com for more book information. +import static com.google.common.base.Preconditions.*; + +public class NonNullConstruction { + private Integer n; + private String s; + NonNullConstruction(Integer n, String s) { + this.n = checkNotNull(n); + this.s = checkNotNull(s); + } + public static void main(String[] args) { + NonNullConstruction nnc = + new NonNullConstruction(3, "Trousers"); + } +} diff --git a/validating/Queue.java b/validating/Queue.java index 01b4db18d..bb260b873 100644 --- a/validating/Queue.java +++ b/validating/Queue.java @@ -1,7 +1,7 @@ // validating/Queue.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Demonstration of Design by Contract (DbC) package validating; import java.util.*; diff --git a/validating/QueueException.java b/validating/QueueException.java index d381d7c8c..ced436b34 100644 --- a/validating/QueueException.java +++ b/validating/QueueException.java @@ -1,7 +1,7 @@ // validating/QueueException.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. package validating; public class QueueException extends RuntimeException { diff --git a/validating/SLF4JLevels.java b/validating/SLF4JLevels.java index e1b2e11d9..c2b66868d 100644 --- a/validating/SLF4JLevels.java +++ b/validating/SLF4JLevels.java @@ -1,7 +1,7 @@ // validating/SLF4JLevels.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import org.slf4j.*; public class SLF4JLevels { diff --git a/validating/SLF4JLogging.java b/validating/SLF4JLogging.java index 2d3b5a05d..9a18dedf2 100644 --- a/validating/SLF4JLogging.java +++ b/validating/SLF4JLogging.java @@ -1,7 +1,7 @@ // validating/SLF4JLogging.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import org.slf4j.*; public class SLF4JLogging { diff --git a/validating/SimpleDebugging.java b/validating/SimpleDebugging.java index 70d9437d5..e17970690 100644 --- a/validating/SimpleDebugging.java +++ b/validating/SimpleDebugging.java @@ -1,8 +1,9 @@ // validating/SimpleDebugging.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // {ThrowsException} + public class SimpleDebugging { private static void foo1() { System.out.println("In foo1"); diff --git a/validating/StringInverter.java b/validating/StringInverter.java index dd2373778..680bab3c6 100644 --- a/validating/StringInverter.java +++ b/validating/StringInverter.java @@ -1,7 +1,7 @@ // validating/StringInverter.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. package validating; interface StringInverter { diff --git a/validating/Time.java b/validating/Time.java index 6b1a8893e..253bdea83 100644 --- a/validating/Time.java +++ b/validating/Time.java @@ -1,7 +1,7 @@ // validating/Time.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. import java.util.concurrent.*; public interface Time { diff --git a/validating/jmh/ParallelSetAll.java b/validating/jmh/ParallelSetAll.java index 8e7c76f2f..4331826a2 100644 --- a/validating/jmh/ParallelSetAll.java +++ b/validating/jmh/ParallelSetAll.java @@ -1,7 +1,7 @@ // validating/jmh/ParallelSetAll.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. package validating.jmh; import java.util.*; import org.openjdk.jmh.annotations.*; diff --git a/validating/jmh/ParallelSetAllBetter.java b/validating/jmh/ParallelSetAllBetter.java new file mode 100644 index 000000000..43facbb4f --- /dev/null +++ b/validating/jmh/ParallelSetAllBetter.java @@ -0,0 +1,27 @@ +// validating/jmh/ParallelSetAllBetter.java +// (c)2016 MindView LLC: see Copyright.txt +// We make no guarantees that this code is fit for any purpose. +// Visit http://OnJava8.com for more book information. +package validating.jmh; +import java.util.*; +import org.openjdk.jmh.annotations.*; + +@State(Scope.Thread) +public class ParallelSetAllBetter { + private long[] la; + @Param({"1", "100", "10000", "1000000", "20000000"}) + int count; + + @Setup + public void setup() { + la = new long[count]; + } + @Benchmark + public void setAll() { + Arrays.setAll(la, n -> n); + } + @Benchmark + public void parallelSetAll() { + Arrays.parallelSetAll(la, n -> n); + } +} diff --git a/validating/tests/CountedListTest.java b/validating/tests/CountedListTest.java index a1000e48d..2c1d54cca 100644 --- a/validating/tests/CountedListTest.java +++ b/validating/tests/CountedListTest.java @@ -1,7 +1,7 @@ // validating/tests/CountedListTest.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. // Simple use of JUnit to test CountedList. package validating; import java.util.*; diff --git a/validating/tests/DynamicStringInverterTests.java b/validating/tests/DynamicStringInverterTests.java index 30ead8d3d..b4d2e5670 100644 --- a/validating/tests/DynamicStringInverterTests.java +++ b/validating/tests/DynamicStringInverterTests.java @@ -1,7 +1,7 @@ // validating/tests/DynamicStringInverterTests.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. package validating; import java.util.*; import java.util.function.*; diff --git a/validating/tests/QueueTest.java b/validating/tests/QueueTest.java index dc63effa7..4e89445e2 100644 --- a/validating/tests/QueueTest.java +++ b/validating/tests/QueueTest.java @@ -1,7 +1,7 @@ // validating/tests/QueueTest.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. package validating; import org.junit.jupiter.api.*; import static org.junit.jupiter.api.Assertions.*; diff --git a/validating/tests/StringInverterTests.java b/validating/tests/StringInverterTests.java index fc5d29acb..759874f31 100644 --- a/validating/tests/StringInverterTests.java +++ b/validating/tests/StringInverterTests.java @@ -1,7 +1,7 @@ // validating/tests/StringInverterTests.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. -// Visit http://mindviewinc.com/Books/OnJava/ for more book information. +// Visit http://OnJava8.com for more book information. package validating; import java.util.*; import java.util.stream.*; From f98d3aa77745f146fd8bfc16a0ae9b03e3b2940b Mon Sep 17 00:00:00 2001 From: Bruce Eckel Date: Sat, 24 Sep 2016 12:47:21 -0600 Subject: [PATCH 122/320] Upgraded jmh --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index e5c51d655..5b2006373 100644 --- a/build.gradle +++ b/build.gradle @@ -211,7 +211,7 @@ subprojects { } jmh { - jmhVersion = '1.13' + jmhVersion = '1.14.1' duplicateClassesStrategy = 'warn' } From 7bffa3f30d04bacea2db1bb31bcd56f67b9a79d6 Mon Sep 17 00:00:00 2001 From: Bruce Eckel Date: Sat, 24 Sep 2016 12:47:36 -0600 Subject: [PATCH 123/320] Upgraded Gradle to 3.1 --- gradle/wrapper/gradle-wrapper.properties | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index b50c952a6..7b6432035 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,5 @@ -#Wed Jul 06 11:17:56 MDT 2016 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-3.0-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-3.1-bin.zip From b28cd2a3f4f9016cbfc12a4b70388e33b2a4875b Mon Sep 17 00:00:00 2001 From: Bruce Eckel Date: Wed, 28 Sep 2016 12:54:00 -0600 Subject: [PATCH 124/320] Improved profiling section --- validating/BadMicroBenchmark.java | 6 +-- validating/BadMicroBenchmark2.java | 25 +++++++--- validating/BadMicroBenchmark3.java | 33 ------------- .../jmh/{ParallelSetAll.java => JMH1.java} | 13 +++-- .../{ParallelSetAllBetter.java => JMH2.java} | 27 +++++++++-- validating/jmh/JMH3.java | 48 +++++++++++++++++++ 6 files changed, 102 insertions(+), 50 deletions(-) delete mode 100644 validating/BadMicroBenchmark3.java rename validating/jmh/{ParallelSetAll.java => JMH1.java} (62%) rename validating/jmh/{ParallelSetAllBetter.java => JMH2.java} (54%) create mode 100644 validating/jmh/JMH3.java diff --git a/validating/BadMicroBenchmark.java b/validating/BadMicroBenchmark.java index 4770d1766..979a577e0 100644 --- a/validating/BadMicroBenchmark.java +++ b/validating/BadMicroBenchmark.java @@ -5,7 +5,7 @@ import java.util.*; public class BadMicroBenchmark { - static final int SIZE = 20_000_000; + static final int SIZE = 250_000_000; public static void main(String[] args) { long[] la = new long[SIZE]; System.out.print("setAll: "); @@ -15,6 +15,6 @@ public static void main(String[] args) { } } /* Output: -setAll: 75 -parallelSetAll: 110 +setAll: 272 +parallelSetAll: 301 */ diff --git a/validating/BadMicroBenchmark2.java b/validating/BadMicroBenchmark2.java index 546e9500f..3372b3383 100644 --- a/validating/BadMicroBenchmark2.java +++ b/validating/BadMicroBenchmark2.java @@ -2,20 +2,33 @@ // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. -// Reversing the test order +// Relying on a common resource import java.util.*; public class BadMicroBenchmark2 { - static final int SIZE = 20_000_000; + // SIZE reduced to make it run faster: + static final int SIZE = 5_000_000; public static void main(String[] args) { long[] la = new long[SIZE]; + Random r = new Random(); System.out.print("parallelSetAll: "); - Time.it(() -> Arrays.parallelSetAll(la, n -> n)); + Time.it(() -> + Arrays.parallelSetAll(la, n -> r.nextLong())); System.out.print("setAll: "); - Time.it(() -> Arrays.setAll(la, n -> n)); + Time.it(() -> + Arrays.setAll(la, n -> r.nextLong())); + SplittableRandom sr = new SplittableRandom(); + System.out.print("parallelSetAll: "); + Time.it(() -> + Arrays.parallelSetAll(la, n -> sr.nextLong())); + System.out.print("setAll: "); + Time.it(() -> + Arrays.setAll(la, n -> sr.nextLong())); } } /* Output: -parallelSetAll: 68 -setAll: 196 +parallelSetAll: 1360 +setAll: 125 +parallelSetAll: 75 +setAll: 17 */ diff --git a/validating/BadMicroBenchmark3.java b/validating/BadMicroBenchmark3.java deleted file mode 100644 index a1f6e96e0..000000000 --- a/validating/BadMicroBenchmark3.java +++ /dev/null @@ -1,33 +0,0 @@ -// validating/BadMicroBenchmark3.java -// (c)2016 MindView LLC: see Copyright.txt -// We make no guarantees that this code is fit for any purpose. -// Visit http://OnJava8.com for more book information. -// Relying on a common resource -import java.util.*; - -public class BadMicroBenchmark3 { - static final int SIZE = 20_000_000; - public static void main(String[] args) { - long[] la = new long[SIZE]; - Random r = new Random(); - System.out.print("parallelSetAll: "); - Time.it(() -> - Arrays.parallelSetAll(la, n -> r.nextLong())); - System.out.print("setAll: "); - Time.it(() -> - Arrays.setAll(la, n -> r.nextLong())); - SplittableRandom sr = new SplittableRandom(); - System.out.print("parallelSetAll: "); - Time.it(() -> - Arrays.parallelSetAll(la, n -> sr.nextLong())); - System.out.print("setAll: "); - Time.it(() -> - Arrays.setAll(la, n -> sr.nextLong())); - } -} -/* Output: -parallelSetAll: 4540 -setAll: 1540 -parallelSetAll: 398 -setAll: 739 -*/ diff --git a/validating/jmh/ParallelSetAll.java b/validating/jmh/JMH1.java similarity index 62% rename from validating/jmh/ParallelSetAll.java rename to validating/jmh/JMH1.java index 4331826a2..007b194ac 100644 --- a/validating/jmh/ParallelSetAll.java +++ b/validating/jmh/JMH1.java @@ -1,17 +1,24 @@ -// validating/jmh/ParallelSetAll.java +// validating/jmh/JMH1.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. package validating.jmh; import java.util.*; import org.openjdk.jmh.annotations.*; +import java.util.concurrent.TimeUnit; @State(Scope.Thread) -public class ParallelSetAll { +@BenchmarkMode(Mode.AverageTime) +@OutputTimeUnit(TimeUnit.MICROSECONDS) +// Increase these three for more accuracy: +@Warmup(iterations = 5) +@Measurement(iterations = 5) +@Fork(1) +public class JMH1 { private long[] la; @Setup public void setup() { - la = new long[20_000_000]; + la = new long[250_000_000]; } @Benchmark public void setAll() { diff --git a/validating/jmh/ParallelSetAllBetter.java b/validating/jmh/JMH2.java similarity index 54% rename from validating/jmh/ParallelSetAllBetter.java rename to validating/jmh/JMH2.java index 43facbb4f..bc3826bdd 100644 --- a/validating/jmh/ParallelSetAllBetter.java +++ b/validating/jmh/JMH2.java @@ -1,20 +1,37 @@ -// validating/jmh/ParallelSetAllBetter.java +// validating/jmh/JMH2.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. package validating.jmh; import java.util.*; import org.openjdk.jmh.annotations.*; +import java.util.concurrent.TimeUnit; @State(Scope.Thread) -public class ParallelSetAllBetter { +@BenchmarkMode(Mode.AverageTime) +@OutputTimeUnit(TimeUnit.MICROSECONDS) +@Warmup(iterations = 5) +@Measurement(iterations = 5) +@Fork(1) +public class JMH2 { private long[] la; - @Param({"1", "100", "10000", "1000000", "20000000"}) - int count; + @Param({ + "1", + "10", + "100", + "1000", + "10000", + "100000", + "1000000", + "10000000", + "100000000", + "250000000" + }) + int size; @Setup public void setup() { - la = new long[count]; + la = new long[size]; } @Benchmark public void setAll() { diff --git a/validating/jmh/JMH3.java b/validating/jmh/JMH3.java new file mode 100644 index 000000000..d4b863c5d --- /dev/null +++ b/validating/jmh/JMH3.java @@ -0,0 +1,48 @@ +// validating/jmh/JMH3.java +// (c)2016 MindView LLC: see Copyright.txt +// We make no guarantees that this code is fit for any purpose. +// Visit http://OnJava8.com for more book information. +package validating.jmh; +import java.util.*; +import org.openjdk.jmh.annotations.*; +import java.util.concurrent.TimeUnit; + +@State(Scope.Thread) +@BenchmarkMode(Mode.AverageTime) +@OutputTimeUnit(TimeUnit.MICROSECONDS) +@Warmup(iterations = 5) +@Measurement(iterations = 5) +@Fork(1) +public class JMH3 { + private long[] la; + @Param({ + "1", + "10", + "100", + "1000", + "10000", + "100000", + "1000000", + "10000000", + "100000000", + "250000000" + }) + int size; + + @Setup + public void setup() { + la = new long[size]; + } + public static long f(long x) { + long divisor = x % 25 + 1; + return Long.divideUnsigned(x, divisor); + } + @Benchmark + public void setAll() { + Arrays.setAll(la, n -> f(n)); + } + @Benchmark + public void parallelSetAll() { + Arrays.parallelSetAll(la, n -> f(n)); + } +} From e8db17143ea276cc29a8a8b5f19fb186bf2cb04a Mon Sep 17 00:00:00 2001 From: Bruce Eckel Date: Sat, 1 Oct 2016 10:45:37 -0600 Subject: [PATCH 125/320] Update JMH to latest version --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 5b2006373..9969de0c0 100644 --- a/build.gradle +++ b/build.gradle @@ -211,7 +211,7 @@ subprojects { } jmh { - jmhVersion = '1.14.1' + jmhVersion = '1.15' duplicateClassesStrategy = 'warn' } From 1bdf1beb30022173f67638ecc77b63437d71e2fd Mon Sep 17 00:00:00 2001 From: Bruce Eckel Date: Sat, 22 Oct 2016 13:35:19 -0700 Subject: [PATCH 126/320] Working draft of understandingcollections/jmh --- understandingcollections/CountedString.java | 2 +- .../SuppliersCollectionTest.java | 2 +- understandingcollections/ToDoList.java | 18 +-- understandingcollections/jmh/Deques.java | 70 ++++++++++++ understandingcollections/jmh/Lists.java | 104 ++++++++++-------- understandingcollections/jmh/Maps.java | 81 +++++++------- understandingcollections/jmh/Queues.java | 81 +++++++------- understandingcollections/jmh/Sets.java | 67 +++++------ validating/jmh/JMH3.java | 4 +- 9 files changed, 258 insertions(+), 171 deletions(-) create mode 100644 understandingcollections/jmh/Deques.java diff --git a/understandingcollections/CountedString.java b/understandingcollections/CountedString.java index a779a2baa..1afa88747 100644 --- a/understandingcollections/CountedString.java +++ b/understandingcollections/CountedString.java @@ -14,7 +14,7 @@ public CountedString(String str) { s = str; created.add(s); // id is the total number of instances - // of this String in use by CountedString: + // of this String used by CountedString: for(String s2 : created) if(s2.equals(s)) id++; diff --git a/understandingcollections/SuppliersCollectionTest.java b/understandingcollections/SuppliersCollectionTest.java index e9c799950..678705904 100644 --- a/understandingcollections/SuppliersCollectionTest.java +++ b/understandingcollections/SuppliersCollectionTest.java @@ -29,7 +29,7 @@ public static void main(String[] args) { Suppliers.fill(list, new Government(), 15); System.out.println(list); - // Or we could just use Streams: + // Or we can use Streams: set = Arrays.stream(Government.foundation).collect( Collectors.toSet()); System.out.println(set); diff --git a/understandingcollections/ToDoList.java b/understandingcollections/ToDoList.java index 20bdeed67..44678b6ee 100644 --- a/understandingcollections/ToDoList.java +++ b/understandingcollections/ToDoList.java @@ -36,15 +36,15 @@ public void add(String td, char pri, int sec) { super.add(new ToDoItem(td, pri, sec)); } public static void main(String[] args) { - ToDoList toDoList = new ToDoList(); - toDoList.add("Empty trash", 'C', 4); - toDoList.add("Feed dog", 'A', 2); - toDoList.add("Feed bird", 'B', 7); - toDoList.add("Mow lawn", 'C', 3); - toDoList.add("Water lawn", 'A', 1); - toDoList.add("Feed cat", 'B', 1); - while(!toDoList.isEmpty()) - System.out.println(toDoList.remove()); + ToDoList toDo = new ToDoList(); + toDo.add("Empty trash", 'C', 4); + toDo.add("Feed dog", 'A', 2); + toDo.add("Feed bird", 'B', 7); + toDo.add("Mow lawn", 'C', 3); + toDo.add("Water lawn", 'A', 1); + toDo.add("Feed cat", 'B', 1); + while(!toDo.isEmpty()) + System.out.println(toDo.remove()); } } /* Output: diff --git a/understandingcollections/jmh/Deques.java b/understandingcollections/jmh/Deques.java new file mode 100644 index 000000000..3f7e33864 --- /dev/null +++ b/understandingcollections/jmh/Deques.java @@ -0,0 +1,70 @@ +// understandingcollections/jmh/Deques.java +// (c)2016 MindView LLC: see Copyright.txt +// We make no guarantees that this code is fit for any purpose. +// Visit http://OnJava8.com for more book information. +// Performance differences between Deques +package understandingcollections.jmh; +import org.openjdk.jmh.annotations.*; +import org.openjdk.jmh.infra.Blackhole; +import java.util.concurrent.TimeUnit; +import java.util.*; + +@State(Scope.Thread) +@OutputTimeUnit(TimeUnit.MICROSECONDS) +@Warmup(iterations = 5, batchSize = 5000) +@Measurement(iterations = 5, batchSize = 5000) +@BenchmarkMode(Mode.SingleShotTime) +@Fork(1) +public class Deques { + private Deque deque; + + @Param({ + "java.util.LinkedList", + "java.util.ArrayDeque", + "java.util.concurrent.ConcurrentLinkedDeque", + "java.util.concurrent.LinkedBlockingDeque", + }) + private String type; + + @Param({ + "1", + "10", + "100", + "1000", + "10000", + "100000" + }) + private int size; + + @Setup + public void setup() { + try { + deque = (Deque) + Class.forName(type).newInstance(); + } catch(Exception e) { + System.err.println( + "-> Cannot create: " + type); + System.exit(99); + } + for(int i = 0; i < size; i++) + deque.add(Integer.toString(i)); + } + @Benchmark + public Deque addFirst() { + deque.addFirst("test"); + return deque; + } + @Benchmark + public Deque addLast() { + deque.addLast("test"); + return deque; + } + @Benchmark + public void pollFirst(Blackhole bh) { + bh.consume(deque.pollFirst()); + } + @Benchmark + public void pollLast(Blackhole bh) { + bh.consume(deque.pollLast()); + } +} diff --git a/understandingcollections/jmh/Lists.java b/understandingcollections/jmh/Lists.java index 8c1b32a3d..6a77df62f 100644 --- a/understandingcollections/jmh/Lists.java +++ b/understandingcollections/jmh/Lists.java @@ -2,80 +2,90 @@ // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. -// Demonstrates performance differences in Lists +// Performance differences between Lists package understandingcollections.jmh; import org.openjdk.jmh.annotations.*; import org.openjdk.jmh.infra.Blackhole; import java.util.*; -import static java.util.concurrent.TimeUnit.*; +import java.util.concurrent.*; @State(Scope.Thread) -@Warmup(iterations = 5, time = 1, timeUnit = SECONDS) -@Measurement(iterations = 5, time = 1, timeUnit = SECONDS) +@OutputTimeUnit(TimeUnit.MICROSECONDS) +@Warmup(iterations = 5, batchSize = 5000) +@Measurement(iterations = 5, batchSize = 5000) +@BenchmarkMode(Mode.SingleShotTime) @Fork(1) -@BenchmarkMode(Mode.AverageTime) -@OutputTimeUnit(MICROSECONDS) public class Lists { - private List list; + private List list; - @Param({"ArrayList", "LinkedList", "Vector"}) + @Param({ + "java.util.ArrayList", + "java.util.Vector", + "java.util.LinkedList", + "java.util.concurrent.CopyOnWriteArrayList" + }) private String type; - private int begin; - private int end; + @Param({ + "1", + "10", + "100", + "1000", + "10000", + "100000" + }) + private int size; @Setup public void setup() { - switch(type) { - case "ArrayList": - list = new ArrayList<>(); - break; - case "LinkedList": - list = new LinkedList<>(); - break; - case "Vector": - list = new Vector<>(); - break; - default: - throw new IllegalStateException("Unknown " + type); - } - begin = 0; - end = 256; - for(int i = begin; i < end; i++) { - list.add(i); + try { + list = (List) + Class.forName(type).newInstance(); + } catch(Exception e) { + System.err.println( + "-> Cannot create: " + type); + System.exit(99); } + for(int i = 0; i < size; i++) + list.add(Integer.toString(i)); } @Benchmark - public void add() { - for(int i = begin; i < end; i++) - list.add(i); + public List add() { + list.add(list.size() / 2, "test"); + return list; } @Benchmark public void get(Blackhole bh) { - for(int i = begin; i < end; i++) - bh.consume(list.get(i)); + bh.consume(list.get(list.size() / 2)); } @Benchmark - public void set() { - for(int i = begin; i < end; i++) - list.set(i, 47); + public List set() { + list.set(list.size() / 2, "test"); + return list; } @Benchmark - public void iteradd() { - int half = list.size() / 2; - ListIterator it = - list.listIterator(half); - for(int i = begin; i < end; i++) - it.add(47); + public List iteradd() { + ListIterator it = + list.listIterator(list.size() / 2); + try { + it.add("test"); + } catch(UnsupportedOperationException e) { + System.err.println( + "-> Unsupported: listIterator.add() in " + + list.getClass().getSimpleName()); + } + return list; } @Benchmark - public void insert() { - for(int i = begin; i < end; i++) - list.add(5, 47); + public List insert() { + list.add(list.size() / 2, "test"); + return list; } @Benchmark - public void remove() { - while(list.size() > 5) - list.remove(5); + public List remove() { + int index = list.size() / 2; + if(index > 0) + list.remove(index); + return list; } } diff --git a/understandingcollections/jmh/Maps.java b/understandingcollections/jmh/Maps.java index 79f8d26eb..d97269039 100644 --- a/understandingcollections/jmh/Maps.java +++ b/understandingcollections/jmh/Maps.java @@ -7,65 +7,60 @@ import org.openjdk.jmh.annotations.*; import org.openjdk.jmh.infra.Blackhole; import java.util.*; -import static java.util.concurrent.TimeUnit.*; +import java.util.concurrent.*; @State(Scope.Thread) -@Warmup(iterations = 5, time = 1, timeUnit = SECONDS) -@Measurement(iterations = 5, time = 1, timeUnit = SECONDS) +@OutputTimeUnit(TimeUnit.MICROSECONDS) +@Warmup(iterations = 5, batchSize = 5000) +@Measurement(iterations = 5, batchSize = 5000) +@BenchmarkMode(Mode.SingleShotTime) @Fork(1) -@BenchmarkMode(Mode.AverageTime) -@OutputTimeUnit(MICROSECONDS) public class Maps { - private Map map; + private Map map; - @Param({"HashMap", "TreeMap", "LinkedHashMap", - "IdentityHashMap", "WeakHashMap", "Hashtable",}) + @Param({ + "java.util.HashMap", + "java.util.Hashtable", + "java.util.TreeMap", + "java.util.LinkedHashMap", + "java.util.IdentityHashMap", + "java.util.WeakHashMap", + "java.util.concurrent.ConcurrentHashMap", + "java.util.concurrent.ConcurrentSkipListMap", + }) private String type; - private int begin; - private int end; + @Param({ + "1", + "10", + "100", + "1000", + "10000", + }) + private int size; @Setup public void setup() { - switch(type) { - case "HashMap": - map = new HashMap<>(); - break; - case "TreeMap": - map = new TreeMap<>(); - break; - case "LinkedHashMap": - map = new LinkedHashMap<>(); - break; - case "IdentityHashMap": - map = new IdentityHashMap<>(); - break; - case "WeakHashMap": - map = new WeakHashMap<>(); - break; - case "Hashtable": - map = new Hashtable<>(); - break; - default: - throw new IllegalStateException("Unknown " + type); - } - begin = 1; - end = 256; - for (int i = begin; i < end; i++) { - map.put(i, i); + try { + map = (Map) + Class.forName(type).newInstance(); + } catch(Exception e) { + System.err.println( + "-> Cannot create: " + type); + System.exit(99); } + for(int i = 0; i < size; i++) + map.put(Integer.toString(i), Integer.toString(i)); } @Benchmark public void get(Blackhole bh) { - for (int i = begin; i < end; i++) { - bh.consume(map.get(i)); - } + String key = Integer.toString(size / 2); + bh.consume(map.get(key)); } @Benchmark - public void put() { - for (int i = begin; i < end; i++) { - map.put(i, i); - } + public Map put() { + map.put("test", "test"); + return map; } @Benchmark public void iterate(Blackhole bh) { diff --git a/understandingcollections/jmh/Queues.java b/understandingcollections/jmh/Queues.java index 704686c4a..efcdc4817 100644 --- a/understandingcollections/jmh/Queues.java +++ b/understandingcollections/jmh/Queues.java @@ -2,61 +2,68 @@ // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. -// Demonstrates performance differences in Queues +// Performance differences between Queues package understandingcollections.jmh; import org.openjdk.jmh.annotations.*; import org.openjdk.jmh.infra.Blackhole; import java.util.*; -import static java.util.concurrent.TimeUnit.*; +import java.util.concurrent.*; @State(Scope.Thread) -@Warmup(iterations = 5, time = 1, timeUnit = SECONDS) -@Measurement(iterations = 5, time = 1, timeUnit = SECONDS) +@OutputTimeUnit(TimeUnit.MICROSECONDS) +@Warmup(iterations = 5, batchSize = 5000) +@Measurement(iterations = 5, batchSize = 5000) +@BenchmarkMode(Mode.SingleShotTime) @Fork(1) -@BenchmarkMode(Mode.AverageTime) -@OutputTimeUnit(MICROSECONDS) public class Queues { - private LinkedList queue; + private Queue queue; - @Param({"LinkedList"}) + @Param({ + "java.util.LinkedList", + "java.util.concurrent.ConcurrentLinkedQueue", + "java.util.concurrent.LinkedBlockingQueue", + "java.util.concurrent.LinkedTransferQueue", + "java.util.concurrent.PriorityBlockingQueue", + "java.util.PriorityQueue", + // Requires a size for construction: + //"java.util.concurrent.ArrayBlockingQueue", + // Won't accept more than one element: + //"java.util.concurrent.SynchronousQueue", + // Requires "Delayed" elements: + //"java.util.concurrent.DelayQueue", + }) private String type; - private int begin; - private int end; + @Param({ + "1", + "10", + "100", + "1000", + "10000", + "100000" + }) + private int size; @Setup public void setup() { - switch(type) { - case "LinkedList": - queue = new LinkedList<>(); - break; - default: - throw new IllegalStateException("Unknown " + type); + try { + queue = (Queue) + Class.forName(type).newInstance(); + } catch(Exception e) { + System.err.println( + "-> Cannot create: " + type); + System.exit(99); } - begin = 1; - end = 256; - for(int i = begin; i < end; i++) { - queue.add(i); - } - } - @Benchmark - public void queue_addFirst() { - for(int i = begin; i < end; i++) - queue.addFirst(47); - } - @Benchmark - public void queue_addLast() { - for(int i = begin; i < end; i++) - queue.addLast(47); + for(int i = 0; i < size; i++) + queue.add(Integer.toString(i)); } @Benchmark - public void queue_removeFirst(Blackhole bh) { - while(queue.size() > 0) - bh.consume(queue.removeFirst()); + public Queue add() { + queue.add("test"); + return queue; } @Benchmark - public void queue_removeLast(Blackhole bh) { - while(queue.size() > 0) - bh.consume(queue.removeLast()); + public void poll(Blackhole bh) { + bh.consume(queue.poll()); } } diff --git a/understandingcollections/jmh/Sets.java b/understandingcollections/jmh/Sets.java index f45e34b7e..a675b23c9 100644 --- a/understandingcollections/jmh/Sets.java +++ b/understandingcollections/jmh/Sets.java @@ -7,56 +7,61 @@ import org.openjdk.jmh.annotations.*; import org.openjdk.jmh.infra.Blackhole; import java.util.*; -import static java.util.concurrent.TimeUnit.*; +import java.util.concurrent.*; @State(Scope.Thread) -@Warmup(iterations = 5, time = 1, timeUnit = SECONDS) -@Measurement(iterations = 5, time = 1, timeUnit = SECONDS) +@OutputTimeUnit(TimeUnit.MICROSECONDS) +@Warmup(iterations = 5, batchSize = 5000) +@Measurement(iterations = 5, batchSize = 5000) +@BenchmarkMode(Mode.SingleShotTime) @Fork(1) -@BenchmarkMode(Mode.AverageTime) -@OutputTimeUnit(MICROSECONDS) public class Sets { - private Set set; + private Set set; - @Param({"HashSet", "TreeSet", "LinkedHashSet"}) + @Param({ + "java.util.HashSet", + "java.util.TreeSet", + "java.util.LinkedHashSet", + "java.util.concurrent.ConcurrentSkipListSet", + "java.util.concurrent.CopyOnWriteArraySet", + }) private String type; - private int begin; - private int end; + @Param({ + "1", + "10", + "100", + "1000", + "10000", + }) + private int size; @Setup public void setup() { - switch(type) { - case "HashSet": - set = new HashSet<>(); - break; - case "TreeSet": - set = new TreeSet<>(); - break; - case "LinkedHashSet": - set = new LinkedHashSet<>(); - break; - default: - throw new IllegalStateException("Unknown " + type); + try { + set = (Set) + Class.forName(type).newInstance(); + } catch(Exception e) { + System.err.println( + "-> Cannot create: " + type); + System.exit(99); } - begin = 1; - end = 256; - for (int i = begin; i < end; i++) - set.add(i); + for(int i = 0; i < size; i++) + set.add(Integer.toString(i)); } @Benchmark - public void add() { - for(int i = begin; i < end; i++) - set.add(i); + public Set add() { + set.add("test"); + return set; } @Benchmark public void contains(Blackhole bh) { - for(int i = begin; i < end; i++) - bh.consume(set.contains(i)); + String key = Integer.toString(size/2); + bh.consume(set.contains(key)); } @Benchmark public void iterate(Blackhole bh) { - Iterator it = set.iterator(); + Iterator it = set.iterator(); while(it.hasNext()) bh.consume(it.next()); } diff --git a/validating/jmh/JMH3.java b/validating/jmh/JMH3.java index d4b863c5d..58471bcca 100644 --- a/validating/jmh/JMH3.java +++ b/validating/jmh/JMH3.java @@ -34,8 +34,8 @@ public void setup() { la = new long[size]; } public static long f(long x) { - long divisor = x % 25 + 1; - return Long.divideUnsigned(x, divisor); + long quadratic = 42 * x * x + 19 * x + 47; + return Long.divideUnsigned(quadratic, x + 1); } @Benchmark public void setAll() { From e472e322b27d668dd1b3f00935b20096c74bb045 Mon Sep 17 00:00:00 2001 From: Bruce Eckel Date: Tue, 25 Oct 2016 09:03:51 -0700 Subject: [PATCH 127/320] Set failOnError=true as per Alexsey --- build.gradle | 3 +++ 1 file changed, 3 insertions(+) diff --git a/build.gradle b/build.gradle index 9969de0c0..4c912d184 100644 --- a/build.gradle +++ b/build.gradle @@ -213,6 +213,9 @@ subprojects { jmh { jmhVersion = '1.15' duplicateClassesStrategy = 'warn' + failOnError = true + // See https://github.com/melix/jmh-gradle-plugin + // for other options } List createdTasks = [] From dcdacb1c3f5d3071ea05c928e8fee1bd8d18c6b9 Mon Sep 17 00:00:00 2001 From: Bruce Eckel Date: Tue, 25 Oct 2016 10:19:31 -0700 Subject: [PATCH 128/320] Trying to add -Xlint:unchecked --- build.gradle | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/build.gradle b/build.gradle index 4c912d184..044448107 100644 --- a/build.gradle +++ b/build.gradle @@ -129,6 +129,10 @@ ext { junitJupiterVersion = '5.0.0-M2' } +compileJava { + options.compilerArgs << "-Xlint:unchecked" << "-Xlint:deprecation" +} + subprojects { apply plugin: 'com.github.johnrengelman.shadow' apply plugin: 'me.champeau.gradle.jmh' From d8a46db6f3c409f5cad5433a8ccdd6b7b853ff06 Mon Sep 17 00:00:00 2001 From: Bruce Eckel Date: Tue, 1 Nov 2016 11:43:06 -0700 Subject: [PATCH 129/320] Small changes re Ben --- build.gradle | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/build.gradle b/build.gradle index 044448107..38ca841fc 100644 --- a/build.gradle +++ b/build.gradle @@ -1,8 +1,6 @@ buildscript { repositories { - mavenLocal() jcenter() - mavenCentral() } dependencies { classpath 'org.junit.platform:junit-platform-gradle-plugin:1.0.0-M2' @@ -16,7 +14,6 @@ plugins { import org.gradle.internal.jvm.Jvm import org.apache.tools.ant.util.TeeOutputStream -boolean debug = false class Tags { Boolean hasMainMethod = false @@ -158,7 +155,8 @@ subprojects { // compile group: 'org.slf4j', name: 'slf4j-jdk14', version: '1.7.5' // JUnit testing: - compile "org.junit.jupiter:junit-jupiter-api:${junitJupiterVersion}" + // Commented as per Ben + // compile "org.junit.jupiter:junit-jupiter-api:${junitJupiterVersion}" testCompile "org.junit.jupiter:junit-jupiter-api:${junitJupiterVersion}" testRuntime "org.junit.jupiter:junit-jupiter-engine:${junitJupiterVersion}" } @@ -228,7 +226,6 @@ subprojects { if (file.name.endsWith('.java')) { Tags tags = new Tags(file) - if(debug && tags.hasTags()) println tags // Exclude java sources that will not compile if (tags.compileTimeError) { @@ -377,7 +374,8 @@ configure(subprojects - project(':onjava')) { compile project(':onjava') compile group: 'com.google.guava', name: 'guava', version: '19.0' compile "org.openjdk.jmh:jmh-core:${jmh.jmhVersion}" - compile 'org.junit.platform:junit-platform-gradle-plugin:1.0.0-M2' + // commented as per Ben: + // compile 'org.junit.platform:junit-platform-gradle-plugin:1.0.0-M2' } } From 37c5413501402d8eb0e43a6a013157c113eeb591 Mon Sep 17 00:00:00 2001 From: Bruce Eckel Date: Tue, 1 Nov 2016 11:43:22 -0700 Subject: [PATCH 130/320] chapter progress --- onjava/Countries.java | 235 +++++++++++++------- onjava/HTMLColors.java | 234 +++++++++++++++++++ understandingcollections/FunctionalMap.java | 38 ++++ understandingcollections/HTMLColorTest.java | 103 +++++++++ understandingcollections/ListOps.java | 59 ++--- understandingcollections/NavMap.java | 96 ++++++++ understandingcollections/SetOrder.java | 92 ++++++++ understandingcollections/jmh/Deques.java | 21 +- understandingcollections/jmh/Lists.java | 52 ++--- understandingcollections/jmh/Maps.java | 24 +- understandingcollections/jmh/Queues.java | 17 +- understandingcollections/jmh/Sets.java | 20 +- 12 files changed, 797 insertions(+), 194 deletions(-) create mode 100644 onjava/HTMLColors.java create mode 100644 understandingcollections/FunctionalMap.java create mode 100644 understandingcollections/HTMLColorTest.java create mode 100644 understandingcollections/NavMap.java create mode 100644 understandingcollections/SetOrder.java diff --git a/onjava/Countries.java b/onjava/Countries.java index 6cc8d6461..9551a1244 100644 --- a/onjava/Countries.java +++ b/onjava/Countries.java @@ -10,129 +10,206 @@ public class Countries { public static final String[][] DATA = { // Africa - {"ALGERIA","Algiers"}, {"ANGOLA","Luanda"}, - {"BENIN","Porto-Novo"}, {"BOTSWANA","Gaberone"}, + {"ALGERIA","Algiers"}, + {"ANGOLA","Luanda"}, + {"BENIN","Porto-Novo"}, + {"BOTSWANA","Gaberone"}, {"BURKINA FASO","Ouagadougou"}, {"BURUNDI","Bujumbura"}, - {"CAMEROON","Yaounde"}, {"CAPE VERDE","Praia"}, + {"CAMEROON","Yaounde"}, + {"CAPE VERDE","Praia"}, {"CENTRAL AFRICAN REPUBLIC","Bangui"}, - {"CHAD","N'djamena"}, {"COMOROS","Moroni"}, - {"CONGO","Brazzaville"}, {"DJIBOUTI","Dijibouti"}, - {"EGYPT","Cairo"}, {"EQUATORIAL GUINEA","Malabo"}, - {"ERITREA","Asmara"}, {"ETHIOPIA","Addis Ababa"}, - {"GABON","Libreville"}, {"THE GAMBIA","Banjul"}, - {"GHANA","Accra"}, {"GUINEA","Conakry"}, + {"CHAD","N'djamena"}, + {"COMOROS","Moroni"}, + {"CONGO","Brazzaville"}, + {"DJIBOUTI","Dijibouti"}, + {"EGYPT","Cairo"}, + {"EQUATORIAL GUINEA","Malabo"}, + {"ERITREA","Asmara"}, + {"ETHIOPIA","Addis Ababa"}, + {"GABON","Libreville"}, + {"THE GAMBIA","Banjul"}, + {"GHANA","Accra"}, + {"GUINEA","Conakry"}, {"BISSAU","Bissau"}, {"COTE D'IVOIR (IVORY COAST)","Yamoussoukro"}, - {"KENYA","Nairobi"}, {"LESOTHO","Maseru"}, - {"LIBERIA","Monrovia"}, {"LIBYA","Tripoli"}, - {"MADAGASCAR","Antananarivo"}, {"MALAWI","Lilongwe"}, - {"MALI","Bamako"}, {"MAURITANIA","Nouakchott"}, - {"MAURITIUS","Port Louis"}, {"MOROCCO","Rabat"}, - {"MOZAMBIQUE","Maputo"}, {"NAMIBIA","Windhoek"}, - {"NIGER","Niamey"}, {"NIGERIA","Abuja"}, + {"KENYA","Nairobi"}, + {"LESOTHO","Maseru"}, + {"LIBERIA","Monrovia"}, + {"LIBYA","Tripoli"}, + {"MADAGASCAR","Antananarivo"}, + {"MALAWI","Lilongwe"}, + {"MALI","Bamako"}, + {"MAURITANIA","Nouakchott"}, + {"MAURITIUS","Port Louis"}, + {"MOROCCO","Rabat"}, + {"MOZAMBIQUE","Maputo"}, + {"NAMIBIA","Windhoek"}, + {"NIGER","Niamey"}, + {"NIGERIA","Abuja"}, {"RWANDA","Kigali"}, {"SAO TOME E PRINCIPE","Sao Tome"}, - {"SENEGAL","Dakar"}, {"SEYCHELLES","Victoria"}, - {"SIERRA LEONE","Freetown"}, {"SOMALIA","Mogadishu"}, + {"SENEGAL","Dakar"}, + {"SEYCHELLES","Victoria"}, + {"SIERRA LEONE","Freetown"}, + {"SOMALIA","Mogadishu"}, {"SOUTH AFRICA","Pretoria/Cape Town"}, {"SUDAN","Khartoum"}, - {"SWAZILAND","Mbabane"}, {"TANZANIA","Dodoma"}, - {"TOGO","Lome"}, {"TUNISIA","Tunis"}, + {"SWAZILAND","Mbabane"}, + {"TANZANIA","Dodoma"}, + {"TOGO","Lome"}, + {"TUNISIA","Tunis"}, {"UGANDA","Kampala"}, {"DEMOCRATIC REPUBLIC OF THE CONGO (ZAIRE)", "Kinshasa"}, - {"ZAMBIA","Lusaka"}, {"ZIMBABWE","Harare"}, + {"ZAMBIA","Lusaka"}, + {"ZIMBABWE","Harare"}, // Asia - {"AFGHANISTAN","Kabul"}, {"BAHRAIN","Manama"}, - {"BANGLADESH","Dhaka"}, {"BHUTAN","Thimphu"}, + {"AFGHANISTAN","Kabul"}, + {"BAHRAIN","Manama"}, + {"BANGLADESH","Dhaka"}, + {"BHUTAN","Thimphu"}, {"BRUNEI","Bandar Seri Begawan"}, {"CAMBODIA","Phnom Penh"}, - {"CHINA","Beijing"}, {"CYPRUS","Nicosia"}, - {"INDIA","New Delhi"}, {"INDONESIA","Jakarta"}, - {"IRAN","Tehran"}, {"IRAQ","Baghdad"}, - {"ISRAEL","Jerusalem"}, {"JAPAN","Tokyo"}, - {"JORDAN","Amman"}, {"KUWAIT","Kuwait City"}, - {"LAOS","Vientiane"}, {"LEBANON","Beirut"}, - {"MALAYSIA","Kuala Lumpur"}, {"THE MALDIVES","Male"}, + {"CHINA","Beijing"}, + {"CYPRUS","Nicosia"}, + {"INDIA","New Delhi"}, + {"INDONESIA","Jakarta"}, + {"IRAN","Tehran"}, + {"IRAQ","Baghdad"}, + {"ISRAEL","Jerusalem"}, + {"JAPAN","Tokyo"}, + {"JORDAN","Amman"}, + {"KUWAIT","Kuwait City"}, + {"LAOS","Vientiane"}, + {"LEBANON","Beirut"}, + {"MALAYSIA","Kuala Lumpur"}, + {"THE MALDIVES","Male"}, {"MONGOLIA","Ulan Bator"}, {"MYANMAR (BURMA)","Rangoon"}, - {"NEPAL","Katmandu"}, {"NORTH KOREA","P'yongyang"}, - {"OMAN","Muscat"}, {"PAKISTAN","Islamabad"}, - {"PHILIPPINES","Manila"}, {"QATAR","Doha"}, - {"SAUDI ARABIA","Riyadh"}, {"SINGAPORE","Singapore"}, - {"SOUTH KOREA","Seoul"}, {"SRI LANKA","Colombo"}, + {"NEPAL","Katmandu"}, + {"NORTH KOREA","P'yongyang"}, + {"OMAN","Muscat"}, + {"PAKISTAN","Islamabad"}, + {"PHILIPPINES","Manila"}, + {"QATAR","Doha"}, + {"SAUDI ARABIA","Riyadh"}, + {"SINGAPORE","Singapore"}, + {"SOUTH KOREA","Seoul"}, + {"SRI LANKA","Colombo"}, {"SYRIA","Damascus"}, {"TAIWAN (REPUBLIC OF CHINA)","Taipei"}, - {"THAILAND","Bangkok"}, {"TURKEY","Ankara"}, + {"THAILAND","Bangkok"}, + {"TURKEY","Ankara"}, {"UNITED ARAB EMIRATES","Abu Dhabi"}, - {"VIETNAM","Hanoi"}, {"YEMEN","Sana'a"}, + {"VIETNAM","Hanoi"}, + {"YEMEN","Sana'a"}, // Australia and Oceania - {"AUSTRALIA","Canberra"}, {"FIJI","Suva"}, + {"AUSTRALIA","Canberra"}, + {"FIJI","Suva"}, {"KIRIBATI","Bairiki"}, {"MARSHALL ISLANDS","Dalap-Uliga-Darrit"}, - {"MICRONESIA","Palikir"}, {"NAURU","Yaren"}, - {"NEW ZEALAND","Wellington"}, {"PALAU","Koror"}, + {"MICRONESIA","Palikir"}, + {"NAURU","Yaren"}, + {"NEW ZEALAND","Wellington"}, + {"PALAU","Koror"}, {"PAPUA NEW GUINEA","Port Moresby"}, - {"SOLOMON ISLANDS","Honaira"}, {"TONGA","Nuku'alofa"}, - {"TUVALU","Fongafale"}, {"VANUATU","< Port-Vila"}, + {"SOLOMON ISLANDS","Honaira"}, + {"TONGA","Nuku'alofa"}, + {"TUVALU","Fongafale"}, + {"VANUATU","Port Vila"}, {"WESTERN SAMOA","Apia"}, // Eastern Europe and former USSR - {"ARMENIA","Yerevan"}, {"AZERBAIJAN","Baku"}, + {"ARMENIA","Yerevan"}, + {"AZERBAIJAN","Baku"}, {"BELARUS (BYELORUSSIA)","Minsk"}, - {"BULGARIA","Sofia"}, {"GEORGIA","Tbilisi"}, - {"KAZAKSTAN","Almaty"}, {"KYRGYZSTAN","Alma-Ata"}, - {"MOLDOVA","Chisinau"}, {"RUSSIA","Moscow"}, + {"BULGARIA","Sofia"}, + {"GEORGIA","Tbilisi"}, + {"KAZAKSTAN","Almaty"}, + {"KYRGYZSTAN","Alma-Ata"}, + {"MOLDOVA","Chisinau"}, + {"RUSSIA","Moscow"}, {"TAJIKISTAN","Dushanbe"}, {"TURKMENISTAN","Ashkabad"}, - {"UKRAINE","Kyiv"}, {"UZBEKISTAN","Tashkent"}, + {"UKRAINE","Kyiv"}, + {"UZBEKISTAN","Tashkent"}, // Europe - {"ALBANIA","Tirana"}, {"ANDORRA","Andorra la Vella"}, - {"AUSTRIA","Vienna"}, {"BELGIUM","Brussels"}, - {"BOSNIA","---"}, {"HERZEGOVINA","Sarajevo"}, - {"CROATIA","Zagreb"}, {"CZECH REPUBLIC","Prague"}, - {"DENMARK","Copenhagen"}, {"ESTONIA","Tallinn"}, - {"FINLAND","Helsinki"}, {"FRANCE","Paris"}, - {"GERMANY","Berlin"}, {"GREECE","Athens"}, - {"HUNGARY","Budapest"}, {"ICELAND","Reykjavik"}, - {"IRELAND","Dublin"}, {"ITALY","Rome"}, - {"LATVIA","Riga"}, {"LIECHTENSTEIN","Vaduz"}, - {"LITHUANIA","Vilnius"}, {"LUXEMBOURG","Luxembourg"}, - {"MACEDONIA","Skopje"}, {"MALTA","Valletta"}, - {"MONACO","Monaco"}, {"MONTENEGRO","Podgorica"}, - {"THE NETHERLANDS","Amsterdam"}, {"NORWAY","Oslo"}, - {"POLAND","Warsaw"}, {"PORTUGAL","Lisbon"}, - {"ROMANIA","Bucharest"}, {"SAN MARINO","San Marino"}, - {"SERBIA","Belgrade"}, {"SLOVAKIA","Bratislava"}, - {"SLOVENIA","Ljuijana"}, {"SPAIN","Madrid"}, - {"SWEDEN","Stockholm"}, {"SWITZERLAND","Berne"}, - {"UNITED KINGDOM","London"}, {"VATICAN CITY","---"}, + {"ALBANIA","Tirana"}, + {"ANDORRA","Andorra la Vella"}, + {"AUSTRIA","Vienna"}, + {"BELGIUM","Brussels"}, + {"BOSNIA-HERZEGOVINA","Sarajevo"}, + {"CROATIA","Zagreb"}, + {"CZECH REPUBLIC","Prague"}, + {"DENMARK","Copenhagen"}, + {"ESTONIA","Tallinn"}, + {"FINLAND","Helsinki"}, + {"FRANCE","Paris"}, + {"GERMANY","Berlin"}, + {"GREECE","Athens"}, + {"HUNGARY","Budapest"}, + {"ICELAND","Reykjavik"}, + {"IRELAND","Dublin"}, + {"ITALY","Rome"}, + {"LATVIA","Riga"}, + {"LIECHTENSTEIN","Vaduz"}, + {"LITHUANIA","Vilnius"}, + {"LUXEMBOURG","Luxembourg"}, + {"MACEDONIA","Skopje"}, + {"MALTA","Valletta"}, + {"MONACO","Monaco"}, + {"MONTENEGRO","Podgorica"}, + {"THE NETHERLANDS","Amsterdam"}, + {"NORWAY","Oslo"}, + {"POLAND","Warsaw"}, + {"PORTUGAL","Lisbon"}, + {"ROMANIA","Bucharest"}, + {"SAN MARINO","San Marino"}, + {"SERBIA","Belgrade"}, + {"SLOVAKIA","Bratislava"}, + {"SLOVENIA","Ljuijana"}, + {"SPAIN","Madrid"}, + {"SWEDEN","Stockholm"}, + {"SWITZERLAND","Berne"}, + {"UNITED KINGDOM","London"}, + {"VATICAN CITY","Vatican City"}, // North and Central America {"ANTIGUA AND BARBUDA","Saint John's"}, {"BAHAMAS","Nassau"}, - {"BARBADOS","Bridgetown"}, {"BELIZE","Belmopan"}, - {"CANADA","Ottawa"}, {"COSTA RICA","San Jose"}, - {"CUBA","Havana"}, {"DOMINICA","Roseau"}, + {"BARBADOS","Bridgetown"}, + {"BELIZE","Belmopan"}, + {"CANADA","Ottawa"}, + {"COSTA RICA","San Jose"}, + {"CUBA","Havana"}, + {"DOMINICA","Roseau"}, {"DOMINICAN REPUBLIC","Santo Domingo"}, {"EL SALVADOR","San Salvador"}, {"GRENADA","Saint George's"}, {"GUATEMALA","Guatemala City"}, {"HAITI","Port-au-Prince"}, - {"HONDURAS","Tegucigalpa"}, {"JAMAICA","Kingston"}, - {"MEXICO","Mexico City"}, {"NICARAGUA","Managua"}, - {"PANAMA","Panama City"}, {"ST. KITTS","---"}, - {"NEVIS","Basseterre"}, {"ST. LUCIA","Castries"}, + {"HONDURAS","Tegucigalpa"}, + {"JAMAICA","Kingston"}, + {"MEXICO","Mexico City"}, + {"NICARAGUA","Managua"}, + {"PANAMA","Panama City"}, + {"ST. KITTS AND NEVIS","Basseterre"}, + {"ST. LUCIA","Castries"}, {"ST. VINCENT AND THE GRENADINES","Kingstown"}, {"UNITED STATES OF AMERICA","Washington, D.C."}, // South America {"ARGENTINA","Buenos Aires"}, {"BOLIVIA","Sucre (legal)/La Paz(administrative)"}, - {"BRAZIL","Brasilia"}, {"CHILE","Santiago"}, - {"COLOMBIA","Bogota"}, {"ECUADOR","Quito"}, - {"GUYANA","Georgetown"}, {"PARAGUAY","Asuncion"}, - {"PERU","Lima"}, {"SURINAME","Paramaribo"}, + {"BRAZIL","Brasilia"}, + {"CHILE","Santiago"}, + {"COLOMBIA","Bogota"}, + {"ECUADOR","Quito"}, + {"GUYANA","Georgetown"}, + {"PARAGUAY","Asuncion"}, + {"PERU","Lima"}, + {"SURINAME","Paramaribo"}, {"TRINIDAD AND TOBAGO","Port of Spain"}, - {"URUGUAY","Montevideo"}, {"VENEZUELA","Caracas"}, + {"URUGUAY","Montevideo"}, + {"VENEZUELA","Caracas"}, }; // Use AbstractMap by implementing entrySet() private static class FlyweightMap diff --git a/onjava/HTMLColors.java b/onjava/HTMLColors.java new file mode 100644 index 000000000..7ba46d593 --- /dev/null +++ b/onjava/HTMLColors.java @@ -0,0 +1,234 @@ +// onjava/HTMLColors.java +// (c)2016 MindView LLC: see Copyright.txt +// We make no guarantees that this code is fit for any purpose. +// Visit http://OnJava8.com for more book information. +// Sample data for collection examples +package onjava; +import java.util.*; +import java.util.stream.*; +import java.util.concurrent.*; + +public class HTMLColors { + public static final Object[][] ARRAY = { + { 0xF0F8FF, "AliceBlue" }, + { 0xFAEBD7, "AntiqueWhite" }, + { 0x7FFFD4, "Aquamarine" }, + { 0xF0FFFF, "Azure" }, + { 0xF5F5DC, "Beige" }, + { 0xFFE4C4, "Bisque" }, + { 0x000000, "Black" }, + { 0xFFEBCD, "BlanchedAlmond" }, + { 0x0000FF, "Blue" }, + { 0x8A2BE2, "BlueViolet" }, + { 0xA52A2A, "Brown" }, + { 0xDEB887, "BurlyWood" }, + { 0x5F9EA0, "CadetBlue" }, + { 0x7FFF00, "Chartreuse" }, + { 0xD2691E, "Chocolate" }, + { 0xFF7F50, "Coral" }, + { 0x6495ED, "CornflowerBlue" }, + { 0xFFF8DC, "Cornsilk" }, + { 0xDC143C, "Crimson" }, + { 0x00FFFF, "Cyan" }, + { 0x00008B, "DarkBlue" }, + { 0x008B8B, "DarkCyan" }, + { 0xB8860B, "DarkGoldenRod" }, + { 0xA9A9A9, "DarkGray" }, + { 0x006400, "DarkGreen" }, + { 0xBDB76B, "DarkKhaki" }, + { 0x8B008B, "DarkMagenta" }, + { 0x556B2F, "DarkOliveGreen" }, + { 0xFF8C00, "DarkOrange" }, + { 0x9932CC, "DarkOrchid" }, + { 0x8B0000, "DarkRed" }, + { 0xE9967A, "DarkSalmon" }, + { 0x8FBC8F, "DarkSeaGreen" }, + { 0x483D8B, "DarkSlateBlue" }, + { 0x2F4F4F, "DarkSlateGray" }, + { 0x00CED1, "DarkTurquoise" }, + { 0x9400D3, "DarkViolet" }, + { 0xFF1493, "DeepPink" }, + { 0x00BFFF, "DeepSkyBlue" }, + { 0x696969, "DimGray" }, + { 0x1E90FF, "DodgerBlue" }, + { 0xB22222, "FireBrick" }, + { 0xFFFAF0, "FloralWhite" }, + { 0x228B22, "ForestGreen" }, + { 0xDCDCDC, "Gainsboro" }, + { 0xF8F8FF, "GhostWhite" }, + { 0xFFD700, "Gold" }, + { 0xDAA520, "GoldenRod" }, + { 0x808080, "Gray" }, + { 0x008000, "Green" }, + { 0xADFF2F, "GreenYellow" }, + { 0xF0FFF0, "HoneyDew" }, + { 0xFF69B4, "HotPink" }, + { 0xCD5C5C, "IndianRed" }, + { 0x4B0082, "Indigo" }, + { 0xFFFFF0, "Ivory" }, + { 0xF0E68C, "Khaki" }, + { 0xE6E6FA, "Lavender" }, + { 0xFFF0F5, "LavenderBlush" }, + { 0x7CFC00, "LawnGreen" }, + { 0xFFFACD, "LemonChiffon" }, + { 0xADD8E6, "LightBlue" }, + { 0xF08080, "LightCoral" }, + { 0xE0FFFF, "LightCyan" }, + { 0xFAFAD2, "LightGoldenRodYellow" }, + { 0xD3D3D3, "LightGray" }, + { 0x90EE90, "LightGreen" }, + { 0xFFB6C1, "LightPink" }, + { 0xFFA07A, "LightSalmon" }, + { 0x20B2AA, "LightSeaGreen" }, + { 0x87CEFA, "LightSkyBlue" }, + { 0x778899, "LightSlateGray" }, + { 0xB0C4DE, "LightSteelBlue" }, + { 0xFFFFE0, "LightYellow" }, + { 0x00FF00, "Lime" }, + { 0x32CD32, "LimeGreen" }, + { 0xFAF0E6, "Linen" }, + { 0xFF00FF, "Magenta" }, + { 0x800000, "Maroon" }, + { 0x66CDAA, "MediumAquaMarine" }, + { 0x0000CD, "MediumBlue" }, + { 0xBA55D3, "MediumOrchid" }, + { 0x9370DB, "MediumPurple" }, + { 0x3CB371, "MediumSeaGreen" }, + { 0x7B68EE, "MediumSlateBlue" }, + { 0x00FA9A, "MediumSpringGreen" }, + { 0x48D1CC, "MediumTurquoise" }, + { 0xC71585, "MediumVioletRed" }, + { 0x191970, "MidnightBlue" }, + { 0xF5FFFA, "MintCream" }, + { 0xFFE4E1, "MistyRose" }, + { 0xFFE4B5, "Moccasin" }, + { 0xFFDEAD, "NavajoWhite" }, + { 0x000080, "Navy" }, + { 0xFDF5E6, "OldLace" }, + { 0x808000, "Olive" }, + { 0x6B8E23, "OliveDrab" }, + { 0xFFA500, "Orange" }, + { 0xFF4500, "OrangeRed" }, + { 0xDA70D6, "Orchid" }, + { 0xEEE8AA, "PaleGoldenRod" }, + { 0x98FB98, "PaleGreen" }, + { 0xAFEEEE, "PaleTurquoise" }, + { 0xDB7093, "PaleVioletRed" }, + { 0xFFEFD5, "PapayaWhip" }, + { 0xFFDAB9, "PeachPuff" }, + { 0xCD853F, "Peru" }, + { 0xFFC0CB, "Pink" }, + { 0xDDA0DD, "Plum" }, + { 0xB0E0E6, "PowderBlue" }, + { 0x800080, "Purple" }, + { 0xFF0000, "Red" }, + { 0xBC8F8F, "RosyBrown" }, + { 0x4169E1, "RoyalBlue" }, + { 0x8B4513, "SaddleBrown" }, + { 0xFA8072, "Salmon" }, + { 0xF4A460, "SandyBrown" }, + { 0x2E8B57, "SeaGreen" }, + { 0xFFF5EE, "SeaShell" }, + { 0xA0522D, "Sienna" }, + { 0xC0C0C0, "Silver" }, + { 0x87CEEB, "SkyBlue" }, + { 0x6A5ACD, "SlateBlue" }, + { 0x708090, "SlateGray" }, + { 0xFFFAFA, "Snow" }, + { 0x00FF7F, "SpringGreen" }, + { 0x4682B4, "SteelBlue" }, + { 0xD2B48C, "Tan" }, + { 0x008080, "Teal" }, + { 0xD8BFD8, "Thistle" }, + { 0xFF6347, "Tomato" }, + { 0x40E0D0, "Turquoise" }, + { 0xEE82EE, "Violet" }, + { 0xF5DEB3, "Wheat" }, + { 0xFFFFFF, "White" }, + { 0xF5F5F5, "WhiteSmoke" }, + { 0xFFFF00, "Yellow" }, + { 0x9ACD32, "YellowGreen" }, + }; + public static final Map MAP = + Arrays.stream(ARRAY) + .collect(Collectors.toMap( + element -> (Integer)element[0], + element -> (String)element[1], + (v1, v2) -> { // Merge function + throw new IllegalStateException(); + }, + LinkedHashMap::new + )); + // Inversion only works if values are unique: + public static Map + invert(Map map) { + return map.entrySet().stream() + .collect(Collectors.toMap( + Map.Entry::getValue, + Map.Entry::getKey, + (v1, v2) -> { + throw new IllegalStateException(); + }, + LinkedHashMap::new + )); + } + public static final Map + INVMAP = invert(MAP); + // Look up RGB value given a name: + public static Integer rgb(String colorName) { + return INVMAP.get(colorName); + } + public static final List LIST = + Arrays.stream(ARRAY) + .map(item -> (String)item[1]) + .collect(Collectors.toList()); + public static final List RGBLIST = + Arrays.stream(ARRAY) + .map(item -> (Integer)item[0]) + .collect(Collectors.toList()); + public static void show(Map.Entry e) { + System.out.format( + "0x%06X: %s\n", e.getKey(), e.getValue()); + } + public static void + show(Map m, int count) { + m.entrySet().stream() + .limit(count) + .forEach(e -> show(e)); + } + public static void show(Map m) { + show(m, m.size()); + } + public static + void show(List lst, int count) { + lst.stream() + .limit(count) + .forEach(System.out::println); + } + public static void show(List lst) { + show(lst, lst.size()); + } + public static + void showrgb(List lst, int count) { + lst.stream() + .limit(count) + .forEach(n -> System.out.format("0x%06X\n", n)); + } + public static void showrgb(List lst) { + showrgb(lst, lst.size()); + } + public static + void show_inv(Map m, int count) { + m.entrySet().stream() + .limit(count) + .forEach(e -> + System.out.format( + "%-20s 0x%06X\n", e.getKey(), e.getValue())); + } + public static void show_inv(Map m) { + show_inv(m, m.size()); + } + public static void border() { + System.out.println("------------------------------"); + } +} diff --git a/understandingcollections/FunctionalMap.java b/understandingcollections/FunctionalMap.java new file mode 100644 index 000000000..a1267377d --- /dev/null +++ b/understandingcollections/FunctionalMap.java @@ -0,0 +1,38 @@ +// understandingcollections/FunctionalMap.java +// (c)2016 MindView LLC: see Copyright.txt +// We make no guarantees that this code is fit for any purpose. +// Visit http://OnJava8.com for more book information. +// Functional operations on a Map +import java.util.*; +import java.util.stream.*; +import java.util.concurrent.*; +import static onjava.HTMLColors.*; + +public class FunctionalMap { + public static void main(String[] args) { + MAP.entrySet().stream() + .map(Map.Entry::getValue) + .filter(v -> v.startsWith("Dark")) + .map(v -> v.replaceFirst("Dark", "Hot")) + .forEach(System.out::println); + } +} +/* Output: +HotBlue +HotCyan +HotGoldenRod +HotGray +HotGreen +HotKhaki +HotMagenta +HotOliveGreen +HotOrange +HotOrchid +HotRed +HotSalmon +HotSeaGreen +HotSlateBlue +HotSlateGray +HotTurquoise +HotViolet +*/ diff --git a/understandingcollections/HTMLColorTest.java b/understandingcollections/HTMLColorTest.java new file mode 100644 index 000000000..67011c8f3 --- /dev/null +++ b/understandingcollections/HTMLColorTest.java @@ -0,0 +1,103 @@ +// understandingcollections/HTMLColorTest.java +// (c)2016 MindView LLC: see Copyright.txt +// We make no guarantees that this code is fit for any purpose. +// Visit http://OnJava8.com for more book information. +import static onjava.HTMLColors.*; + +public class HTMLColorTest { + static final int DISPLAYSIZE = 20; + public static void main(String[] args) { + show(MAP, DISPLAYSIZE); + border(); + show_inv(INVMAP, DISPLAYSIZE); + border(); + show(LIST, DISPLAYSIZE); + border(); + showrgb(RGBLIST, DISPLAYSIZE); + } +} +/* Output: +0xF0F8FF: AliceBlue +0xFAEBD7: AntiqueWhite +0x7FFFD4: Aquamarine +0xF0FFFF: Azure +0xF5F5DC: Beige +0xFFE4C4: Bisque +0x000000: Black +0xFFEBCD: BlanchedAlmond +0x0000FF: Blue +0x8A2BE2: BlueViolet +0xA52A2A: Brown +0xDEB887: BurlyWood +0x5F9EA0: CadetBlue +0x7FFF00: Chartreuse +0xD2691E: Chocolate +0xFF7F50: Coral +0x6495ED: CornflowerBlue +0xFFF8DC: Cornsilk +0xDC143C: Crimson +0x00FFFF: Cyan +------------------------------ +AliceBlue 0xF0F8FF +AntiqueWhite 0xFAEBD7 +Aquamarine 0x7FFFD4 +Azure 0xF0FFFF +Beige 0xF5F5DC +Bisque 0xFFE4C4 +Black 0x000000 +BlanchedAlmond 0xFFEBCD +Blue 0x0000FF +BlueViolet 0x8A2BE2 +Brown 0xA52A2A +BurlyWood 0xDEB887 +CadetBlue 0x5F9EA0 +Chartreuse 0x7FFF00 +Chocolate 0xD2691E +Coral 0xFF7F50 +CornflowerBlue 0x6495ED +Cornsilk 0xFFF8DC +Crimson 0xDC143C +Cyan 0x00FFFF +------------------------------ +AliceBlue +AntiqueWhite +Aquamarine +Azure +Beige +Bisque +Black +BlanchedAlmond +Blue +BlueViolet +Brown +BurlyWood +CadetBlue +Chartreuse +Chocolate +Coral +CornflowerBlue +Cornsilk +Crimson +Cyan +------------------------------ +0xF0F8FF +0xFAEBD7 +0x7FFFD4 +0xF0FFFF +0xF5F5DC +0xFFE4C4 +0x000000 +0xFFEBCD +0x0000FF +0x8A2BE2 +0xA52A2A +0xDEB887 +0x5F9EA0 +0x7FFF00 +0xD2691E +0xFF7F50 +0x6495ED +0xFFF8DC +0xDC143C +0x00FFFF +*/ diff --git a/understandingcollections/ListOps.java b/understandingcollections/ListOps.java index 0bcfb001b..790b3f5aa 100644 --- a/understandingcollections/ListOps.java +++ b/understandingcollections/ListOps.java @@ -4,9 +4,12 @@ // Visit http://OnJava8.com for more book information. // Things you can do with Lists import java.util.*; -import onjava.*; +import onjava.HTMLColors; public class ListOps { + // Create a short list for testing: + static final List LIST = + HTMLColors.LIST.subList(0, 10); private static boolean b; private static String s; private static int i; @@ -16,12 +19,12 @@ public static void basicTest(List a) { a.add(1, "x"); // Add at location 1 a.add("x"); // Add at end // Add a collection: - a.addAll(Countries.names(25)); + a.addAll(LIST); // Add a collection starting at location 3: - a.addAll(3, Countries.names(25)); + a.addAll(3, LIST); b = a.contains("1"); // Is it in there? // Is the entire collection in there? - b = a.containsAll(Countries.names(25)); + b = a.containsAll(LIST); // Lists allow random access, which is cheap // for ArrayList, expensive for LinkedList: s = a.get(1); // Get (typed) object at location 1 @@ -36,9 +39,9 @@ public static void basicTest(List a) { a.set(1, "y"); // Set location 1 to "y" // Keep everything that's in the argument // (the intersection of the two sets): - a.retainAll(Countries.names(25)); + a.retainAll(LIST); // Remove everything that's in the argument: - a.removeAll(Countries.names(25)); + a.removeAll(LIST); i = a.size(); // How big is it? a.clear(); // Remove all elements } @@ -65,7 +68,7 @@ public static void iterManipulation(List a) { } public static void testVisual(List a) { System.out.println(a); - List b = Countries.names(25); + List b = LIST; System.out.println("b = " + b); a.addAll(b); a.addAll(b); @@ -90,7 +93,7 @@ public static void testVisual(List a) { // There are some things that only LinkedLists can do: public static void testLinkedList() { LinkedList ll = new LinkedList<>(); - ll.addAll(Countries.names(25)); + ll.addAll(LIST); System.out.println(ll); // Treat it like a stack, pushing: ll.addFirst("one"); @@ -108,39 +111,15 @@ public static void testLinkedList() { } public static void main(String[] args) { // Make and fill a new list each time: - basicTest( - new LinkedList<>(Countries.names(25))); - basicTest( - new ArrayList<>(Countries.names(25))); - iterMotion( - new LinkedList<>(Countries.names(25))); - iterMotion( - new ArrayList<>(Countries.names(25))); - iterManipulation( - new LinkedList<>(Countries.names(25))); - iterManipulation( - new ArrayList<>(Countries.names(25))); - testVisual( - new LinkedList<>(Countries.names(25))); + basicTest(new LinkedList<>(LIST)); + basicTest(new ArrayList<>(LIST)); + iterMotion(new LinkedList<>(LIST)); + iterMotion(new ArrayList<>(LIST)); + iterManipulation(new LinkedList<>(LIST)); + iterManipulation(new ArrayList<>(LIST)); + testVisual(new LinkedList<>(LIST)); testLinkedList(); } } -/* Output: (First and Last 2 Lines) -[ALGERIA, ANGOLA, BENIN, BOTSWANA, BURKINA FASO, BURUNDI, -CAMEROON, CAPE VERDE, CENTRAL AFRICAN REPUBLIC, CHAD, -COMOROS, CONGO, DJIBOUTI, EGYPT, EQUATORIAL GUINEA, -ERITREA, ETHIOPIA, GABON, THE GAMBIA, GHANA, GUINEA, -BISSAU, COTE D'IVOIR (IVORY COAST), KENYA, LESOTHO] -b = [ALGERIA, ANGOLA, BENIN, BOTSWANA, BURKINA FASO, -BURUNDI, CAMEROON, CAPE VERDE, CENTRAL AFRICAN REPUBLIC, -CHAD, COMOROS, CONGO, DJIBOUTI, EGYPT, EQUATORIAL GUINEA, -ERITREA, ETHIOPIA, GABON, THE GAMBIA, GHANA, GUINEA, -BISSAU, COTE D'IVOIR (IVORY COAST), KENYA, LESOTHO] -...________...________...________...________... -LESOTHO -[ALGERIA, ANGOLA, BENIN, BOTSWANA, BURKINA FASO, BURUNDI, -CAMEROON, CAPE VERDE, CENTRAL AFRICAN REPUBLIC, CHAD, -COMOROS, CONGO, DJIBOUTI, EGYPT, EQUATORIAL GUINEA, -ERITREA, ETHIOPIA, GABON, THE GAMBIA, GHANA, GUINEA, -BISSAU, COTE D'IVOIR (IVORY COAST), KENYA] +/* Output: */ diff --git a/understandingcollections/NavMap.java b/understandingcollections/NavMap.java new file mode 100644 index 000000000..74e4739fc --- /dev/null +++ b/understandingcollections/NavMap.java @@ -0,0 +1,96 @@ +// understandingcollections/NavMap.java +// (c)2016 MindView LLC: see Copyright.txt +// We make no guarantees that this code is fit for any purpose. +// Visit http://OnJava8.com for more book information. +// NavigableMap produces pieces of a Map +import java.util.*; +import java.util.concurrent.*; +import static onjava.HTMLColors.*; + +public class NavMap { + public static final + NavigableMap COLORS = + new ConcurrentSkipListMap<>(MAP); + public static void main(String[] args) { + show(COLORS.firstEntry()); + border(); + show(COLORS.lastEntry()); + border(); + NavigableMap toLime = + COLORS.headMap(rgb("Lime"), true); + show(toLime); + border(); + show(COLORS.ceilingEntry(rgb("DeepSkyBlue") - 1)); + border(); + show(COLORS.floorEntry(rgb("DeepSkyBlue") - 1)); + border(); + show(toLime.descendingMap()); + border(); + show(COLORS.tailMap(rgb("MistyRose"), true)); + border(); + show(COLORS.subMap( + rgb("Orchid"), true, + rgb("DarkSalmon"), false)); + } +} +/* Output: +0x000000: Black +------------------------------ +0xFFFFFF: White +------------------------------ +0x000000: Black +0x000080: Navy +0x00008B: DarkBlue +0x0000CD: MediumBlue +0x0000FF: Blue +0x006400: DarkGreen +0x008000: Green +0x008080: Teal +0x008B8B: DarkCyan +0x00BFFF: DeepSkyBlue +0x00CED1: DarkTurquoise +0x00FA9A: MediumSpringGreen +0x00FF00: Lime +------------------------------ +0x00BFFF: DeepSkyBlue +------------------------------ +0x008B8B: DarkCyan +------------------------------ +0x00FF00: Lime +0x00FA9A: MediumSpringGreen +0x00CED1: DarkTurquoise +0x00BFFF: DeepSkyBlue +0x008B8B: DarkCyan +0x008080: Teal +0x008000: Green +0x006400: DarkGreen +0x0000FF: Blue +0x0000CD: MediumBlue +0x00008B: DarkBlue +0x000080: Navy +0x000000: Black +------------------------------ +0xFFE4E1: MistyRose +0xFFEBCD: BlanchedAlmond +0xFFEFD5: PapayaWhip +0xFFF0F5: LavenderBlush +0xFFF5EE: SeaShell +0xFFF8DC: Cornsilk +0xFFFACD: LemonChiffon +0xFFFAF0: FloralWhite +0xFFFAFA: Snow +0xFFFF00: Yellow +0xFFFFE0: LightYellow +0xFFFFF0: Ivory +0xFFFFFF: White +------------------------------ +0xDA70D6: Orchid +0xDAA520: GoldenRod +0xDB7093: PaleVioletRed +0xDC143C: Crimson +0xDCDCDC: Gainsboro +0xDDA0DD: Plum +0xDEB887: BurlyWood +0xE0FFFF: LightCyan +0xE6E6FA: Lavender +*/ diff --git a/understandingcollections/SetOrder.java b/understandingcollections/SetOrder.java new file mode 100644 index 000000000..aade89009 --- /dev/null +++ b/understandingcollections/SetOrder.java @@ -0,0 +1,92 @@ +// understandingcollections/SetOrder.java +// (c)2016 MindView LLC: see Copyright.txt +// We make no guarantees that this code is fit for any purpose. +// Visit http://OnJava8.com for more book information. +import java.util.*; +import onjava.HTMLColors; + +public class SetOrder { + static String[] sets = { + "java.util.HashSet", + "java.util.TreeSet", + "java.util.concurrent.ConcurrentSkipListSet", + "java.util.LinkedHashSet", + "java.util.concurrent.CopyOnWriteArraySet", + }; + static List RLIST = + new ArrayList<>(HTMLColors.LIST); + static { + Collections.reverse(RLIST); + } + public static void + main(String[] args) throws Exception { + for(String type: sets) { + System.out.format("[-> %s <-]\n", + type.substring(type.lastIndexOf('.') + 1)); + @SuppressWarnings("unchecked") + Set set = (Set) + Class.forName(type).newInstance(); + set.addAll(RLIST); + set.stream() + .limit(10) + .forEach(System.out::println); + } + } +} +/* Output: +[-> HashSet <-] +MediumOrchid +PaleGoldenRod +Sienna +LightSlateGray +DarkSeaGreen +Black +Gainsboro +Orange +LightCoral +DodgerBlue +[-> TreeSet <-] +AliceBlue +AntiqueWhite +Aquamarine +Azure +Beige +Bisque +Black +BlanchedAlmond +Blue +BlueViolet +[-> ConcurrentSkipListSet <-] +AliceBlue +AntiqueWhite +Aquamarine +Azure +Beige +Bisque +Black +BlanchedAlmond +Blue +BlueViolet +[-> LinkedHashSet <-] +YellowGreen +Yellow +WhiteSmoke +White +Wheat +Violet +Turquoise +Tomato +Thistle +Teal +[-> CopyOnWriteArraySet <-] +YellowGreen +Yellow +WhiteSmoke +White +Wheat +Violet +Turquoise +Tomato +Thistle +Teal +*/ diff --git a/understandingcollections/jmh/Deques.java b/understandingcollections/jmh/Deques.java index 3f7e33864..ab50aa766 100644 --- a/understandingcollections/jmh/Deques.java +++ b/understandingcollections/jmh/Deques.java @@ -5,7 +5,6 @@ // Performance differences between Deques package understandingcollections.jmh; import org.openjdk.jmh.annotations.*; -import org.openjdk.jmh.infra.Blackhole; import java.util.concurrent.TimeUnit; import java.util.*; @@ -37,15 +36,9 @@ public class Deques { private int size; @Setup - public void setup() { - try { - deque = (Deque) - Class.forName(type).newInstance(); - } catch(Exception e) { - System.err.println( - "-> Cannot create: " + type); - System.exit(99); - } + public void setup() throws Exception { + deque = (Deque) + Class.forName(type).newInstance(); for(int i = 0; i < size; i++) deque.add(Integer.toString(i)); } @@ -60,11 +53,11 @@ public Deque addLast() { return deque; } @Benchmark - public void pollFirst(Blackhole bh) { - bh.consume(deque.pollFirst()); + public String pollFirst() { + return deque.pollFirst(); } @Benchmark - public void pollLast(Blackhole bh) { - bh.consume(deque.pollLast()); + public String pollLast() { + return deque.pollLast(); } } diff --git a/understandingcollections/jmh/Lists.java b/understandingcollections/jmh/Lists.java index 6a77df62f..997b992a7 100644 --- a/understandingcollections/jmh/Lists.java +++ b/understandingcollections/jmh/Lists.java @@ -5,7 +5,6 @@ // Performance differences between Lists package understandingcollections.jmh; import org.openjdk.jmh.annotations.*; -import org.openjdk.jmh.infra.Blackhole; import java.util.*; import java.util.concurrent.*; @@ -36,37 +35,39 @@ public class Lists { }) private int size; + private int middle; + private ListIterator it; + @Setup - public void setup() { - try { - list = (List) - Class.forName(type).newInstance(); - } catch(Exception e) { - System.err.println( - "-> Cannot create: " + type); - System.exit(99); - } + public void setup() throws Exception { + list = (List) + Class.forName(type).newInstance(); for(int i = 0; i < size; i++) list.add(Integer.toString(i)); + middle = size / 2; + it = list.listIterator(middle); + } + @Benchmark + public List append() { + list.add("test"); + return list; } @Benchmark - public List add() { - list.add(list.size() / 2, "test"); + public List insert() { + list.add(middle, "test"); return list; } @Benchmark - public void get(Blackhole bh) { - bh.consume(list.get(list.size() / 2)); + public String get() { + return list.get(middle); } @Benchmark public List set() { - list.set(list.size() / 2, "test"); + list.set(middle, "test"); return list; } @Benchmark public List iteradd() { - ListIterator it = - list.listIterator(list.size() / 2); try { it.add("test"); } catch(UnsupportedOperationException e) { @@ -77,15 +78,16 @@ public List iteradd() { return list; } @Benchmark - public List insert() { - list.add(list.size() / 2, "test"); - return list; - } - @Benchmark public List remove() { - int index = list.size() / 2; - if(index > 0) - list.remove(index); + middle = list.size() / 2; + if(middle - 1 > 0) + try { + list.remove(middle - 1); + } catch(ArrayIndexOutOfBoundsException e) { + System.out.println("Out of bounds -> size: " + + list.size() + " middle - 1: " + (middle - 1) + + " for " + list.getClass().getSimpleName()); + } return list; } } diff --git a/understandingcollections/jmh/Maps.java b/understandingcollections/jmh/Maps.java index d97269039..304016187 100644 --- a/understandingcollections/jmh/Maps.java +++ b/understandingcollections/jmh/Maps.java @@ -39,23 +39,23 @@ public class Maps { }) private int size; + private String key; + @Setup - public void setup() { - try { - map = (Map) - Class.forName(type).newInstance(); - } catch(Exception e) { - System.err.println( - "-> Cannot create: " + type); - System.exit(99); - } + public void setup() throws Exception { + map = (Map) + Class.forName(type).newInstance(); for(int i = 0; i < size; i++) map.put(Integer.toString(i), Integer.toString(i)); + key = Integer.toString(size / 2); + } + @Benchmark + public boolean containsKey() { + return map.containsKey(key); } @Benchmark - public void get(Blackhole bh) { - String key = Integer.toString(size / 2); - bh.consume(map.get(key)); + public String get() { + return map.get(key); } @Benchmark public Map put() { diff --git a/understandingcollections/jmh/Queues.java b/understandingcollections/jmh/Queues.java index efcdc4817..8a9ebad76 100644 --- a/understandingcollections/jmh/Queues.java +++ b/understandingcollections/jmh/Queues.java @@ -5,7 +5,6 @@ // Performance differences between Queues package understandingcollections.jmh; import org.openjdk.jmh.annotations.*; -import org.openjdk.jmh.infra.Blackhole; import java.util.*; import java.util.concurrent.*; @@ -45,15 +44,9 @@ public class Queues { private int size; @Setup - public void setup() { - try { - queue = (Queue) - Class.forName(type).newInstance(); - } catch(Exception e) { - System.err.println( - "-> Cannot create: " + type); - System.exit(99); - } + public void setup() throws Exception { + queue = (Queue) + Class.forName(type).newInstance(); for(int i = 0; i < size; i++) queue.add(Integer.toString(i)); } @@ -63,7 +56,7 @@ public Queue add() { return queue; } @Benchmark - public void poll(Blackhole bh) { - bh.consume(queue.poll()); + public String poll() { + return queue.poll(); } } diff --git a/understandingcollections/jmh/Sets.java b/understandingcollections/jmh/Sets.java index a675b23c9..98af1b474 100644 --- a/understandingcollections/jmh/Sets.java +++ b/understandingcollections/jmh/Sets.java @@ -36,18 +36,15 @@ public class Sets { }) private int size; + private String key; + @Setup - public void setup() { - try { - set = (Set) - Class.forName(type).newInstance(); - } catch(Exception e) { - System.err.println( - "-> Cannot create: " + type); - System.exit(99); - } + public void setup() throws Exception { + set = (Set) + Class.forName(type).newInstance(); for(int i = 0; i < size; i++) set.add(Integer.toString(i)); + key = Integer.toString(size/2); } @Benchmark public Set add() { @@ -55,9 +52,8 @@ public Set add() { return set; } @Benchmark - public void contains(Blackhole bh) { - String key = Integer.toString(size/2); - bh.consume(set.contains(key)); + public boolean contains() { + return set.contains(key); } @Benchmark public void iterate(Blackhole bh) { From 9b4ebe810ed25389904ad51c4a683790c6225a18 Mon Sep 17 00:00:00 2001 From: Bruce Eckel Date: Wed, 2 Nov 2016 10:55:40 -0700 Subject: [PATCH 131/320] Revert to before I tried Ben's notes --- build.gradle | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/build.gradle b/build.gradle index 38ca841fc..044448107 100644 --- a/build.gradle +++ b/build.gradle @@ -1,6 +1,8 @@ buildscript { repositories { + mavenLocal() jcenter() + mavenCentral() } dependencies { classpath 'org.junit.platform:junit-platform-gradle-plugin:1.0.0-M2' @@ -14,6 +16,7 @@ plugins { import org.gradle.internal.jvm.Jvm import org.apache.tools.ant.util.TeeOutputStream +boolean debug = false class Tags { Boolean hasMainMethod = false @@ -155,8 +158,7 @@ subprojects { // compile group: 'org.slf4j', name: 'slf4j-jdk14', version: '1.7.5' // JUnit testing: - // Commented as per Ben - // compile "org.junit.jupiter:junit-jupiter-api:${junitJupiterVersion}" + compile "org.junit.jupiter:junit-jupiter-api:${junitJupiterVersion}" testCompile "org.junit.jupiter:junit-jupiter-api:${junitJupiterVersion}" testRuntime "org.junit.jupiter:junit-jupiter-engine:${junitJupiterVersion}" } @@ -226,6 +228,7 @@ subprojects { if (file.name.endsWith('.java')) { Tags tags = new Tags(file) + if(debug && tags.hasTags()) println tags // Exclude java sources that will not compile if (tags.compileTimeError) { @@ -374,8 +377,7 @@ configure(subprojects - project(':onjava')) { compile project(':onjava') compile group: 'com.google.guava', name: 'guava', version: '19.0' compile "org.openjdk.jmh:jmh-core:${jmh.jmhVersion}" - // commented as per Ben: - // compile 'org.junit.platform:junit-platform-gradle-plugin:1.0.0-M2' + compile 'org.junit.platform:junit-platform-gradle-plugin:1.0.0-M2' } } From 1cd385b8fb110ddb1fe36b08528a38b46ff541b3 Mon Sep 17 00:00:00 2001 From: Bruce Eckel Date: Wed, 2 Nov 2016 16:21:47 -0700 Subject: [PATCH 132/320] Travis CI status --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 186e9fa7f..78cb9d75e 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,5 @@ +https://travis-ci.org/BruceEckel/OnJava8-Examples.svg?branch=master + To compile and run these programs, you only need JDK 8 installed. Invoking `gradlew` will automatically download and install Gradle. Gradle will also install all additional libraries necessary to compile From 5cbe466884380920c858d9a614dd86bd153b0ab8 Mon Sep 17 00:00:00 2001 From: Bruce Eckel Date: Wed, 2 Nov 2016 16:26:29 -0700 Subject: [PATCH 133/320] Travis CI status --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 78cb9d75e..8d9423dc0 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -https://travis-ci.org/BruceEckel/OnJava8-Examples.svg?branch=master +![](https://travis-ci.org/BruceEckel/OnJava8-Examples.svg?branch=master) To compile and run these programs, you only need JDK 8 installed. Invoking `gradlew` will automatically download and install Gradle. From 0d3b0ea7240f836c1d5d78a3a4826e9ba63712c5 Mon Sep 17 00:00:00 2001 From: Benjamin Muschko Date: Thu, 3 Nov 2016 07:38:32 -0400 Subject: [PATCH 134/320] Organization of build logic into plugins and general cleanup --- .gitignore | 2 +- build.gradle | 389 +----------------- .../ExampleOutputVerificationPlugin.groovy | 18 + .../mindviewinc/plugins/TaggingPlugin.groovy | 82 ++++ .../com/mindviewinc/plugins/Tags.groovy | 108 +++++ ...inc.example-output-verification.properties | 1 + .../com.mindviewinc.tagging.properties | 1 + gradle/code-analysis.gradle | 27 ++ gradle/java.gradle | 39 ++ gradle/jmh.gradle | 17 + gradle/junit-jupiter.gradle | 36 ++ gradle/subprojects.gradle | 70 ++++ 12 files changed, 411 insertions(+), 379 deletions(-) create mode 100644 buildSrc/src/main/groovy/com/mindviewinc/plugins/ExampleOutputVerificationPlugin.groovy create mode 100644 buildSrc/src/main/groovy/com/mindviewinc/plugins/TaggingPlugin.groovy create mode 100644 buildSrc/src/main/groovy/com/mindviewinc/plugins/Tags.groovy create mode 100644 buildSrc/src/main/resources/META-INF/gradle-plugins/com.mindviewinc.example-output-verification.properties create mode 100644 buildSrc/src/main/resources/META-INF/gradle-plugins/com.mindviewinc.tagging.properties create mode 100644 gradle/code-analysis.gradle create mode 100644 gradle/java.gradle create mode 100644 gradle/jmh.gradle create mode 100644 gradle/junit-jupiter.gradle create mode 100644 gradle/subprojects.gradle diff --git a/.gitignore b/.gitignore index 3603e838e..c2163b0e6 100644 --- a/.gitignore +++ b/.gitignore @@ -71,7 +71,7 @@ io/X.file /files/Cheese.txt /files/StreamInAndOut.txt -/.gradle/ +.gradle /*.iml /.idea/ diff --git a/build.gradle b/build.gradle index 044448107..63b5541b4 100644 --- a/build.gradle +++ b/build.gradle @@ -1,390 +1,23 @@ buildscript { repositories { - mavenLocal() - jcenter() - mavenCentral() + maven { + url 'https://plugins.gradle.org/m2/' + } } dependencies { + classpath 'me.champeau.gradle:jmh-gradle-plugin:0.3.1' classpath 'org.junit.platform:junit-platform-gradle-plugin:1.0.0-M2' } } -plugins { - id 'com.github.johnrengelman.shadow' version '1.2.3' - id 'me.champeau.gradle.jmh' version '0.3.1' -} - -import org.gradle.internal.jvm.Jvm -import org.apache.tools.ant.util.TeeOutputStream -boolean debug = false - -class Tags { - Boolean hasMainMethod = false - Boolean compileTimeError = false - Boolean throwsException = false - Boolean errorOutputExpected = false - Boolean validateByHand = false - Boolean ignoreOutput = false // This tag isn't used in the build... - String fileRoot - String mainClass - String javaCmd = null - List args = [] - List jVMArgs = [] - String javap = null - String runFirst = null - String outputLine = null - private String block - def Tags(File file) { - block = file.text - hasMainMethod = block.contains('main(String[] args)') - def firstLine = block.substring(0, block.indexOf("\n")) - fileRoot = (firstLine.split("/")[-1] - ".java").trim() // Remove \r if it exists - mainClass = fileRoot - javaCmd = extract('java') - if(javaCmd) { - def pieces = javaCmd.split() - mainClass = pieces[0] - if(pieces.size() > 1) - for(p in pieces[1..-1]) - if(p.startsWith("-")) - jVMArgs << p - else - args << p - } - compileTimeError = hasTag('CompileTimeError') - throwsException = hasTag('ThrowsException') - errorOutputExpected = hasTag('ErrorOutputExpected') - validateByHand = hasTag('ValidateByHand') - ignoreOutput = hasTag('IgnoreOutput') - javap = extract('javap') // Includes only arguments to command - runFirst = extract('RunFirst:') - outputLine = extractOutputLine() - } - private def hasTag(String marker) { - return block.contains("// {" + marker + "}") - } - def extractOutputLine() { - def matcher = (block =~ /(?m)^(\/\* Output:.*)$/) - if (matcher) { - return matcher[0][1] - } else { - return null - } - } - private def extract(String marker) { - // Assume some whitespace is after marker - if(!block.contains("// {${marker} ")) - return null - def matcher = (block =~ /\/\/ \{${marker}\s+([^}]+)/) - if (matcher) { - def matched = matcher[0][1].trim() - return matched.replaceAll("\n?//", "") - } else { - println "Searching for: " + matcher - println block - System.exit(1) - } - } - public boolean hasTags() { - return compileTimeError || - throwsException || - errorOutputExpected || - validateByHand || - ignoreOutput || - javaCmd || - args || - jVMArgs || - javap || - runFirst - } - public String toString() { - String result = "" - block.eachLine{ ln -> - if(ln.startsWith("//") || ln.startsWith("package ")) - result += ln + "\n" - } - """ - hasMainMethod - compileTimeError - throwsException - errorOutputExpected - validateByHand - ignoreOutput - fileRoot - mainClass - javaCmd - args - jVMArgs - javap - runFirst - """.split().each { str -> - if(this[str]) - result += str + ": " + this[str] + "\n" - } - result - } -} - -ext { - junitJupiterVersion = '5.0.0-M2' -} - -compileJava { - options.compilerArgs << "-Xlint:unchecked" << "-Xlint:deprecation" -} +apply plugin: 'com.mindviewinc.example-output-verification' subprojects { - apply plugin: 'com.github.johnrengelman.shadow' - apply plugin: 'me.champeau.gradle.jmh' - apply plugin: 'java' - apply plugin: 'org.junit.platform.gradle.plugin' - //apply plugin: 'checkstyle' - //apply plugin: 'findbugs' - - sourceCompatibility = '1.8' - targetCompatibility = '1.8' - - repositories { - mavenLocal() - jcenter() - mavenCentral() - } - - dependencies { - // Logging: - compile group: 'org.slf4j', name: 'slf4j-api', version: '1.7.+' - compile group: 'ch.qos.logback', name: 'logback-classic', version: '1.+' - // You can also use the JDK's built-in logging as the back end: - // compile group: 'org.slf4j', name: 'slf4j-jdk14', version: '1.7.5' - - // JUnit testing: - compile "org.junit.jupiter:junit-jupiter-api:${junitJupiterVersion}" - testCompile "org.junit.jupiter:junit-jupiter-api:${junitJupiterVersion}" - testRuntime "org.junit.jupiter:junit-jupiter-engine:${junitJupiterVersion}" - } - - junitPlatform { - includeClassNamePattern '.*' - } - - // See: http://blog.jessitron.com/2012/07/using-checkstyle-in-gradle.html - // https://github.com/checkstyle/checkstyle/blob/master/src/main/resources/google_checks.xml - // http://checkstyle.sourceforge.net/reports/google-java-style.html -/* checkstyle { - // configFile = new File(rootDir, "checkstyle.xml") - toolVersion = '6.7' - }*/ - -/* findbugsMain { - reports { - xml.enabled = false - html.enabled = true - } - ignoreFailures = true - } - - findbugsJmh { - reports { - xml.enabled = false - html.enabled = true - } - ignoreFailures = true - } -*/ - sourceSets { - main { - java { - srcDir projectDir - exclude "tests/**" - } - resources { - srcDir projectDir - include '*.xml' - } - } - jmh { - java { - srcDir projectDir - } - } - test { - java { - srcDir new File(projectDir, "tests") - } - } - } - - jmh { - jmhVersion = '1.15' - duplicateClassesStrategy = 'warn' - failOnError = true - // See https://github.com/melix/jmh-gradle-plugin - // for other options - } - - List createdTasks = [] - - projectDir.eachFileRecurse { file -> - if (file.name.endsWith('.java')) { - - Tags tags = new Tags(file) - if(debug && tags.hasTags()) println tags - - // Exclude java sources that will not compile - if (tags.compileTimeError) { - sourceSets.main.java.excludes.add(file.name) - } else { - JavaExec javaTask = null - // Add tasks for java sources with main methods - if (tags.hasMainMethod || tags.javaCmd) { - javaTask = tasks.create(name: tags.fileRoot, type: JavaExec, dependsOn: tags.runFirst) { - main = tags.mainClass - classpath = sourceSets.main.runtimeClasspath - args = tags.args - jvmArgs = tags.jVMArgs - } - } else if (tags.javap) { - // Create task for running javap - javaTask = tasks.create(name: "${tags.fileRoot}", type: JavaExec, dependsOn: tags.runFirst) { - main = "com.sun.tools.javap.Main" - classpath = sourceSets.main.runtimeClasspath + files(Jvm.current().toolsJar) - // Assuming javap represents all the args and there's no need to jVMArgs - args tags.javap.split() - } - } - - if (javaTask) { - def baseName = file.name.substring(0, file.name.lastIndexOf('.')) - File outFile = new File(file.parentFile, baseName + '.out') - File errFile = new File(file.parentFile, baseName + '.err') - - javaTask.configure { - ignoreExitValue = tags.validateByHand || tags.throwsException - doFirst { - if(outFile.exists()) - outFile.delete() - if(tags.outputLine) - outFile << tags.outputLine + "\n" - - standardOutput = new TeeOutputStream(new FileOutputStream(outFile, true), System.out) - errorOutput = new TeeOutputStream(new FileOutputStream(errFile), System.err) - } - doLast { - if(outFile.size() == 0) - outFile.delete() - else if(!outFile.text.contains("/* Output:")) - outFile.delete() - if(errFile.size() == 0) errFile.delete() - } - } - - if (!tags.validateByHand) { - // Only add tasks that we know we can run successfully to the task list - createdTasks.add(javaTask) - } - } - } - } - } - task run(dependsOn: createdTasks) - - /* Store test output in $projectName/tests - JUnit 5's junitPlatformTest runs as a "javaExec" rather than a "test", - so we can't hook into the before/after test behavior. - */ - tasks.findByPath(":$name:junitPlatformTest").configure { - File testDir = new File(project.name + "/tests") - if(testDir.exists()) { - File outFile = new File(testDir, 'report.txt') - doFirst { - standardOutput = new TeeOutputStream(new FileOutputStream(outFile, true), System.out) - } - doLast { - if(outFile.size() == 0) - outFile.delete() - else if(outFile.text.contains("0 tests found")) - outFile.delete() - } - } - } -} - -project(':validating') { - jmh { - include = 'validating.jmh.*' - } -} - -project(':understandingcollections') { - dependencies { - compile project(':typeinfo') - compile project(':collections') - } - jmh { - include = 'understandingcollections.jmh.*' - } + apply from: "$rootProject.projectDir/gradle/java.gradle" + apply from: "$rootProject.projectDir/gradle/junit-jupiter.gradle" + apply from: "$rootProject.projectDir/gradle/jmh.gradle" + apply from: "$rootProject.projectDir/gradle/code-analysis.gradle" + apply plugin: 'com.mindviewinc.tagging' } -project(':threads') { - dependencies { - compile project(':enums') - } -} - -project(':strings') { - dependencies { - compile project(':generics') - } -} - -project(':serialization') { - configurations.all { - resolutionStrategy { - force 'xml-apis:xml-apis:1.0.b2' - } - } - dependencies { - compile 'com.io7m.xom:xom:1.2.10' - } -} - -project(':interfaces') { - dependencies { - compile project(':polymorphism') - } -} - -project(':hiding') { - dependencies { - compile project(':com') - } -} - -project(':generics') { - dependencies { - compile project(':typeinfo') - } -} - -project(':collections') { - dependencies { - compile project(':typeinfo') - } -} - -configure(subprojects - project(':onjava')) { - dependencies { - compile project(':onjava') - compile group: 'com.google.guava', name: 'guava', version: '19.0' - compile "org.openjdk.jmh:jmh-core:${jmh.jmhVersion}" - compile 'org.junit.platform:junit-platform-gradle-plugin:1.0.0-M2' - } -} - -task verify(type:Exec) { - description 'Uses Python tool to verify example output' - commandLine 'python', '_verify_output.py' - doFirst { - println("execute 'gradlew run' first") - } -} +apply from: 'gradle/subprojects.gradle' \ No newline at end of file diff --git a/buildSrc/src/main/groovy/com/mindviewinc/plugins/ExampleOutputVerificationPlugin.groovy b/buildSrc/src/main/groovy/com/mindviewinc/plugins/ExampleOutputVerificationPlugin.groovy new file mode 100644 index 000000000..0a0a213c7 --- /dev/null +++ b/buildSrc/src/main/groovy/com/mindviewinc/plugins/ExampleOutputVerificationPlugin.groovy @@ -0,0 +1,18 @@ +package com.mindviewinc.plugins + +import org.gradle.api.Project +import org.gradle.api.Plugin +import org.gradle.api.tasks.Exec + +class ExampleOutputVerificationPlugin implements Plugin { + void apply(Project project) { + project.tasks.create('verify', Exec) { + description 'Uses Python tool to verify example output' + commandLine 'python', '_verify_output.py' + doFirst { + println("execute 'gradlew run' first") + } + } + + } +} \ No newline at end of file diff --git a/buildSrc/src/main/groovy/com/mindviewinc/plugins/TaggingPlugin.groovy b/buildSrc/src/main/groovy/com/mindviewinc/plugins/TaggingPlugin.groovy new file mode 100644 index 000000000..0d1cef8b2 --- /dev/null +++ b/buildSrc/src/main/groovy/com/mindviewinc/plugins/TaggingPlugin.groovy @@ -0,0 +1,82 @@ +package com.mindviewinc.plugins + +import org.gradle.api.Project +import org.gradle.api.Plugin +import org.gradle.api.tasks.JavaExec +import org.gradle.internal.jvm.Jvm + +import org.apache.tools.ant.util.TeeOutputStream + +class TaggingPlugin implements Plugin { + void apply(Project project) { + boolean debug = false + List createdTasks = [] + + project.projectDir.eachFileRecurse { file -> + if (file.name.endsWith('.java')) { + + Tags tags = new Tags(file) + if(debug && tags.hasTags()) println tags + + // Exclude java sources that will not compile + if (tags.compileTimeError) { + project.sourceSets.main.java.excludes.add(file.name) + } else { + JavaExec javaTask = null + // Add tasks for java sources with main methods + if (tags.hasMainMethod || tags.javaCmd) { + javaTask = project.tasks.create(name: tags.fileRoot, type: JavaExec, dependsOn: tags.runFirst) { + main = tags.mainClass + classpath = project.sourceSets.main.runtimeClasspath + args = tags.args + jvmArgs = tags.jVMArgs + } + } else if (tags.javap) { + // Create task for running javap + javaTask = project.tasks.create(name: "${tags.fileRoot}", type: JavaExec, dependsOn: tags.runFirst) { + main = "com.sun.tools.javap.Main" + classpath = project.sourceSets.main.runtimeClasspath + project.files(Jvm.current().toolsJar) + // Assuming javap represents all the args and there's no need to jVMArgs + args tags.javap.split() + } + } + + if (javaTask) { + def baseName = file.name.substring(0, file.name.lastIndexOf('.')) + File outFile = new File(file.parentFile, baseName + '.out') + File errFile = new File(file.parentFile, baseName + '.err') + + javaTask.configure { + ignoreExitValue = tags.validateByHand || tags.throwsException + doFirst { + if(outFile.exists()) + outFile.delete() + if(tags.outputLine) + outFile << tags.outputLine + "\n" + + standardOutput = new TeeOutputStream(new FileOutputStream(outFile, true), System.out) + errorOutput = new TeeOutputStream(new FileOutputStream(errFile), System.err) + } + doLast { + if(outFile.size() == 0) + outFile.delete() + else if(!outFile.text.contains("/* Output:")) + outFile.delete() + if(errFile.size() == 0) errFile.delete() + } + } + + if (!tags.validateByHand) { + // Only add tasks that we know we can run successfully to the task list + createdTasks.add(javaTask) + } + } + } + } + } + + project.tasks.create('run') { + dependsOn createdTasks + } + } +} \ No newline at end of file diff --git a/buildSrc/src/main/groovy/com/mindviewinc/plugins/Tags.groovy b/buildSrc/src/main/groovy/com/mindviewinc/plugins/Tags.groovy new file mode 100644 index 000000000..91d7a8b2d --- /dev/null +++ b/buildSrc/src/main/groovy/com/mindviewinc/plugins/Tags.groovy @@ -0,0 +1,108 @@ +package com.mindviewinc.plugins + +class Tags { + Boolean hasMainMethod = false + Boolean compileTimeError = false + Boolean throwsException = false + Boolean errorOutputExpected = false + Boolean validateByHand = false + Boolean ignoreOutput = false // This tag isn't used in the build... + String fileRoot + String mainClass + String javaCmd = null + List args = [] + List jVMArgs = [] + String javap = null + String runFirst = null + String outputLine = null + private String block + def Tags(File file) { + block = file.text + hasMainMethod = block.contains('main(String[] args)') + def firstLine = block.substring(0, block.indexOf("\n")) + fileRoot = (firstLine.split("/")[-1] - ".java").trim() // Remove \r if it exists + mainClass = fileRoot + javaCmd = extract('java') + if(javaCmd) { + def pieces = javaCmd.split() + mainClass = pieces[0] + if(pieces.size() > 1) + for(p in pieces[1..-1]) + if(p.startsWith("-")) + jVMArgs << p + else + args << p + } + compileTimeError = hasTag('CompileTimeError') + throwsException = hasTag('ThrowsException') + errorOutputExpected = hasTag('ErrorOutputExpected') + validateByHand = hasTag('ValidateByHand') + ignoreOutput = hasTag('IgnoreOutput') + javap = extract('javap') // Includes only arguments to command + runFirst = extract('RunFirst:') + outputLine = extractOutputLine() + } + private def hasTag(String marker) { + return block.contains("// {" + marker + "}") + } + def extractOutputLine() { + def matcher = (block =~ /(?m)^(\/\* Output:.*)$/) + if (matcher) { + return matcher[0][1] + } else { + return null + } + } + private def extract(String marker) { + // Assume some whitespace is after marker + if(!block.contains("// {${marker} ")) + return null + def matcher = (block =~ /\/\/ \{${marker}\s+([^}]+)/) + if (matcher) { + def matched = matcher[0][1].trim() + return matched.replaceAll("\n?//", "") + } else { + println "Searching for: " + matcher + println block + System.exit(1) + } + } + public boolean hasTags() { + return compileTimeError || + throwsException || + errorOutputExpected || + validateByHand || + ignoreOutput || + javaCmd || + args || + jVMArgs || + javap || + runFirst + } + public String toString() { + String result = "" + block.eachLine{ ln -> + if(ln.startsWith("//") || ln.startsWith("package ")) + result += ln + "\n" + } + """ + hasMainMethod + compileTimeError + throwsException + errorOutputExpected + validateByHand + ignoreOutput + fileRoot + mainClass + javaCmd + args + jVMArgs + javap + runFirst + """.split().each { str -> + if(this[str]) + result += str + ": " + this[str] + "\n" + } + result + } +} \ No newline at end of file diff --git a/buildSrc/src/main/resources/META-INF/gradle-plugins/com.mindviewinc.example-output-verification.properties b/buildSrc/src/main/resources/META-INF/gradle-plugins/com.mindviewinc.example-output-verification.properties new file mode 100644 index 000000000..7a8a7f57b --- /dev/null +++ b/buildSrc/src/main/resources/META-INF/gradle-plugins/com.mindviewinc.example-output-verification.properties @@ -0,0 +1 @@ +implementation-class=com.mindviewinc.plugins.ExampleOutputVerificationPlugin \ No newline at end of file diff --git a/buildSrc/src/main/resources/META-INF/gradle-plugins/com.mindviewinc.tagging.properties b/buildSrc/src/main/resources/META-INF/gradle-plugins/com.mindviewinc.tagging.properties new file mode 100644 index 000000000..8359e8285 --- /dev/null +++ b/buildSrc/src/main/resources/META-INF/gradle-plugins/com.mindviewinc.tagging.properties @@ -0,0 +1 @@ +implementation-class=com.mindviewinc.plugins.TaggingPlugin \ No newline at end of file diff --git a/gradle/code-analysis.gradle b/gradle/code-analysis.gradle new file mode 100644 index 000000000..db50436b6 --- /dev/null +++ b/gradle/code-analysis.gradle @@ -0,0 +1,27 @@ +//apply plugin: 'checkstyle' +//apply plugin: 'findbugs' + + // See: http://blog.jessitron.com/2012/07/using-checkstyle-in-gradle.html + // https://github.com/checkstyle/checkstyle/blob/master/src/main/resources/google_checks.xml + // http://checkstyle.sourceforge.net/reports/google-java-style.html +/* checkstyle { + // configFile = new File(rootDir, "checkstyle.xml") + toolVersion = '6.7' + }*/ + +/* findbugsMain { + reports { + xml.enabled = false + html.enabled = true + } + ignoreFailures = true + } + + findbugsJmh { + reports { + xml.enabled = false + html.enabled = true + } + ignoreFailures = true + } +*/ \ No newline at end of file diff --git a/gradle/java.gradle b/gradle/java.gradle new file mode 100644 index 000000000..c5916e76f --- /dev/null +++ b/gradle/java.gradle @@ -0,0 +1,39 @@ +apply plugin: 'java' + +sourceCompatibility = '1.8' +targetCompatibility = '1.8' + +compileJava { + options.compilerArgs << "-Xlint:unchecked" << "-Xlint:deprecation" +} + +sourceSets { + main { + java { + srcDir projectDir + exclude "tests/**" + } + resources { + srcDir projectDir + include '*.xml' + } + } + + test { + java { + srcDir file("tests") + } + } +} + +repositories { + jcenter() +} + +dependencies { + // Logging: + compile 'org.slf4j:slf4j-api:1.7.+' + compile 'ch.qos.logback:logback-classic:1.+' + // You can also use the JDK's built-in logging as the back end: + // compile group: 'org.slf4j', name: 'slf4j-jdk14', version: '1.7.5' +} \ No newline at end of file diff --git a/gradle/jmh.gradle b/gradle/jmh.gradle new file mode 100644 index 000000000..39e3b2745 --- /dev/null +++ b/gradle/jmh.gradle @@ -0,0 +1,17 @@ +apply plugin: 'me.champeau.gradle.jmh' + +sourceSets { + jmh { + java { + srcDir projectDir + } + } +} + +jmh { + jmhVersion = '1.15' + duplicateClassesStrategy = 'warn' + failOnError = true + // See https://github.com/melix/jmh-gradle-plugin + // for other options +} \ No newline at end of file diff --git a/gradle/junit-jupiter.gradle b/gradle/junit-jupiter.gradle new file mode 100644 index 000000000..124c85f55 --- /dev/null +++ b/gradle/junit-jupiter.gradle @@ -0,0 +1,36 @@ +import org.apache.tools.ant.util.TeeOutputStream + +apply plugin: 'org.junit.platform.gradle.plugin' + +ext { + junitJupiterVersion = '5.0.0-M2' +} + +dependencies { + testCompile "org.junit.jupiter:junit-jupiter-api:${junitJupiterVersion}" + testRuntime "org.junit.jupiter:junit-jupiter-engine:${junitJupiterVersion}" +} + +junitPlatform { + includeClassNamePattern '.*' +} + +/* Store test output in $projectName/tests + JUnit 5's junitPlatformTest runs as a "javaExec" rather than a "test", + so we can't hook into the before/after test behavior. +*/ +tasks.findByPath(":$name:junitPlatformTest").configure { + File testDir = file("tests") + if(testDir.exists()) { + File outFile = new File(testDir, 'report.txt') + doFirst { + standardOutput = new TeeOutputStream(new FileOutputStream(outFile, true), System.out) + } + doLast { + if(outFile.size() == 0) + outFile.delete() + else if(outFile.text.contains("0 tests found")) + outFile.delete() + } + } +} \ No newline at end of file diff --git a/gradle/subprojects.gradle b/gradle/subprojects.gradle new file mode 100644 index 000000000..a85e6f6de --- /dev/null +++ b/gradle/subprojects.gradle @@ -0,0 +1,70 @@ +project(':validating') { + jmh { + include = 'validating.jmh.*' + } +} + +project(':understandingcollections') { + dependencies { + compile project(':typeinfo') + compile project(':collections') + } + jmh { + include = 'understandingcollections.jmh.*' + } +} + +project(':threads') { + dependencies { + compile project(':enums') + } +} + +project(':strings') { + dependencies { + compile project(':generics') + } +} + +project(':serialization') { + configurations.all { + resolutionStrategy { + force 'xml-apis:xml-apis:1.0.b2' + } + } + dependencies { + compile 'com.io7m.xom:xom:1.2.10' + } +} + +project(':interfaces') { + dependencies { + compile project(':polymorphism') + } +} + +project(':hiding') { + dependencies { + compile project(':com') + } +} + +project(':generics') { + dependencies { + compile project(':typeinfo') + } +} + +project(':collections') { + dependencies { + compile project(':typeinfo') + } +} + +configure(subprojects - project(':onjava')) { + dependencies { + compile project(':onjava') + compile 'com.google.guava:guava:19.0' + compile "org.openjdk.jmh:jmh-core:${jmh.jmhVersion}" + } +} \ No newline at end of file From d70ab5d3cc4e3fbd83f3cae7df00833903357831 Mon Sep 17 00:00:00 2001 From: Benjamin Muschko Date: Thu, 3 Nov 2016 07:49:40 -0400 Subject: [PATCH 135/320] Avoid use of dynamic versions for reproducibility --- gradle/java.gradle | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/gradle/java.gradle b/gradle/java.gradle index c5916e76f..eadc4ef94 100644 --- a/gradle/java.gradle +++ b/gradle/java.gradle @@ -32,8 +32,8 @@ repositories { dependencies { // Logging: - compile 'org.slf4j:slf4j-api:1.7.+' - compile 'ch.qos.logback:logback-classic:1.+' + compile 'org.slf4j:slf4j-api:1.7.21' + compile 'ch.qos.logback:logback-classic:1.1.7' // You can also use the JDK's built-in logging as the back end: - // compile group: 'org.slf4j', name: 'slf4j-jdk14', version: '1.7.5' + // compile group: 'org.slf4j:slf4j-jdk14:1.7.21' } \ No newline at end of file From 078cede6dce3758ce40a08abe75ef96f9d2f0efa Mon Sep 17 00:00:00 2001 From: Benjamin Muschko Date: Thu, 3 Nov 2016 07:50:03 -0400 Subject: [PATCH 136/320] Debugging can be controlled from the command line --- .../main/groovy/com/mindviewinc/plugins/TaggingPlugin.groovy | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/buildSrc/src/main/groovy/com/mindviewinc/plugins/TaggingPlugin.groovy b/buildSrc/src/main/groovy/com/mindviewinc/plugins/TaggingPlugin.groovy index 0d1cef8b2..5b917902a 100644 --- a/buildSrc/src/main/groovy/com/mindviewinc/plugins/TaggingPlugin.groovy +++ b/buildSrc/src/main/groovy/com/mindviewinc/plugins/TaggingPlugin.groovy @@ -8,8 +8,10 @@ import org.gradle.internal.jvm.Jvm import org.apache.tools.ant.util.TeeOutputStream class TaggingPlugin implements Plugin { + private final static String DEBUG_PROJECT_PROPERTY_KEY = 'debug' + void apply(Project project) { - boolean debug = false + boolean debug = project.hasProperty(DEBUG_PROJECT_PROPERTY_KEY) ? Boolean.valueOf(project.getProperty(DEBUG_PROJECT_PROPERTY_KEY)) : false List createdTasks = [] project.projectDir.eachFileRecurse { file -> From 275f8d3a4bfcd109ae3a70d5bdc3db7993b2d48e Mon Sep 17 00:00:00 2001 From: Bruce Eckel Date: Thu, 3 Nov 2016 10:21:17 -0700 Subject: [PATCH 137/320] Don't track report.txt and buildSrc/ --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitignore b/.gitignore index 3603e838e..2589e01a7 100644 --- a/.gitignore +++ b/.gitignore @@ -49,6 +49,7 @@ Generated.txt *-results.txt *-out.txt OutputErrors.txt +report.txt failures People.xml annotations/Test0.txt @@ -79,6 +80,7 @@ io/X.file /serialization/Blips.serialized build/ +buildSrc/ /compression/test.gz /compression/test.zip From b87585436d507358d66a2c7094ab491bd3e4f681 Mon Sep 17 00:00:00 2001 From: Benjamin Muschko Date: Thu, 3 Nov 2016 17:15:16 -0400 Subject: [PATCH 138/320] Dependency is only needed for compilation but not runtime --- gradle/subprojects.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/subprojects.gradle b/gradle/subprojects.gradle index a85e6f6de..4acc8bdb3 100644 --- a/gradle/subprojects.gradle +++ b/gradle/subprojects.gradle @@ -65,6 +65,6 @@ configure(subprojects - project(':onjava')) { dependencies { compile project(':onjava') compile 'com.google.guava:guava:19.0' - compile "org.openjdk.jmh:jmh-core:${jmh.jmhVersion}" + compileOnly "org.openjdk.jmh:jmh-core:${jmh.jmhVersion}" } } \ No newline at end of file From 7bb367b454fc8208d5d2bc38e218e2f43b643237 Mon Sep 17 00:00:00 2001 From: Bruce Eckel Date: Thu, 3 Nov 2016 17:00:33 -0700 Subject: [PATCH 139/320] Added Travis URL --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 8d9423dc0..f780794d5 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -![](https://travis-ci.org/BruceEckel/OnJava8-Examples.svg?branch=master) +![https://travis-ci.org/BruceEckel/OnJava8-Examples](https://travis-ci.org/BruceEckel/OnJava8-Examples.svg?branch=master) To compile and run these programs, you only need JDK 8 installed. Invoking `gradlew` will automatically download and install Gradle. From 83c1841cd6ef11de10f465441ddd042d1076544a Mon Sep 17 00:00:00 2001 From: Benjamin Muschko Date: Sun, 6 Nov 2016 08:10:12 -0500 Subject: [PATCH 140/320] Integrated Checkstyle and FindBugs --- build.gradle | 3 +- gradle/checkstyle.gradle | 17 ++++ gradle/code-analysis.gradle | 27 ------ gradle/findbugs.gradle | 16 ++++ sun_checks.xml | 178 ++++++++++++++++++++++++++++++++++++ 5 files changed, 213 insertions(+), 28 deletions(-) create mode 100644 gradle/checkstyle.gradle delete mode 100644 gradle/code-analysis.gradle create mode 100644 gradle/findbugs.gradle create mode 100644 sun_checks.xml diff --git a/build.gradle b/build.gradle index 63b5541b4..afd39a4a6 100644 --- a/build.gradle +++ b/build.gradle @@ -16,7 +16,8 @@ subprojects { apply from: "$rootProject.projectDir/gradle/java.gradle" apply from: "$rootProject.projectDir/gradle/junit-jupiter.gradle" apply from: "$rootProject.projectDir/gradle/jmh.gradle" - apply from: "$rootProject.projectDir/gradle/code-analysis.gradle" + apply from: "$rootProject.projectDir/gradle/checkstyle.gradle" + apply from: "$rootProject.projectDir/gradle/findbugs.gradle" apply plugin: 'com.mindviewinc.tagging' } diff --git a/gradle/checkstyle.gradle b/gradle/checkstyle.gradle new file mode 100644 index 000000000..68c9d1c5f --- /dev/null +++ b/gradle/checkstyle.gradle @@ -0,0 +1,17 @@ +apply plugin: 'checkstyle' + +checkstyle { + ignoreFailures = true + configFile = new File(rootProject.projectDir, 'sun_checks.xml') +} + +tasks.withType(Checkstyle) { + reports { + xml.enabled = false + html.enabled = true + } +} + +task checkstyle { + dependsOn tasks.withType(Checkstyle) +} \ No newline at end of file diff --git a/gradle/code-analysis.gradle b/gradle/code-analysis.gradle deleted file mode 100644 index db50436b6..000000000 --- a/gradle/code-analysis.gradle +++ /dev/null @@ -1,27 +0,0 @@ -//apply plugin: 'checkstyle' -//apply plugin: 'findbugs' - - // See: http://blog.jessitron.com/2012/07/using-checkstyle-in-gradle.html - // https://github.com/checkstyle/checkstyle/blob/master/src/main/resources/google_checks.xml - // http://checkstyle.sourceforge.net/reports/google-java-style.html -/* checkstyle { - // configFile = new File(rootDir, "checkstyle.xml") - toolVersion = '6.7' - }*/ - -/* findbugsMain { - reports { - xml.enabled = false - html.enabled = true - } - ignoreFailures = true - } - - findbugsJmh { - reports { - xml.enabled = false - html.enabled = true - } - ignoreFailures = true - } -*/ \ No newline at end of file diff --git a/gradle/findbugs.gradle b/gradle/findbugs.gradle new file mode 100644 index 000000000..7ae0b51bb --- /dev/null +++ b/gradle/findbugs.gradle @@ -0,0 +1,16 @@ +apply plugin: 'findbugs' + +findbugs { + ignoreFailures = true +} + +tasks.withType(FindBugs) { + reports { + xml.enabled = false + html.enabled = true + } +} + +task findbugs { + dependsOn tasks.withType(FindBugs) +} \ No newline at end of file diff --git a/sun_checks.xml b/sun_checks.xml new file mode 100644 index 000000000..34380c590 --- /dev/null +++ b/sun_checks.xml @@ -0,0 +1,178 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file From 65504adcb2a59ff5430d7961b7ad1a0911115847 Mon Sep 17 00:00:00 2001 From: Benjamin Muschko Date: Sun, 6 Nov 2016 08:11:12 -0500 Subject: [PATCH 141/320] Build does more than just compilation classes --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index f780794d5..462939992 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,7 @@ and run the Java examples in the book. To compile everything, the command is: -`gradlew build` +`gradlew classes` To run everything (including compiling if necessary), the command is: @@ -15,7 +15,7 @@ To run everything (including compiling if necessary), the command is: To compile only a single chapter (including dependencies), use for example: -`gradlew :strings:build` +`gradlew :strings:classes` To run only a single chapter, say: From 5960d4d97da9c5c8a280d949f6aa1dde111a8230 Mon Sep 17 00:00:00 2001 From: Benjamin Muschko Date: Sun, 6 Nov 2016 09:32:37 -0500 Subject: [PATCH 142/320] Add group and description for tasks --- gradle/checkstyle.gradle | 2 ++ gradle/findbugs.gradle | 2 ++ 2 files changed, 4 insertions(+) diff --git a/gradle/checkstyle.gradle b/gradle/checkstyle.gradle index 68c9d1c5f..5ba4048df 100644 --- a/gradle/checkstyle.gradle +++ b/gradle/checkstyle.gradle @@ -13,5 +13,7 @@ tasks.withType(Checkstyle) { } task checkstyle { + group = 'Verification' + description = 'Runs Checkstyle analysis for all classes.' dependsOn tasks.withType(Checkstyle) } \ No newline at end of file diff --git a/gradle/findbugs.gradle b/gradle/findbugs.gradle index 7ae0b51bb..4c0631ce9 100644 --- a/gradle/findbugs.gradle +++ b/gradle/findbugs.gradle @@ -12,5 +12,7 @@ tasks.withType(FindBugs) { } task findbugs { + group = 'Verification' + description = 'Runs FindBugs analysis for all classes.' dependsOn tasks.withType(FindBugs) } \ No newline at end of file From 3b71a730189104ab334fc0e59e8a24cc47cb2817 Mon Sep 17 00:00:00 2001 From: Bruce Eckel Date: Sun, 6 Nov 2016 08:23:21 -0800 Subject: [PATCH 143/320] Link --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index f780794d5..367f765bf 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -![https://travis-ci.org/BruceEckel/OnJava8-Examples](https://travis-ci.org/BruceEckel/OnJava8-Examples.svg?branch=master) +[![](https://travis-ci.org/BruceEckel/OnJava8-Examples.svg?branch=master)](https://travis-ci.org/BruceEckel/OnJava8-Examples) To compile and run these programs, you only need JDK 8 installed. Invoking `gradlew` will automatically download and install Gradle. From bfd04a0686974fa277cc4d780882d03617dacb32 Mon Sep 17 00:00:00 2001 From: Bruce Eckel Date: Wed, 9 Nov 2016 08:50:05 -0800 Subject: [PATCH 144/320] Use new version 1.16 --- gradle/jmh.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gradle/jmh.gradle b/gradle/jmh.gradle index 39e3b2745..273c857c1 100644 --- a/gradle/jmh.gradle +++ b/gradle/jmh.gradle @@ -9,9 +9,9 @@ sourceSets { } jmh { - jmhVersion = '1.15' + jmhVersion = '1.16' duplicateClassesStrategy = 'warn' failOnError = true // See https://github.com/melix/jmh-gradle-plugin // for other options -} \ No newline at end of file +} From 6fd694af7e234d51733056a59a6a77b5b27c0a26 Mon Sep 17 00:00:00 2001 From: Benjamin Muschko Date: Wed, 9 Nov 2016 15:00:05 -0500 Subject: [PATCH 145/320] Only analyze the main source set --- gradle/checkstyle.gradle | 7 +------ gradle/findbugs.gradle | 7 +------ 2 files changed, 2 insertions(+), 12 deletions(-) diff --git a/gradle/checkstyle.gradle b/gradle/checkstyle.gradle index 5ba4048df..58b178a46 100644 --- a/gradle/checkstyle.gradle +++ b/gradle/checkstyle.gradle @@ -3,6 +3,7 @@ apply plugin: 'checkstyle' checkstyle { ignoreFailures = true configFile = new File(rootProject.projectDir, 'sun_checks.xml') + sourceSets = [sourceSets.main] } tasks.withType(Checkstyle) { @@ -10,10 +11,4 @@ tasks.withType(Checkstyle) { xml.enabled = false html.enabled = true } -} - -task checkstyle { - group = 'Verification' - description = 'Runs Checkstyle analysis for all classes.' - dependsOn tasks.withType(Checkstyle) } \ No newline at end of file diff --git a/gradle/findbugs.gradle b/gradle/findbugs.gradle index 4c0631ce9..f7e6383ba 100644 --- a/gradle/findbugs.gradle +++ b/gradle/findbugs.gradle @@ -2,6 +2,7 @@ apply plugin: 'findbugs' findbugs { ignoreFailures = true + sourceSets = [sourceSets.main] } tasks.withType(FindBugs) { @@ -9,10 +10,4 @@ tasks.withType(FindBugs) { xml.enabled = false html.enabled = true } -} - -task findbugs { - group = 'Verification' - description = 'Runs FindBugs analysis for all classes.' - dependsOn tasks.withType(FindBugs) } \ No newline at end of file From efe452530363331d6a3984a9ea0729bf75bce71b Mon Sep 17 00:00:00 2001 From: Bruce Eckel Date: Thu, 10 Nov 2016 11:28:12 -0800 Subject: [PATCH 146/320] Test with Gradle 3.2-rc-3 --- gradle/wrapper/gradle-wrapper.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 7b6432035..49ba90b4e 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-3.1-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-3.2-rc-3-bin.zip From c6149755f530b70b8bbcf000a3ac66363815eb26 Mon Sep 17 00:00:00 2001 From: Bruce Eckel Date: Tue, 15 Nov 2016 15:11:16 -0800 Subject: [PATCH 147/320] Change name from sun_checks.xml --- sun_checks.xml => checkstyle.xml | 0 gradle/checkstyle.gradle | 4 ++-- gradle/wrapper/gradle-wrapper.properties | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) rename sun_checks.xml => checkstyle.xml (100%) diff --git a/sun_checks.xml b/checkstyle.xml similarity index 100% rename from sun_checks.xml rename to checkstyle.xml diff --git a/gradle/checkstyle.gradle b/gradle/checkstyle.gradle index 58b178a46..0f0e60865 100644 --- a/gradle/checkstyle.gradle +++ b/gradle/checkstyle.gradle @@ -2,7 +2,7 @@ apply plugin: 'checkstyle' checkstyle { ignoreFailures = true - configFile = new File(rootProject.projectDir, 'sun_checks.xml') + configFile = new File(rootProject.projectDir, 'checkstyle.xml') sourceSets = [sourceSets.main] } @@ -11,4 +11,4 @@ tasks.withType(Checkstyle) { xml.enabled = false html.enabled = true } -} \ No newline at end of file +} diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 49ba90b4e..94051b31a 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-3.2-rc-3-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-3.2-bin.zip From 0d4007c1b86321a959f70a970ce7ded732118b86 Mon Sep 17 00:00:00 2001 From: Bruce Eckel Date: Wed, 16 Nov 2016 08:56:45 -0800 Subject: [PATCH 148/320] partway through getting clean checkstyle --- checkstyle.xml | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/checkstyle.xml b/checkstyle.xml index 34380c590..837381688 100644 --- a/checkstyle.xml +++ b/checkstyle.xml @@ -41,11 +41,11 @@ - + - + @@ -79,11 +79,11 @@ - + @@ -100,7 +100,7 @@ - + @@ -116,7 +116,7 @@ - + @@ -136,22 +136,22 @@ - + - + - + - + @@ -159,20 +159,20 @@ - + - + - + - + - \ No newline at end of file + From 685194e8845948d8960911d5fc960defcd03528d Mon Sep 17 00:00:00 2001 From: Bruce Eckel Date: Wed, 16 Nov 2016 17:36:30 -0800 Subject: [PATCH 149/320] Ignore inner assignment warning --- checkstyle.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/checkstyle.xml b/checkstyle.xml index 837381688..bac792509 100644 --- a/checkstyle.xml +++ b/checkstyle.xml @@ -150,7 +150,7 @@ - + From 205b794e489bb37fbf5db3a3a7eff3b16ad97cf8 Mon Sep 17 00:00:00 2001 From: Bruce Eckel Date: Wed, 16 Nov 2016 22:16:26 -0800 Subject: [PATCH 150/320] hide more tests --- checkstyle.xml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/checkstyle.xml b/checkstyle.xml index bac792509..8731d2620 100644 --- a/checkstyle.xml +++ b/checkstyle.xml @@ -110,7 +110,7 @@ - + @@ -146,7 +146,7 @@ - + @@ -154,7 +154,7 @@ - + @@ -162,7 +162,7 @@ - + From fda0e2dee608e958a9bf24795363de5cd576dc4c Mon Sep 17 00:00:00 2001 From: Bruce Eckel Date: Mon, 21 Nov 2016 12:37:57 -0800 Subject: [PATCH 151/320] Checkstyle and Findbugs changes Also changed comment callouts from // (1) to // [1] --- Copyright.txt | 8 +- ShowFindbugs.py | 10 ++ annotations/AtUnitComposition.java | 8 +- annotations/AtUnitExternalTest.java | 8 +- annotations/HashSetTest.java | 8 +- annotations/SimulatingNull.java | 4 +- annotations/StackLStringTest.java | 12 +- annotations/UseCase.java | 4 +- annotations/database/DBTable.java | 2 +- annotations/database/Uniqueness.java | 2 +- annotations/ifx/ExtractInterface.java | 2 +- arrays/AlphabeticSearch.java | 20 ++- arrays/ArrayCopying.java | 12 +- arrays/ArraySearching.java | 4 +- arrays/ComparingArrays.java | 4 +- arrays/ModifyExisting.java | 2 +- arrays/ParallelPrefix1.java | 4 +- arrays/ParallelSetAll.java | 8 +- arrays/RaggedArray.java | 2 +- arrays/SimpleSetAll.java | 8 +- arrays/StreamFromArray.java | 4 +- arrays/TestConvertTo.java | 18 +-- arrays/TestCount.java | 22 ++-- arrays/TestRand.java | 22 ++-- arrays/jmh/ParallelSort.java | 2 +- collections/CollectionSequence.java | 2 +- collections/Statistics.java | 2 +- control/BreakAndContinue.java | 6 +- control/ForInFloat.java | 2 +- control/IfElse.java | 2 +- enums/TrafficLight.java | 2 +- exceptions/CleanupIdiom.java | 6 +- exceptions/StormyInning.java | 6 +- exceptions/StreamsAreAutoCloseable.java | 4 +- .../{File_System.java => FileSystemDemo.java} | 4 +- files/Writing.java | 4 +- functional/AnonymousClosure.java | 2 +- functional/BiConsumerPermutations.java | 6 +- functional/Closure1.java | 2 +- functional/Closure2.java | 2 +- functional/Closure3.java | 2 +- functional/Closure4.java | 2 +- functional/Closure5.java | 2 +- functional/Closure6.java | 8 +- functional/Closure7.java | 2 +- functional/Closure8.java | 6 +- functional/Closure9.java | 2 +- functional/CtorReference.java | 6 +- functional/CurryingAndPartials.java | 4 +- functional/LambdaExpressions.java | 10 +- functional/MethodReferences.java | 20 +-- functional/MultiUnbound.java | 14 +-- functional/ProduceFunction.java | 4 +- functional/SharedStorage.java | 6 +- functional/Strategize.java | 12 +- functional/UnboundMethodReference.java | 4 +- generics/DogsAndRobotMethodReferences.java | 16 +-- generics/DynamicProxyMixin.java | 8 +- generics/GenericsAndCovariance.java | 2 +- generics/Holder.java | 13 +- generics/PrimitiveGenericTest.java | 2 +- generics/Store.java | 4 +- generics/TupleTest.java | 2 +- go.bat | 3 - hiding/Lunch.java | 4 +- housekeeping/ExplicitStatic.java | 6 +- housekeeping/Mugs.java | 2 +- innerclasses/BigEgg.java | 2 +- innerclasses/Parcel11.java | 2 +- innerclasses/Parcel5.java | 2 +- innerclasses/Parcel8.java | 4 +- innerclasses/TestParcel.java | 3 +- innerclasses/controller/Event.java | 4 +- interfaces/AbstractAccess.java | 2 +- interfaces/Applicator.java | 2 +- interfaces/RandomDoubles.java | 6 +- interfaces/RandomWords.java | 12 +- .../interfaceprocessor/StringProcessor.java | 12 +- onjava/ConvertTo.java | 32 ++--- onjava/Count.java | 26 ++-- onjava/HTMLColors.java | 16 +-- onjava/MouseClick.java | 8 +- onjava/Rand.java | 28 ++--- onjava/Suppliers.java | 1 - onjava/Tuple2.java | 8 +- onjava/Tuple3.java | 6 +- onjava/Tuple4.java | 6 +- onjava/Tuple5.java | 6 +- onjava/atunit/ClassNameFinder.java | 48 ++++---- operators/Precedence.java | 4 +- operators/Underscores.java | 4 +- patterns/PaperScissorsRock.java | 8 +- patterns/ShapeFactory2.java | 8 +- patterns/factory/ShapeFactory1.java | 3 +- patterns/recyclea/RecycleA.java | 4 +- patterns/state/StateMachineDemo.java | 4 +- patterns/visitor/BeeAndFlowers.java | 4 +- patterns/visualobserver/BoxObserver.java | 6 +- references/Alias1.java | 2 +- references/CopyConstructor.java | 2 +- references/ImmutableInteger.java | 2 +- reuse/SprinklerSystem.java | 2 +- streams/ForEach.java | 8 +- streams/Optionals.java | 16 +-- streams/Reduce.java | 4 +- strings/BetterRead.java | 4 +- strings/Conversion.java | 96 +++++++-------- strings/Groups.java | 2 +- strings/ReceiptBuilder.java | 12 +- strings/SimpleFormat.java | 4 +- strings/SimpleRead.java | 4 +- strings/ThreatAnalyzer.java | 2 +- strings/Turtle.java | 2 +- threads/CachedThreadPool3.java | 4 +- threads/CarBuilder.java | 4 +- threads/Futures.java | 2 +- threads/ParallelStreamPuzzle.java | 2 +- threads/ParallelStreamPuzzle2.java | 2 +- threads/Prime.java | 2 +- threads/Summing.java | 6 +- threads/Summing2.java | 6 +- threads/Summing3.java | 18 +-- threads/Summing4.java | 6 +- threads/restaurant2/RestaurantWithQueues.java | 2 +- typeinfo/ClassInitialization.java | 8 +- typeinfo/HiddenImplementation.java | 2 +- typeinfo/PetCount2.java | 2 +- typeinfo/PetCount3.java | 2 +- typeinfo/Robot.java | 2 +- typeinfo/Shapes.java | 2 +- typeinfo/pets/ForNameCreator.java | 2 +- typeinfo/pets/LiteralPetCreator.java | 12 +- typeinfo/pets/Pets.java | 8 +- .../CollectionMethods.java | 116 ++++++++++++------ understandingcollections/HTMLColorTest.java | 10 +- understandingcollections/SetOrder.java | 4 +- understandingcollections/TypesForSets.java | 23 ++-- understandingcollections/jmh/Deques.java | 1 + understandingcollections/jmh/Lists.java | 1 + understandingcollections/jmh/Maps.java | 1 + understandingcollections/jmh/Queues.java | 1 + understandingcollections/jmh/Sets.java | 1 + validating/Inverter4.java | 4 +- validating/SLF4JLevels.java | 2 +- validating/SLF4JLogging.java | 2 +- validating/StringInverter.java | 2 +- 146 files changed, 590 insertions(+), 533 deletions(-) create mode 100644 ShowFindbugs.py rename files/{File_System.java => FileSystemDemo.java} (95%) delete mode 100644 go.bat diff --git a/Copyright.txt b/Copyright.txt index 8f25e3a2b..3470ee0eb 100644 --- a/Copyright.txt +++ b/Copyright.txt @@ -1,5 +1,5 @@ // Copyright.txt -This computer source code is Copyright ©2016 MindView LLC +This computer source code is Copyright ©2016 MindView LLC. All Rights Reserved. Permission to use, copy, modify, and distribute this @@ -16,7 +16,7 @@ personal and commercial software programs. 2. Permission is granted to use the Source Code without modification in classroom situations, including in presentation materials, provided that the book "On -Java" is cited as the origin. +Java 8" is cited as the origin. 3. Permission to incorporate the Source Code into printed media may be obtained by contacting: @@ -64,9 +64,9 @@ ENHANCEMENTS, OR MODIFICATIONS. Please note that MindView LLC maintains a Web site which is the sole distribution point for electronic copies of the -Source Code, https://github.com/BruceEckel/OnJava-Examples, +Source Code, https://github.com/BruceEckel/OnJava8-examples, where it is freely available under the terms stated above. If you think you've found an error in the Source Code, please submit a correction at: -https://github.com/BruceEckel/OnJava-Examples/issues +https://github.com/BruceEckel/OnJava8-examples/issues diff --git a/ShowFindbugs.py b/ShowFindbugs.py new file mode 100644 index 000000000..ec11f8fb6 --- /dev/null +++ b/ShowFindbugs.py @@ -0,0 +1,10 @@ +#! py -3 +# Requires Python 3.5 +# Displays all the Findbugs main.html reports from "On Java 8" on Windows +# Must run "gradlew findbugsMain" first +from pathlib import Path +import os + +cmds = ["start " + str(report) for report in Path(".").rglob("main.html")] +(Path(".") / "ShowFindbugs.bat").write_text("\n".join(cmds).strip() + "\n") +os.system("ShowFindbugs.bat") diff --git a/annotations/AtUnitComposition.java b/annotations/AtUnitComposition.java index 87ecb6922..90a462a39 100644 --- a/annotations/AtUnitComposition.java +++ b/annotations/AtUnitComposition.java @@ -11,18 +11,18 @@ public class AtUnitComposition { AtUnitExample1 testObject = new AtUnitExample1(); - @Test boolean _methodOne() { + @Test boolean tMethodOne() { return testObject.methodOne().equals("This is methodOne"); } - @Test boolean _methodTwo() { + @Test boolean tMethodTwo() { return testObject.methodTwo() == 2; } } /* Output: annotations.AtUnitComposition - . _methodOne - . _methodTwo This is methodTwo + . tMethodOne + . tMethodTwo This is methodTwo OK (2 tests) */ diff --git a/annotations/AtUnitExternalTest.java b/annotations/AtUnitExternalTest.java index c7659c6f4..960eca71e 100644 --- a/annotations/AtUnitExternalTest.java +++ b/annotations/AtUnitExternalTest.java @@ -10,15 +10,15 @@ import onjava.*; public class AtUnitExternalTest extends AtUnitExample1 { - @Test boolean _methodOne() { + @Test boolean tMethodOne() { return methodOne().equals("This is methodOne"); } - @Test boolean _methodTwo() { return methodTwo() == 2; } + @Test boolean tMethodTwo() { return methodTwo() == 2; } } /* Output: annotations.AtUnitExternalTest - . _methodTwo This is methodTwo + . tMethodTwo This is methodTwo - . _methodOne + . tMethodOne OK (2 tests) */ diff --git a/annotations/HashSetTest.java b/annotations/HashSetTest.java index 7ea3ce2c6..744e214da 100644 --- a/annotations/HashSetTest.java +++ b/annotations/HashSetTest.java @@ -14,11 +14,11 @@ public class HashSetTest { @Test void initialization() { assert testObject.isEmpty(); } - @Test void _contains() { + @Test void tContains() { testObject.add("one"); assert testObject.contains("one"); } - @Test void _remove() { + @Test void tRemove() { testObject.add("one"); testObject.remove("one"); assert testObject.isEmpty(); @@ -26,8 +26,8 @@ public class HashSetTest { } /* Output: annotations.HashSetTest - . _remove - . _contains + . tRemove + . tContains . initialization OK (3 tests) */ diff --git a/annotations/SimulatingNull.java b/annotations/SimulatingNull.java index 7b63b9468..45f4637a5 100644 --- a/annotations/SimulatingNull.java +++ b/annotations/SimulatingNull.java @@ -7,6 +7,6 @@ @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) public @interface SimulatingNull { - public int id() default -1; - public String description() default ""; + int id() default -1; + String description() default ""; } diff --git a/annotations/StackLStringTest.java b/annotations/StackLStringTest.java index 62e7783ba..ac551affe 100644 --- a/annotations/StackLStringTest.java +++ b/annotations/StackLStringTest.java @@ -10,19 +10,19 @@ import onjava.*; public class StackLStringTest extends StackL { - @Test void _push() { + @Test void tPush() { push("one"); assert top().equals("one"); push("two"); assert top().equals("two"); } - @Test void _pop() { + @Test void tPop() { push("one"); push("two"); assert pop().equals("two"); assert pop().equals("one"); } - @Test void _top() { + @Test void tTop() { push("A"); push("B"); assert top().equals("B"); @@ -31,8 +31,8 @@ public class StackLStringTest extends StackL { } /* Output: annotations.StackLStringTest - . _pop - . _top - . _push + . tPop + . tTop + . tPush OK (3 tests) */ diff --git a/annotations/UseCase.java b/annotations/UseCase.java index 7dc851a37..4d354db5b 100644 --- a/annotations/UseCase.java +++ b/annotations/UseCase.java @@ -7,6 +7,6 @@ @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) public @interface UseCase { - public int id(); - public String description() default "no description"; + int id(); + String description() default "no description"; } diff --git a/annotations/database/DBTable.java b/annotations/database/DBTable.java index 8cdad9b68..53b9ac444 100644 --- a/annotations/database/DBTable.java +++ b/annotations/database/DBTable.java @@ -8,5 +8,5 @@ @Target(ElementType.TYPE) // Applies to classes only @Retention(RetentionPolicy.RUNTIME) public @interface DBTable { - public String name() default ""; + String name() default ""; } diff --git a/annotations/database/Uniqueness.java b/annotations/database/Uniqueness.java index b1adc3196..bbbb3f22d 100644 --- a/annotations/database/Uniqueness.java +++ b/annotations/database/Uniqueness.java @@ -7,5 +7,5 @@ public @interface Uniqueness { Constraints constraints() - default @Constraints(unique = true); + default @Constraints(unique = true); } diff --git a/annotations/ifx/ExtractInterface.java b/annotations/ifx/ExtractInterface.java index bef18673c..8138f2633 100644 --- a/annotations/ifx/ExtractInterface.java +++ b/annotations/ifx/ExtractInterface.java @@ -9,5 +9,5 @@ @Target(ElementType.TYPE) @Retention(RetentionPolicy.SOURCE) public @interface ExtractInterface { - public String interfaceName() default "-!!-"; + String interfaceName() default "-!!-"; } diff --git a/arrays/AlphabeticSearch.java b/arrays/AlphabeticSearch.java index 1ede5c2f8..28ae7a7dd 100644 --- a/arrays/AlphabeticSearch.java +++ b/arrays/AlphabeticSearch.java @@ -2,7 +2,7 @@ // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. -// Searching with a Comparator +// Searching with a Comparator import import java.util.*; import onjava.*; import static onjava.ArrayShow.*; @@ -12,18 +12,14 @@ public static void main(String[] args) { String[] sa = new Rand.String().array(30); Arrays.sort(sa, String.CASE_INSENSITIVE_ORDER); show(sa); - int index = Arrays.binarySearch(sa, sa[10], - String.CASE_INSENSITIVE_ORDER); - System.out.println( - "Index: "+ index + "\n"+ sa[index]); + int index = Arrays.binarySearch(sa, + sa[10], String.CASE_INSENSITIVE_ORDER); + System.out.println( "Index: "+ index + "\n"+ sa[index]); } } /* Output: -[anmkkyh, bhmupju, btpenpc, cjwzmmr, cuxszgv, eloztdv, -ewcippc, ezdeklu, fcjpthl, fqmlgsh, gmeinne, hyoubzl, -jbvlgwc, jlxpqds, ljlbynx, mvducuj, qgekgly, skddcat, -taprwxz, uybypgp, vjsszkn, vniyapk, vqqakbm, vwodhcf, -ydpulcq, ygpoalk, yskvett, zehpfmm, zofmmvm, zrxmclh] -Index: 10 -gmeinne +[anmkkyh, bhmupju, btpenpc, cjwzmmr, cuxszgv, +eloztdv, ewcippc, ezdeklu, fcjpthl, fqmlgsh, gmeinne, hyoubzl, jbvlgwc, jlxpqds, +ljlbynx, mvducuj, qgekgly, skddcat, taprwxz, uybypgp, vjsszkn, vniyapk, vqqakbm, +vwodhcf, ydpulcq, ygpoalk, yskvett, zehpfmm, zofmmvm, zrxmclh] Index: 10 gmeinne */ diff --git a/arrays/ArrayCopying.java b/arrays/ArrayCopying.java index 88b842329..14a29e57c 100644 --- a/arrays/ArrayCopying.java +++ b/arrays/ArrayCopying.java @@ -26,21 +26,21 @@ public static void main(String[] args) { int[] a1 = new int[SZ]; Arrays.setAll(a1, new Count.Integer()::get); show("a1", a1); - int[] a2 = Arrays.copyOf(a1, a1.length); // (1) + int[] a2 = Arrays.copyOf(a1, a1.length); // [1] // Prove they are distinct arrays: Arrays.fill(a1, 1); show("a1", a1); show("a2", a2); // Create a shorter result: - a2 = Arrays.copyOf(a2, a2.length/2); // (2) + a2 = Arrays.copyOf(a2, a2.length/2); // [2] show("a2", a2); // Allocate more space: a2 = Arrays.copyOf(a2, a2.length + 5); show("a2", a2); // Also copies wrapped arrays: - Integer[] a3 = new Integer[SZ]; // (3) + Integer[] a3 = new Integer[SZ]; // [3] Arrays.setAll(a3, new Count.Integer()::get); Integer[] a4 = Arrays.copyOfRange(a3, 4, 12); show("a4", a4); @@ -49,12 +49,12 @@ public static void main(String[] args) { Arrays.setAll(d, Sub::new); // Produce Sup[] from Sub[]: Sup[] b = - Arrays.copyOf(d, d.length, Sup[].class); // (4) + Arrays.copyOf(d, d.length, Sup[].class); // [4] show(b); // This "downcast" works fine: Sub[] d2 = - Arrays.copyOf(b, b.length, Sub[].class); // (5) + Arrays.copyOf(b, b.length, Sub[].class); // [5] show(d2); // Bad "downcast" compiles but throws exception: @@ -62,7 +62,7 @@ public static void main(String[] args) { Arrays.setAll(b2, Sup::new); try { Sub[] d3 = - Arrays.copyOf(b2, b2.length, Sub[].class); // (6) + Arrays.copyOf(b2, b2.length, Sub[].class); // [6] } catch(Exception e) { System.out.println(e); } diff --git a/arrays/ArraySearching.java b/arrays/ArraySearching.java index baf7878fb..1bc07752d 100644 --- a/arrays/ArraySearching.java +++ b/arrays/ArraySearching.java @@ -9,8 +9,8 @@ public class ArraySearching { public static void main(String[] args) { - Rand.int_ rand = new Rand.int_(); - int[] a = new Rand.int_().array(25); + Rand.Pint rand = new Rand.Pint(); + int[] a = new Rand.Pint().array(25); Arrays.sort(a); show("Sorted array", a); while(true) { diff --git a/arrays/ComparingArrays.java b/arrays/ComparingArrays.java index b146e3ddd..ac964d061 100644 --- a/arrays/ComparingArrays.java +++ b/arrays/ComparingArrays.java @@ -8,7 +8,7 @@ public class ComparingArrays { public static final int SZ = 15; - static String[][] TwoDArray() { + static String[][] twoDArray() { String[][] md = new String[5][]; Arrays.setAll(md, n -> new String[n]); for(int i = 0; i < md.length; i++) @@ -35,7 +35,7 @@ public static void main(String[] args) { System.out.println( "a1w == a2w: " + Arrays.equals(a1w, a2w)); - String[][] md1 = TwoDArray(), md2 = TwoDArray(); + String[][] md1 = twoDArray(), md2 = twoDArray(); System.out.println(Arrays.deepToString(md1)); System.out.println("deepEquals(md1, md2): " + Arrays.deepEquals(md1, md2)); diff --git a/arrays/ModifyExisting.java b/arrays/ModifyExisting.java index 664c4fe6a..4bf9036cf 100644 --- a/arrays/ModifyExisting.java +++ b/arrays/ModifyExisting.java @@ -11,7 +11,7 @@ public static void main(String[] args) { double[] da = new double[7]; Arrays.setAll(da, new Rand.Double()::get); show(da); - Arrays.setAll(da, n -> da[n] / 100); // (1) + Arrays.setAll(da, n -> da[n] / 100); // [1] show(da); } } diff --git a/arrays/ParallelPrefix1.java b/arrays/ParallelPrefix1.java index 1e3a45b83..6ad28a879 100644 --- a/arrays/ParallelPrefix1.java +++ b/arrays/ParallelPrefix1.java @@ -8,14 +8,14 @@ public class ParallelPrefix1 { public static void main(String[] args) { - int[] nums = new Count.int_().array(10); + int[] nums = new Count.Pint().array(10); show(nums); System.out.println(Arrays.stream(nums) .reduce(Integer::sum).getAsInt()); Arrays.parallelPrefix(nums, Integer::sum); show(nums); System.out.println(Arrays.stream( - new Count.int_().array(6)) + new Count.Pint().array(6)) .reduce(Integer::sum).getAsInt()); } } diff --git a/arrays/ParallelSetAll.java b/arrays/ParallelSetAll.java index cda4a8a07..6ef1486c8 100644 --- a/arrays/ParallelSetAll.java +++ b/arrays/ParallelSetAll.java @@ -9,13 +9,13 @@ public class ParallelSetAll { static final int SIZE = 10_000_000; static void intArray() { int[] ia = new int[SIZE]; - Arrays.setAll(ia, new Rand.int_()::get); - Arrays.parallelSetAll(ia, new Rand.int_()::get); + Arrays.setAll(ia, new Rand.Pint()::get); + Arrays.parallelSetAll(ia, new Rand.Pint()::get); } static void longArray() { long[] la = new long[SIZE]; - Arrays.setAll(la, new Rand.long_()::get); - Arrays.parallelSetAll(la, new Rand.long_()::get); + Arrays.setAll(la, new Rand.Plong()::get); + Arrays.parallelSetAll(la, new Rand.Plong()::get); } public static void main(String[] args) { intArray(); diff --git a/arrays/RaggedArray.java b/arrays/RaggedArray.java index b667a2b95..70c913ded 100644 --- a/arrays/RaggedArray.java +++ b/arrays/RaggedArray.java @@ -14,7 +14,7 @@ public static void main(String[] args) { a[i] = new int[rand.nextInt(5)][]; for(int j = 0; j < a[i].length; j++) { a[i][j] = new int[rand.nextInt(5)]; - Arrays.setAll(a[i][j], n -> val++); // (1) + Arrays.setAll(a[i][j], n -> val++); // [1] } } System.out.println(Arrays.deepToString(a)); diff --git a/arrays/SimpleSetAll.java b/arrays/SimpleSetAll.java index 74cccbe42..82ec6ec63 100644 --- a/arrays/SimpleSetAll.java +++ b/arrays/SimpleSetAll.java @@ -22,13 +22,13 @@ public static void main(String[] args) { int[] ia = new int[SZ]; long[] la = new long[SZ]; double[] da = new double[SZ]; - Arrays.setAll(ia, n -> n); // (1) + Arrays.setAll(ia, n -> n); // [1] Arrays.setAll(la, n -> n); Arrays.setAll(da, n -> n); show(ia); show(la); show(da); - Arrays.setAll(ia, n -> val++); // (2) + Arrays.setAll(ia, n -> val++); // [2] Arrays.setAll(la, n -> val++); Arrays.setAll(da, n -> val++); show(ia); @@ -36,11 +36,11 @@ public static void main(String[] args) { show(da); Bob[] ba = new Bob[SZ]; - Arrays.setAll(ba, Bob::new); // (3) + Arrays.setAll(ba, Bob::new); // [3] show(ba); Character[] ca = new Character[SZ]; - Arrays.setAll(ca, SimpleSetAll::getChar); // (4) + Arrays.setAll(ca, SimpleSetAll::getChar); // [4] show(ca); } } diff --git a/arrays/StreamFromArray.java b/arrays/StreamFromArray.java index b5c5176f8..0f9855405 100644 --- a/arrays/StreamFromArray.java +++ b/arrays/StreamFromArray.java @@ -14,7 +14,7 @@ public static void main(String[] args) { .map(ss -> ss + "!") .forEach(System.out::println); - int[] ia = new Rand.int_().array(10); + int[] ia = new Rand.Pint().array(10); Arrays.stream(ia) .skip(3) .limit(5) @@ -32,7 +32,7 @@ public static void main(String[] args) { //- Arrays.stream(new float[10]); // For the other types you must use wrapped arrays: - float[] fa = new Rand.float_().array(10); + float[] fa = new Rand.Pfloat().array(10); Arrays.stream(ConvertTo.boxed(fa)); Arrays.stream(new Rand.Float().array(10)); } diff --git a/arrays/TestConvertTo.java b/arrays/TestConvertTo.java index fe3126880..0a0132f03 100644 --- a/arrays/TestConvertTo.java +++ b/arrays/TestConvertTo.java @@ -8,58 +8,58 @@ import static onjava.ConvertTo.*; public class TestConvertTo { - static final int size = 6; + static final int SIZE = 6; public static void main(String[] args) { - Boolean[] a1 = new Boolean[size]; + Boolean[] a1 = new Boolean[SIZE]; Arrays.setAll(a1, new Rand.Boolean()::get); boolean[] a1p = primitive(a1); show("a1p", a1p); Boolean[] a1b = boxed(a1p); show("a1b", a1b); - Byte[] a2 = new Byte[size]; + Byte[] a2 = new Byte[SIZE]; Arrays.setAll(a2, new Rand.Byte()::get); byte[] a2p = primitive(a2); show("a2p", a2p); Byte[] a2b = boxed(a2p); show("a2b", a2b); - Character[] a3 = new Character[size]; + Character[] a3 = new Character[SIZE]; Arrays.setAll(a3, new Rand.Character()::get); char[] a3p = primitive(a3); show("a3p", a3p); Character[] a3b = boxed(a3p); show("a3b", a3b); - Short[] a4 = new Short[size]; + Short[] a4 = new Short[SIZE]; Arrays.setAll(a4, new Rand.Short()::get); short[] a4p = primitive(a4); show("a4p", a4p); Short[] a4b = boxed(a4p); show("a4b", a4b); - Integer[] a5 = new Integer[size]; + Integer[] a5 = new Integer[SIZE]; Arrays.setAll(a5, new Rand.Integer()::get); int[] a5p = primitive(a5); show("a5p", a5p); Integer[] a5b = boxed(a5p); show("a5b", a5b); - Long[] a6 = new Long[size]; + Long[] a6 = new Long[SIZE]; Arrays.setAll(a6, new Rand.Long()::get); long[] a6p = primitive(a6); show("a6p", a6p); Long[] a6b = boxed(a6p); show("a6b", a6b); - Float[] a7 = new Float[size]; + Float[] a7 = new Float[SIZE]; Arrays.setAll(a7, new Rand.Float()::get); float[] a7p = primitive(a7); show("a7p", a7p); Float[] a7b = boxed(a7p); show("a7b", a7b); - Double[] a8 = new Double[size]; + Double[] a8 = new Double[SIZE]; Arrays.setAll(a8, new Rand.Double()::get); double[] a8p = primitive(a8); show("a8p", a8p); diff --git a/arrays/TestCount.java b/arrays/TestCount.java index ba02c0460..e05edf229 100644 --- a/arrays/TestCount.java +++ b/arrays/TestCount.java @@ -20,7 +20,7 @@ public static void main(String[] args) { show(a1); a1 = new Count.Boolean().array(SZ + 2); show(a1); - boolean[] a1b = new Count.boolean_().array(SZ + 3); + boolean[] a1b = new Count.Pboolean().array(SZ + 3); show(a1b); System.out.println("Byte"); @@ -32,7 +32,7 @@ public static void main(String[] args) { show(a2); a2 = new Count.Byte().array(SZ + 2); show(a2); - byte[] a2b = new Count.byte_().array(SZ + 3); + byte[] a2b = new Count.Pbyte().array(SZ + 3); show(a2b); System.out.println("Character"); @@ -44,7 +44,7 @@ public static void main(String[] args) { show(a3); a3 = new Count.Character().array(SZ + 2); show(a3); - char[] a3b = new Count.char_().array(SZ + 3); + char[] a3b = new Count.Pchar().array(SZ + 3); show(a3b); System.out.println("Short"); @@ -56,7 +56,7 @@ public static void main(String[] args) { show(a4); a4 = new Count.Short().array(SZ + 2); show(a4); - short[] a4b = new Count.short_().array(SZ + 3); + short[] a4b = new Count.Pshort().array(SZ + 3); show(a4b); System.out.println("Integer"); @@ -68,10 +68,10 @@ public static void main(String[] args) { show(a5b); a5b = new Count.Integer().array(SZ + 2); show(a5b); - a5 = IntStream.generate(new Count.int_()) + a5 = IntStream.generate(new Count.Pint()) .limit(SZ + 1).toArray(); show(a5); - a5 = new Count.int_().array(SZ + 3); + a5 = new Count.Pint().array(SZ + 3); show(a5); System.out.println("Long"); @@ -83,10 +83,10 @@ public static void main(String[] args) { show(a6b); a6b = new Count.Long().array(SZ + 2); show(a6b); - a6 = LongStream.generate(new Count.long_()) + a6 = LongStream.generate(new Count.Plong()) .limit(SZ + 1).toArray(); show(a6); - a6 = new Count.long_().array(SZ + 3); + a6 = new Count.Plong().array(SZ + 3); show(a6); System.out.println("Float"); @@ -98,7 +98,7 @@ public static void main(String[] args) { show(a7); a7 = new Count.Float().array(SZ + 2); show(a7); - float[] a7b = new Count.float_().array(SZ + 3); + float[] a7b = new Count.Pfloat().array(SZ + 3); show(a7b); System.out.println("Double"); @@ -110,10 +110,10 @@ public static void main(String[] args) { show(a8b); a8b = new Count.Double().array(SZ + 2); show(a8b); - a8 = DoubleStream.generate(new Count.double_()) + a8 = DoubleStream.generate(new Count.Pdouble()) .limit(SZ + 1).toArray(); show(a8); - a8 = new Count.double_().array(SZ + 3); + a8 = new Count.Pdouble().array(SZ + 3); show(a8); } } diff --git a/arrays/TestRand.java b/arrays/TestRand.java index f9d61ef2a..39df151f8 100644 --- a/arrays/TestRand.java +++ b/arrays/TestRand.java @@ -20,7 +20,7 @@ public static void main(String[] args) { show(a1); a1 = new Rand.Boolean().array(SZ + 2); show(a1); - boolean[] a1b = new Rand.boolean_().array(SZ + 3); + boolean[] a1b = new Rand.Pboolean().array(SZ + 3); show(a1b); System.out.println("Byte"); @@ -32,7 +32,7 @@ public static void main(String[] args) { show(a2); a2 = new Rand.Byte().array(SZ + 2); show(a2); - byte[] a2b = new Rand.byte_().array(SZ + 3); + byte[] a2b = new Rand.Pbyte().array(SZ + 3); show(a2b); System.out.println("Character"); @@ -44,7 +44,7 @@ public static void main(String[] args) { show(a3); a3 = new Rand.Character().array(SZ + 2); show(a3); - char[] a3b = new Rand.char_().array(SZ + 3); + char[] a3b = new Rand.Pchar().array(SZ + 3); show(a3b); System.out.println("Short"); @@ -56,7 +56,7 @@ public static void main(String[] args) { show(a4); a4 = new Rand.Short().array(SZ + 2); show(a4); - short[] a4b = new Rand.short_().array(SZ + 3); + short[] a4b = new Rand.Pshort().array(SZ + 3); show(a4b); System.out.println("Integer"); @@ -68,10 +68,10 @@ public static void main(String[] args) { show(a5b); a5b = new Rand.Integer().array(SZ + 2); show(a5b); - a5 = IntStream.generate(new Rand.int_()) + a5 = IntStream.generate(new Rand.Pint()) .limit(SZ + 1).toArray(); show(a5); - a5 = new Rand.int_().array(SZ + 3); + a5 = new Rand.Pint().array(SZ + 3); show(a5); System.out.println("Long"); @@ -83,10 +83,10 @@ public static void main(String[] args) { show(a6b); a6b = new Rand.Long().array(SZ + 2); show(a6b); - a6 = LongStream.generate(new Rand.long_()) + a6 = LongStream.generate(new Rand.Plong()) .limit(SZ + 1).toArray(); show(a6); - a6 = new Rand.long_().array(SZ + 3); + a6 = new Rand.Plong().array(SZ + 3); show(a6); System.out.println("Float"); @@ -98,7 +98,7 @@ public static void main(String[] args) { show(a7); a7 = new Rand.Float().array(SZ + 2); show(a7); - float[] a7b = new Rand.float_().array(SZ + 3); + float[] a7b = new Rand.Pfloat().array(SZ + 3); show(a7b); System.out.println("Double"); @@ -110,10 +110,10 @@ public static void main(String[] args) { show(a8b); a8b = new Rand.Double().array(SZ + 2); show(a8b); - a8 = DoubleStream.generate(new Rand.double_()) + a8 = DoubleStream.generate(new Rand.Pdouble()) .limit(SZ + 1).toArray(); show(a8); - a8 = new Rand.double_().array(SZ + 3); + a8 = new Rand.Pdouble().array(SZ + 3); show(a8); System.out.println("String"); diff --git a/arrays/jmh/ParallelSort.java b/arrays/jmh/ParallelSort.java index 20216fa33..2533bc05f 100644 --- a/arrays/jmh/ParallelSort.java +++ b/arrays/jmh/ParallelSort.java @@ -12,7 +12,7 @@ public class ParallelSort { private long[] la; @Setup public void setup() { - la = new Rand.long_().array(100_000); + la = new Rand.Plong().array(100_000); } @Benchmark public void sort() { diff --git a/collections/CollectionSequence.java b/collections/CollectionSequence.java index 0bfbd265b..d805f5f6b 100644 --- a/collections/CollectionSequence.java +++ b/collections/CollectionSequence.java @@ -12,7 +12,7 @@ public class CollectionSequence public int size() { return pets.length; } @Override public Iterator iterator() { - return new Iterator() { // (1) + return new Iterator() { // [1] private int index = 0; @Override public boolean hasNext() { diff --git a/collections/Statistics.java b/collections/Statistics.java index c22ed96c0..6b725d712 100644 --- a/collections/Statistics.java +++ b/collections/Statistics.java @@ -12,7 +12,7 @@ public static void main(String[] args) { for(int i = 0; i < 10000; i++) { // Produce a number between 0 and 20: int r = rand.nextInt(20); - Integer freq = m.get(r); // (1) + Integer freq = m.get(r); // [1] m.put(r, freq == null ? 1 : freq + 1); } System.out.println(m); diff --git a/control/BreakAndContinue.java b/control/BreakAndContinue.java index 80a42c2f5..337730cfd 100644 --- a/control/BreakAndContinue.java +++ b/control/BreakAndContinue.java @@ -7,14 +7,14 @@ public class BreakAndContinue { public static void main(String[] args) { - for(int i = 0; i < 100; i++) { // (1) + for(int i = 0; i < 100; i++) { // [1] if(i == 74) break; // Out of for loop if(i % 9 != 0) continue; // Next iteration System.out.print(i + " "); } System.out.println(); // Using for-in: - for(int i : range(100)) { // (2) + for(int i : range(100)) { // [2] if(i == 74) break; // Out of for loop if(i % 9 != 0) continue; // Next iteration System.out.print(i + " "); @@ -22,7 +22,7 @@ public static void main(String[] args) { System.out.println(); int i = 0; // An "infinite loop": - while(true) { // (3) + while(true) { // [3] i++; int j = i * 27; if(j == 1269) break; // Out of loop diff --git a/control/ForInFloat.java b/control/ForInFloat.java index 8b3b4591a..77198d05f 100644 --- a/control/ForInFloat.java +++ b/control/ForInFloat.java @@ -7,7 +7,7 @@ public class ForInFloat { public static void main(String[] args) { Random rand = new Random(47); - float f[] = new float[10]; + float[] f = new float[10]; for(int i = 0; i < 10; i++) f[i] = rand.nextFloat(); for(float x : f) diff --git a/control/IfElse.java b/control/IfElse.java index 279f8f5b3..dc9bc8454 100644 --- a/control/IfElse.java +++ b/control/IfElse.java @@ -8,7 +8,7 @@ public class IfElse { static void test(int testval, int target) { if(testval > target) result = +1; - else if(testval < target) // (1) + else if(testval < target) // [1] result = -1; else result = 0; // Match diff --git a/enums/TrafficLight.java b/enums/TrafficLight.java index 4ca4813dd..70d0942d1 100644 --- a/enums/TrafficLight.java +++ b/enums/TrafficLight.java @@ -11,7 +11,7 @@ public class TrafficLight { Signal color = Signal.RED; public void change() { switch(color) { - // Note that you don't have to say Signal.RED + // Note you don't have to say Signal.RED // in the case statement: case RED: color = Signal.GREEN; break; diff --git a/exceptions/CleanupIdiom.java b/exceptions/CleanupIdiom.java index 75613e48c..5044d8de7 100644 --- a/exceptions/CleanupIdiom.java +++ b/exceptions/CleanupIdiom.java @@ -22,7 +22,7 @@ public NeedsCleanup2() throws ConstructionException {} public class CleanupIdiom { public static void main(String[] args) { - // (1): + // [1]: NeedsCleanup nc1 = new NeedsCleanup(); try { // ... @@ -30,7 +30,7 @@ public static void main(String[] args) { nc1.dispose(); } - // (2): + // [2]: // If construction cannot fail you can group objects: NeedsCleanup nc2 = new NeedsCleanup(); NeedsCleanup nc3 = new NeedsCleanup(); @@ -41,7 +41,7 @@ public static void main(String[] args) { nc2.dispose(); } - // (3): + // [3]: // If construction can fail you must guard each one: try { NeedsCleanup2 nc4 = new NeedsCleanup2(); diff --git a/exceptions/StormyInning.java b/exceptions/StormyInning.java index c1db52223..dec405d81 100644 --- a/exceptions/StormyInning.java +++ b/exceptions/StormyInning.java @@ -24,8 +24,8 @@ class RainedOut extends StormException {} class PopFoul extends Foul {} interface Storm { - public void event() throws RainedOut; - public void rainHard() throws RainedOut; + void event() throws RainedOut; + void rainHard() throws RainedOut; } public @@ -35,7 +35,7 @@ class StormyInning extends Inning implements Storm { public StormyInning() throws RainedOut, BaseballException {} public StormyInning(String s) - throws Foul, BaseballException {} + throws BaseballException {} // Regular methods must conform to base class: //- void walk() throws PopFoul {} //Compile error // Interface CANNOT add exceptions to existing diff --git a/exceptions/StreamsAreAutoCloseable.java b/exceptions/StreamsAreAutoCloseable.java index 8c69144ed..f997b6687 100644 --- a/exceptions/StreamsAreAutoCloseable.java +++ b/exceptions/StreamsAreAutoCloseable.java @@ -13,12 +13,12 @@ public class StreamsAreAutoCloseable { Stream in = Files.lines( Paths.get("StreamsAreAutoCloseable.java")); PrintWriter outfile = new PrintWriter( - "Results.txt"); // (1) + "Results.txt"); // [1] ) { in.skip(5) .limit(1) .map(String::toLowerCase) .forEachOrdered(outfile::println); - } // (2) + } // [2] } } diff --git a/files/File_System.java b/files/FileSystemDemo.java similarity index 95% rename from files/File_System.java rename to files/FileSystemDemo.java index b8cf516a0..c1872af69 100644 --- a/files/File_System.java +++ b/files/FileSystemDemo.java @@ -1,10 +1,10 @@ -// files/File_System.java +// files/FileSystemDemo.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.nio.file.*; -public class File_System { +public class FileSystemDemo { static void show(String id, Object o) { System.out.println(id + ": " + o); } diff --git a/files/Writing.java b/files/Writing.java index 40a6a99a6..98edb6a72 100644 --- a/files/Writing.java +++ b/files/Writing.java @@ -7,11 +7,11 @@ public class Writing { static Random rand = new Random(47); - static final int sz = 1000; + static final int SIZE = 1000; public static void main(String[] args) throws Exception { // Write bytes to a file: - byte[] bytes = new byte[sz]; + byte[] bytes = new byte[SIZE]; rand.nextBytes(bytes); Files.write(Paths.get("bytes.dat"), bytes); System.out.println("bytes.dat: " + diff --git a/functional/AnonymousClosure.java b/functional/AnonymousClosure.java index 1a1ba346a..1d19e3641 100644 --- a/functional/AnonymousClosure.java +++ b/functional/AnonymousClosure.java @@ -5,7 +5,7 @@ import java.util.function.*; public class AnonymousClosure { - IntSupplier make_fun(int x) { + IntSupplier makeFun(int x) { int i = 0; // Same rules apply: // i++; // Not "effectively final" diff --git a/functional/BiConsumerPermutations.java b/functional/BiConsumerPermutations.java index 3cd01a338..720dde44c 100644 --- a/functional/BiConsumerPermutations.java +++ b/functional/BiConsumerPermutations.java @@ -6,11 +6,11 @@ public class BiConsumerPermutations { static BiConsumer bicid = (i, d) -> - System.out.format("%d, %f\n", i, d); + System.out.format("%d, %f%n", i, d); static BiConsumer bicdi = (d, i) -> - System.out.format("%d, %f\n", i, d); + System.out.format("%d, %f%n", i, d); static BiConsumer bicil = (i, l) -> - System.out.format("%d, %d\n", i, l); + System.out.format("%d, %d%n", i, l); public static void main(String[] args) { bicid.accept(47, 11.34); bicdi.accept(22.45, 92); diff --git a/functional/Closure1.java b/functional/Closure1.java index 505009d2c..01dfa1726 100644 --- a/functional/Closure1.java +++ b/functional/Closure1.java @@ -6,7 +6,7 @@ public class Closure1 { int i; - IntSupplier make_fun(int x) { + IntSupplier makeFun(int x) { return () -> x + i++; } } diff --git a/functional/Closure2.java b/functional/Closure2.java index cdcd9cf3f..502acb8cf 100644 --- a/functional/Closure2.java +++ b/functional/Closure2.java @@ -5,7 +5,7 @@ import java.util.function.*; public class Closure2 { - IntSupplier make_fun(int x) { + IntSupplier makeFun(int x) { int i = 0; return () -> x + i; } diff --git a/functional/Closure3.java b/functional/Closure3.java index 25fd443f2..0674153fd 100644 --- a/functional/Closure3.java +++ b/functional/Closure3.java @@ -6,7 +6,7 @@ import java.util.function.*; public class Closure3 { - IntSupplier make_fun(int x) { + IntSupplier makeFun(int x) { int i = 0; // Neither x++ nor i++ will work: return () -> x++ + i++; diff --git a/functional/Closure4.java b/functional/Closure4.java index 96cdd3b97..dc0a22d08 100644 --- a/functional/Closure4.java +++ b/functional/Closure4.java @@ -5,7 +5,7 @@ import java.util.function.*; public class Closure4 { - IntSupplier make_fun(final int x) { + IntSupplier makeFun(final int x) { final int i = 0; return () -> x + i; } diff --git a/functional/Closure5.java b/functional/Closure5.java index 82fba7312..8cef14937 100644 --- a/functional/Closure5.java +++ b/functional/Closure5.java @@ -6,7 +6,7 @@ import java.util.function.*; public class Closure5 { - IntSupplier make_fun(int x) { + IntSupplier makeFun(int x) { int i = 0; i++; x++; diff --git a/functional/Closure6.java b/functional/Closure6.java index 6f116d954..d9b4654ca 100644 --- a/functional/Closure6.java +++ b/functional/Closure6.java @@ -5,12 +5,12 @@ import java.util.function.*; public class Closure6 { - IntSupplier make_fun(int x) { + IntSupplier makeFun(int x) { int i = 0; i++; x++; - final int i_final = i; - final int x_final = x; - return () -> x_final + i_final; + final int iFinal = i; + final int xFinal = x; + return () -> xFinal + iFinal; } } diff --git a/functional/Closure7.java b/functional/Closure7.java index 4ccb0e92b..a842546a4 100644 --- a/functional/Closure7.java +++ b/functional/Closure7.java @@ -6,7 +6,7 @@ import java.util.function.*; public class Closure7 { - IntSupplier make_fun(int x) { + IntSupplier makeFun(int x) { Integer i = new Integer(0); i = i + 1; return () -> x + i; diff --git a/functional/Closure8.java b/functional/Closure8.java index 8ecb583bd..0a93758f5 100644 --- a/functional/Closure8.java +++ b/functional/Closure8.java @@ -6,7 +6,7 @@ import java.util.function.*; public class Closure8 { - Supplier> make_fun() { + Supplier> makeFun() { final List ai = new ArrayList<>(); ai.add(1); return () -> ai; @@ -14,8 +14,8 @@ Supplier> make_fun() { public static void main(String[] args) { Closure8 c7 = new Closure8(); List - l1 = c7.make_fun().get(), - l2 = c7.make_fun().get(); + l1 = c7.makeFun().get(), + l2 = c7.makeFun().get(); System.out.println(l1); System.out.println(l2); l1.add(42); diff --git a/functional/Closure9.java b/functional/Closure9.java index 6ed827f85..a9e173e22 100644 --- a/functional/Closure9.java +++ b/functional/Closure9.java @@ -7,7 +7,7 @@ import java.util.function.*; public class Closure9 { - Supplier> make_fun() { + Supplier> makeFun() { List ai = new ArrayList<>(); ai = new ArrayList<>(); // Reassignment return () -> ai; diff --git a/functional/CtorReference.java b/functional/CtorReference.java index fcf8ea753..51bff8dd1 100644 --- a/functional/CtorReference.java +++ b/functional/CtorReference.java @@ -25,9 +25,9 @@ interface Make2Args { public class CtorReference { public static void main(String[] args) { - MakeNoArgs mna = Dog::new; // (1) - Make1Arg m1a = Dog::new; // (2) - Make2Args m2a = Dog::new; // (3) + MakeNoArgs mna = Dog::new; // [1] + Make1Arg m1a = Dog::new; // [2] + Make2Args m2a = Dog::new; // [3] Dog dn = mna.make(); Dog d1 = m1a.make("Comet"); diff --git a/functional/CurryingAndPartials.java b/functional/CurryingAndPartials.java index aa5f74578..c4784559d 100644 --- a/functional/CurryingAndPartials.java +++ b/functional/CurryingAndPartials.java @@ -12,12 +12,12 @@ static String uncurried(String a, String b) { public static void main(String[] args) { // Curried function: Function> sum = - a -> b -> a + b; // (1) + a -> b -> a + b; // [1] System.out.println(uncurried("Hi ", "Ho")); Function - hi = sum.apply("Hi "); // (2) + hi = sum.apply("Hi "); // [2] System.out.println(hi.apply("Ho")); // Partial application: diff --git a/functional/LambdaExpressions.java b/functional/LambdaExpressions.java index adb3f5da8..50dd72228 100644 --- a/functional/LambdaExpressions.java +++ b/functional/LambdaExpressions.java @@ -17,15 +17,15 @@ interface Multi { public class LambdaExpressions { - static Body bod = h -> h + " No Parens!"; // (1) + static Body bod = h -> h + " No Parens!"; // [1] - static Body bod2 = (h) -> h + " More details"; // (2) + static Body bod2 = (h) -> h + " More details"; // [2] - static Description desc = () -> "Short info"; // (3) + static Description desc = () -> "Short info"; // [3] - static Multi mult = (h, n) -> h + n; // (4) + static Multi mult = (h, n) -> h + n; // [4] - static Description moreLines = () -> { // (5) + static Description moreLines = () -> { // [5] System.out.println("moreLines()"); return "from moreLines()"; }; diff --git a/functional/MethodReferences.java b/functional/MethodReferences.java index 5becd3715..5911f317f 100644 --- a/functional/MethodReferences.java +++ b/functional/MethodReferences.java @@ -4,44 +4,44 @@ // Visit http://OnJava8.com for more book information. import java.util.*; -interface Callable { // (1) +interface Callable { // [1] void call(String s); } class Describe { - void show(String msg) { // (2) + void show(String msg) { // [2] System.out.println(msg); } } public class MethodReferences { - static void hello(String name) { // (3) + static void hello(String name) { // [3] System.out.println("Hello, " + name); } static class Description { String about; public Description(String desc) { about = desc; } - void help(String msg) { // (4) + void help(String msg) { // [4] System.out.println(about + " " + msg); } } static class Helper { - static void assist(String msg) { // (5) + static void assist(String msg) { // [5] System.out.println(msg); } } public static void main(String[] args) { Describe d = new Describe(); - Callable c = d::show; // (6) - c.call("call()"); // (7) + Callable c = d::show; // [6] + c.call("call()"); // [7] - c = MethodReferences::hello; // (8) + c = MethodReferences::hello; // [8] c.call("Bob"); - c = new Description("valuable")::help; // (9) + c = new Description("valuable")::help; // [9] c.call("information"); - c = Helper::assist; // (10) + c = Helper::assist; // [10] c.call("Help!"); } } diff --git a/functional/MultiUnbound.java b/functional/MultiUnbound.java index fa2ada8fc..aed17795a 100644 --- a/functional/MultiUnbound.java +++ b/functional/MultiUnbound.java @@ -11,16 +11,16 @@ void four(int i, double d, String s, char c) {} } interface TwoArgs { - void call2(This _this, int i, double d); + void call2(This athis, int i, double d); } interface ThreeArgs { - void call3(This _this, int i, double d, String s); + void call3(This athis, int i, double d, String s); } interface FourArgs { void call4( - This _this, int i, double d, String s, char c); + This athis, int i, double d, String s, char c); } public class MultiUnbound { @@ -28,9 +28,9 @@ public static void main(String[] args) { TwoArgs twoargs = This::two; ThreeArgs threeargs = This::three; FourArgs fourargs = This::four; - This _this = new This(); - twoargs.call2(_this, 11, 3.14); - threeargs.call3(_this, 11, 3.14, "Three"); - fourargs.call4(_this, 11, 3.14, "Four", 'Z'); + This athis = new This(); + twoargs.call2(athis, 11, 3.14); + threeargs.call3(athis, 11, 3.14, "Three"); + fourargs.call4(athis, 11, 3.14, "Four", 'Z'); } } diff --git a/functional/ProduceFunction.java b/functional/ProduceFunction.java index 5b2ce9ad5..bb5735326 100644 --- a/functional/ProduceFunction.java +++ b/functional/ProduceFunction.java @@ -5,11 +5,11 @@ import java.util.function.*; interface -FuncSS extends Function {} // (1) +FuncSS extends Function {} // [1] public class ProduceFunction { static FuncSS produce() { - return s -> s.toLowerCase(); // (2) + return s -> s.toLowerCase(); // [2] } public static void main(String[] args) { FuncSS f = produce(); diff --git a/functional/SharedStorage.java b/functional/SharedStorage.java index 789255c6e..be005eece 100644 --- a/functional/SharedStorage.java +++ b/functional/SharedStorage.java @@ -7,9 +7,9 @@ public class SharedStorage { public static void main(String[] args) { Closure1 c1 = new Closure1(); - IntSupplier f1 = c1.make_fun(0); - IntSupplier f2 = c1.make_fun(0); - IntSupplier f3 = c1.make_fun(0); + IntSupplier f1 = c1.makeFun(0); + IntSupplier f2 = c1.makeFun(0); + IntSupplier f3 = c1.makeFun(0); System.out.println(f1.getAsInt()); System.out.println(f2.getAsInt()); System.out.println(f3.getAsInt()); diff --git a/functional/Strategize.java b/functional/Strategize.java index 92b83a442..cc87e047e 100644 --- a/functional/Strategize.java +++ b/functional/Strategize.java @@ -23,7 +23,7 @@ public class Strategize { Strategy strategy; String msg; Strategize(String msg) { - strategy = new Soft(); // (1) + strategy = new Soft(); // [1] this.msg = msg; } void communicate() { @@ -34,19 +34,19 @@ void changeStrategy(Strategy strategy) { } public static void main(String[] args) { Strategy[] strategies = { - new Strategy() { // (2) + new Strategy() { // [2] public String approach(String msg) { return msg.toUpperCase() + "!"; } }, - msg -> msg.substring(0, 5), // (3) - Unrelated::twice // (4) + msg -> msg.substring(0, 5), // [3] + Unrelated::twice // [4] }; Strategize s = new Strategize("Hello there"); s.communicate(); for(Strategy newStrategy : strategies) { - s.changeStrategy(newStrategy); // (5) - s.communicate(); // (6) + s.changeStrategy(newStrategy); // [5] + s.communicate(); // [6] } } } diff --git a/functional/UnboundMethodReference.java b/functional/UnboundMethodReference.java index d0240dec6..fc28af618 100644 --- a/functional/UnboundMethodReference.java +++ b/functional/UnboundMethodReference.java @@ -18,10 +18,10 @@ interface TransformX { public class UnboundMethodReference { public static void main(String[] args) { - // MakeString ms = X::f; // (1) + // MakeString ms = X::f; // [1] TransformX sp = X::f; X x = new X(); - System.out.println(sp.transform(x)); // (2) + System.out.println(sp.transform(x)); // [2] System.out.println(x.f()); // Same effect } } diff --git a/generics/DogsAndRobotMethodReferences.java b/generics/DogsAndRobotMethodReferences.java index cae8c0184..4a7c346c8 100644 --- a/generics/DogsAndRobotMethodReferences.java +++ b/generics/DogsAndRobotMethodReferences.java @@ -6,19 +6,19 @@ import typeinfo.pets.*; import java.util.function.*; -class PerformingDog_ extends Dog { +class PerformingDogA extends Dog { public void speak() { System.out.println("Woof!"); } public void sit() { System.out.println("Sitting"); } public void reproduce() {} } -class Robot_ { +class RobotA { public void speak() { System.out.println("Click!"); } public void sit() { System.out.println("Clank!"); } public void oilChange() {} } -class Communicate_ { +class CommunicateA { public static

    void perform(P performer, Consumer

    action1, Consumer

    action2) { action1.accept(performer); @@ -28,11 +28,11 @@ public static

    void perform(P performer, public class DogsAndRobotMethodReferences { public static void main(String[] args) { - Communicate_.perform(new PerformingDog_(), - PerformingDog_::speak, PerformingDog_::sit); - Communicate_.perform(new Robot_(), - Robot_::speak, Robot_::sit); - Communicate_.perform(new Mime(), + CommunicateA.perform(new PerformingDogA(), + PerformingDogA::speak, PerformingDogA::sit); + CommunicateA.perform(new RobotA(), + RobotA::speak, RobotA::sit); + CommunicateA.perform(new Mime(), Mime::walkAgainstTheWind, Mime::pushInvisibleWalls); } } diff --git a/generics/DynamicProxyMixin.java b/generics/DynamicProxyMixin.java index 2c886f92d..250aec23a 100644 --- a/generics/DynamicProxyMixin.java +++ b/generics/DynamicProxyMixin.java @@ -13,12 +13,12 @@ class MixinProxy implements InvocationHandler { public MixinProxy(Tuple2>... pairs) { delegatesByMethod = new HashMap<>(); for(Tuple2> pair : pairs) { - for(Method method : pair._2.getMethods()) { + for(Method method : pair.a2.getMethods()) { String methodName = method.getName(); // The first interface in the map // implements the method. if(!delegatesByMethod.containsKey(methodName)) - delegatesByMethod.put(methodName, pair._1); + delegatesByMethod.put(methodName, pair.a1); } } } @@ -33,10 +33,10 @@ public Object invoke(Object proxy, Method method, public static Object newInstance(Tuple2... pairs) { Class[] interfaces = new Class[pairs.length]; for(int i = 0; i < pairs.length; i++) { - interfaces[i] = (Class)pairs[i]._2; + interfaces[i] = (Class)pairs[i].a2; } ClassLoader cl = - pairs[0]._1.getClass().getClassLoader(); + pairs[0].a1.getClass().getClassLoader(); return Proxy.newProxyInstance( cl, interfaces, new MixinProxy(pairs)); } diff --git a/generics/GenericsAndCovariance.java b/generics/GenericsAndCovariance.java index b96a43a66..4dca050a6 100644 --- a/generics/GenericsAndCovariance.java +++ b/generics/GenericsAndCovariance.java @@ -13,7 +13,7 @@ public static void main(String[] args) { // flist.add(new Fruit()); // flist.add(new Object()); flist.add(null); // Legal but uninteresting - // We know that it returns at least Fruit: + // We know it returns at least Fruit: Fruit f = flist.get(0); } } diff --git a/generics/Holder.java b/generics/Holder.java index 5937a813c..f85d2ebcc 100644 --- a/generics/Holder.java +++ b/generics/Holder.java @@ -2,6 +2,7 @@ // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. +import java.util.Objects; public class Holder { private T value; @@ -10,8 +11,14 @@ public Holder() {} public void set(T val) { value = val; } public T get() { return value; } @Override - public boolean equals(Object obj) { - return value.equals(obj); + public boolean equals(Object o) { + if (o == this) return true; + return o instanceof Holder && + Objects.equals(value, ((Holder)o).value); + } + @Override + public int hashCode() { + return Objects.hash(value); } public static void main(String[] args) { Holder apple = new Holder<>(new Apple()); @@ -32,5 +39,5 @@ public static void main(String[] args) { /* Output: java.lang.ClassCastException: Apple cannot be cast to Orange -true +false */ diff --git a/generics/PrimitiveGenericTest.java b/generics/PrimitiveGenericTest.java index 934c1ba35..cfd211a72 100644 --- a/generics/PrimitiveGenericTest.java +++ b/generics/PrimitiveGenericTest.java @@ -36,7 +36,7 @@ public static void main(String[] args) { new String[5], new Rand.String(9)); System.out.println(Arrays.toString(strings)); int[] integers = FillArray.fill( - new int[9], new Rand.int_()); + new int[9], new Rand.Pint()); System.out.println(Arrays.toString(integers)); } } diff --git a/generics/Store.java b/generics/Store.java index ec447263f..0847c0188 100644 --- a/generics/Store.java +++ b/generics/Store.java @@ -12,8 +12,8 @@ class Product { private String description; private double price; public - Product(int IDnumber, String descr, double price) { - id = IDnumber; + Product(int idNumber, String descr, double price) { + id = idNumber; description = descr; this.price = price; System.out.println(toString()); diff --git a/generics/TupleTest.java b/generics/TupleTest.java index f85e51255..52901fd4e 100644 --- a/generics/TupleTest.java +++ b/generics/TupleTest.java @@ -27,7 +27,7 @@ Tuple5 k() { public static void main(String[] args) { Tuple2 ttsi = f(); System.out.println(ttsi); - // ttsi._1 = "there"; // Compile error: final + // ttsi.a1 = "there"; // Compile error: final System.out.println(g()); System.out.println(h()); System.out.println(k()); diff --git a/go.bat b/go.bat deleted file mode 100644 index 957d931c9..000000000 --- a/go.bat +++ /dev/null @@ -1,3 +0,0 @@ -gradlew --parallel --daemon run > output.txt 2> errors.txt -START /min "C:\Program Files\Windows Media Player\wmplayer.exe" %windir%\media\Alarm07.wav -rem find . -size 0 -type f diff --git a/hiding/Lunch.java b/hiding/Lunch.java index a0b9e789d..12faa00d4 100644 --- a/hiding/Lunch.java +++ b/hiding/Lunch.java @@ -7,14 +7,14 @@ class Soup1 { private Soup1() {} - public static Soup1 makeSoup() { // (1) + public static Soup1 makeSoup() { // [1] return new Soup1(); } } class Soup2 { private Soup2() {} - private static Soup2 ps1 = new Soup2(); // (2) + private static Soup2 ps1 = new Soup2(); // [2] public static Soup2 access() { return ps1; } diff --git a/housekeeping/ExplicitStatic.java b/housekeeping/ExplicitStatic.java index 8e86b0033..f0ec5c0a8 100644 --- a/housekeeping/ExplicitStatic.java +++ b/housekeeping/ExplicitStatic.java @@ -28,10 +28,10 @@ class Cups { public class ExplicitStatic { public static void main(String[] args) { System.out.println("Inside main()"); - Cups.cup1.f(99); // (1) + Cups.cup1.f(99); // [1] } - // static Cups cups1 = new Cups(); // (2) - // static Cups cups2 = new Cups(); // (2) + // static Cups cups1 = new Cups(); // [2] + // static Cups cups2 = new Cups(); // [2] } /* Output: Inside main() diff --git a/housekeeping/Mugs.java b/housekeeping/Mugs.java index 373471a27..a99f0d1d3 100644 --- a/housekeeping/Mugs.java +++ b/housekeeping/Mugs.java @@ -16,7 +16,7 @@ void f(int marker) { public class Mugs { Mug mug1; Mug mug2; - { // (1) + { // [1] mug1 = new Mug(1); mug2 = new Mug(2); System.out.println("mug1 & mug2 initialized"); diff --git a/innerclasses/BigEgg.java b/innerclasses/BigEgg.java index b55ac35f2..e4faff593 100644 --- a/innerclasses/BigEgg.java +++ b/innerclasses/BigEgg.java @@ -2,7 +2,7 @@ // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. -// An inner class cannot be overriden like a method +// An inner class cannot be overridden like a method class Egg { private Yolk y; diff --git a/innerclasses/Parcel11.java b/innerclasses/Parcel11.java index d9f6f46a5..994864b93 100644 --- a/innerclasses/Parcel11.java +++ b/innerclasses/Parcel11.java @@ -11,7 +11,7 @@ public class Parcel11 { @Override public int value() { return i; } } - protected static class ParcelDestination + protected static final class ParcelDestination implements Destination { private String label; private ParcelDestination(String whereTo) { diff --git a/innerclasses/Parcel5.java b/innerclasses/Parcel5.java index 3b4694194..4b88c4f8c 100644 --- a/innerclasses/Parcel5.java +++ b/innerclasses/Parcel5.java @@ -6,7 +6,7 @@ public class Parcel5 { public Destination destination(String s) { - class PDestination implements Destination { + final class PDestination implements Destination { private String label; private PDestination(String whereTo) { label = whereTo; diff --git a/innerclasses/Parcel8.java b/innerclasses/Parcel8.java index c8385b4e0..b126b1030 100644 --- a/innerclasses/Parcel8.java +++ b/innerclasses/Parcel8.java @@ -7,12 +7,12 @@ public class Parcel8 { public Wrapping wrapping(int x) { // Base constructor call: - return new Wrapping(x) { // (1) + return new Wrapping(x) { // [1] @Override public int value() { return super.value() * 47; } - }; // (2) + }; // [2] } public static void main(String[] args) { Parcel8 p = new Parcel8(); diff --git a/innerclasses/TestParcel.java b/innerclasses/TestParcel.java index 970b2c3ad..2f6152aa8 100644 --- a/innerclasses/TestParcel.java +++ b/innerclasses/TestParcel.java @@ -9,7 +9,8 @@ private class PContents implements Contents { @Override public int value() { return i; } } - protected class PDestination implements Destination { + protected final class + PDestination implements Destination { private String label; private PDestination(String whereTo) { label = whereTo; diff --git a/innerclasses/controller/Event.java b/innerclasses/controller/Event.java index afdb45100..662f0e9df 100644 --- a/innerclasses/controller/Event.java +++ b/innerclasses/controller/Event.java @@ -9,8 +9,8 @@ public abstract class Event { private Instant eventTime; protected final Duration delayTime; - public Event(long millisecond_delay) { - delayTime = Duration.ofMillis(millisecond_delay); + public Event(long millisecondDelay) { + delayTime = Duration.ofMillis(millisecondDelay); start(); } public void start() { // Allows restarting diff --git a/interfaces/AbstractAccess.java b/interfaces/AbstractAccess.java index 8c72c2c57..b7a22bd80 100644 --- a/interfaces/AbstractAccess.java +++ b/interfaces/AbstractAccess.java @@ -11,5 +11,5 @@ protected void m2() {} void m3() {} abstract void m3a(); public void m4() {} - abstract public void m4a(); + public abstract void m4a(); } diff --git a/interfaces/Applicator.java b/interfaces/Applicator.java index 3e992f156..6cca24c95 100644 --- a/interfaces/Applicator.java +++ b/interfaces/Applicator.java @@ -40,7 +40,7 @@ public static void apply(Processor p, Object s) { System.out.println("Using Processor " + p.name()); System.out.println(p.process(s)); } - public static String s = + public static final String s = "Disagreement with beliefs is by definition incorrect"; public static void main(String[] args) { apply(new Upcase(), s); diff --git a/interfaces/RandomDoubles.java b/interfaces/RandomDoubles.java index 19619b4cb..2c4e8c865 100644 --- a/interfaces/RandomDoubles.java +++ b/interfaces/RandomDoubles.java @@ -5,9 +5,9 @@ import java.util.*; public interface RandomDoubles { - Random rand = new Random(47); - default double next() { return rand.nextDouble(); } - public static void main(String[] args) { + Random RAND = new Random(47); + default double next() { return RAND.nextDouble(); } + static void main(String[] args) { RandomDoubles rd = new RandomDoubles() {}; for(int i = 0; i < 7; i ++) System.out.print(rd.next() + " "); diff --git a/interfaces/RandomWords.java b/interfaces/RandomWords.java index f744fd9eb..95eefcd48 100644 --- a/interfaces/RandomWords.java +++ b/interfaces/RandomWords.java @@ -8,11 +8,11 @@ public class RandomWords implements Readable { private static Random rand = new Random(47); - private static final char[] capitals = + private static final char[] CAPITALS = "ABCDEFGHIJKLMNOPQRSTUVWXYZ".toCharArray(); - private static final char[] lowers = + private static final char[] LOWERS = "abcdefghijklmnopqrstuvwxyz".toCharArray(); - private static final char[] vowels = + private static final char[] VOWELS = "aeiou".toCharArray(); private int count; public RandomWords(int count) { this.count = count; } @@ -20,10 +20,10 @@ public class RandomWords implements Readable { public int read(CharBuffer cb) { if(count-- == 0) return -1; // Indicates end of input - cb.append(capitals[rand.nextInt(capitals.length)]); + cb.append(CAPITALS[rand.nextInt(CAPITALS.length)]); for(int i = 0; i < 4; i++) { - cb.append(vowels[rand.nextInt(vowels.length)]); - cb.append(lowers[rand.nextInt(lowers.length)]); + cb.append(VOWELS[rand.nextInt(VOWELS.length)]); + cb.append(LOWERS[rand.nextInt(LOWERS.length)]); } cb.append(" "); return 10; // Number of characters appended diff --git a/interfaces/interfaceprocessor/StringProcessor.java b/interfaces/interfaceprocessor/StringProcessor.java index 3078c3156..88ad20ee6 100644 --- a/interfaces/interfaceprocessor/StringProcessor.java +++ b/interfaces/interfaceprocessor/StringProcessor.java @@ -8,13 +8,13 @@ interface StringProcessor extends Processor { @Override - String process(Object input); // (1) - String s = // (2) + String process(Object input); // [1] + String S = // [2] "If she weighs the same as a duck, she's made of wood"; - public static void main(String[] args) { // (3) - Applicator.apply(new Upcase(), s); - Applicator.apply(new Downcase(), s); - Applicator.apply(new Splitter(), s); + static void main(String[] args) { // [3] + Applicator.apply(new Upcase(), S); + Applicator.apply(new Downcase(), S); + Applicator.apply(new Splitter(), S); } } diff --git a/onjava/ConvertTo.java b/onjava/ConvertTo.java index 015d636b6..985b7f30a 100644 --- a/onjava/ConvertTo.java +++ b/onjava/ConvertTo.java @@ -5,98 +5,98 @@ package onjava; public interface ConvertTo { - public static boolean[] primitive(Boolean[] in) { + static boolean[] primitive(Boolean[] in) { boolean[] result = new boolean[in.length]; for(int i = 0; i < in.length; i++) result[i] = in[i]; // Autounboxing return result; } - public static char[] primitive(Character[] in) { + static char[] primitive(Character[] in) { char[] result = new char[in.length]; for(int i = 0; i < in.length; i++) result[i] = in[i]; return result; } - public static byte[] primitive(Byte[] in) { + static byte[] primitive(Byte[] in) { byte[] result = new byte[in.length]; for(int i = 0; i < in.length; i++) result[i] = in[i]; return result; } - public static short[] primitive(Short[] in) { + static short[] primitive(Short[] in) { short[] result = new short[in.length]; for(int i = 0; i < in.length; i++) result[i] = in[i]; return result; } - public static int[] primitive(Integer[] in) { + static int[] primitive(Integer[] in) { int[] result = new int[in.length]; for(int i = 0; i < in.length; i++) result[i] = in[i]; return result; } - public static long[] primitive(Long[] in) { + static long[] primitive(Long[] in) { long[] result = new long[in.length]; for(int i = 0; i < in.length; i++) result[i] = in[i]; return result; } - public static float[] primitive(Float[] in) { + static float[] primitive(Float[] in) { float[] result = new float[in.length]; for(int i = 0; i < in.length; i++) result[i] = in[i]; return result; } - public static double[] primitive(Double[] in) { + static double[] primitive(Double[] in) { double[] result = new double[in.length]; for(int i = 0; i < in.length; i++) result[i] = in[i]; return result; } // Convert from primitive array to wrapped array: - public static Boolean[] boxed(boolean[] in) { + static Boolean[] boxed(boolean[] in) { Boolean[] result = new Boolean[in.length]; for(int i = 0; i < in.length; i++) result[i] = in[i]; // Autboxing return result; } - public static Character[] boxed(char[] in) { + static Character[] boxed(char[] in) { Character[] result = new Character[in.length]; for(int i = 0; i < in.length; i++) result[i] = in[i]; return result; } - public static Byte[] boxed(byte[] in) { + static Byte[] boxed(byte[] in) { Byte[] result = new Byte[in.length]; for(int i = 0; i < in.length; i++) result[i] = in[i]; return result; } - public static Short[] boxed(short[] in) { + static Short[] boxed(short[] in) { Short[] result = new Short[in.length]; for(int i = 0; i < in.length; i++) result[i] = in[i]; return result; } - public static Integer[] boxed(int[] in) { + static Integer[] boxed(int[] in) { Integer[] result = new Integer[in.length]; for(int i = 0; i < in.length; i++) result[i] = in[i]; return result; } - public static Long[] boxed(long[] in) { + static Long[] boxed(long[] in) { Long[] result = new Long[in.length]; for(int i = 0; i < in.length; i++) result[i] = in[i]; return result; } - public static Float[] boxed(float[] in) { + static Float[] boxed(float[] in) { Float[] result = new Float[in.length]; for(int i = 0; i < in.length; i++) result[i] = in[i]; return result; } - public static Double[] boxed(double[] in) { + static Double[] boxed(double[] in) { Double[] result = new Double[in.length]; for(int i = 0; i < in.length; i++) result[i] = in[i]; diff --git a/onjava/Count.java b/onjava/Count.java index 0a5f717e0..294be06d0 100644 --- a/onjava/Count.java +++ b/onjava/Count.java @@ -25,7 +25,7 @@ public java.lang.Boolean[] array(int sz) { return result; } } - public static class boolean_ { + public static class Pboolean { private boolean b = true; public boolean get() { b = !b; @@ -48,7 +48,7 @@ public java.lang.Byte[] array(int sz) { return result; } } - public static class byte_ { + public static class Pbyte { private byte b; public byte get() { return b++; } public byte get(int n) { return get(); } @@ -56,15 +56,15 @@ public byte[] array(int sz) { return primitive(new Byte().array(sz)); } } - static final char[] chars = + char[] CHARS = "abcdefghijklmnopqrstuvwxyz".toCharArray(); public static class Character implements Supplier { private int i; @Override public java.lang.Character get() { - i = (i + 1) % chars.length; - return chars[i]; + i = (i + 1) % CHARS.length; + return CHARS[i]; } public java.lang.Character get(int n) { return get(); @@ -76,11 +76,11 @@ public java.lang.Character[] array(int sz) { return result; } } - public static class char_ { + public static class Pchar { private int i; public char get() { - i = (i + 1) % chars.length; - return chars[i]; + i = (i + 1) % CHARS.length; + return CHARS[i]; } public char get(int n) { return get(); } public char[] array(int sz) { @@ -99,7 +99,7 @@ public java.lang.Short[] array(int sz) { return result; } } - public static class short_ { + public static class Pshort { short s; public short get() { return s++; } public short get(int n) { return get(); } @@ -120,7 +120,7 @@ public java.lang.Integer[] array(int sz) { return result; } } - public static class int_ implements IntSupplier { + public static class Pint implements IntSupplier { int i; public int get() { return i++; } public int get(int n) { return get(); } @@ -142,7 +142,7 @@ public java.lang.Long[] array(int sz) { return result; } } - public static class long_ implements LongSupplier { + public static class Plong implements LongSupplier { private long l; public long get() { return l++; } public long get(int n) { return get(); } @@ -166,7 +166,7 @@ public java.lang.Float[] array(int sz) { return result; } } - public class float_ { + public class Pfloat { private int i; public float get() { return i++; } public float get(int n) { return get(); } @@ -189,7 +189,7 @@ public java.lang.Double[] array(int sz) { return result; } } - public class double_ implements DoubleSupplier { + public class Pdouble implements DoubleSupplier { private int i; public double get() { return i++; } public double get(int n) { return get(); } diff --git a/onjava/HTMLColors.java b/onjava/HTMLColors.java index 7ba46d593..3d570a09c 100644 --- a/onjava/HTMLColors.java +++ b/onjava/HTMLColors.java @@ -200,33 +200,33 @@ public static void show(Map m) { show(m, m.size()); } public static - void show(List lst, int count) { + void show(Collection lst, int count) { lst.stream() .limit(count) .forEach(System.out::println); } - public static void show(List lst) { + public static void show(Collection lst) { show(lst, lst.size()); } public static - void showrgb(List lst, int count) { + void showrgb(Collection lst, int count) { lst.stream() .limit(count) - .forEach(n -> System.out.format("0x%06X\n", n)); + .forEach(n -> System.out.format("0x%06X%n", n)); } - public static void showrgb(List lst) { + public static void showrgb(Collection lst) { showrgb(lst, lst.size()); } public static - void show_inv(Map m, int count) { + void showInv(Map m, int count) { m.entrySet().stream() .limit(count) .forEach(e -> System.out.format( "%-20s 0x%06X\n", e.getKey(), e.getValue())); } - public static void show_inv(Map m) { - show_inv(m, m.size()); + public static void showInv(Map m) { + showInv(m, m.size()); } public static void border() { System.out.println("------------------------------"); diff --git a/onjava/MouseClick.java b/onjava/MouseClick.java index 39259efc3..cf8871b36 100644 --- a/onjava/MouseClick.java +++ b/onjava/MouseClick.java @@ -9,11 +9,11 @@ // Default everything except mouseClicked(): public interface MouseClick extends MouseListener { @Override - public default void mouseEntered(MouseEvent e) {} + default void mouseEntered(MouseEvent e) {} @Override - public default void mouseExited(MouseEvent e) {} + default void mouseExited(MouseEvent e) {} @Override - public default void mousePressed(MouseEvent e) {} + default void mousePressed(MouseEvent e) {} @Override - public default void mouseReleased(MouseEvent e) {} + default void mouseReleased(MouseEvent e) {} } diff --git a/onjava/Rand.java b/onjava/Rand.java index 10dc8b215..7af727063 100644 --- a/onjava/Rand.java +++ b/onjava/Rand.java @@ -9,7 +9,7 @@ import static onjava.ConvertTo.*; public interface Rand { - static final int MOD = 10_000; + int MOD = 10_000; public static class Boolean implements Supplier { SplittableRandom r = new SplittableRandom(47); @@ -27,7 +27,7 @@ public java.lang.Boolean[] array(int sz) { return result; } } - public static class boolean_ { + public static class Pboolean { public boolean[] array(int sz) { return primitive(new Boolean().array(sz)); } @@ -46,7 +46,7 @@ public java.lang.Byte[] array(int sz) { return result; } } - public static class byte_ { + public static class Pbyte { public byte[] array(int sz) { return primitive(new Byte().array(sz)); } @@ -68,7 +68,7 @@ public java.lang.Character[] array(int sz) { return result; } } - public static class char_ { + public static class Pchar { public char[] array(int sz) { return primitive(new Character().array(sz)); } @@ -87,7 +87,7 @@ public java.lang.Short[] array(int sz) { return result; } } - public static class short_ { + public static class Pshort { public short[] array(int sz) { return primitive(new Short().array(sz)); } @@ -101,7 +101,7 @@ public java.lang.Integer get() { } public java.lang.Integer get(int n) { return get(); } public java.lang.Integer[] array(int sz) { - int[] primitive = new int_().array(sz); + int[] primitive = new Pint().array(sz); java.lang.Integer[] result = new java.lang.Integer[sz]; for(int i = 0; i < sz; i++) @@ -109,7 +109,7 @@ public java.lang.Integer[] array(int sz) { return result; } } - public static class int_ implements IntSupplier { + public static class Pint implements IntSupplier { SplittableRandom r = new SplittableRandom(47); @Override public int getAsInt() { return r.nextInt(MOD); } @@ -127,14 +127,14 @@ public java.lang.Long get() { } public java.lang.Long get(int n) { return get(); } public java.lang.Long[] array(int sz) { - long[] primitive = new long_().array(sz); + long[] primitive = new Plong().array(sz); java.lang.Long[] result = new java.lang.Long[sz]; for(int i = 0; i < sz; i++) result[i] = primitive[i]; return result; } } - public static class long_ implements LongSupplier { + public static class Plong implements LongSupplier { SplittableRandom r = new SplittableRandom(47); @Override public long getAsLong() { @@ -159,7 +159,7 @@ public java.lang.Float[] array(int sz) { return result; } } - public static class float_ { + public static class Pfloat { public float[] array(int sz) { return primitive(new Float().array(sz)); } @@ -176,7 +176,7 @@ public java.lang.Double get() { } public java.lang.Double get(int n) { return get(); } public java.lang.Double[] array(int sz) { - double[] primitive = new Rand.double_().array(sz); + double[] primitive = new Rand.Pdouble().array(sz); java.lang.Double[] result = new java.lang.Double[sz]; for(int i = 0; i < sz; i++) @@ -184,7 +184,7 @@ public java.lang.Double[] array(int sz) { return result; } } - public static class double_ implements DoubleSupplier { + public static class Pdouble implements DoubleSupplier { SplittableRandom r = new SplittableRandom(47); @Override public double getAsDouble() { @@ -203,8 +203,8 @@ public static class String SplittableRandom r = new SplittableRandom(47); private int strlen = 7; // Default string length public String() {} - public String(int str_length) { - strlen = str_length; + public String(int strLength) { + strlen = strLength; } @Override public java.lang.String get() { diff --git a/onjava/Suppliers.java b/onjava/Suppliers.java index a7c52eb78..e1a724f36 100644 --- a/onjava/Suppliers.java +++ b/onjava/Suppliers.java @@ -7,7 +7,6 @@ import java.util.*; import java.util.function.*; import java.util.stream.*; -import java.util.function.*; public class Suppliers { // Create a collection and fill it: diff --git a/onjava/Tuple2.java b/onjava/Tuple2.java index ec7f86d29..b7642aca6 100644 --- a/onjava/Tuple2.java +++ b/onjava/Tuple2.java @@ -5,10 +5,10 @@ package onjava; public class Tuple2 { - public final A _1; - public final B _2; - public Tuple2(A a, B b) { _1 = a; _2 = b; } - public String rep() { return _1 + ", " + _2; } + public final A a1; + public final B a2; + public Tuple2(A a, B b) { a1 = a; a2 = b; } + public String rep() { return a1 + ", " + a2; } @Override public String toString() { return "(" + rep() + ")"; diff --git a/onjava/Tuple3.java b/onjava/Tuple3.java index aeb3c4c3b..971d380d0 100644 --- a/onjava/Tuple3.java +++ b/onjava/Tuple3.java @@ -5,13 +5,13 @@ package onjava; public class Tuple3 extends Tuple2 { - public final C _3; + public final C a3; public Tuple3(A a, B b, C c) { super(a, b); - _3 = c; + a3 = c; } @Override public String rep() { - return super.rep() + ", " + _3; + return super.rep() + ", " + a3; } } diff --git a/onjava/Tuple4.java b/onjava/Tuple4.java index 1adb02fd6..9ad6c9225 100644 --- a/onjava/Tuple4.java +++ b/onjava/Tuple4.java @@ -6,13 +6,13 @@ public class Tuple4 extends Tuple3 { - public final D _4; + public final D a4; public Tuple4(A a, B b, C c, D d) { super(a, b, c); - _4 = d; + a4 = d; } @Override public String rep() { - return super.rep() + ", " + _4; + return super.rep() + ", " + a4; } } diff --git a/onjava/Tuple5.java b/onjava/Tuple5.java index b10ebfec9..e346864dc 100644 --- a/onjava/Tuple5.java +++ b/onjava/Tuple5.java @@ -6,13 +6,13 @@ public class Tuple5 extends Tuple4 { - public final E _5; + public final E a5; public Tuple5(A a, B b, C c, D d, E e) { super(a, b, c, d); - _5 = e; + a5 = e; } @Override public String rep() { - return super.rep() + ", " + _5; + return super.rep() + ", " + a5; } } diff --git a/onjava/atunit/ClassNameFinder.java b/onjava/atunit/ClassNameFinder.java index 8c0eff78d..13592086e 100644 --- a/onjava/atunit/ClassNameFinder.java +++ b/onjava/atunit/ClassNameFinder.java @@ -19,9 +19,9 @@ public static String thisClass(byte[] classBytes) { int magic = data.readInt(); // 0xcafebabe int minorVersion = data.readShort(); int majorVersion = data.readShort(); - int constant_pool_count = data.readShort(); - int[] constant_pool = new int[constant_pool_count]; - for(int i = 1; i < constant_pool_count; i++) { + int constantPoolCount = data.readShort(); + int[] constantPool = new int[constantPoolCount]; + for(int i = 1; i < constantPoolCount; i++) { int tag = data.read(); // int tableSize; switch(tag) { @@ -65,13 +65,13 @@ public static String thisClass(byte[] classBytes) { throw new RuntimeException("Bad tag " + tag); } } - short access_flags = data.readShort(); - String access = (access_flags & 0x0001) == 0 ? + short accessFlags = data.readShort(); + String access = (accessFlags & 0x0001) == 0 ? "nonpublic:" : "public:"; - int this_class = data.readShort(); - int super_class = data.readShort(); + int thisClass = data.readShort(); + int superClass = data.readShort(); return access + classNameTable.get( - offsetTable.get(this_class)).replace('/', '.'); + offsetTable.get(thisClass)).replace('/', '.'); } catch(IOException | RuntimeException e) { throw new RuntimeException(e); } @@ -113,21 +113,21 @@ public static String thisClass(byte[] classBytes) { onjava.CollectionMethodDifferences onjava.ConvertTo onjava.Count$Boolean -onjava.Count$boolean_ +onjava.Count$Pboolean onjava.Count$Byte -onjava.Count$byte_ +onjava.Count$Pbyte onjava.Count$Character -onjava.Count$char_ +onjava.Count$Pchar onjava.Count$Double -onjava.Count$double_ +onjava.Count$Pdouble onjava.Count$Float -onjava.Count$float_ +onjava.Count$Pfloat onjava.Count$Integer -onjava.Count$int_ +onjava.Count$Pint onjava.Count$Long -onjava.Count$long_ +onjava.Count$Plong onjava.Count$Short -onjava.Count$short_ +onjava.Count$Pshort onjava.Count onjava.CountingIntegerList onjava.CountMap @@ -144,21 +144,21 @@ public static String thisClass(byte[] classBytes) { onjava.ProcessFiles$Strategy onjava.ProcessFiles onjava.Rand$Boolean -onjava.Rand$boolean_ +onjava.Rand$Pboolean onjava.Rand$Byte -onjava.Rand$byte_ +onjava.Rand$Pbyte onjava.Rand$Character -onjava.Rand$char_ +onjava.Rand$Pchar onjava.Rand$Double -onjava.Rand$double_ +onjava.Rand$Pdouble onjava.Rand$Float -onjava.Rand$float_ +onjava.Rand$Pfloat onjava.Rand$Integer -onjava.Rand$int_ +onjava.Rand$Pint onjava.Rand$Long -onjava.Rand$long_ +onjava.Rand$Plong onjava.Rand$Short -onjava.Rand$short_ +onjava.Rand$Pshort onjava.Rand$String onjava.Rand onjava.Range diff --git a/operators/Precedence.java b/operators/Precedence.java index b77adfe51..150817978 100644 --- a/operators/Precedence.java +++ b/operators/Precedence.java @@ -6,8 +6,8 @@ public class Precedence { public static void main(String[] args) { int x = 1, y = 2, z = 3; - int a = x + y - 2/2 + z; // (1) - int b = x + (y - 2)/(2 + z); // (2) + int a = x + y - 2/2 + z; // [1] + int b = x + (y - 2)/(2 + z); // [2] System.out.println("a = " + a); System.out.println("b = " + b); } diff --git a/operators/Underscores.java b/operators/Underscores.java index de9a0c1e9..ccd56425c 100644 --- a/operators/Underscores.java +++ b/operators/Underscores.java @@ -9,9 +9,9 @@ public static void main(String[] args) { System.out.println(d); int bin = 0b0010_1111_1010_1111_1010_1111_1010_1111; System.out.println(Integer.toBinaryString(bin)); - System.out.printf("%x\n", bin); + System.out.printf("%x%n", bin); long hex = 0x7f_e9_b7_aa; - System.out.printf("%x\n", hex); + System.out.printf("%x%n", hex); } } /* Output: diff --git a/patterns/PaperScissorsRock.java b/patterns/PaperScissorsRock.java index 247641b52..8ea0bcf39 100644 --- a/patterns/PaperScissorsRock.java +++ b/patterns/PaperScissorsRock.java @@ -85,10 +85,10 @@ class ItemFactory { static List> items = Arrays.asList( Scissors::new, Paper::new, Rock::new); - final static int sz = items.size(); + static final int SZ = items.size(); private static SplittableRandom rand = new SplittableRandom(47); public static Item newItem() { - return items.get(rand.nextInt(sz)).get(); + return items.get(rand.nextInt(SZ)).get(); } public static Tuple2 newPair() { return tuple(newItem(), newItem()); @@ -97,8 +97,8 @@ public static Tuple2 newPair() { class Compete { public static Outcome match(Tuple2 p) { - System.out.print(p._1 + " -> " + p._2 + " : "); - return p._1.compete(p._2); + System.out.print(p.a1 + " -> " + p.a2 + " : "); + return p.a1.compete(p.a2); } } diff --git a/patterns/ShapeFactory2.java b/patterns/ShapeFactory2.java index 4a66eb0ba..3a82b47d3 100644 --- a/patterns/ShapeFactory2.java +++ b/patterns/ShapeFactory2.java @@ -7,7 +7,6 @@ import java.util.function.*; import java.util.stream.*; - class BadShapeCreation extends RuntimeException { BadShapeCreation(String msg) { super(msg); @@ -22,8 +21,7 @@ interface Shape { abstract class ShapeFactory { static Map> factories = new HashMap<>(); - static Shape createShape(String id) - throws BadShapeCreation { + static Shape createShape(String id) { if(!factories.containsKey(id)) { try { Class.forName(id); // Load dynamically @@ -38,7 +36,7 @@ static Shape createShape(String id) } } -class Circle implements Shape { +final class Circle implements Shape { private Circle() {} public void draw() { System.out.println("Circle.draw"); @@ -51,7 +49,7 @@ public void erase() { } } -class Square implements Shape { +final class Square implements Shape { private Square() {} public void draw() { System.out.println("Square.draw"); diff --git a/patterns/factory/ShapeFactory1.java b/patterns/factory/ShapeFactory1.java index a2c755724..147d4c4df 100644 --- a/patterns/factory/ShapeFactory1.java +++ b/patterns/factory/ShapeFactory1.java @@ -17,8 +17,7 @@ class BadShapeCreation extends RuntimeException { abstract class Shape { public abstract void draw(); public abstract void erase(); - static Shape factory(String type) - throws BadShapeCreation { + static Shape factory(String type) { switch(type) { case "Circle": return new Circle(); case "Square": return new Square(); diff --git a/patterns/recyclea/RecycleA.java b/patterns/recyclea/RecycleA.java index 0f09b392a..02e35008e 100644 --- a/patterns/recyclea/RecycleA.java +++ b/patterns/recyclea/RecycleA.java @@ -65,11 +65,11 @@ class TrashFactory { static List> ttypes = Arrays.asList( Aluminum::new, Paper::new, Glass::new); - final static int sz = ttypes.size(); + static final int SZ = ttypes.size(); private static SplittableRandom rand = new SplittableRandom(47); public static Trash newTrash() { return ttypes - .get(rand.nextInt(sz)) + .get(rand.nextInt(SZ)) .apply(rand.nextDouble()); } } diff --git a/patterns/state/StateMachineDemo.java b/patterns/state/StateMachineDemo.java index d184a132e..51a5f66f4 100644 --- a/patterns/state/StateMachineDemo.java +++ b/patterns/state/StateMachineDemo.java @@ -12,7 +12,7 @@ interface State { abstract class StateMachine { protected State currentState; - abstract protected boolean changeState(); + protected abstract boolean changeState(); // Template method: protected final void runAll() { while(changeState()) // Customizable @@ -55,7 +55,7 @@ public void run() { class Washer extends StateMachine { private int i = 0; // The state table: - private State states[] = { + private State[] states = { new Wash(), new Spin(), new Rinse(), new Spin(), }; diff --git a/patterns/visitor/BeeAndFlowers.java b/patterns/visitor/BeeAndFlowers.java index b94eb94b2..d5fbb11eb 100644 --- a/patterns/visitor/BeeAndFlowers.java +++ b/patterns/visitor/BeeAndFlowers.java @@ -74,10 +74,10 @@ class FlowerFactory { static List> flowers = Arrays.asList(Gladiolus::new, Renuculus::new, Chrysanthemum::new); - final static int sz = flowers.size(); + static final int SZ = flowers.size(); private static SplittableRandom rand = new SplittableRandom(47); public static Flower newFlower() { - return flowers.get(rand.nextInt(sz)).get(); + return flowers.get(rand.nextInt(SZ)).get(); } } diff --git a/patterns/visualobserver/BoxObserver.java b/patterns/visualobserver/BoxObserver.java index 680687312..d0cb06a68 100644 --- a/patterns/visualobserver/BoxObserver.java +++ b/patterns/visualobserver/BoxObserver.java @@ -49,7 +49,7 @@ class OCBox extends JPanel implements Observer { Observable notifier; int x, y; // Locations in grid Color cColor = newColor(); - static final Color[] colors = { + static final Color[] COLORS = { Color.black, Color.blue, Color.cyan, Color.darkGray, Color.gray, Color.green, Color.lightGray, Color.magenta, @@ -57,8 +57,8 @@ class OCBox extends JPanel implements Observer { Color.white, Color.yellow }; static Color newColor() { - return colors[ - (int)(Math.random() * colors.length) + return COLORS[ + (int)(Math.random() * COLORS.length) ]; } OCBox(int x, int y, Observable notifier) { diff --git a/references/Alias1.java b/references/Alias1.java index 0e0e3c8b6..02051d3f7 100644 --- a/references/Alias1.java +++ b/references/Alias1.java @@ -13,7 +13,7 @@ public static void main(String[] args) { System.out.println("x: " + x.i); System.out.println("y: " + y.i); System.out.println("Incrementing x"); - x.i++; // (2) + x.i++; // [2] System.out.println("x: " + x.i); System.out.println("y: " + y.i); } diff --git a/references/CopyConstructor.java b/references/CopyConstructor.java index f8d3ce619..4c100559a 100644 --- a/references/CopyConstructor.java +++ b/references/CopyConstructor.java @@ -112,7 +112,7 @@ public void evaluate() { public class CopyConstructor { public static void ripen(Tomato t) { // Use the "copy constructor": - t = new Tomato(t); // (1) + t = new Tomato(t); // [1] System.out.println("In ripen, t is a " + t.getClass().getName()); } diff --git a/references/ImmutableInteger.java b/references/ImmutableInteger.java index 516bab0a6..ab475a8b2 100644 --- a/references/ImmutableInteger.java +++ b/references/ImmutableInteger.java @@ -9,7 +9,7 @@ public class ImmutableInteger { public static void main(String[] args) { List v = new ArrayList<>(); for(int i = 0; i < 10; i++) - v.add(new Integer(i)); + v.add(Integer.valueOf(i)); // But how do you change the int // inside the Integer? } diff --git a/reuse/SprinklerSystem.java b/reuse/SprinklerSystem.java index 79cd4c0bf..4931e593f 100644 --- a/reuse/SprinklerSystem.java +++ b/reuse/SprinklerSystem.java @@ -27,7 +27,7 @@ public String toString() { "valve3 = " + valve3 + " " + "valve4 = " + valve4 + "\n" + "i = " + i + " " + "f = " + f + " " + - "source = " + source; // (1) + "source = " + source; // [1] } public static void main(String[] args) { SprinklerSystem sprinklers = new SprinklerSystem(); diff --git a/streams/ForEach.java b/streams/ForEach.java index ad2edd95f..64364fe06 100644 --- a/streams/ForEach.java +++ b/streams/ForEach.java @@ -7,16 +7,16 @@ import static streams.RandInts.*; public class ForEach { - final static int sz = 14; + static final int SZ = 14; public static void main(String[] args) { - rands().limit(sz) + rands().limit(SZ) .forEach(n -> System.out.format("%d ", n)); System.out.println(); - rands().limit(sz) + rands().limit(SZ) .parallel() .forEach(n -> System.out.format("%d ", n)); System.out.println(); - rands().limit(sz) + rands().limit(SZ) .parallel() .forEachOrdered(n -> System.out.format("%d ", n)); } diff --git a/streams/Optionals.java b/streams/Optionals.java index 774df4b5e..a54e9d3ec 100644 --- a/streams/Optionals.java +++ b/streams/Optionals.java @@ -13,17 +13,17 @@ static void basics(Optional optString) { else System.out.println("Nothing inside!"); } - static void if_present(Optional optString) { + static void ifPresent(Optional optString) { optString.ifPresent(System.out::println); } - static void or_else(Optional optString) { + static void orElse(Optional optString) { System.out.println(optString.orElse("Nada")); } - static void or_else_get(Optional optString) { + static void orElseGet(Optional optString) { System.out.println( optString.orElseGet(() -> "Generated")); } - static void or_else_throw(Optional optString) { + static void orElseThrow(Optional optString) { try { System.out.println(optString.orElseThrow( () -> new Exception("Supplied"))); @@ -39,10 +39,10 @@ static void or_else_throw(Optional optString) { } public static void main(String[] args) { test("basics", Optionals::basics); - test("ifPresent", Optionals::if_present); - test("orElse", Optionals::or_else); - test("orElseGet", Optionals::or_else_get); - test("orElseThrow", Optionals::or_else_throw); + test("ifPresent", Optionals::ifPresent); + test("orElse", Optionals::orElse); + test("orElseGet", Optionals::orElseGet); + test("orElseThrow", Optionals::orElseThrow); } } /* Output: diff --git a/streams/Reduce.java b/streams/Reduce.java index 722370899..c02ba4963 100644 --- a/streams/Reduce.java +++ b/streams/Reduce.java @@ -14,9 +14,9 @@ public String toString() { } // Generator: static Random rand = new Random(47); - static final int bound = 100; + static final int BOUND = 100; static Frobnitz supply() { - return new Frobnitz(rand.nextInt(bound)); + return new Frobnitz(rand.nextInt(BOUND)); } } diff --git a/strings/BetterRead.java b/strings/BetterRead.java index 0bc2e4906..7c7ec9b1b 100644 --- a/strings/BetterRead.java +++ b/strings/BetterRead.java @@ -17,8 +17,8 @@ public static void main(String[] args) { double favorite = stdin.nextDouble(); System.out.println(age); System.out.println(favorite); - System.out.format("Hi %s.\n", name); - System.out.format("In 5 years you will be %d.\n", + System.out.format("Hi %s.%n", name); + System.out.format("In 5 years you will be %d.%n", age + 5); System.out.format("My favorite double is %f.", favorite / 2); diff --git a/strings/Conversion.java b/strings/Conversion.java index 425e63c95..c708b5f4e 100644 --- a/strings/Conversion.java +++ b/strings/Conversion.java @@ -11,70 +11,70 @@ public static void main(String[] args) { char u = 'a'; System.out.println("u = 'a'"); - f.format("s: %s\n", u); - // f.format("d: %d\n", u); - f.format("c: %c\n", u); - f.format("b: %b\n", u); - // f.format("f: %f\n", u); - // f.format("e: %e\n", u); - // f.format("x: %x\n", u); - f.format("h: %h\n", u); + f.format("s: %s%n", u); + // f.format("d: %d%n", u); + f.format("c: %c%n", u); + f.format("b: %b%n", u); + // f.format("f: %f%n", u); + // f.format("e: %e%n", u); + // f.format("x: %x%n", u); + f.format("h: %h%n", u); int v = 121; System.out.println("v = 121"); - f.format("d: %d\n", v); - f.format("c: %c\n", v); - f.format("b: %b\n", v); - f.format("s: %s\n", v); - // f.format("f: %f\n", v); - // f.format("e: %e\n", v); - f.format("x: %x\n", v); - f.format("h: %h\n", v); + f.format("d: %d%n", v); + f.format("c: %c%n", v); + f.format("b: %b%n", v); + f.format("s: %s%n", v); + // f.format("f: %f%n", v); + // f.format("e: %e%n", v); + f.format("x: %x%n", v); + f.format("h: %h%n", v); BigInteger w = new BigInteger("50000000000000"); System.out.println( "w = new BigInteger(\"50000000000000\")"); - f.format("d: %d\n", w); - // f.format("c: %c\n", w); - f.format("b: %b\n", w); - f.format("s: %s\n", w); - // f.format("f: %f\n", w); - // f.format("e: %e\n", w); - f.format("x: %x\n", w); - f.format("h: %h\n", w); + f.format("d: %d%n", w); + // f.format("c: %c%n", w); + f.format("b: %b%n", w); + f.format("s: %s%n", w); + // f.format("f: %f%n", w); + // f.format("e: %e%n", w); + f.format("x: %x%n", w); + f.format("h: %h%n", w); double x = 179.543; System.out.println("x = 179.543"); - // f.format("d: %d\n", x); - // f.format("c: %c\n", x); - f.format("b: %b\n", x); - f.format("s: %s\n", x); - f.format("f: %f\n", x); - f.format("e: %e\n", x); - // f.format("x: %x\n", x); - f.format("h: %h\n", x); + // f.format("d: %d%n", x); + // f.format("c: %c%n", x); + f.format("b: %b%n", x); + f.format("s: %s%n", x); + f.format("f: %f%n", x); + f.format("e: %e%n", x); + // f.format("x: %x%n", x); + f.format("h: %h%n", x); Conversion y = new Conversion(); System.out.println("y = new Conversion()"); - // f.format("d: %d\n", y); - // f.format("c: %c\n", y); - f.format("b: %b\n", y); - f.format("s: %s\n", y); - // f.format("f: %f\n", y); - // f.format("e: %e\n", y); - // f.format("x: %x\n", y); - f.format("h: %h\n", y); + // f.format("d: %d%n", y); + // f.format("c: %c%n", y); + f.format("b: %b%n", y); + f.format("s: %s%n", y); + // f.format("f: %f%n", y); + // f.format("e: %e%n", y); + // f.format("x: %x%n", y); + f.format("h: %h%n", y); boolean z = false; System.out.println("z = false"); - // f.format("d: %d\n", z); - // f.format("c: %c\n", z); - f.format("b: %b\n", z); - f.format("s: %s\n", z); - // f.format("f: %f\n", z); - // f.format("e: %e\n", z); - // f.format("x: %x\n", z); - f.format("h: %h\n", z); + // f.format("d: %d%n", z); + // f.format("c: %c%n", z); + f.format("b: %b%n", z); + f.format("s: %s%n", z); + // f.format("f: %f%n", z); + // f.format("e: %e%n", z); + // f.format("x: %x%n", z); + f.format("h: %h%n", z); } } /* Output: diff --git a/strings/Groups.java b/strings/Groups.java index 0de006c13..6eda4978e 100644 --- a/strings/Groups.java +++ b/strings/Groups.java @@ -5,7 +5,7 @@ import java.util.regex.*; public class Groups { - static public final String POEM = + public static final String POEM = "Twas brillig, and the slithy toves\n" + "Did gyre and gimble in the wabe.\n" + "All mimsy were the borogoves,\n" + diff --git a/strings/ReceiptBuilder.java b/strings/ReceiptBuilder.java index 238234630..50c3955de 100644 --- a/strings/ReceiptBuilder.java +++ b/strings/ReceiptBuilder.java @@ -9,17 +9,17 @@ public class ReceiptBuilder { private Formatter f = new Formatter(new StringBuilder()); public ReceiptBuilder() { - f.format("%-15s %5s %10s\n", "Item", "Qty", "Price"); - f.format("%-15s %5s %10s\n", "----", "---", "-----"); + f.format("%-15s %5s %10s%n", "Item", "Qty", "Price"); + f.format("%-15s %5s %10s%n", "----", "---", "-----"); } public void add(String name, int qty, double price) { - f.format("%-15.15s %5d %10.2f\n", name, qty, price); + f.format("%-15.15s %5d %10.2f%n", name, qty, price); total += price * qty; } public String build() { - f.format("%-15s %5s %10.2f\n", "Tax", "", total*0.06); - f.format("%-15s %5s %10s\n", "", "", "-----"); - f.format("%-15s %5s %10.2f\n", "Total", "", + f.format("%-15s %5s %10.2f%n", "Tax", "", total*0.06); + f.format("%-15s %5s %10s%n", "", "", "-----"); + f.format("%-15s %5s %10.2f%n", "Total", "", total * 1.06); return f.toString(); } diff --git a/strings/SimpleFormat.java b/strings/SimpleFormat.java index 28d0ef4e6..cad6b84c0 100644 --- a/strings/SimpleFormat.java +++ b/strings/SimpleFormat.java @@ -10,9 +10,9 @@ public static void main(String[] args) { // The old way: System.out.println("Row 1: [" + x + " " + y + "]"); // The new way: - System.out.format("Row 1: [%d %f]\n", x, y); + System.out.format("Row 1: [%d %f]%n", x, y); // or - System.out.printf("Row 1: [%d %f]\n", x, y); + System.out.printf("Row 1: [%d %f]%n", x, y); } } /* Output: diff --git a/strings/SimpleRead.java b/strings/SimpleRead.java index 8fc5fd638..0dce6612a 100644 --- a/strings/SimpleRead.java +++ b/strings/SimpleRead.java @@ -20,8 +20,8 @@ public static void main(String[] args) { String[] numArray = numbers.split(" "); int age = Integer.parseInt(numArray[0]); double favorite = Double.parseDouble(numArray[1]); - System.out.format("Hi %s.\n", name); - System.out.format("In 5 years you will be %d.\n", + System.out.format("Hi %s.%n", name); + System.out.format("In 5 years you will be %d.%n", age + 5); System.out.format("My favorite double is %f.", favorite / 2); diff --git a/strings/ThreatAnalyzer.java b/strings/ThreatAnalyzer.java index c25f64e80..920f62b0e 100644 --- a/strings/ThreatAnalyzer.java +++ b/strings/ThreatAnalyzer.java @@ -23,7 +23,7 @@ public static void main(String[] args) { String ip = match.group(1); String date = match.group(2); System.out.format( - "Threat on %s from %s\n", date,ip); + "Threat on %s from %s%n", date,ip); } } } diff --git a/strings/Turtle.java b/strings/Turtle.java index a7a67b272..a499a7aac 100644 --- a/strings/Turtle.java +++ b/strings/Turtle.java @@ -13,7 +13,7 @@ public Turtle(String name, Formatter f) { this.f = f; } public void move(int x, int y) { - f.format("%s The Turtle is at (%d,%d)\n", name, x, y); + f.format("%s The Turtle is at (%d,%d)%n", name, x, y); } public static void main(String[] args) { PrintStream outAlias = System.out; diff --git a/threads/CachedThreadPool3.java b/threads/CachedThreadPool3.java index 98bf0f1c6..967fd16c6 100644 --- a/threads/CachedThreadPool3.java +++ b/threads/CachedThreadPool3.java @@ -8,7 +8,7 @@ public class CachedThreadPool3 { public static Integer - extract_result(Future f) { + extractResult(Future f) { try { return f.get(); } catch(Exception e) { @@ -26,7 +26,7 @@ public static void main(String[] args) List> futures = exec.invokeAll(tasks); Integer sum = futures.stream() - .map(CachedThreadPool3::extract_result) + .map(CachedThreadPool3::extractResult) .reduce(0, Integer::sum); System.out.println("sum = " + sum); exec.shutdown(); diff --git a/threads/CarBuilder.java b/threads/CarBuilder.java index 8cb9a2633..a56241387 100644 --- a/threads/CarBuilder.java +++ b/threads/CarBuilder.java @@ -107,8 +107,8 @@ public void run() { abstract class Robot implements Runnable { private RobotPool pool; - public Robot(RobotPool p) { pool = p; } protected Assembler assembler; + public Robot(RobotPool p) { pool = p; } public Robot assignAssembler(Assembler assembler) { this.assembler = assembler; return this; @@ -119,7 +119,7 @@ public synchronized void engage() { notifyAll(); } // The part of run() that's different for each robot: - abstract protected void performService(); + protected abstract void performService(); public void run() { try { powerDown(); // Wait until needed diff --git a/threads/Futures.java b/threads/Futures.java index 1fcf5b7da..7af939649 100644 --- a/threads/Futures.java +++ b/threads/Futures.java @@ -13,7 +13,7 @@ public static void main(String[] args) Executors.newSingleThreadExecutor(); Future f = exec.submit(new CountingTask(99)); - System.out.println(f.get()); //(1) + System.out.println(f.get()); // [1] exec.shutdown(); } } diff --git a/threads/ParallelStreamPuzzle.java b/threads/ParallelStreamPuzzle.java index 8798c6492..9855af2b7 100644 --- a/threads/ParallelStreamPuzzle.java +++ b/threads/ParallelStreamPuzzle.java @@ -18,7 +18,7 @@ public static void main(String[] args) { List x = Stream.generate(new IntGenerator()) .limit(10) - .parallel() // (1) + .parallel() // [1] .collect(Collectors.toList()); System.out.println(x); } diff --git a/threads/ParallelStreamPuzzle2.java b/threads/ParallelStreamPuzzle2.java index 7ced862ba..0dab06ca7 100644 --- a/threads/ParallelStreamPuzzle2.java +++ b/threads/ParallelStreamPuzzle2.java @@ -14,7 +14,7 @@ public class ParallelStreamPuzzle2 { static class IntGenerator implements Supplier { private int current = 0; - public synchronized Integer get() { // (1) + public synchronized Integer get() { // [1] trace.add(current + ": " + Thread.currentThread().getName()); return current++; diff --git a/threads/Prime.java b/threads/Prime.java index deed762ec..9f4e88417 100644 --- a/threads/Prime.java +++ b/threads/Prime.java @@ -20,7 +20,7 @@ public static void main(String[] args) long start = System.currentTimeMillis(); List primes = iterate(2, i -> i + 1) - .parallel() //(1) + .parallel() // [1] .filter(Prime::isPrime) .limit(COUNT) .mapToObj(Long::toString) diff --git a/threads/Summing.java b/threads/Summing.java index 34b4de185..3086be1f4 100644 --- a/threads/Summing.java +++ b/threads/Summing.java @@ -16,13 +16,13 @@ static void timeTest(String id, long checkValue, if(result == checkValue) System.out.println(duration + "ms"); else - System.out.format("result: %d\ncheckValue: %d\n", + System.out.format("result: %d%ncheckValue: %d%n", result, checkValue); x = result; // Prevent optimization } - public static int SZ = 100_000_000; + public static final int SZ = 100_000_000; // This even works: - // public static int SZ = 1_000_000_000; + // public static final int SZ = 1_000_000_000; // Gauss's formula: public static final long CHECK = (long)SZ * ((long)SZ + 1)/2; diff --git a/threads/Summing2.java b/threads/Summing2.java index 3e5f28e36..ccc0f1ba1 100644 --- a/threads/Summing2.java +++ b/threads/Summing2.java @@ -7,14 +7,14 @@ public class Summing2 { static long basicSum(long[] ia) { long sum = 0; - final int sz = ia.length; - for(int i = 0; i < sz; i++) + int size = ia.length; + for(int i = 0; i < size; i++) sum += ia[i]; return sum; } // Approximate largest value of SZ before // running out of memory on my machine: - public static int SZ = 20_000_000; + public static final int SZ = 20_000_000; public static final long CHECK = (long)SZ * ((long)SZ + 1)/2; public static void main(String[] args) { diff --git a/threads/Summing3.java b/threads/Summing3.java index eba4c5bef..9d0e446e9 100644 --- a/threads/Summing3.java +++ b/threads/Summing3.java @@ -7,29 +7,29 @@ public class Summing3 { static long basicSum(Long[] ia) { long sum = 0; - final int sz = ia.length; - for(int i = 0; i < sz; i++) + int size = ia.length; + for(int i = 0; i < size; i++) sum += ia[i]; return sum; } // Approximate largest value of SZ before // running out of memory on my machine: - public static int SZ = 10_000_000; + public static final int SZ = 10_000_000; public static final long CHECK = (long)SZ * ((long)SZ + 1)/2; public static void main(String[] args) { System.out.println(CHECK); - Long[] La = new Long[SZ+1]; - Arrays.parallelSetAll(La, i -> (long)i); + Long[] aL = new Long[SZ+1]; + Arrays.parallelSetAll(aL, i -> (long)i); Summing.timeTest("Long Array Stream Reduce", CHECK, () -> - Arrays.stream(La).reduce(0L, Long::sum)); + Arrays.stream(aL).reduce(0L, Long::sum)); Summing.timeTest("Long Basic Sum", CHECK, () -> - basicSum(La)); + basicSum(aL)); // Destructive summation: Summing.timeTest("Long parallelPrefix",CHECK, ()-> { - Arrays.parallelPrefix(La, Long::sum); - return La[La.length - 1]; + Arrays.parallelPrefix(aL, Long::sum); + return aL[aL.length - 1]; }); } } diff --git a/threads/Summing4.java b/threads/Summing4.java index 7cc6a63b5..c068e55dd 100644 --- a/threads/Summing4.java +++ b/threads/Summing4.java @@ -7,11 +7,11 @@ public class Summing4 { public static void main(String[] args) { System.out.println(Summing3.CHECK); - Long[] La = new Long[Summing3.SZ+1]; - Arrays.parallelSetAll(La, i -> (long)i); + Long[] aL = new Long[Summing3.SZ+1]; + Arrays.parallelSetAll(aL, i -> (long)i); Summing.timeTest("Long Parallel", Summing3.CHECK, () -> - Arrays.stream(La).parallel().reduce(0L,Long::sum)); + Arrays.stream(aL).parallel().reduce(0L,Long::sum)); } } /* Output: diff --git a/threads/restaurant2/RestaurantWithQueues.java b/threads/restaurant2/RestaurantWithQueues.java index b3b5ed467..30101d7f4 100644 --- a/threads/restaurant2/RestaurantWithQueues.java +++ b/threads/restaurant2/RestaurantWithQueues.java @@ -31,7 +31,7 @@ public String toString() { } } -// This is what comes back from the chef: +// This comes back from the chef: class Plate { private final Order order; private final Food food; diff --git a/typeinfo/ClassInitialization.java b/typeinfo/ClassInitialization.java index d0cd074bc..f87a2222a 100644 --- a/typeinfo/ClassInitialization.java +++ b/typeinfo/ClassInitialization.java @@ -5,8 +5,8 @@ import java.util.*; class Initable { - static final int staticFinal = 47; - static final int staticFinal2 = + static final int STATIC_FINAL = 47; + static final int STATIC_FINAL2 = ClassInitialization.rand.nextInt(1000); static { System.out.println("Initializing Initable"); @@ -34,9 +34,9 @@ public class ClassInitialization { Class initable = Initable.class; System.out.println("After creating Initable ref"); // Does not trigger initialization: - System.out.println(Initable.staticFinal); + System.out.println(Initable.STATIC_FINAL); // Does trigger initialization: - System.out.println(Initable.staticFinal2); + System.out.println(Initable.STATIC_FINAL2); // Does trigger initialization: System.out.println(Initable2.staticNonFinal); Class initable3 = Class.forName("Initable3"); diff --git a/typeinfo/HiddenImplementation.java b/typeinfo/HiddenImplementation.java index a1de7c487..9891843bc 100644 --- a/typeinfo/HiddenImplementation.java +++ b/typeinfo/HiddenImplementation.java @@ -20,7 +20,7 @@ public class HiddenImplementation { } */ // Oops! Reflection still allows us to call g(): callHiddenMethod(a, "g"); - // And even methods that are less accessible! + // And even less accessible methods! callHiddenMethod(a, "u"); callHiddenMethod(a, "v"); callHiddenMethod(a, "w"); diff --git a/typeinfo/PetCount2.java b/typeinfo/PetCount2.java index 0adfde0d4..073d1dab4 100644 --- a/typeinfo/PetCount2.java +++ b/typeinfo/PetCount2.java @@ -6,7 +6,7 @@ public class PetCount2 { public static void main(String[] args) { - PetCount.countPets(Pets.creator); + PetCount.countPets(Pets.CREATOR); } } /* Output: diff --git a/typeinfo/PetCount3.java b/typeinfo/PetCount3.java index b72181085..a7259c176 100644 --- a/typeinfo/PetCount3.java +++ b/typeinfo/PetCount3.java @@ -12,7 +12,7 @@ public class PetCount3 { static class Counter extends LinkedHashMap, Integer> { public Counter() { - super(LiteralPetCreator.allTypes.stream() + super(LiteralPetCreator.ALL_TYPES.stream() .map(lpc -> Pair.make(lpc, 0)) .collect( Collectors.toMap(Pair::key, Pair::value))); diff --git a/typeinfo/Robot.java b/typeinfo/Robot.java index 180e2296e..ca13cc22d 100644 --- a/typeinfo/Robot.java +++ b/typeinfo/Robot.java @@ -9,7 +9,7 @@ public interface Robot { String name(); String model(); List operations(); - public static void test(Robot r) { + static void test(Robot r) { if(r instanceof Null) System.out.println("[Null Robot]"); System.out.println("Robot name: " + r.name()); diff --git a/typeinfo/Shapes.java b/typeinfo/Shapes.java index 94c20971e..d6c169e65 100644 --- a/typeinfo/Shapes.java +++ b/typeinfo/Shapes.java @@ -7,7 +7,7 @@ abstract class Shape { void draw() { System.out.println(this + ".draw()"); } @Override - abstract public String toString(); + public abstract String toString(); } class Circle extends Shape { diff --git a/typeinfo/pets/ForNameCreator.java b/typeinfo/pets/ForNameCreator.java index 1a7696ee8..cbfdbaf5b 100644 --- a/typeinfo/pets/ForNameCreator.java +++ b/typeinfo/pets/ForNameCreator.java @@ -8,7 +8,7 @@ public class ForNameCreator extends PetCreator { private static List> types = new ArrayList<>(); - // Types that you want randomly created: + // Types you want randomly created: private static String[] typeNames = { "typeinfo.pets.Mutt", "typeinfo.pets.Pug", diff --git a/typeinfo/pets/LiteralPetCreator.java b/typeinfo/pets/LiteralPetCreator.java index d06e6df03..f94f358d9 100644 --- a/typeinfo/pets/LiteralPetCreator.java +++ b/typeinfo/pets/LiteralPetCreator.java @@ -11,22 +11,22 @@ public class LiteralPetCreator extends PetCreator { // No try block needed. @SuppressWarnings("unchecked") public static - final List> allTypes = + final List> ALL_TYPES = Collections.unmodifiableList(Arrays.asList( Pet.class, Dog.class, Cat.class, Rodent.class, Mutt.class, Pug.class, EgyptianMau.class, Manx.class, Cymric.class, Rat.class, Mouse.class, Hamster.class)); // Types for random creation: - private static final List> types = - allTypes.subList(allTypes.indexOf(Mutt.class), - allTypes.size()); + private static final List> TYPES = + ALL_TYPES.subList(ALL_TYPES.indexOf(Mutt.class), + ALL_TYPES.size()); @Override public List> types() { - return types; + return TYPES; } public static void main(String[] args) { - System.out.println(types); + System.out.println(TYPES); } } /* Output: diff --git a/typeinfo/pets/Pets.java b/typeinfo/pets/Pets.java index 1da72b065..c7cce4d08 100644 --- a/typeinfo/pets/Pets.java +++ b/typeinfo/pets/Pets.java @@ -8,15 +8,15 @@ import java.util.stream.*; public class Pets { - public static final PetCreator creator = + public static final PetCreator CREATOR = new LiteralPetCreator(); public static Pet get() { - return creator.get(); + return CREATOR.get(); } public static Pet[] array(int size) { Pet[] result = new Pet[size]; for(int i = 0; i < size; i++) - result[i] = creator.get(); + result[i] = CREATOR.get(); return result; } public static List list(int size) { @@ -25,6 +25,6 @@ public static List list(int size) { return result; } public static Stream stream() { - return Stream.generate(creator); + return Stream.generate(CREATOR); } } diff --git a/understandingcollections/CollectionMethods.java b/understandingcollections/CollectionMethods.java index f1eee0366..eaea13837 100644 --- a/understandingcollections/CollectionMethods.java +++ b/understandingcollections/CollectionMethods.java @@ -4,15 +4,16 @@ // Visit http://OnJava8.com for more book information. // Things you can do with all Collections import java.util.*; -import onjava.*; +import static onjava.HTMLColors.*; public class CollectionMethods { public static void main(String[] args) { - Collection c = new ArrayList<>(); - c.addAll(Countries.names(6)); + Collection c = + new ArrayList<>(LIST.subList(0, 4)); c.add("ten"); c.add("eleven"); - System.out.println(c); + show(c); + border(); // Make an array from the List: Object[] array = c.toArray(); // Make a String array from the List: @@ -24,23 +25,26 @@ public static void main(String[] args) { "Collections.max(c) = " + Collections.max(c)); System.out.println( "Collections.min(c) = " + Collections.min(c)); + border(); // Add a Collection to another Collection - Collection c2 = new ArrayList<>(); - c2.addAll(Countries.names(6)); + Collection c2 = + new ArrayList<>(LIST.subList(10, 14)); c.addAll(c2); - System.out.println(c); - c.remove(Countries.DATA[0][0]); - System.out.println(c); - c.remove(Countries.DATA[1][0]); - System.out.println(c); + show(c); + border(); + c.remove(LIST.get(0)); + show(c); + border(); // Remove all components that are // in the argument collection: c.removeAll(c2); - System.out.println(c); + show(c); + border(); c.addAll(c2); - System.out.println(c); + show(c); + border(); // Is an element in this Collection? - String val = Countries.DATA[3][0]; + String val = LIST.get(3); System.out.println( "c.contains(" + val + ") = " + c.contains(val)); // Is a Collection in this Collection? @@ -51,38 +55,80 @@ public static void main(String[] args) { // Keep all the elements that are in both // c2 and c3 (an intersection of sets): c2.retainAll(c3); - System.out.println(c2); + show(c2); // Throw away all the elements // in c2 that also appear in c3: c2.removeAll(c3); System.out.println("c2.isEmpty() = " + c2.isEmpty()); - c = new ArrayList<>(); - c.addAll(Countries.names(6)); - System.out.println(c); + border(); + // Functional operation: + c = new ArrayList<>(LIST); + c.removeIf(s -> !s.startsWith("P")); + c.removeIf(s -> s.startsWith("Pale")); + // Stream operation: + c.stream().forEach(System.out::println); c.clear(); // Remove all elements System.out.println("after c.clear():" + c); } } /* Output: -[ALGERIA, ANGOLA, BENIN, BOTSWANA, BURKINA FASO, BURUNDI, -ten, eleven] +AliceBlue +AntiqueWhite +Aquamarine +Azure +ten +eleven +------------------------------ Collections.max(c) = ten -Collections.min(c) = ALGERIA -[ALGERIA, ANGOLA, BENIN, BOTSWANA, BURKINA FASO, BURUNDI, -ten, eleven, ALGERIA, ANGOLA, BENIN, BOTSWANA, BURKINA -FASO, BURUNDI] -[ANGOLA, BENIN, BOTSWANA, BURKINA FASO, BURUNDI, ten, -eleven, ALGERIA, ANGOLA, BENIN, BOTSWANA, BURKINA FASO, -BURUNDI] -[BENIN, BOTSWANA, BURKINA FASO, BURUNDI, ten, eleven, -ALGERIA, ANGOLA, BENIN, BOTSWANA, BURKINA FASO, BURUNDI] -[ten, eleven] -[ten, eleven, ALGERIA, ANGOLA, BENIN, BOTSWANA, BURKINA -FASO, BURUNDI] -c.contains(BOTSWANA) = true +Collections.min(c) = AliceBlue +------------------------------ +AliceBlue +AntiqueWhite +Aquamarine +Azure +ten +eleven +Brown +BurlyWood +CadetBlue +Chartreuse +------------------------------ +AntiqueWhite +Aquamarine +Azure +ten +eleven +Brown +BurlyWood +CadetBlue +Chartreuse +------------------------------ +AntiqueWhite +Aquamarine +Azure +ten +eleven +------------------------------ +AntiqueWhite +Aquamarine +Azure +ten +eleven +Brown +BurlyWood +CadetBlue +Chartreuse +------------------------------ +c.contains(Azure) = true c.containsAll(c2) = true -[ANGOLA, BENIN] c2.isEmpty() = true -[ALGERIA, ANGOLA, BENIN, BOTSWANA, BURKINA FASO, BURUNDI] +------------------------------ +PapayaWhip +PeachPuff +Peru +Pink +Plum +PowderBlue +Purple after c.clear():[] */ diff --git a/understandingcollections/HTMLColorTest.java b/understandingcollections/HTMLColorTest.java index 67011c8f3..7256bfcbb 100644 --- a/understandingcollections/HTMLColorTest.java +++ b/understandingcollections/HTMLColorTest.java @@ -5,15 +5,15 @@ import static onjava.HTMLColors.*; public class HTMLColorTest { - static final int DISPLAYSIZE = 20; + static final int DISPLAY_SIZE = 20; public static void main(String[] args) { - show(MAP, DISPLAYSIZE); + show(MAP, DISPLAY_SIZE); border(); - show_inv(INVMAP, DISPLAYSIZE); + showInv(INVMAP, DISPLAY_SIZE); border(); - show(LIST, DISPLAYSIZE); + show(LIST, DISPLAY_SIZE); border(); - showrgb(RGBLIST, DISPLAYSIZE); + showrgb(RGBLIST, DISPLAY_SIZE); } } /* Output: diff --git a/understandingcollections/SetOrder.java b/understandingcollections/SetOrder.java index aade89009..2ca1a832a 100644 --- a/understandingcollections/SetOrder.java +++ b/understandingcollections/SetOrder.java @@ -13,7 +13,7 @@ public class SetOrder { "java.util.LinkedHashSet", "java.util.concurrent.CopyOnWriteArraySet", }; - static List RLIST = + static final List RLIST = new ArrayList<>(HTMLColors.LIST); static { Collections.reverse(RLIST); @@ -21,7 +21,7 @@ public class SetOrder { public static void main(String[] args) throws Exception { for(String type: sets) { - System.out.format("[-> %s <-]\n", + System.out.format("[-> %s <-]%n", type.substring(type.lastIndexOf('.') + 1)); @SuppressWarnings("unchecked") Set set = (Set) diff --git a/understandingcollections/TypesForSets.java b/understandingcollections/TypesForSets.java index fd14711c6..33ebe1298 100644 --- a/understandingcollections/TypesForSets.java +++ b/understandingcollections/TypesForSets.java @@ -5,22 +5,25 @@ // Methods necessary to put your own type in a Set import java.util.*; import java.util.function.*; +import java.util.Objects; class SetType { int i; public SetType(int n) { i = n; } @Override public boolean equals(Object o) { - return o instanceof SetType && (i == ((SetType)o).i); + if (o == this) return true; + return o instanceof SetType && + Objects.equals(i, ((SetType)o).i); } @Override + public int hashCode() { return Objects.hash(i); } + @Override public String toString() { return Integer.toString(i); } } class HashType extends SetType { public HashType(int n) { super(n); } - @Override - public int hashCode() { return i; } } class TreeType extends SetType @@ -68,17 +71,13 @@ public static void main(String[] args) { } } /* Output: -[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] +[1, 2, 3, 4, 5, 6, 7, 8, 9, 0] [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] [9, 8, 7, 6, 5, 4, 3, 2, 1, 0] -[8, 6, 3, 5, 4, 2, 2, 1, 0, 3, 6, 7, 9, 1, 3, 1, 5, 0, 9, -8, 0, 9, 8, 7, 4, 6, 2, 4, 7, 5] -[2, 2, 1, 4, 6, 6, 8, 4, 9, 3, 0, 4, 8, 5, 8, 1, 7, 5, 5, -3, 1, 9, 6, 0, 7, 0, 9, 7, 2, 3] -[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, -9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9] -[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, -9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9] +[1, 2, 3, 4, 5, 6, 7, 8, 9, 0] +[1, 2, 3, 4, 5, 6, 7, 8, 9, 0] +[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] +[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] Expected: SetType cannot be cast to java.lang.Comparable Expected: HashType cannot be cast to java.lang.Comparable */ diff --git a/understandingcollections/jmh/Deques.java b/understandingcollections/jmh/Deques.java index ab50aa766..c124bcf37 100644 --- a/understandingcollections/jmh/Deques.java +++ b/understandingcollections/jmh/Deques.java @@ -36,6 +36,7 @@ public class Deques { private int size; @Setup + @SuppressWarnings("unchecked") public void setup() throws Exception { deque = (Deque) Class.forName(type).newInstance(); diff --git a/understandingcollections/jmh/Lists.java b/understandingcollections/jmh/Lists.java index 997b992a7..7cb1e566c 100644 --- a/understandingcollections/jmh/Lists.java +++ b/understandingcollections/jmh/Lists.java @@ -39,6 +39,7 @@ public class Lists { private ListIterator it; @Setup + @SuppressWarnings("unchecked") public void setup() throws Exception { list = (List) Class.forName(type).newInstance(); diff --git a/understandingcollections/jmh/Maps.java b/understandingcollections/jmh/Maps.java index 304016187..9edcba338 100644 --- a/understandingcollections/jmh/Maps.java +++ b/understandingcollections/jmh/Maps.java @@ -42,6 +42,7 @@ public class Maps { private String key; @Setup + @SuppressWarnings("unchecked") public void setup() throws Exception { map = (Map) Class.forName(type).newInstance(); diff --git a/understandingcollections/jmh/Queues.java b/understandingcollections/jmh/Queues.java index 8a9ebad76..2cd61f8d4 100644 --- a/understandingcollections/jmh/Queues.java +++ b/understandingcollections/jmh/Queues.java @@ -44,6 +44,7 @@ public class Queues { private int size; @Setup + @SuppressWarnings("unchecked") public void setup() throws Exception { queue = (Queue) Class.forName(type).newInstance(); diff --git a/understandingcollections/jmh/Sets.java b/understandingcollections/jmh/Sets.java index 98af1b474..3f3bf5a37 100644 --- a/understandingcollections/jmh/Sets.java +++ b/understandingcollections/jmh/Sets.java @@ -39,6 +39,7 @@ public class Sets { private String key; @Setup + @SuppressWarnings("unchecked") public void setup() throws Exception { set = (Set) Class.forName(type).newInstance(); diff --git a/validating/Inverter4.java b/validating/Inverter4.java index b00a4ad2c..b1840ff47 100644 --- a/validating/Inverter4.java +++ b/validating/Inverter4.java @@ -6,7 +6,7 @@ import static java.lang.Character.*; public class Inverter4 implements StringInverter { - static final String allowed = + static final String ALLOWED = "abcdefghijklmnopqrstuvwxyz ,." + "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; public String invert(String str) { @@ -15,7 +15,7 @@ public String invert(String str) { String result = ""; for(int i = 0; i < str.length(); i++) { char c = str.charAt(i); - if(allowed.indexOf(c) == -1) + if(ALLOWED.indexOf(c) == -1) throw new RuntimeException(c + " Not allowed"); result += isUpperCase(c) ? toLowerCase(c) : diff --git a/validating/SLF4JLevels.java b/validating/SLF4JLevels.java index c2b66868d..e8b2b4cb6 100644 --- a/validating/SLF4JLevels.java +++ b/validating/SLF4JLevels.java @@ -5,7 +5,7 @@ import org.slf4j.*; public class SLF4JLevels { - private static final Logger log = + private static Logger log = LoggerFactory.getLogger(SLF4JLevels.class); public static void main(String[] args) { log.trace("Hello"); diff --git a/validating/SLF4JLogging.java b/validating/SLF4JLogging.java index 9a18dedf2..0f23bb4dd 100644 --- a/validating/SLF4JLogging.java +++ b/validating/SLF4JLogging.java @@ -5,7 +5,7 @@ import org.slf4j.*; public class SLF4JLogging { - private static final Logger log = + private static Logger log = LoggerFactory.getLogger(SLF4JLogging.class); public static void main(String[] args) { log.info("hello logging"); diff --git a/validating/StringInverter.java b/validating/StringInverter.java index 680bab3c6..f01e46dc9 100644 --- a/validating/StringInverter.java +++ b/validating/StringInverter.java @@ -5,5 +5,5 @@ package validating; interface StringInverter { - public String invert(String str); + String invert(String str); } From f980502f078b4d67a5442768973d2464433e3b93 Mon Sep 17 00:00:00 2001 From: Bruce Eckel Date: Tue, 22 Nov 2016 19:06:48 -0800 Subject: [PATCH 152/320] New version of jmh --- gradle/jmh.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/jmh.gradle b/gradle/jmh.gradle index 273c857c1..99d026bb0 100644 --- a/gradle/jmh.gradle +++ b/gradle/jmh.gradle @@ -9,7 +9,7 @@ sourceSets { } jmh { - jmhVersion = '1.16' + jmhVersion = '1.17' duplicateClassesStrategy = 'warn' failOnError = true // See https://github.com/melix/jmh-gradle-plugin From 04f397549584465b1a7644f5d73bf7841e77446f Mon Sep 17 00:00:00 2001 From: Bruce Eckel Date: Tue, 22 Nov 2016 19:06:59 -0800 Subject: [PATCH 153/320] Chapter name change --- gradle/subprojects.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gradle/subprojects.gradle b/gradle/subprojects.gradle index 4acc8bdb3..8972377b4 100644 --- a/gradle/subprojects.gradle +++ b/gradle/subprojects.gradle @@ -14,7 +14,7 @@ project(':understandingcollections') { } } -project(':threads') { +project(':concurrent') { dependencies { compile project(':enums') } @@ -67,4 +67,4 @@ configure(subprojects - project(':onjava')) { compile 'com.google.guava:guava:19.0' compileOnly "org.openjdk.jmh:jmh-core:${jmh.jmhVersion}" } -} \ No newline at end of file +} From 66f137e9e839a59d59ea60427d7c977ff1431b5a Mon Sep 17 00:00:00 2001 From: Bruce Eckel Date: Wed, 23 Nov 2016 09:05:26 -0800 Subject: [PATCH 154/320] Changed chapter title --- {threads => concurrent}/AtomicEvenSupplier.java | 2 +- {threads => concurrent}/AtomicIntegerTest.java | 2 +- {threads => concurrent}/Atomicity.java | 2 +- {threads => concurrent}/AtomicityTest.java | 2 +- {threads => concurrent}/AttemptLocking.java | 2 +- {threads => concurrent}/BankTellerSimulation.java | 2 +- {threads => concurrent}/CachedThreadPool.java | 2 +- {threads => concurrent}/CachedThreadPool2.java | 2 +- {threads => concurrent}/CachedThreadPool3.java | 2 +- {threads => concurrent}/CaptureUncaughtException.java | 2 +- {threads => concurrent}/CarBuilder.java | 2 +- {threads => concurrent}/Chopstick.java | 2 +- {threads => concurrent}/CollectionToStream.java | 2 +- {threads => concurrent}/CountingStream.java | 2 +- {threads => concurrent}/CountingTask.java | 2 +- {threads => concurrent}/CriticalSection.java | 2 +- {threads => concurrent}/DeadlockingDiningPhilosophers.java | 2 +- {threads => concurrent}/DelayQueueDemo.java | 2 +- {threads => concurrent}/EvenChecker.java | 2 +- {threads => concurrent}/EvenSupplier.java | 2 +- {threads => concurrent}/ExceptionThread.java | 2 +- {threads => concurrent}/ExplicitCriticalSection.java | 2 +- {threads => concurrent}/FixedDiningPhilosophers.java | 2 +- {threads => concurrent}/Futures.java | 2 +- {threads => concurrent}/GreenhouseScheduler.java | 2 +- {threads => concurrent}/HorseRace.java | 2 +- {threads => concurrent}/IntSupplier.java | 2 +- {threads => concurrent}/InterferingTask.java | 2 +- {threads => concurrent}/LambdasAndMethodReferences.java | 2 +- {threads => concurrent}/MoreTasksAfterShutdown.java | 2 +- {threads => concurrent}/MutexEvenSupplier.java | 2 +- {threads => concurrent}/NaiveExceptionHandling.java | 2 +- {threads => concurrent}/NumberOfProcessors.java | 2 +- {threads => concurrent}/ParallelStreamPuzzle.java | 2 +- {threads => concurrent}/ParallelStreamPuzzle2.java | 2 +- {threads => concurrent}/ParallelStreamPuzzle3.java | 2 +- {threads => concurrent}/Philosopher.java | 2 +- {threads => concurrent}/Prime.java | 2 +- {threads => concurrent}/PriorityBlockingQueueDemo.java | 2 +- {threads => concurrent}/QuittableTask.java | 2 +- {threads => concurrent}/QuittingTasks.java | 2 +- {threads => concurrent}/Restaurant.java | 2 +- {threads => concurrent}/SerialNumberChecker.java | 2 +- {threads => concurrent}/SerialNumberSupplier.java | 2 +- {threads => concurrent}/SettingDefaultHandler.java | 2 +- {threads => concurrent}/SingleThreadExecutor.java | 2 +- {threads => concurrent}/SingleThreadExecutor2.java | 2 +- {threads => concurrent}/SingleThreadExecutor3.java | 2 +- {threads => concurrent}/SleepAndPrintTask.java | 2 +- {threads => concurrent}/Summing.java | 2 +- {threads => concurrent}/Summing2.java | 2 +- {threads => concurrent}/Summing3.java | 2 +- {threads => concurrent}/Summing4.java | 2 +- {threads => concurrent}/SwallowedException.java | 2 +- {threads => concurrent}/SyncObject.java | 2 +- {threads => concurrent}/SynchronizedEvenSupplier.java | 2 +- {threads => concurrent}/ThreadSize.java | 2 +- {threads => concurrent}/ToastOMatic.java | 2 +- {threads => concurrent}/WorkStealingPool.java | 2 +- {threads => concurrent}/restaurant2/RestaurantWithQueues.java | 2 +- 60 files changed, 60 insertions(+), 60 deletions(-) rename {threads => concurrent}/AtomicEvenSupplier.java (94%) rename {threads => concurrent}/AtomicIntegerTest.java (96%) rename {threads => concurrent}/Atomicity.java (97%) rename {threads => concurrent}/AtomicityTest.java (96%) rename {threads => concurrent}/AttemptLocking.java (97%) rename {threads => concurrent}/BankTellerSimulation.java (99%) rename {threads => concurrent}/CachedThreadPool.java (96%) rename {threads => concurrent}/CachedThreadPool2.java (95%) rename {threads => concurrent}/CachedThreadPool3.java (97%) rename {threads => concurrent}/CaptureUncaughtException.java (97%) rename {threads => concurrent}/CarBuilder.java (99%) rename {threads => concurrent}/Chopstick.java (94%) rename {threads => concurrent}/CollectionToStream.java (95%) rename {threads => concurrent}/CountingStream.java (96%) rename {threads => concurrent}/CountingTask.java (94%) rename {threads => concurrent}/CriticalSection.java (99%) rename {threads => concurrent}/DeadlockingDiningPhilosophers.java (97%) rename {threads => concurrent}/DelayQueueDemo.java (98%) rename {threads => concurrent}/EvenChecker.java (97%) rename {threads => concurrent}/EvenSupplier.java (95%) rename {threads => concurrent}/ExceptionThread.java (93%) rename {threads => concurrent}/ExplicitCriticalSection.java (98%) rename {threads => concurrent}/FixedDiningPhilosophers.java (97%) rename {threads => concurrent}/Futures.java (95%) rename {threads => concurrent}/GreenhouseScheduler.java (99%) rename {threads => concurrent}/HorseRace.java (99%) rename {threads => concurrent}/IntSupplier.java (92%) rename {threads => concurrent}/InterferingTask.java (93%) rename {threads => concurrent}/LambdasAndMethodReferences.java (95%) rename {threads => concurrent}/MoreTasksAfterShutdown.java (95%) rename {threads => concurrent}/MutexEvenSupplier.java (95%) rename {threads => concurrent}/NaiveExceptionHandling.java (93%) rename {threads => concurrent}/NumberOfProcessors.java (89%) rename {threads => concurrent}/ParallelStreamPuzzle.java (94%) rename {threads => concurrent}/ParallelStreamPuzzle2.java (96%) rename {threads => concurrent}/ParallelStreamPuzzle3.java (95%) rename {threads => concurrent}/Philosopher.java (97%) rename {threads => concurrent}/Prime.java (97%) rename {threads => concurrent}/PriorityBlockingQueueDemo.java (98%) rename {threads => concurrent}/QuittableTask.java (94%) rename {threads => concurrent}/QuittingTasks.java (96%) rename {threads => concurrent}/Restaurant.java (98%) rename {threads => concurrent}/SerialNumberChecker.java (97%) rename {threads => concurrent}/SerialNumberSupplier.java (89%) rename {threads => concurrent}/SettingDefaultHandler.java (93%) rename {threads => concurrent}/SingleThreadExecutor.java (97%) rename {threads => concurrent}/SingleThreadExecutor2.java (95%) rename {threads => concurrent}/SingleThreadExecutor3.java (94%) rename {threads => concurrent}/SleepAndPrintTask.java (94%) rename {threads => concurrent}/Summing.java (98%) rename {threads => concurrent}/Summing2.java (97%) rename {threads => concurrent}/Summing3.java (97%) rename {threads => concurrent}/Summing4.java (95%) rename {threads => concurrent}/SwallowedException.java (92%) rename {threads => concurrent}/SyncObject.java (96%) rename {threads => concurrent}/SynchronizedEvenSupplier.java (93%) rename {threads => concurrent}/ThreadSize.java (96%) rename {threads => concurrent}/ToastOMatic.java (99%) rename {threads => concurrent}/WorkStealingPool.java (96%) rename {threads => concurrent}/restaurant2/RestaurantWithQueues.java (99%) diff --git a/threads/AtomicEvenSupplier.java b/concurrent/AtomicEvenSupplier.java similarity index 94% rename from threads/AtomicEvenSupplier.java rename to concurrent/AtomicEvenSupplier.java index 15e342448..84104c8f0 100644 --- a/threads/AtomicEvenSupplier.java +++ b/concurrent/AtomicEvenSupplier.java @@ -1,4 +1,4 @@ -// threads/AtomicEvenSupplier.java +// concurrent/AtomicEvenSupplier.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/threads/AtomicIntegerTest.java b/concurrent/AtomicIntegerTest.java similarity index 96% rename from threads/AtomicIntegerTest.java rename to concurrent/AtomicIntegerTest.java index 3b122d4a2..600cd7cf5 100644 --- a/threads/AtomicIntegerTest.java +++ b/concurrent/AtomicIntegerTest.java @@ -1,4 +1,4 @@ -// threads/AtomicIntegerTest.java +// concurrent/AtomicIntegerTest.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/threads/Atomicity.java b/concurrent/Atomicity.java similarity index 97% rename from threads/Atomicity.java rename to concurrent/Atomicity.java index 4adcadd0c..25ac917b2 100644 --- a/threads/Atomicity.java +++ b/concurrent/Atomicity.java @@ -1,4 +1,4 @@ -// threads/Atomicity.java +// concurrent/Atomicity.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/threads/AtomicityTest.java b/concurrent/AtomicityTest.java similarity index 96% rename from threads/AtomicityTest.java rename to concurrent/AtomicityTest.java index 9734e2010..0f4577f8a 100644 --- a/threads/AtomicityTest.java +++ b/concurrent/AtomicityTest.java @@ -1,4 +1,4 @@ -// threads/AtomicityTest.java +// concurrent/AtomicityTest.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/threads/AttemptLocking.java b/concurrent/AttemptLocking.java similarity index 97% rename from threads/AttemptLocking.java rename to concurrent/AttemptLocking.java index 9ce120c1f..bcc2f2765 100644 --- a/threads/AttemptLocking.java +++ b/concurrent/AttemptLocking.java @@ -1,4 +1,4 @@ -// threads/AttemptLocking.java +// concurrent/AttemptLocking.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/threads/BankTellerSimulation.java b/concurrent/BankTellerSimulation.java similarity index 99% rename from threads/BankTellerSimulation.java rename to concurrent/BankTellerSimulation.java index 1dcb0e5fb..f9b597c5e 100644 --- a/threads/BankTellerSimulation.java +++ b/concurrent/BankTellerSimulation.java @@ -1,4 +1,4 @@ -// threads/BankTellerSimulation.java +// concurrent/BankTellerSimulation.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/threads/CachedThreadPool.java b/concurrent/CachedThreadPool.java similarity index 96% rename from threads/CachedThreadPool.java rename to concurrent/CachedThreadPool.java index bca8b9e91..1cd48564d 100644 --- a/threads/CachedThreadPool.java +++ b/concurrent/CachedThreadPool.java @@ -1,4 +1,4 @@ -// threads/CachedThreadPool.java +// concurrent/CachedThreadPool.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/threads/CachedThreadPool2.java b/concurrent/CachedThreadPool2.java similarity index 95% rename from threads/CachedThreadPool2.java rename to concurrent/CachedThreadPool2.java index 9cfa97de2..3c66da6d9 100644 --- a/threads/CachedThreadPool2.java +++ b/concurrent/CachedThreadPool2.java @@ -1,4 +1,4 @@ -// threads/CachedThreadPool2.java +// concurrent/CachedThreadPool2.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/threads/CachedThreadPool3.java b/concurrent/CachedThreadPool3.java similarity index 97% rename from threads/CachedThreadPool3.java rename to concurrent/CachedThreadPool3.java index 967fd16c6..7565e8969 100644 --- a/threads/CachedThreadPool3.java +++ b/concurrent/CachedThreadPool3.java @@ -1,4 +1,4 @@ -// threads/CachedThreadPool3.java +// concurrent/CachedThreadPool3.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/threads/CaptureUncaughtException.java b/concurrent/CaptureUncaughtException.java similarity index 97% rename from threads/CaptureUncaughtException.java rename to concurrent/CaptureUncaughtException.java index 7ee35680d..04e262b92 100644 --- a/threads/CaptureUncaughtException.java +++ b/concurrent/CaptureUncaughtException.java @@ -1,4 +1,4 @@ -// threads/CaptureUncaughtException.java +// concurrent/CaptureUncaughtException.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/threads/CarBuilder.java b/concurrent/CarBuilder.java similarity index 99% rename from threads/CarBuilder.java rename to concurrent/CarBuilder.java index a56241387..6942158b8 100644 --- a/threads/CarBuilder.java +++ b/concurrent/CarBuilder.java @@ -1,4 +1,4 @@ -// threads/CarBuilder.java +// concurrent/CarBuilder.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/threads/Chopstick.java b/concurrent/Chopstick.java similarity index 94% rename from threads/Chopstick.java rename to concurrent/Chopstick.java index 046d17278..2c853a97b 100644 --- a/threads/Chopstick.java +++ b/concurrent/Chopstick.java @@ -1,4 +1,4 @@ -// threads/Chopstick.java +// concurrent/Chopstick.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/threads/CollectionToStream.java b/concurrent/CollectionToStream.java similarity index 95% rename from threads/CollectionToStream.java rename to concurrent/CollectionToStream.java index 0209a9b4e..fe188adfe 100644 --- a/threads/CollectionToStream.java +++ b/concurrent/CollectionToStream.java @@ -1,4 +1,4 @@ -// threads/CollectionToStream.java +// concurrent/CollectionToStream.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/threads/CountingStream.java b/concurrent/CountingStream.java similarity index 96% rename from threads/CountingStream.java rename to concurrent/CountingStream.java index f7e9403c6..62ecfcfc8 100644 --- a/threads/CountingStream.java +++ b/concurrent/CountingStream.java @@ -1,4 +1,4 @@ -// threads/CountingStream.java +// concurrent/CountingStream.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/threads/CountingTask.java b/concurrent/CountingTask.java similarity index 94% rename from threads/CountingTask.java rename to concurrent/CountingTask.java index 4c1375df4..3a7d6262d 100644 --- a/threads/CountingTask.java +++ b/concurrent/CountingTask.java @@ -1,4 +1,4 @@ -// threads/CountingTask.java +// concurrent/CountingTask.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/threads/CriticalSection.java b/concurrent/CriticalSection.java similarity index 99% rename from threads/CriticalSection.java rename to concurrent/CriticalSection.java index a653f35ed..dba1b9e09 100644 --- a/threads/CriticalSection.java +++ b/concurrent/CriticalSection.java @@ -1,4 +1,4 @@ -// threads/CriticalSection.java +// concurrent/CriticalSection.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/threads/DeadlockingDiningPhilosophers.java b/concurrent/DeadlockingDiningPhilosophers.java similarity index 97% rename from threads/DeadlockingDiningPhilosophers.java rename to concurrent/DeadlockingDiningPhilosophers.java index 6100d6613..69224c0e1 100644 --- a/threads/DeadlockingDiningPhilosophers.java +++ b/concurrent/DeadlockingDiningPhilosophers.java @@ -1,4 +1,4 @@ -// threads/DeadlockingDiningPhilosophers.java +// concurrent/DeadlockingDiningPhilosophers.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/threads/DelayQueueDemo.java b/concurrent/DelayQueueDemo.java similarity index 98% rename from threads/DelayQueueDemo.java rename to concurrent/DelayQueueDemo.java index 651bb7718..9ae60b143 100644 --- a/threads/DelayQueueDemo.java +++ b/concurrent/DelayQueueDemo.java @@ -1,4 +1,4 @@ -// threads/DelayQueueDemo.java +// concurrent/DelayQueueDemo.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/threads/EvenChecker.java b/concurrent/EvenChecker.java similarity index 97% rename from threads/EvenChecker.java rename to concurrent/EvenChecker.java index f42046fb2..74af645c1 100644 --- a/threads/EvenChecker.java +++ b/concurrent/EvenChecker.java @@ -1,4 +1,4 @@ -// threads/EvenChecker.java +// concurrent/EvenChecker.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/threads/EvenSupplier.java b/concurrent/EvenSupplier.java similarity index 95% rename from threads/EvenSupplier.java rename to concurrent/EvenSupplier.java index f344bb70d..38a92d2d0 100644 --- a/threads/EvenSupplier.java +++ b/concurrent/EvenSupplier.java @@ -1,4 +1,4 @@ -// threads/EvenSupplier.java +// concurrent/EvenSupplier.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/threads/ExceptionThread.java b/concurrent/ExceptionThread.java similarity index 93% rename from threads/ExceptionThread.java rename to concurrent/ExceptionThread.java index b2bb33df9..cf66c3b8d 100644 --- a/threads/ExceptionThread.java +++ b/concurrent/ExceptionThread.java @@ -1,4 +1,4 @@ -// threads/ExceptionThread.java +// concurrent/ExceptionThread.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/threads/ExplicitCriticalSection.java b/concurrent/ExplicitCriticalSection.java similarity index 98% rename from threads/ExplicitCriticalSection.java rename to concurrent/ExplicitCriticalSection.java index bcc32c092..adcd2ea0f 100644 --- a/threads/ExplicitCriticalSection.java +++ b/concurrent/ExplicitCriticalSection.java @@ -1,4 +1,4 @@ -// threads/ExplicitCriticalSection.java +// concurrent/ExplicitCriticalSection.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/threads/FixedDiningPhilosophers.java b/concurrent/FixedDiningPhilosophers.java similarity index 97% rename from threads/FixedDiningPhilosophers.java rename to concurrent/FixedDiningPhilosophers.java index b321412d3..e3a6745be 100644 --- a/threads/FixedDiningPhilosophers.java +++ b/concurrent/FixedDiningPhilosophers.java @@ -1,4 +1,4 @@ -// threads/FixedDiningPhilosophers.java +// concurrent/FixedDiningPhilosophers.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/threads/Futures.java b/concurrent/Futures.java similarity index 95% rename from threads/Futures.java rename to concurrent/Futures.java index 7af939649..3a8c3f927 100644 --- a/threads/Futures.java +++ b/concurrent/Futures.java @@ -1,4 +1,4 @@ -// threads/Futures.java +// concurrent/Futures.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/threads/GreenhouseScheduler.java b/concurrent/GreenhouseScheduler.java similarity index 99% rename from threads/GreenhouseScheduler.java rename to concurrent/GreenhouseScheduler.java index 9fc385d61..1d52a01a4 100644 --- a/threads/GreenhouseScheduler.java +++ b/concurrent/GreenhouseScheduler.java @@ -1,4 +1,4 @@ -// threads/GreenhouseScheduler.java +// concurrent/GreenhouseScheduler.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/threads/HorseRace.java b/concurrent/HorseRace.java similarity index 99% rename from threads/HorseRace.java rename to concurrent/HorseRace.java index c5ce98d12..de84f25df 100644 --- a/threads/HorseRace.java +++ b/concurrent/HorseRace.java @@ -1,4 +1,4 @@ -// threads/HorseRace.java +// concurrent/HorseRace.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/threads/IntSupplier.java b/concurrent/IntSupplier.java similarity index 92% rename from threads/IntSupplier.java rename to concurrent/IntSupplier.java index e463bd027..6c0be8d2c 100644 --- a/threads/IntSupplier.java +++ b/concurrent/IntSupplier.java @@ -1,4 +1,4 @@ -// threads/IntSupplier.java +// concurrent/IntSupplier.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/threads/InterferingTask.java b/concurrent/InterferingTask.java similarity index 93% rename from threads/InterferingTask.java rename to concurrent/InterferingTask.java index 262c9dbdc..b64afdd84 100644 --- a/threads/InterferingTask.java +++ b/concurrent/InterferingTask.java @@ -1,4 +1,4 @@ -// threads/InterferingTask.java +// concurrent/InterferingTask.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/threads/LambdasAndMethodReferences.java b/concurrent/LambdasAndMethodReferences.java similarity index 95% rename from threads/LambdasAndMethodReferences.java rename to concurrent/LambdasAndMethodReferences.java index a37831da7..2e713d46d 100644 --- a/threads/LambdasAndMethodReferences.java +++ b/concurrent/LambdasAndMethodReferences.java @@ -1,4 +1,4 @@ -// threads/LambdasAndMethodReferences.java +// concurrent/LambdasAndMethodReferences.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/threads/MoreTasksAfterShutdown.java b/concurrent/MoreTasksAfterShutdown.java similarity index 95% rename from threads/MoreTasksAfterShutdown.java rename to concurrent/MoreTasksAfterShutdown.java index 1ba36d9b1..a940bd677 100644 --- a/threads/MoreTasksAfterShutdown.java +++ b/concurrent/MoreTasksAfterShutdown.java @@ -1,4 +1,4 @@ -// threads/MoreTasksAfterShutdown.java +// concurrent/MoreTasksAfterShutdown.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/threads/MutexEvenSupplier.java b/concurrent/MutexEvenSupplier.java similarity index 95% rename from threads/MutexEvenSupplier.java rename to concurrent/MutexEvenSupplier.java index cbdf07c05..db4c62c9d 100644 --- a/threads/MutexEvenSupplier.java +++ b/concurrent/MutexEvenSupplier.java @@ -1,4 +1,4 @@ -// threads/MutexEvenSupplier.java +// concurrent/MutexEvenSupplier.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/threads/NaiveExceptionHandling.java b/concurrent/NaiveExceptionHandling.java similarity index 93% rename from threads/NaiveExceptionHandling.java rename to concurrent/NaiveExceptionHandling.java index 914ab3215..d848b1464 100644 --- a/threads/NaiveExceptionHandling.java +++ b/concurrent/NaiveExceptionHandling.java @@ -1,4 +1,4 @@ -// threads/NaiveExceptionHandling.java +// concurrent/NaiveExceptionHandling.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/threads/NumberOfProcessors.java b/concurrent/NumberOfProcessors.java similarity index 89% rename from threads/NumberOfProcessors.java rename to concurrent/NumberOfProcessors.java index 7ffc8a7aa..8acf272fd 100644 --- a/threads/NumberOfProcessors.java +++ b/concurrent/NumberOfProcessors.java @@ -1,4 +1,4 @@ -// threads/NumberOfProcessors.java +// concurrent/NumberOfProcessors.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/threads/ParallelStreamPuzzle.java b/concurrent/ParallelStreamPuzzle.java similarity index 94% rename from threads/ParallelStreamPuzzle.java rename to concurrent/ParallelStreamPuzzle.java index 9855af2b7..d90520875 100644 --- a/threads/ParallelStreamPuzzle.java +++ b/concurrent/ParallelStreamPuzzle.java @@ -1,4 +1,4 @@ -// threads/ParallelStreamPuzzle.java +// concurrent/ParallelStreamPuzzle.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/threads/ParallelStreamPuzzle2.java b/concurrent/ParallelStreamPuzzle2.java similarity index 96% rename from threads/ParallelStreamPuzzle2.java rename to concurrent/ParallelStreamPuzzle2.java index 0dab06ca7..20b5cb74c 100644 --- a/threads/ParallelStreamPuzzle2.java +++ b/concurrent/ParallelStreamPuzzle2.java @@ -1,4 +1,4 @@ -// threads/ParallelStreamPuzzle2.java +// concurrent/ParallelStreamPuzzle2.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/threads/ParallelStreamPuzzle3.java b/concurrent/ParallelStreamPuzzle3.java similarity index 95% rename from threads/ParallelStreamPuzzle3.java rename to concurrent/ParallelStreamPuzzle3.java index 55562a0f8..9f304aa91 100644 --- a/threads/ParallelStreamPuzzle3.java +++ b/concurrent/ParallelStreamPuzzle3.java @@ -1,4 +1,4 @@ -// threads/ParallelStreamPuzzle3.java +// concurrent/ParallelStreamPuzzle3.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/threads/Philosopher.java b/concurrent/Philosopher.java similarity index 97% rename from threads/Philosopher.java rename to concurrent/Philosopher.java index 7e33f1188..c5bc8d39d 100644 --- a/threads/Philosopher.java +++ b/concurrent/Philosopher.java @@ -1,4 +1,4 @@ -// threads/Philosopher.java +// concurrent/Philosopher.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/threads/Prime.java b/concurrent/Prime.java similarity index 97% rename from threads/Prime.java rename to concurrent/Prime.java index 9f4e88417..906fbeb25 100644 --- a/threads/Prime.java +++ b/concurrent/Prime.java @@ -1,4 +1,4 @@ -// threads/Prime.java +// concurrent/Prime.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/threads/PriorityBlockingQueueDemo.java b/concurrent/PriorityBlockingQueueDemo.java similarity index 98% rename from threads/PriorityBlockingQueueDemo.java rename to concurrent/PriorityBlockingQueueDemo.java index 7eee0c8c9..aa45515bf 100644 --- a/threads/PriorityBlockingQueueDemo.java +++ b/concurrent/PriorityBlockingQueueDemo.java @@ -1,4 +1,4 @@ -// threads/PriorityBlockingQueueDemo.java +// concurrent/PriorityBlockingQueueDemo.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/threads/QuittableTask.java b/concurrent/QuittableTask.java similarity index 94% rename from threads/QuittableTask.java rename to concurrent/QuittableTask.java index 335add9c8..bd7e80d93 100644 --- a/threads/QuittableTask.java +++ b/concurrent/QuittableTask.java @@ -1,4 +1,4 @@ -// threads/QuittableTask.java +// concurrent/QuittableTask.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/threads/QuittingTasks.java b/concurrent/QuittingTasks.java similarity index 96% rename from threads/QuittingTasks.java rename to concurrent/QuittingTasks.java index 9c68bcbf5..782892668 100644 --- a/threads/QuittingTasks.java +++ b/concurrent/QuittingTasks.java @@ -1,4 +1,4 @@ -// threads/QuittingTasks.java +// concurrent/QuittingTasks.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/threads/Restaurant.java b/concurrent/Restaurant.java similarity index 98% rename from threads/Restaurant.java rename to concurrent/Restaurant.java index d2092de43..bc8c11e29 100644 --- a/threads/Restaurant.java +++ b/concurrent/Restaurant.java @@ -1,4 +1,4 @@ -// threads/Restaurant.java +// concurrent/Restaurant.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/threads/SerialNumberChecker.java b/concurrent/SerialNumberChecker.java similarity index 97% rename from threads/SerialNumberChecker.java rename to concurrent/SerialNumberChecker.java index d2283b225..0be31b5e8 100644 --- a/threads/SerialNumberChecker.java +++ b/concurrent/SerialNumberChecker.java @@ -1,4 +1,4 @@ -// threads/SerialNumberChecker.java +// concurrent/SerialNumberChecker.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/threads/SerialNumberSupplier.java b/concurrent/SerialNumberSupplier.java similarity index 89% rename from threads/SerialNumberSupplier.java rename to concurrent/SerialNumberSupplier.java index cedfe4854..53137d5f9 100644 --- a/threads/SerialNumberSupplier.java +++ b/concurrent/SerialNumberSupplier.java @@ -1,4 +1,4 @@ -// threads/SerialNumberSupplier.java +// concurrent/SerialNumberSupplier.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/threads/SettingDefaultHandler.java b/concurrent/SettingDefaultHandler.java similarity index 93% rename from threads/SettingDefaultHandler.java rename to concurrent/SettingDefaultHandler.java index 3b07bbf8f..ed45f8f3e 100644 --- a/threads/SettingDefaultHandler.java +++ b/concurrent/SettingDefaultHandler.java @@ -1,4 +1,4 @@ -// threads/SettingDefaultHandler.java +// concurrent/SettingDefaultHandler.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/threads/SingleThreadExecutor.java b/concurrent/SingleThreadExecutor.java similarity index 97% rename from threads/SingleThreadExecutor.java rename to concurrent/SingleThreadExecutor.java index 5515d98cc..705e79325 100644 --- a/threads/SingleThreadExecutor.java +++ b/concurrent/SingleThreadExecutor.java @@ -1,4 +1,4 @@ -// threads/SingleThreadExecutor.java +// concurrent/SingleThreadExecutor.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/threads/SingleThreadExecutor2.java b/concurrent/SingleThreadExecutor2.java similarity index 95% rename from threads/SingleThreadExecutor2.java rename to concurrent/SingleThreadExecutor2.java index f93183bcc..2166b9b6f 100644 --- a/threads/SingleThreadExecutor2.java +++ b/concurrent/SingleThreadExecutor2.java @@ -1,4 +1,4 @@ -// threads/SingleThreadExecutor2.java +// concurrent/SingleThreadExecutor2.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/threads/SingleThreadExecutor3.java b/concurrent/SingleThreadExecutor3.java similarity index 94% rename from threads/SingleThreadExecutor3.java rename to concurrent/SingleThreadExecutor3.java index 9f5f58971..c90b9505e 100644 --- a/threads/SingleThreadExecutor3.java +++ b/concurrent/SingleThreadExecutor3.java @@ -1,4 +1,4 @@ -// threads/SingleThreadExecutor3.java +// concurrent/SingleThreadExecutor3.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/threads/SleepAndPrintTask.java b/concurrent/SleepAndPrintTask.java similarity index 94% rename from threads/SleepAndPrintTask.java rename to concurrent/SleepAndPrintTask.java index afedb3752..421d3f803 100644 --- a/threads/SleepAndPrintTask.java +++ b/concurrent/SleepAndPrintTask.java @@ -1,4 +1,4 @@ -// threads/SleepAndPrintTask.java +// concurrent/SleepAndPrintTask.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/threads/Summing.java b/concurrent/Summing.java similarity index 98% rename from threads/Summing.java rename to concurrent/Summing.java index 3086be1f4..a1be4bbf2 100644 --- a/threads/Summing.java +++ b/concurrent/Summing.java @@ -1,4 +1,4 @@ -// threads/Summing.java +// concurrent/Summing.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/threads/Summing2.java b/concurrent/Summing2.java similarity index 97% rename from threads/Summing2.java rename to concurrent/Summing2.java index ccc0f1ba1..eb2145725 100644 --- a/threads/Summing2.java +++ b/concurrent/Summing2.java @@ -1,4 +1,4 @@ -// threads/Summing2.java +// concurrent/Summing2.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/threads/Summing3.java b/concurrent/Summing3.java similarity index 97% rename from threads/Summing3.java rename to concurrent/Summing3.java index 9d0e446e9..623d35c5c 100644 --- a/threads/Summing3.java +++ b/concurrent/Summing3.java @@ -1,4 +1,4 @@ -// threads/Summing3.java +// concurrent/Summing3.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/threads/Summing4.java b/concurrent/Summing4.java similarity index 95% rename from threads/Summing4.java rename to concurrent/Summing4.java index c068e55dd..49940bf3f 100644 --- a/threads/Summing4.java +++ b/concurrent/Summing4.java @@ -1,4 +1,4 @@ -// threads/Summing4.java +// concurrent/Summing4.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/threads/SwallowedException.java b/concurrent/SwallowedException.java similarity index 92% rename from threads/SwallowedException.java rename to concurrent/SwallowedException.java index bb34879b9..0596711a3 100644 --- a/threads/SwallowedException.java +++ b/concurrent/SwallowedException.java @@ -1,4 +1,4 @@ -// threads/SwallowedException.java +// concurrent/SwallowedException.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/threads/SyncObject.java b/concurrent/SyncObject.java similarity index 96% rename from threads/SyncObject.java rename to concurrent/SyncObject.java index c70e949a0..c5f59b33b 100644 --- a/threads/SyncObject.java +++ b/concurrent/SyncObject.java @@ -1,4 +1,4 @@ -// threads/SyncObject.java +// concurrent/SyncObject.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/threads/SynchronizedEvenSupplier.java b/concurrent/SynchronizedEvenSupplier.java similarity index 93% rename from threads/SynchronizedEvenSupplier.java rename to concurrent/SynchronizedEvenSupplier.java index 20555f37f..99c6f55fc 100644 --- a/threads/SynchronizedEvenSupplier.java +++ b/concurrent/SynchronizedEvenSupplier.java @@ -1,4 +1,4 @@ -// threads/SynchronizedEvenSupplier.java +// concurrent/SynchronizedEvenSupplier.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/threads/ThreadSize.java b/concurrent/ThreadSize.java similarity index 96% rename from threads/ThreadSize.java rename to concurrent/ThreadSize.java index 6002df845..7ee1acd59 100644 --- a/threads/ThreadSize.java +++ b/concurrent/ThreadSize.java @@ -1,4 +1,4 @@ -// threads/ThreadSize.java +// concurrent/ThreadSize.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/threads/ToastOMatic.java b/concurrent/ToastOMatic.java similarity index 99% rename from threads/ToastOMatic.java rename to concurrent/ToastOMatic.java index 89821469d..a27f8820e 100644 --- a/threads/ToastOMatic.java +++ b/concurrent/ToastOMatic.java @@ -1,4 +1,4 @@ -// threads/ToastOMatic.java +// concurrent/ToastOMatic.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/threads/WorkStealingPool.java b/concurrent/WorkStealingPool.java similarity index 96% rename from threads/WorkStealingPool.java rename to concurrent/WorkStealingPool.java index 13c8d6b43..0cb922e7a 100644 --- a/threads/WorkStealingPool.java +++ b/concurrent/WorkStealingPool.java @@ -1,4 +1,4 @@ -// threads/WorkStealingPool.java +// concurrent/WorkStealingPool.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/threads/restaurant2/RestaurantWithQueues.java b/concurrent/restaurant2/RestaurantWithQueues.java similarity index 99% rename from threads/restaurant2/RestaurantWithQueues.java rename to concurrent/restaurant2/RestaurantWithQueues.java index 30101d7f4..8cc184f7d 100644 --- a/threads/restaurant2/RestaurantWithQueues.java +++ b/concurrent/restaurant2/RestaurantWithQueues.java @@ -1,4 +1,4 @@ -// threads/restaurant2/RestaurantWithQueues.java +// concurrent/restaurant2/RestaurantWithQueues.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. From 4274fe561397bb58275de856d2d15105b8aa2af4 Mon Sep 17 00:00:00 2001 From: Bruce Eckel Date: Wed, 23 Nov 2016 12:24:39 -0800 Subject: [PATCH 155/320] Added AppVeyor badge Not sure why I get the bar on the left --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 6e2cd716c..b0e1ef655 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,7 @@ [![](https://travis-ci.org/BruceEckel/OnJava8-Examples.svg?branch=master)](https://travis-ci.org/BruceEckel/OnJava8-Examples) +[![](https://ci.appveyor.com/api/projects/status/github/BruceEckel/OnJava8-Examples)](https://ci.appveyor.com/api/projects/status/github/BruceEckel/OnJava8-Examples) + To compile and run these programs, you only need JDK 8 installed. Invoking `gradlew` will automatically download and install Gradle. Gradle will also install all additional libraries necessary to compile From 4f74fe96b001e59a24f344870461018276cf81c8 Mon Sep 17 00:00:00 2001 From: Bruce Eckel Date: Wed, 23 Nov 2016 12:27:48 -0800 Subject: [PATCH 156/320] Fix Appveyor link --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index b0e1ef655..ca4e1a92b 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ [![](https://travis-ci.org/BruceEckel/OnJava8-Examples.svg?branch=master)](https://travis-ci.org/BruceEckel/OnJava8-Examples) -[![](https://ci.appveyor.com/api/projects/status/github/BruceEckel/OnJava8-Examples)](https://ci.appveyor.com/api/projects/status/github/BruceEckel/OnJava8-Examples) +[![](https://ci.appveyor.com/api/projects/status/github/BruceEckel/OnJava8-Examples)](https://ci.appveyor.com/project/BruceEckel/onjava-examples) To compile and run these programs, you only need JDK 8 installed. Invoking `gradlew` will automatically download and install Gradle. From c17d52b6aca00d8ba4cc704a830a035fb43d1ada Mon Sep 17 00:00:00 2001 From: Bruce Eckel Date: Wed, 23 Nov 2016 12:31:35 -0800 Subject: [PATCH 157/320] Improve instructions --- README.md | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index ca4e1a92b..84b3e7642 100644 --- a/README.md +++ b/README.md @@ -7,17 +7,21 @@ Invoking `gradlew` will automatically download and install Gradle. Gradle will also install all additional libraries necessary to compile and run the Java examples in the book. -To compile everything, the command is: +To compile and run everything, the command is: -`gradlew classes` +`gradlew run` -To run everything (including compiling if necessary), the command is: +If you are on a Unix/Linux based system, you must select the local directory for all commands, for example: -`gradlew run` +`./gradlew run` + +To only compile everything, the command is: + +`gradlew compileJava` To compile only a single chapter (including dependencies), use for example: -`gradlew :strings:classes` +`gradlew :strings:compileJava` To run only a single chapter, say: @@ -33,7 +37,7 @@ program name, like this: `gradlew ReplacingStringTokenizer` -Note that all these commands are run from the base directory where the example code is installed, and where you find the +Note that all commands are run from the base directory where the example code is installed, and where you find the `gradlew` script. You can learn about other options by just typing `gradlew` with no arguments. From cb0a9b53a75b8517ba60dae2ec66fa0195aaab9c Mon Sep 17 00:00:00 2001 From: Bruce Eckel Date: Sat, 26 Nov 2016 10:20:48 -0800 Subject: [PATCH 158/320] Improvements to "Validating" chapter --- validating/BadMicroBenchmark.java | 15 +- validating/{Queue.java => CircularQueue.java} | 29 ++-- ...ption.java => CircularQueueException.java} | 9 +- validating/tests/CircularQueueTest.java | 143 ++++++++++++++++++ validating/tests/CountedListTest.java | 2 +- 5 files changed, 177 insertions(+), 21 deletions(-) rename validating/{Queue.java => CircularQueue.java} (75%) rename validating/{QueueException.java => CircularQueueException.java} (51%) create mode 100644 validating/tests/CircularQueueTest.java diff --git a/validating/BadMicroBenchmark.java b/validating/BadMicroBenchmark.java index 979a577e0..8e67e9471 100644 --- a/validating/BadMicroBenchmark.java +++ b/validating/BadMicroBenchmark.java @@ -7,11 +7,16 @@ public class BadMicroBenchmark { static final int SIZE = 250_000_000; public static void main(String[] args) { - long[] la = new long[SIZE]; - System.out.print("setAll: "); - Time.it(() -> Arrays.setAll(la, n -> n)); - System.out.print("parallelSetAll: "); - Time.it(() -> Arrays.parallelSetAll(la, n -> n)); + try { // For machines with insufficient memory + long[] la = new long[SIZE]; + System.out.print("setAll: "); + Time.it(() -> Arrays.setAll(la, n -> n)); + System.out.print("parallelSetAll: "); + Time.it(() -> Arrays.parallelSetAll(la, n -> n)); + } catch(OutOfMemoryError e) { + System.out.println("Insufficient memory"); + System.exit(0); + } } } /* Output: diff --git a/validating/Queue.java b/validating/CircularQueue.java similarity index 75% rename from validating/Queue.java rename to validating/CircularQueue.java index bb260b873..c6c95bc48 100644 --- a/validating/Queue.java +++ b/validating/CircularQueue.java @@ -1,4 +1,4 @@ -// validating/Queue.java +// validating/CircularQueue.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. @@ -6,14 +6,14 @@ package validating; import java.util.*; -public class Queue { +public class CircularQueue { private Object[] data; private int in = 0, // Next available storage space out = 0; // Next gettable object // Has it wrapped around the circular queue? private boolean wrapped = false; - public Queue(int size) { + public CircularQueue(int size) { data = new Object[size]; // Must be true after construction: assert invariant(); @@ -27,7 +27,8 @@ public boolean full() { public boolean isWrapped() { return wrapped; } public void put(Object item) { precondition(item != null, "put() null item"); - precondition(!full(), "put() into full Queue"); + precondition(!full(), + "put() into full CircularQueue"); assert invariant(); data[in++] = item; if(in >= data.length) { @@ -37,7 +38,8 @@ public void put(Object item) { assert invariant(); } public Object get() { - precondition(!empty(), "get() from empty Queue"); + precondition(!empty(), + "get() from empty CircularQueue"); assert invariant(); Object returnVal = data[out]; data[out] = null; @@ -47,18 +49,19 @@ public Object get() { wrapped = false; } assert postcondition( - returnVal != null, "Null item in Queue"); + returnVal != null, + "Null item in CircularQueue"); assert invariant(); return returnVal; } // Design-by-contract support methods: private static void precondition(boolean cond, String msg) { - if(!cond) throw new QueueException(msg); + if(!cond) throw new CircularQueueException(msg); } private static boolean postcondition(boolean cond, String msg) { - if(!cond) throw new QueueException(msg); + if(!cond) throw new CircularQueueException(msg); return true; } private boolean invariant() { @@ -66,14 +69,16 @@ private boolean invariant() { // region of 'data' that holds objects: for(int i = out; i != in; i = (i + 1) % data.length) if(data[i] == null) - throw new QueueException("null in queue"); + throw new CircularQueueException( + "null in CircularQueue"); // Guarantee that only null values are outside the // region of 'data' that holds objects: if(full()) return true; for(int i = in; i != out; i = (i + 1) % data.length) if(data[i] != null) - throw new QueueException( - "non-null outside of queue range: " + dump()); + throw new CircularQueueException( + "non-null outside of CircularQueue range: " + + dump()); return true; } public String dump() { @@ -81,6 +86,6 @@ public String dump() { ", out = " + out + ", full() = " + full() + ", empty() = " + empty() + - ", queue = " + Arrays.asList(data); + ", CircularQueue = " + Arrays.asList(data); } } diff --git a/validating/QueueException.java b/validating/CircularQueueException.java similarity index 51% rename from validating/QueueException.java rename to validating/CircularQueueException.java index ced436b34..53d90672d 100644 --- a/validating/QueueException.java +++ b/validating/CircularQueueException.java @@ -1,9 +1,12 @@ -// validating/QueueException.java +// validating/CircularQueueException.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. package validating; -public class QueueException extends RuntimeException { - public QueueException(String why) { super(why); } +public class +CircularQueueException extends RuntimeException { + public CircularQueueException(String why) { + super(why); + } } diff --git a/validating/tests/CircularQueueTest.java b/validating/tests/CircularQueueTest.java new file mode 100644 index 000000000..603518552 --- /dev/null +++ b/validating/tests/CircularQueueTest.java @@ -0,0 +1,143 @@ +// validating/tests/CircularQueueTest.java +// (c)2016 MindView LLC: see Copyright.txt +// We make no guarantees that this code is fit for any purpose. +// Visit http://OnJava8.com for more book information. +package validating; +import org.junit.jupiter.api.*; +import static org.junit.jupiter.api.Assertions.*; + +public class CircularQueueTest { + private CircularQueue queue = new CircularQueue(10); + private int i = 0; + @BeforeEach + public void initialize() { + while(i < 5) // Preload with some data + queue.put(Integer.toString(i++)); + } + // Support methods: + private void showFullness() { + assertTrue(queue.full()); + assertFalse(queue.empty()); + System.out.println(queue.dump()); + } + private void showEmptiness() { + assertFalse(queue.full()); + assertTrue(queue.empty()); + System.out.println(queue.dump()); + } + @Test + public void full() { + System.out.println("testFull"); + System.out.println(queue.dump()); + System.out.println(queue.get()); + System.out.println(queue.get()); + while(!queue.full()) + queue.put(Integer.toString(i++)); + String msg = ""; + try { + queue.put(""); + } catch(CircularQueueException e) { + msg = e.getMessage(); + System.out.println(msg); + } + assertEquals(msg, "put() into full CircularQueue"); + showFullness(); + } + @Test + public void empty() { + System.out.println("testEmpty"); + while(!queue.empty()) + System.out.println(queue.get()); + String msg = ""; + try { + queue.get(); + } catch(CircularQueueException e) { + msg = e.getMessage(); + System.out.println(msg); + } + assertEquals(msg, "get() from empty CircularQueue"); + showEmptiness(); + } + @Test + public void nullPut() { + System.out.println("testNullPut"); + String msg = ""; + try { + queue.put(null); + } catch(CircularQueueException e) { + msg = e.getMessage(); + System.out.println(msg); + } + assertEquals(msg, "put() null item"); + } + @Test + public void circularity() { + System.out.println("testCircularity"); + while(!queue.full()) + queue.put(Integer.toString(i++)); + showFullness(); + assertTrue(queue.isWrapped()); + while(!queue.empty()) + System.out.println(queue.get()); + showEmptiness(); + while(!queue.full()) + queue.put(Integer.toString(i++)); + showFullness(); + while(!queue.empty()) + System.out.println(queue.get()); + showEmptiness(); + } +} +/* Output: +testNullPut +put() null item +testCircularity +in = 0, out = 0, full() = true, empty() = false, CircularQueue = +[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +in = 0, out = 0, full() = false, empty() = true, CircularQueue = +[null, null, null, null, null, null, null, null, null, +null] +in = 0, out = 0, full() = true, empty() = false, CircularQueue = +[10, 11, 12, 13, 14, 15, 16, 17, 18, 19] +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +in = 0, out = 0, full() = false, empty() = true, CircularQueue = +[null, null, null, null, null, null, null, null, null, +null] +testFull +in = 5, out = 0, full() = false, empty() = false, CircularQueue = +[0, 1, 2, 3, 4, null, null, null, null, null] +0 +1 +put() into full CircularQueue +in = 2, out = 2, full() = true, empty() = false, CircularQueue = +[10, 11, 2, 3, 4, 5, 6, 7, 8, 9] +testEmpty +0 +1 +2 +3 +4 +get() from empty CircularQueue +in = 5, out = 5, full() = false, empty() = true, CircularQueue = +[null, null, null, null, null, null, null, null, null, +null] +*/ diff --git a/validating/tests/CountedListTest.java b/validating/tests/CountedListTest.java index 2c1d54cca..f3188cdbb 100644 --- a/validating/tests/CountedListTest.java +++ b/validating/tests/CountedListTest.java @@ -46,7 +46,7 @@ public void replace() { assertEquals(list.get(1), "Replace"); } // A helper method to simplify the code. As - // long as it isn't annotated with @Test, it will + // long as it's not annotated with @Test, it will // not be automatically executed by JUnit. private void compare(List lst, String[] strs) { From 4259c4945d974ad232fb06d9bd06f11323892dfc Mon Sep 17 00:00:00 2001 From: Bruce Eckel Date: Sun, 27 Nov 2016 08:03:17 -0800 Subject: [PATCH 159/320] Completing the name change --- validating/tests/QueueTest.java | 143 -------------------------------- 1 file changed, 143 deletions(-) delete mode 100644 validating/tests/QueueTest.java diff --git a/validating/tests/QueueTest.java b/validating/tests/QueueTest.java deleted file mode 100644 index 4e89445e2..000000000 --- a/validating/tests/QueueTest.java +++ /dev/null @@ -1,143 +0,0 @@ -// validating/tests/QueueTest.java -// (c)2016 MindView LLC: see Copyright.txt -// We make no guarantees that this code is fit for any purpose. -// Visit http://OnJava8.com for more book information. -package validating; -import org.junit.jupiter.api.*; -import static org.junit.jupiter.api.Assertions.*; - -public class QueueTest { - private Queue queue = new Queue(10); - private int i = 0; - @BeforeEach - public void initialize() { - while(i < 5) // Preload with some data - queue.put(Integer.toString(i++)); - } - // Support methods: - private void showFullness() { - assertTrue(queue.full()); - assertFalse(queue.empty()); - System.out.println(queue.dump()); - } - private void showEmptiness() { - assertFalse(queue.full()); - assertTrue(queue.empty()); - System.out.println(queue.dump()); - } - @Test - public void full() { - System.out.println("testFull"); - System.out.println(queue.dump()); - System.out.println(queue.get()); - System.out.println(queue.get()); - while(!queue.full()) - queue.put(Integer.toString(i++)); - String msg = ""; - try { - queue.put(""); - } catch(QueueException e) { - msg = e.getMessage(); - System.out.println(msg); - } - assertEquals(msg, "put() into full Queue"); - showFullness(); - } - @Test - public void empty() { - System.out.println("testEmpty"); - while(!queue.empty()) - System.out.println(queue.get()); - String msg = ""; - try { - queue.get(); - } catch(QueueException e) { - msg = e.getMessage(); - System.out.println(msg); - } - assertEquals(msg, "get() from empty Queue"); - showEmptiness(); - } - @Test - public void nullPut() { - System.out.println("testNullPut"); - String msg = ""; - try { - queue.put(null); - } catch(QueueException e) { - msg = e.getMessage(); - System.out.println(msg); - } - assertEquals(msg, "put() null item"); - } - @Test - public void circularity() { - System.out.println("testCircularity"); - while(!queue.full()) - queue.put(Integer.toString(i++)); - showFullness(); - assertTrue(queue.isWrapped()); - while(!queue.empty()) - System.out.println(queue.get()); - showEmptiness(); - while(!queue.full()) - queue.put(Integer.toString(i++)); - showFullness(); - while(!queue.empty()) - System.out.println(queue.get()); - showEmptiness(); - } -} -/* Output: -testNullPut -put() null item -testCircularity -in = 0, out = 0, full() = true, empty() = false, queue = -[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -in = 0, out = 0, full() = false, empty() = true, queue = -[null, null, null, null, null, null, null, null, null, -null] -in = 0, out = 0, full() = true, empty() = false, queue = -[10, 11, 12, 13, 14, 15, 16, 17, 18, 19] -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -in = 0, out = 0, full() = false, empty() = true, queue = -[null, null, null, null, null, null, null, null, null, -null] -testFull -in = 5, out = 0, full() = false, empty() = false, queue = -[0, 1, 2, 3, 4, null, null, null, null, null] -0 -1 -put() into full Queue -in = 2, out = 2, full() = true, empty() = false, queue = -[10, 11, 2, 3, 4, 5, 6, 7, 8, 9] -testEmpty -0 -1 -2 -3 -4 -get() from empty Queue -in = 5, out = 5, full() = false, empty() = true, queue = -[null, null, null, null, null, null, null, null, null, -null] -*/ From 72df37d94460d89b205b92f6bff018741687789d Mon Sep 17 00:00:00 2001 From: Bruce Eckel Date: Sun, 27 Nov 2016 08:28:36 -0800 Subject: [PATCH 160/320] Comment out jmh test --- .travis.yml | 2 +- appveyor.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index db7cbb5d8..5d2b80ba6 100644 --- a/.travis.yml +++ b/.travis.yml @@ -4,4 +4,4 @@ jdk: install: true script: - ./gradlew --parallel --stacktrace run - - ./gradlew --parallel --stacktrace :validating:jmh +# - ./gradlew --parallel --stacktrace :validating:jmh diff --git a/appveyor.yml b/appveyor.yml index dfdf8f616..e703c4c0b 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -1,5 +1,5 @@ build_script: - gradlew.bat --parallel --stacktrace run - - gradlew.bat --parallel --stacktrace :validating:jmh +# - gradlew.bat --parallel --stacktrace :validating:jmh test: off From 90563b95459becc3f5e00bbdb54aab72378f8ffc Mon Sep 17 00:00:00 2001 From: Bruce Eckel Date: Fri, 2 Dec 2016 17:05:15 -0800 Subject: [PATCH 161/320] Remove name duplication --- HelloDate.java | 12 --------- .../{IceCream.java => IceCreamFlavors.java} | 4 +-- ...ethods.java => CollectionDifferences.java} | 4 +-- ...oStream.java => CollectionIntoStream.java} | 4 +-- network/tests/ChatterTest.java | 2 +- objects/HelloDate.java | 14 ---------- objects/HelloDateDoc.java | 26 +++++++++++++++++++ 7 files changed, 33 insertions(+), 33 deletions(-) delete mode 100644 HelloDate.java rename arrays/{IceCream.java => IceCreamFlavors.java} (95%) rename collections/{CollectionMethods.java => CollectionDifferences.java} (97%) rename concurrent/{CollectionToStream.java => CollectionIntoStream.java} (91%) create mode 100644 objects/HelloDateDoc.java diff --git a/HelloDate.java b/HelloDate.java deleted file mode 100644 index 9b14605be..000000000 --- a/HelloDate.java +++ /dev/null @@ -1,12 +0,0 @@ -// HelloDate.java -// (c)2016 MindView LLC: see Copyright.txt -// We make no guarantees that this code is fit for any purpose. -// Visit http://OnJava8.com for more book information. -import java.util.*; - -public class HelloDate { - public static void main(String[] args) { - System.out.println("Hello, it's: "); - System.out.println(new Date()); - } -} diff --git a/arrays/IceCream.java b/arrays/IceCreamFlavors.java similarity index 95% rename from arrays/IceCream.java rename to arrays/IceCreamFlavors.java index c47e3afb6..bcc1b394c 100644 --- a/arrays/IceCream.java +++ b/arrays/IceCreamFlavors.java @@ -1,4 +1,4 @@ -// arrays/IceCream.java +// arrays/IceCreamFlavors.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. @@ -6,7 +6,7 @@ import java.util.*; import static onjava.ArrayShow.*; -public class IceCream { +public class IceCreamFlavors { private static SplittableRandom rand = new SplittableRandom(47); static final String[] FLAVORS = { diff --git a/collections/CollectionMethods.java b/collections/CollectionDifferences.java similarity index 97% rename from collections/CollectionMethods.java rename to collections/CollectionDifferences.java index 0a6986cf6..4ace6ad8e 100644 --- a/collections/CollectionMethods.java +++ b/collections/CollectionDifferences.java @@ -1,10 +1,10 @@ -// collections/CollectionMethods.java +// collections/CollectionDifferences.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import onjava.*; -public class CollectionMethods { +public class CollectionDifferences { public static void main(String[] args) { CollectionMethodDifferences.main(args); } diff --git a/concurrent/CollectionToStream.java b/concurrent/CollectionIntoStream.java similarity index 91% rename from concurrent/CollectionToStream.java rename to concurrent/CollectionIntoStream.java index fe188adfe..b666f15ab 100644 --- a/concurrent/CollectionToStream.java +++ b/concurrent/CollectionIntoStream.java @@ -1,4 +1,4 @@ -// concurrent/CollectionToStream.java +// concurrent/CollectionIntoStream.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. @@ -6,7 +6,7 @@ import java.util.*; import java.util.stream.*; -public class CollectionToStream { +public class CollectionIntoStream { public static void main(String[] args) { List strings = Stream.generate(new Rand.String(5)) diff --git a/network/tests/ChatterTest.java b/network/tests/ChatterTest.java index 97de353cd..b72c31d15 100644 --- a/network/tests/ChatterTest.java +++ b/network/tests/ChatterTest.java @@ -13,7 +13,7 @@ static void startMsg() { } @Test void chatterTest() throws Exception { - // <* These need to be handed to an executor: *> + // <* These must be handed to an executor: *> new ChatterServer(); new ChatterClient(InetAddress.getLocalHost()); // No exceptions means success diff --git a/objects/HelloDate.java b/objects/HelloDate.java index 73530bb3b..435361251 100644 --- a/objects/HelloDate.java +++ b/objects/HelloDate.java @@ -4,23 +4,9 @@ // Visit http://OnJava8.com for more book information. import java.util.*; -/** The first On Java example program. - * Displays a String and today's date. - * @author Bruce Eckel - * @author www.MindviewInc.com - * @version 5.0 - */ public class HelloDate { - /** Entry point to class & application. - * @param args array of String arguments - * @throws exceptions No exceptions thrown - */ public static void main(String[] args) { System.out.println("Hello, it's: "); System.out.println(new Date()); } } -/* Output: -Hello, it's: -Wed Jul 27 10:50:45 MDT 2016 -*/ diff --git a/objects/HelloDateDoc.java b/objects/HelloDateDoc.java new file mode 100644 index 000000000..0f7ee4f6f --- /dev/null +++ b/objects/HelloDateDoc.java @@ -0,0 +1,26 @@ +// objects/HelloDateDoc.java +// (c)2016 MindView LLC: see Copyright.txt +// We make no guarantees that this code is fit for any purpose. +// Visit http://OnJava8.com for more book information. +import java.util.*; + +/** The first On Java 8 example program. + * Displays a String and today's date. + * @author Bruce Eckel + * @author www.MindviewInc.com + * @version 5.0 + */ +public class HelloDateDoc { + /** Entry point to class & application. + * @param args array of String arguments + * @throws exceptions No exceptions thrown + */ + public static void main(String[] args) { + System.out.println("Hello, it's: "); + System.out.println(new Date()); + } +} +/* Output: +Hello, it's: +Wed Jul 27 10:50:45 MDT 2016 +*/ From 50228968dbb499681828f557f7c18f810e264e49 Mon Sep 17 00:00:00 2001 From: Bruce Eckel Date: Sun, 4 Dec 2016 09:30:08 -0800 Subject: [PATCH 162/320] Changed as many duplicate file names as possible --- concurrent/{Prime.java => ParallelPrime.java} | 6 +++--- concurrent/Summing.java | 3 +-- enums/{Burrito.java => Burrito2.java} | 18 +++++++++--------- enums/{Spiciness.java => SpicinessEnum.java} | 4 ++-- interfaces/Machine.java | 16 ++++++++-------- .../{RandomWords.java => RandomStrings.java} | 8 ++++---- onjava/{Operation.java => Operations.java} | 8 ++++---- .../{SpaceShip.java => DerivedSpaceShip.java} | 8 ++++---- streams/Machine2.java | 14 +++++++------- typeinfo/Operation.java | 2 +- 10 files changed, 43 insertions(+), 44 deletions(-) rename concurrent/{Prime.java => ParallelPrime.java} (90%) rename enums/{Burrito.java => Burrito2.java} (56%) rename enums/{Spiciness.java => SpicinessEnum.java} (79%) rename interfaces/{RandomWords.java => RandomStrings.java} (85%) rename onjava/{Operation.java => Operations.java} (70%) rename reuse/{SpaceShip.java => DerivedSpaceShip.java} (58%) diff --git a/concurrent/Prime.java b/concurrent/ParallelPrime.java similarity index 90% rename from concurrent/Prime.java rename to concurrent/ParallelPrime.java index 906fbeb25..14c6a184d 100644 --- a/concurrent/Prime.java +++ b/concurrent/ParallelPrime.java @@ -1,4 +1,4 @@ -// concurrent/Prime.java +// concurrent/ParallelPrime.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. @@ -9,7 +9,7 @@ import java.nio.file.*; import java.nio.charset.*; -public class Prime { +public class ParallelPrime { static final int COUNT = 100_000; public static boolean isPrime(long n) { return rangeClosed(2, (long)Math.sqrt(n)) @@ -21,7 +21,7 @@ public static void main(String[] args) List primes = iterate(2, i -> i + 1) .parallel() // [1] - .filter(Prime::isPrime) + .filter(ParallelPrime::isPrime) .limit(COUNT) .mapToObj(Long::toString) .collect(Collectors.toList()); diff --git a/concurrent/Summing.java b/concurrent/Summing.java index a1be4bbf2..99fc4eb3b 100644 --- a/concurrent/Summing.java +++ b/concurrent/Summing.java @@ -23,9 +23,8 @@ static void timeTest(String id, long checkValue, public static final int SZ = 100_000_000; // This even works: // public static final int SZ = 1_000_000_000; - // Gauss's formula: public static final long CHECK = - (long)SZ * ((long)SZ + 1)/2; + (long)SZ * ((long)SZ + 1)/2; // Gauss's formula public static void main(String[] args) { System.out.println(CHECK); timeTest("Sum Stream", CHECK, () -> diff --git a/enums/Burrito.java b/enums/Burrito2.java similarity index 56% rename from enums/Burrito.java rename to enums/Burrito2.java index 25e1ac644..da01b95a6 100644 --- a/enums/Burrito.java +++ b/enums/Burrito2.java @@ -1,14 +1,14 @@ -// enums/Burrito.java +// enums/Burrito2.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. -// {java enums.Burrito} +// {java enums.Burrito2} package enums; -import static enums.Spiciness.*; +import static enums.SpicinessEnum.*; -public class Burrito { - Spiciness degree; - public Burrito(Spiciness degree) { +public class Burrito2 { + SpicinessEnum degree; + public Burrito2(SpicinessEnum degree) { this.degree = degree; } @Override @@ -16,9 +16,9 @@ public String toString() { return "Burrito is "+ degree; } public static void main(String[] args) { - System.out.println(new Burrito(NOT)); - System.out.println(new Burrito(MEDIUM)); - System.out.println(new Burrito(HOT)); + System.out.println(new Burrito2(NOT)); + System.out.println(new Burrito2(MEDIUM)); + System.out.println(new Burrito2(HOT)); } } /* Output: diff --git a/enums/Spiciness.java b/enums/SpicinessEnum.java similarity index 79% rename from enums/Spiciness.java rename to enums/SpicinessEnum.java index 43aefdf2f..0260cbce1 100644 --- a/enums/Spiciness.java +++ b/enums/SpicinessEnum.java @@ -1,9 +1,9 @@ -// enums/Spiciness.java +// enums/SpicinessEnum.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. package enums; -public enum Spiciness { +public enum SpicinessEnum { NOT, MILD, MEDIUM, HOT, FLAMING } diff --git a/interfaces/Machine.java b/interfaces/Machine.java index ea0ac9af8..ae550745c 100644 --- a/interfaces/Machine.java +++ b/interfaces/Machine.java @@ -3,29 +3,29 @@ // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.*; -import onjava.Operation; +import onjava.Operations; -class Bing implements Operation { +class Bing implements Operations { public void execute() { - Operation.show("Bing"); + Operations.show("Bing"); } } -class Crack implements Operation { +class Crack implements Operations { public void execute() { - Operation.show("Crack"); + Operations.show("Crack"); } } -class Twist implements Operation { +class Twist implements Operations { public void execute() { - Operation.show("Twist"); + Operations.show("Twist"); } } public class Machine { public static void main(String[] args) { - Operation.runOps( + Operations.runOps( new Bing(), new Crack(), new Twist()); } } diff --git a/interfaces/RandomWords.java b/interfaces/RandomStrings.java similarity index 85% rename from interfaces/RandomWords.java rename to interfaces/RandomStrings.java index 95eefcd48..ac9add027 100644 --- a/interfaces/RandomWords.java +++ b/interfaces/RandomStrings.java @@ -1,4 +1,4 @@ -// interfaces/RandomWords.java +// interfaces/RandomStrings.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. @@ -6,7 +6,7 @@ import java.nio.*; import java.util.*; -public class RandomWords implements Readable { +public class RandomStrings implements Readable { private static Random rand = new Random(47); private static final char[] CAPITALS = "ABCDEFGHIJKLMNOPQRSTUVWXYZ".toCharArray(); @@ -15,7 +15,7 @@ public class RandomWords implements Readable { private static final char[] VOWELS = "aeiou".toCharArray(); private int count; - public RandomWords(int count) { this.count = count; } + public RandomStrings(int count) { this.count = count; } @Override public int read(CharBuffer cb) { if(count-- == 0) @@ -29,7 +29,7 @@ public int read(CharBuffer cb) { return 10; // Number of characters appended } public static void main(String[] args) { - Scanner s = new Scanner(new RandomWords(10)); + Scanner s = new Scanner(new RandomStrings(10)); while(s.hasNext()) System.out.println(s.next()); } diff --git a/onjava/Operation.java b/onjava/Operations.java similarity index 70% rename from onjava/Operation.java rename to onjava/Operations.java index 804500e68..e936ec518 100644 --- a/onjava/Operation.java +++ b/onjava/Operations.java @@ -1,14 +1,14 @@ -// onjava/Operation.java +// onjava/Operations.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. package onjava; import java.util.*; -public interface Operation { +public interface Operations { void execute(); - static void runOps(Operation... ops) { - for(Operation op : ops) + static void runOps(Operations... ops) { + for(Operations op : ops) op.execute(); } static void show(String msg) { diff --git a/reuse/SpaceShip.java b/reuse/DerivedSpaceShip.java similarity index 58% rename from reuse/SpaceShip.java rename to reuse/DerivedSpaceShip.java index bcf0aefd3..54f17172c 100644 --- a/reuse/SpaceShip.java +++ b/reuse/DerivedSpaceShip.java @@ -1,15 +1,15 @@ -// reuse/SpaceShip.java +// reuse/DerivedSpaceShip.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. -public class SpaceShip extends SpaceShipControls { +public class DerivedSpaceShip extends SpaceShipControls { private String name; - public SpaceShip(String name) { this.name = name; } + public DerivedSpaceShip(String name) { this.name = name; } @Override public String toString() { return name; } public static void main(String[] args) { - SpaceShip protector = new SpaceShip("NSEA Protector"); + DerivedSpaceShip protector = new DerivedSpaceShip("NSEA Protector"); protector.forward(100); } } diff --git a/streams/Machine2.java b/streams/Machine2.java index 356426c3d..f7856bd7a 100644 --- a/streams/Machine2.java +++ b/streams/Machine2.java @@ -3,16 +3,16 @@ // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.*; -import onjava.Operation; +import onjava.Operations; public class Machine2 { public static void main(String[] args) { - Arrays.stream(new Operation[] { - () -> Operation.show("Bing"), - () -> Operation.show("Crack"), - () -> Operation.show("Twist"), - () -> Operation.show("Pop") - }).forEach(Operation::execute); + Arrays.stream(new Operations[] { + () -> Operations.show("Bing"), + () -> Operations.show("Crack"), + () -> Operations.show("Twist"), + () -> Operations.show("Pop") + }).forEach(Operations::execute); } } /* Output: diff --git a/typeinfo/Operation.java b/typeinfo/Operation.java index a3889cd1e..011f2b868 100644 --- a/typeinfo/Operation.java +++ b/typeinfo/Operation.java @@ -8,7 +8,7 @@ public class Operation { public final Supplier description; public final Runnable command; public - Operation (Supplier descr, Runnable cmd) { + Operation(Supplier descr, Runnable cmd) { description = descr; command = cmd; } From 6545d1606b4037e82fce7b4e5bfa72b5efc674c2 Mon Sep 17 00:00:00 2001 From: Bruce Eckel Date: Sun, 4 Dec 2016 12:15:21 -0800 Subject: [PATCH 163/320] Added shutdown() for ExecutorService --- concurrent/CaptureUncaughtException.java | 17 ++++++----------- concurrent/ExceptionThread.java | 1 + concurrent/NaiveExceptionHandling.java | 8 +++++--- concurrent/SettingDefaultHandler.java | 4 +--- concurrent/SwallowedException.java | 2 +- concurrent/ThreadSize.java | 2 ++ 6 files changed, 16 insertions(+), 18 deletions(-) diff --git a/concurrent/CaptureUncaughtException.java b/concurrent/CaptureUncaughtException.java index 04e262b92..32b2fd701 100644 --- a/concurrent/CaptureUncaughtException.java +++ b/concurrent/CaptureUncaughtException.java @@ -3,7 +3,6 @@ // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.concurrent.*; -import onjava.TimedAbort; class ExceptionThread2 implements Runnable { @Override @@ -40,21 +39,17 @@ public Thread newThread(Runnable r) { public class CaptureUncaughtException { public static void main(String[] args) { - new TimedAbort(4); ExecutorService exec = Executors.newCachedThreadPool( new HandlerThreadFactory()); exec.execute(new ExceptionThread2()); + exec.shutdown(); } } /* Output: -HandlerThreadFactory@14991ad creating new Thread -created Thread[Thread-1,5,main] -eh = MyUncaughtExceptionHandler@d93b30 -run() by Thread-1 -eh = MyUncaughtExceptionHandler@d93b30 -HandlerThreadFactory@14991ad creating new Thread -created Thread[Thread-2,5,main] -eh = MyUncaughtExceptionHandler@1351c58 +HandlerThreadFactory@4e25154f creating new Thread +created Thread[Thread-0,5,main] +eh = MyUncaughtExceptionHandler@70dea4e +run() by Thread-0 +eh = MyUncaughtExceptionHandler@70dea4e caught java.lang.RuntimeException -TimedAbort 4 */ diff --git a/concurrent/ExceptionThread.java b/concurrent/ExceptionThread.java index cf66c3b8d..938c10386 100644 --- a/concurrent/ExceptionThread.java +++ b/concurrent/ExceptionThread.java @@ -14,5 +14,6 @@ public void run() { public static void main(String[] args) { ExecutorService es = Executors.newCachedThreadPool(); es.execute(new ExceptionThread()); + es.shutdown(); } } diff --git a/concurrent/NaiveExceptionHandling.java b/concurrent/NaiveExceptionHandling.java index d848b1464..56cf32a14 100644 --- a/concurrent/NaiveExceptionHandling.java +++ b/concurrent/NaiveExceptionHandling.java @@ -8,13 +8,15 @@ public class NaiveExceptionHandling { public static void main(String[] args) { + ExecutorService es = + Executors.newCachedThreadPool(); try { - ExecutorService exec = - Executors.newCachedThreadPool(); - exec.execute(new ExceptionThread()); + es.execute(new ExceptionThread()); } catch(RuntimeException ue) { // This statement will NOT execute! System.out.println("Exception was handled!"); + } finally { + es.shutdown(); } } } diff --git a/concurrent/SettingDefaultHandler.java b/concurrent/SettingDefaultHandler.java index ed45f8f3e..a2a710153 100644 --- a/concurrent/SettingDefaultHandler.java +++ b/concurrent/SettingDefaultHandler.java @@ -3,18 +3,16 @@ // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.concurrent.*; -import onjava.TimedAbort; public class SettingDefaultHandler { public static void main(String[] args) { - new TimedAbort(4); Thread.setDefaultUncaughtExceptionHandler( new MyUncaughtExceptionHandler()); ExecutorService es = Executors.newCachedThreadPool(); es.execute(new ExceptionThread()); + es.shutdown(); } } /* Output: caught java.lang.RuntimeException -TimedAbort 4 */ diff --git a/concurrent/SwallowedException.java b/concurrent/SwallowedException.java index 0596711a3..b03015c9f 100644 --- a/concurrent/SwallowedException.java +++ b/concurrent/SwallowedException.java @@ -12,6 +12,6 @@ public static void main(String[] args) exec.submit(() -> { throw new RuntimeException(); }); - exec.shutdownNow(); + exec.shutdown(); } } diff --git a/concurrent/ThreadSize.java b/concurrent/ThreadSize.java index 7ee1acd59..550fe103a 100644 --- a/concurrent/ThreadSize.java +++ b/concurrent/ThreadSize.java @@ -29,6 +29,8 @@ public static void main(String[] args) { System.out.println( e.getClass().getSimpleName() + ": " + count); System.exit(0); + } finally { + exec.shutdown(); } } } From 7da525bf37ef55e0f1a453cb80aba10831d7e806 Mon Sep 17 00:00:00 2001 From: Bruce Eckel Date: Tue, 6 Dec 2016 10:29:12 -0800 Subject: [PATCH 164/320] Bump JMH version --- gradle/jmh.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/jmh.gradle b/gradle/jmh.gradle index 99d026bb0..e78ea1849 100644 --- a/gradle/jmh.gradle +++ b/gradle/jmh.gradle @@ -9,7 +9,7 @@ sourceSets { } jmh { - jmhVersion = '1.17' + jmhVersion = '1.17.2' duplicateClassesStrategy = 'warn' failOnError = true // See https://github.com/melix/jmh-gradle-plugin From d863e0fffbbc7fc14ffddd781f081dd6a346ec1e Mon Sep 17 00:00:00 2001 From: Bruce Eckel Date: Wed, 7 Dec 2016 10:34:41 -0800 Subject: [PATCH 165/320] Separation complete --- {concurrent => lowlevel}/AtomicEvenSupplier.java | 2 +- {concurrent => lowlevel}/AtomicIntegerTest.java | 2 +- {concurrent => lowlevel}/Atomicity.java | 2 +- {concurrent => lowlevel}/AtomicityTest.java | 2 +- {concurrent => lowlevel}/AttemptLocking.java | 2 +- .../CaptureUncaughtException.java | 2 +- {concurrent => lowlevel}/CriticalSection.java | 2 +- {concurrent => lowlevel}/DelayQueueDemo.java | 2 +- {concurrent => lowlevel}/EvenChecker.java | 2 +- {concurrent => lowlevel}/EvenSupplier.java | 2 +- {concurrent => lowlevel}/ExceptionThread.java | 2 +- .../ExplicitCriticalSection.java | 2 +- {concurrent => lowlevel}/GreenhouseScheduler.java | 2 +- {concurrent => lowlevel}/HorseRace.java | 2 +- {concurrent => lowlevel}/IntSupplier.java | 2 +- {concurrent => lowlevel}/MutexEvenSupplier.java | 2 +- .../NaiveExceptionHandling.java | 2 +- {concurrent => lowlevel}/NumberOfProcessors.java | 2 +- .../PriorityBlockingQueueDemo.java | 2 +- {concurrent => lowlevel}/QuittableTask.java | 2 +- {concurrent => lowlevel}/QuittingTasks.java | 2 +- {concurrent => lowlevel}/SerialNumberChecker.java | 2 +- {concurrent => lowlevel}/SerialNumberSupplier.java | 2 +- .../SettingDefaultHandler.java | 2 +- {concurrent => lowlevel}/SwallowedException.java | 2 +- {concurrent => lowlevel}/SyncObject.java | 2 +- .../SynchronizedEvenSupplier.java | 2 +- {concurrent => lowlevel}/ThreadSize.java | 2 +- {concurrent => lowlevel}/WorkStealingPool.java | 2 +- operators/AllOps.java | 14 +++++++------- 30 files changed, 36 insertions(+), 36 deletions(-) rename {concurrent => lowlevel}/AtomicEvenSupplier.java (94%) rename {concurrent => lowlevel}/AtomicIntegerTest.java (96%) rename {concurrent => lowlevel}/Atomicity.java (97%) rename {concurrent => lowlevel}/AtomicityTest.java (96%) rename {concurrent => lowlevel}/AttemptLocking.java (97%) rename {concurrent => lowlevel}/CaptureUncaughtException.java (97%) rename {concurrent => lowlevel}/CriticalSection.java (99%) rename {concurrent => lowlevel}/DelayQueueDemo.java (98%) rename {concurrent => lowlevel}/EvenChecker.java (97%) rename {concurrent => lowlevel}/EvenSupplier.java (95%) rename {concurrent => lowlevel}/ExceptionThread.java (93%) rename {concurrent => lowlevel}/ExplicitCriticalSection.java (98%) rename {concurrent => lowlevel}/GreenhouseScheduler.java (99%) rename {concurrent => lowlevel}/HorseRace.java (99%) rename {concurrent => lowlevel}/IntSupplier.java (92%) rename {concurrent => lowlevel}/MutexEvenSupplier.java (95%) rename {concurrent => lowlevel}/NaiveExceptionHandling.java (93%) rename {concurrent => lowlevel}/NumberOfProcessors.java (89%) rename {concurrent => lowlevel}/PriorityBlockingQueueDemo.java (98%) rename {concurrent => lowlevel}/QuittableTask.java (94%) rename {concurrent => lowlevel}/QuittingTasks.java (96%) rename {concurrent => lowlevel}/SerialNumberChecker.java (97%) rename {concurrent => lowlevel}/SerialNumberSupplier.java (89%) rename {concurrent => lowlevel}/SettingDefaultHandler.java (92%) rename {concurrent => lowlevel}/SwallowedException.java (92%) rename {concurrent => lowlevel}/SyncObject.java (96%) rename {concurrent => lowlevel}/SynchronizedEvenSupplier.java (93%) rename {concurrent => lowlevel}/ThreadSize.java (96%) rename {concurrent => lowlevel}/WorkStealingPool.java (96%) diff --git a/concurrent/AtomicEvenSupplier.java b/lowlevel/AtomicEvenSupplier.java similarity index 94% rename from concurrent/AtomicEvenSupplier.java rename to lowlevel/AtomicEvenSupplier.java index 84104c8f0..366486084 100644 --- a/concurrent/AtomicEvenSupplier.java +++ b/lowlevel/AtomicEvenSupplier.java @@ -1,4 +1,4 @@ -// concurrent/AtomicEvenSupplier.java +// lowlevel/AtomicEvenSupplier.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/concurrent/AtomicIntegerTest.java b/lowlevel/AtomicIntegerTest.java similarity index 96% rename from concurrent/AtomicIntegerTest.java rename to lowlevel/AtomicIntegerTest.java index 600cd7cf5..b3f6cc51d 100644 --- a/concurrent/AtomicIntegerTest.java +++ b/lowlevel/AtomicIntegerTest.java @@ -1,4 +1,4 @@ -// concurrent/AtomicIntegerTest.java +// lowlevel/AtomicIntegerTest.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/concurrent/Atomicity.java b/lowlevel/Atomicity.java similarity index 97% rename from concurrent/Atomicity.java rename to lowlevel/Atomicity.java index 25ac917b2..5ebfbccbc 100644 --- a/concurrent/Atomicity.java +++ b/lowlevel/Atomicity.java @@ -1,4 +1,4 @@ -// concurrent/Atomicity.java +// lowlevel/Atomicity.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/concurrent/AtomicityTest.java b/lowlevel/AtomicityTest.java similarity index 96% rename from concurrent/AtomicityTest.java rename to lowlevel/AtomicityTest.java index 0f4577f8a..fea1594d0 100644 --- a/concurrent/AtomicityTest.java +++ b/lowlevel/AtomicityTest.java @@ -1,4 +1,4 @@ -// concurrent/AtomicityTest.java +// lowlevel/AtomicityTest.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/concurrent/AttemptLocking.java b/lowlevel/AttemptLocking.java similarity index 97% rename from concurrent/AttemptLocking.java rename to lowlevel/AttemptLocking.java index bcc2f2765..08165a6d6 100644 --- a/concurrent/AttemptLocking.java +++ b/lowlevel/AttemptLocking.java @@ -1,4 +1,4 @@ -// concurrent/AttemptLocking.java +// lowlevel/AttemptLocking.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/concurrent/CaptureUncaughtException.java b/lowlevel/CaptureUncaughtException.java similarity index 97% rename from concurrent/CaptureUncaughtException.java rename to lowlevel/CaptureUncaughtException.java index 32b2fd701..76f36a762 100644 --- a/concurrent/CaptureUncaughtException.java +++ b/lowlevel/CaptureUncaughtException.java @@ -1,4 +1,4 @@ -// concurrent/CaptureUncaughtException.java +// lowlevel/CaptureUncaughtException.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/concurrent/CriticalSection.java b/lowlevel/CriticalSection.java similarity index 99% rename from concurrent/CriticalSection.java rename to lowlevel/CriticalSection.java index dba1b9e09..a88c46ba3 100644 --- a/concurrent/CriticalSection.java +++ b/lowlevel/CriticalSection.java @@ -1,4 +1,4 @@ -// concurrent/CriticalSection.java +// lowlevel/CriticalSection.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/concurrent/DelayQueueDemo.java b/lowlevel/DelayQueueDemo.java similarity index 98% rename from concurrent/DelayQueueDemo.java rename to lowlevel/DelayQueueDemo.java index 9ae60b143..485f235c6 100644 --- a/concurrent/DelayQueueDemo.java +++ b/lowlevel/DelayQueueDemo.java @@ -1,4 +1,4 @@ -// concurrent/DelayQueueDemo.java +// lowlevel/DelayQueueDemo.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/concurrent/EvenChecker.java b/lowlevel/EvenChecker.java similarity index 97% rename from concurrent/EvenChecker.java rename to lowlevel/EvenChecker.java index 74af645c1..1010473f2 100644 --- a/concurrent/EvenChecker.java +++ b/lowlevel/EvenChecker.java @@ -1,4 +1,4 @@ -// concurrent/EvenChecker.java +// lowlevel/EvenChecker.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/concurrent/EvenSupplier.java b/lowlevel/EvenSupplier.java similarity index 95% rename from concurrent/EvenSupplier.java rename to lowlevel/EvenSupplier.java index 38a92d2d0..490f4104c 100644 --- a/concurrent/EvenSupplier.java +++ b/lowlevel/EvenSupplier.java @@ -1,4 +1,4 @@ -// concurrent/EvenSupplier.java +// lowlevel/EvenSupplier.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/concurrent/ExceptionThread.java b/lowlevel/ExceptionThread.java similarity index 93% rename from concurrent/ExceptionThread.java rename to lowlevel/ExceptionThread.java index 938c10386..675939517 100644 --- a/concurrent/ExceptionThread.java +++ b/lowlevel/ExceptionThread.java @@ -1,4 +1,4 @@ -// concurrent/ExceptionThread.java +// lowlevel/ExceptionThread.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/concurrent/ExplicitCriticalSection.java b/lowlevel/ExplicitCriticalSection.java similarity index 98% rename from concurrent/ExplicitCriticalSection.java rename to lowlevel/ExplicitCriticalSection.java index adcd2ea0f..1f31556b0 100644 --- a/concurrent/ExplicitCriticalSection.java +++ b/lowlevel/ExplicitCriticalSection.java @@ -1,4 +1,4 @@ -// concurrent/ExplicitCriticalSection.java +// lowlevel/ExplicitCriticalSection.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/concurrent/GreenhouseScheduler.java b/lowlevel/GreenhouseScheduler.java similarity index 99% rename from concurrent/GreenhouseScheduler.java rename to lowlevel/GreenhouseScheduler.java index 1d52a01a4..a7535df3d 100644 --- a/concurrent/GreenhouseScheduler.java +++ b/lowlevel/GreenhouseScheduler.java @@ -1,4 +1,4 @@ -// concurrent/GreenhouseScheduler.java +// lowlevel/GreenhouseScheduler.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/concurrent/HorseRace.java b/lowlevel/HorseRace.java similarity index 99% rename from concurrent/HorseRace.java rename to lowlevel/HorseRace.java index de84f25df..2f95336e0 100644 --- a/concurrent/HorseRace.java +++ b/lowlevel/HorseRace.java @@ -1,4 +1,4 @@ -// concurrent/HorseRace.java +// lowlevel/HorseRace.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/concurrent/IntSupplier.java b/lowlevel/IntSupplier.java similarity index 92% rename from concurrent/IntSupplier.java rename to lowlevel/IntSupplier.java index 6c0be8d2c..0eb84a2c3 100644 --- a/concurrent/IntSupplier.java +++ b/lowlevel/IntSupplier.java @@ -1,4 +1,4 @@ -// concurrent/IntSupplier.java +// lowlevel/IntSupplier.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/concurrent/MutexEvenSupplier.java b/lowlevel/MutexEvenSupplier.java similarity index 95% rename from concurrent/MutexEvenSupplier.java rename to lowlevel/MutexEvenSupplier.java index db4c62c9d..688c9b3e9 100644 --- a/concurrent/MutexEvenSupplier.java +++ b/lowlevel/MutexEvenSupplier.java @@ -1,4 +1,4 @@ -// concurrent/MutexEvenSupplier.java +// lowlevel/MutexEvenSupplier.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/concurrent/NaiveExceptionHandling.java b/lowlevel/NaiveExceptionHandling.java similarity index 93% rename from concurrent/NaiveExceptionHandling.java rename to lowlevel/NaiveExceptionHandling.java index 56cf32a14..a247edaf0 100644 --- a/concurrent/NaiveExceptionHandling.java +++ b/lowlevel/NaiveExceptionHandling.java @@ -1,4 +1,4 @@ -// concurrent/NaiveExceptionHandling.java +// lowlevel/NaiveExceptionHandling.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/concurrent/NumberOfProcessors.java b/lowlevel/NumberOfProcessors.java similarity index 89% rename from concurrent/NumberOfProcessors.java rename to lowlevel/NumberOfProcessors.java index 8acf272fd..6728fcd58 100644 --- a/concurrent/NumberOfProcessors.java +++ b/lowlevel/NumberOfProcessors.java @@ -1,4 +1,4 @@ -// concurrent/NumberOfProcessors.java +// lowlevel/NumberOfProcessors.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/concurrent/PriorityBlockingQueueDemo.java b/lowlevel/PriorityBlockingQueueDemo.java similarity index 98% rename from concurrent/PriorityBlockingQueueDemo.java rename to lowlevel/PriorityBlockingQueueDemo.java index aa45515bf..d7f8648ef 100644 --- a/concurrent/PriorityBlockingQueueDemo.java +++ b/lowlevel/PriorityBlockingQueueDemo.java @@ -1,4 +1,4 @@ -// concurrent/PriorityBlockingQueueDemo.java +// lowlevel/PriorityBlockingQueueDemo.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/concurrent/QuittableTask.java b/lowlevel/QuittableTask.java similarity index 94% rename from concurrent/QuittableTask.java rename to lowlevel/QuittableTask.java index bd7e80d93..b671bdafc 100644 --- a/concurrent/QuittableTask.java +++ b/lowlevel/QuittableTask.java @@ -1,4 +1,4 @@ -// concurrent/QuittableTask.java +// lowlevel/QuittableTask.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/concurrent/QuittingTasks.java b/lowlevel/QuittingTasks.java similarity index 96% rename from concurrent/QuittingTasks.java rename to lowlevel/QuittingTasks.java index 782892668..456b831fa 100644 --- a/concurrent/QuittingTasks.java +++ b/lowlevel/QuittingTasks.java @@ -1,4 +1,4 @@ -// concurrent/QuittingTasks.java +// lowlevel/QuittingTasks.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/concurrent/SerialNumberChecker.java b/lowlevel/SerialNumberChecker.java similarity index 97% rename from concurrent/SerialNumberChecker.java rename to lowlevel/SerialNumberChecker.java index 0be31b5e8..b269e9ece 100644 --- a/concurrent/SerialNumberChecker.java +++ b/lowlevel/SerialNumberChecker.java @@ -1,4 +1,4 @@ -// concurrent/SerialNumberChecker.java +// lowlevel/SerialNumberChecker.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/concurrent/SerialNumberSupplier.java b/lowlevel/SerialNumberSupplier.java similarity index 89% rename from concurrent/SerialNumberSupplier.java rename to lowlevel/SerialNumberSupplier.java index 53137d5f9..4a170f85d 100644 --- a/concurrent/SerialNumberSupplier.java +++ b/lowlevel/SerialNumberSupplier.java @@ -1,4 +1,4 @@ -// concurrent/SerialNumberSupplier.java +// lowlevel/SerialNumberSupplier.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/concurrent/SettingDefaultHandler.java b/lowlevel/SettingDefaultHandler.java similarity index 92% rename from concurrent/SettingDefaultHandler.java rename to lowlevel/SettingDefaultHandler.java index a2a710153..17588d6a4 100644 --- a/concurrent/SettingDefaultHandler.java +++ b/lowlevel/SettingDefaultHandler.java @@ -1,4 +1,4 @@ -// concurrent/SettingDefaultHandler.java +// lowlevel/SettingDefaultHandler.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/concurrent/SwallowedException.java b/lowlevel/SwallowedException.java similarity index 92% rename from concurrent/SwallowedException.java rename to lowlevel/SwallowedException.java index b03015c9f..d062d2a14 100644 --- a/concurrent/SwallowedException.java +++ b/lowlevel/SwallowedException.java @@ -1,4 +1,4 @@ -// concurrent/SwallowedException.java +// lowlevel/SwallowedException.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/concurrent/SyncObject.java b/lowlevel/SyncObject.java similarity index 96% rename from concurrent/SyncObject.java rename to lowlevel/SyncObject.java index c5f59b33b..02104002b 100644 --- a/concurrent/SyncObject.java +++ b/lowlevel/SyncObject.java @@ -1,4 +1,4 @@ -// concurrent/SyncObject.java +// lowlevel/SyncObject.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/concurrent/SynchronizedEvenSupplier.java b/lowlevel/SynchronizedEvenSupplier.java similarity index 93% rename from concurrent/SynchronizedEvenSupplier.java rename to lowlevel/SynchronizedEvenSupplier.java index 99c6f55fc..10b375a14 100644 --- a/concurrent/SynchronizedEvenSupplier.java +++ b/lowlevel/SynchronizedEvenSupplier.java @@ -1,4 +1,4 @@ -// concurrent/SynchronizedEvenSupplier.java +// lowlevel/SynchronizedEvenSupplier.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/concurrent/ThreadSize.java b/lowlevel/ThreadSize.java similarity index 96% rename from concurrent/ThreadSize.java rename to lowlevel/ThreadSize.java index 550fe103a..c726fcca7 100644 --- a/concurrent/ThreadSize.java +++ b/lowlevel/ThreadSize.java @@ -1,4 +1,4 @@ -// concurrent/ThreadSize.java +// lowlevel/ThreadSize.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/concurrent/WorkStealingPool.java b/lowlevel/WorkStealingPool.java similarity index 96% rename from concurrent/WorkStealingPool.java rename to lowlevel/WorkStealingPool.java index 0cb922e7a..93b6f4b9c 100644 --- a/concurrent/WorkStealingPool.java +++ b/lowlevel/WorkStealingPool.java @@ -1,4 +1,4 @@ -// concurrent/WorkStealingPool.java +// lowlevel/WorkStealingPool.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/operators/AllOps.java b/operators/AllOps.java index 59fb13dcc..65bfef8de 100644 --- a/operators/AllOps.java +++ b/operators/AllOps.java @@ -67,8 +67,8 @@ void charTest(char x, char y) { x = (char)(x - y); x++; x--; - x = (char)+y; - x = (char)-y; + x = (char) + y; + x = (char) - y; // Relational and logical: f(x > y); f(x >= y); @@ -117,8 +117,8 @@ void byteTest(byte x, byte y) { x = (byte)(x - y); x++; x--; - x = (byte)+ y; - x = (byte)- y; + x = (byte) + y; + x = (byte) - y; // Relational and logical: f(x > y); f(x >= y); @@ -167,8 +167,8 @@ void shortTest(short x, short y) { x = (short)(x - y); x++; x--; - x = (short)+y; - x = (short)-y; + x = (short) + y; + x = (short) - y; // Relational and logical: f(x > y); f(x >= y); @@ -180,7 +180,7 @@ void shortTest(short x, short y) { //- f(x && y); //- f(x || y); // Bitwise operators: - x = (short)~y; + x = (short) ~ y; x = (short)(x & y); x = (short)(x | y); x = (short)(x ^ y); From e9cb6658d7ac99535742928f4f2c51b2f55f8e00 Mon Sep 17 00:00:00 2001 From: Bruce Eckel Date: Thu, 15 Dec 2016 14:04:13 -0800 Subject: [PATCH 166/320] Update to latest point release of library --- gradle/jmh.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/jmh.gradle b/gradle/jmh.gradle index e78ea1849..bf8c770c6 100644 --- a/gradle/jmh.gradle +++ b/gradle/jmh.gradle @@ -9,7 +9,7 @@ sourceSets { } jmh { - jmhVersion = '1.17.2' + jmhVersion = '1.17.3' duplicateClassesStrategy = 'warn' failOnError = true // See https://github.com/melix/jmh-gradle-plugin From 043b25d76eea09125b02bfc299fc204623a585bf Mon Sep 17 00:00:00 2001 From: Bruce Eckel Date: Sat, 17 Dec 2016 10:51:25 -0800 Subject: [PATCH 167/320] Timer.java, bump Gradle version, remove awaitTermination, Pizza --- concurrent/CachedThreadPool.java | 1 - concurrent/CachedThreadPool2.java | 1 - concurrent/LambdasAndMethodReferences.java | 1 - concurrent/MoreTasksAfterShutdown.java | 1 - concurrent/OnePizza.java | 26 ++++++++++ concurrent/ParallelPrime.java | 6 +-- concurrent/Pizza.java | 46 +++++++++++++++++ concurrent/PizzaStreams.java | 60 ++++++++++++++++++++++ concurrent/QuittableTask.java | 24 +++++++++ concurrent/QuittingTasks.java | 24 +++++++++ concurrent/SingleThreadExecutor2.java | 1 - concurrent/SingleThreadExecutor3.java | 1 - concurrent/Summing.java | 6 +-- gradle/wrapper/gradle-wrapper.properties | 2 +- onjava/TimedAbort.java | 2 +- onjava/Timer.java | 19 +++++++ references/Compete.java | 11 ++-- validating/BadMicroBenchmark.java | 11 ++-- validating/BadMicroBenchmark2.java | 25 ++++----- validating/Time.java | 16 ------ 20 files changed, 232 insertions(+), 52 deletions(-) create mode 100644 concurrent/OnePizza.java create mode 100644 concurrent/Pizza.java create mode 100644 concurrent/PizzaStreams.java create mode 100644 concurrent/QuittableTask.java create mode 100644 concurrent/QuittingTasks.java create mode 100644 onjava/Timer.java delete mode 100644 validating/Time.java diff --git a/concurrent/CachedThreadPool.java b/concurrent/CachedThreadPool.java index 1cd48564d..1c35c1845 100644 --- a/concurrent/CachedThreadPool.java +++ b/concurrent/CachedThreadPool.java @@ -12,7 +12,6 @@ public static void main(String[] args) for(int id = 0; id < 10; id++) exec.execute(new SleepAndPrintTask(id)); exec.shutdown(); - exec.awaitTermination(5, TimeUnit.SECONDS); } } /* Output: diff --git a/concurrent/CachedThreadPool2.java b/concurrent/CachedThreadPool2.java index 3c66da6d9..55119ce91 100644 --- a/concurrent/CachedThreadPool2.java +++ b/concurrent/CachedThreadPool2.java @@ -12,7 +12,6 @@ public static void main(String[] args) for(int id = 0; id < 10; id++) exec.execute(new InterferingTask(id)); exec.shutdown(); - exec.awaitTermination(5, TimeUnit.SECONDS); } } /* Output: diff --git a/concurrent/LambdasAndMethodReferences.java b/concurrent/LambdasAndMethodReferences.java index 2e713d46d..9b7813aae 100644 --- a/concurrent/LambdasAndMethodReferences.java +++ b/concurrent/LambdasAndMethodReferences.java @@ -30,7 +30,6 @@ public static void main(String[] args) }); exec.submit(new NotCallable()::get); exec.shutdown(); - exec.awaitTermination(1, TimeUnit.SECONDS); } } /* Output: diff --git a/concurrent/MoreTasksAfterShutdown.java b/concurrent/MoreTasksAfterShutdown.java index a940bd677..15ca9a6d2 100644 --- a/concurrent/MoreTasksAfterShutdown.java +++ b/concurrent/MoreTasksAfterShutdown.java @@ -16,7 +16,6 @@ public static void main(String[] args) } catch(RejectedExecutionException e) { System.out.println(e); } - exec.awaitTermination(5, TimeUnit.SECONDS); } } /* Output: diff --git a/concurrent/OnePizza.java b/concurrent/OnePizza.java new file mode 100644 index 000000000..608821c75 --- /dev/null +++ b/concurrent/OnePizza.java @@ -0,0 +1,26 @@ +// concurrent/OnePizza.java +// (c)2016 MindView LLC: see Copyright.txt +// We make no guarantees that this code is fit for any purpose. +// Visit http://OnJava8.com for more book information. +import onjava.Timer; + +public class OnePizza { + public static void main(String[] args) { + Pizza za = new Pizza(0); + System.out.println( + Timer.duration(() -> { + while(!za.complete()) + za.next(); + })); + } +} +/* Output: +Pizza 0: ROLLED +Pizza 0: SAUCED +Pizza 0: CHEESED +Pizza 0: TOPPED +Pizza 0: BAKED +Pizza 0: SLICED +Pizza 0: BOXED +1612 +*/ diff --git a/concurrent/ParallelPrime.java b/concurrent/ParallelPrime.java index 14c6a184d..597f645ef 100644 --- a/concurrent/ParallelPrime.java +++ b/concurrent/ParallelPrime.java @@ -8,6 +8,7 @@ import java.io.*; import java.nio.file.*; import java.nio.charset.*; +import onjava.Timer; public class ParallelPrime { static final int COUNT = 100_000; @@ -17,7 +18,7 @@ public static boolean isPrime(long n) { } public static void main(String[] args) throws IOException { - long start = System.currentTimeMillis(); + Timer timer = new Timer(); List primes = iterate(2, i -> i + 1) .parallel() // [1] @@ -25,8 +26,7 @@ public static void main(String[] args) .limit(COUNT) .mapToObj(Long::toString) .collect(Collectors.toList()); - System.out.println( - System.currentTimeMillis() - start); + System.out.println(timer.duration()); Files.write(Paths.get("primes.txt"), primes, StandardOpenOption.CREATE); } diff --git a/concurrent/Pizza.java b/concurrent/Pizza.java new file mode 100644 index 000000000..0eeb21563 --- /dev/null +++ b/concurrent/Pizza.java @@ -0,0 +1,46 @@ +// concurrent/Pizza.java +// (c)2016 MindView LLC: see Copyright.txt +// We make no guarantees that this code is fit for any purpose. +// Visit http://OnJava8.com for more book information. +import static java.util.concurrent.TimeUnit.*; + +public class Pizza { + public enum Step { + DOUGH(4), ROLLED(1), SAUCED(1), CHEESED(2), + TOPPED(5), BAKED(2), SLICED(1), BOXED(0); + int effort; // Needed to get to the next step + Step(int effort) { this.effort = effort; } + Step forward() { + if(equals(BOXED)) return BOXED; + try { + MILLISECONDS.sleep(effort * 100); + } catch(InterruptedException e) { + throw new RuntimeException(e); + } + return values()[ordinal() + 1]; + } + } + private Step step = Step.DOUGH; + private final int id; + public Pizza(int id) { this.id = id; } + public void next() { + step = step.forward(); + System.out.println("Pizza " + id + ": " + step); + } + public void next(Step previousStep) { + if(!step.equals(previousStep)) + throw new IllegalStateException("Expected " + + previousStep + " but found " + step); + next(); + } + public void roll() { next(Step.DOUGH); } + public void sauce() { next(Step.ROLLED); } + public void cheese() { next(Step.SAUCED); } + public void toppings() { next(Step.CHEESED); } + public void bake() { next(Step.TOPPED); } + public void slice() { next(Step.BAKED); } + public void box() { next(Step.SLICED); } + public boolean complete() { + return step.equals(Step.BOXED); + } +} diff --git a/concurrent/PizzaStreams.java b/concurrent/PizzaStreams.java new file mode 100644 index 000000000..d29f7557f --- /dev/null +++ b/concurrent/PizzaStreams.java @@ -0,0 +1,60 @@ +// concurrent/PizzaStreams.java +// (c)2016 MindView LLC: see Copyright.txt +// We make no guarantees that this code is fit for any purpose. +// Visit http://OnJava8.com for more book information. +import java.util.*; +import java.util.stream.*; +import onjava.Timer; + +public class PizzaStreams { + static int QUANTITY = 5; + public static void main(String[] args) { + Timer timer = new Timer(); + IntStream.range(0, QUANTITY) + .mapToObj(Pizza::new) + .parallel() // [1] + .forEach(za -> { + while(!za.complete()) + za.next(); + }); + System.out.println(timer.duration()); + } +} +/* Output: +Pizza 4: ROLLED +Pizza 2: ROLLED +Pizza 0: ROLLED +Pizza 3: ROLLED +Pizza 1: ROLLED +Pizza 0: SAUCED +Pizza 3: SAUCED +Pizza 4: SAUCED +Pizza 1: SAUCED +Pizza 2: SAUCED +Pizza 0: CHEESED +Pizza 4: CHEESED +Pizza 3: CHEESED +Pizza 2: CHEESED +Pizza 1: CHEESED +Pizza 3: TOPPED +Pizza 4: TOPPED +Pizza 0: TOPPED +Pizza 2: TOPPED +Pizza 1: TOPPED +Pizza 0: BAKED +Pizza 3: BAKED +Pizza 4: BAKED +Pizza 1: BAKED +Pizza 2: BAKED +Pizza 4: SLICED +Pizza 3: SLICED +Pizza 0: SLICED +Pizza 2: SLICED +Pizza 1: SLICED +Pizza 3: BOXED +Pizza 4: BOXED +Pizza 0: BOXED +Pizza 1: BOXED +Pizza 2: BOXED +1667 +*/ diff --git a/concurrent/QuittableTask.java b/concurrent/QuittableTask.java new file mode 100644 index 000000000..6d8a535ea --- /dev/null +++ b/concurrent/QuittableTask.java @@ -0,0 +1,24 @@ +// concurrent/QuittableTask.java +// (c)2016 MindView LLC: see Copyright.txt +// We make no guarantees that this code is fit for any purpose. +// Visit http://OnJava8.com for more book information. +import java.util.concurrent.*; +import java.util.concurrent.atomic.AtomicBoolean; + +public class QuittableTask implements Runnable { + final int id; + public QuittableTask(int id) { this.id = id; } + private AtomicBoolean running = + new AtomicBoolean(true); + public void quit() { running.set(false); } + @Override + public void run() { + while(running.get()) // [1] + try { + TimeUnit.MILLISECONDS.sleep(100); + } catch(InterruptedException e) { + throw new RuntimeException(e); + } + System.out.print(id + " "); // [2] + } +} diff --git a/concurrent/QuittingTasks.java b/concurrent/QuittingTasks.java new file mode 100644 index 000000000..fb15aa576 --- /dev/null +++ b/concurrent/QuittingTasks.java @@ -0,0 +1,24 @@ +// concurrent/QuittingTasks.java +// (c)2016 MindView LLC: see Copyright.txt +// We make no guarantees that this code is fit for any purpose. +// Visit http://OnJava8.com for more book information. +import java.util.*; +import java.util.stream.*; +import java.util.concurrent.*; + +public class QuittingTasks { + public static final int COUNT = 150; + public static void main(String[] args) + throws InterruptedException { + ExecutorService es = + Executors.newCachedThreadPool(); + List tasks = + IntStream.range(1, COUNT) + .mapToObj(QuittableTask::new) + .peek(qt -> es.execute(qt)) + .collect(Collectors.toList()); + TimeUnit.SECONDS.sleep(1); + tasks.forEach(QuittableTask::quit); + es.shutdown(); + } +} diff --git a/concurrent/SingleThreadExecutor2.java b/concurrent/SingleThreadExecutor2.java index 2166b9b6f..7c3066b51 100644 --- a/concurrent/SingleThreadExecutor2.java +++ b/concurrent/SingleThreadExecutor2.java @@ -12,7 +12,6 @@ public static void main(String[] args) for(int id = 0; id < 10; id++) exec.execute(new SleepAndPrintTask(id)); exec.shutdown(); - exec.awaitTermination(5, TimeUnit.SECONDS); } } /* Output: diff --git a/concurrent/SingleThreadExecutor3.java b/concurrent/SingleThreadExecutor3.java index c90b9505e..35f373fd2 100644 --- a/concurrent/SingleThreadExecutor3.java +++ b/concurrent/SingleThreadExecutor3.java @@ -12,7 +12,6 @@ public static void main(String[] args) for(int id = 0; id < 10; id++) exec.execute(new InterferingTask(id)); exec.shutdown(); - exec.awaitTermination(5, TimeUnit.SECONDS); } } /* Output: diff --git a/concurrent/Summing.java b/concurrent/Summing.java index 99fc4eb3b..be59c85c3 100644 --- a/concurrent/Summing.java +++ b/concurrent/Summing.java @@ -4,17 +4,17 @@ // Visit http://OnJava8.com for more book information. import java.util.stream.*; import java.util.function.*; +import onjava.Timer; public class Summing { static volatile long x; static void timeTest(String id, long checkValue, LongSupplier operation) { System.out.print(id + ": "); - long t = System.currentTimeMillis(); + Timer timer = new Timer(); long result = operation.getAsLong(); - long duration = System.currentTimeMillis() - t; if(result == checkValue) - System.out.println(duration + "ms"); + System.out.println(timer.duration() + "ms"); else System.out.format("result: %d%ncheckValue: %d%n", result, checkValue); diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 94051b31a..ab0ff321f 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-3.2-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-3.2.1-bin.zip diff --git a/onjava/TimedAbort.java b/onjava/TimedAbort.java index b4be68c16..989515ea1 100644 --- a/onjava/TimedAbort.java +++ b/onjava/TimedAbort.java @@ -8,7 +8,7 @@ public class TimedAbort { public TimedAbort(int n) { - new Timer().schedule(new TimerTask() { + new java.util.Timer().schedule(new TimerTask() { @Override public void run() { System.out.println("TimedAbort " + n); diff --git a/onjava/Timer.java b/onjava/Timer.java new file mode 100644 index 000000000..722f777f3 --- /dev/null +++ b/onjava/Timer.java @@ -0,0 +1,19 @@ +// onjava/Timer.java +// (c)2016 MindView LLC: see Copyright.txt +// We make no guarantees that this code is fit for any purpose. +// Visit http://OnJava8.com for more book information. +package onjava; +import static java.util.concurrent.TimeUnit.*; + +public class Timer { + private long start = System.nanoTime(); + public long duration() { + return NANOSECONDS.toMillis( + System.nanoTime() - start); + } + public static long duration(Runnable test) { + Timer timer = new Timer(); + test.run(); + return timer.duration(); + } +} diff --git a/references/Compete.java b/references/Compete.java index 0d3d96f12..5ec06bcd1 100644 --- a/references/Compete.java +++ b/references/Compete.java @@ -3,6 +3,7 @@ // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.io.*; +import onjava.Timer; class Thing1 implements Serializable {} class Thing2 implements Serializable { @@ -46,7 +47,7 @@ public class Compete { Thing4[] b = new Thing4[SIZE]; for(int i = 0; i < SIZE; i++) b[i] = new Thing4(); - long t1 = System.currentTimeMillis(); + Timer timer = new Timer(); try( ByteArrayOutputStream buf = new ByteArrayOutputStream(); @@ -68,20 +69,18 @@ public class Compete { c[i] = (Thing2)in.readObject(); } } - long t2 = System.currentTimeMillis(); System.out.println( "Duplication via serialization: " + - (t2 - t1) + " Milliseconds"); + timer.duration() + " Milliseconds"); // Now try cloning: - t1 = System.currentTimeMillis(); + timer = new Timer(); Thing4[] d = new Thing4[SIZE]; for(int i = 0; i < SIZE; i++) d[i] = b[i].clone(); - t2 = System.currentTimeMillis(); System.out.println( "Duplication via cloning: " + - (t2 - t1) + " Milliseconds"); + timer.duration() + " Milliseconds"); } } /* Output: diff --git a/validating/BadMicroBenchmark.java b/validating/BadMicroBenchmark.java index 8e67e9471..ba7beb5ef 100644 --- a/validating/BadMicroBenchmark.java +++ b/validating/BadMicroBenchmark.java @@ -3,16 +3,19 @@ // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.*; +import onjava.Timer; public class BadMicroBenchmark { static final int SIZE = 250_000_000; public static void main(String[] args) { try { // For machines with insufficient memory long[] la = new long[SIZE]; - System.out.print("setAll: "); - Time.it(() -> Arrays.setAll(la, n -> n)); - System.out.print("parallelSetAll: "); - Time.it(() -> Arrays.parallelSetAll(la, n -> n)); + System.out.println("setAll: " + + Timer.duration(() -> + Arrays.setAll(la, n -> n))); + System.out.println("parallelSetAll: " + + Timer.duration(() -> + Arrays.parallelSetAll(la, n -> n))); } catch(OutOfMemoryError e) { System.out.println("Insufficient memory"); System.exit(0); diff --git a/validating/BadMicroBenchmark2.java b/validating/BadMicroBenchmark2.java index 3372b3383..b1a535979 100644 --- a/validating/BadMicroBenchmark2.java +++ b/validating/BadMicroBenchmark2.java @@ -4,6 +4,7 @@ // Visit http://OnJava8.com for more book information. // Relying on a common resource import java.util.*; +import onjava.Timer; public class BadMicroBenchmark2 { // SIZE reduced to make it run faster: @@ -11,19 +12,19 @@ public class BadMicroBenchmark2 { public static void main(String[] args) { long[] la = new long[SIZE]; Random r = new Random(); - System.out.print("parallelSetAll: "); - Time.it(() -> - Arrays.parallelSetAll(la, n -> r.nextLong())); - System.out.print("setAll: "); - Time.it(() -> - Arrays.setAll(la, n -> r.nextLong())); + System.out.println("parallelSetAll: " + + Timer.duration(() -> + Arrays.parallelSetAll(la, n -> r.nextLong()))); + System.out.println("setAll: " + + Timer.duration(() -> + Arrays.setAll(la, n -> r.nextLong()))); SplittableRandom sr = new SplittableRandom(); - System.out.print("parallelSetAll: "); - Time.it(() -> - Arrays.parallelSetAll(la, n -> sr.nextLong())); - System.out.print("setAll: "); - Time.it(() -> - Arrays.setAll(la, n -> sr.nextLong())); + System.out.println("parallelSetAll: " + + Timer.duration(() -> + Arrays.parallelSetAll(la, n -> sr.nextLong()))); + System.out.println("setAll: " + + Timer.duration(() -> + Arrays.setAll(la, n -> sr.nextLong()))); } } /* Output: diff --git a/validating/Time.java b/validating/Time.java deleted file mode 100644 index 253bdea83..000000000 --- a/validating/Time.java +++ /dev/null @@ -1,16 +0,0 @@ -// validating/Time.java -// (c)2016 MindView LLC: see Copyright.txt -// We make no guarantees that this code is fit for any purpose. -// Visit http://OnJava8.com for more book information. -import java.util.concurrent.*; - -public interface Time { - static long it(Runnable test) { - long start = System.nanoTime(); - test.run(); - long delta = System.nanoTime() - start; - long millis = TimeUnit.NANOSECONDS.toMillis(delta); - System.out.println(millis); - return millis; - } -} From efd7a797e32348f487810c101e948d51b396d1ab Mon Sep 17 00:00:00 2001 From: Bruce Eckel Date: Wed, 21 Dec 2016 11:06:49 -0800 Subject: [PATCH 168/320] Concurrency chapter progress --- concurrent/CachedThreadPool.java | 29 ++++---- concurrent/CachedThreadPool2.java | 9 +-- concurrent/CompletableApply.java | 21 ++++++ concurrent/CompletableApplyAsync.java | 31 +++++++++ concurrent/CompletableApplyChained.java | 27 ++++++++ concurrent/CompletableOperations.java | 39 +++++++++++ concurrent/CompletablePizza.java | 45 ++++++++++++ concurrent/CompletedMachina.java | 19 +++++ concurrent/DeadlockingDiningPhilosophers.java | 12 ++-- concurrent/DualCompletableOperations.java | 46 +++++++++++++ concurrent/FixedDiningPhilosophers.java | 11 ++- concurrent/Machina.java | 31 +++++++++ concurrent/MoreTasksAfterShutdown.java | 11 ++- .../{SleepAndPrintTask.java => NapTask.java} | 15 ++-- concurrent/Philosopher.java | 7 +- concurrent/Pizza.java | 35 +++++----- concurrent/PizzaParallelSteps.java | 69 +++++++++++++++++++ concurrent/QuittableTask.java | 8 +-- concurrent/QuittingTasks.java | 6 +- concurrent/RandomWork.java | 22 ++++++ concurrent/SingleThreadExecutor.java | 33 +++++---- concurrent/SingleThreadExecutor2.java | 26 +++---- concurrent/SingleThreadExecutor3.java | 6 +- gg.bat | 2 +- housekeeping/TerminationCondition.java | 2 +- lowlevel/CriticalSection.java | 12 +--- lowlevel/HorseRace.java | 8 +-- lowlevel/PriorityBlockingQueueDemo.java | 27 +++----- lowlevel/QuittableTask.java | 8 +-- lowlevel/SerialNumberChecker.java | 6 +- lowlevel/ThreadSize.java | 9 +-- network/tests/MultiTest.java | 3 +- onjava/{Sleep.java => Nap.java} | 10 +-- patterns/state/StateMachineDemo.java | 13 ++-- 34 files changed, 493 insertions(+), 165 deletions(-) create mode 100644 concurrent/CompletableApply.java create mode 100644 concurrent/CompletableApplyAsync.java create mode 100644 concurrent/CompletableApplyChained.java create mode 100644 concurrent/CompletableOperations.java create mode 100644 concurrent/CompletablePizza.java create mode 100644 concurrent/CompletedMachina.java create mode 100644 concurrent/DualCompletableOperations.java create mode 100644 concurrent/Machina.java rename concurrent/{SleepAndPrintTask.java => NapTask.java} (51%) create mode 100644 concurrent/PizzaParallelSteps.java create mode 100644 concurrent/RandomWork.java rename onjava/{Sleep.java => Nap.java} (70%) diff --git a/concurrent/CachedThreadPool.java b/concurrent/CachedThreadPool.java index 1c35c1845..e3ffd669a 100644 --- a/concurrent/CachedThreadPool.java +++ b/concurrent/CachedThreadPool.java @@ -3,26 +3,27 @@ // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.concurrent.*; +import java.util.stream.*; public class CachedThreadPool { - public static void main(String[] args) - throws InterruptedException { + public static void main(String[] args) { ExecutorService exec = Executors.newCachedThreadPool(); - for(int id = 0; id < 10; id++) - exec.execute(new SleepAndPrintTask(id)); + IntStream.range(0, 10) + .mapToObj(NapTask::new) + .forEach(exec::execute); exec.shutdown(); } } /* Output: -SleepAndPrintTask[2] pool-1-thread-3 -SleepAndPrintTask[9] pool-1-thread-10 -SleepAndPrintTask[6] pool-1-thread-7 -SleepAndPrintTask[5] pool-1-thread-6 -SleepAndPrintTask[7] pool-1-thread-8 -SleepAndPrintTask[8] pool-1-thread-9 -SleepAndPrintTask[0] pool-1-thread-1 -SleepAndPrintTask[1] pool-1-thread-2 -SleepAndPrintTask[4] pool-1-thread-5 -SleepAndPrintTask[3] pool-1-thread-4 +NapTask[2] pool-1-thread-3 +NapTask[9] pool-1-thread-10 +NapTask[6] pool-1-thread-7 +NapTask[5] pool-1-thread-6 +NapTask[7] pool-1-thread-8 +NapTask[8] pool-1-thread-9 +NapTask[0] pool-1-thread-1 +NapTask[1] pool-1-thread-2 +NapTask[4] pool-1-thread-5 +NapTask[3] pool-1-thread-4 */ diff --git a/concurrent/CachedThreadPool2.java b/concurrent/CachedThreadPool2.java index 55119ce91..046ab901a 100644 --- a/concurrent/CachedThreadPool2.java +++ b/concurrent/CachedThreadPool2.java @@ -3,14 +3,15 @@ // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.concurrent.*; +import java.util.stream.*; public class CachedThreadPool2 { - public static void main(String[] args) - throws InterruptedException { + public static void main(String[] args) { ExecutorService exec = Executors.newCachedThreadPool(); - for(int id = 0; id < 10; id++) - exec.execute(new InterferingTask(id)); + IntStream.range(0, 10) + .mapToObj(InterferingTask::new) + .forEach(exec::execute); exec.shutdown(); } } diff --git a/concurrent/CompletableApply.java b/concurrent/CompletableApply.java new file mode 100644 index 000000000..504d4e2c1 --- /dev/null +++ b/concurrent/CompletableApply.java @@ -0,0 +1,21 @@ +// concurrent/CompletableApply.java +// (c)2016 MindView LLC: see Copyright.txt +// We make no guarantees that this code is fit for any purpose. +// Visit http://OnJava8.com for more book information. +import java.util.concurrent.*; + +public class CompletableApply { + public static void main(String[] args) { + CompletableFuture cf = + CompletableFuture.completedFuture( + new Machina(0)); + CompletableFuture cf2 = + cf.thenApply(Machina::work); + CompletableFuture cf3 = + cf2.thenApply(Machina::work); + CompletableFuture cf4 = + cf3.thenApply(Machina::work); + CompletableFuture cf5 = + cf4.thenApply(Machina::work); + } +} diff --git a/concurrent/CompletableApplyAsync.java b/concurrent/CompletableApplyAsync.java new file mode 100644 index 000000000..8ae6e0e0f --- /dev/null +++ b/concurrent/CompletableApplyAsync.java @@ -0,0 +1,31 @@ +// concurrent/CompletableApplyAsync.java +// (c)2016 MindView LLC: see Copyright.txt +// We make no guarantees that this code is fit for any purpose. +// Visit http://OnJava8.com for more book information. +import java.util.concurrent.*; +import onjava.*; + +public class CompletableApplyAsync { + public static void main(String[] args) { + Timer timer = new Timer(); + CompletableFuture cf = + CompletableFuture.completedFuture( + new Machina(0)) + .thenApplyAsync(Machina::work) + .thenApplyAsync(Machina::work) + .thenApplyAsync(Machina::work) + .thenApplyAsync(Machina::work); + System.out.println(timer.duration()); + System.out.println(cf.join()); + System.out.println(timer.duration()); + } +} +/* Output: +50 +Machina0: ONE +Machina0: TWO +Machina0: THREE +Machina0: complete +Machina0: complete +462 +*/ diff --git a/concurrent/CompletableApplyChained.java b/concurrent/CompletableApplyChained.java new file mode 100644 index 000000000..82ae3ef73 --- /dev/null +++ b/concurrent/CompletableApplyChained.java @@ -0,0 +1,27 @@ +// concurrent/CompletableApplyChained.java +// (c)2016 MindView LLC: see Copyright.txt +// We make no guarantees that this code is fit for any purpose. +// Visit http://OnJava8.com for more book information. +import java.util.concurrent.*; +import onjava.Timer; + +public class CompletableApplyChained { + public static void main(String[] args) { + Timer timer = new Timer(); + CompletableFuture cf = + CompletableFuture.completedFuture( + new Machina(0)) + .thenApply(Machina::work) + .thenApply(Machina::work) + .thenApply(Machina::work) + .thenApply(Machina::work); + System.out.println(timer.duration()); + } +} +/* Output: +Machina0: ONE +Machina0: TWO +Machina0: THREE +Machina0: complete +460 +*/ diff --git a/concurrent/CompletableOperations.java b/concurrent/CompletableOperations.java new file mode 100644 index 000000000..ada4a2f10 --- /dev/null +++ b/concurrent/CompletableOperations.java @@ -0,0 +1,39 @@ +// concurrent/CompletableOperations.java +// (c)2016 MindView LLC: see Copyright.txt +// We make no guarantees that this code is fit for any purpose. +// Visit http://OnJava8.com for more book information. +import java.util.concurrent.*; + +public class CompletableOperations { + static CompletableFuture cfi() { + return + CompletableFuture.completedFuture( + new Integer(1)); + } + // Get and show value stored in a CF: + static void showr(CompletableFuture c) { + try { + System.out.println(c.get()); + } catch(InterruptedException + | ExecutionException e) { + throw new RuntimeException(e); + } + } + // For CF operations that have no value: + static void voidr(CompletableFuture c) { + try { + c.get(); // Returns void + } catch(InterruptedException + | ExecutionException e) { + throw new RuntimeException(e); + } + } + public static void main(String[] args) { + showr(cfi()); // Basic test + showr(cfi().thenApplyAsync(i -> i + 42)); + voidr(cfi().runAsync(() -> System.out.println("run"))); + CompletableFuture c = cfi(); + c.obtrudeValue(111); + showr(c); + } +} diff --git a/concurrent/CompletablePizza.java b/concurrent/CompletablePizza.java new file mode 100644 index 000000000..48b678fa7 --- /dev/null +++ b/concurrent/CompletablePizza.java @@ -0,0 +1,45 @@ +// concurrent/CompletablePizza.java +// (c)2016 MindView LLC: see Copyright.txt +// We make no guarantees that this code is fit for any purpose. +// Visit http://OnJava8.com for more book information. +import java.util.*; +import java.util.concurrent.*; +import java.util.stream.*; +import onjava.Timer; + +public class CompletablePizza { + static int QUANTITY = 5; + public static CompletableFuture + makeCF(Pizza za) { + return CompletableFuture + .completedFuture(za) + .thenApplyAsync(Pizza::roll) + .thenApplyAsync(Pizza::sauce) + .thenApplyAsync(Pizza::cheese) + .thenApplyAsync(Pizza::toppings) + .thenApplyAsync(Pizza::bake) + .thenApplyAsync(Pizza::slice) + .thenApplyAsync(Pizza::box); + } + public static void + show(CompletableFuture cf) { + try { + System.out.println(cf.get()); + } catch(Exception e) { + throw new RuntimeException(e); + } + } + public static void main(String[] args) { + Timer timer = new Timer(); + List> pizzas = + IntStream.range(0, QUANTITY) + .mapToObj(Pizza::new) + .map(CompletablePizza::makeCF) + .collect(Collectors.toList()); + System.out.println(timer.duration()); + pizzas.forEach(CompletablePizza::show); + System.out.println(timer.duration()); + } +} +/* Output: +*/ diff --git a/concurrent/CompletedMachina.java b/concurrent/CompletedMachina.java new file mode 100644 index 000000000..f737da746 --- /dev/null +++ b/concurrent/CompletedMachina.java @@ -0,0 +1,19 @@ +// concurrent/CompletedMachina.java +// (c)2016 MindView LLC: see Copyright.txt +// We make no guarantees that this code is fit for any purpose. +// Visit http://OnJava8.com for more book information. +import java.util.concurrent.*; + +public class CompletedMachina { + public static void main(String[] args) { + CompletableFuture cf = + CompletableFuture.completedFuture( + new Machina(0)); + try { + Machina m = cf.get(); // Doesn't block + } catch(InterruptedException | + ExecutionException e) { + throw new RuntimeException(e); + } + } +} diff --git a/concurrent/DeadlockingDiningPhilosophers.java b/concurrent/DeadlockingDiningPhilosophers.java index 69224c0e1..1870a7452 100644 --- a/concurrent/DeadlockingDiningPhilosophers.java +++ b/concurrent/DeadlockingDiningPhilosophers.java @@ -5,10 +5,10 @@ // Demonstrates how deadlock can be hidden in a program // {java DeadlockingDiningPhilosophers 0 5 timeout} import java.util.concurrent.*; +import onjava.Nap; public class DeadlockingDiningPhilosophers { - public static void - main(String[] args) throws Exception { + public static void main(String[] args) { int ponder = 5; if(args.length > 0) ponder = Integer.parseInt(args[0]); @@ -23,10 +23,14 @@ public class DeadlockingDiningPhilosophers { es.execute(new Philosopher( sticks[i], sticks[(i+1) % size], i, ponder)); if(args.length == 3 && args[2].equals("timeout")) - TimeUnit.SECONDS.sleep(5); + new Nap(5000); else { System.out.println("Press 'Enter' to quit"); - System.in.read(); + try { + System.in.read(); + } catch(Exception e) { + throw new RuntimeException(e); + } } es.shutdownNow(); } diff --git a/concurrent/DualCompletableOperations.java b/concurrent/DualCompletableOperations.java new file mode 100644 index 000000000..4fdefedd8 --- /dev/null +++ b/concurrent/DualCompletableOperations.java @@ -0,0 +1,46 @@ +// concurrent/DualCompletableOperations.java +// (c)2016 MindView LLC: see Copyright.txt +// We make no guarantees that this code is fit for any purpose. +// Visit http://OnJava8.com for more book information. +import java.util.concurrent.*; + +public class DualCompletableOperations { + static + CompletableFuture makeCF(int id) { + return + CompletableFuture.completedFuture( + new RandomWork(id)) + .thenApplyAsync(RandomWork::work); + } + static CompletableFuture cfA, cfB; + static int count = 0; + static void init() { + cfA = makeCF(count++); + cfB = makeCF(count++); + } + static void join() { + cfA.join(); + cfB.join(); + } + public static void main(String[] args) { + init(); + cfA.runAfterBothAsync(cfB, () -> + System.out.println("Completed Both")); + join(); + + init(); + cfA.runAfterEitherAsync(cfB, () -> + System.out.println("Completed Either")); + join(); + + init(); + cfA.applyToEitherAsync(cfB, rw -> { + System.out.println("applyToEither: " + rw); + return rw; + }); + join(); + + } +} +/* Output: +*/ diff --git a/concurrent/FixedDiningPhilosophers.java b/concurrent/FixedDiningPhilosophers.java index e3a6745be..7d2cb8997 100644 --- a/concurrent/FixedDiningPhilosophers.java +++ b/concurrent/FixedDiningPhilosophers.java @@ -5,10 +5,11 @@ // Dining philosophers without deadlock // {java FixedDiningPhilosophers 5 5 timeout} import java.util.concurrent.*; +import onjava.Nap; public class FixedDiningPhilosophers { public static void - main(String[] args) throws Exception { + main(String[] args) { int ponder = 5; if(args.length > 0) ponder = Integer.parseInt(args[0]); @@ -27,10 +28,14 @@ public class FixedDiningPhilosophers { es.execute(new Philosopher( sticks[0], sticks[i], i, ponder)); if(args.length == 3 && args[2].equals("timeout")) - TimeUnit.SECONDS.sleep(5); + new Nap(5000); else { System.out.println("Press 'Enter' to quit"); - System.in.read(); + try { + System.in.read(); + } catch(Exception e) { + throw new RuntimeException(e); + } } es.shutdownNow(); } diff --git a/concurrent/Machina.java b/concurrent/Machina.java new file mode 100644 index 000000000..716d13932 --- /dev/null +++ b/concurrent/Machina.java @@ -0,0 +1,31 @@ +// concurrent/Machina.java +// (c)2016 MindView LLC: see Copyright.txt +// We make no guarantees that this code is fit for any purpose. +// Visit http://OnJava8.com for more book information. +import onjava.Nap; + +public class Machina { + public enum State { + START, ONE, TWO, THREE, END; + State step() { + if(equals(END)) return END; + return values()[ordinal() + 1]; + } + } + private State state = State.START; + private final int id; + public Machina(int id) { this.id = id; } + public static Machina work(Machina m) { + if(!m.state.equals(State.END)){ + new Nap(100); + m.state = m.state.step(); + } + System.out.println(m); + return m; + } + @Override + public String toString() { + return "Machina" + id + ": " + + (state.equals(State.END)? "complete" : state); + } +} diff --git a/concurrent/MoreTasksAfterShutdown.java b/concurrent/MoreTasksAfterShutdown.java index 15ca9a6d2..756f0d48a 100644 --- a/concurrent/MoreTasksAfterShutdown.java +++ b/concurrent/MoreTasksAfterShutdown.java @@ -5,14 +5,13 @@ import java.util.concurrent.*; public class MoreTasksAfterShutdown { - public static void main(String[] args) - throws InterruptedException { + public static void main(String[] args) { ExecutorService exec = Executors.newSingleThreadExecutor(); - exec.execute(new SleepAndPrintTask(1)); + exec.execute(new NapTask(1)); exec.shutdown(); try { - exec.execute(new SleepAndPrintTask(99)); + exec.execute(new NapTask(99)); } catch(RejectedExecutionException e) { System.out.println(e); } @@ -20,9 +19,9 @@ public static void main(String[] args) } /* Output: java.util.concurrent.RejectedExecutionException: Task -SleepAndPrintTask[99] rejected from +NapTask[99] rejected from java.util.concurrent.ThreadPoolExecutor@25154f[Shutting down, pool size = 1, active threads = 1, queued tasks = 0, completed tasks = 0] -SleepAndPrintTask[1] pool-1-thread-1 +NapTask[1] pool-1-thread-1 */ diff --git a/concurrent/SleepAndPrintTask.java b/concurrent/NapTask.java similarity index 51% rename from concurrent/SleepAndPrintTask.java rename to concurrent/NapTask.java index 421d3f803..8f59771a3 100644 --- a/concurrent/SleepAndPrintTask.java +++ b/concurrent/NapTask.java @@ -1,23 +1,20 @@ -// concurrent/SleepAndPrintTask.java +// concurrent/NapTask.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. +import onjava.Nap; -public class SleepAndPrintTask implements Runnable { +public class NapTask implements Runnable { final int id; - public SleepAndPrintTask(int id) { this.id = id; } + public NapTask(int id) { this.id = id; } @Override public void run() { - try { - Thread.sleep(100); // Milliseconds - } catch(InterruptedException e) { - throw new RuntimeException(e); - } + new Nap(100); // Milliseconds System.out.println(this + " " + Thread.currentThread().getName()); } @Override public String toString() { - return "SleepAndPrintTask[" + id + "]"; + return "NapTask[" + id + "]"; } } diff --git a/concurrent/Philosopher.java b/concurrent/Philosopher.java index c5bc8d39d..4b00bb59b 100644 --- a/concurrent/Philosopher.java +++ b/concurrent/Philosopher.java @@ -3,8 +3,8 @@ // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // A dining philosopher -import java.util.concurrent.*; import java.util.*; +import onjava.Nap; public class Philosopher implements Runnable { private Chopstick left; @@ -12,10 +12,9 @@ public class Philosopher implements Runnable { private final int id; private final int ponderFactor; private SplittableRandom rand = new SplittableRandom(47); - private void pause() throws InterruptedException { + private void pause() { if(ponderFactor == 0) return; - TimeUnit.MILLISECONDS.sleep( - rand.nextInt(ponderFactor * 250)); + new Nap(rand.nextInt(ponderFactor * 250)); } public Philosopher(Chopstick left, Chopstick right, int ident, int ponder) { diff --git a/concurrent/Pizza.java b/concurrent/Pizza.java index 0eeb21563..40c34a278 100644 --- a/concurrent/Pizza.java +++ b/concurrent/Pizza.java @@ -2,7 +2,8 @@ // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. -import static java.util.concurrent.TimeUnit.*; +import java.util.function.*; +import onjava.Nap; public class Pizza { public enum Step { @@ -12,35 +13,37 @@ public enum Step { Step(int effort) { this.effort = effort; } Step forward() { if(equals(BOXED)) return BOXED; - try { - MILLISECONDS.sleep(effort * 100); - } catch(InterruptedException e) { - throw new RuntimeException(e); - } + new Nap(effort * 100); return values()[ordinal() + 1]; } } private Step step = Step.DOUGH; private final int id; public Pizza(int id) { this.id = id; } - public void next() { + public Pizza next() { step = step.forward(); System.out.println("Pizza " + id + ": " + step); + return this; } - public void next(Step previousStep) { + public Pizza next(Step previousStep) { if(!step.equals(previousStep)) throw new IllegalStateException("Expected " + previousStep + " but found " + step); - next(); + return next(); } - public void roll() { next(Step.DOUGH); } - public void sauce() { next(Step.ROLLED); } - public void cheese() { next(Step.SAUCED); } - public void toppings() { next(Step.CHEESED); } - public void bake() { next(Step.TOPPED); } - public void slice() { next(Step.BAKED); } - public void box() { next(Step.SLICED); } + public Pizza roll() { return next(Step.DOUGH); } + public Pizza sauce() { return next(Step.ROLLED); } + public Pizza cheese() { return next(Step.SAUCED); } + public Pizza toppings() { return next(Step.CHEESED); } + public Pizza bake() { return next(Step.TOPPED); } + public Pizza slice() { return next(Step.BAKED); } + public Pizza box() { return next(Step.SLICED); } public boolean complete() { return step.equals(Step.BOXED); } + @Override + public String toString() { + return "Pizza" + id + ": " + + (step.equals(Step.BOXED)? "complete" : step); + } } diff --git a/concurrent/PizzaParallelSteps.java b/concurrent/PizzaParallelSteps.java new file mode 100644 index 000000000..fbce9054b --- /dev/null +++ b/concurrent/PizzaParallelSteps.java @@ -0,0 +1,69 @@ +// concurrent/PizzaParallelSteps.java +// (c)2016 MindView LLC: see Copyright.txt +// We make no guarantees that this code is fit for any purpose. +// Visit http://OnJava8.com for more book information. +import java.util.*; +import java.util.stream.*; +import onjava.Timer; + +public class PizzaParallelSteps { + static int QUANTITY = 5; + public static void main(String[] args) { + Timer timer = new Timer(); + IntStream.range(0, QUANTITY) + .mapToObj(Pizza::new) + .parallel() + .map(Pizza::roll) + .map(Pizza::sauce) + .map(Pizza::cheese) + .map(Pizza::toppings) + .map(Pizza::bake) + .map(Pizza::slice) + .map(Pizza::box) + .forEach(za -> System.out.println(za)); + System.out.println(timer.duration()); + } +} +/* Output: +Pizza 4: ROLLED +Pizza 1: ROLLED +Pizza 3: ROLLED +Pizza 0: ROLLED +Pizza 2: ROLLED +Pizza 4: SAUCED +Pizza 3: SAUCED +Pizza 1: SAUCED +Pizza 2: SAUCED +Pizza 0: SAUCED +Pizza 4: CHEESED +Pizza 1: CHEESED +Pizza 3: CHEESED +Pizza 0: CHEESED +Pizza 2: CHEESED +Pizza 1: TOPPED +Pizza 3: TOPPED +Pizza 4: TOPPED +Pizza 2: TOPPED +Pizza 0: TOPPED +Pizza 1: BAKED +Pizza 3: BAKED +Pizza 4: BAKED +Pizza 2: BAKED +Pizza 0: BAKED +Pizza 1: SLICED +Pizza 3: SLICED +Pizza 2: SLICED +Pizza 4: SLICED +Pizza 0: SLICED +Pizza 1: BOXED +Pizza 3: BOXED +Pizza3: complete +Pizza 4: BOXED +Pizza4: complete +Pizza1: complete +Pizza 0: BOXED +Pizza 2: BOXED +Pizza2: complete +Pizza0: complete +1673 +*/ diff --git a/concurrent/QuittableTask.java b/concurrent/QuittableTask.java index 6d8a535ea..b459704f8 100644 --- a/concurrent/QuittableTask.java +++ b/concurrent/QuittableTask.java @@ -2,8 +2,8 @@ // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. -import java.util.concurrent.*; import java.util.concurrent.atomic.AtomicBoolean; +import onjava.Nap; public class QuittableTask implements Runnable { final int id; @@ -14,11 +14,7 @@ public class QuittableTask implements Runnable { @Override public void run() { while(running.get()) // [1] - try { - TimeUnit.MILLISECONDS.sleep(100); - } catch(InterruptedException e) { - throw new RuntimeException(e); - } + new Nap(100); System.out.print(id + " "); // [2] } } diff --git a/concurrent/QuittingTasks.java b/concurrent/QuittingTasks.java index fb15aa576..1f74c93d2 100644 --- a/concurrent/QuittingTasks.java +++ b/concurrent/QuittingTasks.java @@ -5,11 +5,11 @@ import java.util.*; import java.util.stream.*; import java.util.concurrent.*; +import onjava.Nap; public class QuittingTasks { public static final int COUNT = 150; - public static void main(String[] args) - throws InterruptedException { + public static void main(String[] args) { ExecutorService es = Executors.newCachedThreadPool(); List tasks = @@ -17,7 +17,7 @@ public static void main(String[] args) .mapToObj(QuittableTask::new) .peek(qt -> es.execute(qt)) .collect(Collectors.toList()); - TimeUnit.SECONDS.sleep(1); + new Nap(1000); tasks.forEach(QuittableTask::quit); es.shutdown(); } diff --git a/concurrent/RandomWork.java b/concurrent/RandomWork.java new file mode 100644 index 000000000..f09922ccd --- /dev/null +++ b/concurrent/RandomWork.java @@ -0,0 +1,22 @@ +// concurrent/RandomWork.java +// (c)2016 MindView LLC: see Copyright.txt +// We make no guarantees that this code is fit for any purpose. +// Visit http://OnJava8.com for more book information. +import java.util.*; +import onjava.Nap; + +public class RandomWork { + private static SplittableRandom rand = + new SplittableRandom(47); + private final int id; + public RandomWork(int id) { this.id = id; } + public static RandomWork work(RandomWork r) { + new Nap(rand.nextInt(250)); + System.out.println(r); + return r; + } + @Override + public String toString() { + return "RandomWork " + id; + } +} diff --git a/concurrent/SingleThreadExecutor.java b/concurrent/SingleThreadExecutor.java index 705e79325..f1bc83fa6 100644 --- a/concurrent/SingleThreadExecutor.java +++ b/concurrent/SingleThreadExecutor.java @@ -3,47 +3,46 @@ // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.concurrent.*; +import java.util.stream.*; +import onjava.*; public class SingleThreadExecutor { public static void main(String[] args) { ExecutorService exec = Executors.newSingleThreadExecutor(); - for(int id = 0; id < 10; id++) - exec.execute(new SleepAndPrintTask(id)); + IntStream.range(0, 10) + .mapToObj(NapTask::new) + .forEach(exec::execute); System.out.println("All tasks submitted"); exec.shutdown(); while(!exec.isTerminated()) { System.out.println( Thread.currentThread().getName() + " awaiting termination"); - try { - Thread.sleep(100); - } catch(InterruptedException e) { - throw new RuntimeException(e); - } + new Nap(100); } } } /* Output: All tasks submitted main awaiting termination -SleepAndPrintTask[0] pool-1-thread-1 +NapTask[0] pool-1-thread-1 main awaiting termination -SleepAndPrintTask[1] pool-1-thread-1 +NapTask[1] pool-1-thread-1 main awaiting termination -SleepAndPrintTask[2] pool-1-thread-1 +NapTask[2] pool-1-thread-1 main awaiting termination -SleepAndPrintTask[3] pool-1-thread-1 +NapTask[3] pool-1-thread-1 main awaiting termination -SleepAndPrintTask[4] pool-1-thread-1 +NapTask[4] pool-1-thread-1 main awaiting termination -SleepAndPrintTask[5] pool-1-thread-1 +NapTask[5] pool-1-thread-1 main awaiting termination -SleepAndPrintTask[6] pool-1-thread-1 +NapTask[6] pool-1-thread-1 main awaiting termination -SleepAndPrintTask[7] pool-1-thread-1 +NapTask[7] pool-1-thread-1 main awaiting termination -SleepAndPrintTask[8] pool-1-thread-1 +NapTask[8] pool-1-thread-1 main awaiting termination -SleepAndPrintTask[9] pool-1-thread-1 +NapTask[9] pool-1-thread-1 */ diff --git a/concurrent/SingleThreadExecutor2.java b/concurrent/SingleThreadExecutor2.java index 7c3066b51..9993ce6f0 100644 --- a/concurrent/SingleThreadExecutor2.java +++ b/concurrent/SingleThreadExecutor2.java @@ -3,26 +3,28 @@ // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.concurrent.*; +import java.util.stream.*; public class SingleThreadExecutor2 { public static void main(String[] args) throws InterruptedException { ExecutorService exec = Executors.newSingleThreadExecutor(); - for(int id = 0; id < 10; id++) - exec.execute(new SleepAndPrintTask(id)); + IntStream.range(0, 10) + .mapToObj(NapTask::new) + .forEach(exec::execute); exec.shutdown(); } } /* Output: -SleepAndPrintTask[0] pool-1-thread-1 -SleepAndPrintTask[1] pool-1-thread-1 -SleepAndPrintTask[2] pool-1-thread-1 -SleepAndPrintTask[3] pool-1-thread-1 -SleepAndPrintTask[4] pool-1-thread-1 -SleepAndPrintTask[5] pool-1-thread-1 -SleepAndPrintTask[6] pool-1-thread-1 -SleepAndPrintTask[7] pool-1-thread-1 -SleepAndPrintTask[8] pool-1-thread-1 -SleepAndPrintTask[9] pool-1-thread-1 +NapTask[0] pool-1-thread-1 +NapTask[1] pool-1-thread-1 +NapTask[2] pool-1-thread-1 +NapTask[3] pool-1-thread-1 +NapTask[4] pool-1-thread-1 +NapTask[5] pool-1-thread-1 +NapTask[6] pool-1-thread-1 +NapTask[7] pool-1-thread-1 +NapTask[8] pool-1-thread-1 +NapTask[9] pool-1-thread-1 */ diff --git a/concurrent/SingleThreadExecutor3.java b/concurrent/SingleThreadExecutor3.java index 35f373fd2..ffbbca440 100644 --- a/concurrent/SingleThreadExecutor3.java +++ b/concurrent/SingleThreadExecutor3.java @@ -3,14 +3,16 @@ // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.concurrent.*; +import java.util.stream.*; public class SingleThreadExecutor3 { public static void main(String[] args) throws InterruptedException { ExecutorService exec = Executors.newSingleThreadExecutor(); - for(int id = 0; id < 10; id++) - exec.execute(new InterferingTask(id)); + IntStream.range(0, 10) + .mapToObj(InterferingTask::new) + .forEach(exec::execute); exec.shutdown(); } } diff --git a/gg.bat b/gg.bat index af92dd6e0..174efa64c 100644 --- a/gg.bat +++ b/gg.bat @@ -1 +1 @@ -gradlew %* +gradlew --console plain %* diff --git a/housekeeping/TerminationCondition.java b/housekeeping/TerminationCondition.java index 4a316c3f0..29fb518c1 100644 --- a/housekeeping/TerminationCondition.java +++ b/housekeeping/TerminationCondition.java @@ -32,7 +32,7 @@ public static void main(String[] args) { new Book(true); // Force garbage collection & finalization: System.gc(); - new Sleep(1); // Delay + new Nap(1000); // Delay } } /* Output: diff --git a/lowlevel/CriticalSection.java b/lowlevel/CriticalSection.java index a88c46ba3..6e187938f 100644 --- a/lowlevel/CriticalSection.java +++ b/lowlevel/CriticalSection.java @@ -11,7 +11,7 @@ import java.util.concurrent.*; import java.util.concurrent.atomic.*; import java.util.*; -import onjava.TimedAbort; +import onjava.*; class Pair { // Not thread-safe private int x, y; @@ -54,9 +54,7 @@ public synchronized Pair getPair() { // Assume this is a time consuming operation protected void store(Pair p) { storage.add(p); - try { - TimeUnit.MILLISECONDS.sleep(50); - } catch(InterruptedException ignore) {} + new Nap(50); } public abstract void increment(); } @@ -131,11 +129,7 @@ public class CriticalSection { es.execute(pm2); es.execute(pcheck1); es.execute(pcheck2); - try { - TimeUnit.MILLISECONDS.sleep(500); - } catch(InterruptedException e) { - System.out.println("Sleep interrupted"); - } + new Nap(500); System.out.println("pm1: " + pm1 + "\npm2: " + pm2); System.exit(0); } diff --git a/lowlevel/HorseRace.java b/lowlevel/HorseRace.java index 2f95336e0..27dcfc162 100644 --- a/lowlevel/HorseRace.java +++ b/lowlevel/HorseRace.java @@ -5,6 +5,7 @@ // Using CyclicBarriers import java.util.concurrent.*; import java.util.*; +import onjava.Nap; class Horse implements Runnable { private static int counter = 0; @@ -61,12 +62,7 @@ public HorseRace(int nHorses, final int pause) { exec.shutdownNow(); return; } - try { - TimeUnit.MILLISECONDS.sleep(pause); - } catch(InterruptedException e) { - System.out.println( - "barrier-action sleep interrupted"); - } + new Nap(pause); }); for(int i = 0; i < nHorses; i++) { Horse horse = new Horse(barrier); diff --git a/lowlevel/PriorityBlockingQueueDemo.java b/lowlevel/PriorityBlockingQueueDemo.java index d7f8648ef..9955bd9cc 100644 --- a/lowlevel/PriorityBlockingQueueDemo.java +++ b/lowlevel/PriorityBlockingQueueDemo.java @@ -4,6 +4,7 @@ // Visit http://OnJava8.com for more book information. import java.util.concurrent.*; import java.util.*; +import onjava.Nap; class PrioritizedTask implements Runnable, Comparable { @@ -24,11 +25,7 @@ public int compareTo(PrioritizedTask arg) { } @Override public void run() { - try { - TimeUnit.MILLISECONDS.sleep(rand.nextInt(250)); - } catch(InterruptedException e) { - // Acceptable way to exit - } + new Nap(rand.nextInt(250)); System.out.println(this); } @Override @@ -79,19 +76,15 @@ public void run() { Thread.yield(); } // Trickle in highest-priority jobs: - try { - for(int i = 0; i < 10; i++) { - TimeUnit.MILLISECONDS.sleep(250); - queue.add(new PrioritizedTask(10)); - } - // Add jobs, lowest priority first: - for(int i = 0; i < 10; i++) - queue.add(new PrioritizedTask(i)); - // A sentinel to stop all the tasks: - queue.add(new PrioritizedTask.EndSentinel(exec)); - } catch(InterruptedException e) { - // Acceptable way to exit + for(int i = 0; i < 10; i++) { + new Nap(250); + queue.add(new PrioritizedTask(10)); } + // Add jobs, lowest priority first: + for(int i = 0; i < 10; i++) + queue.add(new PrioritizedTask(i)); + // A sentinel to stop all the tasks: + queue.add(new PrioritizedTask.EndSentinel(exec)); System.out.println( "Finished PrioritizedTaskProducer"); } diff --git a/lowlevel/QuittableTask.java b/lowlevel/QuittableTask.java index b671bdafc..c42fffe47 100644 --- a/lowlevel/QuittableTask.java +++ b/lowlevel/QuittableTask.java @@ -2,7 +2,7 @@ // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. -import java.util.concurrent.*; +import onjava.Nap; public class QuittableTask implements Runnable { private boolean running = true; @@ -11,10 +11,6 @@ public class QuittableTask implements Runnable { @Override public void run() { while(running) - try { - TimeUnit.MILLISECONDS.sleep(100); - } catch(InterruptedException e) { - throw new RuntimeException(e); - } + new Nap(100); } } diff --git a/lowlevel/SerialNumberChecker.java b/lowlevel/SerialNumberChecker.java index b269e9ece..aa2c3a6d5 100644 --- a/lowlevel/SerialNumberChecker.java +++ b/lowlevel/SerialNumberChecker.java @@ -6,6 +6,7 @@ // when threads are present // {java SerialNumberChecker 4} import java.util.concurrent.*; +import onjava.Nap; // Reuses storage so we don't run out of memory: class CircularSet { @@ -52,13 +53,12 @@ public void run() { } } } - public static void - main(String[] args) throws Exception { + public static void main(String[] args) { for(int i = 0; i < SIZE; i++) exec.execute(new SerialChecker()); // Stop after n seconds if there's an argument: if(args.length > 0) { - TimeUnit.SECONDS.sleep(new Integer(args[0])); + new Nap(new Integer(args[0]) * 1000); System.out.println("No duplicates detected"); System.exit(0); } diff --git a/lowlevel/ThreadSize.java b/lowlevel/ThreadSize.java index c726fcca7..8a2f9aa56 100644 --- a/lowlevel/ThreadSize.java +++ b/lowlevel/ThreadSize.java @@ -4,17 +4,12 @@ // Visit http://OnJava8.com for more book information. // {ValidateByHand} import java.util.concurrent.*; +import onjava.Nap; public class ThreadSize { static class Dummy extends Thread { @Override - public void run() { - try { - Thread.sleep(1000); - } catch(Exception e) { - throw new RuntimeException(e); - } - } + public void run() { new Nap(1000); } } public static void main(String[] args) { ExecutorService exec = diff --git a/network/tests/MultiTest.java b/network/tests/MultiTest.java index bb0ec1e03..54b5ea06f 100644 --- a/network/tests/MultiTest.java +++ b/network/tests/MultiTest.java @@ -4,6 +4,7 @@ // Visit http://OnJava8.com for more book information. package network; import java.net.*; +import java.util.concurrent.*; import org.junit.jupiter.api.*; public class MultiTest { @@ -19,7 +20,7 @@ void multiTest() throws Exception { while(true) { if(SimpleClient2.threadCount() < MAX_THREADS) new SimpleClient2(address); - Thread.sleep(100); + TimeUnit.MILLISECONDS.sleep(100); } // No exceptions mean success } diff --git a/onjava/Sleep.java b/onjava/Nap.java similarity index 70% rename from onjava/Sleep.java rename to onjava/Nap.java index b3c042135..a25bc2f80 100644 --- a/onjava/Sleep.java +++ b/onjava/Nap.java @@ -1,15 +1,15 @@ -// onjava/Sleep.java +// onjava/Nap.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. -// Sleep for n seconds +// Sleep for n milliseconds package onjava; import java.util.concurrent.*; -public class Sleep { - public Sleep(int n) { +public class Nap { + public Nap(int n) { try { - TimeUnit.SECONDS.sleep(n); + TimeUnit.MILLISECONDS.sleep(n); } catch(InterruptedException e) { throw new RuntimeException(e); } diff --git a/patterns/state/StateMachineDemo.java b/patterns/state/StateMachineDemo.java index 51a5f66f4..c7af6c273 100644 --- a/patterns/state/StateMachineDemo.java +++ b/patterns/state/StateMachineDemo.java @@ -5,6 +5,7 @@ // The StateMachine pattern and Template method // {java patterns.state.StateMachineDemo} package patterns.state; +import onjava.Nap; interface State { void run(); @@ -26,9 +27,7 @@ class Wash implements State { @Override public void run() { System.out.println("Washing"); - try { - Thread.sleep(500); - } catch(InterruptedException e) {} + new Nap(500); } } @@ -36,9 +35,7 @@ class Spin implements State { @Override public void run() { System.out.println("Spinning"); - try { - Thread.sleep(500); - } catch(InterruptedException e) {} + new Nap(500); } } @@ -46,9 +43,7 @@ class Rinse implements State { @Override public void run() { System.out.println("Rinsing"); - try { - Thread.sleep(500); - } catch(InterruptedException e) {} + new Nap(500); } } From a38bccec06decfbd8b7ca3c13aa05cdeb1d3f6b4 Mon Sep 17 00:00:00 2001 From: Bruce Eckel Date: Wed, 21 Dec 2016 11:07:03 -0800 Subject: [PATCH 169/320] Junit bugfix --- gradle/junit-jupiter.gradle | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/gradle/junit-jupiter.gradle b/gradle/junit-jupiter.gradle index 124c85f55..596707058 100644 --- a/gradle/junit-jupiter.gradle +++ b/gradle/junit-jupiter.gradle @@ -12,6 +12,7 @@ dependencies { } junitPlatform { + platformVersion '1.0.0-M2' includeClassNamePattern '.*' } @@ -33,4 +34,4 @@ tasks.findByPath(":$name:junitPlatformTest").configure { outFile.delete() } } -} \ No newline at end of file +} From c590aeb8511edbb291aa0c843218be781a7145ec Mon Sep 17 00:00:00 2001 From: Bruce Eckel Date: Wed, 21 Dec 2016 14:18:56 -0800 Subject: [PATCH 170/320] Placeholder for new JUnit version --- gradle/junit-jupiter.gradle | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/gradle/junit-jupiter.gradle b/gradle/junit-jupiter.gradle index 596707058..2a4fc7aa8 100644 --- a/gradle/junit-jupiter.gradle +++ b/gradle/junit-jupiter.gradle @@ -16,6 +16,31 @@ junitPlatform { includeClassNamePattern '.*' } +/* NEW: (REQUIRES CODE REWRITES IN BOOK AND TEST CODE) +-> http://junit.org/junit5/docs/current/user-guide/ + +ext { + junitJupiterVersion = '5.0.0-M3' +} + +dependencies { + testCompile "org.junit.jupiter:junit-jupiter-api:${junitJupiterVersion}" + testRuntime "org.junit.jupiter:junit-jupiter-engine:${junitJupiterVersion}" +} + + +junitPlatform { + platformVersion '1.0.0-M3' + + filters { + packages { + exclude 'understandingcollections.jmh' + } + includeClassNamePattern '.*' + } +} +*/ + /* Store test output in $projectName/tests JUnit 5's junitPlatformTest runs as a "javaExec" rather than a "test", so we can't hook into the before/after test behavior. From afa51c5b7a7c316b86390ba08bc173ce9fe70481 Mon Sep 17 00:00:00 2001 From: Bruce Eckel Date: Sun, 25 Dec 2016 12:36:49 -0800 Subject: [PATCH 171/320] Moved examples from "Concurrent" to "lowlevel" --- concurrent/Baked.java | 31 ++++++ concurrent/Batter.java | 34 ++++++ concurrent/Breakable.java | 26 +++++ concurrent/CatchCompletableExceptions.java | 79 ++++++++++++++ concurrent/Chopstick.java | 19 ---- concurrent/CompletableApply.java | 6 ++ concurrent/CompletableExceptions.java | 69 ++++++++++++ concurrent/CompletableOperations.java | 61 +++++++++-- concurrent/CompletablePizza.java | 43 ++++++++ concurrent/DeadlockingDiningPhilosophers.java | 60 ----------- concurrent/DiningPhilosophers.java | 64 +++++++++++ concurrent/DualCompletableOperations.java | 100 +++++++++++++++--- concurrent/FixedDiningPhilosophers.java | 65 ------------ concurrent/FrostedCake.java | 31 ++++++ concurrent/ParallelPrime.java | 4 + concurrent/ParallelStreamPuzzle.java | 3 + concurrent/Philosopher.java | 74 +++++++------ concurrent/QuittingTasks.java | 11 ++ concurrent/RandomWork.java | 22 ---- concurrent/Summing2.java | 8 +- concurrent/Workable.java | 32 ++++++ gradle/subprojects.gradle | 2 +- .../BankTellerSimulation.java | 2 +- {concurrent => lowlevel}/CarBuilder.java | 2 +- {concurrent => lowlevel}/Restaurant.java | 2 +- {concurrent => lowlevel}/ToastOMatic.java | 2 +- .../restaurant2/RestaurantWithQueues.java | 2 +- 27 files changed, 623 insertions(+), 231 deletions(-) create mode 100644 concurrent/Baked.java create mode 100644 concurrent/Batter.java create mode 100644 concurrent/Breakable.java create mode 100644 concurrent/CatchCompletableExceptions.java delete mode 100644 concurrent/Chopstick.java create mode 100644 concurrent/CompletableExceptions.java delete mode 100644 concurrent/DeadlockingDiningPhilosophers.java create mode 100644 concurrent/DiningPhilosophers.java delete mode 100644 concurrent/FixedDiningPhilosophers.java create mode 100644 concurrent/FrostedCake.java delete mode 100644 concurrent/RandomWork.java create mode 100644 concurrent/Workable.java rename {concurrent => lowlevel}/BankTellerSimulation.java (99%) rename {concurrent => lowlevel}/CarBuilder.java (99%) rename {concurrent => lowlevel}/Restaurant.java (98%) rename {concurrent => lowlevel}/ToastOMatic.java (99%) rename {concurrent => lowlevel}/restaurant2/RestaurantWithQueues.java (99%) diff --git a/concurrent/Baked.java b/concurrent/Baked.java new file mode 100644 index 000000000..ab3366052 --- /dev/null +++ b/concurrent/Baked.java @@ -0,0 +1,31 @@ +// concurrent/Baked.java +// (c)2016 MindView LLC: see Copyright.txt +// We make no guarantees that this code is fit for any purpose. +// Visit http://OnJava8.com for more book information. +import java.util.concurrent.*; +import java.util.stream.*; +import onjava.Nap; + +public class Baked { + static class Pan {} + static Pan pan(Batter b) { + new Nap(100); + return new Pan(); + } + static Baked heat(Pan p) { + new Nap(100); + return new Baked(); + } + static CompletableFuture + bake(CompletableFuture cfb) { + return cfb + .thenApplyAsync(Baked::pan) + .thenApplyAsync(Baked::heat); + } + public static + Stream> batch() { + CompletableFuture batter = Batter.mix(); + return Stream.of(bake(batter), bake(batter), + bake(batter), bake(batter)); + } +} diff --git a/concurrent/Batter.java b/concurrent/Batter.java new file mode 100644 index 000000000..d05ece3ed --- /dev/null +++ b/concurrent/Batter.java @@ -0,0 +1,34 @@ +// concurrent/Batter.java +// (c)2016 MindView LLC: see Copyright.txt +// We make no guarantees that this code is fit for any purpose. +// Visit http://OnJava8.com for more book information. +import java.util.concurrent.*; +import onjava.Nap; + +public class Batter { + static class Eggs {} + static class Milk {} + static class Sugar {} + static class Flour {} + static T prepare(T ingredient) { + new Nap(100); + return ingredient; + } + static CompletableFuture cf(T ingredient) { + return CompletableFuture + .completedFuture(ingredient) + .thenApply(Batter::prepare); + } + public static CompletableFuture mix() { + CompletableFuture eggs = cf(new Eggs()); + CompletableFuture milk = cf(new Milk()); + CompletableFuture sugar = cf(new Sugar()); + CompletableFuture flour = cf(new Flour()); + CompletableFuture + .allOf(eggs, milk, sugar, flour) + .join(); + new Nap(100); // Mixing time + return + CompletableFuture.completedFuture(new Batter()); + } +} diff --git a/concurrent/Breakable.java b/concurrent/Breakable.java new file mode 100644 index 000000000..918883333 --- /dev/null +++ b/concurrent/Breakable.java @@ -0,0 +1,26 @@ +// concurrent/Breakable.java +// (c)2016 MindView LLC: see Copyright.txt +// We make no guarantees that this code is fit for any purpose. +// Visit http://OnJava8.com for more book information. +import java.util.concurrent.*; + +public class Breakable { + String id; + private int failcount; + public Breakable(String id, int failcount) { + this.id = id; + this.failcount = failcount; + } + @Override + public String toString() { + return "Breakable_" + id + + " [" + failcount + "]"; + } + public static Breakable work(Breakable b) { + if(--b.failcount == 0) + throw new RuntimeException( + "Breakable_" + b.id + " failed"); + System.out.println(b); + return b; + } +} diff --git a/concurrent/CatchCompletableExceptions.java b/concurrent/CatchCompletableExceptions.java new file mode 100644 index 000000000..30f05cfa8 --- /dev/null +++ b/concurrent/CatchCompletableExceptions.java @@ -0,0 +1,79 @@ +// concurrent/CatchCompletableExceptions.java +// (c)2016 MindView LLC: see Copyright.txt +// We make no guarantees that this code is fit for any purpose. +// Visit http://OnJava8.com for more book information. +import java.util.concurrent.*; +import onjava.Nap; + +public class CatchCompletableExceptions { + static void handleException(int failcount) { + // Call Function only if there's an exception, + // Must produce same type as came in: + CompletableExceptions + .test("exceptionally", failcount) + .exceptionally((ex) -> { // Function + if(ex == null) + System.out.println("I don't get it yet"); + return new Breakable(ex.getMessage(), 0); + }) + .thenAccept(str -> + System.out.println("result: " + str)); + + // Create a new result (recover): + CompletableExceptions + .test("handle", failcount) + .handle((result, fail) -> { // BiFunction + if(fail != null) + return "Failure recovery object"; + else + return result + " is good"; + }) + .thenAccept(str -> + System.out.println("result: " + str)); + + // Do something but pass the same result through: + CompletableExceptions + .test("whenComplete", failcount) + .whenComplete((result, fail) -> { // BiConsumer + if(fail != null) + System.out.println("It failed"); + else + System.out.println(result + " OK"); + }) + .thenAccept(r -> + System.out.println("result: " + r)); + } + public static void main(String[] args) { + System.out.println("**** Failure Mode ****"); + handleException(2); + System.out.println("**** Success Mode ****"); + handleException(0); + } +} +/* Output: +**** Failure Mode **** +Breakable_exceptionally [1] +result: Breakable_java.lang.RuntimeException: +Breakable_exceptionally failed [0] +Breakable_handle [1] +result: Failure recovery object +Breakable_whenComplete [1] +It failed +**** Success Mode **** +Breakable_exceptionally [-1] +Breakable_exceptionally [-2] +Breakable_exceptionally [-3] +Breakable_exceptionally [-4] +result: Breakable_exceptionally [-4] +Breakable_handle [-1] +Breakable_handle [-2] +Breakable_handle [-3] +Breakable_handle [-4] +result: Breakable_handle [-4] is good +Breakable_whenComplete [-1] +Breakable_whenComplete [-2] +Breakable_whenComplete [-3] +Breakable_whenComplete [-4] +Breakable_whenComplete [-4] OK +result: Breakable_whenComplete [-4] +*/ diff --git a/concurrent/Chopstick.java b/concurrent/Chopstick.java deleted file mode 100644 index 2c853a97b..000000000 --- a/concurrent/Chopstick.java +++ /dev/null @@ -1,19 +0,0 @@ -// concurrent/Chopstick.java -// (c)2016 MindView LLC: see Copyright.txt -// We make no guarantees that this code is fit for any purpose. -// Visit http://OnJava8.com for more book information. -// Chopsticks for dining philosophers - -public class Chopstick { - private boolean taken = false; - public synchronized - void take() throws InterruptedException { - while(taken) - wait(); - taken = true; - } - public synchronized void drop() { - taken = false; - notifyAll(); - } -} diff --git a/concurrent/CompletableApply.java b/concurrent/CompletableApply.java index 504d4e2c1..4e98eb061 100644 --- a/concurrent/CompletableApply.java +++ b/concurrent/CompletableApply.java @@ -19,3 +19,9 @@ public static void main(String[] args) { cf4.thenApply(Machina::work); } } +/* Output: +Machina0: ONE +Machina0: TWO +Machina0: THREE +Machina0: complete +*/ diff --git a/concurrent/CompletableExceptions.java b/concurrent/CompletableExceptions.java new file mode 100644 index 000000000..a1497fc2f --- /dev/null +++ b/concurrent/CompletableExceptions.java @@ -0,0 +1,69 @@ +// concurrent/CompletableExceptions.java +// (c)2016 MindView LLC: see Copyright.txt +// We make no guarantees that this code is fit for any purpose. +// Visit http://OnJava8.com for more book information. +import java.util.concurrent.*; +import onjava.Nap; + +public class CompletableExceptions { + static CompletableFuture + test(String id, int failcount) { + return + CompletableFuture.completedFuture( + new Breakable(id, failcount)) + .thenApply(Breakable::work) + .thenApply(Breakable::work) + .thenApply(Breakable::work) + .thenApply(Breakable::work); + } + public static void main(String[] args) { + // Exceptions don't appear ... + test("A", 1); + test("B", 2); + test("C", 3); + test("D", 4); + test("E", 5); + // ... until you try to fetch the value: + try { + test("F", 2).get(); // or join() + } catch(Exception e) { + System.out.println(e.getMessage()); + } + // Test for exceptions: + System.out.println( + test("G", 2).isCompletedExceptionally()); + // Counts as "done": + System.out.println(test("H", 2).isDone()); + // Force an exception: + CompletableFuture cfi = + new CompletableFuture<>(); + System.out.println("done? " + cfi.isDone()); + cfi.completeExceptionally( + new RuntimeException("forced")); + try { + cfi.get(); + } catch(Exception e) { + System.out.println(e.getMessage()); + } + } +} +/* Output: +Breakable_B [1] +Breakable_C [2] +Breakable_C [1] +Breakable_D [3] +Breakable_D [2] +Breakable_D [1] +Breakable_E [4] +Breakable_E [3] +Breakable_E [2] +Breakable_E [1] +Breakable_F [1] +java.lang.RuntimeException: Breakable_F failed +Breakable_G [1] +true +Breakable_H [1] +true +done? false +java.lang.RuntimeException: forced +*/ diff --git a/concurrent/CompletableOperations.java b/concurrent/CompletableOperations.java index ada4a2f10..27f0a96d3 100644 --- a/concurrent/CompletableOperations.java +++ b/concurrent/CompletableOperations.java @@ -5,10 +5,10 @@ import java.util.concurrent.*; public class CompletableOperations { - static CompletableFuture cfi() { + static CompletableFuture cfi(int i) { return CompletableFuture.completedFuture( - new Integer(1)); + new Integer(i)); } // Get and show value stored in a CF: static void showr(CompletableFuture c) { @@ -29,11 +29,60 @@ static void voidr(CompletableFuture c) { } } public static void main(String[] args) { - showr(cfi()); // Basic test - showr(cfi().thenApplyAsync(i -> i + 42)); - voidr(cfi().runAsync(() -> System.out.println("run"))); - CompletableFuture c = cfi(); + showr(cfi(1)); // Basic test + voidr(cfi(2).runAsync(() -> + System.out.println("runAsync"))); + voidr(cfi(3).thenRunAsync(() -> + System.out.println("thenRunAsync"))); + showr(CompletableFuture.supplyAsync(() -> 99)); + voidr(cfi(4).thenAcceptAsync(i -> + System.out.println("thenAcceptAsync: " + i))); + showr(cfi(5).thenApplyAsync(i -> i + 42)); + showr(cfi(6).thenComposeAsync(i -> cfi(i + 99))); + CompletableFuture c = cfi(7); c.obtrudeValue(111); showr(c); + showr(cfi(8).toCompletableFuture()); + c = new CompletableFuture<>(); + c.complete(9); + showr(c); + c = new CompletableFuture<>(); + c.cancel(true); + System.out.println("cancelled: " + + c.isCancelled()); + System.out.println("completed exceptionally: " + + c.isCompletedExceptionally()); + System.out.println("done: " + c.isDone()); + System.out.println(c); + c = new CompletableFuture<>(); + System.out.println(c.getNow(777)); + c = new CompletableFuture<>(); + c.thenApplyAsync(i -> i + 42) + .thenApplyAsync(i -> i * 12); + System.out.println("dependents: " + + c.getNumberOfDependents()); + c.thenApplyAsync(i -> i / 2); + System.out.println("dependents: " + + c.getNumberOfDependents()); } } +/* Output: +1 +runAsync +thenRunAsync +99 +thenAcceptAsync: 4 +47 +105 +111 +8 +9 +cancelled: true +completed exceptionally: true +done: true +java.util.concurrent.CompletableFuture@404b9385[Completed +exceptionally] +777 +dependents: 1 +dependents: 2 +*/ diff --git a/concurrent/CompletablePizza.java b/concurrent/CompletablePizza.java index 48b678fa7..fcac44143 100644 --- a/concurrent/CompletablePizza.java +++ b/concurrent/CompletablePizza.java @@ -42,4 +42,47 @@ public static void main(String[] args) { } } /* Output: +/* Output: +56 +Pizza 0: ROLLED +Pizza 1: ROLLED +Pizza 4: ROLLED +Pizza 2: ROLLED +Pizza 3: ROLLED +Pizza 0: SAUCED +Pizza 3: SAUCED +Pizza 2: SAUCED +Pizza 4: SAUCED +Pizza 1: SAUCED +Pizza 0: CHEESED +Pizza 4: CHEESED +Pizza 2: CHEESED +Pizza 3: CHEESED +Pizza 1: CHEESED +Pizza 0: TOPPED +Pizza 4: TOPPED +Pizza 1: TOPPED +Pizza 3: TOPPED +Pizza 2: TOPPED +Pizza 0: BAKED +Pizza 4: BAKED +Pizza 3: BAKED +Pizza 1: BAKED +Pizza 2: BAKED +Pizza 0: SLICED +Pizza 2: SLICED +Pizza 4: SLICED +Pizza 1: SLICED +Pizza 3: SLICED +Pizza 0: BOXED +Pizza0: complete +Pizza 4: BOXED +Pizza 3: BOXED +Pizza 2: BOXED +Pizza 1: BOXED +Pizza1: complete +Pizza2: complete +Pizza3: complete +Pizza4: complete +1659 */ diff --git a/concurrent/DeadlockingDiningPhilosophers.java b/concurrent/DeadlockingDiningPhilosophers.java deleted file mode 100644 index 1870a7452..000000000 --- a/concurrent/DeadlockingDiningPhilosophers.java +++ /dev/null @@ -1,60 +0,0 @@ -// concurrent/DeadlockingDiningPhilosophers.java -// (c)2016 MindView LLC: see Copyright.txt -// We make no guarantees that this code is fit for any purpose. -// Visit http://OnJava8.com for more book information. -// Demonstrates how deadlock can be hidden in a program -// {java DeadlockingDiningPhilosophers 0 5 timeout} -import java.util.concurrent.*; -import onjava.Nap; - -public class DeadlockingDiningPhilosophers { - public static void main(String[] args) { - int ponder = 5; - if(args.length > 0) - ponder = Integer.parseInt(args[0]); - int size = 5; - if(args.length > 1) - size = Integer.parseInt(args[1]); - ExecutorService es = Executors.newCachedThreadPool(); - Chopstick[] sticks = new Chopstick[size]; - for(int i = 0; i < size; i++) - sticks[i] = new Chopstick(); - for(int i = 0; i < size; i++) - es.execute(new Philosopher( - sticks[i], sticks[(i+1) % size], i, ponder)); - if(args.length == 3 && args[2].equals("timeout")) - new Nap(5000); - else { - System.out.println("Press 'Enter' to quit"); - try { - System.in.read(); - } catch(Exception e) { - throw new RuntimeException(e); - } - } - es.shutdownNow(); - } -} -/* Output: (First and Last 10 Lines) -Philosopher 0 thinking -Philosopher 4 thinking -Philosopher 1 thinking -Philosopher 3 thinking -Philosopher 2 thinking -Philosopher 3 grabbing right -Philosopher 1 grabbing right -Philosopher 4 grabbing right -Philosopher 0 grabbing right -Philosopher 4 grabbing left -...________...________...________...________... -Philosopher 3 grabbing left -Philosopher 1 grabbing left -Philosopher 4 grabbing left -Philosopher 2 grabbing left -Philosopher 0 grabbing left -Philosopher 1 exiting via interrupt -Philosopher 4 exiting via interrupt -Philosopher 3 exiting via interrupt -Philosopher 2 exiting via interrupt -Philosopher 0 exiting via interrupt -*/ diff --git a/concurrent/DiningPhilosophers.java b/concurrent/DiningPhilosophers.java new file mode 100644 index 000000000..49e0b96dc --- /dev/null +++ b/concurrent/DiningPhilosophers.java @@ -0,0 +1,64 @@ +// concurrent/DiningPhilosophers.java +// (c)2016 MindView LLC: see Copyright.txt +// We make no guarantees that this code is fit for any purpose. +// Visit http://OnJava8.com for more book information. +// Deadlock can be hidden in a program +import java.util.stream.*; +import java.util.concurrent.*; +import static java.util.concurrent.TimeUnit.*; + +public class DiningPhilosophers { + static void stopAfter(int secs) { + ScheduledExecutorService sched = + Executors.newScheduledThreadPool(1); + sched.schedule( () -> { + System.out.println("Timeout"); + Philosopher.running.set(false); + sched.shutdownNow(); + System.exit(0); + }, secs, SECONDS); + } + public static void main(String[] args) + throws Exception { + stopAfter(3); + try { + IntStream.range(0, Philosopher.QUANTITY) + .mapToObj(Philosopher::new) + .map(CompletableFuture::runAsync) + .collect(Collectors.toList()) + .forEach(CompletableFuture::join); + } catch(CompletionException ex) { + Philosopher.running.set(false); + System.out.println("Broken out of deadlock"); + System.out.println("..."); + } + Philosopher.trace.stream() + .skip(Philosopher.trace.size() - 20) + .forEach(System.out::println); + } +} +/* Output: +Broken out of deadlock +... +P2 grabbing right +P1 grabbing left +P3 eating +P3 thinking +P3 grabbing right +P4 eating +P2 grabbing left +P4 thinking +P0 eating +P4 grabbing right +P3 grabbing left +P0 thinking +P0 grabbing right +P4 grabbing left +P0 grabbing left +P1 eating +P2 eating +P3 eating +P0 eating +P4 eating +Timeout +*/ diff --git a/concurrent/DualCompletableOperations.java b/concurrent/DualCompletableOperations.java index 4fdefedd8..aff6348dc 100644 --- a/concurrent/DualCompletableOperations.java +++ b/concurrent/DualCompletableOperations.java @@ -5,42 +5,108 @@ import java.util.concurrent.*; public class DualCompletableOperations { - static - CompletableFuture makeCF(int id) { - return - CompletableFuture.completedFuture( - new RandomWork(id)) - .thenApplyAsync(RandomWork::work); - } - static CompletableFuture cfA, cfB; - static int count = 0; + static CompletableFuture cfA, cfB; static void init() { - cfA = makeCF(count++); - cfB = makeCF(count++); + cfA = Workable.make("A", 150); + cfB = Workable.make("B", 100); // Always wins } static void join() { cfA.join(); cfB.join(); + System.out.println("*****************"); } public static void main(String[] args) { + init(); + cfA.runAfterEitherAsync(cfB, () -> + System.out.println("runAfterEither")); + join(); + init(); cfA.runAfterBothAsync(cfB, () -> - System.out.println("Completed Both")); + System.out.println("runAfterBoth")); join(); init(); - cfA.runAfterEitherAsync(cfB, () -> - System.out.println("Completed Either")); + cfA.applyToEitherAsync(cfB, w -> { + System.out.println("applyToEither: " + w); + return w; + }); + join(); + + init(); + cfA.acceptEitherAsync(cfB, w -> { + System.out.println("acceptEither: " + w); + }); + join(); + + init(); + cfA.thenAcceptBothAsync(cfB, (w1, w2) -> { + System.out.println("thenAcceptBoth: " + + w1 + ", " + w2); + }); join(); init(); - cfA.applyToEitherAsync(cfB, rw -> { - System.out.println("applyToEither: " + rw); - return rw; + cfA.thenCombineAsync(cfB, (w1, w2) -> { + System.out.println("thenCombine: " + + w1 + ", " + w2); + return w1; }); join(); + init(); + CompletableFuture + cfC = Workable.make("C", 75), + cfD = Workable.make("D", 99); + CompletableFuture.anyOf(cfA, cfB, cfC, cfD) + .thenRunAsync(() -> + System.out.println("anyOf")); + join(); + + init(); + cfC = Workable.make("C", 75); + cfD = Workable.make("D", 99); + CompletableFuture.allOf(cfA, cfB, cfC, cfD) + .thenRunAsync(() -> + System.out.println("allOf")); + join(); } } /* Output: +Workable[BW] +runAfterEither +Workable[AW] +***************** +Workable[BW] +Workable[AW] +***************** +runAfterBoth +Workable[BW] +applyToEither: Workable[BW] +Workable[AW] +***************** +Workable[BW] +acceptEither: Workable[BW] +Workable[AW] +***************** +Workable[BW] +Workable[AW] +***************** +thenAcceptBoth: Workable[AW], Workable[BW] +Workable[BW] +Workable[AW] +***************** +thenCombine: Workable[AW], Workable[BW] +Workable[CW] +anyOf +Workable[DW] +Workable[BW] +Workable[AW] +***************** +Workable[CW] +Workable[DW] +Workable[BW] +Workable[AW] +***************** +allOf */ diff --git a/concurrent/FixedDiningPhilosophers.java b/concurrent/FixedDiningPhilosophers.java deleted file mode 100644 index 7d2cb8997..000000000 --- a/concurrent/FixedDiningPhilosophers.java +++ /dev/null @@ -1,65 +0,0 @@ -// concurrent/FixedDiningPhilosophers.java -// (c)2016 MindView LLC: see Copyright.txt -// We make no guarantees that this code is fit for any purpose. -// Visit http://OnJava8.com for more book information. -// Dining philosophers without deadlock -// {java FixedDiningPhilosophers 5 5 timeout} -import java.util.concurrent.*; -import onjava.Nap; - -public class FixedDiningPhilosophers { - public static void - main(String[] args) { - int ponder = 5; - if(args.length > 0) - ponder = Integer.parseInt(args[0]); - int size = 5; - if(args.length > 1) - size = Integer.parseInt(args[1]); - ExecutorService es = Executors.newCachedThreadPool(); - Chopstick[] sticks = new Chopstick[size]; - for(int i = 0; i < size; i++) - sticks[i] = new Chopstick(); - for(int i = 0; i < size; i++) - if(i < (size-1)) - es.execute(new Philosopher( - sticks[i], sticks[i+1], i, ponder)); - else - es.execute(new Philosopher( - sticks[0], sticks[i], i, ponder)); - if(args.length == 3 && args[2].equals("timeout")) - new Nap(5000); - else { - System.out.println("Press 'Enter' to quit"); - try { - System.in.read(); - } catch(Exception e) { - throw new RuntimeException(e); - } - } - es.shutdownNow(); - } -} -/* Output: (First and Last 10 Lines) -Philosopher 1 thinking -Philosopher 4 thinking -Philosopher 2 thinking -Philosopher 0 thinking -Philosopher 3 thinking -Philosopher 1 grabbing right -Philosopher 2 grabbing right -Philosopher 4 grabbing right -Philosopher 4 grabbing left -Philosopher 4 eating -...________...________...________...________... -Philosopher 1 thinking -Philosopher 0 grabbing left -Philosopher 0 eating -Philosopher 2 eating -Philosopher 1 grabbing right -Philosopher 3 exiting via interrupt -Philosopher 1 exiting via interrupt -Philosopher 2 exiting via interrupt -Philosopher 0 exiting via interrupt -Philosopher 4 exiting via interrupt -*/ diff --git a/concurrent/FrostedCake.java b/concurrent/FrostedCake.java new file mode 100644 index 000000000..f4926324e --- /dev/null +++ b/concurrent/FrostedCake.java @@ -0,0 +1,31 @@ +// concurrent/FrostedCake.java +// (c)2016 MindView LLC: see Copyright.txt +// We make no guarantees that this code is fit for any purpose. +// Visit http://OnJava8.com for more book information. +import java.util.concurrent.*; +import java.util.function.*; +import java.util.stream.*; +import onjava.Nap; + +class Frosting { + private Frosting() {} + static CompletableFuture make() { + new Nap(100); + return CompletableFuture + .completedFuture(new Frosting()); + } +} + +public class FrostedCake { + public FrostedCake(Baked baked, Frosting frosting) { + new Nap(100); + } + public static void main(String[] args) { + Baked.batch().forEach(baked -> baked + .thenCombineAsync(Frosting.make(), + (cake, frosting) -> + new FrostedCake(cake, frosting)) + .thenAcceptAsync(System.out::println).join()); + // Need to rewrite... + } +} diff --git a/concurrent/ParallelPrime.java b/concurrent/ParallelPrime.java index 597f645ef..3c16a8ebc 100644 --- a/concurrent/ParallelPrime.java +++ b/concurrent/ParallelPrime.java @@ -31,3 +31,7 @@ public static void main(String[] args) StandardOpenOption.CREATE); } } +/* Output: +/* Output: +616 +*/ diff --git a/concurrent/ParallelStreamPuzzle.java b/concurrent/ParallelStreamPuzzle.java index d90520875..f79027319 100644 --- a/concurrent/ParallelStreamPuzzle.java +++ b/concurrent/ParallelStreamPuzzle.java @@ -23,3 +23,6 @@ public static void main(String[] args) { System.out.println(x); } } +/* Output: +[2, 8, 21, 24, 27, 30, 33, 37, 40, 43] +*/ diff --git a/concurrent/Philosopher.java b/concurrent/Philosopher.java index 4b00bb59b..a7c570ac2 100644 --- a/concurrent/Philosopher.java +++ b/concurrent/Philosopher.java @@ -2,48 +2,58 @@ // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. -// A dining philosopher import java.util.*; -import onjava.Nap; +import java.util.stream.*; +import java.util.concurrent.*; +import static java.util.concurrent.TimeUnit.*; +import java.util.concurrent.atomic.*; -public class Philosopher implements Runnable { - private Chopstick left; - private Chopstick right; - private final int id; - private final int ponderFactor; - private SplittableRandom rand = new SplittableRandom(47); - private void pause() { - if(ponderFactor == 0) return; - new Nap(rand.nextInt(ponderFactor * 250)); - } - public Philosopher(Chopstick left, Chopstick right, - int ident, int ponder) { - this.left = left; - this.right = right; - id = ident; - ponderFactor = ponder; +class Philosopher implements Runnable { + static class Chopstick {} + public static final int QUANTITY = 5; + static Queue trace = + new ConcurrentLinkedQueue<>(); + static AtomicBoolean running = + new AtomicBoolean(true); + public static + List> chopsticks = + IntStream.range(0, Philosopher.QUANTITY) + .mapToObj(i -> { + BlockingQueue bd = + new ArrayBlockingQueue<>(1); + bd.add(new Chopstick()); + return bd; + }) + .collect(Collectors.toList()); + private final int seatNumber; + private final int left, right; + public Philosopher(int seatNumber) { + this.seatNumber = left = seatNumber; + right = (seatNumber + 1) % QUANTITY; } @Override public void run() { try { - while(!Thread.interrupted()) { - System.out.println(this + " " + "thinking"); - pause(); + while(running.get()) { + trace.add(this + " thinking"); // Philosopher becomes hungry - System.out.println(this + " " + "grabbing right"); - right.take(); - System.out.println(this + " " + "grabbing left"); - left.take(); - System.out.println(this + " " + "eating"); - pause(); - right.drop(); - left.drop(); + trace.add(this + " grabbing right"); + Chopstick rightStick = + chopsticks.get(right).poll(2, SECONDS); + trace.add(this + " grabbing left"); + Chopstick leftStick = + chopsticks.get(left).poll(2, SECONDS); + trace.add(this + " eating"); + // Finished, return chopsticks to table: + chopsticks.get(right).put(rightStick); + chopsticks.get(left).put(leftStick); } } catch(InterruptedException e) { - System.out.println( - this + " " + "exiting via interrupt"); + trace.add("exiting via interrupt"); } } @Override - public String toString() { return "Philosopher " + id; } + public String toString() { + return "P" + seatNumber; + } } diff --git a/concurrent/QuittingTasks.java b/concurrent/QuittingTasks.java index 1f74c93d2..92e8f3319 100644 --- a/concurrent/QuittingTasks.java +++ b/concurrent/QuittingTasks.java @@ -22,3 +22,14 @@ public static void main(String[] args) { es.shutdown(); } } +/* Output: +125 148 115 127 120 118 106 140 77 119 97 80 143 17 92 147 +89 123 16 12 138 25 13 101 135 96 76 73 130 133 37 132 134 +149 137 122 29 49 60 40 142 131 53 1 98 145 126 65 5 64 82 +79 68 86 141 61 128 22 7 26 19 139 114 146 14 15 43 34 10 +75 87 90 31 47 38 62 18 63 41 42 144 66 23 6 4 91 70 83 102 +103 54 69 74 56 71 94 88 78 81 57 52 93 45 48 44 32 28 36 +33 104 105 112 109 100 117 24 108 21 116 20 9 85 8 84 72 +107 113 121 124 136 129 99 95 55 3 27 2 59 67 50 58 51 39 +30 35 46 110 111 11 +*/ diff --git a/concurrent/RandomWork.java b/concurrent/RandomWork.java deleted file mode 100644 index f09922ccd..000000000 --- a/concurrent/RandomWork.java +++ /dev/null @@ -1,22 +0,0 @@ -// concurrent/RandomWork.java -// (c)2016 MindView LLC: see Copyright.txt -// We make no guarantees that this code is fit for any purpose. -// Visit http://OnJava8.com for more book information. -import java.util.*; -import onjava.Nap; - -public class RandomWork { - private static SplittableRandom rand = - new SplittableRandom(47); - private final int id; - public RandomWork(int id) { this.id = id; } - public static RandomWork work(RandomWork r) { - new Nap(rand.nextInt(250)); - System.out.println(r); - return r; - } - @Override - public String toString() { - return "RandomWork " + id; - } -} diff --git a/concurrent/Summing2.java b/concurrent/Summing2.java index eb2145725..a7da46e3b 100644 --- a/concurrent/Summing2.java +++ b/concurrent/Summing2.java @@ -36,8 +36,8 @@ public static void main(String[] args) { } /* Output: 200000010000000 -Array Stream Sum: 112ms -Parallel: 28ms -Basic Sum: 33ms -parallelPrefix: 60ms +Array Stream Sum: 22ms +Parallel: 21ms +Basic Sum: 16ms +parallelPrefix: 116ms */ diff --git a/concurrent/Workable.java b/concurrent/Workable.java new file mode 100644 index 000000000..87d7abdf8 --- /dev/null +++ b/concurrent/Workable.java @@ -0,0 +1,32 @@ +// concurrent/Workable.java +// (c)2016 MindView LLC: see Copyright.txt +// We make no guarantees that this code is fit for any purpose. +// Visit http://OnJava8.com for more book information. +import java.util.concurrent.*; +import onjava.Nap; + +public class Workable { + String id; + final int duration; + public Workable(String id, int duration) { + this.id = id; + this.duration = duration; + } + @Override + public String toString() { + return "Workable[" + id + "]"; + } + public static Workable work(Workable tt) { + new Nap(tt.duration); // Milliseconds + tt.id = tt.id + "W"; + System.out.println(tt); + return tt; + } + public static CompletableFuture + make(String id, int duration) { + return + CompletableFuture.completedFuture( + new Workable(id, duration)) + .thenApplyAsync(Workable::work); + } +} diff --git a/gradle/subprojects.gradle b/gradle/subprojects.gradle index 8972377b4..5a77a0373 100644 --- a/gradle/subprojects.gradle +++ b/gradle/subprojects.gradle @@ -14,7 +14,7 @@ project(':understandingcollections') { } } -project(':concurrent') { +project(':lowlevel') { dependencies { compile project(':enums') } diff --git a/concurrent/BankTellerSimulation.java b/lowlevel/BankTellerSimulation.java similarity index 99% rename from concurrent/BankTellerSimulation.java rename to lowlevel/BankTellerSimulation.java index f9b597c5e..c1d81174e 100644 --- a/concurrent/BankTellerSimulation.java +++ b/lowlevel/BankTellerSimulation.java @@ -1,4 +1,4 @@ -// concurrent/BankTellerSimulation.java +// lowlevel/BankTellerSimulation.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/concurrent/CarBuilder.java b/lowlevel/CarBuilder.java similarity index 99% rename from concurrent/CarBuilder.java rename to lowlevel/CarBuilder.java index 6942158b8..91a0ef9aa 100644 --- a/concurrent/CarBuilder.java +++ b/lowlevel/CarBuilder.java @@ -1,4 +1,4 @@ -// concurrent/CarBuilder.java +// lowlevel/CarBuilder.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/concurrent/Restaurant.java b/lowlevel/Restaurant.java similarity index 98% rename from concurrent/Restaurant.java rename to lowlevel/Restaurant.java index bc8c11e29..d2c6c7553 100644 --- a/concurrent/Restaurant.java +++ b/lowlevel/Restaurant.java @@ -1,4 +1,4 @@ -// concurrent/Restaurant.java +// lowlevel/Restaurant.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/concurrent/ToastOMatic.java b/lowlevel/ToastOMatic.java similarity index 99% rename from concurrent/ToastOMatic.java rename to lowlevel/ToastOMatic.java index a27f8820e..1173a8112 100644 --- a/concurrent/ToastOMatic.java +++ b/lowlevel/ToastOMatic.java @@ -1,4 +1,4 @@ -// concurrent/ToastOMatic.java +// lowlevel/ToastOMatic.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/concurrent/restaurant2/RestaurantWithQueues.java b/lowlevel/restaurant2/RestaurantWithQueues.java similarity index 99% rename from concurrent/restaurant2/RestaurantWithQueues.java rename to lowlevel/restaurant2/RestaurantWithQueues.java index 8cc184f7d..5f75dcd40 100644 --- a/concurrent/restaurant2/RestaurantWithQueues.java +++ b/lowlevel/restaurant2/RestaurantWithQueues.java @@ -1,4 +1,4 @@ -// concurrent/restaurant2/RestaurantWithQueues.java +// lowlevel/restaurant2/RestaurantWithQueues.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. From 6d4d5a1dfc8d5c20267206da06d4b64fdfe9c388 Mon Sep 17 00:00:00 2001 From: Bruce Eckel Date: Thu, 29 Dec 2016 17:05:59 -0800 Subject: [PATCH 172/320] concurrency chapter progress --- concurrent/CompletablePizza.java | 1 - concurrent/DiningPhilosophers.java | 75 ++++++++++-------------------- concurrent/FrostedCake.java | 3 +- concurrent/ParallelPrime.java | 2 - concurrent/Philosopher.java | 67 ++++++++------------------ concurrent/StickHolder.java | 27 +++++++++++ 6 files changed, 72 insertions(+), 103 deletions(-) create mode 100644 concurrent/StickHolder.java diff --git a/concurrent/CompletablePizza.java b/concurrent/CompletablePizza.java index fcac44143..5b2416e2e 100644 --- a/concurrent/CompletablePizza.java +++ b/concurrent/CompletablePizza.java @@ -42,7 +42,6 @@ public static void main(String[] args) { } } /* Output: -/* Output: 56 Pizza 0: ROLLED Pizza 1: ROLLED diff --git a/concurrent/DiningPhilosophers.java b/concurrent/DiningPhilosophers.java index 49e0b96dc..65c9231f8 100644 --- a/concurrent/DiningPhilosophers.java +++ b/concurrent/DiningPhilosophers.java @@ -2,63 +2,36 @@ // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. -// Deadlock can be hidden in a program -import java.util.stream.*; +// Hidden deadlock +import java.util.*; import java.util.concurrent.*; import static java.util.concurrent.TimeUnit.*; public class DiningPhilosophers { - static void stopAfter(int secs) { + private StickHolder[] sticks; + private Philosopher[] philosophers; + public DiningPhilosophers(int n) { + sticks = new StickHolder[n]; + Arrays.setAll(sticks, i -> new StickHolder()); + philosophers = new Philosopher[n]; + Arrays.setAll(philosophers, i -> + new Philosopher(i, + sticks[i], sticks[(i + 1) % n])); // [1] + // Fix by reversing stick order: + // philosophers[1] = // [2] + // new Philosopher(0, sticks[0], sticks[1]); + Arrays.stream(philosophers) + .forEach(CompletableFuture::runAsync); // [3] + } + public static void main(String[] args) { + // Returns right away: + new DiningPhilosophers(5); // [4] + // Keeps main() from exiting: ScheduledExecutorService sched = Executors.newScheduledThreadPool(1); sched.schedule( () -> { - System.out.println("Timeout"); - Philosopher.running.set(false); - sched.shutdownNow(); - System.exit(0); - }, secs, SECONDS); - } - public static void main(String[] args) - throws Exception { - stopAfter(3); - try { - IntStream.range(0, Philosopher.QUANTITY) - .mapToObj(Philosopher::new) - .map(CompletableFuture::runAsync) - .collect(Collectors.toList()) - .forEach(CompletableFuture::join); - } catch(CompletionException ex) { - Philosopher.running.set(false); - System.out.println("Broken out of deadlock"); - System.out.println("..."); - } - Philosopher.trace.stream() - .skip(Philosopher.trace.size() - 20) - .forEach(System.out::println); + System.out.println("Shutdown"); + sched.shutdown(); + }, 3, SECONDS); } } -/* Output: -Broken out of deadlock -... -P2 grabbing right -P1 grabbing left -P3 eating -P3 thinking -P3 grabbing right -P4 eating -P2 grabbing left -P4 thinking -P0 eating -P4 grabbing right -P3 grabbing left -P0 thinking -P0 grabbing right -P4 grabbing left -P0 grabbing left -P1 eating -P2 eating -P3 eating -P0 eating -P4 eating -Timeout -*/ diff --git a/concurrent/FrostedCake.java b/concurrent/FrostedCake.java index f4926324e..80d77d67a 100644 --- a/concurrent/FrostedCake.java +++ b/concurrent/FrostedCake.java @@ -3,7 +3,6 @@ // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.concurrent.*; -import java.util.function.*; import java.util.stream.*; import onjava.Nap; @@ -20,6 +19,8 @@ public class FrostedCake { public FrostedCake(Baked baked, Frosting frosting) { new Nap(100); } + @Override + public String toString() { return "FrostedCake"; } public static void main(String[] args) { Baked.batch().forEach(baked -> baked .thenCombineAsync(Frosting.make(), diff --git a/concurrent/ParallelPrime.java b/concurrent/ParallelPrime.java index 3c16a8ebc..fcf844eed 100644 --- a/concurrent/ParallelPrime.java +++ b/concurrent/ParallelPrime.java @@ -7,7 +7,6 @@ import static java.util.stream.LongStream.*; import java.io.*; import java.nio.file.*; -import java.nio.charset.*; import onjava.Timer; public class ParallelPrime { @@ -32,6 +31,5 @@ public static void main(String[] args) } } /* Output: -/* Output: 616 */ diff --git a/concurrent/Philosopher.java b/concurrent/Philosopher.java index a7c570ac2..cd4d56e03 100644 --- a/concurrent/Philosopher.java +++ b/concurrent/Philosopher.java @@ -2,58 +2,29 @@ // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. -import java.util.*; -import java.util.stream.*; -import java.util.concurrent.*; -import static java.util.concurrent.TimeUnit.*; -import java.util.concurrent.atomic.*; -class Philosopher implements Runnable { - static class Chopstick {} - public static final int QUANTITY = 5; - static Queue trace = - new ConcurrentLinkedQueue<>(); - static AtomicBoolean running = - new AtomicBoolean(true); - public static - List> chopsticks = - IntStream.range(0, Philosopher.QUANTITY) - .mapToObj(i -> { - BlockingQueue bd = - new ArrayBlockingQueue<>(1); - bd.add(new Chopstick()); - return bd; - }) - .collect(Collectors.toList()); - private final int seatNumber; - private final int left, right; - public Philosopher(int seatNumber) { - this.seatNumber = left = seatNumber; - right = (seatNumber + 1) % QUANTITY; +public class Philosopher implements Runnable { + private final int seat; + private final StickHolder left, right; + public Philosopher(int seat, + StickHolder left, StickHolder right) { + this.seat = seat; + this.left = left; + this.right = right; } @Override - public void run() { - try { - while(running.get()) { - trace.add(this + " thinking"); - // Philosopher becomes hungry - trace.add(this + " grabbing right"); - Chopstick rightStick = - chopsticks.get(right).poll(2, SECONDS); - trace.add(this + " grabbing left"); - Chopstick leftStick = - chopsticks.get(left).poll(2, SECONDS); - trace.add(this + " eating"); - // Finished, return chopsticks to table: - chopsticks.get(right).put(rightStick); - chopsticks.get(left).put(leftStick); - } - } catch(InterruptedException e) { - trace.add("exiting via interrupt"); - } + public String toString() { + return "P" + seat; } @Override - public String toString() { - return "P" + seatNumber; + public void run() { + while(true) { + // System.out.println("Thinking"); // [1] + right.pickUp(); + left.pickUp(); + System.out.println(this + " eating"); + right.putDown(); + left.putDown(); + } } } diff --git a/concurrent/StickHolder.java b/concurrent/StickHolder.java new file mode 100644 index 000000000..456da2538 --- /dev/null +++ b/concurrent/StickHolder.java @@ -0,0 +1,27 @@ +// concurrent/StickHolder.java +// (c)2016 MindView LLC: see Copyright.txt +// We make no guarantees that this code is fit for any purpose. +// Visit http://OnJava8.com for more book information. +import java.util.concurrent.*; + +public class StickHolder { + private static class Chopstick {} + private Chopstick stick = new Chopstick(); + private BlockingQueue holder = + new ArrayBlockingQueue<>(1); + public StickHolder() { putDown(); } + public void pickUp() { + try { + holder.take(); // Blocks if unavailable + } catch(InterruptedException e) { + throw new RuntimeException(e); + } + } + public void putDown() { + try { + holder.put(stick); + } catch(InterruptedException e) { + throw new RuntimeException(e); + } + } +} From 9905ed25513b16ebc0f7945aa75ca70274094c94 Mon Sep 17 00:00:00 2001 From: Bruce Eckel Date: Thu, 29 Dec 2016 17:43:16 -0800 Subject: [PATCH 173/320] Moved collectionsindepth to moreaboutcollections --- gradle/junit-jupiter.gradle | 2 +- gradle/subprojects.gradle | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/gradle/junit-jupiter.gradle b/gradle/junit-jupiter.gradle index 2a4fc7aa8..b8719f50d 100644 --- a/gradle/junit-jupiter.gradle +++ b/gradle/junit-jupiter.gradle @@ -34,7 +34,7 @@ junitPlatform { filters { packages { - exclude 'understandingcollections.jmh' + exclude 'moreaboutcollections.jmh' } includeClassNamePattern '.*' } diff --git a/gradle/subprojects.gradle b/gradle/subprojects.gradle index 5a77a0373..1ccbb942b 100644 --- a/gradle/subprojects.gradle +++ b/gradle/subprojects.gradle @@ -4,13 +4,13 @@ project(':validating') { } } -project(':understandingcollections') { +project(':moreaboutcollections') { dependencies { compile project(':typeinfo') compile project(':collections') } jmh { - include = 'understandingcollections.jmh.*' + include = 'moreaboutcollections.jmh.*' } } From 920d169dac924fa54ebbdfa9f29f1ac027371087 Mon Sep 17 00:00:00 2001 From: Bruce Eckel Date: Thu, 29 Dec 2016 21:24:00 -0800 Subject: [PATCH 174/320] collectionsindepth -> moreaboutcollections --- .../AssociativeArray.java | 2 +- {understandingcollections => moreaboutcollections}/Bits.java | 2 +- .../CanonicalMapping.java | 2 +- .../CollectionMethods.java | 2 +- .../CountedString.java | 2 +- .../Enumerations.java | 2 +- .../FailFast.java | 2 +- .../FillMapTest.java | 2 +- .../FillingLists.java | 2 +- .../FunctionalMap.java | 2 +- .../Groundhog.java | 2 +- .../Groundhog2.java | 2 +- .../HTMLColorTest.java | 2 +- .../IndividualTest.java | 2 +- .../LinkedHashMapDemo.java | 2 +- {understandingcollections => moreaboutcollections}/ListOps.java | 2 +- .../ListSortSearch.java | 2 +- .../MapEntry.java | 2 +- {understandingcollections => moreaboutcollections}/MapOps.java | 2 +- {understandingcollections => moreaboutcollections}/NavMap.java | 2 +- .../Prediction.java | 2 +- .../QueueBehavior.java | 2 +- .../ReadOnly.java | 2 +- .../References.java | 2 +- .../SetOrder.java | 2 +- .../SimpleDeques.java | 2 +- .../SimpleHashMap.java | 2 +- {understandingcollections => moreaboutcollections}/SlowMap.java | 2 +- .../SortedMapDemo.java | 2 +- .../SortedSetDemo.java | 2 +- .../SpringDetector.java | 2 +- .../SpringDetector2.java | 2 +- {understandingcollections => moreaboutcollections}/Stacks.java | 2 +- .../StreamFillMaps.java | 2 +- .../StringHashCode.java | 2 +- .../SuppliersCollectionTest.java | 2 +- .../Synchronization.java | 2 +- .../ToDoList.java | 2 +- .../TypesForSets.java | 2 +- .../Unsupported.java | 2 +- .../Utilities.java | 2 +- .../jmh/Deques.java | 2 +- .../jmh/Lists.java | 2 +- .../jmh/Maps.java | 2 +- .../jmh/Queues.java | 2 +- .../jmh/Sets.java | 2 +- 46 files changed, 46 insertions(+), 46 deletions(-) rename {understandingcollections => moreaboutcollections}/AssociativeArray.java (97%) rename {understandingcollections => moreaboutcollections}/Bits.java (98%) rename {understandingcollections => moreaboutcollections}/CanonicalMapping.java (96%) rename {understandingcollections => moreaboutcollections}/CollectionMethods.java (98%) rename {understandingcollections => moreaboutcollections}/CountedString.java (97%) rename {understandingcollections => moreaboutcollections}/Enumerations.java (94%) rename {understandingcollections => moreaboutcollections}/FailFast.java (93%) rename {understandingcollections => moreaboutcollections}/FillMapTest.java (95%) rename {understandingcollections => moreaboutcollections}/FillingLists.java (95%) rename {understandingcollections => moreaboutcollections}/FunctionalMap.java (94%) rename {understandingcollections => moreaboutcollections}/Groundhog.java (90%) rename {understandingcollections => moreaboutcollections}/Groundhog2.java (92%) rename {understandingcollections => moreaboutcollections}/HTMLColorTest.java (97%) rename {understandingcollections => moreaboutcollections}/IndividualTest.java (93%) rename {understandingcollections => moreaboutcollections}/LinkedHashMapDemo.java (95%) rename {understandingcollections => moreaboutcollections}/ListOps.java (99%) rename {understandingcollections => moreaboutcollections}/ListSortSearch.java (97%) rename {understandingcollections => moreaboutcollections}/MapEntry.java (96%) rename {understandingcollections => moreaboutcollections}/MapOps.java (98%) rename {understandingcollections => moreaboutcollections}/NavMap.java (98%) rename {understandingcollections => moreaboutcollections}/Prediction.java (92%) rename {understandingcollections => moreaboutcollections}/QueueBehavior.java (96%) rename {understandingcollections => moreaboutcollections}/ReadOnly.java (97%) rename {understandingcollections => moreaboutcollections}/References.java (98%) rename {understandingcollections => moreaboutcollections}/SetOrder.java (97%) rename {understandingcollections => moreaboutcollections}/SimpleDeques.java (97%) rename {understandingcollections => moreaboutcollections}/SimpleHashMap.java (98%) rename {understandingcollections => moreaboutcollections}/SlowMap.java (97%) rename {understandingcollections => moreaboutcollections}/SortedMapDemo.java (96%) rename {understandingcollections => moreaboutcollections}/SortedSetDemo.java (96%) rename {understandingcollections => moreaboutcollections}/SpringDetector.java (96%) rename {understandingcollections => moreaboutcollections}/SpringDetector2.java (93%) rename {understandingcollections => moreaboutcollections}/Stacks.java (98%) rename {understandingcollections => moreaboutcollections}/StreamFillMaps.java (96%) rename {understandingcollections => moreaboutcollections}/StringHashCode.java (89%) rename {understandingcollections => moreaboutcollections}/SuppliersCollectionTest.java (97%) rename {understandingcollections => moreaboutcollections}/Synchronization.java (94%) rename {understandingcollections => moreaboutcollections}/ToDoList.java (97%) rename {understandingcollections => moreaboutcollections}/TypesForSets.java (98%) rename {understandingcollections => moreaboutcollections}/Unsupported.java (98%) rename {understandingcollections => moreaboutcollections}/Utilities.java (98%) rename {understandingcollections => moreaboutcollections}/jmh/Deques.java (97%) rename {understandingcollections => moreaboutcollections}/jmh/Lists.java (98%) rename {understandingcollections => moreaboutcollections}/jmh/Maps.java (97%) rename {understandingcollections => moreaboutcollections}/jmh/Queues.java (97%) rename {understandingcollections => moreaboutcollections}/jmh/Sets.java (97%) diff --git a/understandingcollections/AssociativeArray.java b/moreaboutcollections/AssociativeArray.java similarity index 97% rename from understandingcollections/AssociativeArray.java rename to moreaboutcollections/AssociativeArray.java index 9caffdf11..597e2a823 100644 --- a/understandingcollections/AssociativeArray.java +++ b/moreaboutcollections/AssociativeArray.java @@ -1,4 +1,4 @@ -// understandingcollections/AssociativeArray.java +// moreaboutcollections/AssociativeArray.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/understandingcollections/Bits.java b/moreaboutcollections/Bits.java similarity index 98% rename from understandingcollections/Bits.java rename to moreaboutcollections/Bits.java index 3cf274b87..a075f5e46 100644 --- a/understandingcollections/Bits.java +++ b/moreaboutcollections/Bits.java @@ -1,4 +1,4 @@ -// understandingcollections/Bits.java +// moreaboutcollections/Bits.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/understandingcollections/CanonicalMapping.java b/moreaboutcollections/CanonicalMapping.java similarity index 96% rename from understandingcollections/CanonicalMapping.java rename to moreaboutcollections/CanonicalMapping.java index 8923d91fa..1af76e80b 100644 --- a/understandingcollections/CanonicalMapping.java +++ b/moreaboutcollections/CanonicalMapping.java @@ -1,4 +1,4 @@ -// understandingcollections/CanonicalMapping.java +// moreaboutcollections/CanonicalMapping.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/understandingcollections/CollectionMethods.java b/moreaboutcollections/CollectionMethods.java similarity index 98% rename from understandingcollections/CollectionMethods.java rename to moreaboutcollections/CollectionMethods.java index eaea13837..4fd86bbc5 100644 --- a/understandingcollections/CollectionMethods.java +++ b/moreaboutcollections/CollectionMethods.java @@ -1,4 +1,4 @@ -// understandingcollections/CollectionMethods.java +// moreaboutcollections/CollectionMethods.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/understandingcollections/CountedString.java b/moreaboutcollections/CountedString.java similarity index 97% rename from understandingcollections/CountedString.java rename to moreaboutcollections/CountedString.java index 1afa88747..03aa556f3 100644 --- a/understandingcollections/CountedString.java +++ b/moreaboutcollections/CountedString.java @@ -1,4 +1,4 @@ -// understandingcollections/CountedString.java +// moreaboutcollections/CountedString.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/understandingcollections/Enumerations.java b/moreaboutcollections/Enumerations.java similarity index 94% rename from understandingcollections/Enumerations.java rename to moreaboutcollections/Enumerations.java index dd40487ed..2a90dda50 100644 --- a/understandingcollections/Enumerations.java +++ b/moreaboutcollections/Enumerations.java @@ -1,4 +1,4 @@ -// understandingcollections/Enumerations.java +// moreaboutcollections/Enumerations.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/understandingcollections/FailFast.java b/moreaboutcollections/FailFast.java similarity index 93% rename from understandingcollections/FailFast.java rename to moreaboutcollections/FailFast.java index f72b1dff6..679cb933a 100644 --- a/understandingcollections/FailFast.java +++ b/moreaboutcollections/FailFast.java @@ -1,4 +1,4 @@ -// understandingcollections/FailFast.java +// moreaboutcollections/FailFast.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/understandingcollections/FillMapTest.java b/moreaboutcollections/FillMapTest.java similarity index 95% rename from understandingcollections/FillMapTest.java rename to moreaboutcollections/FillMapTest.java index 08dc9404b..1139d8d03 100644 --- a/understandingcollections/FillMapTest.java +++ b/moreaboutcollections/FillMapTest.java @@ -1,4 +1,4 @@ -// understandingcollections/FillMapTest.java +// moreaboutcollections/FillMapTest.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/understandingcollections/FillingLists.java b/moreaboutcollections/FillingLists.java similarity index 95% rename from understandingcollections/FillingLists.java rename to moreaboutcollections/FillingLists.java index 560c49f57..c38154623 100644 --- a/understandingcollections/FillingLists.java +++ b/moreaboutcollections/FillingLists.java @@ -1,4 +1,4 @@ -// understandingcollections/FillingLists.java +// moreaboutcollections/FillingLists.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/understandingcollections/FunctionalMap.java b/moreaboutcollections/FunctionalMap.java similarity index 94% rename from understandingcollections/FunctionalMap.java rename to moreaboutcollections/FunctionalMap.java index a1267377d..bb59e18cd 100644 --- a/understandingcollections/FunctionalMap.java +++ b/moreaboutcollections/FunctionalMap.java @@ -1,4 +1,4 @@ -// understandingcollections/FunctionalMap.java +// moreaboutcollections/FunctionalMap.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/understandingcollections/Groundhog.java b/moreaboutcollections/Groundhog.java similarity index 90% rename from understandingcollections/Groundhog.java rename to moreaboutcollections/Groundhog.java index 9bbc43f81..efaf1d0ee 100644 --- a/understandingcollections/Groundhog.java +++ b/moreaboutcollections/Groundhog.java @@ -1,4 +1,4 @@ -// understandingcollections/Groundhog.java +// moreaboutcollections/Groundhog.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/understandingcollections/Groundhog2.java b/moreaboutcollections/Groundhog2.java similarity index 92% rename from understandingcollections/Groundhog2.java rename to moreaboutcollections/Groundhog2.java index 7c0d05e60..5337955f4 100644 --- a/understandingcollections/Groundhog2.java +++ b/moreaboutcollections/Groundhog2.java @@ -1,4 +1,4 @@ -// understandingcollections/Groundhog2.java +// moreaboutcollections/Groundhog2.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/understandingcollections/HTMLColorTest.java b/moreaboutcollections/HTMLColorTest.java similarity index 97% rename from understandingcollections/HTMLColorTest.java rename to moreaboutcollections/HTMLColorTest.java index 7256bfcbb..b61c54583 100644 --- a/understandingcollections/HTMLColorTest.java +++ b/moreaboutcollections/HTMLColorTest.java @@ -1,4 +1,4 @@ -// understandingcollections/HTMLColorTest.java +// moreaboutcollections/HTMLColorTest.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/understandingcollections/IndividualTest.java b/moreaboutcollections/IndividualTest.java similarity index 93% rename from understandingcollections/IndividualTest.java rename to moreaboutcollections/IndividualTest.java index 444de1a91..d689b1906 100644 --- a/understandingcollections/IndividualTest.java +++ b/moreaboutcollections/IndividualTest.java @@ -1,4 +1,4 @@ -// understandingcollections/IndividualTest.java +// moreaboutcollections/IndividualTest.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/understandingcollections/LinkedHashMapDemo.java b/moreaboutcollections/LinkedHashMapDemo.java similarity index 95% rename from understandingcollections/LinkedHashMapDemo.java rename to moreaboutcollections/LinkedHashMapDemo.java index 9691d7710..bbf7d4ba7 100644 --- a/understandingcollections/LinkedHashMapDemo.java +++ b/moreaboutcollections/LinkedHashMapDemo.java @@ -1,4 +1,4 @@ -// understandingcollections/LinkedHashMapDemo.java +// moreaboutcollections/LinkedHashMapDemo.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/understandingcollections/ListOps.java b/moreaboutcollections/ListOps.java similarity index 99% rename from understandingcollections/ListOps.java rename to moreaboutcollections/ListOps.java index 790b3f5aa..79a36532d 100644 --- a/understandingcollections/ListOps.java +++ b/moreaboutcollections/ListOps.java @@ -1,4 +1,4 @@ -// understandingcollections/ListOps.java +// moreaboutcollections/ListOps.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/understandingcollections/ListSortSearch.java b/moreaboutcollections/ListSortSearch.java similarity index 97% rename from understandingcollections/ListSortSearch.java rename to moreaboutcollections/ListSortSearch.java index 69d70d861..bee5dbf7a 100644 --- a/understandingcollections/ListSortSearch.java +++ b/moreaboutcollections/ListSortSearch.java @@ -1,4 +1,4 @@ -// understandingcollections/ListSortSearch.java +// moreaboutcollections/ListSortSearch.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/understandingcollections/MapEntry.java b/moreaboutcollections/MapEntry.java similarity index 96% rename from understandingcollections/MapEntry.java rename to moreaboutcollections/MapEntry.java index 207ea7c4f..acef2b778 100644 --- a/understandingcollections/MapEntry.java +++ b/moreaboutcollections/MapEntry.java @@ -1,4 +1,4 @@ -// understandingcollections/MapEntry.java +// moreaboutcollections/MapEntry.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/understandingcollections/MapOps.java b/moreaboutcollections/MapOps.java similarity index 98% rename from understandingcollections/MapOps.java rename to moreaboutcollections/MapOps.java index 6ad5ab704..512842d85 100644 --- a/understandingcollections/MapOps.java +++ b/moreaboutcollections/MapOps.java @@ -1,4 +1,4 @@ -// understandingcollections/MapOps.java +// moreaboutcollections/MapOps.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/understandingcollections/NavMap.java b/moreaboutcollections/NavMap.java similarity index 98% rename from understandingcollections/NavMap.java rename to moreaboutcollections/NavMap.java index 74e4739fc..9fbc11d23 100644 --- a/understandingcollections/NavMap.java +++ b/moreaboutcollections/NavMap.java @@ -1,4 +1,4 @@ -// understandingcollections/NavMap.java +// moreaboutcollections/NavMap.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/understandingcollections/Prediction.java b/moreaboutcollections/Prediction.java similarity index 92% rename from understandingcollections/Prediction.java rename to moreaboutcollections/Prediction.java index 72d3b340d..db41724b7 100644 --- a/understandingcollections/Prediction.java +++ b/moreaboutcollections/Prediction.java @@ -1,4 +1,4 @@ -// understandingcollections/Prediction.java +// moreaboutcollections/Prediction.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/understandingcollections/QueueBehavior.java b/moreaboutcollections/QueueBehavior.java similarity index 96% rename from understandingcollections/QueueBehavior.java rename to moreaboutcollections/QueueBehavior.java index ada68969c..c29c03274 100644 --- a/understandingcollections/QueueBehavior.java +++ b/moreaboutcollections/QueueBehavior.java @@ -1,4 +1,4 @@ -// understandingcollections/QueueBehavior.java +// moreaboutcollections/QueueBehavior.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/understandingcollections/ReadOnly.java b/moreaboutcollections/ReadOnly.java similarity index 97% rename from understandingcollections/ReadOnly.java rename to moreaboutcollections/ReadOnly.java index 275805e38..bd4a113fa 100644 --- a/understandingcollections/ReadOnly.java +++ b/moreaboutcollections/ReadOnly.java @@ -1,4 +1,4 @@ -// understandingcollections/ReadOnly.java +// moreaboutcollections/ReadOnly.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/understandingcollections/References.java b/moreaboutcollections/References.java similarity index 98% rename from understandingcollections/References.java rename to moreaboutcollections/References.java index 73491ffa8..2da197a58 100644 --- a/understandingcollections/References.java +++ b/moreaboutcollections/References.java @@ -1,4 +1,4 @@ -// understandingcollections/References.java +// moreaboutcollections/References.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/understandingcollections/SetOrder.java b/moreaboutcollections/SetOrder.java similarity index 97% rename from understandingcollections/SetOrder.java rename to moreaboutcollections/SetOrder.java index 2ca1a832a..b8fdf6ca2 100644 --- a/understandingcollections/SetOrder.java +++ b/moreaboutcollections/SetOrder.java @@ -1,4 +1,4 @@ -// understandingcollections/SetOrder.java +// moreaboutcollections/SetOrder.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/understandingcollections/SimpleDeques.java b/moreaboutcollections/SimpleDeques.java similarity index 97% rename from understandingcollections/SimpleDeques.java rename to moreaboutcollections/SimpleDeques.java index fd88a07e0..8e07f5877 100644 --- a/understandingcollections/SimpleDeques.java +++ b/moreaboutcollections/SimpleDeques.java @@ -1,4 +1,4 @@ -// understandingcollections/SimpleDeques.java +// moreaboutcollections/SimpleDeques.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/understandingcollections/SimpleHashMap.java b/moreaboutcollections/SimpleHashMap.java similarity index 98% rename from understandingcollections/SimpleHashMap.java rename to moreaboutcollections/SimpleHashMap.java index 49bffd5ba..194dc808f 100644 --- a/understandingcollections/SimpleHashMap.java +++ b/moreaboutcollections/SimpleHashMap.java @@ -1,4 +1,4 @@ -// understandingcollections/SimpleHashMap.java +// moreaboutcollections/SimpleHashMap.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/understandingcollections/SlowMap.java b/moreaboutcollections/SlowMap.java similarity index 97% rename from understandingcollections/SlowMap.java rename to moreaboutcollections/SlowMap.java index 1005b2563..25dd81908 100644 --- a/understandingcollections/SlowMap.java +++ b/moreaboutcollections/SlowMap.java @@ -1,4 +1,4 @@ -// understandingcollections/SlowMap.java +// moreaboutcollections/SlowMap.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/understandingcollections/SortedMapDemo.java b/moreaboutcollections/SortedMapDemo.java similarity index 96% rename from understandingcollections/SortedMapDemo.java rename to moreaboutcollections/SortedMapDemo.java index 36a5e7fda..1fe931fe8 100644 --- a/understandingcollections/SortedMapDemo.java +++ b/moreaboutcollections/SortedMapDemo.java @@ -1,4 +1,4 @@ -// understandingcollections/SortedMapDemo.java +// moreaboutcollections/SortedMapDemo.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/understandingcollections/SortedSetDemo.java b/moreaboutcollections/SortedSetDemo.java similarity index 96% rename from understandingcollections/SortedSetDemo.java rename to moreaboutcollections/SortedSetDemo.java index c86590bda..0802a2bdc 100644 --- a/understandingcollections/SortedSetDemo.java +++ b/moreaboutcollections/SortedSetDemo.java @@ -1,4 +1,4 @@ -// understandingcollections/SortedSetDemo.java +// moreaboutcollections/SortedSetDemo.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/understandingcollections/SpringDetector.java b/moreaboutcollections/SpringDetector.java similarity index 96% rename from understandingcollections/SpringDetector.java rename to moreaboutcollections/SpringDetector.java index 486ee232a..7295cd5da 100644 --- a/understandingcollections/SpringDetector.java +++ b/moreaboutcollections/SpringDetector.java @@ -1,4 +1,4 @@ -// understandingcollections/SpringDetector.java +// moreaboutcollections/SpringDetector.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/understandingcollections/SpringDetector2.java b/moreaboutcollections/SpringDetector2.java similarity index 93% rename from understandingcollections/SpringDetector2.java rename to moreaboutcollections/SpringDetector2.java index da46945a3..16c6f7082 100644 --- a/understandingcollections/SpringDetector2.java +++ b/moreaboutcollections/SpringDetector2.java @@ -1,4 +1,4 @@ -// understandingcollections/SpringDetector2.java +// moreaboutcollections/SpringDetector2.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/understandingcollections/Stacks.java b/moreaboutcollections/Stacks.java similarity index 98% rename from understandingcollections/Stacks.java rename to moreaboutcollections/Stacks.java index 8c315ac16..7821956dc 100644 --- a/understandingcollections/Stacks.java +++ b/moreaboutcollections/Stacks.java @@ -1,4 +1,4 @@ -// understandingcollections/Stacks.java +// moreaboutcollections/Stacks.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/understandingcollections/StreamFillMaps.java b/moreaboutcollections/StreamFillMaps.java similarity index 96% rename from understandingcollections/StreamFillMaps.java rename to moreaboutcollections/StreamFillMaps.java index 7f1f32d78..0cfb4c103 100644 --- a/understandingcollections/StreamFillMaps.java +++ b/moreaboutcollections/StreamFillMaps.java @@ -1,4 +1,4 @@ -// understandingcollections/StreamFillMaps.java +// moreaboutcollections/StreamFillMaps.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/understandingcollections/StringHashCode.java b/moreaboutcollections/StringHashCode.java similarity index 89% rename from understandingcollections/StringHashCode.java rename to moreaboutcollections/StringHashCode.java index 813e7b951..314c5eab6 100644 --- a/understandingcollections/StringHashCode.java +++ b/moreaboutcollections/StringHashCode.java @@ -1,4 +1,4 @@ -// understandingcollections/StringHashCode.java +// moreaboutcollections/StringHashCode.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/understandingcollections/SuppliersCollectionTest.java b/moreaboutcollections/SuppliersCollectionTest.java similarity index 97% rename from understandingcollections/SuppliersCollectionTest.java rename to moreaboutcollections/SuppliersCollectionTest.java index 678705904..3d75a07e4 100644 --- a/understandingcollections/SuppliersCollectionTest.java +++ b/moreaboutcollections/SuppliersCollectionTest.java @@ -1,4 +1,4 @@ -// understandingcollections/SuppliersCollectionTest.java +// moreaboutcollections/SuppliersCollectionTest.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/understandingcollections/Synchronization.java b/moreaboutcollections/Synchronization.java similarity index 94% rename from understandingcollections/Synchronization.java rename to moreaboutcollections/Synchronization.java index 47bf28248..2a4ba708f 100644 --- a/understandingcollections/Synchronization.java +++ b/moreaboutcollections/Synchronization.java @@ -1,4 +1,4 @@ -// understandingcollections/Synchronization.java +// moreaboutcollections/Synchronization.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/understandingcollections/ToDoList.java b/moreaboutcollections/ToDoList.java similarity index 97% rename from understandingcollections/ToDoList.java rename to moreaboutcollections/ToDoList.java index 44678b6ee..7d669a280 100644 --- a/understandingcollections/ToDoList.java +++ b/moreaboutcollections/ToDoList.java @@ -1,4 +1,4 @@ -// understandingcollections/ToDoList.java +// moreaboutcollections/ToDoList.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/understandingcollections/TypesForSets.java b/moreaboutcollections/TypesForSets.java similarity index 98% rename from understandingcollections/TypesForSets.java rename to moreaboutcollections/TypesForSets.java index 33ebe1298..f74ac9094 100644 --- a/understandingcollections/TypesForSets.java +++ b/moreaboutcollections/TypesForSets.java @@ -1,4 +1,4 @@ -// understandingcollections/TypesForSets.java +// moreaboutcollections/TypesForSets.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/understandingcollections/Unsupported.java b/moreaboutcollections/Unsupported.java similarity index 98% rename from understandingcollections/Unsupported.java rename to moreaboutcollections/Unsupported.java index cfa2ca774..e9fd9ca6c 100644 --- a/understandingcollections/Unsupported.java +++ b/moreaboutcollections/Unsupported.java @@ -1,4 +1,4 @@ -// understandingcollections/Unsupported.java +// moreaboutcollections/Unsupported.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/understandingcollections/Utilities.java b/moreaboutcollections/Utilities.java similarity index 98% rename from understandingcollections/Utilities.java rename to moreaboutcollections/Utilities.java index 869280585..6254c13cc 100644 --- a/understandingcollections/Utilities.java +++ b/moreaboutcollections/Utilities.java @@ -1,4 +1,4 @@ -// understandingcollections/Utilities.java +// moreaboutcollections/Utilities.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/understandingcollections/jmh/Deques.java b/moreaboutcollections/jmh/Deques.java similarity index 97% rename from understandingcollections/jmh/Deques.java rename to moreaboutcollections/jmh/Deques.java index c124bcf37..c31053e54 100644 --- a/understandingcollections/jmh/Deques.java +++ b/moreaboutcollections/jmh/Deques.java @@ -1,4 +1,4 @@ -// understandingcollections/jmh/Deques.java +// moreaboutcollections/jmh/Deques.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/understandingcollections/jmh/Lists.java b/moreaboutcollections/jmh/Lists.java similarity index 98% rename from understandingcollections/jmh/Lists.java rename to moreaboutcollections/jmh/Lists.java index 7cb1e566c..e835d106c 100644 --- a/understandingcollections/jmh/Lists.java +++ b/moreaboutcollections/jmh/Lists.java @@ -1,4 +1,4 @@ -// understandingcollections/jmh/Lists.java +// moreaboutcollections/jmh/Lists.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/understandingcollections/jmh/Maps.java b/moreaboutcollections/jmh/Maps.java similarity index 97% rename from understandingcollections/jmh/Maps.java rename to moreaboutcollections/jmh/Maps.java index 9edcba338..3aac24b43 100644 --- a/understandingcollections/jmh/Maps.java +++ b/moreaboutcollections/jmh/Maps.java @@ -1,4 +1,4 @@ -// understandingcollections/jmh/Maps.java +// moreaboutcollections/jmh/Maps.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/understandingcollections/jmh/Queues.java b/moreaboutcollections/jmh/Queues.java similarity index 97% rename from understandingcollections/jmh/Queues.java rename to moreaboutcollections/jmh/Queues.java index 2cd61f8d4..4550f1625 100644 --- a/understandingcollections/jmh/Queues.java +++ b/moreaboutcollections/jmh/Queues.java @@ -1,4 +1,4 @@ -// understandingcollections/jmh/Queues.java +// moreaboutcollections/jmh/Queues.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/understandingcollections/jmh/Sets.java b/moreaboutcollections/jmh/Sets.java similarity index 97% rename from understandingcollections/jmh/Sets.java rename to moreaboutcollections/jmh/Sets.java index 3f3bf5a37..47c42939c 100644 --- a/understandingcollections/jmh/Sets.java +++ b/moreaboutcollections/jmh/Sets.java @@ -1,4 +1,4 @@ -// understandingcollections/jmh/Sets.java +// moreaboutcollections/jmh/Sets.java // (c)2016 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. From 8803c2ff77e4b21c97d03a6c92deda1745dc93a0 Mon Sep 17 00:00:00 2001 From: Bruce Eckel Date: Fri, 30 Dec 2016 17:23:13 -0800 Subject: [PATCH 175/320] Date change --- annotations/AtUnitComposition.java | 2 +- annotations/AtUnitExample1.java | 2 +- annotations/AtUnitExample2.java | 2 +- annotations/AtUnitExample3.java | 2 +- annotations/AtUnitExample4.java | 2 +- annotations/AtUnitExample5.java | 2 +- annotations/AtUnitExternalTest.java | 2 +- annotations/HashSetTest.java | 2 +- annotations/PasswordUtils.java | 2 +- annotations/SimulatingNull.java | 2 +- annotations/StackL.java | 2 +- annotations/StackLStringTest.java | 2 +- annotations/Testable.java | 2 +- annotations/UseCase.java | 2 +- annotations/UseCaseTracker.java | 2 +- annotations/database/Constraints.java | 2 +- annotations/database/DBTable.java | 2 +- annotations/database/Member.java | 2 +- annotations/database/SQLInteger.java | 2 +- annotations/database/SQLString.java | 2 +- annotations/database/TableCreator.java | 2 +- annotations/database/Uniqueness.java | 2 +- annotations/ifx/ExtractInterface.java | 2 +- annotations/ifx/IfaceExtractorProcessor.java | 2 +- annotations/ifx/Multiplier.java | 2 +- annotations/simplest/Simple.java | 2 +- annotations/simplest/SimpleProcessor.java | 2 +- annotations/simplest/SimpleTest.java | 2 +- arrays/AlphabeticSearch.java | 2 +- arrays/ArrayCopying.java | 2 +- arrays/ArrayOfGenericType.java | 2 +- arrays/ArrayOfGenerics.java | 2 +- arrays/ArrayOptions.java | 2 +- arrays/ArraySearching.java | 2 +- arrays/AssemblingMultidimensionalArrays.java | 2 +- arrays/AutoboxingArrays.java | 2 +- arrays/CollectionComparison.java | 2 +- arrays/CompType.java | 2 +- arrays/ComparatorTest.java | 2 +- arrays/ComparingArrays.java | 2 +- arrays/CountUpward.java | 2 +- arrays/FillingArrays.java | 2 +- arrays/IceCreamFlavors.java | 2 +- arrays/ModifyExisting.java | 2 +- arrays/MultiDimWrapperArray.java | 2 +- arrays/MultidimensionalObjectArrays.java | 2 +- arrays/MultidimensionalPrimitiveArray.java | 2 +- arrays/ParallelPrefix1.java | 2 +- arrays/ParallelPrefix2.java | 2 +- arrays/ParallelPrefix3.java | 2 +- arrays/ParallelSetAll.java | 2 +- arrays/ParameterizedArrayType.java | 2 +- arrays/PythonLists.py | 2 +- arrays/RaggedArray.java | 2 +- arrays/Reverse.java | 2 +- arrays/SimpleSetAll.java | 2 +- arrays/StreamFromArray.java | 2 +- arrays/StringSorting.java | 2 +- arrays/TestConvertTo.java | 2 +- arrays/TestCount.java | 2 +- arrays/TestRand.java | 2 +- arrays/ThreeDWithNew.java | 2 +- arrays/jmh/ParallelSort.java | 2 +- collections/AdapterMethodIdiom.java | 2 +- collections/AddingGroups.java | 2 +- collections/ApplesAndOrangesWithGenerics.java | 2 +- collections/ApplesAndOrangesWithoutGenerics.java | 2 +- collections/ArrayIsNotIterable.java | 2 +- collections/AsListInference.java | 2 +- collections/CollectionDifferences.java | 2 +- collections/CollectionSequence.java | 2 +- collections/CrossCollectionIteration.java | 2 +- collections/CrossCollectionIteration2.java | 2 +- collections/EnvironmentVariables.java | 2 +- collections/ForInCollections.java | 2 +- collections/GenericsAndUpcasting.java | 2 +- collections/InterfaceVsIterator.java | 2 +- collections/IterableClass.java | 2 +- collections/LinkedListFeatures.java | 2 +- collections/ListFeatures.java | 2 +- collections/ListIteration.java | 2 +- collections/MapOfList.java | 2 +- collections/ModifyingArraysAsList.java | 2 +- collections/MultiIterableClass.java | 2 +- collections/NonCollectionSequence.java | 2 +- collections/PetMap.java | 2 +- collections/PrintingCollections.java | 2 +- collections/PriorityQueueDemo.java | 2 +- collections/QueueDemo.java | 2 +- collections/SetOfInteger.java | 2 +- collections/SetOfString.java | 2 +- collections/SetOperations.java | 2 +- collections/SimpleCollection.java | 2 +- collections/SimpleIteration.java | 2 +- collections/SortedSetOfString.java | 2 +- collections/StackCollision.java | 2 +- collections/StackTest.java | 2 +- collections/StackTest2.java | 2 +- collections/Statistics.java | 2 +- collections/UniqueWords.java | 2 +- collections/UniqueWordsAlphabetic.java | 2 +- com/mindviewinc/simple/List.java | 2 +- com/mindviewinc/simple/Vector.java | 2 +- compression/GZIPcompress.java | 2 +- compression/ZipCompress.java | 2 +- concurrent/Baked.java | 2 +- concurrent/Batter.java | 2 +- concurrent/Breakable.java | 2 +- concurrent/CachedThreadPool.java | 2 +- concurrent/CachedThreadPool2.java | 2 +- concurrent/CachedThreadPool3.java | 2 +- concurrent/CatchCompletableExceptions.java | 2 +- concurrent/CollectionIntoStream.java | 2 +- concurrent/CompletableApply.java | 2 +- concurrent/CompletableApplyAsync.java | 2 +- concurrent/CompletableApplyChained.java | 2 +- concurrent/CompletableExceptions.java | 2 +- concurrent/CompletableOperations.java | 2 +- concurrent/CompletablePizza.java | 2 +- concurrent/CompletedMachina.java | 2 +- concurrent/CountingStream.java | 2 +- concurrent/CountingTask.java | 2 +- concurrent/DiningPhilosophers.java | 2 +- concurrent/DualCompletableOperations.java | 2 +- concurrent/FrostedCake.java | 2 +- concurrent/Futures.java | 2 +- concurrent/InterferingTask.java | 2 +- concurrent/LambdasAndMethodReferences.java | 2 +- concurrent/Machina.java | 2 +- concurrent/MoreTasksAfterShutdown.java | 2 +- concurrent/NapTask.java | 2 +- concurrent/OnePizza.java | 2 +- concurrent/ParallelPrime.java | 2 +- concurrent/ParallelStreamPuzzle.java | 2 +- concurrent/ParallelStreamPuzzle2.java | 2 +- concurrent/ParallelStreamPuzzle3.java | 2 +- concurrent/Philosopher.java | 2 +- concurrent/Pizza.java | 2 +- concurrent/PizzaParallelSteps.java | 2 +- concurrent/PizzaStreams.java | 2 +- concurrent/QuittableTask.java | 2 +- concurrent/QuittingTasks.java | 2 +- concurrent/SingleThreadExecutor.java | 2 +- concurrent/SingleThreadExecutor2.java | 2 +- concurrent/SingleThreadExecutor3.java | 2 +- concurrent/StickHolder.java | 2 +- concurrent/Summing.java | 2 +- concurrent/Summing2.java | 2 +- concurrent/Summing3.java | 2 +- concurrent/Summing4.java | 2 +- concurrent/Workable.java | 2 +- control/BreakAndContinue.java | 2 +- control/CommaOperator.java | 2 +- control/ForInFloat.java | 2 +- control/ForInInt.java | 2 +- control/ForInString.java | 2 +- control/IfElse.java | 2 +- control/LabeledFor.java | 2 +- control/LabeledWhile.java | 2 +- control/ListCharacters.java | 2 +- control/RandomBounds.java | 2 +- control/StringSwitch.java | 2 +- control/TestWithReturn.java | 2 +- control/TrueFalse.java | 2 +- control/VowelsAndConsonants.java | 2 +- control/WhileTest.java | 2 +- enums/AlarmPoints.java | 2 +- enums/BigEnumSet.java | 2 +- enums/Burrito2.java | 2 +- enums/CarWash.java | 2 +- enums/Competitor.java | 2 +- enums/ConstantSpecificMethod.java | 2 +- enums/EnumClass.java | 2 +- enums/EnumMaps.java | 2 +- enums/EnumSets.java | 2 +- enums/Input.java | 2 +- enums/NonEnum.java | 2 +- enums/NotClasses.java | 2 +- enums/Outcome.java | 2 +- enums/OverrideConstantSpecific.java | 2 +- enums/OzWitch.java | 2 +- enums/PostOffice.java | 2 +- enums/RandomTest.java | 2 +- enums/Reflection.java | 2 +- enums/RoShamBo.java | 2 +- enums/RoShamBo1.java | 2 +- enums/RoShamBo2.java | 2 +- enums/RoShamBo3.java | 2 +- enums/RoShamBo4.java | 2 +- enums/RoShamBo5.java | 2 +- enums/RoShamBo6.java | 2 +- enums/SecurityCategory.java | 2 +- enums/SpaceShip.java | 2 +- enums/SpicinessEnum.java | 2 +- enums/TrafficLight.java | 2 +- enums/UpcastEnum.java | 2 +- enums/VendingMachine.java | 2 +- enums/cartoons/EnumImplementation.java | 2 +- enums/menu/Course.java | 2 +- enums/menu/Food.java | 2 +- enums/menu/Meal.java | 2 +- enums/menu/Meal2.java | 2 +- enums/menu/TypeOfFood.java | 2 +- exceptions/AlwaysFinally.java | 2 +- exceptions/AutoCloseableDetails.java | 2 +- exceptions/BodyException.java | 2 +- exceptions/Cleanup.java | 2 +- exceptions/CleanupIdiom.java | 2 +- exceptions/CloseExceptions.java | 2 +- exceptions/ConstructorException.java | 2 +- exceptions/DynamicFields.java | 2 +- exceptions/ExceptionMethods.java | 2 +- exceptions/ExceptionSilencer.java | 2 +- exceptions/ExtraFeatures.java | 2 +- exceptions/FinallyWorks.java | 2 +- exceptions/FullConstructors.java | 2 +- exceptions/Human.java | 2 +- exceptions/InheritingExceptions.java | 2 +- exceptions/InputFile.java | 2 +- exceptions/InputFile2.java | 2 +- exceptions/LoggingExceptions.java | 2 +- exceptions/LoggingExceptions2.java | 2 +- exceptions/LostMessage.java | 2 +- exceptions/MainException.java | 2 +- exceptions/MessyExceptions.java | 2 +- exceptions/MultiCatch.java | 2 +- exceptions/MultiCatch2.java | 2 +- exceptions/MultipleReturns.java | 2 +- exceptions/NeverCaught.java | 2 +- exceptions/OnOffException1.java | 2 +- exceptions/OnOffException2.java | 2 +- exceptions/OnOffSwitch.java | 2 +- exceptions/PreciseRethrow.java | 2 +- exceptions/RethrowNew.java | 2 +- exceptions/Rethrowing.java | 2 +- exceptions/SameHandler.java | 2 +- exceptions/StormyInning.java | 2 +- exceptions/StreamsAreAutoCloseable.java | 2 +- exceptions/Switch.java | 2 +- exceptions/TryAnything.java | 2 +- exceptions/TryWithResources.java | 2 +- exceptions/TurnOffChecking.java | 2 +- exceptions/WhoCalled.java | 2 +- exceptions/WithFinally.java | 2 +- files/AddAndSubtractPaths.java | 2 +- files/Directories.java | 2 +- files/FileSystemDemo.java | 2 +- files/Find.java | 2 +- files/ListOfLines.java | 2 +- files/PartsOfPaths.java | 2 +- files/PathAnalysis.java | 2 +- files/PathInfo.java | 2 +- files/PathWatcher.java | 2 +- files/ReadLineStream.java | 2 +- files/StreamInAndOut.java | 2 +- files/TreeWatcher.java | 2 +- files/Writing.java | 2 +- functional/AnonymousClosure.java | 2 +- functional/BiConsumerPermutations.java | 2 +- functional/ClassFunctionals.java | 2 +- functional/Closure1.java | 2 +- functional/Closure2.java | 2 +- functional/Closure3.java | 2 +- functional/Closure4.java | 2 +- functional/Closure5.java | 2 +- functional/Closure6.java | 2 +- functional/Closure7.java | 2 +- functional/Closure8.java | 2 +- functional/Closure9.java | 2 +- functional/ConsumeFunction.java | 2 +- functional/CtorReference.java | 2 +- functional/CurriedIntAdd.java | 2 +- functional/Curry3Args.java | 2 +- functional/CurryingAndPartials.java | 2 +- functional/FunctionComposition.java | 2 +- functional/FunctionVariants.java | 2 +- functional/FunctionWithWrapped.java | 2 +- functional/FunctionalAnnotation.java | 2 +- functional/IntCall.java | 2 +- functional/LambdaExpressions.java | 2 +- functional/MethodConversion.java | 2 +- functional/MethodReferences.java | 2 +- functional/MultiUnbound.java | 2 +- functional/PredicateComposition.java | 2 +- functional/ProduceFunction.java | 2 +- functional/RecursiveFactorial.java | 2 +- functional/RecursiveFibonacci.java | 2 +- functional/RunnableMethodReference.java | 2 +- functional/SharedStorage.java | 2 +- functional/Strategize.java | 2 +- functional/TransformFunction.java | 2 +- functional/TriFunction.java | 2 +- functional/TriFunctionTest.java | 2 +- functional/UnboundMethodReference.java | 2 +- generics/Amphibian.java | 2 +- generics/Apply.java | 2 +- generics/ApplyFunctional.java | 2 +- generics/ApplyTest.java | 2 +- generics/ArrayMaker.java | 2 +- generics/ArrayOfGeneric.java | 2 +- generics/ArrayOfGenericReference.java | 2 +- generics/BankTeller.java | 2 +- generics/BasicBounds.java | 2 +- generics/BasicHolder.java | 2 +- generics/BasicSupplierDemo.java | 2 +- generics/ByteSet.java | 2 +- generics/CRGWithBasicHolder.java | 2 +- generics/CaptureConversion.java | 2 +- generics/CheckedList.java | 2 +- generics/ClassCasting.java | 2 +- generics/ClassTypeCapture.java | 2 +- generics/ComparablePet.java | 2 +- generics/CompilerIntelligence.java | 2 +- generics/CountedObject.java | 2 +- generics/CovariantArrays.java | 2 +- generics/CovariantReturnTypes.java | 2 +- generics/CreatorGeneric.java | 2 +- generics/CuriouslyRecurringGeneric.java | 2 +- generics/Diamond.java | 2 +- generics/DogsAndRobotMethodReferences.java | 2 +- generics/DogsAndRobots.cpp | 2 +- generics/DogsAndRobots.java | 2 +- generics/DogsAndRobots.py | 2 +- generics/DynamicProxyMixin.java | 2 +- generics/EpicBattle.java | 2 +- generics/Erased.java | 2 +- generics/ErasedTypeEquivalence.java | 2 +- generics/ErasureAndInheritance.java | 2 +- generics/FactoryConstraint.java | 2 +- generics/Fibonacci.java | 2 +- generics/FilledList.java | 2 +- generics/GenericArray.java | 2 +- generics/GenericArray2.java | 2 +- generics/GenericArrayWithTypeToken.java | 2 +- generics/GenericCast.java | 2 +- generics/GenericHolder.java | 2 +- generics/GenericHolder2.java | 2 +- generics/GenericMethods.java | 2 +- generics/GenericReading.java | 2 +- generics/GenericVarargs.java | 2 +- generics/GenericsAndCovariance.java | 2 +- generics/GenericsAndReturnTypes.java | 2 +- generics/HasF.java | 2 +- generics/HijackedInterface.java | 2 +- generics/Holder.java | 2 +- generics/Holder1.java | 2 +- generics/InheritBounds.java | 2 +- generics/InstantiateGenericType.cpp | 2 +- generics/InstantiateGenericType.java | 2 +- generics/IterableFibonacci.java | 2 +- generics/LatentReflection.java | 2 +- generics/LinkedStack.java | 2 +- generics/ListMaker.java | 2 +- generics/ListOfGenerics.java | 2 +- generics/ListOfInt.java | 2 +- generics/LostInformation.java | 2 +- generics/Manipulation.java | 2 +- generics/Manipulator2.java | 2 +- generics/Manipulator3.java | 2 +- generics/Mixins.cpp | 2 +- generics/Mixins.java | 2 +- generics/MultipleInterfaceVariants.java | 2 +- generics/NeedCasting.java | 2 +- generics/NonCovariantGenerics.java | 2 +- generics/NotSelfBounded.java | 2 +- generics/ObjectHolder.java | 2 +- generics/OrdinaryArguments.java | 2 +- generics/Performs.java | 2 +- generics/PlainGenericInheritance.java | 2 +- generics/PrimitiveGenericTest.java | 2 +- generics/RandomList.java | 2 +- generics/RestrictedComparablePets.java | 2 +- generics/ReturnGenericType.java | 2 +- generics/SelfBounding.java | 2 +- generics/SelfBoundingAndCovariantArguments.java | 2 +- generics/SelfBoundingMethods.java | 2 +- generics/Shape.java | 2 +- generics/SimpleDogsAndRobots.java | 2 +- generics/SimpleHolder.java | 2 +- generics/SimpleQueue.java | 2 +- generics/Square.java | 2 +- generics/Store.java | 2 +- generics/SuperTypeWildcards.java | 2 +- generics/Templates.cpp | 2 +- generics/ThrowGenericException.java | 2 +- generics/TupleList.java | 2 +- generics/TupleTest.java | 2 +- generics/TupleTest2.java | 2 +- generics/UnboundedWildcards1.java | 2 +- generics/UnboundedWildcards2.java | 2 +- generics/Unconstrained.java | 2 +- generics/UseList.java | 2 +- generics/UseList2.java | 2 +- generics/Vehicle.java | 2 +- generics/WatercolorSets.java | 2 +- generics/Wildcards.java | 2 +- generics/coffee/Americano.java | 2 +- generics/coffee/Breve.java | 2 +- generics/coffee/Cappuccino.java | 2 +- generics/coffee/Coffee.java | 2 +- generics/coffee/CoffeeSupplier.java | 2 +- generics/coffee/Latte.java | 2 +- generics/coffee/Mocha.java | 2 +- generics/decorator/Decoration.java | 2 +- generics/dogsandrobots.go | 2 +- generics/watercolors/Watercolors.java | 2 +- hiding/Cake.java | 2 +- hiding/ChocolateChip.java | 2 +- hiding/ChocolateChip2.java | 2 +- hiding/Dinner.java | 2 +- hiding/FullQualification.java | 2 +- hiding/IceCream.java | 2 +- hiding/ImportedMyClass.java | 2 +- hiding/LibTest.java | 2 +- hiding/Lunch.java | 2 +- hiding/OrganizedByAccess.java | 2 +- hiding/Pie.java | 2 +- hiding/QualifiedMyClass.java | 2 +- hiding/SingleImport.java | 2 +- hiding/cookie2/Cookie.java | 2 +- hiding/dessert/Cookie.java | 2 +- hiding/mypackage/MyClass.java | 2 +- housekeeping/Apricot.java | 2 +- housekeeping/ArrayClassObj.java | 2 +- housekeeping/ArrayInit.java | 2 +- housekeeping/ArrayNew.java | 2 +- housekeeping/ArraysOfPrimitives.java | 2 +- housekeeping/AutoboxingVarargs.java | 2 +- housekeeping/BananaPeel.java | 2 +- housekeeping/Burrito.java | 2 +- housekeeping/Counter.java | 2 +- housekeeping/DefaultConstructor.java | 2 +- housekeeping/Demotion.java | 2 +- housekeeping/DynamicArray.java | 2 +- housekeeping/EnumOrder.java | 2 +- housekeeping/ExplicitStatic.java | 2 +- housekeeping/Flower.java | 2 +- housekeeping/InitialValues.java | 2 +- housekeeping/InitialValues2.java | 2 +- housekeeping/Leaf.java | 2 +- housekeeping/Measurement.java | 2 +- housekeeping/MethodInit.java | 2 +- housekeeping/MethodInit2.java | 2 +- housekeeping/MethodInit3.java | 2 +- housekeeping/Mugs.java | 2 +- housekeeping/NewVarArgs.java | 2 +- housekeeping/NoSynthesis.java | 2 +- housekeeping/OptionalTrailingArguments.java | 2 +- housekeeping/OrderOfInitialization.java | 2 +- housekeeping/Overloading.java | 2 +- housekeeping/OverloadingOrder.java | 2 +- housekeeping/OverloadingVarargs.java | 2 +- housekeeping/OverloadingVarargs2.java | 2 +- housekeeping/OverloadingVarargs3.java | 2 +- housekeeping/PassingThis.java | 2 +- housekeeping/PrimitiveOverloading.java | 2 +- housekeeping/SimpleConstructor.java | 2 +- housekeeping/SimpleConstructor2.java | 2 +- housekeeping/SimpleEnumUse.java | 2 +- housekeeping/Spiciness.java | 2 +- housekeeping/Spoon.java | 2 +- housekeeping/StaticInitialization.java | 2 +- housekeeping/TerminationCondition.java | 2 +- housekeeping/VarArgs.java | 2 +- housekeeping/VarargType.java | 2 +- innerclasses/AnonymousConstructor.java | 2 +- innerclasses/BigEgg.java | 2 +- innerclasses/BigEgg2.java | 2 +- innerclasses/Callbacks.java | 2 +- innerclasses/ClassInInterface.java | 2 +- innerclasses/Contents.java | 2 +- innerclasses/Destination.java | 2 +- innerclasses/DotNew.java | 2 +- innerclasses/DotThis.java | 2 +- innerclasses/GreenhouseController.java | 2 +- innerclasses/GreenhouseControls.java | 2 +- innerclasses/InheritInner.java | 2 +- innerclasses/LocalInnerClass.java | 2 +- innerclasses/MultiImplementation.java | 2 +- innerclasses/MultiNestingAccess.java | 2 +- innerclasses/Parcel1.java | 2 +- innerclasses/Parcel10.java | 2 +- innerclasses/Parcel11.java | 2 +- innerclasses/Parcel2.java | 2 +- innerclasses/Parcel3.java | 2 +- innerclasses/Parcel5.java | 2 +- innerclasses/Parcel6.java | 2 +- innerclasses/Parcel7.java | 2 +- innerclasses/Parcel7b.java | 2 +- innerclasses/Parcel8.java | 2 +- innerclasses/Parcel9.java | 2 +- innerclasses/Sequence.java | 2 +- innerclasses/TestBed.java | 2 +- innerclasses/TestParcel.java | 2 +- innerclasses/Wrapping.java | 2 +- innerclasses/controller/Controller.java | 2 +- innerclasses/controller/Event.java | 2 +- innerclasses/mui/MultiInterfaces.java | 2 +- interfaces/AbstractAccess.java | 2 +- interfaces/AbstractWithoutAbstracts.java | 2 +- interfaces/AdaptedRandomDoubles.java | 2 +- interfaces/Adventure.java | 2 +- interfaces/AnImplementation.java | 2 +- interfaces/AnInterface.java | 2 +- interfaces/Applicator.java | 2 +- interfaces/AttemptToUseBasic.java | 2 +- interfaces/Basic.java | 2 +- interfaces/Basic2.java | 2 +- interfaces/Factories.java | 2 +- interfaces/Games.java | 2 +- interfaces/HorrorShow.java | 2 +- interfaces/Implementation2.java | 2 +- interfaces/ImplementingAnInterface.java | 2 +- interfaces/Instantiable.java | 2 +- interfaces/InterfaceCollision.java | 2 +- interfaces/InterfaceWithDefault.java | 2 +- interfaces/Jim.java | 2 +- interfaces/MICollision.java | 2 +- interfaces/Machine.java | 2 +- interfaces/Months.java | 2 +- interfaces/MultipleInheritance.java | 2 +- interfaces/PureInterface.java | 2 +- interfaces/RandVals.java | 2 +- interfaces/RandomDoubles.java | 2 +- interfaces/RandomStrings.java | 2 +- interfaces/TestRandVals.java | 2 +- interfaces/filters/BandPass.java | 2 +- interfaces/filters/Filter.java | 2 +- interfaces/filters/HighPass.java | 2 +- interfaces/filters/LowPass.java | 2 +- interfaces/filters/Waveform.java | 2 +- interfaces/interfaceprocessor/Applicator.java | 2 +- interfaces/interfaceprocessor/FilterProcessor.java | 2 +- interfaces/interfaceprocessor/Processor.java | 2 +- interfaces/interfaceprocessor/StringProcessor.java | 2 +- interfaces/music4/Music4.java | 2 +- interfaces/music5/Music5.java | 2 +- interfaces/nesting/NestingInterfaces.java | 2 +- iostreams/BasicFileOutput.java | 2 +- iostreams/BufferedInputFile.java | 2 +- iostreams/FileOutputShortcut.java | 2 +- iostreams/FormattedMemoryInput.java | 2 +- iostreams/MemoryInput.java | 2 +- iostreams/StoringAndRecoveringData.java | 2 +- iostreams/TestEOF.java | 2 +- iostreams/UsingRandomAccessFile.java | 2 +- lowlevel/AtomicEvenSupplier.java | 2 +- lowlevel/AtomicIntegerTest.java | 2 +- lowlevel/Atomicity.java | 2 +- lowlevel/AtomicityTest.java | 2 +- lowlevel/AttemptLocking.java | 2 +- lowlevel/BankTellerSimulation.java | 2 +- lowlevel/CaptureUncaughtException.java | 2 +- lowlevel/CarBuilder.java | 2 +- lowlevel/CriticalSection.java | 2 +- lowlevel/DelayQueueDemo.java | 2 +- lowlevel/EvenChecker.java | 2 +- lowlevel/EvenSupplier.java | 2 +- lowlevel/ExceptionThread.java | 2 +- lowlevel/ExplicitCriticalSection.java | 2 +- lowlevel/GreenhouseScheduler.java | 2 +- lowlevel/HorseRace.java | 2 +- lowlevel/IntSupplier.java | 2 +- lowlevel/MutexEvenSupplier.java | 2 +- lowlevel/NaiveExceptionHandling.java | 2 +- lowlevel/NumberOfProcessors.java | 2 +- lowlevel/PriorityBlockingQueueDemo.java | 2 +- lowlevel/QuittableTask.java | 2 +- lowlevel/QuittingTasks.java | 2 +- lowlevel/Restaurant.java | 2 +- lowlevel/SerialNumberChecker.java | 2 +- lowlevel/SerialNumberSupplier.java | 2 +- lowlevel/SettingDefaultHandler.java | 2 +- lowlevel/SwallowedException.java | 2 +- lowlevel/SyncObject.java | 2 +- lowlevel/SynchronizedEvenSupplier.java | 2 +- lowlevel/ThreadSize.java | 2 +- lowlevel/ToastOMatic.java | 2 +- lowlevel/WorkStealingPool.java | 2 +- lowlevel/restaurant2/RestaurantWithQueues.java | 2 +- moreaboutcollections/AssociativeArray.java | 2 +- moreaboutcollections/Bits.java | 2 +- moreaboutcollections/CanonicalMapping.java | 2 +- moreaboutcollections/CollectionMethods.java | 2 +- moreaboutcollections/CountedString.java | 2 +- moreaboutcollections/Enumerations.java | 2 +- moreaboutcollections/FailFast.java | 2 +- moreaboutcollections/FillMapTest.java | 2 +- moreaboutcollections/FillingLists.java | 2 +- moreaboutcollections/FunctionalMap.java | 2 +- moreaboutcollections/Groundhog.java | 2 +- moreaboutcollections/Groundhog2.java | 2 +- moreaboutcollections/HTMLColorTest.java | 2 +- moreaboutcollections/IndividualTest.java | 2 +- moreaboutcollections/LinkedHashMapDemo.java | 2 +- moreaboutcollections/ListOps.java | 2 +- moreaboutcollections/ListSortSearch.java | 2 +- moreaboutcollections/MapEntry.java | 2 +- moreaboutcollections/MapOps.java | 2 +- moreaboutcollections/NavMap.java | 2 +- moreaboutcollections/Prediction.java | 2 +- moreaboutcollections/QueueBehavior.java | 2 +- moreaboutcollections/ReadOnly.java | 2 +- moreaboutcollections/References.java | 2 +- moreaboutcollections/SetOrder.java | 2 +- moreaboutcollections/SimpleDeques.java | 2 +- moreaboutcollections/SimpleHashMap.java | 2 +- moreaboutcollections/SlowMap.java | 2 +- moreaboutcollections/SortedMapDemo.java | 2 +- moreaboutcollections/SortedSetDemo.java | 2 +- moreaboutcollections/SpringDetector.java | 2 +- moreaboutcollections/SpringDetector2.java | 2 +- moreaboutcollections/Stacks.java | 2 +- moreaboutcollections/StreamFillMaps.java | 2 +- moreaboutcollections/StringHashCode.java | 2 +- moreaboutcollections/SuppliersCollectionTest.java | 2 +- moreaboutcollections/Synchronization.java | 2 +- moreaboutcollections/ToDoList.java | 2 +- moreaboutcollections/TypesForSets.java | 2 +- moreaboutcollections/Unsupported.java | 2 +- moreaboutcollections/Utilities.java | 2 +- moreaboutcollections/jmh/Deques.java | 2 +- moreaboutcollections/jmh/Lists.java | 2 +- moreaboutcollections/jmh/Maps.java | 2 +- moreaboutcollections/jmh/Queues.java | 2 +- moreaboutcollections/jmh/Sets.java | 2 +- network/ChatterClient.java | 2 +- network/ChatterServer.java | 2 +- network/Dgram.java | 2 +- network/LocalHost.java | 2 +- network/MultiServer.java | 2 +- network/SimpleClient.java | 2 +- network/SimpleClient2.java | 2 +- network/SimpleServer.java | 2 +- network/WhoAmI.java | 2 +- network/tests/ChatterTest.java | 2 +- network/tests/MultiTest.java | 2 +- network/tests/TestSimpleServerClient.java | 2 +- newio/AvailableCharSets.java | 2 +- newio/BufferToText.java | 2 +- newio/ChannelCopy.java | 2 +- newio/Endians.java | 2 +- newio/FileLocking.java | 2 +- newio/GetData.java | 2 +- newio/IntBufferDemo.java | 2 +- newio/LargeMappedFiles.java | 2 +- newio/LockingMappedFiles.java | 2 +- newio/TransferTo.java | 2 +- newio/UsingBuffers.java | 2 +- newio/ViewBuffers.java | 2 +- objects/Documentation1.java | 2 +- objects/Documentation2.java | 2 +- objects/Documentation3.java | 2 +- objects/HelloDate.java | 2 +- objects/HelloDateDoc.java | 2 +- objects/ShowProperties.java | 2 +- onjava/ArrayShow.java | 2 +- onjava/BasicSupplier.java | 2 +- onjava/CollectionMethodDifferences.java | 2 +- onjava/ConvertTo.java | 2 +- onjava/Count.java | 2 +- onjava/CountMap.java | 2 +- onjava/CountingIntegerList.java | 2 +- onjava/Countries.java | 2 +- onjava/Enums.java | 2 +- onjava/FillMap.java | 2 +- onjava/HTMLColors.java | 2 +- onjava/Hex.java | 2 +- onjava/MouseClick.java | 2 +- onjava/Nap.java | 2 +- onjava/Null.java | 2 +- onjava/OSExecute.java | 2 +- onjava/OSExecuteException.java | 2 +- onjava/Operations.java | 2 +- onjava/Pair.java | 2 +- onjava/ProcessFiles.java | 2 +- onjava/Rand.java | 2 +- onjava/Range.java | 2 +- onjava/Repeat.java | 2 +- onjava/RmDir.java | 2 +- onjava/Sets.java | 2 +- onjava/Stack.java | 2 +- onjava/Suppliers.java | 2 +- onjava/TimedAbort.java | 2 +- onjava/Timer.java | 2 +- onjava/Tuple.java | 2 +- onjava/Tuple2.java | 2 +- onjava/Tuple3.java | 2 +- onjava/Tuple4.java | 2 +- onjava/Tuple5.java | 2 +- onjava/TypeCounter.java | 2 +- onjava/atunit/AtUnit.java | 2 +- onjava/atunit/ClassNameFinder.java | 2 +- onjava/atunit/Test.java | 2 +- onjava/atunit/TestObjectCleanup.java | 2 +- onjava/atunit/TestObjectCreate.java | 2 +- onjava/atunit/TestProperty.java | 2 +- operators/AllOps.java | 2 +- operators/Assignment.java | 2 +- operators/AutoInc.java | 2 +- operators/BitManipulation.java | 2 +- operators/Bool.java | 2 +- operators/Casting.java | 2 +- operators/CastingNumbers.java | 2 +- operators/EqualsMethod.java | 2 +- operators/EqualsMethod2.java | 2 +- operators/Equivalence.java | 2 +- operators/Exponents.java | 2 +- operators/Literals.java | 2 +- operators/MathOps.java | 2 +- operators/Overflow.java | 2 +- operators/PassObject.java | 2 +- operators/Precedence.java | 2 +- operators/RoundingNumbers.java | 2 +- operators/ShortCircuit.java | 2 +- operators/StringOperators.java | 2 +- operators/TernaryIfElse.java | 2 +- operators/URShift.java | 2 +- operators/Underscores.java | 2 +- patterns/CommandPattern.java | 2 +- patterns/Facade.java | 2 +- patterns/PaperScissorsRock.java | 2 +- patterns/ProxyDemo.java | 2 +- patterns/ShapeFactory2.java | 2 +- patterns/StateDemo.java | 2 +- patterns/TemplateMethod.java | 2 +- patterns/absfactory/GameEnvironment.java | 2 +- patterns/adapt/Adapter.java | 2 +- patterns/chain/ChainOfResponsibility.java | 2 +- patterns/doubledispatch/Aluminum.java | 2 +- patterns/doubledispatch/Cardboard.java | 2 +- patterns/doubledispatch/DoubleDispatch.java | 2 +- patterns/doubledispatch/Glass.java | 2 +- patterns/doubledispatch/Paper.java | 2 +- patterns/doubledispatch/TypedBin.java | 2 +- patterns/doubledispatch/TypedBinMember.java | 2 +- patterns/dynatrash/DynaTrash.java | 2 +- patterns/factory/ShapeFactory1.java | 2 +- patterns/observer/ObservedFlower.java | 2 +- patterns/recyclea/RecycleA.java | 2 +- patterns/recycleb/RecycleB.java | 2 +- patterns/recyclec/RecycleC.java | 2 +- patterns/state/StateMachineDemo.java | 2 +- patterns/strategy/StrategyPattern.java | 2 +- patterns/strategy/StrategyPattern2.java | 2 +- patterns/trash/Aluminum.java | 2 +- patterns/trash/Cardboard.java | 2 +- patterns/trash/Fillable.java | 2 +- patterns/trash/FillableList.java | 2 +- patterns/trash/Glass.java | 2 +- patterns/trash/Paper.java | 2 +- patterns/trash/ParseTrash.java | 2 +- patterns/trash/Trash.java | 2 +- patterns/trashvisitor/Aluminum.java | 2 +- patterns/trashvisitor/Cardboard.java | 2 +- patterns/trashvisitor/Glass.java | 2 +- patterns/trashvisitor/Paper.java | 2 +- patterns/trashvisitor/TrashVisitor.java | 2 +- patterns/trashvisitor/Visitable.java | 2 +- patterns/trashvisitor/Visitor.java | 2 +- patterns/visitor/BeeAndFlowers.java | 2 +- patterns/visualobserver/BoxObserver.java | 2 +- polymorphism/CovariantReturn.java | 2 +- polymorphism/FieldAccess.java | 2 +- polymorphism/Frog.java | 2 +- polymorphism/PolyConstructors.java | 2 +- polymorphism/PrivateOverride.java | 2 +- polymorphism/PrivateOverride2.java | 2 +- polymorphism/RTTI.java | 2 +- polymorphism/ReferenceCounting.java | 2 +- polymorphism/Sandwich.java | 2 +- polymorphism/Shapes.java | 2 +- polymorphism/StaticPolymorphism.java | 2 +- polymorphism/Transmogrify.java | 2 +- polymorphism/music/Instrument.java | 2 +- polymorphism/music/Music.java | 2 +- polymorphism/music/Music2.java | 2 +- polymorphism/music/Note.java | 2 +- polymorphism/music/Wind.java | 2 +- polymorphism/music3/Music3.java | 2 +- polymorphism/shape/Circle.java | 2 +- polymorphism/shape/RandomShapes.java | 2 +- polymorphism/shape/Shape.java | 2 +- polymorphism/shape/Square.java | 2 +- polymorphism/shape/Triangle.java | 2 +- preferences/PreferencesDemo.java | 2 +- references/AddingClone.java | 2 +- references/Alias1.java | 2 +- references/Alias2.java | 2 +- references/CheckCloneable.java | 2 +- references/CloneArrayList.java | 2 +- references/Compete.java | 2 +- references/CopyConstructor.java | 2 +- references/DepthReading.java | 2 +- references/HorrorFlick.java | 2 +- references/Immutable1.java | 2 +- references/Immutable2.java | 2 +- references/ImmutableInteger.java | 2 +- references/ImmutableStrings.java | 2 +- references/MutableInteger.java | 2 +- references/OceanReading.java | 2 +- references/PassReferences.java | 2 +- references/SimplerMutableInteger.java | 2 +- references/Snake.java | 2 +- references/Stringer.java | 2 +- references/TemperatureReading.java | 2 +- references/tests/DeepCopyTest.java | 2 +- remote/DisplayPerfectTime.java | 2 +- remote/PerfectTime.java | 2 +- remote/PerfectTimeImpl.java | 2 +- remote/PerfectTimeServer.java | 2 +- reuse/Bath.java | 2 +- reuse/Beetle.java | 2 +- reuse/BlankFinal.java | 2 +- reuse/CADSystem.java | 2 +- reuse/Car.java | 2 +- reuse/Cartoon.java | 2 +- reuse/Chess.java | 2 +- reuse/DerivedSpaceShip.java | 2 +- reuse/Detergent.java | 2 +- reuse/FinalArguments.java | 2 +- reuse/FinalData.java | 2 +- reuse/FinalOverridingIllusion.java | 2 +- reuse/Hide.java | 2 +- reuse/Jurassic.java | 2 +- reuse/Lisa.java | 2 +- reuse/Orc.java | 2 +- reuse/PlaceSetting.java | 2 +- reuse/SpaceShipControls.java | 2 +- reuse/SpaceShipDelegation.java | 2 +- reuse/SprinklerSystem.java | 2 +- reuse/Wind.java | 2 +- serialization/APerson.java | 2 +- serialization/AStoreCADState.java | 2 +- serialization/Alien.java | 2 +- serialization/Blip3.java | 2 +- serialization/Blips.java | 2 +- serialization/FreezeAlien.java | 2 +- serialization/Logon.java | 2 +- serialization/MyWorld.java | 2 +- serialization/People.java | 2 +- serialization/RecoverCADState.java | 2 +- serialization/SerialCtl.java | 2 +- serialization/Worm.java | 2 +- serialization/xfiles/ThawAlien.java | 2 +- standardio/ChangeSystemOut.java | 2 +- standardio/Echo.java | 2 +- standardio/OSExecuteDemo.java | 2 +- standardio/Redirecting.java | 2 +- staticchecking/DogsAndRobots.cpp | 2 +- staticchecking/DogsAndRobots.py | 2 +- staticchecking/NoBasePetSpeak.py | 2 +- staticchecking/PetSpeak.py | 2 +- staticchecking/dogsandrobots.go | 2 +- staticchecking/dr/DogsAndRobots.java | 2 +- staticchecking/drc/DogAndRobotCollections.java | 2 +- staticchecking/latent/Latent.java | 2 +- staticchecking/petspeak.go | 2 +- staticchecking/petspeak/PetSpeak.java | 2 +- streams/ArrayStreams.java | 2 +- streams/Bubble.java | 2 +- streams/Bubbles.java | 2 +- streams/CollectionToStream.java | 2 +- streams/CreatingOptionals.java | 2 +- streams/Duplicator.java | 2 +- streams/Fibonacci.java | 2 +- streams/FileToWords.java | 2 +- streams/FileToWordsBuilder.java | 2 +- streams/FileToWordsRegexp.java | 2 +- streams/FileToWordsTest.java | 2 +- streams/FlatMap.java | 2 +- streams/ForEach.java | 2 +- streams/FunctionMap.java | 2 +- streams/FunctionMap2.java | 2 +- streams/FunctionMap3.java | 2 +- streams/Generator.java | 2 +- streams/ImperativeRandoms.java | 2 +- streams/Informational.java | 2 +- streams/LastElement.java | 2 +- streams/Looping.java | 2 +- streams/Machine2.java | 2 +- streams/MapCollector.java | 2 +- streams/Matching.java | 2 +- streams/NumericStreamInfo.java | 2 +- streams/OptionalBasics.java | 2 +- streams/OptionalFilter.java | 2 +- streams/OptionalFlatMap.java | 2 +- streams/OptionalMap.java | 2 +- streams/Optionals.java | 2 +- streams/OptionalsFromEmptyStreams.java | 2 +- streams/Peeking.java | 2 +- streams/Prime.java | 2 +- streams/RandInts.java | 2 +- streams/RandomGenerators.java | 2 +- streams/RandomWords.java | 2 +- streams/Randoms.java | 2 +- streams/Ranges.java | 2 +- streams/Reduce.java | 2 +- streams/SelectElement.java | 2 +- streams/Signal.java | 2 +- streams/SortedComparator.java | 2 +- streams/SpecialCollector.java | 2 +- streams/StreamOf.java | 2 +- streams/StreamOfOptionals.java | 2 +- streams/StreamOfRandoms.java | 2 +- streams/StreamOfStreams.java | 2 +- streams/TreeSetOfWords.java | 2 +- strings/ArrayListDisplay.java | 2 +- strings/BetterRead.java | 2 +- strings/Concatenation.java | 2 +- strings/Conversion.java | 2 +- strings/DatabaseException.java | 2 +- strings/Finding.java | 2 +- strings/Groups.java | 2 +- strings/Immutable.java | 2 +- strings/InfiniteRecursion.java | 2 +- strings/IntegerMatch.java | 2 +- strings/JGrep.java | 2 +- strings/ReFlags.java | 2 +- strings/ReceiptBuilder.java | 2 +- strings/Replacing.java | 2 +- strings/ReplacingStringTokenizer.java | 2 +- strings/Resetting.java | 2 +- strings/Rudolph.java | 2 +- strings/ScannerDelimiter.java | 2 +- strings/SimpleFormat.java | 2 +- strings/SimpleRead.java | 2 +- strings/SplitDemo.java | 2 +- strings/Splitting.java | 2 +- strings/StartEnd.java | 2 +- strings/TestRegularExpression.java | 2 +- strings/TheReplacements.java | 2 +- strings/ThreatAnalyzer.java | 2 +- strings/Turtle.java | 2 +- strings/UsingStringBuilder.java | 2 +- strings/WhitherStringBuilder.java | 2 +- typeinfo/AnonymousImplementation.java | 2 +- typeinfo/BoundedClassReferences.java | 2 +- typeinfo/ClassCasts.java | 2 +- typeinfo/ClassInitialization.java | 2 +- typeinfo/DynamicSupplier.java | 2 +- typeinfo/FamilyVsExactType.java | 2 +- typeinfo/GenericClassReferences.java | 2 +- typeinfo/HiddenImplementation.java | 2 +- typeinfo/InnerImplementation.java | 2 +- typeinfo/InterfaceViolation.java | 2 +- typeinfo/ModifyingPrivateFields.java | 2 +- typeinfo/NullRobot.java | 2 +- typeinfo/Operation.java | 2 +- typeinfo/Person.java | 2 +- typeinfo/PetCount.java | 2 +- typeinfo/PetCount2.java | 2 +- typeinfo/PetCount3.java | 2 +- typeinfo/PetCount4.java | 2 +- typeinfo/Position.java | 2 +- typeinfo/RegisteredFactories.java | 2 +- typeinfo/Robot.java | 2 +- typeinfo/SelectingMethods.java | 2 +- typeinfo/Shapes.java | 2 +- typeinfo/ShowMethods.java | 2 +- typeinfo/SimpleDynamicProxy.java | 2 +- typeinfo/SimpleProxyDemo.java | 2 +- typeinfo/SnowRemovalRobot.java | 2 +- typeinfo/Staff.java | 2 +- typeinfo/SweetShop.java | 2 +- typeinfo/WildcardClassReferences.java | 2 +- typeinfo/interfacea/A.java | 2 +- typeinfo/packageaccess/HiddenC.java | 2 +- typeinfo/pets/Cat.java | 2 +- typeinfo/pets/Cymric.java | 2 +- typeinfo/pets/Dog.java | 2 +- typeinfo/pets/EgyptianMau.java | 2 +- typeinfo/pets/ForNameCreator.java | 2 +- typeinfo/pets/Hamster.java | 2 +- typeinfo/pets/Individual.java | 2 +- typeinfo/pets/LiteralPetCreator.java | 2 +- typeinfo/pets/Manx.java | 2 +- typeinfo/pets/Mouse.java | 2 +- typeinfo/pets/Mutt.java | 2 +- typeinfo/pets/Person.java | 2 +- typeinfo/pets/Pet.java | 2 +- typeinfo/pets/PetCreator.java | 2 +- typeinfo/pets/Pets.java | 2 +- typeinfo/pets/Pug.java | 2 +- typeinfo/pets/Rat.java | 2 +- typeinfo/pets/Rodent.java | 2 +- typeinfo/toys/GenericToyTest.java | 2 +- typeinfo/toys/ToyTest.java | 2 +- validating/Assert1.java | 2 +- validating/Assert2.java | 2 +- validating/BadMicroBenchmark.java | 2 +- validating/BadMicroBenchmark2.java | 2 +- validating/CircularQueue.java | 2 +- validating/CircularQueueException.java | 2 +- validating/CountedList.java | 2 +- validating/GuavaAssertions.java | 2 +- validating/GuavaPreconditions.java | 2 +- validating/Inverter1.java | 2 +- validating/Inverter2.java | 2 +- validating/Inverter3.java | 2 +- validating/Inverter4.java | 2 +- validating/LoaderAssertions.java | 2 +- validating/NonNullConstruction.java | 2 +- validating/SLF4JLevels.java | 2 +- validating/SLF4JLogging.java | 2 +- validating/SimpleDebugging.java | 2 +- validating/StringInverter.java | 2 +- validating/jmh/JMH1.java | 2 +- validating/jmh/JMH2.java | 2 +- validating/jmh/JMH3.java | 2 +- validating/tests/CircularQueueTest.java | 2 +- validating/tests/CountedListTest.java | 2 +- validating/tests/DynamicStringInverterTests.java | 2 +- validating/tests/StringInverterTests.java | 2 +- 1014 files changed, 1014 insertions(+), 1014 deletions(-) diff --git a/annotations/AtUnitComposition.java b/annotations/AtUnitComposition.java index 90a462a39..de4bccded 100644 --- a/annotations/AtUnitComposition.java +++ b/annotations/AtUnitComposition.java @@ -1,5 +1,5 @@ // annotations/AtUnitComposition.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Creating non-embedded tests diff --git a/annotations/AtUnitExample1.java b/annotations/AtUnitExample1.java index facc85e95..a5efe07c6 100644 --- a/annotations/AtUnitExample1.java +++ b/annotations/AtUnitExample1.java @@ -1,5 +1,5 @@ // annotations/AtUnitExample1.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // {java onjava.atunit.AtUnit diff --git a/annotations/AtUnitExample2.java b/annotations/AtUnitExample2.java index c84667bbf..d2028559a 100644 --- a/annotations/AtUnitExample2.java +++ b/annotations/AtUnitExample2.java @@ -1,5 +1,5 @@ // annotations/AtUnitExample2.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Assertions and exceptions can be used in @Tests diff --git a/annotations/AtUnitExample3.java b/annotations/AtUnitExample3.java index 5c1635fc0..537773d08 100644 --- a/annotations/AtUnitExample3.java +++ b/annotations/AtUnitExample3.java @@ -1,5 +1,5 @@ // annotations/AtUnitExample3.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // {java onjava.atunit.AtUnit diff --git a/annotations/AtUnitExample4.java b/annotations/AtUnitExample4.java index 066182f2e..f0cfb8a55 100644 --- a/annotations/AtUnitExample4.java +++ b/annotations/AtUnitExample4.java @@ -1,5 +1,5 @@ // annotations/AtUnitExample4.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // {java onjava.atunit.AtUnit diff --git a/annotations/AtUnitExample5.java b/annotations/AtUnitExample5.java index b43141eaa..7bd473b58 100644 --- a/annotations/AtUnitExample5.java +++ b/annotations/AtUnitExample5.java @@ -1,5 +1,5 @@ // annotations/AtUnitExample5.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // {java onjava.atunit.AtUnit diff --git a/annotations/AtUnitExternalTest.java b/annotations/AtUnitExternalTest.java index 960eca71e..0860dffff 100644 --- a/annotations/AtUnitExternalTest.java +++ b/annotations/AtUnitExternalTest.java @@ -1,5 +1,5 @@ // annotations/AtUnitExternalTest.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Creating non-embedded tests diff --git a/annotations/HashSetTest.java b/annotations/HashSetTest.java index 744e214da..1bd85e8d0 100644 --- a/annotations/HashSetTest.java +++ b/annotations/HashSetTest.java @@ -1,5 +1,5 @@ // annotations/HashSetTest.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // {java onjava.atunit.AtUnit diff --git a/annotations/PasswordUtils.java b/annotations/PasswordUtils.java index b59681112..eb3ce4dd8 100644 --- a/annotations/PasswordUtils.java +++ b/annotations/PasswordUtils.java @@ -1,5 +1,5 @@ // annotations/PasswordUtils.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.*; diff --git a/annotations/SimulatingNull.java b/annotations/SimulatingNull.java index 45f4637a5..d9fc66484 100644 --- a/annotations/SimulatingNull.java +++ b/annotations/SimulatingNull.java @@ -1,5 +1,5 @@ // annotations/SimulatingNull.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.lang.annotation.*; diff --git a/annotations/StackL.java b/annotations/StackL.java index 348871ab5..63c1229a7 100644 --- a/annotations/StackL.java +++ b/annotations/StackL.java @@ -1,5 +1,5 @@ // annotations/StackL.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // A stack built on a linkedList diff --git a/annotations/StackLStringTest.java b/annotations/StackLStringTest.java index ac551affe..4dc69fc68 100644 --- a/annotations/StackLStringTest.java +++ b/annotations/StackLStringTest.java @@ -1,5 +1,5 @@ // annotations/StackLStringTest.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Applying @Unit to generics diff --git a/annotations/Testable.java b/annotations/Testable.java index 721dabad9..6e39af934 100644 --- a/annotations/Testable.java +++ b/annotations/Testable.java @@ -1,5 +1,5 @@ // annotations/Testable.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. package annotations; diff --git a/annotations/UseCase.java b/annotations/UseCase.java index 4d354db5b..21220d6a2 100644 --- a/annotations/UseCase.java +++ b/annotations/UseCase.java @@ -1,5 +1,5 @@ // annotations/UseCase.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.lang.annotation.*; diff --git a/annotations/UseCaseTracker.java b/annotations/UseCaseTracker.java index 84a2e21ff..ced2cdcb0 100644 --- a/annotations/UseCaseTracker.java +++ b/annotations/UseCaseTracker.java @@ -1,5 +1,5 @@ // annotations/UseCaseTracker.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.lang.reflect.*; diff --git a/annotations/database/Constraints.java b/annotations/database/Constraints.java index 156882336..48c270c51 100644 --- a/annotations/database/Constraints.java +++ b/annotations/database/Constraints.java @@ -1,5 +1,5 @@ // annotations/database/Constraints.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. package annotations.database; diff --git a/annotations/database/DBTable.java b/annotations/database/DBTable.java index 53b9ac444..0dc0ba500 100644 --- a/annotations/database/DBTable.java +++ b/annotations/database/DBTable.java @@ -1,5 +1,5 @@ // annotations/database/DBTable.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. package annotations.database; diff --git a/annotations/database/Member.java b/annotations/database/Member.java index b49c2c594..be415758a 100644 --- a/annotations/database/Member.java +++ b/annotations/database/Member.java @@ -1,5 +1,5 @@ // annotations/database/Member.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. package annotations.database; diff --git a/annotations/database/SQLInteger.java b/annotations/database/SQLInteger.java index ecd7b5f4d..645adbc58 100644 --- a/annotations/database/SQLInteger.java +++ b/annotations/database/SQLInteger.java @@ -1,5 +1,5 @@ // annotations/database/SQLInteger.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. package annotations.database; diff --git a/annotations/database/SQLString.java b/annotations/database/SQLString.java index 0df7eb11f..627aa3c12 100644 --- a/annotations/database/SQLString.java +++ b/annotations/database/SQLString.java @@ -1,5 +1,5 @@ // annotations/database/SQLString.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. package annotations.database; diff --git a/annotations/database/TableCreator.java b/annotations/database/TableCreator.java index b513e3787..3248645d6 100644 --- a/annotations/database/TableCreator.java +++ b/annotations/database/TableCreator.java @@ -1,5 +1,5 @@ // annotations/database/TableCreator.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Reflection-based annotation processor diff --git a/annotations/database/Uniqueness.java b/annotations/database/Uniqueness.java index bbbb3f22d..d0ab204c7 100644 --- a/annotations/database/Uniqueness.java +++ b/annotations/database/Uniqueness.java @@ -1,5 +1,5 @@ // annotations/database/Uniqueness.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Sample of nested annotations diff --git a/annotations/ifx/ExtractInterface.java b/annotations/ifx/ExtractInterface.java index 8138f2633..ed61be171 100644 --- a/annotations/ifx/ExtractInterface.java +++ b/annotations/ifx/ExtractInterface.java @@ -1,5 +1,5 @@ // annotations/ifx/ExtractInterface.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // javac-based annotation processing diff --git a/annotations/ifx/IfaceExtractorProcessor.java b/annotations/ifx/IfaceExtractorProcessor.java index 9177a048f..14f412a6e 100644 --- a/annotations/ifx/IfaceExtractorProcessor.java +++ b/annotations/ifx/IfaceExtractorProcessor.java @@ -1,5 +1,5 @@ // annotations/ifx/IfaceExtractorProcessor.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // javac-based annotation processing diff --git a/annotations/ifx/Multiplier.java b/annotations/ifx/Multiplier.java index dc128bf73..ad0847976 100644 --- a/annotations/ifx/Multiplier.java +++ b/annotations/ifx/Multiplier.java @@ -1,5 +1,5 @@ // annotations/ifx/Multiplier.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // javac-based annotation processing diff --git a/annotations/simplest/Simple.java b/annotations/simplest/Simple.java index db5ba7bcc..6e3a13ab2 100644 --- a/annotations/simplest/Simple.java +++ b/annotations/simplest/Simple.java @@ -1,5 +1,5 @@ // annotations/simplest/Simple.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // A bare-bones annotation diff --git a/annotations/simplest/SimpleProcessor.java b/annotations/simplest/SimpleProcessor.java index a362a3e86..56c4e8b91 100644 --- a/annotations/simplest/SimpleProcessor.java +++ b/annotations/simplest/SimpleProcessor.java @@ -1,5 +1,5 @@ // annotations/simplest/SimpleProcessor.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // A bare-bones annotation processor diff --git a/annotations/simplest/SimpleTest.java b/annotations/simplest/SimpleTest.java index e2477c1b1..e281e42b7 100644 --- a/annotations/simplest/SimpleTest.java +++ b/annotations/simplest/SimpleTest.java @@ -1,5 +1,5 @@ // annotations/simplest/SimpleTest.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Test the "Simple" annotation diff --git a/arrays/AlphabeticSearch.java b/arrays/AlphabeticSearch.java index 28ae7a7dd..a01f11495 100644 --- a/arrays/AlphabeticSearch.java +++ b/arrays/AlphabeticSearch.java @@ -1,5 +1,5 @@ // arrays/AlphabeticSearch.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Searching with a Comparator import diff --git a/arrays/ArrayCopying.java b/arrays/ArrayCopying.java index 14a29e57c..01022e242 100644 --- a/arrays/ArrayCopying.java +++ b/arrays/ArrayCopying.java @@ -1,5 +1,5 @@ // arrays/ArrayCopying.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Demonstrate Arrays.copy() and Arrays.copyOf() diff --git a/arrays/ArrayOfGenericType.java b/arrays/ArrayOfGenericType.java index 01b4ee4c0..fb8d0a40b 100644 --- a/arrays/ArrayOfGenericType.java +++ b/arrays/ArrayOfGenericType.java @@ -1,5 +1,5 @@ // arrays/ArrayOfGenericType.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/arrays/ArrayOfGenerics.java b/arrays/ArrayOfGenerics.java index 9b9e31a60..cc2a2600c 100644 --- a/arrays/ArrayOfGenerics.java +++ b/arrays/ArrayOfGenerics.java @@ -1,5 +1,5 @@ // arrays/ArrayOfGenerics.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.*; diff --git a/arrays/ArrayOptions.java b/arrays/ArrayOptions.java index c4ebd1875..26ffd433c 100644 --- a/arrays/ArrayOptions.java +++ b/arrays/ArrayOptions.java @@ -1,5 +1,5 @@ // arrays/ArrayOptions.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Initialization & re-assignment of arrays diff --git a/arrays/ArraySearching.java b/arrays/ArraySearching.java index 1bc07752d..67de49b4a 100644 --- a/arrays/ArraySearching.java +++ b/arrays/ArraySearching.java @@ -1,5 +1,5 @@ // arrays/ArraySearching.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Using Arrays.binarySearch() diff --git a/arrays/AssemblingMultidimensionalArrays.java b/arrays/AssemblingMultidimensionalArrays.java index aadfd0550..2a4c4b99e 100644 --- a/arrays/AssemblingMultidimensionalArrays.java +++ b/arrays/AssemblingMultidimensionalArrays.java @@ -1,5 +1,5 @@ // arrays/AssemblingMultidimensionalArrays.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Creating multidimensional arrays diff --git a/arrays/AutoboxingArrays.java b/arrays/AutoboxingArrays.java index b39f4e8dc..4e34f753c 100644 --- a/arrays/AutoboxingArrays.java +++ b/arrays/AutoboxingArrays.java @@ -1,5 +1,5 @@ // arrays/AutoboxingArrays.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.*; diff --git a/arrays/CollectionComparison.java b/arrays/CollectionComparison.java index f37bcda59..f747fdafd 100644 --- a/arrays/CollectionComparison.java +++ b/arrays/CollectionComparison.java @@ -1,5 +1,5 @@ // arrays/CollectionComparison.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.*; diff --git a/arrays/CompType.java b/arrays/CompType.java index 21b4fa2ad..0e8e6f4e5 100644 --- a/arrays/CompType.java +++ b/arrays/CompType.java @@ -1,5 +1,5 @@ // arrays/CompType.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Implementing Comparable in a class diff --git a/arrays/ComparatorTest.java b/arrays/ComparatorTest.java index c981a673c..0edf8b6db 100644 --- a/arrays/ComparatorTest.java +++ b/arrays/ComparatorTest.java @@ -1,5 +1,5 @@ // arrays/ComparatorTest.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Implementing a Comparator for a class diff --git a/arrays/ComparingArrays.java b/arrays/ComparingArrays.java index ac964d061..9a2851f67 100644 --- a/arrays/ComparingArrays.java +++ b/arrays/ComparingArrays.java @@ -1,5 +1,5 @@ // arrays/ComparingArrays.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Using Arrays.equals() diff --git a/arrays/CountUpward.java b/arrays/CountUpward.java index a49a0a137..3208e2cb2 100644 --- a/arrays/CountUpward.java +++ b/arrays/CountUpward.java @@ -1,5 +1,5 @@ // arrays/CountUpward.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.*; diff --git a/arrays/FillingArrays.java b/arrays/FillingArrays.java index 91df974ce..6c416a0ff 100644 --- a/arrays/FillingArrays.java +++ b/arrays/FillingArrays.java @@ -1,5 +1,5 @@ // arrays/FillingArrays.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Using Arrays.fill() diff --git a/arrays/IceCreamFlavors.java b/arrays/IceCreamFlavors.java index bcc1b394c..73c0813af 100644 --- a/arrays/IceCreamFlavors.java +++ b/arrays/IceCreamFlavors.java @@ -1,5 +1,5 @@ // arrays/IceCreamFlavors.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Returning arrays from methods diff --git a/arrays/ModifyExisting.java b/arrays/ModifyExisting.java index 4bf9036cf..b5a0e8bc7 100644 --- a/arrays/ModifyExisting.java +++ b/arrays/ModifyExisting.java @@ -1,5 +1,5 @@ // arrays/ModifyExisting.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.*; diff --git a/arrays/MultiDimWrapperArray.java b/arrays/MultiDimWrapperArray.java index 2bab4e837..a5e38b4a6 100644 --- a/arrays/MultiDimWrapperArray.java +++ b/arrays/MultiDimWrapperArray.java @@ -1,5 +1,5 @@ // arrays/MultiDimWrapperArray.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Multidimensional arrays of "wrapper" objects diff --git a/arrays/MultidimensionalObjectArrays.java b/arrays/MultidimensionalObjectArrays.java index a288d1768..d63c7c4ba 100644 --- a/arrays/MultidimensionalObjectArrays.java +++ b/arrays/MultidimensionalObjectArrays.java @@ -1,5 +1,5 @@ // arrays/MultidimensionalObjectArrays.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.*; diff --git a/arrays/MultidimensionalPrimitiveArray.java b/arrays/MultidimensionalPrimitiveArray.java index 35f3fa1b7..0294c8b02 100644 --- a/arrays/MultidimensionalPrimitiveArray.java +++ b/arrays/MultidimensionalPrimitiveArray.java @@ -1,5 +1,5 @@ // arrays/MultidimensionalPrimitiveArray.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.*; diff --git a/arrays/ParallelPrefix1.java b/arrays/ParallelPrefix1.java index 6ad28a879..7a34d52ac 100644 --- a/arrays/ParallelPrefix1.java +++ b/arrays/ParallelPrefix1.java @@ -1,5 +1,5 @@ // arrays/ParallelPrefix1.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.*; diff --git a/arrays/ParallelPrefix2.java b/arrays/ParallelPrefix2.java index e8c27b36e..08dc8f448 100644 --- a/arrays/ParallelPrefix2.java +++ b/arrays/ParallelPrefix2.java @@ -1,5 +1,5 @@ // arrays/ParallelPrefix2.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.*; diff --git a/arrays/ParallelPrefix3.java b/arrays/ParallelPrefix3.java index 0fcab413f..2723483ff 100644 --- a/arrays/ParallelPrefix3.java +++ b/arrays/ParallelPrefix3.java @@ -1,5 +1,5 @@ // arrays/ParallelPrefix3.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.*; diff --git a/arrays/ParallelSetAll.java b/arrays/ParallelSetAll.java index 6ef1486c8..6d8c0e974 100644 --- a/arrays/ParallelSetAll.java +++ b/arrays/ParallelSetAll.java @@ -1,5 +1,5 @@ // arrays/ParallelSetAll.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.*; diff --git a/arrays/ParameterizedArrayType.java b/arrays/ParameterizedArrayType.java index dba0bd468..cb84b1375 100644 --- a/arrays/ParameterizedArrayType.java +++ b/arrays/ParameterizedArrayType.java @@ -1,5 +1,5 @@ // arrays/ParameterizedArrayType.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/arrays/PythonLists.py b/arrays/PythonLists.py index ead7ab7be..d22df21cd 100644 --- a/arrays/PythonLists.py +++ b/arrays/PythonLists.py @@ -1,5 +1,5 @@ # arrays/PythonLists.py -# (c)2016 MindView LLC: see Copyright.txt +# (c)2017 MindView LLC: see Copyright.txt # We make no guarantees that this code is fit for any purpose. # Visit http://OnJava8.com for more book information. diff --git a/arrays/RaggedArray.java b/arrays/RaggedArray.java index 70c913ded..c5c356059 100644 --- a/arrays/RaggedArray.java +++ b/arrays/RaggedArray.java @@ -1,5 +1,5 @@ // arrays/RaggedArray.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.*; diff --git a/arrays/Reverse.java b/arrays/Reverse.java index e7aa535c4..7bfc848fd 100644 --- a/arrays/Reverse.java +++ b/arrays/Reverse.java @@ -1,5 +1,5 @@ // arrays/Reverse.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // The Collections.reverseOrder() Comparator diff --git a/arrays/SimpleSetAll.java b/arrays/SimpleSetAll.java index 82ec6ec63..060a986de 100644 --- a/arrays/SimpleSetAll.java +++ b/arrays/SimpleSetAll.java @@ -1,5 +1,5 @@ // arrays/SimpleSetAll.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.*; diff --git a/arrays/StreamFromArray.java b/arrays/StreamFromArray.java index 0f9855405..b7022478b 100644 --- a/arrays/StreamFromArray.java +++ b/arrays/StreamFromArray.java @@ -1,5 +1,5 @@ // arrays/StreamFromArray.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.*; diff --git a/arrays/StringSorting.java b/arrays/StringSorting.java index 58224f57d..29609b38e 100644 --- a/arrays/StringSorting.java +++ b/arrays/StringSorting.java @@ -1,5 +1,5 @@ // arrays/StringSorting.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Sorting an array of Strings diff --git a/arrays/TestConvertTo.java b/arrays/TestConvertTo.java index 0a0132f03..c7d8fa1b2 100644 --- a/arrays/TestConvertTo.java +++ b/arrays/TestConvertTo.java @@ -1,5 +1,5 @@ // arrays/TestConvertTo.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.*; diff --git a/arrays/TestCount.java b/arrays/TestCount.java index e05edf229..806b8a33a 100644 --- a/arrays/TestCount.java +++ b/arrays/TestCount.java @@ -1,5 +1,5 @@ // arrays/TestCount.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Test counting generators diff --git a/arrays/TestRand.java b/arrays/TestRand.java index 39df151f8..85bc15d56 100644 --- a/arrays/TestRand.java +++ b/arrays/TestRand.java @@ -1,5 +1,5 @@ // arrays/TestRand.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Test random generators diff --git a/arrays/ThreeDWithNew.java b/arrays/ThreeDWithNew.java index dcc3a0ade..4d093f3ac 100644 --- a/arrays/ThreeDWithNew.java +++ b/arrays/ThreeDWithNew.java @@ -1,5 +1,5 @@ // arrays/ThreeDWithNew.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.*; diff --git a/arrays/jmh/ParallelSort.java b/arrays/jmh/ParallelSort.java index 2533bc05f..0475ae142 100644 --- a/arrays/jmh/ParallelSort.java +++ b/arrays/jmh/ParallelSort.java @@ -1,5 +1,5 @@ // arrays/jmh/ParallelSort.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. package arrays.jmh; diff --git a/collections/AdapterMethodIdiom.java b/collections/AdapterMethodIdiom.java index 6944c5263..528cb8292 100644 --- a/collections/AdapterMethodIdiom.java +++ b/collections/AdapterMethodIdiom.java @@ -1,5 +1,5 @@ // collections/AdapterMethodIdiom.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // The "Adapter Method" idiom uses for-in diff --git a/collections/AddingGroups.java b/collections/AddingGroups.java index 661de5bc3..3561f459d 100644 --- a/collections/AddingGroups.java +++ b/collections/AddingGroups.java @@ -1,5 +1,5 @@ // collections/AddingGroups.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Adding groups of elements to Collection objects diff --git a/collections/ApplesAndOrangesWithGenerics.java b/collections/ApplesAndOrangesWithGenerics.java index 3d2e955c5..bd8cb646a 100644 --- a/collections/ApplesAndOrangesWithGenerics.java +++ b/collections/ApplesAndOrangesWithGenerics.java @@ -1,5 +1,5 @@ // collections/ApplesAndOrangesWithGenerics.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.*; diff --git a/collections/ApplesAndOrangesWithoutGenerics.java b/collections/ApplesAndOrangesWithoutGenerics.java index f003d5fda..775e25f9f 100644 --- a/collections/ApplesAndOrangesWithoutGenerics.java +++ b/collections/ApplesAndOrangesWithoutGenerics.java @@ -1,5 +1,5 @@ // collections/ApplesAndOrangesWithoutGenerics.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Simple collection use (suppressing compiler warnings) diff --git a/collections/ArrayIsNotIterable.java b/collections/ArrayIsNotIterable.java index e87af4a3d..1f1e68140 100644 --- a/collections/ArrayIsNotIterable.java +++ b/collections/ArrayIsNotIterable.java @@ -1,5 +1,5 @@ // collections/ArrayIsNotIterable.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.*; diff --git a/collections/AsListInference.java b/collections/AsListInference.java index 5d58ae1f0..97f04a4e8 100644 --- a/collections/AsListInference.java +++ b/collections/AsListInference.java @@ -1,5 +1,5 @@ // collections/AsListInference.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.*; diff --git a/collections/CollectionDifferences.java b/collections/CollectionDifferences.java index 4ace6ad8e..d5df0f5cd 100644 --- a/collections/CollectionDifferences.java +++ b/collections/CollectionDifferences.java @@ -1,5 +1,5 @@ // collections/CollectionDifferences.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import onjava.*; diff --git a/collections/CollectionSequence.java b/collections/CollectionSequence.java index d805f5f6b..920017967 100644 --- a/collections/CollectionSequence.java +++ b/collections/CollectionSequence.java @@ -1,5 +1,5 @@ // collections/CollectionSequence.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import typeinfo.pets.*; diff --git a/collections/CrossCollectionIteration.java b/collections/CrossCollectionIteration.java index e2dec7a17..8966acd10 100644 --- a/collections/CrossCollectionIteration.java +++ b/collections/CrossCollectionIteration.java @@ -1,5 +1,5 @@ // collections/CrossCollectionIteration.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import typeinfo.pets.*; diff --git a/collections/CrossCollectionIteration2.java b/collections/CrossCollectionIteration2.java index 45616c65b..51ca1788e 100644 --- a/collections/CrossCollectionIteration2.java +++ b/collections/CrossCollectionIteration2.java @@ -1,5 +1,5 @@ // collections/CrossCollectionIteration2.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import typeinfo.pets.*; diff --git a/collections/EnvironmentVariables.java b/collections/EnvironmentVariables.java index 99723fd8f..4ae2ecaa8 100644 --- a/collections/EnvironmentVariables.java +++ b/collections/EnvironmentVariables.java @@ -1,5 +1,5 @@ // collections/EnvironmentVariables.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // {ValidateByHand} diff --git a/collections/ForInCollections.java b/collections/ForInCollections.java index c52bce871..2dfbe1b6f 100644 --- a/collections/ForInCollections.java +++ b/collections/ForInCollections.java @@ -1,5 +1,5 @@ // collections/ForInCollections.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // All collections work with for-in diff --git a/collections/GenericsAndUpcasting.java b/collections/GenericsAndUpcasting.java index 70a70c891..797f40d55 100644 --- a/collections/GenericsAndUpcasting.java +++ b/collections/GenericsAndUpcasting.java @@ -1,5 +1,5 @@ // collections/GenericsAndUpcasting.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.*; diff --git a/collections/InterfaceVsIterator.java b/collections/InterfaceVsIterator.java index 2e68ecb2c..8948aa80a 100644 --- a/collections/InterfaceVsIterator.java +++ b/collections/InterfaceVsIterator.java @@ -1,5 +1,5 @@ // collections/InterfaceVsIterator.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import typeinfo.pets.*; diff --git a/collections/IterableClass.java b/collections/IterableClass.java index d0bf49082..c9eedf57c 100644 --- a/collections/IterableClass.java +++ b/collections/IterableClass.java @@ -1,5 +1,5 @@ // collections/IterableClass.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Anything Iterable works with for-in diff --git a/collections/LinkedListFeatures.java b/collections/LinkedListFeatures.java index 24e181471..8a7b1b79f 100644 --- a/collections/LinkedListFeatures.java +++ b/collections/LinkedListFeatures.java @@ -1,5 +1,5 @@ // collections/LinkedListFeatures.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import typeinfo.pets.*; diff --git a/collections/ListFeatures.java b/collections/ListFeatures.java index eeb5ddb89..b002d9a8f 100644 --- a/collections/ListFeatures.java +++ b/collections/ListFeatures.java @@ -1,5 +1,5 @@ // collections/ListFeatures.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import typeinfo.pets.*; diff --git a/collections/ListIteration.java b/collections/ListIteration.java index 57d52fed6..cf4c1558a 100644 --- a/collections/ListIteration.java +++ b/collections/ListIteration.java @@ -1,5 +1,5 @@ // collections/ListIteration.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import typeinfo.pets.*; diff --git a/collections/MapOfList.java b/collections/MapOfList.java index 35ed1c2df..151d4e1e4 100644 --- a/collections/MapOfList.java +++ b/collections/MapOfList.java @@ -1,5 +1,5 @@ // collections/MapOfList.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // {java collections.MapOfList} diff --git a/collections/ModifyingArraysAsList.java b/collections/ModifyingArraysAsList.java index 3d4d1d5bf..15104eaaa 100644 --- a/collections/ModifyingArraysAsList.java +++ b/collections/ModifyingArraysAsList.java @@ -1,5 +1,5 @@ // collections/ModifyingArraysAsList.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.*; diff --git a/collections/MultiIterableClass.java b/collections/MultiIterableClass.java index 2a2a6c563..f90e543d4 100644 --- a/collections/MultiIterableClass.java +++ b/collections/MultiIterableClass.java @@ -1,5 +1,5 @@ // collections/MultiIterableClass.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Adding several Adapter Methods diff --git a/collections/NonCollectionSequence.java b/collections/NonCollectionSequence.java index 564174598..af13bc25e 100644 --- a/collections/NonCollectionSequence.java +++ b/collections/NonCollectionSequence.java @@ -1,5 +1,5 @@ // collections/NonCollectionSequence.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import typeinfo.pets.*; diff --git a/collections/PetMap.java b/collections/PetMap.java index ec1605859..68029ba9d 100644 --- a/collections/PetMap.java +++ b/collections/PetMap.java @@ -1,5 +1,5 @@ // collections/PetMap.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import typeinfo.pets.*; diff --git a/collections/PrintingCollections.java b/collections/PrintingCollections.java index 7c8b3c731..5ca4096e2 100644 --- a/collections/PrintingCollections.java +++ b/collections/PrintingCollections.java @@ -1,5 +1,5 @@ // collections/PrintingCollections.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Collections print themselves automatically diff --git a/collections/PriorityQueueDemo.java b/collections/PriorityQueueDemo.java index abc6f0f33..62136ddb4 100644 --- a/collections/PriorityQueueDemo.java +++ b/collections/PriorityQueueDemo.java @@ -1,5 +1,5 @@ // collections/PriorityQueueDemo.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.*; diff --git a/collections/QueueDemo.java b/collections/QueueDemo.java index d1155d6c8..31a5a5e2a 100644 --- a/collections/QueueDemo.java +++ b/collections/QueueDemo.java @@ -1,5 +1,5 @@ // collections/QueueDemo.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Upcasting to a Queue from a LinkedList diff --git a/collections/SetOfInteger.java b/collections/SetOfInteger.java index b16b39913..0c332198f 100644 --- a/collections/SetOfInteger.java +++ b/collections/SetOfInteger.java @@ -1,5 +1,5 @@ // collections/SetOfInteger.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.*; diff --git a/collections/SetOfString.java b/collections/SetOfString.java index 1407bbd61..d6f980e06 100644 --- a/collections/SetOfString.java +++ b/collections/SetOfString.java @@ -1,5 +1,5 @@ // collections/SetOfString.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.*; diff --git a/collections/SetOperations.java b/collections/SetOperations.java index 492b48a08..e85bbf705 100644 --- a/collections/SetOperations.java +++ b/collections/SetOperations.java @@ -1,5 +1,5 @@ // collections/SetOperations.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.*; diff --git a/collections/SimpleCollection.java b/collections/SimpleCollection.java index 758584a8d..e0187dc86 100644 --- a/collections/SimpleCollection.java +++ b/collections/SimpleCollection.java @@ -1,5 +1,5 @@ // collections/SimpleCollection.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.*; diff --git a/collections/SimpleIteration.java b/collections/SimpleIteration.java index 814b4e57b..3c1149545 100644 --- a/collections/SimpleIteration.java +++ b/collections/SimpleIteration.java @@ -1,5 +1,5 @@ // collections/SimpleIteration.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import typeinfo.pets.*; diff --git a/collections/SortedSetOfString.java b/collections/SortedSetOfString.java index 3f885ff7f..b2a0603bd 100644 --- a/collections/SortedSetOfString.java +++ b/collections/SortedSetOfString.java @@ -1,5 +1,5 @@ // collections/SortedSetOfString.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.*; diff --git a/collections/StackCollision.java b/collections/StackCollision.java index 96863cf07..11fd340e8 100644 --- a/collections/StackCollision.java +++ b/collections/StackCollision.java @@ -1,5 +1,5 @@ // collections/StackCollision.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/collections/StackTest.java b/collections/StackTest.java index 5ca489e95..bc9e9305c 100644 --- a/collections/StackTest.java +++ b/collections/StackTest.java @@ -1,5 +1,5 @@ // collections/StackTest.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.*; diff --git a/collections/StackTest2.java b/collections/StackTest2.java index d8a15a944..303f856d6 100644 --- a/collections/StackTest2.java +++ b/collections/StackTest2.java @@ -1,5 +1,5 @@ // collections/StackTest2.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import onjava.*; diff --git a/collections/Statistics.java b/collections/Statistics.java index 6b725d712..f2a51aaca 100644 --- a/collections/Statistics.java +++ b/collections/Statistics.java @@ -1,5 +1,5 @@ // collections/Statistics.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Simple demonstration of HashMap diff --git a/collections/UniqueWords.java b/collections/UniqueWords.java index 3713c5cd3..229499773 100644 --- a/collections/UniqueWords.java +++ b/collections/UniqueWords.java @@ -1,5 +1,5 @@ // collections/UniqueWords.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.*; diff --git a/collections/UniqueWordsAlphabetic.java b/collections/UniqueWordsAlphabetic.java index bc6ffcf3c..b6b1c1cc9 100644 --- a/collections/UniqueWordsAlphabetic.java +++ b/collections/UniqueWordsAlphabetic.java @@ -1,5 +1,5 @@ // collections/UniqueWordsAlphabetic.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Producing an alphabetic listing diff --git a/com/mindviewinc/simple/List.java b/com/mindviewinc/simple/List.java index 6e59515e6..065ff8437 100644 --- a/com/mindviewinc/simple/List.java +++ b/com/mindviewinc/simple/List.java @@ -1,5 +1,5 @@ // com/mindviewinc/simple/List.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Creating a package diff --git a/com/mindviewinc/simple/Vector.java b/com/mindviewinc/simple/Vector.java index a2fda6eee..db50ba121 100644 --- a/com/mindviewinc/simple/Vector.java +++ b/com/mindviewinc/simple/Vector.java @@ -1,5 +1,5 @@ // com/mindviewinc/simple/Vector.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Creating a package diff --git a/compression/GZIPcompress.java b/compression/GZIPcompress.java index 170a8b9e3..8b28ff9d7 100644 --- a/compression/GZIPcompress.java +++ b/compression/GZIPcompress.java @@ -1,5 +1,5 @@ // compression/GZIPcompress.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // {java GZIPcompress GZIPcompress.java} diff --git a/compression/ZipCompress.java b/compression/ZipCompress.java index 86927f9c2..0ad429257 100644 --- a/compression/ZipCompress.java +++ b/compression/ZipCompress.java @@ -1,5 +1,5 @@ // compression/ZipCompress.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Uses Zip compression to compress any diff --git a/concurrent/Baked.java b/concurrent/Baked.java index ab3366052..b5d7adcdf 100644 --- a/concurrent/Baked.java +++ b/concurrent/Baked.java @@ -1,5 +1,5 @@ // concurrent/Baked.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.concurrent.*; diff --git a/concurrent/Batter.java b/concurrent/Batter.java index d05ece3ed..6c5d84a63 100644 --- a/concurrent/Batter.java +++ b/concurrent/Batter.java @@ -1,5 +1,5 @@ // concurrent/Batter.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.concurrent.*; diff --git a/concurrent/Breakable.java b/concurrent/Breakable.java index 918883333..efab6d596 100644 --- a/concurrent/Breakable.java +++ b/concurrent/Breakable.java @@ -1,5 +1,5 @@ // concurrent/Breakable.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.concurrent.*; diff --git a/concurrent/CachedThreadPool.java b/concurrent/CachedThreadPool.java index e3ffd669a..5cf7fb009 100644 --- a/concurrent/CachedThreadPool.java +++ b/concurrent/CachedThreadPool.java @@ -1,5 +1,5 @@ // concurrent/CachedThreadPool.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.concurrent.*; diff --git a/concurrent/CachedThreadPool2.java b/concurrent/CachedThreadPool2.java index 046ab901a..52ba937d8 100644 --- a/concurrent/CachedThreadPool2.java +++ b/concurrent/CachedThreadPool2.java @@ -1,5 +1,5 @@ // concurrent/CachedThreadPool2.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.concurrent.*; diff --git a/concurrent/CachedThreadPool3.java b/concurrent/CachedThreadPool3.java index 7565e8969..cc17e424c 100644 --- a/concurrent/CachedThreadPool3.java +++ b/concurrent/CachedThreadPool3.java @@ -1,5 +1,5 @@ // concurrent/CachedThreadPool3.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.*; diff --git a/concurrent/CatchCompletableExceptions.java b/concurrent/CatchCompletableExceptions.java index 30f05cfa8..c4bfd0318 100644 --- a/concurrent/CatchCompletableExceptions.java +++ b/concurrent/CatchCompletableExceptions.java @@ -1,5 +1,5 @@ // concurrent/CatchCompletableExceptions.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.concurrent.*; diff --git a/concurrent/CollectionIntoStream.java b/concurrent/CollectionIntoStream.java index b666f15ab..2ddf4ed2d 100644 --- a/concurrent/CollectionIntoStream.java +++ b/concurrent/CollectionIntoStream.java @@ -1,5 +1,5 @@ // concurrent/CollectionIntoStream.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import onjava.*; diff --git a/concurrent/CompletableApply.java b/concurrent/CompletableApply.java index 4e98eb061..3173d0260 100644 --- a/concurrent/CompletableApply.java +++ b/concurrent/CompletableApply.java @@ -1,5 +1,5 @@ // concurrent/CompletableApply.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.concurrent.*; diff --git a/concurrent/CompletableApplyAsync.java b/concurrent/CompletableApplyAsync.java index 8ae6e0e0f..fd73a940e 100644 --- a/concurrent/CompletableApplyAsync.java +++ b/concurrent/CompletableApplyAsync.java @@ -1,5 +1,5 @@ // concurrent/CompletableApplyAsync.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.concurrent.*; diff --git a/concurrent/CompletableApplyChained.java b/concurrent/CompletableApplyChained.java index 82ae3ef73..2834e2a84 100644 --- a/concurrent/CompletableApplyChained.java +++ b/concurrent/CompletableApplyChained.java @@ -1,5 +1,5 @@ // concurrent/CompletableApplyChained.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.concurrent.*; diff --git a/concurrent/CompletableExceptions.java b/concurrent/CompletableExceptions.java index a1497fc2f..407247c0c 100644 --- a/concurrent/CompletableExceptions.java +++ b/concurrent/CompletableExceptions.java @@ -1,5 +1,5 @@ // concurrent/CompletableExceptions.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.concurrent.*; diff --git a/concurrent/CompletableOperations.java b/concurrent/CompletableOperations.java index 27f0a96d3..18e3baaa6 100644 --- a/concurrent/CompletableOperations.java +++ b/concurrent/CompletableOperations.java @@ -1,5 +1,5 @@ // concurrent/CompletableOperations.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.concurrent.*; diff --git a/concurrent/CompletablePizza.java b/concurrent/CompletablePizza.java index 5b2416e2e..6072e81a2 100644 --- a/concurrent/CompletablePizza.java +++ b/concurrent/CompletablePizza.java @@ -1,5 +1,5 @@ // concurrent/CompletablePizza.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.*; diff --git a/concurrent/CompletedMachina.java b/concurrent/CompletedMachina.java index f737da746..8a7388ad4 100644 --- a/concurrent/CompletedMachina.java +++ b/concurrent/CompletedMachina.java @@ -1,5 +1,5 @@ // concurrent/CompletedMachina.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.concurrent.*; diff --git a/concurrent/CountingStream.java b/concurrent/CountingStream.java index 62ecfcfc8..0ab94d45c 100644 --- a/concurrent/CountingStream.java +++ b/concurrent/CountingStream.java @@ -1,5 +1,5 @@ // concurrent/CountingStream.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.*; diff --git a/concurrent/CountingTask.java b/concurrent/CountingTask.java index 3a7d6262d..ddcbacf19 100644 --- a/concurrent/CountingTask.java +++ b/concurrent/CountingTask.java @@ -1,5 +1,5 @@ // concurrent/CountingTask.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.concurrent.*; diff --git a/concurrent/DiningPhilosophers.java b/concurrent/DiningPhilosophers.java index 65c9231f8..bc3154cae 100644 --- a/concurrent/DiningPhilosophers.java +++ b/concurrent/DiningPhilosophers.java @@ -1,5 +1,5 @@ // concurrent/DiningPhilosophers.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Hidden deadlock diff --git a/concurrent/DualCompletableOperations.java b/concurrent/DualCompletableOperations.java index aff6348dc..0aa9ebf1e 100644 --- a/concurrent/DualCompletableOperations.java +++ b/concurrent/DualCompletableOperations.java @@ -1,5 +1,5 @@ // concurrent/DualCompletableOperations.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.concurrent.*; diff --git a/concurrent/FrostedCake.java b/concurrent/FrostedCake.java index 80d77d67a..8df76e080 100644 --- a/concurrent/FrostedCake.java +++ b/concurrent/FrostedCake.java @@ -1,5 +1,5 @@ // concurrent/FrostedCake.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.concurrent.*; diff --git a/concurrent/Futures.java b/concurrent/Futures.java index 3a8c3f927..138614a33 100644 --- a/concurrent/Futures.java +++ b/concurrent/Futures.java @@ -1,5 +1,5 @@ // concurrent/Futures.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.*; diff --git a/concurrent/InterferingTask.java b/concurrent/InterferingTask.java index b64afdd84..9ed9632bc 100644 --- a/concurrent/InterferingTask.java +++ b/concurrent/InterferingTask.java @@ -1,5 +1,5 @@ // concurrent/InterferingTask.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/concurrent/LambdasAndMethodReferences.java b/concurrent/LambdasAndMethodReferences.java index 9b7813aae..a9561e92d 100644 --- a/concurrent/LambdasAndMethodReferences.java +++ b/concurrent/LambdasAndMethodReferences.java @@ -1,5 +1,5 @@ // concurrent/LambdasAndMethodReferences.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.concurrent.*; diff --git a/concurrent/Machina.java b/concurrent/Machina.java index 716d13932..ccb4a42cc 100644 --- a/concurrent/Machina.java +++ b/concurrent/Machina.java @@ -1,5 +1,5 @@ // concurrent/Machina.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import onjava.Nap; diff --git a/concurrent/MoreTasksAfterShutdown.java b/concurrent/MoreTasksAfterShutdown.java index 756f0d48a..872e58532 100644 --- a/concurrent/MoreTasksAfterShutdown.java +++ b/concurrent/MoreTasksAfterShutdown.java @@ -1,5 +1,5 @@ // concurrent/MoreTasksAfterShutdown.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.concurrent.*; diff --git a/concurrent/NapTask.java b/concurrent/NapTask.java index 8f59771a3..f890cbfe8 100644 --- a/concurrent/NapTask.java +++ b/concurrent/NapTask.java @@ -1,5 +1,5 @@ // concurrent/NapTask.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import onjava.Nap; diff --git a/concurrent/OnePizza.java b/concurrent/OnePizza.java index 608821c75..204ef839c 100644 --- a/concurrent/OnePizza.java +++ b/concurrent/OnePizza.java @@ -1,5 +1,5 @@ // concurrent/OnePizza.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import onjava.Timer; diff --git a/concurrent/ParallelPrime.java b/concurrent/ParallelPrime.java index fcf844eed..247deb8c2 100644 --- a/concurrent/ParallelPrime.java +++ b/concurrent/ParallelPrime.java @@ -1,5 +1,5 @@ // concurrent/ParallelPrime.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.*; diff --git a/concurrent/ParallelStreamPuzzle.java b/concurrent/ParallelStreamPuzzle.java index f79027319..bf3dd365e 100644 --- a/concurrent/ParallelStreamPuzzle.java +++ b/concurrent/ParallelStreamPuzzle.java @@ -1,5 +1,5 @@ // concurrent/ParallelStreamPuzzle.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.*; diff --git a/concurrent/ParallelStreamPuzzle2.java b/concurrent/ParallelStreamPuzzle2.java index 20b5cb74c..237af9e22 100644 --- a/concurrent/ParallelStreamPuzzle2.java +++ b/concurrent/ParallelStreamPuzzle2.java @@ -1,5 +1,5 @@ // concurrent/ParallelStreamPuzzle2.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.*; diff --git a/concurrent/ParallelStreamPuzzle3.java b/concurrent/ParallelStreamPuzzle3.java index 9f304aa91..6045ba92a 100644 --- a/concurrent/ParallelStreamPuzzle3.java +++ b/concurrent/ParallelStreamPuzzle3.java @@ -1,5 +1,5 @@ // concurrent/ParallelStreamPuzzle3.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.*; diff --git a/concurrent/Philosopher.java b/concurrent/Philosopher.java index cd4d56e03..29552954b 100644 --- a/concurrent/Philosopher.java +++ b/concurrent/Philosopher.java @@ -1,5 +1,5 @@ // concurrent/Philosopher.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/concurrent/Pizza.java b/concurrent/Pizza.java index 40c34a278..f5684fba0 100644 --- a/concurrent/Pizza.java +++ b/concurrent/Pizza.java @@ -1,5 +1,5 @@ // concurrent/Pizza.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.function.*; diff --git a/concurrent/PizzaParallelSteps.java b/concurrent/PizzaParallelSteps.java index fbce9054b..32e53360a 100644 --- a/concurrent/PizzaParallelSteps.java +++ b/concurrent/PizzaParallelSteps.java @@ -1,5 +1,5 @@ // concurrent/PizzaParallelSteps.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.*; diff --git a/concurrent/PizzaStreams.java b/concurrent/PizzaStreams.java index d29f7557f..d16fc13f3 100644 --- a/concurrent/PizzaStreams.java +++ b/concurrent/PizzaStreams.java @@ -1,5 +1,5 @@ // concurrent/PizzaStreams.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.*; diff --git a/concurrent/QuittableTask.java b/concurrent/QuittableTask.java index b459704f8..466b24809 100644 --- a/concurrent/QuittableTask.java +++ b/concurrent/QuittableTask.java @@ -1,5 +1,5 @@ // concurrent/QuittableTask.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.concurrent.atomic.AtomicBoolean; diff --git a/concurrent/QuittingTasks.java b/concurrent/QuittingTasks.java index 92e8f3319..316d95fb3 100644 --- a/concurrent/QuittingTasks.java +++ b/concurrent/QuittingTasks.java @@ -1,5 +1,5 @@ // concurrent/QuittingTasks.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.*; diff --git a/concurrent/SingleThreadExecutor.java b/concurrent/SingleThreadExecutor.java index f1bc83fa6..e251492b9 100644 --- a/concurrent/SingleThreadExecutor.java +++ b/concurrent/SingleThreadExecutor.java @@ -1,5 +1,5 @@ // concurrent/SingleThreadExecutor.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.concurrent.*; diff --git a/concurrent/SingleThreadExecutor2.java b/concurrent/SingleThreadExecutor2.java index 9993ce6f0..113fb6393 100644 --- a/concurrent/SingleThreadExecutor2.java +++ b/concurrent/SingleThreadExecutor2.java @@ -1,5 +1,5 @@ // concurrent/SingleThreadExecutor2.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.concurrent.*; diff --git a/concurrent/SingleThreadExecutor3.java b/concurrent/SingleThreadExecutor3.java index ffbbca440..46e384280 100644 --- a/concurrent/SingleThreadExecutor3.java +++ b/concurrent/SingleThreadExecutor3.java @@ -1,5 +1,5 @@ // concurrent/SingleThreadExecutor3.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.concurrent.*; diff --git a/concurrent/StickHolder.java b/concurrent/StickHolder.java index 456da2538..413e69dc8 100644 --- a/concurrent/StickHolder.java +++ b/concurrent/StickHolder.java @@ -1,5 +1,5 @@ // concurrent/StickHolder.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.concurrent.*; diff --git a/concurrent/Summing.java b/concurrent/Summing.java index be59c85c3..14202a529 100644 --- a/concurrent/Summing.java +++ b/concurrent/Summing.java @@ -1,5 +1,5 @@ // concurrent/Summing.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.stream.*; diff --git a/concurrent/Summing2.java b/concurrent/Summing2.java index a7da46e3b..c6ea6179d 100644 --- a/concurrent/Summing2.java +++ b/concurrent/Summing2.java @@ -1,5 +1,5 @@ // concurrent/Summing2.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.*; diff --git a/concurrent/Summing3.java b/concurrent/Summing3.java index 623d35c5c..2a739b8b9 100644 --- a/concurrent/Summing3.java +++ b/concurrent/Summing3.java @@ -1,5 +1,5 @@ // concurrent/Summing3.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.*; diff --git a/concurrent/Summing4.java b/concurrent/Summing4.java index 49940bf3f..1bbeb6be5 100644 --- a/concurrent/Summing4.java +++ b/concurrent/Summing4.java @@ -1,5 +1,5 @@ // concurrent/Summing4.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.*; diff --git a/concurrent/Workable.java b/concurrent/Workable.java index 87d7abdf8..6c3c4083b 100644 --- a/concurrent/Workable.java +++ b/concurrent/Workable.java @@ -1,5 +1,5 @@ // concurrent/Workable.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.concurrent.*; diff --git a/control/BreakAndContinue.java b/control/BreakAndContinue.java index 337730cfd..83ad25e06 100644 --- a/control/BreakAndContinue.java +++ b/control/BreakAndContinue.java @@ -1,5 +1,5 @@ // control/BreakAndContinue.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Break and continue keywords diff --git a/control/CommaOperator.java b/control/CommaOperator.java index 18d2caee5..d4337c036 100644 --- a/control/CommaOperator.java +++ b/control/CommaOperator.java @@ -1,5 +1,5 @@ // control/CommaOperator.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/control/ForInFloat.java b/control/ForInFloat.java index 77198d05f..4027b2f79 100644 --- a/control/ForInFloat.java +++ b/control/ForInFloat.java @@ -1,5 +1,5 @@ // control/ForInFloat.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.*; diff --git a/control/ForInInt.java b/control/ForInInt.java index b28ef53ec..0abc762f6 100644 --- a/control/ForInInt.java +++ b/control/ForInInt.java @@ -1,5 +1,5 @@ // control/ForInInt.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import static onjava.Range.*; diff --git a/control/ForInString.java b/control/ForInString.java index 0ebbbb5a4..320f17004 100644 --- a/control/ForInString.java +++ b/control/ForInString.java @@ -1,5 +1,5 @@ // control/ForInString.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/control/IfElse.java b/control/IfElse.java index dc9bc8454..1347bcd1d 100644 --- a/control/IfElse.java +++ b/control/IfElse.java @@ -1,5 +1,5 @@ // control/IfElse.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/control/LabeledFor.java b/control/LabeledFor.java index 5f863c3b0..337a9e199 100644 --- a/control/LabeledFor.java +++ b/control/LabeledFor.java @@ -1,5 +1,5 @@ // control/LabeledFor.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // For loops with "labeled break" and "labeled continue." diff --git a/control/LabeledWhile.java b/control/LabeledWhile.java index 4cc4f86b4..8fded1940 100644 --- a/control/LabeledWhile.java +++ b/control/LabeledWhile.java @@ -1,5 +1,5 @@ // control/LabeledWhile.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // "While" with "labeled break" and "labeled continue." diff --git a/control/ListCharacters.java b/control/ListCharacters.java index 3e08f5e9f..c846270d6 100644 --- a/control/ListCharacters.java +++ b/control/ListCharacters.java @@ -1,5 +1,5 @@ // control/ListCharacters.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // List all the lowercase ASCII letters diff --git a/control/RandomBounds.java b/control/RandomBounds.java index cb3b47b40..81a0dc13b 100644 --- a/control/RandomBounds.java +++ b/control/RandomBounds.java @@ -1,5 +1,5 @@ // control/RandomBounds.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Does Math.random() produce 0.0 and 1.0? diff --git a/control/StringSwitch.java b/control/StringSwitch.java index 7771d0170..3ad7236d7 100644 --- a/control/StringSwitch.java +++ b/control/StringSwitch.java @@ -1,5 +1,5 @@ // control/StringSwitch.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/control/TestWithReturn.java b/control/TestWithReturn.java index e6c609eaf..6df7a5df1 100644 --- a/control/TestWithReturn.java +++ b/control/TestWithReturn.java @@ -1,5 +1,5 @@ // control/TestWithReturn.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/control/TrueFalse.java b/control/TrueFalse.java index 89097229c..b4d25db06 100644 --- a/control/TrueFalse.java +++ b/control/TrueFalse.java @@ -1,5 +1,5 @@ // control/TrueFalse.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/control/VowelsAndConsonants.java b/control/VowelsAndConsonants.java index 2272bc100..f8a9b1968 100644 --- a/control/VowelsAndConsonants.java +++ b/control/VowelsAndConsonants.java @@ -1,5 +1,5 @@ // control/VowelsAndConsonants.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Demonstrates the switch statement diff --git a/control/WhileTest.java b/control/WhileTest.java index b54450b05..becb35682 100644 --- a/control/WhileTest.java +++ b/control/WhileTest.java @@ -1,5 +1,5 @@ // control/WhileTest.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Demonstrates the while loop diff --git a/enums/AlarmPoints.java b/enums/AlarmPoints.java index b906a9ccc..ddca40188 100644 --- a/enums/AlarmPoints.java +++ b/enums/AlarmPoints.java @@ -1,5 +1,5 @@ // enums/AlarmPoints.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. package enums; diff --git a/enums/BigEnumSet.java b/enums/BigEnumSet.java index 565d99376..ee4abd6f5 100644 --- a/enums/BigEnumSet.java +++ b/enums/BigEnumSet.java @@ -1,5 +1,5 @@ // enums/BigEnumSet.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.*; diff --git a/enums/Burrito2.java b/enums/Burrito2.java index da01b95a6..5999ce0e4 100644 --- a/enums/Burrito2.java +++ b/enums/Burrito2.java @@ -1,5 +1,5 @@ // enums/Burrito2.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // {java enums.Burrito2} diff --git a/enums/CarWash.java b/enums/CarWash.java index bb478cf1e..8aec591fe 100644 --- a/enums/CarWash.java +++ b/enums/CarWash.java @@ -1,5 +1,5 @@ // enums/CarWash.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.*; diff --git a/enums/Competitor.java b/enums/Competitor.java index e25cadbb1..2f1514681 100644 --- a/enums/Competitor.java +++ b/enums/Competitor.java @@ -1,5 +1,5 @@ // enums/Competitor.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Switching one enum on another diff --git a/enums/ConstantSpecificMethod.java b/enums/ConstantSpecificMethod.java index 80f9c12f1..6154612c5 100644 --- a/enums/ConstantSpecificMethod.java +++ b/enums/ConstantSpecificMethod.java @@ -1,5 +1,5 @@ // enums/ConstantSpecificMethod.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.*; diff --git a/enums/EnumClass.java b/enums/EnumClass.java index c92bab209..96eebb9ee 100644 --- a/enums/EnumClass.java +++ b/enums/EnumClass.java @@ -1,5 +1,5 @@ // enums/EnumClass.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Capabilities of the Enum class diff --git a/enums/EnumMaps.java b/enums/EnumMaps.java index b041bbf7f..f2398e8ae 100644 --- a/enums/EnumMaps.java +++ b/enums/EnumMaps.java @@ -1,5 +1,5 @@ // enums/EnumMaps.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Basics of EnumMaps diff --git a/enums/EnumSets.java b/enums/EnumSets.java index 58cd71847..6f793957d 100644 --- a/enums/EnumSets.java +++ b/enums/EnumSets.java @@ -1,5 +1,5 @@ // enums/EnumSets.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Operations on EnumSets diff --git a/enums/Input.java b/enums/Input.java index db6f52cc0..37d55d80d 100644 --- a/enums/Input.java +++ b/enums/Input.java @@ -1,5 +1,5 @@ // enums/Input.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.*; diff --git a/enums/NonEnum.java b/enums/NonEnum.java index 4011afca2..a1ef0ac8b 100644 --- a/enums/NonEnum.java +++ b/enums/NonEnum.java @@ -1,5 +1,5 @@ // enums/NonEnum.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/enums/NotClasses.java b/enums/NotClasses.java index 049704ab6..fdc5c38d8 100644 --- a/enums/NotClasses.java +++ b/enums/NotClasses.java @@ -1,5 +1,5 @@ // enums/NotClasses.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // {javap -c LikeClasses} diff --git a/enums/Outcome.java b/enums/Outcome.java index 4d8448d9b..da1cf8401 100644 --- a/enums/Outcome.java +++ b/enums/Outcome.java @@ -1,5 +1,5 @@ // enums/Outcome.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. package enums; diff --git a/enums/OverrideConstantSpecific.java b/enums/OverrideConstantSpecific.java index 62f4d2a1c..759131a5a 100644 --- a/enums/OverrideConstantSpecific.java +++ b/enums/OverrideConstantSpecific.java @@ -1,5 +1,5 @@ // enums/OverrideConstantSpecific.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/enums/OzWitch.java b/enums/OzWitch.java index b7df47ade..67aea7f5e 100644 --- a/enums/OzWitch.java +++ b/enums/OzWitch.java @@ -1,5 +1,5 @@ // enums/OzWitch.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // The witches in the land of Oz diff --git a/enums/PostOffice.java b/enums/PostOffice.java index 6be649315..ef692b19f 100644 --- a/enums/PostOffice.java +++ b/enums/PostOffice.java @@ -1,5 +1,5 @@ // enums/PostOffice.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Modeling a post office diff --git a/enums/RandomTest.java b/enums/RandomTest.java index 874be3163..b81835e64 100644 --- a/enums/RandomTest.java +++ b/enums/RandomTest.java @@ -1,5 +1,5 @@ // enums/RandomTest.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import onjava.*; diff --git a/enums/Reflection.java b/enums/Reflection.java index 8e6b93077..b3a44ccce 100644 --- a/enums/Reflection.java +++ b/enums/Reflection.java @@ -1,5 +1,5 @@ // enums/Reflection.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Analyzing enums using reflection diff --git a/enums/RoShamBo.java b/enums/RoShamBo.java index ed8d47820..09ef7fc03 100644 --- a/enums/RoShamBo.java +++ b/enums/RoShamBo.java @@ -1,5 +1,5 @@ // enums/RoShamBo.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Common tools for RoShamBo examples diff --git a/enums/RoShamBo1.java b/enums/RoShamBo1.java index bb141c81b..d49e1dc33 100644 --- a/enums/RoShamBo1.java +++ b/enums/RoShamBo1.java @@ -1,5 +1,5 @@ // enums/RoShamBo1.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Demonstration of multiple dispatching diff --git a/enums/RoShamBo2.java b/enums/RoShamBo2.java index 432051766..c977991c0 100644 --- a/enums/RoShamBo2.java +++ b/enums/RoShamBo2.java @@ -1,5 +1,5 @@ // enums/RoShamBo2.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Switching one enum on another diff --git a/enums/RoShamBo3.java b/enums/RoShamBo3.java index 1a25b9069..a4a843b19 100644 --- a/enums/RoShamBo3.java +++ b/enums/RoShamBo3.java @@ -1,5 +1,5 @@ // enums/RoShamBo3.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Using constant-specific methods diff --git a/enums/RoShamBo4.java b/enums/RoShamBo4.java index e76ddfefc..ccaa7e5da 100644 --- a/enums/RoShamBo4.java +++ b/enums/RoShamBo4.java @@ -1,5 +1,5 @@ // enums/RoShamBo4.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // {java enums.RoShamBo4} diff --git a/enums/RoShamBo5.java b/enums/RoShamBo5.java index 2d5114f71..5382aba12 100644 --- a/enums/RoShamBo5.java +++ b/enums/RoShamBo5.java @@ -1,5 +1,5 @@ // enums/RoShamBo5.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Multiple dispatching using an EnumMap of EnumMaps diff --git a/enums/RoShamBo6.java b/enums/RoShamBo6.java index 99c4ec8b9..1483a8030 100644 --- a/enums/RoShamBo6.java +++ b/enums/RoShamBo6.java @@ -1,5 +1,5 @@ // enums/RoShamBo6.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Enums using "tables" instead of multiple dispatch diff --git a/enums/SecurityCategory.java b/enums/SecurityCategory.java index 2ba65569d..1b7dfa37e 100644 --- a/enums/SecurityCategory.java +++ b/enums/SecurityCategory.java @@ -1,5 +1,5 @@ // enums/SecurityCategory.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // More succinct subcategorization of enums diff --git a/enums/SpaceShip.java b/enums/SpaceShip.java index 22cd8f8b7..0c2ceb46e 100644 --- a/enums/SpaceShip.java +++ b/enums/SpaceShip.java @@ -1,5 +1,5 @@ // enums/SpaceShip.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.stream.*; diff --git a/enums/SpicinessEnum.java b/enums/SpicinessEnum.java index 0260cbce1..78f4518a7 100644 --- a/enums/SpicinessEnum.java +++ b/enums/SpicinessEnum.java @@ -1,5 +1,5 @@ // enums/SpicinessEnum.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. package enums; diff --git a/enums/TrafficLight.java b/enums/TrafficLight.java index 70d0942d1..9be9d3e8a 100644 --- a/enums/TrafficLight.java +++ b/enums/TrafficLight.java @@ -1,5 +1,5 @@ // enums/TrafficLight.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Enums in switch statements diff --git a/enums/UpcastEnum.java b/enums/UpcastEnum.java index d5cca2c97..31995bd64 100644 --- a/enums/UpcastEnum.java +++ b/enums/UpcastEnum.java @@ -1,5 +1,5 @@ // enums/UpcastEnum.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // No values() method if you upcast an enum diff --git a/enums/VendingMachine.java b/enums/VendingMachine.java index db27a45a0..d9c545091 100644 --- a/enums/VendingMachine.java +++ b/enums/VendingMachine.java @@ -1,5 +1,5 @@ // enums/VendingMachine.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // {java VendingMachine VendingMachineInput.txt} diff --git a/enums/cartoons/EnumImplementation.java b/enums/cartoons/EnumImplementation.java index 15a7c24af..f58a145a5 100644 --- a/enums/cartoons/EnumImplementation.java +++ b/enums/cartoons/EnumImplementation.java @@ -1,5 +1,5 @@ // enums/cartoons/EnumImplementation.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // An enum can implement an interface diff --git a/enums/menu/Course.java b/enums/menu/Course.java index ea97f62da..a11fdace9 100644 --- a/enums/menu/Course.java +++ b/enums/menu/Course.java @@ -1,5 +1,5 @@ // enums/menu/Course.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. package enums.menu; diff --git a/enums/menu/Food.java b/enums/menu/Food.java index 49db38678..bfe8dd553 100644 --- a/enums/menu/Food.java +++ b/enums/menu/Food.java @@ -1,5 +1,5 @@ // enums/menu/Food.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Subcategorization of enums within interfaces diff --git a/enums/menu/Meal.java b/enums/menu/Meal.java index efb3b40b1..adfe92a65 100644 --- a/enums/menu/Meal.java +++ b/enums/menu/Meal.java @@ -1,5 +1,5 @@ // enums/menu/Meal.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // {java enums.menu.Meal} diff --git a/enums/menu/Meal2.java b/enums/menu/Meal2.java index 2214a94c9..5d63b54f1 100644 --- a/enums/menu/Meal2.java +++ b/enums/menu/Meal2.java @@ -1,5 +1,5 @@ // enums/menu/Meal2.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // {java enums.menu.Meal2} diff --git a/enums/menu/TypeOfFood.java b/enums/menu/TypeOfFood.java index 6e5ba899f..7909f1f4a 100644 --- a/enums/menu/TypeOfFood.java +++ b/enums/menu/TypeOfFood.java @@ -1,5 +1,5 @@ // enums/menu/TypeOfFood.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // {java enums.menu.TypeOfFood} diff --git a/exceptions/AlwaysFinally.java b/exceptions/AlwaysFinally.java index 16f2333ee..38b15a12d 100644 --- a/exceptions/AlwaysFinally.java +++ b/exceptions/AlwaysFinally.java @@ -1,5 +1,5 @@ // exceptions/AlwaysFinally.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Finally is always executed diff --git a/exceptions/AutoCloseableDetails.java b/exceptions/AutoCloseableDetails.java index 76c67af66..23f8a172a 100644 --- a/exceptions/AutoCloseableDetails.java +++ b/exceptions/AutoCloseableDetails.java @@ -1,5 +1,5 @@ // exceptions/AutoCloseableDetails.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/exceptions/BodyException.java b/exceptions/BodyException.java index 38679bb24..6e5d47777 100644 --- a/exceptions/BodyException.java +++ b/exceptions/BodyException.java @@ -1,5 +1,5 @@ // exceptions/BodyException.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/exceptions/Cleanup.java b/exceptions/Cleanup.java index fe29d6b1e..8854bc148 100644 --- a/exceptions/Cleanup.java +++ b/exceptions/Cleanup.java @@ -1,5 +1,5 @@ // exceptions/Cleanup.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Guaranteeing proper cleanup of a resource diff --git a/exceptions/CleanupIdiom.java b/exceptions/CleanupIdiom.java index 5044d8de7..48ce0d45f 100644 --- a/exceptions/CleanupIdiom.java +++ b/exceptions/CleanupIdiom.java @@ -1,5 +1,5 @@ // exceptions/CleanupIdiom.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Disposable objects must be followed by a try-finally diff --git a/exceptions/CloseExceptions.java b/exceptions/CloseExceptions.java index 638aa0cd4..9ad598b43 100644 --- a/exceptions/CloseExceptions.java +++ b/exceptions/CloseExceptions.java @@ -1,5 +1,5 @@ // exceptions/CloseExceptions.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/exceptions/ConstructorException.java b/exceptions/ConstructorException.java index 09ec36fc8..d3342b388 100644 --- a/exceptions/ConstructorException.java +++ b/exceptions/ConstructorException.java @@ -1,5 +1,5 @@ // exceptions/ConstructorException.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/exceptions/DynamicFields.java b/exceptions/DynamicFields.java index 0aa7056d9..297e8c0bd 100644 --- a/exceptions/DynamicFields.java +++ b/exceptions/DynamicFields.java @@ -1,5 +1,5 @@ // exceptions/DynamicFields.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // A Class that dynamically adds fields to itself to diff --git a/exceptions/ExceptionMethods.java b/exceptions/ExceptionMethods.java index b8067424f..a86d20cca 100644 --- a/exceptions/ExceptionMethods.java +++ b/exceptions/ExceptionMethods.java @@ -1,5 +1,5 @@ // exceptions/ExceptionMethods.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Demonstrating the Exception Methods diff --git a/exceptions/ExceptionSilencer.java b/exceptions/ExceptionSilencer.java index d0e8df611..bb57a939a 100644 --- a/exceptions/ExceptionSilencer.java +++ b/exceptions/ExceptionSilencer.java @@ -1,5 +1,5 @@ // exceptions/ExceptionSilencer.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/exceptions/ExtraFeatures.java b/exceptions/ExtraFeatures.java index 04c0f59ba..b45c27e39 100644 --- a/exceptions/ExtraFeatures.java +++ b/exceptions/ExtraFeatures.java @@ -1,5 +1,5 @@ // exceptions/ExtraFeatures.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Further embellishment of exception classes diff --git a/exceptions/FinallyWorks.java b/exceptions/FinallyWorks.java index 9c3a6c239..c406400da 100644 --- a/exceptions/FinallyWorks.java +++ b/exceptions/FinallyWorks.java @@ -1,5 +1,5 @@ // exceptions/FinallyWorks.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // The finally clause is always executed diff --git a/exceptions/FullConstructors.java b/exceptions/FullConstructors.java index 9936573bd..1851d2d6c 100644 --- a/exceptions/FullConstructors.java +++ b/exceptions/FullConstructors.java @@ -1,5 +1,5 @@ // exceptions/FullConstructors.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/exceptions/Human.java b/exceptions/Human.java index b989c268f..fa067a9e4 100644 --- a/exceptions/Human.java +++ b/exceptions/Human.java @@ -1,5 +1,5 @@ // exceptions/Human.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Catching exception hierarchies diff --git a/exceptions/InheritingExceptions.java b/exceptions/InheritingExceptions.java index 55a7a2510..72afe65ed 100644 --- a/exceptions/InheritingExceptions.java +++ b/exceptions/InheritingExceptions.java @@ -1,5 +1,5 @@ // exceptions/InheritingExceptions.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Creating your own exceptions diff --git a/exceptions/InputFile.java b/exceptions/InputFile.java index a9fba8de6..0de1fbe9e 100644 --- a/exceptions/InputFile.java +++ b/exceptions/InputFile.java @@ -1,5 +1,5 @@ // exceptions/InputFile.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Paying attention to exceptions in constructors diff --git a/exceptions/InputFile2.java b/exceptions/InputFile2.java index 834547cce..2cb71a4c1 100644 --- a/exceptions/InputFile2.java +++ b/exceptions/InputFile2.java @@ -1,5 +1,5 @@ // exceptions/InputFile2.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.io.*; diff --git a/exceptions/LoggingExceptions.java b/exceptions/LoggingExceptions.java index d279388fd..ebdd809d8 100644 --- a/exceptions/LoggingExceptions.java +++ b/exceptions/LoggingExceptions.java @@ -1,5 +1,5 @@ // exceptions/LoggingExceptions.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // An exception that reports through a Logger diff --git a/exceptions/LoggingExceptions2.java b/exceptions/LoggingExceptions2.java index 586622e7b..a99d0a855 100644 --- a/exceptions/LoggingExceptions2.java +++ b/exceptions/LoggingExceptions2.java @@ -1,5 +1,5 @@ // exceptions/LoggingExceptions2.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Logging caught exceptions diff --git a/exceptions/LostMessage.java b/exceptions/LostMessage.java index 145cc85fb..b0f7c318f 100644 --- a/exceptions/LostMessage.java +++ b/exceptions/LostMessage.java @@ -1,5 +1,5 @@ // exceptions/LostMessage.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // How an exception can be lost diff --git a/exceptions/MainException.java b/exceptions/MainException.java index 7749aa2a0..4c6477ec2 100644 --- a/exceptions/MainException.java +++ b/exceptions/MainException.java @@ -1,5 +1,5 @@ // exceptions/MainException.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.*; diff --git a/exceptions/MessyExceptions.java b/exceptions/MessyExceptions.java index 25c0648e4..e79f929d9 100644 --- a/exceptions/MessyExceptions.java +++ b/exceptions/MessyExceptions.java @@ -1,5 +1,5 @@ // exceptions/MessyExceptions.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.io.*; diff --git a/exceptions/MultiCatch.java b/exceptions/MultiCatch.java index 76405b438..64b954e24 100644 --- a/exceptions/MultiCatch.java +++ b/exceptions/MultiCatch.java @@ -1,5 +1,5 @@ // exceptions/MultiCatch.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/exceptions/MultiCatch2.java b/exceptions/MultiCatch2.java index 8e4914057..2ba042919 100644 --- a/exceptions/MultiCatch2.java +++ b/exceptions/MultiCatch2.java @@ -1,5 +1,5 @@ // exceptions/MultiCatch2.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/exceptions/MultipleReturns.java b/exceptions/MultipleReturns.java index cea553556..e6caf3c18 100644 --- a/exceptions/MultipleReturns.java +++ b/exceptions/MultipleReturns.java @@ -1,5 +1,5 @@ // exceptions/MultipleReturns.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/exceptions/NeverCaught.java b/exceptions/NeverCaught.java index 96d2129fb..1999b4862 100644 --- a/exceptions/NeverCaught.java +++ b/exceptions/NeverCaught.java @@ -1,5 +1,5 @@ // exceptions/NeverCaught.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Ignoring RuntimeExceptions diff --git a/exceptions/OnOffException1.java b/exceptions/OnOffException1.java index 9ff3e1afb..b15243285 100644 --- a/exceptions/OnOffException1.java +++ b/exceptions/OnOffException1.java @@ -1,5 +1,5 @@ // exceptions/OnOffException1.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. public class OnOffException1 extends Exception {} diff --git a/exceptions/OnOffException2.java b/exceptions/OnOffException2.java index cc76b45b8..878ea833f 100644 --- a/exceptions/OnOffException2.java +++ b/exceptions/OnOffException2.java @@ -1,5 +1,5 @@ // exceptions/OnOffException2.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. public class OnOffException2 extends Exception {} diff --git a/exceptions/OnOffSwitch.java b/exceptions/OnOffSwitch.java index 756da1485..7f4f35b50 100644 --- a/exceptions/OnOffSwitch.java +++ b/exceptions/OnOffSwitch.java @@ -1,5 +1,5 @@ // exceptions/OnOffSwitch.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Why use finally? diff --git a/exceptions/PreciseRethrow.java b/exceptions/PreciseRethrow.java index c5164e0e2..8e9749380 100644 --- a/exceptions/PreciseRethrow.java +++ b/exceptions/PreciseRethrow.java @@ -1,5 +1,5 @@ // exceptions/PreciseRethrow.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/exceptions/RethrowNew.java b/exceptions/RethrowNew.java index fc174920f..cc2601b07 100644 --- a/exceptions/RethrowNew.java +++ b/exceptions/RethrowNew.java @@ -1,5 +1,5 @@ // exceptions/RethrowNew.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Rethrow a different object from the one you caught diff --git a/exceptions/Rethrowing.java b/exceptions/Rethrowing.java index 869dc9242..2a82dafef 100644 --- a/exceptions/Rethrowing.java +++ b/exceptions/Rethrowing.java @@ -1,5 +1,5 @@ // exceptions/Rethrowing.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Demonstrating fillInStackTrace() diff --git a/exceptions/SameHandler.java b/exceptions/SameHandler.java index 230083d6d..5229dc66e 100644 --- a/exceptions/SameHandler.java +++ b/exceptions/SameHandler.java @@ -1,5 +1,5 @@ // exceptions/SameHandler.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/exceptions/StormyInning.java b/exceptions/StormyInning.java index dec405d81..5b2b727c0 100644 --- a/exceptions/StormyInning.java +++ b/exceptions/StormyInning.java @@ -1,5 +1,5 @@ // exceptions/StormyInning.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Overridden methods can throw only the exceptions diff --git a/exceptions/StreamsAreAutoCloseable.java b/exceptions/StreamsAreAutoCloseable.java index f997b6687..40317d88c 100644 --- a/exceptions/StreamsAreAutoCloseable.java +++ b/exceptions/StreamsAreAutoCloseable.java @@ -1,5 +1,5 @@ // exceptions/StreamsAreAutoCloseable.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.io.*; diff --git a/exceptions/Switch.java b/exceptions/Switch.java index d525ac3cb..ea1323ce4 100644 --- a/exceptions/Switch.java +++ b/exceptions/Switch.java @@ -1,5 +1,5 @@ // exceptions/Switch.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/exceptions/TryAnything.java b/exceptions/TryAnything.java index edf0d1e65..547a16c95 100644 --- a/exceptions/TryAnything.java +++ b/exceptions/TryAnything.java @@ -1,5 +1,5 @@ // exceptions/TryAnything.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // {CompileTimeError} (Will not compile) diff --git a/exceptions/TryWithResources.java b/exceptions/TryWithResources.java index 776ebe38c..daf97a55a 100644 --- a/exceptions/TryWithResources.java +++ b/exceptions/TryWithResources.java @@ -1,5 +1,5 @@ // exceptions/TryWithResources.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.io.*; diff --git a/exceptions/TurnOffChecking.java b/exceptions/TurnOffChecking.java index 4ad43fb3f..654ac285b 100644 --- a/exceptions/TurnOffChecking.java +++ b/exceptions/TurnOffChecking.java @@ -1,5 +1,5 @@ // exceptions/TurnOffChecking.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // "Turning off" Checked exceptions diff --git a/exceptions/WhoCalled.java b/exceptions/WhoCalled.java index a3d18973a..d4a7bf9cf 100644 --- a/exceptions/WhoCalled.java +++ b/exceptions/WhoCalled.java @@ -1,5 +1,5 @@ // exceptions/WhoCalled.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Programmatic access to stack trace information diff --git a/exceptions/WithFinally.java b/exceptions/WithFinally.java index e699d4f71..fc893d6e7 100644 --- a/exceptions/WithFinally.java +++ b/exceptions/WithFinally.java @@ -1,5 +1,5 @@ // exceptions/WithFinally.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Finally Guarantees cleanup diff --git a/files/AddAndSubtractPaths.java b/files/AddAndSubtractPaths.java index c8587fcde..1cf1e8d83 100644 --- a/files/AddAndSubtractPaths.java +++ b/files/AddAndSubtractPaths.java @@ -1,5 +1,5 @@ // files/AddAndSubtractPaths.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.nio.file.*; diff --git a/files/Directories.java b/files/Directories.java index 2b26fa605..0172344bc 100644 --- a/files/Directories.java +++ b/files/Directories.java @@ -1,5 +1,5 @@ // files/Directories.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.*; diff --git a/files/FileSystemDemo.java b/files/FileSystemDemo.java index c1872af69..98c517761 100644 --- a/files/FileSystemDemo.java +++ b/files/FileSystemDemo.java @@ -1,5 +1,5 @@ // files/FileSystemDemo.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.nio.file.*; diff --git a/files/Find.java b/files/Find.java index 57b0d8d87..464615467 100644 --- a/files/Find.java +++ b/files/Find.java @@ -1,5 +1,5 @@ // files/Find.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.nio.file.*; diff --git a/files/ListOfLines.java b/files/ListOfLines.java index d3f8f5590..553bed723 100644 --- a/files/ListOfLines.java +++ b/files/ListOfLines.java @@ -1,5 +1,5 @@ // files/ListOfLines.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.*; diff --git a/files/PartsOfPaths.java b/files/PartsOfPaths.java index f7ba7a01c..9f27e035c 100644 --- a/files/PartsOfPaths.java +++ b/files/PartsOfPaths.java @@ -1,5 +1,5 @@ // files/PartsOfPaths.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.nio.file.*; diff --git a/files/PathAnalysis.java b/files/PathAnalysis.java index c5e5a22fd..d1de44152 100644 --- a/files/PathAnalysis.java +++ b/files/PathAnalysis.java @@ -1,5 +1,5 @@ // files/PathAnalysis.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.nio.file.*; diff --git a/files/PathInfo.java b/files/PathInfo.java index 7c77775af..112744f2d 100644 --- a/files/PathInfo.java +++ b/files/PathInfo.java @@ -1,5 +1,5 @@ // files/PathInfo.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.nio.file.*; diff --git a/files/PathWatcher.java b/files/PathWatcher.java index c22751c29..c9ffdd8e1 100644 --- a/files/PathWatcher.java +++ b/files/PathWatcher.java @@ -1,5 +1,5 @@ // files/PathWatcher.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.io.IOException; diff --git a/files/ReadLineStream.java b/files/ReadLineStream.java index efb266fcd..1409fbee1 100644 --- a/files/ReadLineStream.java +++ b/files/ReadLineStream.java @@ -1,5 +1,5 @@ // files/ReadLineStream.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.nio.file.*; diff --git a/files/StreamInAndOut.java b/files/StreamInAndOut.java index 27682fffa..74a721e9b 100644 --- a/files/StreamInAndOut.java +++ b/files/StreamInAndOut.java @@ -1,5 +1,5 @@ // files/StreamInAndOut.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.io.*; diff --git a/files/TreeWatcher.java b/files/TreeWatcher.java index e45c46b7c..b13107cc2 100644 --- a/files/TreeWatcher.java +++ b/files/TreeWatcher.java @@ -1,5 +1,5 @@ // files/TreeWatcher.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.io.IOException; diff --git a/files/Writing.java b/files/Writing.java index 98edb6a72..a72816700 100644 --- a/files/Writing.java +++ b/files/Writing.java @@ -1,5 +1,5 @@ // files/Writing.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.*; diff --git a/functional/AnonymousClosure.java b/functional/AnonymousClosure.java index 1d19e3641..92c232c74 100644 --- a/functional/AnonymousClosure.java +++ b/functional/AnonymousClosure.java @@ -1,5 +1,5 @@ // functional/AnonymousClosure.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.function.*; diff --git a/functional/BiConsumerPermutations.java b/functional/BiConsumerPermutations.java index 720dde44c..90e2f3dc4 100644 --- a/functional/BiConsumerPermutations.java +++ b/functional/BiConsumerPermutations.java @@ -1,5 +1,5 @@ // functional/BiConsumerPermutations.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.function.*; diff --git a/functional/ClassFunctionals.java b/functional/ClassFunctionals.java index eb3cbdc7c..06d43a236 100644 --- a/functional/ClassFunctionals.java +++ b/functional/ClassFunctionals.java @@ -1,5 +1,5 @@ // functional/ClassFunctionals.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.*; diff --git a/functional/Closure1.java b/functional/Closure1.java index 01dfa1726..f0dfdf060 100644 --- a/functional/Closure1.java +++ b/functional/Closure1.java @@ -1,5 +1,5 @@ // functional/Closure1.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.function.*; diff --git a/functional/Closure2.java b/functional/Closure2.java index 502acb8cf..f42c77342 100644 --- a/functional/Closure2.java +++ b/functional/Closure2.java @@ -1,5 +1,5 @@ // functional/Closure2.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.function.*; diff --git a/functional/Closure3.java b/functional/Closure3.java index 0674153fd..3bba09ea4 100644 --- a/functional/Closure3.java +++ b/functional/Closure3.java @@ -1,5 +1,5 @@ // functional/Closure3.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // {CompileTimeError} (Will not compile) diff --git a/functional/Closure4.java b/functional/Closure4.java index dc0a22d08..947417607 100644 --- a/functional/Closure4.java +++ b/functional/Closure4.java @@ -1,5 +1,5 @@ // functional/Closure4.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.function.*; diff --git a/functional/Closure5.java b/functional/Closure5.java index 8cef14937..d9a5df2f6 100644 --- a/functional/Closure5.java +++ b/functional/Closure5.java @@ -1,5 +1,5 @@ // functional/Closure5.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // {CompileTimeError} (Will not compile) diff --git a/functional/Closure6.java b/functional/Closure6.java index d9b4654ca..459dc6c8c 100644 --- a/functional/Closure6.java +++ b/functional/Closure6.java @@ -1,5 +1,5 @@ // functional/Closure6.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.function.*; diff --git a/functional/Closure7.java b/functional/Closure7.java index a842546a4..dba502fc4 100644 --- a/functional/Closure7.java +++ b/functional/Closure7.java @@ -1,5 +1,5 @@ // functional/Closure7.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // {CompileTimeError} (Will not compile) diff --git a/functional/Closure8.java b/functional/Closure8.java index 0a93758f5..70ed1e248 100644 --- a/functional/Closure8.java +++ b/functional/Closure8.java @@ -1,5 +1,5 @@ // functional/Closure8.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.*; diff --git a/functional/Closure9.java b/functional/Closure9.java index a9e173e22..4b6c8e27a 100644 --- a/functional/Closure9.java +++ b/functional/Closure9.java @@ -1,5 +1,5 @@ // functional/Closure9.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // {CompileTimeError} (Will not compile) diff --git a/functional/ConsumeFunction.java b/functional/ConsumeFunction.java index f7eb9a1a4..bbab0aa0d 100644 --- a/functional/ConsumeFunction.java +++ b/functional/ConsumeFunction.java @@ -1,5 +1,5 @@ // functional/ConsumeFunction.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.function.*; diff --git a/functional/CtorReference.java b/functional/CtorReference.java index 51bff8dd1..0ea701774 100644 --- a/functional/CtorReference.java +++ b/functional/CtorReference.java @@ -1,5 +1,5 @@ // functional/CtorReference.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/functional/CurriedIntAdd.java b/functional/CurriedIntAdd.java index 98c740d15..7b89d59cb 100644 --- a/functional/CurriedIntAdd.java +++ b/functional/CurriedIntAdd.java @@ -1,5 +1,5 @@ // functional/CurriedIntAdd.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.function.*; diff --git a/functional/Curry3Args.java b/functional/Curry3Args.java index 8055e3b36..e27fd0adb 100644 --- a/functional/Curry3Args.java +++ b/functional/Curry3Args.java @@ -1,5 +1,5 @@ // functional/Curry3Args.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.function.*; diff --git a/functional/CurryingAndPartials.java b/functional/CurryingAndPartials.java index c4784559d..ff53990a1 100644 --- a/functional/CurryingAndPartials.java +++ b/functional/CurryingAndPartials.java @@ -1,5 +1,5 @@ // functional/CurryingAndPartials.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.function.*; diff --git a/functional/FunctionComposition.java b/functional/FunctionComposition.java index 49bdcc07b..74a66ddd4 100644 --- a/functional/FunctionComposition.java +++ b/functional/FunctionComposition.java @@ -1,5 +1,5 @@ // functional/FunctionComposition.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.function.*; diff --git a/functional/FunctionVariants.java b/functional/FunctionVariants.java index d78932ca3..976f7f283 100644 --- a/functional/FunctionVariants.java +++ b/functional/FunctionVariants.java @@ -1,5 +1,5 @@ // functional/FunctionVariants.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.function.*; diff --git a/functional/FunctionWithWrapped.java b/functional/FunctionWithWrapped.java index 5f43734ae..99dd8743b 100644 --- a/functional/FunctionWithWrapped.java +++ b/functional/FunctionWithWrapped.java @@ -1,5 +1,5 @@ // functional/FunctionWithWrapped.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.function.*; diff --git a/functional/FunctionalAnnotation.java b/functional/FunctionalAnnotation.java index 31bc7d252..c56812859 100644 --- a/functional/FunctionalAnnotation.java +++ b/functional/FunctionalAnnotation.java @@ -1,5 +1,5 @@ // functional/FunctionalAnnotation.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/functional/IntCall.java b/functional/IntCall.java index 9748742f2..73b985803 100644 --- a/functional/IntCall.java +++ b/functional/IntCall.java @@ -1,5 +1,5 @@ // functional/IntCall.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/functional/LambdaExpressions.java b/functional/LambdaExpressions.java index 50dd72228..3f2b3f734 100644 --- a/functional/LambdaExpressions.java +++ b/functional/LambdaExpressions.java @@ -1,5 +1,5 @@ // functional/LambdaExpressions.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/functional/MethodConversion.java b/functional/MethodConversion.java index e33c9a825..184f01b38 100644 --- a/functional/MethodConversion.java +++ b/functional/MethodConversion.java @@ -1,5 +1,5 @@ // functional/MethodConversion.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.function.*; diff --git a/functional/MethodReferences.java b/functional/MethodReferences.java index 5911f317f..85a4f0b93 100644 --- a/functional/MethodReferences.java +++ b/functional/MethodReferences.java @@ -1,5 +1,5 @@ // functional/MethodReferences.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.*; diff --git a/functional/MultiUnbound.java b/functional/MultiUnbound.java index aed17795a..ce50b2f4d 100644 --- a/functional/MultiUnbound.java +++ b/functional/MultiUnbound.java @@ -1,5 +1,5 @@ // functional/MultiUnbound.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Unbound methods with multiple arguments diff --git a/functional/PredicateComposition.java b/functional/PredicateComposition.java index 1a8bbf3ae..5ebe4e77d 100644 --- a/functional/PredicateComposition.java +++ b/functional/PredicateComposition.java @@ -1,5 +1,5 @@ // functional/PredicateComposition.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.function.*; diff --git a/functional/ProduceFunction.java b/functional/ProduceFunction.java index bb5735326..6682be9d9 100644 --- a/functional/ProduceFunction.java +++ b/functional/ProduceFunction.java @@ -1,5 +1,5 @@ // functional/ProduceFunction.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.function.*; diff --git a/functional/RecursiveFactorial.java b/functional/RecursiveFactorial.java index a0ab4ca16..0a32d3346 100644 --- a/functional/RecursiveFactorial.java +++ b/functional/RecursiveFactorial.java @@ -1,5 +1,5 @@ // functional/RecursiveFactorial.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/functional/RecursiveFibonacci.java b/functional/RecursiveFibonacci.java index b7e243c83..8cb2c7d24 100644 --- a/functional/RecursiveFibonacci.java +++ b/functional/RecursiveFibonacci.java @@ -1,5 +1,5 @@ // functional/RecursiveFibonacci.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/functional/RunnableMethodReference.java b/functional/RunnableMethodReference.java index 5e2304295..92f2e2906 100644 --- a/functional/RunnableMethodReference.java +++ b/functional/RunnableMethodReference.java @@ -1,5 +1,5 @@ // functional/RunnableMethodReference.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Method references with interface Runnable diff --git a/functional/SharedStorage.java b/functional/SharedStorage.java index be005eece..20da6917b 100644 --- a/functional/SharedStorage.java +++ b/functional/SharedStorage.java @@ -1,5 +1,5 @@ // functional/SharedStorage.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.function.*; diff --git a/functional/Strategize.java b/functional/Strategize.java index cc87e047e..c101fd1d3 100644 --- a/functional/Strategize.java +++ b/functional/Strategize.java @@ -1,5 +1,5 @@ // functional/Strategize.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/functional/TransformFunction.java b/functional/TransformFunction.java index 534fd98e7..8a8c4928d 100644 --- a/functional/TransformFunction.java +++ b/functional/TransformFunction.java @@ -1,5 +1,5 @@ // functional/TransformFunction.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.function.*; diff --git a/functional/TriFunction.java b/functional/TriFunction.java index 3a12ce70c..47895dc95 100644 --- a/functional/TriFunction.java +++ b/functional/TriFunction.java @@ -1,5 +1,5 @@ // functional/TriFunction.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/functional/TriFunctionTest.java b/functional/TriFunctionTest.java index 3b270609f..f87b4421e 100644 --- a/functional/TriFunctionTest.java +++ b/functional/TriFunctionTest.java @@ -1,5 +1,5 @@ // functional/TriFunctionTest.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/functional/UnboundMethodReference.java b/functional/UnboundMethodReference.java index fc28af618..88c9d3d33 100644 --- a/functional/UnboundMethodReference.java +++ b/functional/UnboundMethodReference.java @@ -1,5 +1,5 @@ // functional/UnboundMethodReference.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Method reference without an object diff --git a/generics/Amphibian.java b/generics/Amphibian.java index eb9644a99..fbff20b56 100644 --- a/generics/Amphibian.java +++ b/generics/Amphibian.java @@ -1,5 +1,5 @@ // generics/Amphibian.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. public class Amphibian {} diff --git a/generics/Apply.java b/generics/Apply.java index 7b1e0970b..d1923a279 100644 --- a/generics/Apply.java +++ b/generics/Apply.java @@ -1,5 +1,5 @@ // generics/Apply.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.lang.reflect.*; diff --git a/generics/ApplyFunctional.java b/generics/ApplyFunctional.java index 68377556e..2dd8aa1c8 100644 --- a/generics/ApplyFunctional.java +++ b/generics/ApplyFunctional.java @@ -1,5 +1,5 @@ // generics/ApplyFunctional.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.*; diff --git a/generics/ApplyTest.java b/generics/ApplyTest.java index da39b2d83..9e5b161e4 100644 --- a/generics/ApplyTest.java +++ b/generics/ApplyTest.java @@ -1,5 +1,5 @@ // generics/ApplyTest.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.*; diff --git a/generics/ArrayMaker.java b/generics/ArrayMaker.java index 993a6a9fe..9b495d4e4 100644 --- a/generics/ArrayMaker.java +++ b/generics/ArrayMaker.java @@ -1,5 +1,5 @@ // generics/ArrayMaker.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.lang.reflect.*; diff --git a/generics/ArrayOfGeneric.java b/generics/ArrayOfGeneric.java index 8f5c57add..210d01368 100644 --- a/generics/ArrayOfGeneric.java +++ b/generics/ArrayOfGeneric.java @@ -1,5 +1,5 @@ // generics/ArrayOfGeneric.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/generics/ArrayOfGenericReference.java b/generics/ArrayOfGenericReference.java index 2eac659b9..a1484e2f9 100644 --- a/generics/ArrayOfGenericReference.java +++ b/generics/ArrayOfGenericReference.java @@ -1,5 +1,5 @@ // generics/ArrayOfGenericReference.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/generics/BankTeller.java b/generics/BankTeller.java index 22540a0e4..125ca9bf4 100644 --- a/generics/BankTeller.java +++ b/generics/BankTeller.java @@ -1,5 +1,5 @@ // generics/BankTeller.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // A very simple bank teller simulation diff --git a/generics/BasicBounds.java b/generics/BasicBounds.java index 2e23da5c9..d55ac5b3c 100644 --- a/generics/BasicBounds.java +++ b/generics/BasicBounds.java @@ -1,5 +1,5 @@ // generics/BasicBounds.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/generics/BasicHolder.java b/generics/BasicHolder.java index 49090af5c..8d8838391 100644 --- a/generics/BasicHolder.java +++ b/generics/BasicHolder.java @@ -1,5 +1,5 @@ // generics/BasicHolder.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/generics/BasicSupplierDemo.java b/generics/BasicSupplierDemo.java index 7f63342a2..1d34c2337 100644 --- a/generics/BasicSupplierDemo.java +++ b/generics/BasicSupplierDemo.java @@ -1,5 +1,5 @@ // generics/BasicSupplierDemo.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import onjava.*; diff --git a/generics/ByteSet.java b/generics/ByteSet.java index 68d7e9c22..ae1a2573b 100644 --- a/generics/ByteSet.java +++ b/generics/ByteSet.java @@ -1,5 +1,5 @@ // generics/ByteSet.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.*; diff --git a/generics/CRGWithBasicHolder.java b/generics/CRGWithBasicHolder.java index d70c13cb2..71b5ab0d2 100644 --- a/generics/CRGWithBasicHolder.java +++ b/generics/CRGWithBasicHolder.java @@ -1,5 +1,5 @@ // generics/CRGWithBasicHolder.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/generics/CaptureConversion.java b/generics/CaptureConversion.java index 775c58825..190140008 100644 --- a/generics/CaptureConversion.java +++ b/generics/CaptureConversion.java @@ -1,5 +1,5 @@ // generics/CaptureConversion.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/generics/CheckedList.java b/generics/CheckedList.java index 9bdcda2ec..bd1c22b7d 100644 --- a/generics/CheckedList.java +++ b/generics/CheckedList.java @@ -1,5 +1,5 @@ // generics/CheckedList.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Using Collection.checkedList() diff --git a/generics/ClassCasting.java b/generics/ClassCasting.java index f5b42ad13..714e9610b 100644 --- a/generics/ClassCasting.java +++ b/generics/ClassCasting.java @@ -1,5 +1,5 @@ // generics/ClassCasting.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.io.*; diff --git a/generics/ClassTypeCapture.java b/generics/ClassTypeCapture.java index 2a829b277..d98210c2c 100644 --- a/generics/ClassTypeCapture.java +++ b/generics/ClassTypeCapture.java @@ -1,5 +1,5 @@ // generics/ClassTypeCapture.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/generics/ComparablePet.java b/generics/ComparablePet.java index 15368197d..1e401eafb 100644 --- a/generics/ComparablePet.java +++ b/generics/ComparablePet.java @@ -1,5 +1,5 @@ // generics/ComparablePet.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/generics/CompilerIntelligence.java b/generics/CompilerIntelligence.java index 85df9bf34..437b44e14 100644 --- a/generics/CompilerIntelligence.java +++ b/generics/CompilerIntelligence.java @@ -1,5 +1,5 @@ // generics/CompilerIntelligence.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.*; diff --git a/generics/CountedObject.java b/generics/CountedObject.java index d6ed62950..81777402d 100644 --- a/generics/CountedObject.java +++ b/generics/CountedObject.java @@ -1,5 +1,5 @@ // generics/CountedObject.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/generics/CovariantArrays.java b/generics/CovariantArrays.java index 9136a0154..3d30a4202 100644 --- a/generics/CovariantArrays.java +++ b/generics/CovariantArrays.java @@ -1,5 +1,5 @@ // generics/CovariantArrays.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/generics/CovariantReturnTypes.java b/generics/CovariantReturnTypes.java index 2949faffa..741e10615 100644 --- a/generics/CovariantReturnTypes.java +++ b/generics/CovariantReturnTypes.java @@ -1,5 +1,5 @@ // generics/CovariantReturnTypes.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/generics/CreatorGeneric.java b/generics/CreatorGeneric.java index 87713446f..98bf7c161 100644 --- a/generics/CreatorGeneric.java +++ b/generics/CreatorGeneric.java @@ -1,5 +1,5 @@ // generics/CreatorGeneric.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/generics/CuriouslyRecurringGeneric.java b/generics/CuriouslyRecurringGeneric.java index d73b1ba4a..1d3a69cd1 100644 --- a/generics/CuriouslyRecurringGeneric.java +++ b/generics/CuriouslyRecurringGeneric.java @@ -1,5 +1,5 @@ // generics/CuriouslyRecurringGeneric.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/generics/Diamond.java b/generics/Diamond.java index de58b0eb4..3af10a18b 100644 --- a/generics/Diamond.java +++ b/generics/Diamond.java @@ -1,5 +1,5 @@ // generics/Diamond.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/generics/DogsAndRobotMethodReferences.java b/generics/DogsAndRobotMethodReferences.java index 4a7c346c8..cf779321f 100644 --- a/generics/DogsAndRobotMethodReferences.java +++ b/generics/DogsAndRobotMethodReferences.java @@ -1,5 +1,5 @@ // generics/DogsAndRobotMethodReferences.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // "Assisted Latent Typing" diff --git a/generics/DogsAndRobots.cpp b/generics/DogsAndRobots.cpp index c3cab35b4..212893a6d 100644 --- a/generics/DogsAndRobots.cpp +++ b/generics/DogsAndRobots.cpp @@ -1,5 +1,5 @@ // generics/DogsAndRobots.cpp -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. #include diff --git a/generics/DogsAndRobots.java b/generics/DogsAndRobots.java index 2aa4d03d2..95ee18a30 100644 --- a/generics/DogsAndRobots.java +++ b/generics/DogsAndRobots.java @@ -1,5 +1,5 @@ // generics/DogsAndRobots.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // No (direct) latent typing in Java diff --git a/generics/DogsAndRobots.py b/generics/DogsAndRobots.py index aca33fa59..d09b24139 100644 --- a/generics/DogsAndRobots.py +++ b/generics/DogsAndRobots.py @@ -1,5 +1,5 @@ # generics/DogsAndRobots.py -# (c)2016 MindView LLC: see Copyright.txt +# (c)2017 MindView LLC: see Copyright.txt # We make no guarantees that this code is fit for any purpose. # Visit http://OnJava8.com for more book information. diff --git a/generics/DynamicProxyMixin.java b/generics/DynamicProxyMixin.java index 250aec23a..337ab3e8e 100644 --- a/generics/DynamicProxyMixin.java +++ b/generics/DynamicProxyMixin.java @@ -1,5 +1,5 @@ // generics/DynamicProxyMixin.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.lang.reflect.*; diff --git a/generics/EpicBattle.java b/generics/EpicBattle.java index 8c3e61ae7..60bb4ca82 100644 --- a/generics/EpicBattle.java +++ b/generics/EpicBattle.java @@ -1,5 +1,5 @@ // generics/EpicBattle.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Bounds in Java generics diff --git a/generics/Erased.java b/generics/Erased.java index f564bcd3c..8a1edd9dc 100644 --- a/generics/Erased.java +++ b/generics/Erased.java @@ -1,5 +1,5 @@ // generics/Erased.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // {CompileTimeError} (Will not compile) diff --git a/generics/ErasedTypeEquivalence.java b/generics/ErasedTypeEquivalence.java index 843503b2f..9b3827df3 100644 --- a/generics/ErasedTypeEquivalence.java +++ b/generics/ErasedTypeEquivalence.java @@ -1,5 +1,5 @@ // generics/ErasedTypeEquivalence.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.*; diff --git a/generics/ErasureAndInheritance.java b/generics/ErasureAndInheritance.java index 708887527..9a723c1b5 100644 --- a/generics/ErasureAndInheritance.java +++ b/generics/ErasureAndInheritance.java @@ -1,5 +1,5 @@ // generics/ErasureAndInheritance.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/generics/FactoryConstraint.java b/generics/FactoryConstraint.java index 45d4a8d84..36957a867 100644 --- a/generics/FactoryConstraint.java +++ b/generics/FactoryConstraint.java @@ -1,5 +1,5 @@ // generics/FactoryConstraint.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.*; diff --git a/generics/Fibonacci.java b/generics/Fibonacci.java index e0d402eaa..10d2e8b4a 100644 --- a/generics/Fibonacci.java +++ b/generics/Fibonacci.java @@ -1,5 +1,5 @@ // generics/Fibonacci.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Generate a Fibonacci sequence diff --git a/generics/FilledList.java b/generics/FilledList.java index 7647ec4a8..b9e1cb285 100644 --- a/generics/FilledList.java +++ b/generics/FilledList.java @@ -1,5 +1,5 @@ // generics/FilledList.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.*; diff --git a/generics/GenericArray.java b/generics/GenericArray.java index cf61acf7f..d91a68d52 100644 --- a/generics/GenericArray.java +++ b/generics/GenericArray.java @@ -1,5 +1,5 @@ // generics/GenericArray.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/generics/GenericArray2.java b/generics/GenericArray2.java index 35fff96d5..9fa0910fb 100644 --- a/generics/GenericArray2.java +++ b/generics/GenericArray2.java @@ -1,5 +1,5 @@ // generics/GenericArray2.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/generics/GenericArrayWithTypeToken.java b/generics/GenericArrayWithTypeToken.java index 57ea150d2..41fcd124e 100644 --- a/generics/GenericArrayWithTypeToken.java +++ b/generics/GenericArrayWithTypeToken.java @@ -1,5 +1,5 @@ // generics/GenericArrayWithTypeToken.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.lang.reflect.*; diff --git a/generics/GenericCast.java b/generics/GenericCast.java index 48428b2eb..7ceed13d2 100644 --- a/generics/GenericCast.java +++ b/generics/GenericCast.java @@ -1,5 +1,5 @@ // generics/GenericCast.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.stream.*; diff --git a/generics/GenericHolder.java b/generics/GenericHolder.java index d352ec638..72cf4f2ce 100644 --- a/generics/GenericHolder.java +++ b/generics/GenericHolder.java @@ -1,5 +1,5 @@ // generics/GenericHolder.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/generics/GenericHolder2.java b/generics/GenericHolder2.java index 032a9440b..b71543191 100644 --- a/generics/GenericHolder2.java +++ b/generics/GenericHolder2.java @@ -1,5 +1,5 @@ // generics/GenericHolder2.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/generics/GenericMethods.java b/generics/GenericMethods.java index 54edacb39..50db2061b 100644 --- a/generics/GenericMethods.java +++ b/generics/GenericMethods.java @@ -1,5 +1,5 @@ // generics/GenericMethods.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/generics/GenericReading.java b/generics/GenericReading.java index 5b3646a4f..8479f105e 100644 --- a/generics/GenericReading.java +++ b/generics/GenericReading.java @@ -1,5 +1,5 @@ // generics/GenericReading.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.*; diff --git a/generics/GenericVarargs.java b/generics/GenericVarargs.java index feed33b5a..82a120378 100644 --- a/generics/GenericVarargs.java +++ b/generics/GenericVarargs.java @@ -1,5 +1,5 @@ // generics/GenericVarargs.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.*; diff --git a/generics/GenericsAndCovariance.java b/generics/GenericsAndCovariance.java index 4dca050a6..31cdc6605 100644 --- a/generics/GenericsAndCovariance.java +++ b/generics/GenericsAndCovariance.java @@ -1,5 +1,5 @@ // generics/GenericsAndCovariance.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.*; diff --git a/generics/GenericsAndReturnTypes.java b/generics/GenericsAndReturnTypes.java index 36342dd4c..c64d6a18b 100644 --- a/generics/GenericsAndReturnTypes.java +++ b/generics/GenericsAndReturnTypes.java @@ -1,5 +1,5 @@ // generics/GenericsAndReturnTypes.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/generics/HasF.java b/generics/HasF.java index f74378dce..7547d7475 100644 --- a/generics/HasF.java +++ b/generics/HasF.java @@ -1,5 +1,5 @@ // generics/HasF.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/generics/HijackedInterface.java b/generics/HijackedInterface.java index bb849fba3..7787d1f42 100644 --- a/generics/HijackedInterface.java +++ b/generics/HijackedInterface.java @@ -1,5 +1,5 @@ // generics/HijackedInterface.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // {CompileTimeError} (Will not compile) diff --git a/generics/Holder.java b/generics/Holder.java index f85d2ebcc..dec557cb8 100644 --- a/generics/Holder.java +++ b/generics/Holder.java @@ -1,5 +1,5 @@ // generics/Holder.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.Objects; diff --git a/generics/Holder1.java b/generics/Holder1.java index b1f505598..dc9f7a115 100644 --- a/generics/Holder1.java +++ b/generics/Holder1.java @@ -1,5 +1,5 @@ // generics/Holder1.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/generics/InheritBounds.java b/generics/InheritBounds.java index 6cb875be2..bb01d71ee 100644 --- a/generics/InheritBounds.java +++ b/generics/InheritBounds.java @@ -1,5 +1,5 @@ // generics/InheritBounds.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/generics/InstantiateGenericType.cpp b/generics/InstantiateGenericType.cpp index 761935feb..6197e5c31 100644 --- a/generics/InstantiateGenericType.cpp +++ b/generics/InstantiateGenericType.cpp @@ -1,5 +1,5 @@ // generics/InstantiateGenericType.cpp -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // C++, not Java! diff --git a/generics/InstantiateGenericType.java b/generics/InstantiateGenericType.java index 663f7a0e6..627e17bc3 100644 --- a/generics/InstantiateGenericType.java +++ b/generics/InstantiateGenericType.java @@ -1,5 +1,5 @@ // generics/InstantiateGenericType.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.function.*; diff --git a/generics/IterableFibonacci.java b/generics/IterableFibonacci.java index 2622c5211..1494157c6 100644 --- a/generics/IterableFibonacci.java +++ b/generics/IterableFibonacci.java @@ -1,5 +1,5 @@ // generics/IterableFibonacci.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Adapt the Fibonacci class to make it Iterable diff --git a/generics/LatentReflection.java b/generics/LatentReflection.java index 5c9408a5d..9ee02bf18 100644 --- a/generics/LatentReflection.java +++ b/generics/LatentReflection.java @@ -1,5 +1,5 @@ // generics/LatentReflection.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Using reflection for latent typing diff --git a/generics/LinkedStack.java b/generics/LinkedStack.java index 8aacf42b9..31f7fd0fd 100644 --- a/generics/LinkedStack.java +++ b/generics/LinkedStack.java @@ -1,5 +1,5 @@ // generics/LinkedStack.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // A stack implemented with an internal linked structure diff --git a/generics/ListMaker.java b/generics/ListMaker.java index df13ebb24..7de76a847 100644 --- a/generics/ListMaker.java +++ b/generics/ListMaker.java @@ -1,5 +1,5 @@ // generics/ListMaker.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.*; diff --git a/generics/ListOfGenerics.java b/generics/ListOfGenerics.java index 530c54a5c..c0f5fae80 100644 --- a/generics/ListOfGenerics.java +++ b/generics/ListOfGenerics.java @@ -1,5 +1,5 @@ // generics/ListOfGenerics.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.*; diff --git a/generics/ListOfInt.java b/generics/ListOfInt.java index 9c0dab928..50491f8f2 100644 --- a/generics/ListOfInt.java +++ b/generics/ListOfInt.java @@ -1,5 +1,5 @@ // generics/ListOfInt.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Autoboxing compensates for the inability diff --git a/generics/LostInformation.java b/generics/LostInformation.java index 94791fd50..031a166c1 100644 --- a/generics/LostInformation.java +++ b/generics/LostInformation.java @@ -1,5 +1,5 @@ // generics/LostInformation.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.*; diff --git a/generics/Manipulation.java b/generics/Manipulation.java index 354ab98df..484aa809b 100644 --- a/generics/Manipulation.java +++ b/generics/Manipulation.java @@ -1,5 +1,5 @@ // generics/Manipulation.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // {CompileTimeError} (Will not compile) diff --git a/generics/Manipulator2.java b/generics/Manipulator2.java index 7b00cd146..c705b84ed 100644 --- a/generics/Manipulator2.java +++ b/generics/Manipulator2.java @@ -1,5 +1,5 @@ // generics/Manipulator2.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/generics/Manipulator3.java b/generics/Manipulator3.java index 00d96ae99..e2a9878e4 100644 --- a/generics/Manipulator3.java +++ b/generics/Manipulator3.java @@ -1,5 +1,5 @@ // generics/Manipulator3.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/generics/Mixins.cpp b/generics/Mixins.cpp index 18df5c329..3178f357c 100644 --- a/generics/Mixins.cpp +++ b/generics/Mixins.cpp @@ -1,5 +1,5 @@ // generics/Mixins.cpp -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. #include diff --git a/generics/Mixins.java b/generics/Mixins.java index 0425145c4..a5216675b 100644 --- a/generics/Mixins.java +++ b/generics/Mixins.java @@ -1,5 +1,5 @@ // generics/Mixins.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.*; diff --git a/generics/MultipleInterfaceVariants.java b/generics/MultipleInterfaceVariants.java index f6c351038..95054a4ab 100644 --- a/generics/MultipleInterfaceVariants.java +++ b/generics/MultipleInterfaceVariants.java @@ -1,5 +1,5 @@ // generics/MultipleInterfaceVariants.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // {CompileTimeError} (Will not compile) diff --git a/generics/NeedCasting.java b/generics/NeedCasting.java index 4a524c3f2..910be732d 100644 --- a/generics/NeedCasting.java +++ b/generics/NeedCasting.java @@ -1,5 +1,5 @@ // generics/NeedCasting.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.io.*; diff --git a/generics/NonCovariantGenerics.java b/generics/NonCovariantGenerics.java index b3ab48d60..7df8f464c 100644 --- a/generics/NonCovariantGenerics.java +++ b/generics/NonCovariantGenerics.java @@ -1,5 +1,5 @@ // generics/NonCovariantGenerics.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // {CompileTimeError} (Will not compile) diff --git a/generics/NotSelfBounded.java b/generics/NotSelfBounded.java index edc1fe483..b691a397d 100644 --- a/generics/NotSelfBounded.java +++ b/generics/NotSelfBounded.java @@ -1,5 +1,5 @@ // generics/NotSelfBounded.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/generics/ObjectHolder.java b/generics/ObjectHolder.java index b56167a3b..02f81bd19 100644 --- a/generics/ObjectHolder.java +++ b/generics/ObjectHolder.java @@ -1,5 +1,5 @@ // generics/ObjectHolder.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/generics/OrdinaryArguments.java b/generics/OrdinaryArguments.java index 66a62e511..c2b3c5c40 100644 --- a/generics/OrdinaryArguments.java +++ b/generics/OrdinaryArguments.java @@ -1,5 +1,5 @@ // generics/OrdinaryArguments.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/generics/Performs.java b/generics/Performs.java index 7fd55af7e..9a9f248e1 100644 --- a/generics/Performs.java +++ b/generics/Performs.java @@ -1,5 +1,5 @@ // generics/Performs.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/generics/PlainGenericInheritance.java b/generics/PlainGenericInheritance.java index 02202da24..4ef82c8d1 100644 --- a/generics/PlainGenericInheritance.java +++ b/generics/PlainGenericInheritance.java @@ -1,5 +1,5 @@ // generics/PlainGenericInheritance.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/generics/PrimitiveGenericTest.java b/generics/PrimitiveGenericTest.java index cfd211a72..931805095 100644 --- a/generics/PrimitiveGenericTest.java +++ b/generics/PrimitiveGenericTest.java @@ -1,5 +1,5 @@ // generics/PrimitiveGenericTest.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import onjava.*; diff --git a/generics/RandomList.java b/generics/RandomList.java index 502a67fda..a16eef03e 100644 --- a/generics/RandomList.java +++ b/generics/RandomList.java @@ -1,5 +1,5 @@ // generics/RandomList.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.*; diff --git a/generics/RestrictedComparablePets.java b/generics/RestrictedComparablePets.java index aff84c2a7..3deed6317 100644 --- a/generics/RestrictedComparablePets.java +++ b/generics/RestrictedComparablePets.java @@ -1,5 +1,5 @@ // generics/RestrictedComparablePets.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/generics/ReturnGenericType.java b/generics/ReturnGenericType.java index 7813f8d6e..4f66b7e79 100644 --- a/generics/ReturnGenericType.java +++ b/generics/ReturnGenericType.java @@ -1,5 +1,5 @@ // generics/ReturnGenericType.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/generics/SelfBounding.java b/generics/SelfBounding.java index d021795c4..ccecc9182 100644 --- a/generics/SelfBounding.java +++ b/generics/SelfBounding.java @@ -1,5 +1,5 @@ // generics/SelfBounding.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/generics/SelfBoundingAndCovariantArguments.java b/generics/SelfBoundingAndCovariantArguments.java index b4db4d9b4..55ffabac2 100644 --- a/generics/SelfBoundingAndCovariantArguments.java +++ b/generics/SelfBoundingAndCovariantArguments.java @@ -1,5 +1,5 @@ // generics/SelfBoundingAndCovariantArguments.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/generics/SelfBoundingMethods.java b/generics/SelfBoundingMethods.java index 28ac42987..76f0fb775 100644 --- a/generics/SelfBoundingMethods.java +++ b/generics/SelfBoundingMethods.java @@ -1,5 +1,5 @@ // generics/SelfBoundingMethods.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/generics/Shape.java b/generics/Shape.java index 5de003538..68a67ea70 100644 --- a/generics/Shape.java +++ b/generics/Shape.java @@ -1,5 +1,5 @@ // generics/Shape.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/generics/SimpleDogsAndRobots.java b/generics/SimpleDogsAndRobots.java index d52ed0a03..c659a9988 100644 --- a/generics/SimpleDogsAndRobots.java +++ b/generics/SimpleDogsAndRobots.java @@ -1,5 +1,5 @@ // generics/SimpleDogsAndRobots.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Removing the generic; code still works diff --git a/generics/SimpleHolder.java b/generics/SimpleHolder.java index da2ae5386..b8673b243 100644 --- a/generics/SimpleHolder.java +++ b/generics/SimpleHolder.java @@ -1,5 +1,5 @@ // generics/SimpleHolder.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/generics/SimpleQueue.java b/generics/SimpleQueue.java index a8e6620f0..e74db48d3 100644 --- a/generics/SimpleQueue.java +++ b/generics/SimpleQueue.java @@ -1,5 +1,5 @@ // generics/SimpleQueue.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // A different kind of Iterable collection diff --git a/generics/Square.java b/generics/Square.java index 1dd389df5..f12071f6c 100644 --- a/generics/Square.java +++ b/generics/Square.java @@ -1,5 +1,5 @@ // generics/Square.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. public class Square extends Shape {} diff --git a/generics/Store.java b/generics/Store.java index 0847c0188..3ce697290 100644 --- a/generics/Store.java +++ b/generics/Store.java @@ -1,5 +1,5 @@ // generics/Store.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Building a complex model using generic collections diff --git a/generics/SuperTypeWildcards.java b/generics/SuperTypeWildcards.java index 269c46f10..c06a0d86f 100644 --- a/generics/SuperTypeWildcards.java +++ b/generics/SuperTypeWildcards.java @@ -1,5 +1,5 @@ // generics/SuperTypeWildcards.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.*; diff --git a/generics/Templates.cpp b/generics/Templates.cpp index 23e315a55..7434912a8 100644 --- a/generics/Templates.cpp +++ b/generics/Templates.cpp @@ -1,5 +1,5 @@ // generics/Templates.cpp -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. #include diff --git a/generics/ThrowGenericException.java b/generics/ThrowGenericException.java index 9e429b888..55a1c6512 100644 --- a/generics/ThrowGenericException.java +++ b/generics/ThrowGenericException.java @@ -1,5 +1,5 @@ // generics/ThrowGenericException.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.*; diff --git a/generics/TupleList.java b/generics/TupleList.java index aed0d76dd..c25a135be 100644 --- a/generics/TupleList.java +++ b/generics/TupleList.java @@ -1,5 +1,5 @@ // generics/TupleList.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Combining generic types to make complex generic types diff --git a/generics/TupleTest.java b/generics/TupleTest.java index 52901fd4e..7a0e3c732 100644 --- a/generics/TupleTest.java +++ b/generics/TupleTest.java @@ -1,5 +1,5 @@ // generics/TupleTest.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import onjava.*; diff --git a/generics/TupleTest2.java b/generics/TupleTest2.java index 581a9996d..c12d77efa 100644 --- a/generics/TupleTest2.java +++ b/generics/TupleTest2.java @@ -1,5 +1,5 @@ // generics/TupleTest2.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import onjava.*; diff --git a/generics/UnboundedWildcards1.java b/generics/UnboundedWildcards1.java index a978a87d9..2a8ce8ae3 100644 --- a/generics/UnboundedWildcards1.java +++ b/generics/UnboundedWildcards1.java @@ -1,5 +1,5 @@ // generics/UnboundedWildcards1.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.*; diff --git a/generics/UnboundedWildcards2.java b/generics/UnboundedWildcards2.java index 8f49eee18..159bab7b0 100644 --- a/generics/UnboundedWildcards2.java +++ b/generics/UnboundedWildcards2.java @@ -1,5 +1,5 @@ // generics/UnboundedWildcards2.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.*; diff --git a/generics/Unconstrained.java b/generics/Unconstrained.java index 2200a9198..223c5f8c1 100644 --- a/generics/Unconstrained.java +++ b/generics/Unconstrained.java @@ -1,5 +1,5 @@ // generics/Unconstrained.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/generics/UseList.java b/generics/UseList.java index 0cceadf10..329768789 100644 --- a/generics/UseList.java +++ b/generics/UseList.java @@ -1,5 +1,5 @@ // generics/UseList.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // {CompileTimeError} (Will not compile) diff --git a/generics/UseList2.java b/generics/UseList2.java index 25db296d6..4e7dcf294 100644 --- a/generics/UseList2.java +++ b/generics/UseList2.java @@ -1,5 +1,5 @@ // generics/UseList2.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.*; diff --git a/generics/Vehicle.java b/generics/Vehicle.java index 3f686fa97..e45b5219c 100644 --- a/generics/Vehicle.java +++ b/generics/Vehicle.java @@ -1,5 +1,5 @@ // generics/Vehicle.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. public class Vehicle {} diff --git a/generics/WatercolorSets.java b/generics/WatercolorSets.java index 011decc49..365cace8a 100644 --- a/generics/WatercolorSets.java +++ b/generics/WatercolorSets.java @@ -1,5 +1,5 @@ // generics/WatercolorSets.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import generics.watercolors.*; diff --git a/generics/Wildcards.java b/generics/Wildcards.java index 960356b5e..02643eee8 100644 --- a/generics/Wildcards.java +++ b/generics/Wildcards.java @@ -1,5 +1,5 @@ // generics/Wildcards.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Exploring the meaning of wildcards diff --git a/generics/coffee/Americano.java b/generics/coffee/Americano.java index c488757db..be25727ff 100644 --- a/generics/coffee/Americano.java +++ b/generics/coffee/Americano.java @@ -1,5 +1,5 @@ // generics/coffee/Americano.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. package generics.coffee; diff --git a/generics/coffee/Breve.java b/generics/coffee/Breve.java index a2ddb382b..f5b521178 100644 --- a/generics/coffee/Breve.java +++ b/generics/coffee/Breve.java @@ -1,5 +1,5 @@ // generics/coffee/Breve.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. package generics.coffee; diff --git a/generics/coffee/Cappuccino.java b/generics/coffee/Cappuccino.java index 77c62e339..5804b7711 100644 --- a/generics/coffee/Cappuccino.java +++ b/generics/coffee/Cappuccino.java @@ -1,5 +1,5 @@ // generics/coffee/Cappuccino.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. package generics.coffee; diff --git a/generics/coffee/Coffee.java b/generics/coffee/Coffee.java index dd457d9e5..760788d40 100644 --- a/generics/coffee/Coffee.java +++ b/generics/coffee/Coffee.java @@ -1,5 +1,5 @@ // generics/coffee/Coffee.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. package generics.coffee; diff --git a/generics/coffee/CoffeeSupplier.java b/generics/coffee/CoffeeSupplier.java index 4dd37cc0f..f980c15d2 100644 --- a/generics/coffee/CoffeeSupplier.java +++ b/generics/coffee/CoffeeSupplier.java @@ -1,5 +1,5 @@ // generics/coffee/CoffeeSupplier.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // {java generics.coffee.CoffeeSupplier} diff --git a/generics/coffee/Latte.java b/generics/coffee/Latte.java index 5c1b54b2c..99bbfa70a 100644 --- a/generics/coffee/Latte.java +++ b/generics/coffee/Latte.java @@ -1,5 +1,5 @@ // generics/coffee/Latte.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. package generics.coffee; diff --git a/generics/coffee/Mocha.java b/generics/coffee/Mocha.java index 89e70627d..87ef0f7ee 100644 --- a/generics/coffee/Mocha.java +++ b/generics/coffee/Mocha.java @@ -1,5 +1,5 @@ // generics/coffee/Mocha.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. package generics.coffee; diff --git a/generics/decorator/Decoration.java b/generics/decorator/Decoration.java index f1603d966..7693c8aa3 100644 --- a/generics/decorator/Decoration.java +++ b/generics/decorator/Decoration.java @@ -1,5 +1,5 @@ // generics/decorator/Decoration.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // {java generics.decorator.Decoration} diff --git a/generics/dogsandrobots.go b/generics/dogsandrobots.go index 9466e2c7f..3b49bc52f 100644 --- a/generics/dogsandrobots.go +++ b/generics/dogsandrobots.go @@ -1,5 +1,5 @@ // generics/dogsandrobots.go -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. package main diff --git a/generics/watercolors/Watercolors.java b/generics/watercolors/Watercolors.java index 47dee9138..ea2957243 100644 --- a/generics/watercolors/Watercolors.java +++ b/generics/watercolors/Watercolors.java @@ -1,5 +1,5 @@ // generics/watercolors/Watercolors.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. package generics.watercolors; diff --git a/hiding/Cake.java b/hiding/Cake.java index 581760f5b..ebb19720e 100644 --- a/hiding/Cake.java +++ b/hiding/Cake.java @@ -1,5 +1,5 @@ // hiding/Cake.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Accesses a class in a separate compilation unit diff --git a/hiding/ChocolateChip.java b/hiding/ChocolateChip.java index 17dea4e61..0ba2066a2 100644 --- a/hiding/ChocolateChip.java +++ b/hiding/ChocolateChip.java @@ -1,5 +1,5 @@ // hiding/ChocolateChip.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Can't use package-access member from another package diff --git a/hiding/ChocolateChip2.java b/hiding/ChocolateChip2.java index fc1540814..7245a279f 100644 --- a/hiding/ChocolateChip2.java +++ b/hiding/ChocolateChip2.java @@ -1,5 +1,5 @@ // hiding/ChocolateChip2.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import hiding.cookie2.*; diff --git a/hiding/Dinner.java b/hiding/Dinner.java index 9f2fbea63..3c4d9e1a7 100644 --- a/hiding/Dinner.java +++ b/hiding/Dinner.java @@ -1,5 +1,5 @@ // hiding/Dinner.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Uses the library diff --git a/hiding/FullQualification.java b/hiding/FullQualification.java index 96ec55de8..65e75685f 100644 --- a/hiding/FullQualification.java +++ b/hiding/FullQualification.java @@ -1,5 +1,5 @@ // hiding/FullQualification.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/hiding/IceCream.java b/hiding/IceCream.java index 8262b256c..b9381f018 100644 --- a/hiding/IceCream.java +++ b/hiding/IceCream.java @@ -1,5 +1,5 @@ // hiding/IceCream.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Demonstrates "private" keyword diff --git a/hiding/ImportedMyClass.java b/hiding/ImportedMyClass.java index 10d5a0ce9..63cb2bd5c 100644 --- a/hiding/ImportedMyClass.java +++ b/hiding/ImportedMyClass.java @@ -1,5 +1,5 @@ // hiding/ImportedMyClass.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import hiding.mypackage.*; diff --git a/hiding/LibTest.java b/hiding/LibTest.java index f7c848c0a..c75fa9379 100644 --- a/hiding/LibTest.java +++ b/hiding/LibTest.java @@ -1,5 +1,5 @@ // hiding/LibTest.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Uses the library diff --git a/hiding/Lunch.java b/hiding/Lunch.java index 12faa00d4..1e4019205 100644 --- a/hiding/Lunch.java +++ b/hiding/Lunch.java @@ -1,5 +1,5 @@ // hiding/Lunch.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Demonstrates class access specifiers. Make a class diff --git a/hiding/OrganizedByAccess.java b/hiding/OrganizedByAccess.java index b38d44fcf..67437c8f5 100644 --- a/hiding/OrganizedByAccess.java +++ b/hiding/OrganizedByAccess.java @@ -1,5 +1,5 @@ // hiding/OrganizedByAccess.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/hiding/Pie.java b/hiding/Pie.java index dab8880d1..ce5abfee1 100644 --- a/hiding/Pie.java +++ b/hiding/Pie.java @@ -1,5 +1,5 @@ // hiding/Pie.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // The other class diff --git a/hiding/QualifiedMyClass.java b/hiding/QualifiedMyClass.java index bdf3d5e9d..3b642f561 100644 --- a/hiding/QualifiedMyClass.java +++ b/hiding/QualifiedMyClass.java @@ -1,5 +1,5 @@ // hiding/QualifiedMyClass.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/hiding/SingleImport.java b/hiding/SingleImport.java index fde469a7b..4959fb541 100644 --- a/hiding/SingleImport.java +++ b/hiding/SingleImport.java @@ -1,5 +1,5 @@ // hiding/SingleImport.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.ArrayList; diff --git a/hiding/cookie2/Cookie.java b/hiding/cookie2/Cookie.java index adfca0bd1..a3753a2e6 100644 --- a/hiding/cookie2/Cookie.java +++ b/hiding/cookie2/Cookie.java @@ -1,5 +1,5 @@ // hiding/cookie2/Cookie.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. package hiding.cookie2; diff --git a/hiding/dessert/Cookie.java b/hiding/dessert/Cookie.java index f96819980..58ac34bb7 100644 --- a/hiding/dessert/Cookie.java +++ b/hiding/dessert/Cookie.java @@ -1,5 +1,5 @@ // hiding/dessert/Cookie.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Creates a library diff --git a/hiding/mypackage/MyClass.java b/hiding/mypackage/MyClass.java index 194f81cbe..5fd8c33a4 100644 --- a/hiding/mypackage/MyClass.java +++ b/hiding/mypackage/MyClass.java @@ -1,5 +1,5 @@ // hiding/mypackage/MyClass.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. package hiding.mypackage; diff --git a/housekeeping/Apricot.java b/housekeeping/Apricot.java index c5089867b..da4c600f7 100644 --- a/housekeeping/Apricot.java +++ b/housekeeping/Apricot.java @@ -1,5 +1,5 @@ // housekeeping/Apricot.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. public class Apricot { diff --git a/housekeeping/ArrayClassObj.java b/housekeeping/ArrayClassObj.java index 0bc6c0ea9..6bb267e47 100644 --- a/housekeeping/ArrayClassObj.java +++ b/housekeeping/ArrayClassObj.java @@ -1,5 +1,5 @@ // housekeeping/ArrayClassObj.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Creating an array of nonprimitive objects diff --git a/housekeeping/ArrayInit.java b/housekeeping/ArrayInit.java index 779fad0cf..5ccc56889 100644 --- a/housekeeping/ArrayInit.java +++ b/housekeeping/ArrayInit.java @@ -1,5 +1,5 @@ // housekeeping/ArrayInit.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Array initialization diff --git a/housekeeping/ArrayNew.java b/housekeeping/ArrayNew.java index f764fea74..c37122b8e 100644 --- a/housekeeping/ArrayNew.java +++ b/housekeeping/ArrayNew.java @@ -1,5 +1,5 @@ // housekeeping/ArrayNew.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Creating arrays with new diff --git a/housekeeping/ArraysOfPrimitives.java b/housekeeping/ArraysOfPrimitives.java index 1692c4c41..0952aa7bf 100644 --- a/housekeeping/ArraysOfPrimitives.java +++ b/housekeeping/ArraysOfPrimitives.java @@ -1,5 +1,5 @@ // housekeeping/ArraysOfPrimitives.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/housekeeping/AutoboxingVarargs.java b/housekeeping/AutoboxingVarargs.java index 58c02c67e..61cf17740 100644 --- a/housekeeping/AutoboxingVarargs.java +++ b/housekeeping/AutoboxingVarargs.java @@ -1,5 +1,5 @@ // housekeeping/AutoboxingVarargs.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/housekeeping/BananaPeel.java b/housekeeping/BananaPeel.java index 2ec9516cd..badf828a6 100644 --- a/housekeeping/BananaPeel.java +++ b/housekeeping/BananaPeel.java @@ -1,5 +1,5 @@ // housekeeping/BananaPeel.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/housekeeping/Burrito.java b/housekeeping/Burrito.java index ea7e5b362..316f3324a 100644 --- a/housekeeping/Burrito.java +++ b/housekeeping/Burrito.java @@ -1,5 +1,5 @@ // housekeeping/Burrito.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/housekeeping/Counter.java b/housekeeping/Counter.java index 65927e68b..3db917be2 100644 --- a/housekeeping/Counter.java +++ b/housekeeping/Counter.java @@ -1,5 +1,5 @@ // housekeeping/Counter.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. public class Counter { diff --git a/housekeeping/DefaultConstructor.java b/housekeeping/DefaultConstructor.java index 0f95d83bb..a64294ead 100644 --- a/housekeeping/DefaultConstructor.java +++ b/housekeeping/DefaultConstructor.java @@ -1,5 +1,5 @@ // housekeeping/DefaultConstructor.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/housekeeping/Demotion.java b/housekeeping/Demotion.java index 0d0546591..cabddb70c 100644 --- a/housekeeping/Demotion.java +++ b/housekeeping/Demotion.java @@ -1,5 +1,5 @@ // housekeeping/Demotion.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Demotion of primitives diff --git a/housekeeping/DynamicArray.java b/housekeeping/DynamicArray.java index 578ef775e..7c2cdf811 100644 --- a/housekeeping/DynamicArray.java +++ b/housekeeping/DynamicArray.java @@ -1,5 +1,5 @@ // housekeeping/DynamicArray.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Array initialization diff --git a/housekeeping/EnumOrder.java b/housekeeping/EnumOrder.java index 42244c9c9..acae8d51b 100644 --- a/housekeeping/EnumOrder.java +++ b/housekeeping/EnumOrder.java @@ -1,5 +1,5 @@ // housekeeping/EnumOrder.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/housekeeping/ExplicitStatic.java b/housekeeping/ExplicitStatic.java index f0ec5c0a8..1b46002a9 100644 --- a/housekeeping/ExplicitStatic.java +++ b/housekeeping/ExplicitStatic.java @@ -1,5 +1,5 @@ // housekeeping/ExplicitStatic.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Explicit static initialization with the "static" clause diff --git a/housekeeping/Flower.java b/housekeeping/Flower.java index b7a6137f7..5f2766d82 100644 --- a/housekeeping/Flower.java +++ b/housekeeping/Flower.java @@ -1,5 +1,5 @@ // housekeeping/Flower.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Calling constructors with "this" diff --git a/housekeeping/InitialValues.java b/housekeeping/InitialValues.java index 9c256bece..c91360431 100644 --- a/housekeeping/InitialValues.java +++ b/housekeeping/InitialValues.java @@ -1,5 +1,5 @@ // housekeeping/InitialValues.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Shows default initial values diff --git a/housekeeping/InitialValues2.java b/housekeeping/InitialValues2.java index 710307bc0..ab0759534 100644 --- a/housekeeping/InitialValues2.java +++ b/housekeeping/InitialValues2.java @@ -1,5 +1,5 @@ // housekeeping/InitialValues2.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Providing explicit initial values diff --git a/housekeeping/Leaf.java b/housekeeping/Leaf.java index a16539a48..761de2074 100644 --- a/housekeeping/Leaf.java +++ b/housekeeping/Leaf.java @@ -1,5 +1,5 @@ // housekeeping/Leaf.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Simple use of the "this" keyword diff --git a/housekeeping/Measurement.java b/housekeeping/Measurement.java index 4d6be143d..a783e2c01 100644 --- a/housekeeping/Measurement.java +++ b/housekeeping/Measurement.java @@ -1,5 +1,5 @@ // housekeeping/Measurement.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. class Depth {} diff --git a/housekeeping/MethodInit.java b/housekeeping/MethodInit.java index 7c77bdd97..6b8261aa7 100644 --- a/housekeeping/MethodInit.java +++ b/housekeeping/MethodInit.java @@ -1,5 +1,5 @@ // housekeeping/MethodInit.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. public class MethodInit { diff --git a/housekeeping/MethodInit2.java b/housekeeping/MethodInit2.java index 394ef5232..a6024f01b 100644 --- a/housekeeping/MethodInit2.java +++ b/housekeeping/MethodInit2.java @@ -1,5 +1,5 @@ // housekeeping/MethodInit2.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. public class MethodInit2 { diff --git a/housekeeping/MethodInit3.java b/housekeeping/MethodInit3.java index 15c0f6742..4361b7c5b 100644 --- a/housekeeping/MethodInit3.java +++ b/housekeeping/MethodInit3.java @@ -1,5 +1,5 @@ // housekeeping/MethodInit3.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. public class MethodInit3 { diff --git a/housekeeping/Mugs.java b/housekeeping/Mugs.java index a99f0d1d3..90ebbae9c 100644 --- a/housekeeping/Mugs.java +++ b/housekeeping/Mugs.java @@ -1,5 +1,5 @@ // housekeeping/Mugs.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Instance initialization diff --git a/housekeeping/NewVarArgs.java b/housekeeping/NewVarArgs.java index a1d080c6e..2e19809aa 100644 --- a/housekeeping/NewVarArgs.java +++ b/housekeeping/NewVarArgs.java @@ -1,5 +1,5 @@ // housekeeping/NewVarArgs.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Using array syntax to create variable argument lists diff --git a/housekeeping/NoSynthesis.java b/housekeeping/NoSynthesis.java index a54483660..88219e006 100644 --- a/housekeeping/NoSynthesis.java +++ b/housekeeping/NoSynthesis.java @@ -1,5 +1,5 @@ // housekeeping/NoSynthesis.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/housekeeping/OptionalTrailingArguments.java b/housekeeping/OptionalTrailingArguments.java index 96415c003..f385bdd34 100644 --- a/housekeeping/OptionalTrailingArguments.java +++ b/housekeeping/OptionalTrailingArguments.java @@ -1,5 +1,5 @@ // housekeeping/OptionalTrailingArguments.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/housekeeping/OrderOfInitialization.java b/housekeeping/OrderOfInitialization.java index 4ac8e2179..7048f6202 100644 --- a/housekeeping/OrderOfInitialization.java +++ b/housekeeping/OrderOfInitialization.java @@ -1,5 +1,5 @@ // housekeeping/OrderOfInitialization.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Demonstrates initialization order diff --git a/housekeeping/Overloading.java b/housekeeping/Overloading.java index 0309a5097..00f9e0477 100644 --- a/housekeeping/Overloading.java +++ b/housekeeping/Overloading.java @@ -1,5 +1,5 @@ // housekeeping/Overloading.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Both constructor and ordinary method overloading diff --git a/housekeeping/OverloadingOrder.java b/housekeeping/OverloadingOrder.java index 47a7a9237..694fff9a5 100644 --- a/housekeeping/OverloadingOrder.java +++ b/housekeeping/OverloadingOrder.java @@ -1,5 +1,5 @@ // housekeeping/OverloadingOrder.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Overloading based on the order of the arguments diff --git a/housekeeping/OverloadingVarargs.java b/housekeeping/OverloadingVarargs.java index 444d19f09..fb96bad10 100644 --- a/housekeeping/OverloadingVarargs.java +++ b/housekeeping/OverloadingVarargs.java @@ -1,5 +1,5 @@ // housekeeping/OverloadingVarargs.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/housekeeping/OverloadingVarargs2.java b/housekeeping/OverloadingVarargs2.java index 45ab88488..340da66f8 100644 --- a/housekeeping/OverloadingVarargs2.java +++ b/housekeeping/OverloadingVarargs2.java @@ -1,5 +1,5 @@ // housekeeping/OverloadingVarargs2.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // {CompileTimeError} (Will not compile) diff --git a/housekeeping/OverloadingVarargs3.java b/housekeeping/OverloadingVarargs3.java index 42db03298..6245ea742 100644 --- a/housekeeping/OverloadingVarargs3.java +++ b/housekeeping/OverloadingVarargs3.java @@ -1,5 +1,5 @@ // housekeeping/OverloadingVarargs3.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/housekeeping/PassingThis.java b/housekeeping/PassingThis.java index 64b5b31a2..c6769a53f 100644 --- a/housekeeping/PassingThis.java +++ b/housekeeping/PassingThis.java @@ -1,5 +1,5 @@ // housekeeping/PassingThis.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/housekeeping/PrimitiveOverloading.java b/housekeeping/PrimitiveOverloading.java index 3f4494b51..2e1261abc 100644 --- a/housekeeping/PrimitiveOverloading.java +++ b/housekeeping/PrimitiveOverloading.java @@ -1,5 +1,5 @@ // housekeeping/PrimitiveOverloading.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Promotion of primitives and overloading diff --git a/housekeeping/SimpleConstructor.java b/housekeeping/SimpleConstructor.java index 7bee9bfe6..e6da947c5 100644 --- a/housekeeping/SimpleConstructor.java +++ b/housekeeping/SimpleConstructor.java @@ -1,5 +1,5 @@ // housekeeping/SimpleConstructor.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Demonstration of a simple constructor diff --git a/housekeeping/SimpleConstructor2.java b/housekeeping/SimpleConstructor2.java index 679571c4b..e2449f500 100644 --- a/housekeeping/SimpleConstructor2.java +++ b/housekeeping/SimpleConstructor2.java @@ -1,5 +1,5 @@ // housekeeping/SimpleConstructor2.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Constructors can have arguments diff --git a/housekeeping/SimpleEnumUse.java b/housekeeping/SimpleEnumUse.java index 72d0dbd51..c5e4b6a90 100644 --- a/housekeeping/SimpleEnumUse.java +++ b/housekeeping/SimpleEnumUse.java @@ -1,5 +1,5 @@ // housekeeping/SimpleEnumUse.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/housekeeping/Spiciness.java b/housekeeping/Spiciness.java index 39f7d72e4..e4988d88e 100644 --- a/housekeeping/Spiciness.java +++ b/housekeeping/Spiciness.java @@ -1,5 +1,5 @@ // housekeeping/Spiciness.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/housekeeping/Spoon.java b/housekeeping/Spoon.java index ef379ac13..b8ce57882 100644 --- a/housekeeping/Spoon.java +++ b/housekeeping/Spoon.java @@ -1,5 +1,5 @@ // housekeeping/Spoon.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. public class Spoon { diff --git a/housekeeping/StaticInitialization.java b/housekeeping/StaticInitialization.java index 82a1929ba..d067cf8f1 100644 --- a/housekeeping/StaticInitialization.java +++ b/housekeeping/StaticInitialization.java @@ -1,5 +1,5 @@ // housekeeping/StaticInitialization.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Specifying initial values in a class definition diff --git a/housekeeping/TerminationCondition.java b/housekeeping/TerminationCondition.java index 29fb518c1..af882ba36 100644 --- a/housekeeping/TerminationCondition.java +++ b/housekeeping/TerminationCondition.java @@ -1,5 +1,5 @@ // housekeeping/TerminationCondition.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Using finalize() to detect an object that diff --git a/housekeeping/VarArgs.java b/housekeeping/VarArgs.java index 5c323a202..0b15efa04 100644 --- a/housekeeping/VarArgs.java +++ b/housekeeping/VarArgs.java @@ -1,5 +1,5 @@ // housekeeping/VarArgs.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Using array syntax to create variable argument lists diff --git a/housekeeping/VarargType.java b/housekeeping/VarargType.java index c8c416196..72d8bfdc3 100644 --- a/housekeeping/VarargType.java +++ b/housekeeping/VarargType.java @@ -1,5 +1,5 @@ // housekeeping/VarargType.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/innerclasses/AnonymousConstructor.java b/innerclasses/AnonymousConstructor.java index dd0deb8cd..25de92a5b 100644 --- a/innerclasses/AnonymousConstructor.java +++ b/innerclasses/AnonymousConstructor.java @@ -1,5 +1,5 @@ // innerclasses/AnonymousConstructor.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Creating a constructor for an anonymous inner class diff --git a/innerclasses/BigEgg.java b/innerclasses/BigEgg.java index e4faff593..a510ddda5 100644 --- a/innerclasses/BigEgg.java +++ b/innerclasses/BigEgg.java @@ -1,5 +1,5 @@ // innerclasses/BigEgg.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // An inner class cannot be overridden like a method diff --git a/innerclasses/BigEgg2.java b/innerclasses/BigEgg2.java index b9b4fc6e5..6f8cf4aae 100644 --- a/innerclasses/BigEgg2.java +++ b/innerclasses/BigEgg2.java @@ -1,5 +1,5 @@ // innerclasses/BigEgg2.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Proper inheritance of an inner class diff --git a/innerclasses/Callbacks.java b/innerclasses/Callbacks.java index bf944f1f2..214019c5f 100644 --- a/innerclasses/Callbacks.java +++ b/innerclasses/Callbacks.java @@ -1,5 +1,5 @@ // innerclasses/Callbacks.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Using inner classes for callbacks diff --git a/innerclasses/ClassInInterface.java b/innerclasses/ClassInInterface.java index 048c23ab1..a2e34ccb4 100644 --- a/innerclasses/ClassInInterface.java +++ b/innerclasses/ClassInInterface.java @@ -1,5 +1,5 @@ // innerclasses/ClassInInterface.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // {java ClassInInterface$Test} diff --git a/innerclasses/Contents.java b/innerclasses/Contents.java index 874040b87..98360c794 100644 --- a/innerclasses/Contents.java +++ b/innerclasses/Contents.java @@ -1,5 +1,5 @@ // innerclasses/Contents.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. public interface Contents { diff --git a/innerclasses/Destination.java b/innerclasses/Destination.java index be479d2ac..4b5ded927 100644 --- a/innerclasses/Destination.java +++ b/innerclasses/Destination.java @@ -1,5 +1,5 @@ // innerclasses/Destination.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. public interface Destination { diff --git a/innerclasses/DotNew.java b/innerclasses/DotNew.java index 229dc2a2d..92d3f7944 100644 --- a/innerclasses/DotNew.java +++ b/innerclasses/DotNew.java @@ -1,5 +1,5 @@ // innerclasses/DotNew.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Creating an inner class directly using the .new syntax diff --git a/innerclasses/DotThis.java b/innerclasses/DotThis.java index ea2a37a20..6ef93b930 100644 --- a/innerclasses/DotThis.java +++ b/innerclasses/DotThis.java @@ -1,5 +1,5 @@ // innerclasses/DotThis.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Accessing the outer-class object diff --git a/innerclasses/GreenhouseController.java b/innerclasses/GreenhouseController.java index 89379f6c1..e39a470f4 100644 --- a/innerclasses/GreenhouseController.java +++ b/innerclasses/GreenhouseController.java @@ -1,5 +1,5 @@ // innerclasses/GreenhouseController.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Configure and execute the greenhouse system diff --git a/innerclasses/GreenhouseControls.java b/innerclasses/GreenhouseControls.java index a69c9771e..534deb9ac 100644 --- a/innerclasses/GreenhouseControls.java +++ b/innerclasses/GreenhouseControls.java @@ -1,5 +1,5 @@ // innerclasses/GreenhouseControls.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // This produces a specific application of the diff --git a/innerclasses/InheritInner.java b/innerclasses/InheritInner.java index cd2cb525c..410e2864a 100644 --- a/innerclasses/InheritInner.java +++ b/innerclasses/InheritInner.java @@ -1,5 +1,5 @@ // innerclasses/InheritInner.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Inheriting an inner class diff --git a/innerclasses/LocalInnerClass.java b/innerclasses/LocalInnerClass.java index cf52a2141..119c1ca93 100644 --- a/innerclasses/LocalInnerClass.java +++ b/innerclasses/LocalInnerClass.java @@ -1,5 +1,5 @@ // innerclasses/LocalInnerClass.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Holds a sequence of Objects diff --git a/innerclasses/MultiImplementation.java b/innerclasses/MultiImplementation.java index b4577c937..0b6db9e62 100644 --- a/innerclasses/MultiImplementation.java +++ b/innerclasses/MultiImplementation.java @@ -1,5 +1,5 @@ // innerclasses/MultiImplementation.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // For concrete or abstract classes, inner classes diff --git a/innerclasses/MultiNestingAccess.java b/innerclasses/MultiNestingAccess.java index 79abc7dba..a05eb0447 100644 --- a/innerclasses/MultiNestingAccess.java +++ b/innerclasses/MultiNestingAccess.java @@ -1,5 +1,5 @@ // innerclasses/MultiNestingAccess.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Nested classes can access all members of all diff --git a/innerclasses/Parcel1.java b/innerclasses/Parcel1.java index 9b8f22df0..33467b1e8 100644 --- a/innerclasses/Parcel1.java +++ b/innerclasses/Parcel1.java @@ -1,5 +1,5 @@ // innerclasses/Parcel1.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Creating inner classes diff --git a/innerclasses/Parcel10.java b/innerclasses/Parcel10.java index 10f13b71d..77684e413 100644 --- a/innerclasses/Parcel10.java +++ b/innerclasses/Parcel10.java @@ -1,5 +1,5 @@ // innerclasses/Parcel10.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Using "instance initialization" to perform diff --git a/innerclasses/Parcel11.java b/innerclasses/Parcel11.java index 994864b93..40d8da484 100644 --- a/innerclasses/Parcel11.java +++ b/innerclasses/Parcel11.java @@ -1,5 +1,5 @@ // innerclasses/Parcel11.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Nested classes (static inner classes) diff --git a/innerclasses/Parcel2.java b/innerclasses/Parcel2.java index 3e7eb4374..1f4f8274d 100644 --- a/innerclasses/Parcel2.java +++ b/innerclasses/Parcel2.java @@ -1,5 +1,5 @@ // innerclasses/Parcel2.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Returning a reference to an inner class diff --git a/innerclasses/Parcel3.java b/innerclasses/Parcel3.java index 75163e1d6..48ae8aa18 100644 --- a/innerclasses/Parcel3.java +++ b/innerclasses/Parcel3.java @@ -1,5 +1,5 @@ // innerclasses/Parcel3.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Using .new to create instances of inner classes diff --git a/innerclasses/Parcel5.java b/innerclasses/Parcel5.java index 4b88c4f8c..643322d1b 100644 --- a/innerclasses/Parcel5.java +++ b/innerclasses/Parcel5.java @@ -1,5 +1,5 @@ // innerclasses/Parcel5.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Nesting a class within a method diff --git a/innerclasses/Parcel6.java b/innerclasses/Parcel6.java index 14699c4a9..118ff6f51 100644 --- a/innerclasses/Parcel6.java +++ b/innerclasses/Parcel6.java @@ -1,5 +1,5 @@ // innerclasses/Parcel6.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Nesting a class within a scope diff --git a/innerclasses/Parcel7.java b/innerclasses/Parcel7.java index e34359007..7ed0ef514 100644 --- a/innerclasses/Parcel7.java +++ b/innerclasses/Parcel7.java @@ -1,5 +1,5 @@ // innerclasses/Parcel7.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Returning an instance of an anonymous inner class diff --git a/innerclasses/Parcel7b.java b/innerclasses/Parcel7b.java index 99b85a259..6c4a40484 100644 --- a/innerclasses/Parcel7b.java +++ b/innerclasses/Parcel7b.java @@ -1,5 +1,5 @@ // innerclasses/Parcel7b.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Expanded version of Parcel7.java diff --git a/innerclasses/Parcel8.java b/innerclasses/Parcel8.java index b126b1030..ead289089 100644 --- a/innerclasses/Parcel8.java +++ b/innerclasses/Parcel8.java @@ -1,5 +1,5 @@ // innerclasses/Parcel8.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Calling the base-class constructor diff --git a/innerclasses/Parcel9.java b/innerclasses/Parcel9.java index 3b1362eca..599599c9c 100644 --- a/innerclasses/Parcel9.java +++ b/innerclasses/Parcel9.java @@ -1,5 +1,5 @@ // innerclasses/Parcel9.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/innerclasses/Sequence.java b/innerclasses/Sequence.java index 490a66775..ebcbdeea6 100644 --- a/innerclasses/Sequence.java +++ b/innerclasses/Sequence.java @@ -1,5 +1,5 @@ // innerclasses/Sequence.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Holds a sequence of Objects diff --git a/innerclasses/TestBed.java b/innerclasses/TestBed.java index 8b4e00c43..fb969a1fe 100644 --- a/innerclasses/TestBed.java +++ b/innerclasses/TestBed.java @@ -1,5 +1,5 @@ // innerclasses/TestBed.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Putting test code in a nested class diff --git a/innerclasses/TestParcel.java b/innerclasses/TestParcel.java index 2f6152aa8..c1549a631 100644 --- a/innerclasses/TestParcel.java +++ b/innerclasses/TestParcel.java @@ -1,5 +1,5 @@ // innerclasses/TestParcel.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/innerclasses/Wrapping.java b/innerclasses/Wrapping.java index 272fcac72..15b2e76f1 100644 --- a/innerclasses/Wrapping.java +++ b/innerclasses/Wrapping.java @@ -1,5 +1,5 @@ // innerclasses/Wrapping.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. public class Wrapping { diff --git a/innerclasses/controller/Controller.java b/innerclasses/controller/Controller.java index befc46eba..794dfaa37 100644 --- a/innerclasses/controller/Controller.java +++ b/innerclasses/controller/Controller.java @@ -1,5 +1,5 @@ // innerclasses/controller/Controller.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // The reusable framework for control systems diff --git a/innerclasses/controller/Event.java b/innerclasses/controller/Event.java index 662f0e9df..ed46f48cb 100644 --- a/innerclasses/controller/Event.java +++ b/innerclasses/controller/Event.java @@ -1,5 +1,5 @@ // innerclasses/controller/Event.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // The common methods for any control event diff --git a/innerclasses/mui/MultiInterfaces.java b/innerclasses/mui/MultiInterfaces.java index 0782b7b80..c909d29ce 100644 --- a/innerclasses/mui/MultiInterfaces.java +++ b/innerclasses/mui/MultiInterfaces.java @@ -1,5 +1,5 @@ // innerclasses/mui/MultiInterfaces.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Two ways that a class can implement multiple interfaces diff --git a/interfaces/AbstractAccess.java b/interfaces/AbstractAccess.java index b7a22bd80..cb155163f 100644 --- a/interfaces/AbstractAccess.java +++ b/interfaces/AbstractAccess.java @@ -1,5 +1,5 @@ // interfaces/AbstractAccess.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/interfaces/AbstractWithoutAbstracts.java b/interfaces/AbstractWithoutAbstracts.java index 26c98daf4..428590d1c 100644 --- a/interfaces/AbstractWithoutAbstracts.java +++ b/interfaces/AbstractWithoutAbstracts.java @@ -1,5 +1,5 @@ // interfaces/AbstractWithoutAbstracts.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/interfaces/AdaptedRandomDoubles.java b/interfaces/AdaptedRandomDoubles.java index 8d7cbb6b2..733820e68 100644 --- a/interfaces/AdaptedRandomDoubles.java +++ b/interfaces/AdaptedRandomDoubles.java @@ -1,5 +1,5 @@ // interfaces/AdaptedRandomDoubles.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Creating an adapter with inheritance diff --git a/interfaces/Adventure.java b/interfaces/Adventure.java index 07f42e6ae..0691fd732 100644 --- a/interfaces/Adventure.java +++ b/interfaces/Adventure.java @@ -1,5 +1,5 @@ // interfaces/Adventure.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Multiple interfaces diff --git a/interfaces/AnImplementation.java b/interfaces/AnImplementation.java index 74a88dc60..f22ae3610 100644 --- a/interfaces/AnImplementation.java +++ b/interfaces/AnImplementation.java @@ -1,5 +1,5 @@ // interfaces/AnImplementation.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/interfaces/AnInterface.java b/interfaces/AnInterface.java index ae6a42782..070af2ca8 100644 --- a/interfaces/AnInterface.java +++ b/interfaces/AnInterface.java @@ -1,5 +1,5 @@ // interfaces/AnInterface.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/interfaces/Applicator.java b/interfaces/Applicator.java index 6cca24c95..33edd1cfe 100644 --- a/interfaces/Applicator.java +++ b/interfaces/Applicator.java @@ -1,5 +1,5 @@ // interfaces/Applicator.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.*; diff --git a/interfaces/AttemptToUseBasic.java b/interfaces/AttemptToUseBasic.java index 1f6fb6c14..5b71bc59f 100644 --- a/interfaces/AttemptToUseBasic.java +++ b/interfaces/AttemptToUseBasic.java @@ -1,5 +1,5 @@ // interfaces/AttemptToUseBasic.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // {CompileTimeError} (Will not compile) diff --git a/interfaces/Basic.java b/interfaces/Basic.java index d17944166..9643027d0 100644 --- a/interfaces/Basic.java +++ b/interfaces/Basic.java @@ -1,5 +1,5 @@ // interfaces/Basic.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/interfaces/Basic2.java b/interfaces/Basic2.java index 2fac1d653..a0e8e9b26 100644 --- a/interfaces/Basic2.java +++ b/interfaces/Basic2.java @@ -1,5 +1,5 @@ // interfaces/Basic2.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/interfaces/Factories.java b/interfaces/Factories.java index 85feb9ee7..508df208f 100644 --- a/interfaces/Factories.java +++ b/interfaces/Factories.java @@ -1,5 +1,5 @@ // interfaces/Factories.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/interfaces/Games.java b/interfaces/Games.java index 51e58dd37..9d0afbc45 100644 --- a/interfaces/Games.java +++ b/interfaces/Games.java @@ -1,5 +1,5 @@ // interfaces/Games.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // A Game framework using Factory Methods diff --git a/interfaces/HorrorShow.java b/interfaces/HorrorShow.java index 948f1023a..90f84129d 100644 --- a/interfaces/HorrorShow.java +++ b/interfaces/HorrorShow.java @@ -1,5 +1,5 @@ // interfaces/HorrorShow.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Extending an interface with inheritance diff --git a/interfaces/Implementation2.java b/interfaces/Implementation2.java index 73dc8e202..b94bc2cf1 100644 --- a/interfaces/Implementation2.java +++ b/interfaces/Implementation2.java @@ -1,5 +1,5 @@ // interfaces/Implementation2.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/interfaces/ImplementingAnInterface.java b/interfaces/ImplementingAnInterface.java index 8c8786699..bded0ac5d 100644 --- a/interfaces/ImplementingAnInterface.java +++ b/interfaces/ImplementingAnInterface.java @@ -1,5 +1,5 @@ // interfaces/ImplementingAnInterface.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/interfaces/Instantiable.java b/interfaces/Instantiable.java index 0567d13b2..b09dcd3e8 100644 --- a/interfaces/Instantiable.java +++ b/interfaces/Instantiable.java @@ -1,5 +1,5 @@ // interfaces/Instantiable.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/interfaces/InterfaceCollision.java b/interfaces/InterfaceCollision.java index 64d4fd31f..5d85b6149 100644 --- a/interfaces/InterfaceCollision.java +++ b/interfaces/InterfaceCollision.java @@ -1,5 +1,5 @@ // interfaces/InterfaceCollision.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/interfaces/InterfaceWithDefault.java b/interfaces/InterfaceWithDefault.java index 7edd6862a..7d59408e1 100644 --- a/interfaces/InterfaceWithDefault.java +++ b/interfaces/InterfaceWithDefault.java @@ -1,5 +1,5 @@ // interfaces/InterfaceWithDefault.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/interfaces/Jim.java b/interfaces/Jim.java index 992b50834..3d3d5cf99 100644 --- a/interfaces/Jim.java +++ b/interfaces/Jim.java @@ -1,5 +1,5 @@ // interfaces/Jim.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.*; diff --git a/interfaces/MICollision.java b/interfaces/MICollision.java index f033d6f55..43af8fda7 100644 --- a/interfaces/MICollision.java +++ b/interfaces/MICollision.java @@ -1,5 +1,5 @@ // interfaces/MICollision.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.*; diff --git a/interfaces/Machine.java b/interfaces/Machine.java index ae550745c..7e1733a9a 100644 --- a/interfaces/Machine.java +++ b/interfaces/Machine.java @@ -1,5 +1,5 @@ // interfaces/Machine.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.*; diff --git a/interfaces/Months.java b/interfaces/Months.java index 7e716b56d..75158ed6d 100644 --- a/interfaces/Months.java +++ b/interfaces/Months.java @@ -1,5 +1,5 @@ // interfaces/Months.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Using interfaces to create groups of constants diff --git a/interfaces/MultipleInheritance.java b/interfaces/MultipleInheritance.java index f90eee23e..ab5cd5144 100644 --- a/interfaces/MultipleInheritance.java +++ b/interfaces/MultipleInheritance.java @@ -1,5 +1,5 @@ // interfaces/MultipleInheritance.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.*; diff --git a/interfaces/PureInterface.java b/interfaces/PureInterface.java index 12e26b8bb..b795fdccb 100644 --- a/interfaces/PureInterface.java +++ b/interfaces/PureInterface.java @@ -1,5 +1,5 @@ // interfaces/PureInterface.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Interface only looked like this before Java 8 diff --git a/interfaces/RandVals.java b/interfaces/RandVals.java index 7602d0fc0..fc2516f33 100644 --- a/interfaces/RandVals.java +++ b/interfaces/RandVals.java @@ -1,5 +1,5 @@ // interfaces/RandVals.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Initializing interface fields with diff --git a/interfaces/RandomDoubles.java b/interfaces/RandomDoubles.java index 2c4e8c865..ced3f21cb 100644 --- a/interfaces/RandomDoubles.java +++ b/interfaces/RandomDoubles.java @@ -1,5 +1,5 @@ // interfaces/RandomDoubles.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.*; diff --git a/interfaces/RandomStrings.java b/interfaces/RandomStrings.java index ac9add027..8274acd5f 100644 --- a/interfaces/RandomStrings.java +++ b/interfaces/RandomStrings.java @@ -1,5 +1,5 @@ // interfaces/RandomStrings.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Implementing an interface to conform to a method diff --git a/interfaces/TestRandVals.java b/interfaces/TestRandVals.java index e7104a4bb..ff4f60d5c 100644 --- a/interfaces/TestRandVals.java +++ b/interfaces/TestRandVals.java @@ -1,5 +1,5 @@ // interfaces/TestRandVals.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/interfaces/filters/BandPass.java b/interfaces/filters/BandPass.java index cc4353440..8e8367e98 100644 --- a/interfaces/filters/BandPass.java +++ b/interfaces/filters/BandPass.java @@ -1,5 +1,5 @@ // interfaces/filters/BandPass.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. package interfaces.filters; diff --git a/interfaces/filters/Filter.java b/interfaces/filters/Filter.java index bea65947e..5657a0de2 100644 --- a/interfaces/filters/Filter.java +++ b/interfaces/filters/Filter.java @@ -1,5 +1,5 @@ // interfaces/filters/Filter.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. package interfaces.filters; diff --git a/interfaces/filters/HighPass.java b/interfaces/filters/HighPass.java index 26e0bd3b3..07a0e174b 100644 --- a/interfaces/filters/HighPass.java +++ b/interfaces/filters/HighPass.java @@ -1,5 +1,5 @@ // interfaces/filters/HighPass.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. package interfaces.filters; diff --git a/interfaces/filters/LowPass.java b/interfaces/filters/LowPass.java index d43601930..d85d7bd79 100644 --- a/interfaces/filters/LowPass.java +++ b/interfaces/filters/LowPass.java @@ -1,5 +1,5 @@ // interfaces/filters/LowPass.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. package interfaces.filters; diff --git a/interfaces/filters/Waveform.java b/interfaces/filters/Waveform.java index 50dca4320..3d246c3c0 100644 --- a/interfaces/filters/Waveform.java +++ b/interfaces/filters/Waveform.java @@ -1,5 +1,5 @@ // interfaces/filters/Waveform.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. package interfaces.filters; diff --git a/interfaces/interfaceprocessor/Applicator.java b/interfaces/interfaceprocessor/Applicator.java index bcf23ecc5..15ca1f4af 100644 --- a/interfaces/interfaceprocessor/Applicator.java +++ b/interfaces/interfaceprocessor/Applicator.java @@ -1,5 +1,5 @@ // interfaces/interfaceprocessor/Applicator.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. package interfaces.interfaceprocessor; diff --git a/interfaces/interfaceprocessor/FilterProcessor.java b/interfaces/interfaceprocessor/FilterProcessor.java index 96475b404..95f977a02 100644 --- a/interfaces/interfaceprocessor/FilterProcessor.java +++ b/interfaces/interfaceprocessor/FilterProcessor.java @@ -1,5 +1,5 @@ // interfaces/interfaceprocessor/FilterProcessor.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // {java interfaces.interfaceprocessor.FilterProcessor} diff --git a/interfaces/interfaceprocessor/Processor.java b/interfaces/interfaceprocessor/Processor.java index 49c576e09..d016f25c4 100644 --- a/interfaces/interfaceprocessor/Processor.java +++ b/interfaces/interfaceprocessor/Processor.java @@ -1,5 +1,5 @@ // interfaces/interfaceprocessor/Processor.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. package interfaces.interfaceprocessor; diff --git a/interfaces/interfaceprocessor/StringProcessor.java b/interfaces/interfaceprocessor/StringProcessor.java index 88ad20ee6..c5c229a40 100644 --- a/interfaces/interfaceprocessor/StringProcessor.java +++ b/interfaces/interfaceprocessor/StringProcessor.java @@ -1,5 +1,5 @@ // interfaces/interfaceprocessor/StringProcessor.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // {java interfaces.interfaceprocessor.StringProcessor} diff --git a/interfaces/music4/Music4.java b/interfaces/music4/Music4.java index 43e91e84a..22fcad72f 100644 --- a/interfaces/music4/Music4.java +++ b/interfaces/music4/Music4.java @@ -1,5 +1,5 @@ // interfaces/music4/Music4.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Abstract classes and methods diff --git a/interfaces/music5/Music5.java b/interfaces/music5/Music5.java index f2e396e0c..14bfc9620 100644 --- a/interfaces/music5/Music5.java +++ b/interfaces/music5/Music5.java @@ -1,5 +1,5 @@ // interfaces/music5/Music5.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // {java interfaces.music5.Music5} diff --git a/interfaces/nesting/NestingInterfaces.java b/interfaces/nesting/NestingInterfaces.java index 97c5e6c87..b728253b3 100644 --- a/interfaces/nesting/NestingInterfaces.java +++ b/interfaces/nesting/NestingInterfaces.java @@ -1,5 +1,5 @@ // interfaces/nesting/NestingInterfaces.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // {java interfaces.nesting.NestingInterfaces} diff --git a/iostreams/BasicFileOutput.java b/iostreams/BasicFileOutput.java index 24cbcf3d4..eaee98955 100644 --- a/iostreams/BasicFileOutput.java +++ b/iostreams/BasicFileOutput.java @@ -1,5 +1,5 @@ // iostreams/BasicFileOutput.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // {ValidateByHand} diff --git a/iostreams/BufferedInputFile.java b/iostreams/BufferedInputFile.java index 05c6ca407..cee5c3d33 100644 --- a/iostreams/BufferedInputFile.java +++ b/iostreams/BufferedInputFile.java @@ -1,5 +1,5 @@ // iostreams/BufferedInputFile.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // {ValidateByHand} diff --git a/iostreams/FileOutputShortcut.java b/iostreams/FileOutputShortcut.java index a52893899..74b731841 100644 --- a/iostreams/FileOutputShortcut.java +++ b/iostreams/FileOutputShortcut.java @@ -1,5 +1,5 @@ // iostreams/FileOutputShortcut.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // {ValidateByHand} diff --git a/iostreams/FormattedMemoryInput.java b/iostreams/FormattedMemoryInput.java index c0bf8b4cd..556383c41 100644 --- a/iostreams/FormattedMemoryInput.java +++ b/iostreams/FormattedMemoryInput.java @@ -1,5 +1,5 @@ // iostreams/FormattedMemoryInput.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // {ValidateByHand} diff --git a/iostreams/MemoryInput.java b/iostreams/MemoryInput.java index 82f332b83..2fc1cc8ab 100644 --- a/iostreams/MemoryInput.java +++ b/iostreams/MemoryInput.java @@ -1,5 +1,5 @@ // iostreams/MemoryInput.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // {ValidateByHand} diff --git a/iostreams/StoringAndRecoveringData.java b/iostreams/StoringAndRecoveringData.java index 37320f249..cda8d864a 100644 --- a/iostreams/StoringAndRecoveringData.java +++ b/iostreams/StoringAndRecoveringData.java @@ -1,5 +1,5 @@ // iostreams/StoringAndRecoveringData.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.io.*; diff --git a/iostreams/TestEOF.java b/iostreams/TestEOF.java index 8498bfa18..87ff8c982 100644 --- a/iostreams/TestEOF.java +++ b/iostreams/TestEOF.java @@ -1,5 +1,5 @@ // iostreams/TestEOF.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Testing for end of file diff --git a/iostreams/UsingRandomAccessFile.java b/iostreams/UsingRandomAccessFile.java index c9708a9ba..8ed27b99c 100644 --- a/iostreams/UsingRandomAccessFile.java +++ b/iostreams/UsingRandomAccessFile.java @@ -1,5 +1,5 @@ // iostreams/UsingRandomAccessFile.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.io.*; diff --git a/lowlevel/AtomicEvenSupplier.java b/lowlevel/AtomicEvenSupplier.java index 366486084..364f2b12d 100644 --- a/lowlevel/AtomicEvenSupplier.java +++ b/lowlevel/AtomicEvenSupplier.java @@ -1,5 +1,5 @@ // lowlevel/AtomicEvenSupplier.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Atomic classes are occasionally useful in regular code diff --git a/lowlevel/AtomicIntegerTest.java b/lowlevel/AtomicIntegerTest.java index b3f6cc51d..f9f3bc260 100644 --- a/lowlevel/AtomicIntegerTest.java +++ b/lowlevel/AtomicIntegerTest.java @@ -1,5 +1,5 @@ // lowlevel/AtomicIntegerTest.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.concurrent.*; diff --git a/lowlevel/Atomicity.java b/lowlevel/Atomicity.java index 5ebfbccbc..ead737124 100644 --- a/lowlevel/Atomicity.java +++ b/lowlevel/Atomicity.java @@ -1,5 +1,5 @@ // lowlevel/Atomicity.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // {javap -c Atomicity} diff --git a/lowlevel/AtomicityTest.java b/lowlevel/AtomicityTest.java index fea1594d0..24dee7ab8 100644 --- a/lowlevel/AtomicityTest.java +++ b/lowlevel/AtomicityTest.java @@ -1,5 +1,5 @@ // lowlevel/AtomicityTest.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.concurrent.*; diff --git a/lowlevel/AttemptLocking.java b/lowlevel/AttemptLocking.java index 08165a6d6..8b66f39bc 100644 --- a/lowlevel/AttemptLocking.java +++ b/lowlevel/AttemptLocking.java @@ -1,5 +1,5 @@ // lowlevel/AttemptLocking.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Locks in the concurrent library allow you diff --git a/lowlevel/BankTellerSimulation.java b/lowlevel/BankTellerSimulation.java index c1d81174e..e961faf65 100644 --- a/lowlevel/BankTellerSimulation.java +++ b/lowlevel/BankTellerSimulation.java @@ -1,5 +1,5 @@ // lowlevel/BankTellerSimulation.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Using queues and multithreading diff --git a/lowlevel/CaptureUncaughtException.java b/lowlevel/CaptureUncaughtException.java index 76f36a762..7183ca80f 100644 --- a/lowlevel/CaptureUncaughtException.java +++ b/lowlevel/CaptureUncaughtException.java @@ -1,5 +1,5 @@ // lowlevel/CaptureUncaughtException.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.concurrent.*; diff --git a/lowlevel/CarBuilder.java b/lowlevel/CarBuilder.java index 91a0ef9aa..2ccc58cec 100644 --- a/lowlevel/CarBuilder.java +++ b/lowlevel/CarBuilder.java @@ -1,5 +1,5 @@ // lowlevel/CarBuilder.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // A complex example of tasks working together diff --git a/lowlevel/CriticalSection.java b/lowlevel/CriticalSection.java index 6e187938f..35a853bfd 100644 --- a/lowlevel/CriticalSection.java +++ b/lowlevel/CriticalSection.java @@ -1,5 +1,5 @@ // lowlevel/CriticalSection.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // (Behavior may have changed in Java 8) diff --git a/lowlevel/DelayQueueDemo.java b/lowlevel/DelayQueueDemo.java index 485f235c6..d76e22f0c 100644 --- a/lowlevel/DelayQueueDemo.java +++ b/lowlevel/DelayQueueDemo.java @@ -1,5 +1,5 @@ // lowlevel/DelayQueueDemo.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.concurrent.*; diff --git a/lowlevel/EvenChecker.java b/lowlevel/EvenChecker.java index 1010473f2..ff5adbc2a 100644 --- a/lowlevel/EvenChecker.java +++ b/lowlevel/EvenChecker.java @@ -1,5 +1,5 @@ // lowlevel/EvenChecker.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.concurrent.*; diff --git a/lowlevel/EvenSupplier.java b/lowlevel/EvenSupplier.java index 490f4104c..c1d07f3c4 100644 --- a/lowlevel/EvenSupplier.java +++ b/lowlevel/EvenSupplier.java @@ -1,5 +1,5 @@ // lowlevel/EvenSupplier.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // When threads collide diff --git a/lowlevel/ExceptionThread.java b/lowlevel/ExceptionThread.java index 675939517..e23e67cd2 100644 --- a/lowlevel/ExceptionThread.java +++ b/lowlevel/ExceptionThread.java @@ -1,5 +1,5 @@ // lowlevel/ExceptionThread.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // {ValidateByHand} diff --git a/lowlevel/ExplicitCriticalSection.java b/lowlevel/ExplicitCriticalSection.java index 1f31556b0..6b2246420 100644 --- a/lowlevel/ExplicitCriticalSection.java +++ b/lowlevel/ExplicitCriticalSection.java @@ -1,5 +1,5 @@ // lowlevel/ExplicitCriticalSection.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // {ThrowsException} on a multiprocessor machine diff --git a/lowlevel/GreenhouseScheduler.java b/lowlevel/GreenhouseScheduler.java index a7535df3d..84df6020b 100644 --- a/lowlevel/GreenhouseScheduler.java +++ b/lowlevel/GreenhouseScheduler.java @@ -1,5 +1,5 @@ // lowlevel/GreenhouseScheduler.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Rewriting innerclasses/GreenhouseController.java diff --git a/lowlevel/HorseRace.java b/lowlevel/HorseRace.java index 27dcfc162..da2fd50f5 100644 --- a/lowlevel/HorseRace.java +++ b/lowlevel/HorseRace.java @@ -1,5 +1,5 @@ // lowlevel/HorseRace.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Using CyclicBarriers diff --git a/lowlevel/IntSupplier.java b/lowlevel/IntSupplier.java index 0eb84a2c3..d311a6a39 100644 --- a/lowlevel/IntSupplier.java +++ b/lowlevel/IntSupplier.java @@ -1,5 +1,5 @@ // lowlevel/IntSupplier.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/lowlevel/MutexEvenSupplier.java b/lowlevel/MutexEvenSupplier.java index 688c9b3e9..443bf0594 100644 --- a/lowlevel/MutexEvenSupplier.java +++ b/lowlevel/MutexEvenSupplier.java @@ -1,5 +1,5 @@ // lowlevel/MutexEvenSupplier.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Preventing thread collisions with mutexes diff --git a/lowlevel/NaiveExceptionHandling.java b/lowlevel/NaiveExceptionHandling.java index a247edaf0..0a1f9d1d7 100644 --- a/lowlevel/NaiveExceptionHandling.java +++ b/lowlevel/NaiveExceptionHandling.java @@ -1,5 +1,5 @@ // lowlevel/NaiveExceptionHandling.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // {ValidateByHand} diff --git a/lowlevel/NumberOfProcessors.java b/lowlevel/NumberOfProcessors.java index 6728fcd58..103d6c1d2 100644 --- a/lowlevel/NumberOfProcessors.java +++ b/lowlevel/NumberOfProcessors.java @@ -1,5 +1,5 @@ // lowlevel/NumberOfProcessors.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/lowlevel/PriorityBlockingQueueDemo.java b/lowlevel/PriorityBlockingQueueDemo.java index 9955bd9cc..f8b2690d8 100644 --- a/lowlevel/PriorityBlockingQueueDemo.java +++ b/lowlevel/PriorityBlockingQueueDemo.java @@ -1,5 +1,5 @@ // lowlevel/PriorityBlockingQueueDemo.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.concurrent.*; diff --git a/lowlevel/QuittableTask.java b/lowlevel/QuittableTask.java index c42fffe47..2b9268395 100644 --- a/lowlevel/QuittableTask.java +++ b/lowlevel/QuittableTask.java @@ -1,5 +1,5 @@ // lowlevel/QuittableTask.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import onjava.Nap; diff --git a/lowlevel/QuittingTasks.java b/lowlevel/QuittingTasks.java index 456b831fa..107d6cc75 100644 --- a/lowlevel/QuittingTasks.java +++ b/lowlevel/QuittingTasks.java @@ -1,5 +1,5 @@ // lowlevel/QuittingTasks.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.*; diff --git a/lowlevel/Restaurant.java b/lowlevel/Restaurant.java index d2c6c7553..7cc029d9b 100644 --- a/lowlevel/Restaurant.java +++ b/lowlevel/Restaurant.java @@ -1,5 +1,5 @@ // lowlevel/Restaurant.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // The producer-consumer approach to task cooperation diff --git a/lowlevel/SerialNumberChecker.java b/lowlevel/SerialNumberChecker.java index aa2c3a6d5..a04677b4e 100644 --- a/lowlevel/SerialNumberChecker.java +++ b/lowlevel/SerialNumberChecker.java @@ -1,5 +1,5 @@ // lowlevel/SerialNumberChecker.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Operations that might seem safe are not, diff --git a/lowlevel/SerialNumberSupplier.java b/lowlevel/SerialNumberSupplier.java index 4a170f85d..73c7d2d55 100644 --- a/lowlevel/SerialNumberSupplier.java +++ b/lowlevel/SerialNumberSupplier.java @@ -1,5 +1,5 @@ // lowlevel/SerialNumberSupplier.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/lowlevel/SettingDefaultHandler.java b/lowlevel/SettingDefaultHandler.java index 17588d6a4..ac50eaf4d 100644 --- a/lowlevel/SettingDefaultHandler.java +++ b/lowlevel/SettingDefaultHandler.java @@ -1,5 +1,5 @@ // lowlevel/SettingDefaultHandler.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.concurrent.*; diff --git a/lowlevel/SwallowedException.java b/lowlevel/SwallowedException.java index d062d2a14..33c824306 100644 --- a/lowlevel/SwallowedException.java +++ b/lowlevel/SwallowedException.java @@ -1,5 +1,5 @@ // lowlevel/SwallowedException.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.concurrent.*; diff --git a/lowlevel/SyncObject.java b/lowlevel/SyncObject.java index 02104002b..5ff881385 100644 --- a/lowlevel/SyncObject.java +++ b/lowlevel/SyncObject.java @@ -1,5 +1,5 @@ // lowlevel/SyncObject.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Synchronizing on another object diff --git a/lowlevel/SynchronizedEvenSupplier.java b/lowlevel/SynchronizedEvenSupplier.java index 10b375a14..178a833c5 100644 --- a/lowlevel/SynchronizedEvenSupplier.java +++ b/lowlevel/SynchronizedEvenSupplier.java @@ -1,5 +1,5 @@ // lowlevel/SynchronizedEvenSupplier.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Simplifying mutexes with the synchronized keyword diff --git a/lowlevel/ThreadSize.java b/lowlevel/ThreadSize.java index 8a2f9aa56..2865694a1 100644 --- a/lowlevel/ThreadSize.java +++ b/lowlevel/ThreadSize.java @@ -1,5 +1,5 @@ // lowlevel/ThreadSize.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // {ValidateByHand} diff --git a/lowlevel/ToastOMatic.java b/lowlevel/ToastOMatic.java index 1173a8112..9badee5c1 100644 --- a/lowlevel/ToastOMatic.java +++ b/lowlevel/ToastOMatic.java @@ -1,5 +1,5 @@ // lowlevel/ToastOMatic.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // A toaster that uses queues diff --git a/lowlevel/WorkStealingPool.java b/lowlevel/WorkStealingPool.java index 93b6f4b9c..a564172e9 100644 --- a/lowlevel/WorkStealingPool.java +++ b/lowlevel/WorkStealingPool.java @@ -1,5 +1,5 @@ // lowlevel/WorkStealingPool.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.concurrent.*; diff --git a/lowlevel/restaurant2/RestaurantWithQueues.java b/lowlevel/restaurant2/RestaurantWithQueues.java index 5f75dcd40..cebe83559 100644 --- a/lowlevel/restaurant2/RestaurantWithQueues.java +++ b/lowlevel/restaurant2/RestaurantWithQueues.java @@ -1,5 +1,5 @@ // lowlevel/restaurant2/RestaurantWithQueues.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // {java threads.restaurant2.RestaurantWithQueues 5} diff --git a/moreaboutcollections/AssociativeArray.java b/moreaboutcollections/AssociativeArray.java index 597e2a823..445c00615 100644 --- a/moreaboutcollections/AssociativeArray.java +++ b/moreaboutcollections/AssociativeArray.java @@ -1,5 +1,5 @@ // moreaboutcollections/AssociativeArray.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Associates keys with values diff --git a/moreaboutcollections/Bits.java b/moreaboutcollections/Bits.java index a075f5e46..82b8d2c98 100644 --- a/moreaboutcollections/Bits.java +++ b/moreaboutcollections/Bits.java @@ -1,5 +1,5 @@ // moreaboutcollections/Bits.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Demonstration of BitSet diff --git a/moreaboutcollections/CanonicalMapping.java b/moreaboutcollections/CanonicalMapping.java index 1af76e80b..ac56492ea 100644 --- a/moreaboutcollections/CanonicalMapping.java +++ b/moreaboutcollections/CanonicalMapping.java @@ -1,5 +1,5 @@ // moreaboutcollections/CanonicalMapping.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Demonstrates WeakHashMap diff --git a/moreaboutcollections/CollectionMethods.java b/moreaboutcollections/CollectionMethods.java index 4fd86bbc5..8c9c1a924 100644 --- a/moreaboutcollections/CollectionMethods.java +++ b/moreaboutcollections/CollectionMethods.java @@ -1,5 +1,5 @@ // moreaboutcollections/CollectionMethods.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Things you can do with all Collections diff --git a/moreaboutcollections/CountedString.java b/moreaboutcollections/CountedString.java index 03aa556f3..e9d1ace2d 100644 --- a/moreaboutcollections/CountedString.java +++ b/moreaboutcollections/CountedString.java @@ -1,5 +1,5 @@ // moreaboutcollections/CountedString.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Creating a good hashCode() diff --git a/moreaboutcollections/Enumerations.java b/moreaboutcollections/Enumerations.java index 2a90dda50..f856efebb 100644 --- a/moreaboutcollections/Enumerations.java +++ b/moreaboutcollections/Enumerations.java @@ -1,5 +1,5 @@ // moreaboutcollections/Enumerations.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Java 1.0/1.1 Vector and Enumeration diff --git a/moreaboutcollections/FailFast.java b/moreaboutcollections/FailFast.java index 679cb933a..7206d7283 100644 --- a/moreaboutcollections/FailFast.java +++ b/moreaboutcollections/FailFast.java @@ -1,5 +1,5 @@ // moreaboutcollections/FailFast.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Demonstrates the "fail-fast" behavior diff --git a/moreaboutcollections/FillMapTest.java b/moreaboutcollections/FillMapTest.java index 1139d8d03..329679724 100644 --- a/moreaboutcollections/FillMapTest.java +++ b/moreaboutcollections/FillMapTest.java @@ -1,5 +1,5 @@ // moreaboutcollections/FillMapTest.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.*; diff --git a/moreaboutcollections/FillingLists.java b/moreaboutcollections/FillingLists.java index c38154623..1bd91ac13 100644 --- a/moreaboutcollections/FillingLists.java +++ b/moreaboutcollections/FillingLists.java @@ -1,5 +1,5 @@ // moreaboutcollections/FillingLists.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // The Collections.fill() + Collections.nCopies() methods diff --git a/moreaboutcollections/FunctionalMap.java b/moreaboutcollections/FunctionalMap.java index bb59e18cd..06b8b471e 100644 --- a/moreaboutcollections/FunctionalMap.java +++ b/moreaboutcollections/FunctionalMap.java @@ -1,5 +1,5 @@ // moreaboutcollections/FunctionalMap.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Functional operations on a Map diff --git a/moreaboutcollections/Groundhog.java b/moreaboutcollections/Groundhog.java index efaf1d0ee..3f993635b 100644 --- a/moreaboutcollections/Groundhog.java +++ b/moreaboutcollections/Groundhog.java @@ -1,5 +1,5 @@ // moreaboutcollections/Groundhog.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Looks plausible, but doesn't work as a HashMap key diff --git a/moreaboutcollections/Groundhog2.java b/moreaboutcollections/Groundhog2.java index 5337955f4..31d043ad6 100644 --- a/moreaboutcollections/Groundhog2.java +++ b/moreaboutcollections/Groundhog2.java @@ -1,5 +1,5 @@ // moreaboutcollections/Groundhog2.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // A class that's used as a key in a HashMap diff --git a/moreaboutcollections/HTMLColorTest.java b/moreaboutcollections/HTMLColorTest.java index b61c54583..ca4750026 100644 --- a/moreaboutcollections/HTMLColorTest.java +++ b/moreaboutcollections/HTMLColorTest.java @@ -1,5 +1,5 @@ // moreaboutcollections/HTMLColorTest.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import static onjava.HTMLColors.*; diff --git a/moreaboutcollections/IndividualTest.java b/moreaboutcollections/IndividualTest.java index d689b1906..b701f5503 100644 --- a/moreaboutcollections/IndividualTest.java +++ b/moreaboutcollections/IndividualTest.java @@ -1,5 +1,5 @@ // moreaboutcollections/IndividualTest.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import collections.MapOfList; diff --git a/moreaboutcollections/LinkedHashMapDemo.java b/moreaboutcollections/LinkedHashMapDemo.java index bbf7d4ba7..13a13640e 100644 --- a/moreaboutcollections/LinkedHashMapDemo.java +++ b/moreaboutcollections/LinkedHashMapDemo.java @@ -1,5 +1,5 @@ // moreaboutcollections/LinkedHashMapDemo.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // What you can do with a LinkedHashMap diff --git a/moreaboutcollections/ListOps.java b/moreaboutcollections/ListOps.java index 79a36532d..e777762f1 100644 --- a/moreaboutcollections/ListOps.java +++ b/moreaboutcollections/ListOps.java @@ -1,5 +1,5 @@ // moreaboutcollections/ListOps.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Things you can do with Lists diff --git a/moreaboutcollections/ListSortSearch.java b/moreaboutcollections/ListSortSearch.java index bee5dbf7a..af8d684a8 100644 --- a/moreaboutcollections/ListSortSearch.java +++ b/moreaboutcollections/ListSortSearch.java @@ -1,5 +1,5 @@ // moreaboutcollections/ListSortSearch.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Sorting and searching Lists with Collections utilities diff --git a/moreaboutcollections/MapEntry.java b/moreaboutcollections/MapEntry.java index acef2b778..e1680fad9 100644 --- a/moreaboutcollections/MapEntry.java +++ b/moreaboutcollections/MapEntry.java @@ -1,5 +1,5 @@ // moreaboutcollections/MapEntry.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // A simple Map.Entry for sample Map implementations diff --git a/moreaboutcollections/MapOps.java b/moreaboutcollections/MapOps.java index 512842d85..2576de0fb 100644 --- a/moreaboutcollections/MapOps.java +++ b/moreaboutcollections/MapOps.java @@ -1,5 +1,5 @@ // moreaboutcollections/MapOps.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Things you can do with Maps diff --git a/moreaboutcollections/NavMap.java b/moreaboutcollections/NavMap.java index 9fbc11d23..4a4082b01 100644 --- a/moreaboutcollections/NavMap.java +++ b/moreaboutcollections/NavMap.java @@ -1,5 +1,5 @@ // moreaboutcollections/NavMap.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // NavigableMap produces pieces of a Map diff --git a/moreaboutcollections/Prediction.java b/moreaboutcollections/Prediction.java index db41724b7..ce3df03bb 100644 --- a/moreaboutcollections/Prediction.java +++ b/moreaboutcollections/Prediction.java @@ -1,5 +1,5 @@ // moreaboutcollections/Prediction.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Predicting the weather with groundhogs diff --git a/moreaboutcollections/QueueBehavior.java b/moreaboutcollections/QueueBehavior.java index c29c03274..6c9934efb 100644 --- a/moreaboutcollections/QueueBehavior.java +++ b/moreaboutcollections/QueueBehavior.java @@ -1,5 +1,5 @@ // moreaboutcollections/QueueBehavior.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Compares the behavior of some of the queues diff --git a/moreaboutcollections/ReadOnly.java b/moreaboutcollections/ReadOnly.java index bd4a113fa..66ca4f9ee 100644 --- a/moreaboutcollections/ReadOnly.java +++ b/moreaboutcollections/ReadOnly.java @@ -1,5 +1,5 @@ // moreaboutcollections/ReadOnly.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Using the Collections.unmodifiable methods diff --git a/moreaboutcollections/References.java b/moreaboutcollections/References.java index 2da197a58..b934f4e64 100644 --- a/moreaboutcollections/References.java +++ b/moreaboutcollections/References.java @@ -1,5 +1,5 @@ // moreaboutcollections/References.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Demonstrates Reference objects diff --git a/moreaboutcollections/SetOrder.java b/moreaboutcollections/SetOrder.java index b8fdf6ca2..2f08e0ffd 100644 --- a/moreaboutcollections/SetOrder.java +++ b/moreaboutcollections/SetOrder.java @@ -1,5 +1,5 @@ // moreaboutcollections/SetOrder.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.*; diff --git a/moreaboutcollections/SimpleDeques.java b/moreaboutcollections/SimpleDeques.java index 8e07f5877..ec1c1d01d 100644 --- a/moreaboutcollections/SimpleDeques.java +++ b/moreaboutcollections/SimpleDeques.java @@ -1,5 +1,5 @@ // moreaboutcollections/SimpleDeques.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Very basic test of Deques diff --git a/moreaboutcollections/SimpleHashMap.java b/moreaboutcollections/SimpleHashMap.java index 194dc808f..60289ea6c 100644 --- a/moreaboutcollections/SimpleHashMap.java +++ b/moreaboutcollections/SimpleHashMap.java @@ -1,5 +1,5 @@ // moreaboutcollections/SimpleHashMap.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // A demonstration hashed Map diff --git a/moreaboutcollections/SlowMap.java b/moreaboutcollections/SlowMap.java index 25dd81908..487df3640 100644 --- a/moreaboutcollections/SlowMap.java +++ b/moreaboutcollections/SlowMap.java @@ -1,5 +1,5 @@ // moreaboutcollections/SlowMap.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // A Map implemented with ArrayLists diff --git a/moreaboutcollections/SortedMapDemo.java b/moreaboutcollections/SortedMapDemo.java index 1fe931fe8..9cb5cac15 100644 --- a/moreaboutcollections/SortedMapDemo.java +++ b/moreaboutcollections/SortedMapDemo.java @@ -1,5 +1,5 @@ // moreaboutcollections/SortedMapDemo.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // What you can do with a TreeMap diff --git a/moreaboutcollections/SortedSetDemo.java b/moreaboutcollections/SortedSetDemo.java index 0802a2bdc..85558ec47 100644 --- a/moreaboutcollections/SortedSetDemo.java +++ b/moreaboutcollections/SortedSetDemo.java @@ -1,5 +1,5 @@ // moreaboutcollections/SortedSetDemo.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // What you can do with a TreeSet diff --git a/moreaboutcollections/SpringDetector.java b/moreaboutcollections/SpringDetector.java index 7295cd5da..12068593b 100644 --- a/moreaboutcollections/SpringDetector.java +++ b/moreaboutcollections/SpringDetector.java @@ -1,5 +1,5 @@ // moreaboutcollections/SpringDetector.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // What will the weather be? diff --git a/moreaboutcollections/SpringDetector2.java b/moreaboutcollections/SpringDetector2.java index 16c6f7082..cca04375c 100644 --- a/moreaboutcollections/SpringDetector2.java +++ b/moreaboutcollections/SpringDetector2.java @@ -1,5 +1,5 @@ // moreaboutcollections/SpringDetector2.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // A working key diff --git a/moreaboutcollections/Stacks.java b/moreaboutcollections/Stacks.java index 7821956dc..11b0d08cf 100644 --- a/moreaboutcollections/Stacks.java +++ b/moreaboutcollections/Stacks.java @@ -1,5 +1,5 @@ // moreaboutcollections/Stacks.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Demonstration of Stack Class diff --git a/moreaboutcollections/StreamFillMaps.java b/moreaboutcollections/StreamFillMaps.java index 0cfb4c103..c4e05528a 100644 --- a/moreaboutcollections/StreamFillMaps.java +++ b/moreaboutcollections/StreamFillMaps.java @@ -1,5 +1,5 @@ // moreaboutcollections/StreamFillMaps.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.*; diff --git a/moreaboutcollections/StringHashCode.java b/moreaboutcollections/StringHashCode.java index 314c5eab6..9261d2828 100644 --- a/moreaboutcollections/StringHashCode.java +++ b/moreaboutcollections/StringHashCode.java @@ -1,5 +1,5 @@ // moreaboutcollections/StringHashCode.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/moreaboutcollections/SuppliersCollectionTest.java b/moreaboutcollections/SuppliersCollectionTest.java index 3d75a07e4..86e59b718 100644 --- a/moreaboutcollections/SuppliersCollectionTest.java +++ b/moreaboutcollections/SuppliersCollectionTest.java @@ -1,5 +1,5 @@ // moreaboutcollections/SuppliersCollectionTest.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.*; diff --git a/moreaboutcollections/Synchronization.java b/moreaboutcollections/Synchronization.java index 2a4ba708f..d7e4e3f10 100644 --- a/moreaboutcollections/Synchronization.java +++ b/moreaboutcollections/Synchronization.java @@ -1,5 +1,5 @@ // moreaboutcollections/Synchronization.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Using the Collections.synchronized methods diff --git a/moreaboutcollections/ToDoList.java b/moreaboutcollections/ToDoList.java index 7d669a280..1772f8cbd 100644 --- a/moreaboutcollections/ToDoList.java +++ b/moreaboutcollections/ToDoList.java @@ -1,5 +1,5 @@ // moreaboutcollections/ToDoList.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // A more complex use of PriorityQueue diff --git a/moreaboutcollections/TypesForSets.java b/moreaboutcollections/TypesForSets.java index f74ac9094..21c980cb9 100644 --- a/moreaboutcollections/TypesForSets.java +++ b/moreaboutcollections/TypesForSets.java @@ -1,5 +1,5 @@ // moreaboutcollections/TypesForSets.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Methods necessary to put your own type in a Set diff --git a/moreaboutcollections/Unsupported.java b/moreaboutcollections/Unsupported.java index e9fd9ca6c..80e5b51a9 100644 --- a/moreaboutcollections/Unsupported.java +++ b/moreaboutcollections/Unsupported.java @@ -1,5 +1,5 @@ // moreaboutcollections/Unsupported.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Unsupported operations in Java collections diff --git a/moreaboutcollections/Utilities.java b/moreaboutcollections/Utilities.java index 6254c13cc..bf6cc4c5c 100644 --- a/moreaboutcollections/Utilities.java +++ b/moreaboutcollections/Utilities.java @@ -1,5 +1,5 @@ // moreaboutcollections/Utilities.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Simple demonstrations of the Collections utilities diff --git a/moreaboutcollections/jmh/Deques.java b/moreaboutcollections/jmh/Deques.java index c31053e54..5f291afa0 100644 --- a/moreaboutcollections/jmh/Deques.java +++ b/moreaboutcollections/jmh/Deques.java @@ -1,5 +1,5 @@ // moreaboutcollections/jmh/Deques.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Performance differences between Deques diff --git a/moreaboutcollections/jmh/Lists.java b/moreaboutcollections/jmh/Lists.java index e835d106c..b13618f84 100644 --- a/moreaboutcollections/jmh/Lists.java +++ b/moreaboutcollections/jmh/Lists.java @@ -1,5 +1,5 @@ // moreaboutcollections/jmh/Lists.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Performance differences between Lists diff --git a/moreaboutcollections/jmh/Maps.java b/moreaboutcollections/jmh/Maps.java index 3aac24b43..65acda7e7 100644 --- a/moreaboutcollections/jmh/Maps.java +++ b/moreaboutcollections/jmh/Maps.java @@ -1,5 +1,5 @@ // moreaboutcollections/jmh/Maps.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Performance differences between Maps diff --git a/moreaboutcollections/jmh/Queues.java b/moreaboutcollections/jmh/Queues.java index 4550f1625..62554e7da 100644 --- a/moreaboutcollections/jmh/Queues.java +++ b/moreaboutcollections/jmh/Queues.java @@ -1,5 +1,5 @@ // moreaboutcollections/jmh/Queues.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Performance differences between Queues diff --git a/moreaboutcollections/jmh/Sets.java b/moreaboutcollections/jmh/Sets.java index 47c42939c..dd0ef8fb3 100644 --- a/moreaboutcollections/jmh/Sets.java +++ b/moreaboutcollections/jmh/Sets.java @@ -1,5 +1,5 @@ // moreaboutcollections/jmh/Sets.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Demonstrates performance differences in Sets diff --git a/network/ChatterClient.java b/network/ChatterClient.java index f2547cfce..3d32c017b 100644 --- a/network/ChatterClient.java +++ b/network/ChatterClient.java @@ -1,5 +1,5 @@ // network/ChatterClient.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Starts multiple clients, each of which sends datagrams. diff --git a/network/ChatterServer.java b/network/ChatterServer.java index a5d679db0..13022e034 100644 --- a/network/ChatterServer.java +++ b/network/ChatterServer.java @@ -1,5 +1,5 @@ // network/ChatterServer.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // A server that echoes datagrams diff --git a/network/Dgram.java b/network/Dgram.java index cfd0bafcb..342113770 100644 --- a/network/Dgram.java +++ b/network/Dgram.java @@ -1,5 +1,5 @@ // network/Dgram.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Converts between Strings and DataGramPackets diff --git a/network/LocalHost.java b/network/LocalHost.java index 1da36fda3..487680a60 100644 --- a/network/LocalHost.java +++ b/network/LocalHost.java @@ -1,5 +1,5 @@ // network/LocalHost.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // The local loopback IP address diff --git a/network/MultiServer.java b/network/MultiServer.java index 2038c7e8a..9e5568a3e 100644 --- a/network/MultiServer.java +++ b/network/MultiServer.java @@ -1,5 +1,5 @@ // network/MultiServer.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Uses threads to handle any number of clients. diff --git a/network/SimpleClient.java b/network/SimpleClient.java index a38f98ce6..117ad8fd9 100644 --- a/network/SimpleClient.java +++ b/network/SimpleClient.java @@ -1,5 +1,5 @@ // network/SimpleClient.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Sends lines to the server and diff --git a/network/SimpleClient2.java b/network/SimpleClient2.java index 06b4b22c1..ec5a68db6 100644 --- a/network/SimpleClient2.java +++ b/network/SimpleClient2.java @@ -1,5 +1,5 @@ // network/SimpleClient2.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. package network; diff --git a/network/SimpleServer.java b/network/SimpleServer.java index 1ee721f42..03d657cdc 100644 --- a/network/SimpleServer.java +++ b/network/SimpleServer.java @@ -1,5 +1,5 @@ // network/SimpleServer.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Echoes what the client sends. diff --git a/network/WhoAmI.java b/network/WhoAmI.java index e09b56b0b..773c1cbd4 100644 --- a/network/WhoAmI.java +++ b/network/WhoAmI.java @@ -1,5 +1,5 @@ // network/WhoAmI.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Discovers your machine name and network address. diff --git a/network/tests/ChatterTest.java b/network/tests/ChatterTest.java index b72c31d15..806c9977f 100644 --- a/network/tests/ChatterTest.java +++ b/network/tests/ChatterTest.java @@ -1,5 +1,5 @@ // network/tests/ChatterTest.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. package network; diff --git a/network/tests/MultiTest.java b/network/tests/MultiTest.java index 54b5ea06f..9178de2fe 100644 --- a/network/tests/MultiTest.java +++ b/network/tests/MultiTest.java @@ -1,5 +1,5 @@ // network/tests/MultiTest.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. package network; diff --git a/network/tests/TestSimpleServerClient.java b/network/tests/TestSimpleServerClient.java index cc3618cb8..7218eced2 100644 --- a/network/tests/TestSimpleServerClient.java +++ b/network/tests/TestSimpleServerClient.java @@ -1,5 +1,5 @@ // network/tests/TestSimpleServerClient.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. package network; diff --git a/newio/AvailableCharSets.java b/newio/AvailableCharSets.java index 442ad380b..555b3dfb9 100644 --- a/newio/AvailableCharSets.java +++ b/newio/AvailableCharSets.java @@ -1,5 +1,5 @@ // newio/AvailableCharSets.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Displays Charsets and aliases diff --git a/newio/BufferToText.java b/newio/BufferToText.java index 79aa21ebf..f573a128c 100644 --- a/newio/BufferToText.java +++ b/newio/BufferToText.java @@ -1,5 +1,5 @@ // newio/BufferToText.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Converting text to and from ByteBuffers diff --git a/newio/ChannelCopy.java b/newio/ChannelCopy.java index 8f335eb0e..6a67b97d1 100644 --- a/newio/ChannelCopy.java +++ b/newio/ChannelCopy.java @@ -1,5 +1,5 @@ // newio/ChannelCopy.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Copying a file using channels and buffers diff --git a/newio/Endians.java b/newio/Endians.java index afa516ac7..5ff8d7208 100644 --- a/newio/Endians.java +++ b/newio/Endians.java @@ -1,5 +1,5 @@ // newio/Endians.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Endian differences and data storage diff --git a/newio/FileLocking.java b/newio/FileLocking.java index a3ba350f2..ad960f38e 100644 --- a/newio/FileLocking.java +++ b/newio/FileLocking.java @@ -1,5 +1,5 @@ // newio/FileLocking.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.nio.channels.*; diff --git a/newio/GetData.java b/newio/GetData.java index 22e2001b6..b05073db0 100644 --- a/newio/GetData.java +++ b/newio/GetData.java @@ -1,5 +1,5 @@ // newio/GetData.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Getting different representations from a ByteBuffer diff --git a/newio/IntBufferDemo.java b/newio/IntBufferDemo.java index e0e17a7e4..4b3838856 100644 --- a/newio/IntBufferDemo.java +++ b/newio/IntBufferDemo.java @@ -1,5 +1,5 @@ // newio/IntBufferDemo.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Manipulating ints in a ByteBuffer with an IntBuffer diff --git a/newio/LargeMappedFiles.java b/newio/LargeMappedFiles.java index c9d577056..7ecf1e1cc 100644 --- a/newio/LargeMappedFiles.java +++ b/newio/LargeMappedFiles.java @@ -1,5 +1,5 @@ // newio/LargeMappedFiles.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Creating a very large file using mapping diff --git a/newio/LockingMappedFiles.java b/newio/LockingMappedFiles.java index 1f88945ae..e13a2783c 100644 --- a/newio/LockingMappedFiles.java +++ b/newio/LockingMappedFiles.java @@ -1,5 +1,5 @@ // newio/LockingMappedFiles.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Locking portions of a mapped file diff --git a/newio/TransferTo.java b/newio/TransferTo.java index 7680384e6..2a6d8977d 100644 --- a/newio/TransferTo.java +++ b/newio/TransferTo.java @@ -1,5 +1,5 @@ // newio/TransferTo.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Using transferTo() between channels diff --git a/newio/UsingBuffers.java b/newio/UsingBuffers.java index b6c9209f6..4fead2c7b 100644 --- a/newio/UsingBuffers.java +++ b/newio/UsingBuffers.java @@ -1,5 +1,5 @@ // newio/UsingBuffers.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.nio.*; diff --git a/newio/ViewBuffers.java b/newio/ViewBuffers.java index ce6c51ee3..8ba4a478e 100644 --- a/newio/ViewBuffers.java +++ b/newio/ViewBuffers.java @@ -1,5 +1,5 @@ // newio/ViewBuffers.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.nio.*; diff --git a/objects/Documentation1.java b/objects/Documentation1.java index 91ae9619d..42d7bfb9a 100644 --- a/objects/Documentation1.java +++ b/objects/Documentation1.java @@ -1,5 +1,5 @@ // objects/Documentation1.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. /** A class comment */ diff --git a/objects/Documentation2.java b/objects/Documentation2.java index 88569b348..db857a29b 100644 --- a/objects/Documentation2.java +++ b/objects/Documentation2.java @@ -1,5 +1,5 @@ // objects/Documentation2.java -// (c)2016 MindView LLC: see Copyright.txt +// (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. /**

    diff --git a/objects/Documentation3.java b/objects/Documentation3.java
    index 56e01334f..582b83468 100644
    --- a/objects/Documentation3.java
    +++ b/objects/Documentation3.java
    @@ -1,5 +1,5 @@
     // objects/Documentation3.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     /** You can even insert a list:
    diff --git a/objects/HelloDate.java b/objects/HelloDate.java
    index 435361251..fa5b3d2c4 100644
    --- a/objects/HelloDate.java
    +++ b/objects/HelloDate.java
    @@ -1,5 +1,5 @@
     // objects/HelloDate.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    diff --git a/objects/HelloDateDoc.java b/objects/HelloDateDoc.java
    index 0f7ee4f6f..93f326dd3 100644
    --- a/objects/HelloDateDoc.java
    +++ b/objects/HelloDateDoc.java
    @@ -1,5 +1,5 @@
     // objects/HelloDateDoc.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    diff --git a/objects/ShowProperties.java b/objects/ShowProperties.java
    index 84471df47..06dbd419f 100644
    --- a/objects/ShowProperties.java
    +++ b/objects/ShowProperties.java
    @@ -1,5 +1,5 @@
     // objects/ShowProperties.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
    diff --git a/onjava/ArrayShow.java b/onjava/ArrayShow.java
    index 4e94ad374..4ccc5737d 100644
    --- a/onjava/ArrayShow.java
    +++ b/onjava/ArrayShow.java
    @@ -1,5 +1,5 @@
     // onjava/ArrayShow.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package onjava;
    diff --git a/onjava/BasicSupplier.java b/onjava/BasicSupplier.java
    index 6971478f7..097375b61 100644
    --- a/onjava/BasicSupplier.java
    +++ b/onjava/BasicSupplier.java
    @@ -1,5 +1,5 @@
     // onjava/BasicSupplier.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Supplier from a class with a no-arg constructor
    diff --git a/onjava/CollectionMethodDifferences.java b/onjava/CollectionMethodDifferences.java
    index a848b333e..4cfca583a 100644
    --- a/onjava/CollectionMethodDifferences.java
    +++ b/onjava/CollectionMethodDifferences.java
    @@ -1,5 +1,5 @@
     // onjava/CollectionMethodDifferences.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // {java onjava.CollectionMethodDifferences}
    diff --git a/onjava/ConvertTo.java b/onjava/ConvertTo.java
    index 985b7f30a..c6d430166 100644
    --- a/onjava/ConvertTo.java
    +++ b/onjava/ConvertTo.java
    @@ -1,5 +1,5 @@
     // onjava/ConvertTo.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package onjava;
    diff --git a/onjava/Count.java b/onjava/Count.java
    index 294be06d0..2b71ac9dc 100644
    --- a/onjava/Count.java
    +++ b/onjava/Count.java
    @@ -1,5 +1,5 @@
     // onjava/Count.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Generate incremental values of different types
    diff --git a/onjava/CountMap.java b/onjava/CountMap.java
    index 791a2fddf..bd653f882 100644
    --- a/onjava/CountMap.java
    +++ b/onjava/CountMap.java
    @@ -1,5 +1,5 @@
     // onjava/CountMap.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Unlimited-length Map containing sample data
    diff --git a/onjava/CountingIntegerList.java b/onjava/CountingIntegerList.java
    index f299424a9..b7d9e4e8d 100644
    --- a/onjava/CountingIntegerList.java
    +++ b/onjava/CountingIntegerList.java
    @@ -1,5 +1,5 @@
     // onjava/CountingIntegerList.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // List of any length, containing sample data
    diff --git a/onjava/Countries.java b/onjava/Countries.java
    index 9551a1244..4cd976342 100644
    --- a/onjava/Countries.java
    +++ b/onjava/Countries.java
    @@ -1,5 +1,5 @@
     // onjava/Countries.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // "Flyweight" Maps and Lists of sample data
    diff --git a/onjava/Enums.java b/onjava/Enums.java
    index 26f625a2c..9c9308b92 100644
    --- a/onjava/Enums.java
    +++ b/onjava/Enums.java
    @@ -1,5 +1,5 @@
     // onjava/Enums.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package onjava;
    diff --git a/onjava/FillMap.java b/onjava/FillMap.java
    index 880abe2c8..33d202e1e 100644
    --- a/onjava/FillMap.java
    +++ b/onjava/FillMap.java
    @@ -1,5 +1,5 @@
     // onjava/FillMap.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package onjava;
    diff --git a/onjava/HTMLColors.java b/onjava/HTMLColors.java
    index 3d570a09c..5dea21def 100644
    --- a/onjava/HTMLColors.java
    +++ b/onjava/HTMLColors.java
    @@ -1,5 +1,5 @@
     // onjava/HTMLColors.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Sample data for collection examples
    diff --git a/onjava/Hex.java b/onjava/Hex.java
    index a1cbaf2b0..b3482d3a3 100644
    --- a/onjava/Hex.java
    +++ b/onjava/Hex.java
    @@ -1,5 +1,5 @@
     // onjava/Hex.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // {java onjava.Hex}
    diff --git a/onjava/MouseClick.java b/onjava/MouseClick.java
    index cf8871b36..7d57022cd 100644
    --- a/onjava/MouseClick.java
    +++ b/onjava/MouseClick.java
    @@ -1,5 +1,5 @@
     // onjava/MouseClick.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Helper interface to allow lambda expressions
    diff --git a/onjava/Nap.java b/onjava/Nap.java
    index a25bc2f80..c4a66b4b2 100644
    --- a/onjava/Nap.java
    +++ b/onjava/Nap.java
    @@ -1,5 +1,5 @@
     // onjava/Nap.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Sleep for n milliseconds
    diff --git a/onjava/Null.java b/onjava/Null.java
    index a89f81026..4f8659310 100644
    --- a/onjava/Null.java
    +++ b/onjava/Null.java
    @@ -1,5 +1,5 @@
     // onjava/Null.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package onjava;
    diff --git a/onjava/OSExecute.java b/onjava/OSExecute.java
    index df2d1e2ae..2158412b3 100644
    --- a/onjava/OSExecute.java
    +++ b/onjava/OSExecute.java
    @@ -1,5 +1,5 @@
     // onjava/OSExecute.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Run an operating system command
    diff --git a/onjava/OSExecuteException.java b/onjava/OSExecuteException.java
    index aa3a372dd..95c868bef 100644
    --- a/onjava/OSExecuteException.java
    +++ b/onjava/OSExecuteException.java
    @@ -1,5 +1,5 @@
     // onjava/OSExecuteException.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package onjava;
    diff --git a/onjava/Operations.java b/onjava/Operations.java
    index e936ec518..442dd1acc 100644
    --- a/onjava/Operations.java
    +++ b/onjava/Operations.java
    @@ -1,5 +1,5 @@
     // onjava/Operations.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package onjava;
    diff --git a/onjava/Pair.java b/onjava/Pair.java
    index 7eae2909d..657aa56bb 100644
    --- a/onjava/Pair.java
    +++ b/onjava/Pair.java
    @@ -1,5 +1,5 @@
     // onjava/Pair.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package onjava;
    diff --git a/onjava/ProcessFiles.java b/onjava/ProcessFiles.java
    index c2d927541..353062b35 100644
    --- a/onjava/ProcessFiles.java
    +++ b/onjava/ProcessFiles.java
    @@ -1,5 +1,5 @@
     // onjava/ProcessFiles.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // {ValidateByHand}
    diff --git a/onjava/Rand.java b/onjava/Rand.java
    index 7af727063..1c3525d8d 100644
    --- a/onjava/Rand.java
    +++ b/onjava/Rand.java
    @@ -1,5 +1,5 @@
     // onjava/Rand.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Generate random values of different types
    diff --git a/onjava/Range.java b/onjava/Range.java
    index 1def5045b..dfece996c 100644
    --- a/onjava/Range.java
    +++ b/onjava/Range.java
    @@ -1,5 +1,5 @@
     // onjava/Range.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Array creation methods that can be used without
    diff --git a/onjava/Repeat.java b/onjava/Repeat.java
    index 97257967f..59aad0522 100644
    --- a/onjava/Repeat.java
    +++ b/onjava/Repeat.java
    @@ -1,5 +1,5 @@
     // onjava/Repeat.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package onjava;
    diff --git a/onjava/RmDir.java b/onjava/RmDir.java
    index 864e1454d..89a495d48 100644
    --- a/onjava/RmDir.java
    +++ b/onjava/RmDir.java
    @@ -1,5 +1,5 @@
     // onjava/RmDir.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package onjava;
    diff --git a/onjava/Sets.java b/onjava/Sets.java
    index 4500349a6..71afe50f8 100644
    --- a/onjava/Sets.java
    +++ b/onjava/Sets.java
    @@ -1,5 +1,5 @@
     // onjava/Sets.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package onjava;
    diff --git a/onjava/Stack.java b/onjava/Stack.java
    index a1687606f..84b08a4e3 100644
    --- a/onjava/Stack.java
    +++ b/onjava/Stack.java
    @@ -1,5 +1,5 @@
     // onjava/Stack.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // A Stack class built with an ArrayDeque
    diff --git a/onjava/Suppliers.java b/onjava/Suppliers.java
    index e1a724f36..c48ece0f5 100644
    --- a/onjava/Suppliers.java
    +++ b/onjava/Suppliers.java
    @@ -1,5 +1,5 @@
     // onjava/Suppliers.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // A utility to use with Suppliers
    diff --git a/onjava/TimedAbort.java b/onjava/TimedAbort.java
    index 989515ea1..7c06df071 100644
    --- a/onjava/TimedAbort.java
    +++ b/onjava/TimedAbort.java
    @@ -1,5 +1,5 @@
     // onjava/TimedAbort.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Terminate a program after n seconds
    diff --git a/onjava/Timer.java b/onjava/Timer.java
    index 722f777f3..e1c3fc9ba 100644
    --- a/onjava/Timer.java
    +++ b/onjava/Timer.java
    @@ -1,5 +1,5 @@
     // onjava/Timer.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package onjava;
    diff --git a/onjava/Tuple.java b/onjava/Tuple.java
    index dc75b7983..05da09f25 100644
    --- a/onjava/Tuple.java
    +++ b/onjava/Tuple.java
    @@ -1,5 +1,5 @@
     // onjava/Tuple.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Tuple library using type argument inference
    diff --git a/onjava/Tuple2.java b/onjava/Tuple2.java
    index b7642aca6..862affe74 100644
    --- a/onjava/Tuple2.java
    +++ b/onjava/Tuple2.java
    @@ -1,5 +1,5 @@
     // onjava/Tuple2.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package onjava;
    diff --git a/onjava/Tuple3.java b/onjava/Tuple3.java
    index 971d380d0..c7b1007e8 100644
    --- a/onjava/Tuple3.java
    +++ b/onjava/Tuple3.java
    @@ -1,5 +1,5 @@
     // onjava/Tuple3.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package onjava;
    diff --git a/onjava/Tuple4.java b/onjava/Tuple4.java
    index 9ad6c9225..0fdaf2be6 100644
    --- a/onjava/Tuple4.java
    +++ b/onjava/Tuple4.java
    @@ -1,5 +1,5 @@
     // onjava/Tuple4.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package onjava;
    diff --git a/onjava/Tuple5.java b/onjava/Tuple5.java
    index e346864dc..58a80c03d 100644
    --- a/onjava/Tuple5.java
    +++ b/onjava/Tuple5.java
    @@ -1,5 +1,5 @@
     // onjava/Tuple5.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package onjava;
    diff --git a/onjava/TypeCounter.java b/onjava/TypeCounter.java
    index a314ec311..e14d7891c 100644
    --- a/onjava/TypeCounter.java
    +++ b/onjava/TypeCounter.java
    @@ -1,5 +1,5 @@
     // onjava/TypeCounter.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Counts instances of a type family
    diff --git a/onjava/atunit/AtUnit.java b/onjava/atunit/AtUnit.java
    index c22048245..ee6528df2 100644
    --- a/onjava/atunit/AtUnit.java
    +++ b/onjava/atunit/AtUnit.java
    @@ -1,5 +1,5 @@
     // onjava/atunit/AtUnit.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // An annotation-based unit-test framework
    diff --git a/onjava/atunit/ClassNameFinder.java b/onjava/atunit/ClassNameFinder.java
    index 13592086e..1444fa577 100644
    --- a/onjava/atunit/ClassNameFinder.java
    +++ b/onjava/atunit/ClassNameFinder.java
    @@ -1,5 +1,5 @@
     // onjava/atunit/ClassNameFinder.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // {java onjava.atunit.ClassNameFinder}
    diff --git a/onjava/atunit/Test.java b/onjava/atunit/Test.java
    index f45818b09..fd4558f6c 100644
    --- a/onjava/atunit/Test.java
    +++ b/onjava/atunit/Test.java
    @@ -1,5 +1,5 @@
     // onjava/atunit/Test.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // The @Test tag
    diff --git a/onjava/atunit/TestObjectCleanup.java b/onjava/atunit/TestObjectCleanup.java
    index 69036c0e9..55937f9cd 100644
    --- a/onjava/atunit/TestObjectCleanup.java
    +++ b/onjava/atunit/TestObjectCleanup.java
    @@ -1,5 +1,5 @@
     // onjava/atunit/TestObjectCleanup.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // The @Unit @TestObjectCleanup tag
    diff --git a/onjava/atunit/TestObjectCreate.java b/onjava/atunit/TestObjectCreate.java
    index aa2d68ce5..55c7a73ac 100644
    --- a/onjava/atunit/TestObjectCreate.java
    +++ b/onjava/atunit/TestObjectCreate.java
    @@ -1,5 +1,5 @@
     // onjava/atunit/TestObjectCreate.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // The @Unit @TestObjectCreate tag
    diff --git a/onjava/atunit/TestProperty.java b/onjava/atunit/TestProperty.java
    index 04c41d825..e8873fcc8 100644
    --- a/onjava/atunit/TestProperty.java
    +++ b/onjava/atunit/TestProperty.java
    @@ -1,5 +1,5 @@
     // onjava/atunit/TestProperty.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // The @Unit @TestProperty tag
    diff --git a/operators/AllOps.java b/operators/AllOps.java
    index 65bfef8de..27a62f354 100644
    --- a/operators/AllOps.java
    +++ b/operators/AllOps.java
    @@ -1,5 +1,5 @@
     // operators/AllOps.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Tests all operators on all primitive data types
    diff --git a/operators/Assignment.java b/operators/Assignment.java
    index 1ca645c89..a341f38ff 100644
    --- a/operators/Assignment.java
    +++ b/operators/Assignment.java
    @@ -1,5 +1,5 @@
     // operators/Assignment.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Assignment with objects is a bit tricky
    diff --git a/operators/AutoInc.java b/operators/AutoInc.java
    index bed3340c9..385ca9731 100644
    --- a/operators/AutoInc.java
    +++ b/operators/AutoInc.java
    @@ -1,5 +1,5 @@
     // operators/AutoInc.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Demonstrates the ++ and -- operators
    diff --git a/operators/BitManipulation.java b/operators/BitManipulation.java
    index 815599a54..2ec1b985c 100644
    --- a/operators/BitManipulation.java
    +++ b/operators/BitManipulation.java
    @@ -1,5 +1,5 @@
     // operators/BitManipulation.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Using the bitwise operators
    diff --git a/operators/Bool.java b/operators/Bool.java
    index 125d8f29c..79c3eac39 100644
    --- a/operators/Bool.java
    +++ b/operators/Bool.java
    @@ -1,5 +1,5 @@
     // operators/Bool.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Relational and logical operators
    diff --git a/operators/Casting.java b/operators/Casting.java
    index 2d22475f3..96ec6c7f8 100644
    --- a/operators/Casting.java
    +++ b/operators/Casting.java
    @@ -1,5 +1,5 @@
     // operators/Casting.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
    diff --git a/operators/CastingNumbers.java b/operators/CastingNumbers.java
    index 7c2916505..2397496ad 100644
    --- a/operators/CastingNumbers.java
    +++ b/operators/CastingNumbers.java
    @@ -1,5 +1,5 @@
     // operators/CastingNumbers.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // What happens when you cast a float
    diff --git a/operators/EqualsMethod.java b/operators/EqualsMethod.java
    index 90e380066..baa3877d6 100644
    --- a/operators/EqualsMethod.java
    +++ b/operators/EqualsMethod.java
    @@ -1,5 +1,5 @@
     // operators/EqualsMethod.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
    diff --git a/operators/EqualsMethod2.java b/operators/EqualsMethod2.java
    index 857c27d55..490d3f8cb 100644
    --- a/operators/EqualsMethod2.java
    +++ b/operators/EqualsMethod2.java
    @@ -1,5 +1,5 @@
     // operators/EqualsMethod2.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Default equals() does not compare contents
    diff --git a/operators/Equivalence.java b/operators/Equivalence.java
    index 4a0ddf9a1..a3d26fd12 100644
    --- a/operators/Equivalence.java
    +++ b/operators/Equivalence.java
    @@ -1,5 +1,5 @@
     // operators/Equivalence.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
    diff --git a/operators/Exponents.java b/operators/Exponents.java
    index 21a027a05..1f7269cb3 100644
    --- a/operators/Exponents.java
    +++ b/operators/Exponents.java
    @@ -1,5 +1,5 @@
     // operators/Exponents.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // "e" means "10 to the power."
    diff --git a/operators/Literals.java b/operators/Literals.java
    index c3e003da7..2f7804044 100644
    --- a/operators/Literals.java
    +++ b/operators/Literals.java
    @@ -1,5 +1,5 @@
     // operators/Literals.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
    diff --git a/operators/MathOps.java b/operators/MathOps.java
    index 1fd7b531a..32587fd74 100644
    --- a/operators/MathOps.java
    +++ b/operators/MathOps.java
    @@ -1,5 +1,5 @@
     // operators/MathOps.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // The mathematical operators
    diff --git a/operators/Overflow.java b/operators/Overflow.java
    index dfb207ad5..798d849e8 100644
    --- a/operators/Overflow.java
    +++ b/operators/Overflow.java
    @@ -1,5 +1,5 @@
     // operators/Overflow.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Surprise! Java lets you overflow
    diff --git a/operators/PassObject.java b/operators/PassObject.java
    index 50b7793ab..153efd857 100644
    --- a/operators/PassObject.java
    +++ b/operators/PassObject.java
    @@ -1,5 +1,5 @@
     // operators/PassObject.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Passing objects to methods might not be
    diff --git a/operators/Precedence.java b/operators/Precedence.java
    index 150817978..f16942c33 100644
    --- a/operators/Precedence.java
    +++ b/operators/Precedence.java
    @@ -1,5 +1,5 @@
     // operators/Precedence.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
    diff --git a/operators/RoundingNumbers.java b/operators/RoundingNumbers.java
    index d6ebcc32c..7ecc68299 100644
    --- a/operators/RoundingNumbers.java
    +++ b/operators/RoundingNumbers.java
    @@ -1,5 +1,5 @@
     // operators/RoundingNumbers.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Rounding floats and doubles
    diff --git a/operators/ShortCircuit.java b/operators/ShortCircuit.java
    index d0c586a4d..c60ef20fb 100644
    --- a/operators/ShortCircuit.java
    +++ b/operators/ShortCircuit.java
    @@ -1,5 +1,5 @@
     // operators/ShortCircuit.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Short-circuiting behavior with logical operators
    diff --git a/operators/StringOperators.java b/operators/StringOperators.java
    index 65da96e06..1719fae58 100644
    --- a/operators/StringOperators.java
    +++ b/operators/StringOperators.java
    @@ -1,5 +1,5 @@
     // operators/StringOperators.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
    diff --git a/operators/TernaryIfElse.java b/operators/TernaryIfElse.java
    index d7e36fb32..53361557a 100644
    --- a/operators/TernaryIfElse.java
    +++ b/operators/TernaryIfElse.java
    @@ -1,5 +1,5 @@
     // operators/TernaryIfElse.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
    diff --git a/operators/URShift.java b/operators/URShift.java
    index 51ebabe39..95350a57e 100644
    --- a/operators/URShift.java
    +++ b/operators/URShift.java
    @@ -1,5 +1,5 @@
     // operators/URShift.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Test of unsigned right shift
    diff --git a/operators/Underscores.java b/operators/Underscores.java
    index ccd56425c..2805f43e8 100644
    --- a/operators/Underscores.java
    +++ b/operators/Underscores.java
    @@ -1,5 +1,5 @@
     // operators/Underscores.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
    diff --git a/patterns/CommandPattern.java b/patterns/CommandPattern.java
    index 3bf0a508b..277b1fb9f 100644
    --- a/patterns/CommandPattern.java
    +++ b/patterns/CommandPattern.java
    @@ -1,5 +1,5 @@
     // patterns/CommandPattern.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    diff --git a/patterns/Facade.java b/patterns/Facade.java
    index 0e708ff45..4a042d179 100644
    --- a/patterns/Facade.java
    +++ b/patterns/Facade.java
    @@ -1,5 +1,5 @@
     // patterns/Facade.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
    diff --git a/patterns/PaperScissorsRock.java b/patterns/PaperScissorsRock.java
    index 8ea0bcf39..963da941a 100644
    --- a/patterns/PaperScissorsRock.java
    +++ b/patterns/PaperScissorsRock.java
    @@ -1,5 +1,5 @@
     // patterns/PaperScissorsRock.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Demonstration of multiple dispatching
    diff --git a/patterns/ProxyDemo.java b/patterns/ProxyDemo.java
    index d7d9cd2c3..d673a3e68 100644
    --- a/patterns/ProxyDemo.java
    +++ b/patterns/ProxyDemo.java
    @@ -1,5 +1,5 @@
     // patterns/ProxyDemo.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Simple demonstration of the Proxy pattern
    diff --git a/patterns/ShapeFactory2.java b/patterns/ShapeFactory2.java
    index 3a82b47d3..67633a3a0 100644
    --- a/patterns/ShapeFactory2.java
    +++ b/patterns/ShapeFactory2.java
    @@ -1,5 +1,5 @@
     // patterns/ShapeFactory2.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Polymorphic factory methods
    diff --git a/patterns/StateDemo.java b/patterns/StateDemo.java
    index e369cd1d4..976c8dbc9 100644
    --- a/patterns/StateDemo.java
    +++ b/patterns/StateDemo.java
    @@ -1,5 +1,5 @@
     // patterns/StateDemo.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Simple demonstration of the State pattern
    diff --git a/patterns/TemplateMethod.java b/patterns/TemplateMethod.java
    index b6b6ad9ee..ef2559162 100644
    --- a/patterns/TemplateMethod.java
    +++ b/patterns/TemplateMethod.java
    @@ -1,5 +1,5 @@
     // patterns/TemplateMethod.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Simple demonstration of Template Method
    diff --git a/patterns/absfactory/GameEnvironment.java b/patterns/absfactory/GameEnvironment.java
    index 79ef9d185..c583796de 100644
    --- a/patterns/absfactory/GameEnvironment.java
    +++ b/patterns/absfactory/GameEnvironment.java
    @@ -1,5 +1,5 @@
     // patterns/absfactory/GameEnvironment.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // An example of the Abstract Factory pattern
    diff --git a/patterns/adapt/Adapter.java b/patterns/adapt/Adapter.java
    index ad699dc77..609ba8623 100644
    --- a/patterns/adapt/Adapter.java
    +++ b/patterns/adapt/Adapter.java
    @@ -1,5 +1,5 @@
     // patterns/adapt/Adapter.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Variations on the Adapter pattern
    diff --git a/patterns/chain/ChainOfResponsibility.java b/patterns/chain/ChainOfResponsibility.java
    index c6a75a5ef..140b4dffe 100644
    --- a/patterns/chain/ChainOfResponsibility.java
    +++ b/patterns/chain/ChainOfResponsibility.java
    @@ -1,5 +1,5 @@
     // patterns/chain/ChainOfResponsibility.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Using the Functional interface
    diff --git a/patterns/doubledispatch/Aluminum.java b/patterns/doubledispatch/Aluminum.java
    index f270036f4..09621f09d 100644
    --- a/patterns/doubledispatch/Aluminum.java
    +++ b/patterns/doubledispatch/Aluminum.java
    @@ -1,5 +1,5 @@
     // patterns/doubledispatch/Aluminum.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Aluminum for double dispatching
    diff --git a/patterns/doubledispatch/Cardboard.java b/patterns/doubledispatch/Cardboard.java
    index fcaf4390e..f0b2591d4 100644
    --- a/patterns/doubledispatch/Cardboard.java
    +++ b/patterns/doubledispatch/Cardboard.java
    @@ -1,5 +1,5 @@
     // patterns/doubledispatch/Cardboard.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Cardboard for double dispatching
    diff --git a/patterns/doubledispatch/DoubleDispatch.java b/patterns/doubledispatch/DoubleDispatch.java
    index a1e3576b7..90f6b9c49 100644
    --- a/patterns/doubledispatch/DoubleDispatch.java
    +++ b/patterns/doubledispatch/DoubleDispatch.java
    @@ -1,5 +1,5 @@
     // patterns/doubledispatch/DoubleDispatch.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Using multiple dispatching to handle more
    diff --git a/patterns/doubledispatch/Glass.java b/patterns/doubledispatch/Glass.java
    index 19b192a49..fc8474969 100644
    --- a/patterns/doubledispatch/Glass.java
    +++ b/patterns/doubledispatch/Glass.java
    @@ -1,5 +1,5 @@
     // patterns/doubledispatch/Glass.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Glass for double dispatching
    diff --git a/patterns/doubledispatch/Paper.java b/patterns/doubledispatch/Paper.java
    index 4a1af5c37..0be35588b 100644
    --- a/patterns/doubledispatch/Paper.java
    +++ b/patterns/doubledispatch/Paper.java
    @@ -1,5 +1,5 @@
     // patterns/doubledispatch/Paper.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Paper for double dispatching
    diff --git a/patterns/doubledispatch/TypedBin.java b/patterns/doubledispatch/TypedBin.java
    index 2f2119159..7529745f8 100644
    --- a/patterns/doubledispatch/TypedBin.java
    +++ b/patterns/doubledispatch/TypedBin.java
    @@ -1,5 +1,5 @@
     // patterns/doubledispatch/TypedBin.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // A List that can grab the right type
    diff --git a/patterns/doubledispatch/TypedBinMember.java b/patterns/doubledispatch/TypedBinMember.java
    index 870e775a3..72b11b75e 100644
    --- a/patterns/doubledispatch/TypedBinMember.java
    +++ b/patterns/doubledispatch/TypedBinMember.java
    @@ -1,5 +1,5 @@
     // patterns/doubledispatch/TypedBinMember.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // An interface for adding the double dispatching
    diff --git a/patterns/dynatrash/DynaTrash.java b/patterns/dynatrash/DynaTrash.java
    index b71f81b5c..a3c0328a9 100644
    --- a/patterns/dynatrash/DynaTrash.java
    +++ b/patterns/dynatrash/DynaTrash.java
    @@ -1,5 +1,5 @@
     // patterns/dynatrash/DynaTrash.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Using a Map of Lists and RTTI to automatically
    diff --git a/patterns/factory/ShapeFactory1.java b/patterns/factory/ShapeFactory1.java
    index 147d4c4df..109c1eada 100644
    --- a/patterns/factory/ShapeFactory1.java
    +++ b/patterns/factory/ShapeFactory1.java
    @@ -1,5 +1,5 @@
     // patterns/factory/ShapeFactory1.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // A simple static factory method
    diff --git a/patterns/observer/ObservedFlower.java b/patterns/observer/ObservedFlower.java
    index 479ca8dff..a36c0569e 100644
    --- a/patterns/observer/ObservedFlower.java
    +++ b/patterns/observer/ObservedFlower.java
    @@ -1,5 +1,5 @@
     // patterns/observer/ObservedFlower.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Demonstration of "Observer" pattern
    diff --git a/patterns/recyclea/RecycleA.java b/patterns/recyclea/RecycleA.java
    index 02e35008e..9dc54a758 100644
    --- a/patterns/recyclea/RecycleA.java
    +++ b/patterns/recyclea/RecycleA.java
    @@ -1,5 +1,5 @@
     // patterns/recyclea/RecycleA.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Recycling with RTTI
    diff --git a/patterns/recycleb/RecycleB.java b/patterns/recycleb/RecycleB.java
    index 0b8ea0847..19e92f9d2 100644
    --- a/patterns/recycleb/RecycleB.java
    +++ b/patterns/recycleb/RecycleB.java
    @@ -1,5 +1,5 @@
     // patterns/recycleb/RecycleB.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // {java patterns.recycleb.RecycleB}
    diff --git a/patterns/recyclec/RecycleC.java b/patterns/recyclec/RecycleC.java
    index d1f8c257b..93ad664b8 100644
    --- a/patterns/recyclec/RecycleC.java
    +++ b/patterns/recyclec/RecycleC.java
    @@ -1,5 +1,5 @@
     // patterns/recyclec/RecycleC.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Adding more objects to the recycling problem
    diff --git a/patterns/state/StateMachineDemo.java b/patterns/state/StateMachineDemo.java
    index c7af6c273..24f21262c 100644
    --- a/patterns/state/StateMachineDemo.java
    +++ b/patterns/state/StateMachineDemo.java
    @@ -1,5 +1,5 @@
     // patterns/state/StateMachineDemo.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // The StateMachine pattern and Template method
    diff --git a/patterns/strategy/StrategyPattern.java b/patterns/strategy/StrategyPattern.java
    index 45f813880..d26e7801b 100644
    --- a/patterns/strategy/StrategyPattern.java
    +++ b/patterns/strategy/StrategyPattern.java
    @@ -1,5 +1,5 @@
     // patterns/strategy/StrategyPattern.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // {java patterns.strategy.StrategyPattern}
    diff --git a/patterns/strategy/StrategyPattern2.java b/patterns/strategy/StrategyPattern2.java
    index 89eecdbf0..e8db61547 100644
    --- a/patterns/strategy/StrategyPattern2.java
    +++ b/patterns/strategy/StrategyPattern2.java
    @@ -1,5 +1,5 @@
     // patterns/strategy/StrategyPattern2.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // {java patterns.strategy.StrategyPattern2}
    diff --git a/patterns/trash/Aluminum.java b/patterns/trash/Aluminum.java
    index b59de04fe..210e57014 100644
    --- a/patterns/trash/Aluminum.java
    +++ b/patterns/trash/Aluminum.java
    @@ -1,5 +1,5 @@
     // patterns/trash/Aluminum.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package patterns.trash;
    diff --git a/patterns/trash/Cardboard.java b/patterns/trash/Cardboard.java
    index 122bce84e..bb7f84a86 100644
    --- a/patterns/trash/Cardboard.java
    +++ b/patterns/trash/Cardboard.java
    @@ -1,5 +1,5 @@
     // patterns/trash/Cardboard.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package patterns.trash;
    diff --git a/patterns/trash/Fillable.java b/patterns/trash/Fillable.java
    index b4f37fe0c..9ac0da0de 100644
    --- a/patterns/trash/Fillable.java
    +++ b/patterns/trash/Fillable.java
    @@ -1,5 +1,5 @@
     // patterns/trash/Fillable.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Any object that can be filled with Trash
    diff --git a/patterns/trash/FillableList.java b/patterns/trash/FillableList.java
    index 349abae3c..d6e638c28 100644
    --- a/patterns/trash/FillableList.java
    +++ b/patterns/trash/FillableList.java
    @@ -1,5 +1,5 @@
     // patterns/trash/FillableList.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Adapter that makes a List Fillable
    diff --git a/patterns/trash/Glass.java b/patterns/trash/Glass.java
    index 65e93bdf8..83c4b3f87 100644
    --- a/patterns/trash/Glass.java
    +++ b/patterns/trash/Glass.java
    @@ -1,5 +1,5 @@
     // patterns/trash/Glass.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package patterns.trash;
    diff --git a/patterns/trash/Paper.java b/patterns/trash/Paper.java
    index 3e7381709..448383c72 100644
    --- a/patterns/trash/Paper.java
    +++ b/patterns/trash/Paper.java
    @@ -1,5 +1,5 @@
     // patterns/trash/Paper.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package patterns.trash;
    diff --git a/patterns/trash/ParseTrash.java b/patterns/trash/ParseTrash.java
    index 63523a395..709ad1a85 100644
    --- a/patterns/trash/ParseTrash.java
    +++ b/patterns/trash/ParseTrash.java
    @@ -1,5 +1,5 @@
     // patterns/trash/ParseTrash.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Open a file and parse its contents into
    diff --git a/patterns/trash/Trash.java b/patterns/trash/Trash.java
    index 2fa226a75..297144ee1 100644
    --- a/patterns/trash/Trash.java
    +++ b/patterns/trash/Trash.java
    @@ -1,5 +1,5 @@
     // patterns/trash/Trash.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Base class for Trash recycling examples
    diff --git a/patterns/trashvisitor/Aluminum.java b/patterns/trashvisitor/Aluminum.java
    index 1e412c771..c89592c33 100644
    --- a/patterns/trashvisitor/Aluminum.java
    +++ b/patterns/trashvisitor/Aluminum.java
    @@ -1,5 +1,5 @@
     // patterns/trashvisitor/Aluminum.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Aluminum for the visitor pattern
    diff --git a/patterns/trashvisitor/Cardboard.java b/patterns/trashvisitor/Cardboard.java
    index 1d6c66fa8..23fcb1a44 100644
    --- a/patterns/trashvisitor/Cardboard.java
    +++ b/patterns/trashvisitor/Cardboard.java
    @@ -1,5 +1,5 @@
     // patterns/trashvisitor/Cardboard.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Cardboard for the visitor pattern
    diff --git a/patterns/trashvisitor/Glass.java b/patterns/trashvisitor/Glass.java
    index 0c35f7de6..70e5d2105 100644
    --- a/patterns/trashvisitor/Glass.java
    +++ b/patterns/trashvisitor/Glass.java
    @@ -1,5 +1,5 @@
     // patterns/trashvisitor/Glass.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Glass for the visitor pattern
    diff --git a/patterns/trashvisitor/Paper.java b/patterns/trashvisitor/Paper.java
    index 94fe7aa00..d42cb0610 100644
    --- a/patterns/trashvisitor/Paper.java
    +++ b/patterns/trashvisitor/Paper.java
    @@ -1,5 +1,5 @@
     // patterns/trashvisitor/Paper.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Paper for the visitor pattern
    diff --git a/patterns/trashvisitor/TrashVisitor.java b/patterns/trashvisitor/TrashVisitor.java
    index 73f134d49..bb0eeec18 100644
    --- a/patterns/trashvisitor/TrashVisitor.java
    +++ b/patterns/trashvisitor/TrashVisitor.java
    @@ -1,5 +1,5 @@
     // patterns/trashvisitor/TrashVisitor.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // {java patterns.trashvisitor.TrashVisitor}
    diff --git a/patterns/trashvisitor/Visitable.java b/patterns/trashvisitor/Visitable.java
    index 85e4a42c7..040dec17d 100644
    --- a/patterns/trashvisitor/Visitable.java
    +++ b/patterns/trashvisitor/Visitable.java
    @@ -1,5 +1,5 @@
     // patterns/trashvisitor/Visitable.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // An interface to add visitor functionality to the
    diff --git a/patterns/trashvisitor/Visitor.java b/patterns/trashvisitor/Visitor.java
    index f6c330258..f098440ce 100644
    --- a/patterns/trashvisitor/Visitor.java
    +++ b/patterns/trashvisitor/Visitor.java
    @@ -1,5 +1,5 @@
     // patterns/trashvisitor/Visitor.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // The base interface for visitors
    diff --git a/patterns/visitor/BeeAndFlowers.java b/patterns/visitor/BeeAndFlowers.java
    index d5fbb11eb..6ba97f11b 100644
    --- a/patterns/visitor/BeeAndFlowers.java
    +++ b/patterns/visitor/BeeAndFlowers.java
    @@ -1,5 +1,5 @@
     // patterns/visitor/BeeAndFlowers.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Demonstration of "visitor" pattern
    diff --git a/patterns/visualobserver/BoxObserver.java b/patterns/visualobserver/BoxObserver.java
    index d0cb06a68..51f028480 100644
    --- a/patterns/visualobserver/BoxObserver.java
    +++ b/patterns/visualobserver/BoxObserver.java
    @@ -1,5 +1,5 @@
     // patterns/visualobserver/BoxObserver.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Demonstration of Observer pattern using
    diff --git a/polymorphism/CovariantReturn.java b/polymorphism/CovariantReturn.java
    index 693493e68..b30e0b640 100644
    --- a/polymorphism/CovariantReturn.java
    +++ b/polymorphism/CovariantReturn.java
    @@ -1,5 +1,5 @@
     // polymorphism/CovariantReturn.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
    diff --git a/polymorphism/FieldAccess.java b/polymorphism/FieldAccess.java
    index 913030676..7c72d4817 100644
    --- a/polymorphism/FieldAccess.java
    +++ b/polymorphism/FieldAccess.java
    @@ -1,5 +1,5 @@
     // polymorphism/FieldAccess.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Direct field access is determined at compile time
    diff --git a/polymorphism/Frog.java b/polymorphism/Frog.java
    index de6e6c61f..f36de16cd 100644
    --- a/polymorphism/Frog.java
    +++ b/polymorphism/Frog.java
    @@ -1,5 +1,5 @@
     // polymorphism/Frog.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Cleanup and inheritance
    diff --git a/polymorphism/PolyConstructors.java b/polymorphism/PolyConstructors.java
    index c5882d7dc..d217e4a08 100644
    --- a/polymorphism/PolyConstructors.java
    +++ b/polymorphism/PolyConstructors.java
    @@ -1,5 +1,5 @@
     // polymorphism/PolyConstructors.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Constructors and polymorphism
    diff --git a/polymorphism/PrivateOverride.java b/polymorphism/PrivateOverride.java
    index 182943044..cd6f895e6 100644
    --- a/polymorphism/PrivateOverride.java
    +++ b/polymorphism/PrivateOverride.java
    @@ -1,5 +1,5 @@
     // polymorphism/PrivateOverride.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Trying to override a private method
    diff --git a/polymorphism/PrivateOverride2.java b/polymorphism/PrivateOverride2.java
    index 341b02069..df695d55f 100644
    --- a/polymorphism/PrivateOverride2.java
    +++ b/polymorphism/PrivateOverride2.java
    @@ -1,5 +1,5 @@
     // polymorphism/PrivateOverride2.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Detecting a mistaken override using @Override
    diff --git a/polymorphism/RTTI.java b/polymorphism/RTTI.java
    index 5e1e0de73..c7ed65f54 100644
    --- a/polymorphism/RTTI.java
    +++ b/polymorphism/RTTI.java
    @@ -1,5 +1,5 @@
     // polymorphism/RTTI.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Downcasting & Runtime type information (RTTI)
    diff --git a/polymorphism/ReferenceCounting.java b/polymorphism/ReferenceCounting.java
    index 877138488..e594f79f7 100644
    --- a/polymorphism/ReferenceCounting.java
    +++ b/polymorphism/ReferenceCounting.java
    @@ -1,5 +1,5 @@
     // polymorphism/ReferenceCounting.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Cleaning up shared member objects
    diff --git a/polymorphism/Sandwich.java b/polymorphism/Sandwich.java
    index a88ef789f..a13a61929 100644
    --- a/polymorphism/Sandwich.java
    +++ b/polymorphism/Sandwich.java
    @@ -1,5 +1,5 @@
     // polymorphism/Sandwich.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Order of constructor calls
    diff --git a/polymorphism/Shapes.java b/polymorphism/Shapes.java
    index 5c6eea93b..42e13f112 100644
    --- a/polymorphism/Shapes.java
    +++ b/polymorphism/Shapes.java
    @@ -1,5 +1,5 @@
     // polymorphism/Shapes.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Polymorphism in Java
    diff --git a/polymorphism/StaticPolymorphism.java b/polymorphism/StaticPolymorphism.java
    index f45bb15cb..40e4f794d 100644
    --- a/polymorphism/StaticPolymorphism.java
    +++ b/polymorphism/StaticPolymorphism.java
    @@ -1,5 +1,5 @@
     // polymorphism/StaticPolymorphism.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Static methods are not polymorphic
    diff --git a/polymorphism/Transmogrify.java b/polymorphism/Transmogrify.java
    index 94e0ec36a..dd45b9bd4 100644
    --- a/polymorphism/Transmogrify.java
    +++ b/polymorphism/Transmogrify.java
    @@ -1,5 +1,5 @@
     // polymorphism/Transmogrify.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Dynamically changing the behavior of an object
    diff --git a/polymorphism/music/Instrument.java b/polymorphism/music/Instrument.java
    index 245d97495..959c2dd3d 100644
    --- a/polymorphism/music/Instrument.java
    +++ b/polymorphism/music/Instrument.java
    @@ -1,5 +1,5 @@
     // polymorphism/music/Instrument.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package polymorphism.music;
    diff --git a/polymorphism/music/Music.java b/polymorphism/music/Music.java
    index e5e7696eb..2338543b2 100644
    --- a/polymorphism/music/Music.java
    +++ b/polymorphism/music/Music.java
    @@ -1,5 +1,5 @@
     // polymorphism/music/Music.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Inheritance & upcasting
    diff --git a/polymorphism/music/Music2.java b/polymorphism/music/Music2.java
    index 872586fcf..e16eb1799 100644
    --- a/polymorphism/music/Music2.java
    +++ b/polymorphism/music/Music2.java
    @@ -1,5 +1,5 @@
     // polymorphism/music/Music2.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Overloading instead of upcasting
    diff --git a/polymorphism/music/Note.java b/polymorphism/music/Note.java
    index 70b9de608..34f55bd8e 100644
    --- a/polymorphism/music/Note.java
    +++ b/polymorphism/music/Note.java
    @@ -1,5 +1,5 @@
     // polymorphism/music/Note.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Notes to play on musical instruments
    diff --git a/polymorphism/music/Wind.java b/polymorphism/music/Wind.java
    index ffc5b5ba1..fcec34ae4 100644
    --- a/polymorphism/music/Wind.java
    +++ b/polymorphism/music/Wind.java
    @@ -1,5 +1,5 @@
     // polymorphism/music/Wind.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package polymorphism.music;
    diff --git a/polymorphism/music3/Music3.java b/polymorphism/music3/Music3.java
    index 3994393d6..4c7c70f84 100644
    --- a/polymorphism/music3/Music3.java
    +++ b/polymorphism/music3/Music3.java
    @@ -1,5 +1,5 @@
     // polymorphism/music3/Music3.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // An extensible program
    diff --git a/polymorphism/shape/Circle.java b/polymorphism/shape/Circle.java
    index ff870ffc8..305d0411b 100644
    --- a/polymorphism/shape/Circle.java
    +++ b/polymorphism/shape/Circle.java
    @@ -1,5 +1,5 @@
     // polymorphism/shape/Circle.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package polymorphism.shape;
    diff --git a/polymorphism/shape/RandomShapes.java b/polymorphism/shape/RandomShapes.java
    index 55b26c11a..3a5fa9063 100644
    --- a/polymorphism/shape/RandomShapes.java
    +++ b/polymorphism/shape/RandomShapes.java
    @@ -1,5 +1,5 @@
     // polymorphism/shape/RandomShapes.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // A "factory" that randomly creates shapes
    diff --git a/polymorphism/shape/Shape.java b/polymorphism/shape/Shape.java
    index c8b25852f..3d42f1218 100644
    --- a/polymorphism/shape/Shape.java
    +++ b/polymorphism/shape/Shape.java
    @@ -1,5 +1,5 @@
     // polymorphism/shape/Shape.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package polymorphism.shape;
    diff --git a/polymorphism/shape/Square.java b/polymorphism/shape/Square.java
    index 22bb25680..c04d68320 100644
    --- a/polymorphism/shape/Square.java
    +++ b/polymorphism/shape/Square.java
    @@ -1,5 +1,5 @@
     // polymorphism/shape/Square.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package polymorphism.shape;
    diff --git a/polymorphism/shape/Triangle.java b/polymorphism/shape/Triangle.java
    index 2f18de719..7bc9a961a 100644
    --- a/polymorphism/shape/Triangle.java
    +++ b/polymorphism/shape/Triangle.java
    @@ -1,5 +1,5 @@
     // polymorphism/shape/Triangle.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package polymorphism.shape;
    diff --git a/preferences/PreferencesDemo.java b/preferences/PreferencesDemo.java
    index ef10a6af5..e6d40260c 100644
    --- a/preferences/PreferencesDemo.java
    +++ b/preferences/PreferencesDemo.java
    @@ -1,5 +1,5 @@
     // preferences/PreferencesDemo.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.prefs.*;
    diff --git a/references/AddingClone.java b/references/AddingClone.java
    index 42f5880a2..f0fab39df 100644
    --- a/references/AddingClone.java
    +++ b/references/AddingClone.java
    @@ -1,5 +1,5 @@
     // references/AddingClone.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // You must go through a few gyrations
    diff --git a/references/Alias1.java b/references/Alias1.java
    index 02051d3f7..a40966355 100644
    --- a/references/Alias1.java
    +++ b/references/Alias1.java
    @@ -1,5 +1,5 @@
     // references/Alias1.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Aliasing two references to one object
    diff --git a/references/Alias2.java b/references/Alias2.java
    index 1e8538596..928d9c7bf 100644
    --- a/references/Alias2.java
    +++ b/references/Alias2.java
    @@ -1,5 +1,5 @@
     // references/Alias2.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Method calls implicitly alias their arguments
    diff --git a/references/CheckCloneable.java b/references/CheckCloneable.java
    index 83fc0e5ab..b9e7eb078 100644
    --- a/references/CheckCloneable.java
    +++ b/references/CheckCloneable.java
    @@ -1,5 +1,5 @@
     // references/CheckCloneable.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Check to see if a reference can be cloned
    diff --git a/references/CloneArrayList.java b/references/CloneArrayList.java
    index d9e1bdbf4..9dbe7f4cd 100644
    --- a/references/CloneArrayList.java
    +++ b/references/CloneArrayList.java
    @@ -1,5 +1,5 @@
     // references/CloneArrayList.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // The clone() operation works for only a few
    diff --git a/references/Compete.java b/references/Compete.java
    index 5ec06bcd1..0b0d77f40 100644
    --- a/references/Compete.java
    +++ b/references/Compete.java
    @@ -1,5 +1,5 @@
     // references/Compete.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.io.*;
    diff --git a/references/CopyConstructor.java b/references/CopyConstructor.java
    index 4c100559a..f65287380 100644
    --- a/references/CopyConstructor.java
    +++ b/references/CopyConstructor.java
    @@ -1,5 +1,5 @@
     // references/CopyConstructor.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // A constructor to copy an object of the same
    diff --git a/references/DepthReading.java b/references/DepthReading.java
    index 7bebef12f..d9f3f1ae6 100644
    --- a/references/DepthReading.java
    +++ b/references/DepthReading.java
    @@ -1,5 +1,5 @@
     // references/DepthReading.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Cloning a composed object
    diff --git a/references/HorrorFlick.java b/references/HorrorFlick.java
    index a10cc162b..8c47f721f 100644
    --- a/references/HorrorFlick.java
    +++ b/references/HorrorFlick.java
    @@ -1,5 +1,5 @@
     // references/HorrorFlick.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // You can insert Cloneability at any level of inheritance
    diff --git a/references/Immutable1.java b/references/Immutable1.java
    index 00d7640fb..c4f538916 100644
    --- a/references/Immutable1.java
    +++ b/references/Immutable1.java
    @@ -1,5 +1,5 @@
     // references/Immutable1.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Immutable objects are immune to aliasing
    diff --git a/references/Immutable2.java b/references/Immutable2.java
    index 8a6ed177f..9275a537b 100644
    --- a/references/Immutable2.java
    +++ b/references/Immutable2.java
    @@ -1,5 +1,5 @@
     // references/Immutable2.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // A companion class to modify immutable objects
    diff --git a/references/ImmutableInteger.java b/references/ImmutableInteger.java
    index ab475a8b2..06243267f 100644
    --- a/references/ImmutableInteger.java
    +++ b/references/ImmutableInteger.java
    @@ -1,5 +1,5 @@
     // references/ImmutableInteger.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // The Integer class cannot be changed
    diff --git a/references/ImmutableStrings.java b/references/ImmutableStrings.java
    index 7872b9ab4..538ab6efc 100644
    --- a/references/ImmutableStrings.java
    +++ b/references/ImmutableStrings.java
    @@ -1,5 +1,5 @@
     // references/ImmutableStrings.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Demonstrating StringBuilder
    diff --git a/references/MutableInteger.java b/references/MutableInteger.java
    index fc7667d66..8958af5e3 100644
    --- a/references/MutableInteger.java
    +++ b/references/MutableInteger.java
    @@ -1,5 +1,5 @@
     // references/MutableInteger.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // A changeable wrapper class
    diff --git a/references/OceanReading.java b/references/OceanReading.java
    index 8ccfae7c4..b8466fa04 100644
    --- a/references/OceanReading.java
    +++ b/references/OceanReading.java
    @@ -1,5 +1,5 @@
     // references/OceanReading.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Cloning a composed object
    diff --git a/references/PassReferences.java b/references/PassReferences.java
    index 6dbbe2bef..d42f4a21e 100644
    --- a/references/PassReferences.java
    +++ b/references/PassReferences.java
    @@ -1,5 +1,5 @@
     // references/PassReferences.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
    diff --git a/references/SimplerMutableInteger.java b/references/SimplerMutableInteger.java
    index 1f5f743d3..3db01005f 100644
    --- a/references/SimplerMutableInteger.java
    +++ b/references/SimplerMutableInteger.java
    @@ -1,5 +1,5 @@
     // references/SimplerMutableInteger.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // A trivial wrapper class
    diff --git a/references/Snake.java b/references/Snake.java
    index 62a7d93bd..199d1d8f3 100644
    --- a/references/Snake.java
    +++ b/references/Snake.java
    @@ -1,5 +1,5 @@
     // references/Snake.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Tests cloning to see if reference
    diff --git a/references/Stringer.java b/references/Stringer.java
    index 819c578e1..89ceff1e6 100644
    --- a/references/Stringer.java
    +++ b/references/Stringer.java
    @@ -1,5 +1,5 @@
     // references/Stringer.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
    diff --git a/references/TemperatureReading.java b/references/TemperatureReading.java
    index ff9004f1c..8ca47e90f 100644
    --- a/references/TemperatureReading.java
    +++ b/references/TemperatureReading.java
    @@ -1,5 +1,5 @@
     // references/TemperatureReading.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Cloning a composed object
    diff --git a/references/tests/DeepCopyTest.java b/references/tests/DeepCopyTest.java
    index 9cf4729b6..977376520 100644
    --- a/references/tests/DeepCopyTest.java
    +++ b/references/tests/DeepCopyTest.java
    @@ -1,5 +1,5 @@
     // references/tests/DeepCopyTest.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package references;
    diff --git a/remote/DisplayPerfectTime.java b/remote/DisplayPerfectTime.java
    index 6ad055e6d..333b3bce7 100644
    --- a/remote/DisplayPerfectTime.java
    +++ b/remote/DisplayPerfectTime.java
    @@ -1,5 +1,5 @@
     // remote/DisplayPerfectTime.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Uses remote object PerfectTime
    diff --git a/remote/PerfectTime.java b/remote/PerfectTime.java
    index 21daf2f18..73c9c67b4 100644
    --- a/remote/PerfectTime.java
    +++ b/remote/PerfectTime.java
    @@ -1,5 +1,5 @@
     // remote/PerfectTime.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // The PerfectTime remote interface
    diff --git a/remote/PerfectTimeImpl.java b/remote/PerfectTimeImpl.java
    index d2cc66165..a1a913025 100644
    --- a/remote/PerfectTimeImpl.java
    +++ b/remote/PerfectTimeImpl.java
    @@ -1,5 +1,5 @@
     // remote/PerfectTimeImpl.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Implementing the PerfectTime remote object
    diff --git a/remote/PerfectTimeServer.java b/remote/PerfectTimeServer.java
    index 39e76e59c..b466b04e6 100644
    --- a/remote/PerfectTimeServer.java
    +++ b/remote/PerfectTimeServer.java
    @@ -1,5 +1,5 @@
     // remote/PerfectTimeServer.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Server for the PerfectTime remote object
    diff --git a/reuse/Bath.java b/reuse/Bath.java
    index 5f091d530..31a70e8b9 100644
    --- a/reuse/Bath.java
    +++ b/reuse/Bath.java
    @@ -1,5 +1,5 @@
     // reuse/Bath.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Constructor initialization with composition
    diff --git a/reuse/Beetle.java b/reuse/Beetle.java
    index 01823c05a..c73419540 100644
    --- a/reuse/Beetle.java
    +++ b/reuse/Beetle.java
    @@ -1,5 +1,5 @@
     // reuse/Beetle.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // The full process of initialization
    diff --git a/reuse/BlankFinal.java b/reuse/BlankFinal.java
    index 3a23289b8..dc73da65a 100644
    --- a/reuse/BlankFinal.java
    +++ b/reuse/BlankFinal.java
    @@ -1,5 +1,5 @@
     // reuse/BlankFinal.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // "Blank" final fields
    diff --git a/reuse/CADSystem.java b/reuse/CADSystem.java
    index eb26f51b4..530e0de1d 100644
    --- a/reuse/CADSystem.java
    +++ b/reuse/CADSystem.java
    @@ -1,5 +1,5 @@
     // reuse/CADSystem.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Ensuring proper cleanup
    diff --git a/reuse/Car.java b/reuse/Car.java
    index 80e789c2e..4e3fe86cc 100644
    --- a/reuse/Car.java
    +++ b/reuse/Car.java
    @@ -1,5 +1,5 @@
     // reuse/Car.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Composition with public objects
    diff --git a/reuse/Cartoon.java b/reuse/Cartoon.java
    index 93b777509..51d6f4a5d 100644
    --- a/reuse/Cartoon.java
    +++ b/reuse/Cartoon.java
    @@ -1,5 +1,5 @@
     // reuse/Cartoon.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Constructor calls during inheritance
    diff --git a/reuse/Chess.java b/reuse/Chess.java
    index 76d2917f3..55a1cc9c9 100644
    --- a/reuse/Chess.java
    +++ b/reuse/Chess.java
    @@ -1,5 +1,5 @@
     // reuse/Chess.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Inheritance, constructors and arguments
    diff --git a/reuse/DerivedSpaceShip.java b/reuse/DerivedSpaceShip.java
    index 54f17172c..548958f26 100644
    --- a/reuse/DerivedSpaceShip.java
    +++ b/reuse/DerivedSpaceShip.java
    @@ -1,5 +1,5 @@
     // reuse/DerivedSpaceShip.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
    diff --git a/reuse/Detergent.java b/reuse/Detergent.java
    index f9cc5efea..c8edb4fe9 100644
    --- a/reuse/Detergent.java
    +++ b/reuse/Detergent.java
    @@ -1,5 +1,5 @@
     // reuse/Detergent.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Inheritance syntax & properties
    diff --git a/reuse/FinalArguments.java b/reuse/FinalArguments.java
    index d36bf1155..9942a2104 100644
    --- a/reuse/FinalArguments.java
    +++ b/reuse/FinalArguments.java
    @@ -1,5 +1,5 @@
     // reuse/FinalArguments.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Using "final" with method arguments
    diff --git a/reuse/FinalData.java b/reuse/FinalData.java
    index 04b9b8aa0..0ee781ff3 100644
    --- a/reuse/FinalData.java
    +++ b/reuse/FinalData.java
    @@ -1,5 +1,5 @@
     // reuse/FinalData.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // The effect of final on fields
    diff --git a/reuse/FinalOverridingIllusion.java b/reuse/FinalOverridingIllusion.java
    index 2f8de2fec..1b475194a 100644
    --- a/reuse/FinalOverridingIllusion.java
    +++ b/reuse/FinalOverridingIllusion.java
    @@ -1,5 +1,5 @@
     // reuse/FinalOverridingIllusion.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // It only looks like you can override
    diff --git a/reuse/Hide.java b/reuse/Hide.java
    index c6726bd15..882da64d9 100644
    --- a/reuse/Hide.java
    +++ b/reuse/Hide.java
    @@ -1,5 +1,5 @@
     // reuse/Hide.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Overloading a base-class method name in a derived
    diff --git a/reuse/Jurassic.java b/reuse/Jurassic.java
    index eec987aed..af63bea9a 100644
    --- a/reuse/Jurassic.java
    +++ b/reuse/Jurassic.java
    @@ -1,5 +1,5 @@
     // reuse/Jurassic.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Making an entire class final
    diff --git a/reuse/Lisa.java b/reuse/Lisa.java
    index bed8edcdf..bc0df2071 100644
    --- a/reuse/Lisa.java
    +++ b/reuse/Lisa.java
    @@ -1,5 +1,5 @@
     // reuse/Lisa.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // {CompileTimeError} (Will not compile)
    diff --git a/reuse/Orc.java b/reuse/Orc.java
    index 2155f439e..dc70d3cf1 100644
    --- a/reuse/Orc.java
    +++ b/reuse/Orc.java
    @@ -1,5 +1,5 @@
     // reuse/Orc.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // The protected keyword
    diff --git a/reuse/PlaceSetting.java b/reuse/PlaceSetting.java
    index 22b28622b..5723a1100 100644
    --- a/reuse/PlaceSetting.java
    +++ b/reuse/PlaceSetting.java
    @@ -1,5 +1,5 @@
     // reuse/PlaceSetting.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Combining composition & inheritance
    diff --git a/reuse/SpaceShipControls.java b/reuse/SpaceShipControls.java
    index b75d4fccc..2272713d8 100644
    --- a/reuse/SpaceShipControls.java
    +++ b/reuse/SpaceShipControls.java
    @@ -1,5 +1,5 @@
     // reuse/SpaceShipControls.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
    diff --git a/reuse/SpaceShipDelegation.java b/reuse/SpaceShipDelegation.java
    index 28ed44174..9046a4a48 100644
    --- a/reuse/SpaceShipDelegation.java
    +++ b/reuse/SpaceShipDelegation.java
    @@ -1,5 +1,5 @@
     // reuse/SpaceShipDelegation.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
    diff --git a/reuse/SprinklerSystem.java b/reuse/SprinklerSystem.java
    index 4931e593f..77a175184 100644
    --- a/reuse/SprinklerSystem.java
    +++ b/reuse/SprinklerSystem.java
    @@ -1,5 +1,5 @@
     // reuse/SprinklerSystem.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Composition for code reuse
    diff --git a/reuse/Wind.java b/reuse/Wind.java
    index b43e66c6e..46fc3e948 100644
    --- a/reuse/Wind.java
    +++ b/reuse/Wind.java
    @@ -1,5 +1,5 @@
     // reuse/Wind.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Inheritance & upcasting
    diff --git a/serialization/APerson.java b/serialization/APerson.java
    index 0e7e0d700..7faabd0d7 100644
    --- a/serialization/APerson.java
    +++ b/serialization/APerson.java
    @@ -1,5 +1,5 @@
     // serialization/APerson.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Use the XOM library to write and read XML
    diff --git a/serialization/AStoreCADState.java b/serialization/AStoreCADState.java
    index 727a4bd86..ef903780a 100644
    --- a/serialization/AStoreCADState.java
    +++ b/serialization/AStoreCADState.java
    @@ -1,5 +1,5 @@
     // serialization/AStoreCADState.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Saving the state of a fictitious CAD system
    diff --git a/serialization/Alien.java b/serialization/Alien.java
    index 625c24760..b7db23f2e 100644
    --- a/serialization/Alien.java
    +++ b/serialization/Alien.java
    @@ -1,5 +1,5 @@
     // serialization/Alien.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // A serializable class
    diff --git a/serialization/Blip3.java b/serialization/Blip3.java
    index 69722e787..41b0e9ed2 100644
    --- a/serialization/Blip3.java
    +++ b/serialization/Blip3.java
    @@ -1,5 +1,5 @@
     // serialization/Blip3.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Reconstructing an externalizable object
    diff --git a/serialization/Blips.java b/serialization/Blips.java
    index a51922ab8..8a9f17a00 100644
    --- a/serialization/Blips.java
    +++ b/serialization/Blips.java
    @@ -1,5 +1,5 @@
     // serialization/Blips.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Simple use of Externalizable & a pitfall
    diff --git a/serialization/FreezeAlien.java b/serialization/FreezeAlien.java
    index 549e7fa3d..701b6987f 100644
    --- a/serialization/FreezeAlien.java
    +++ b/serialization/FreezeAlien.java
    @@ -1,5 +1,5 @@
     // serialization/FreezeAlien.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Create a serialized output file
    diff --git a/serialization/Logon.java b/serialization/Logon.java
    index b53484243..237f4af23 100644
    --- a/serialization/Logon.java
    +++ b/serialization/Logon.java
    @@ -1,5 +1,5 @@
     // serialization/Logon.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Demonstrates the "transient" keyword
    diff --git a/serialization/MyWorld.java b/serialization/MyWorld.java
    index 5035236d0..8aafa5d3f 100644
    --- a/serialization/MyWorld.java
    +++ b/serialization/MyWorld.java
    @@ -1,5 +1,5 @@
     // serialization/MyWorld.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.io.*;
    diff --git a/serialization/People.java b/serialization/People.java
    index 0ee1b12ac..f16a19907 100644
    --- a/serialization/People.java
    +++ b/serialization/People.java
    @@ -1,5 +1,5 @@
     // serialization/People.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // You must install nu.xom.Node from http://www.xom.nu
    diff --git a/serialization/RecoverCADState.java b/serialization/RecoverCADState.java
    index a2ff48b78..3ed44b47d 100644
    --- a/serialization/RecoverCADState.java
    +++ b/serialization/RecoverCADState.java
    @@ -1,5 +1,5 @@
     // serialization/RecoverCADState.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Restoring the state of the fictitious CAD system
    diff --git a/serialization/SerialCtl.java b/serialization/SerialCtl.java
    index ac64843f6..929ce2a8c 100644
    --- a/serialization/SerialCtl.java
    +++ b/serialization/SerialCtl.java
    @@ -1,5 +1,5 @@
     // serialization/SerialCtl.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Controlling serialization by adding your own
    diff --git a/serialization/Worm.java b/serialization/Worm.java
    index 6497c6dc6..740f05580 100644
    --- a/serialization/Worm.java
    +++ b/serialization/Worm.java
    @@ -1,5 +1,5 @@
     // serialization/Worm.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Demonstrates object serialization
    diff --git a/serialization/xfiles/ThawAlien.java b/serialization/xfiles/ThawAlien.java
    index 6f2eefaf7..d60d6f375 100644
    --- a/serialization/xfiles/ThawAlien.java
    +++ b/serialization/xfiles/ThawAlien.java
    @@ -1,5 +1,5 @@
     // serialization/xfiles/ThawAlien.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Recover a serialized file
    diff --git a/standardio/ChangeSystemOut.java b/standardio/ChangeSystemOut.java
    index 55bad6dfd..745477927 100644
    --- a/standardio/ChangeSystemOut.java
    +++ b/standardio/ChangeSystemOut.java
    @@ -1,5 +1,5 @@
     // standardio/ChangeSystemOut.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Turn System.out into a PrintWriter
    diff --git a/standardio/Echo.java b/standardio/Echo.java
    index 6b1313c99..b772cd73b 100644
    --- a/standardio/Echo.java
    +++ b/standardio/Echo.java
    @@ -1,5 +1,5 @@
     // standardio/Echo.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // How to read from standard input
    diff --git a/standardio/OSExecuteDemo.java b/standardio/OSExecuteDemo.java
    index bd30e26b4..57ec2468a 100644
    --- a/standardio/OSExecuteDemo.java
    +++ b/standardio/OSExecuteDemo.java
    @@ -1,5 +1,5 @@
     // standardio/OSExecuteDemo.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Demonstrates standard I/O redirection
    diff --git a/standardio/Redirecting.java b/standardio/Redirecting.java
    index f43c901cf..eac91ccd2 100644
    --- a/standardio/Redirecting.java
    +++ b/standardio/Redirecting.java
    @@ -1,5 +1,5 @@
     // standardio/Redirecting.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Demonstrates standard I/O redirection
    diff --git a/staticchecking/DogsAndRobots.cpp b/staticchecking/DogsAndRobots.cpp
    index 7057e7a66..b4f2a1f12 100644
    --- a/staticchecking/DogsAndRobots.cpp
    +++ b/staticchecking/DogsAndRobots.cpp
    @@ -1,5 +1,5 @@
     // staticchecking/DogsAndRobots.cpp
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     #include 
    diff --git a/staticchecking/DogsAndRobots.py b/staticchecking/DogsAndRobots.py
    index 3102adf27..6327222cb 100644
    --- a/staticchecking/DogsAndRobots.py
    +++ b/staticchecking/DogsAndRobots.py
    @@ -1,5 +1,5 @@
     # staticchecking/DogsAndRobots.py
    -# (c)2016 MindView LLC: see Copyright.txt
    +# (c)2017 MindView LLC: see Copyright.txt
     # We make no guarantees that this code is fit for any purpose.
     # Visit http://OnJava8.com for more book information.
     
    diff --git a/staticchecking/NoBasePetSpeak.py b/staticchecking/NoBasePetSpeak.py
    index 5843fa0b2..e148614d6 100644
    --- a/staticchecking/NoBasePetSpeak.py
    +++ b/staticchecking/NoBasePetSpeak.py
    @@ -1,5 +1,5 @@
     # staticchecking/NoBasePetSpeak.py
    -# (c)2016 MindView LLC: see Copyright.txt
    +# (c)2017 MindView LLC: see Copyright.txt
     # We make no guarantees that this code is fit for any purpose.
     # Visit http://OnJava8.com for more book information.
     # Speaking pets without base classes
    diff --git a/staticchecking/PetSpeak.py b/staticchecking/PetSpeak.py
    index eb42c4ad3..57a05bd6b 100644
    --- a/staticchecking/PetSpeak.py
    +++ b/staticchecking/PetSpeak.py
    @@ -1,5 +1,5 @@
     # staticchecking/PetSpeak.py
    -# (c)2016 MindView LLC: see Copyright.txt
    +# (c)2017 MindView LLC: see Copyright.txt
     # We make no guarantees that this code is fit for any purpose.
     # Visit http://OnJava8.com for more book information.
     # Speaking pets in Python
    diff --git a/staticchecking/dogsandrobots.go b/staticchecking/dogsandrobots.go
    index db682b40b..a352865e4 100644
    --- a/staticchecking/dogsandrobots.go
    +++ b/staticchecking/dogsandrobots.go
    @@ -1,5 +1,5 @@
     // staticchecking/dogsandrobots.go
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package main
    diff --git a/staticchecking/dr/DogsAndRobots.java b/staticchecking/dr/DogsAndRobots.java
    index 606a4f24f..c5afa6f98 100644
    --- a/staticchecking/dr/DogsAndRobots.java
    +++ b/staticchecking/dr/DogsAndRobots.java
    @@ -1,5 +1,5 @@
     // staticchecking/dr/DogsAndRobots.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // {java staticchecking.dr.DogsAndRobots}
    diff --git a/staticchecking/drc/DogAndRobotCollections.java b/staticchecking/drc/DogAndRobotCollections.java
    index a0628a833..bf48ee023 100644
    --- a/staticchecking/drc/DogAndRobotCollections.java
    +++ b/staticchecking/drc/DogAndRobotCollections.java
    @@ -1,5 +1,5 @@
     // staticchecking/drc/DogAndRobotCollections.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // {java staticchecking.drc.DogAndRobotCollections}
    diff --git a/staticchecking/latent/Latent.java b/staticchecking/latent/Latent.java
    index d576b4755..f8766f41b 100644
    --- a/staticchecking/latent/Latent.java
    +++ b/staticchecking/latent/Latent.java
    @@ -1,5 +1,5 @@
     // staticchecking/latent/Latent.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // {java staticchecking.latent.Latent}
    diff --git a/staticchecking/petspeak.go b/staticchecking/petspeak.go
    index e0c3bfdf6..308e0c1f9 100644
    --- a/staticchecking/petspeak.go
    +++ b/staticchecking/petspeak.go
    @@ -1,5 +1,5 @@
     // staticchecking/petspeak.go
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package main
    diff --git a/staticchecking/petspeak/PetSpeak.java b/staticchecking/petspeak/PetSpeak.java
    index b0b534acf..6b1014976 100644
    --- a/staticchecking/petspeak/PetSpeak.java
    +++ b/staticchecking/petspeak/PetSpeak.java
    @@ -1,5 +1,5 @@
     // staticchecking/petspeak/PetSpeak.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Speaking pets in Java
    diff --git a/streams/ArrayStreams.java b/streams/ArrayStreams.java
    index d0a13fd01..48f8f8856 100644
    --- a/streams/ArrayStreams.java
    +++ b/streams/ArrayStreams.java
    @@ -1,5 +1,5 @@
     // streams/ArrayStreams.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    diff --git a/streams/Bubble.java b/streams/Bubble.java
    index d2704dc43..c07afa588 100644
    --- a/streams/Bubble.java
    +++ b/streams/Bubble.java
    @@ -1,5 +1,5 @@
     // streams/Bubble.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.function.*;
    diff --git a/streams/Bubbles.java b/streams/Bubbles.java
    index a9f2a4d61..66177f024 100644
    --- a/streams/Bubbles.java
    +++ b/streams/Bubbles.java
    @@ -1,5 +1,5 @@
     // streams/Bubbles.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.stream.*;
    diff --git a/streams/CollectionToStream.java b/streams/CollectionToStream.java
    index 860bd3a5a..12efabe39 100644
    --- a/streams/CollectionToStream.java
    +++ b/streams/CollectionToStream.java
    @@ -1,5 +1,5 @@
     // streams/CollectionToStream.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    diff --git a/streams/CreatingOptionals.java b/streams/CreatingOptionals.java
    index e53f16c1c..fd3f64548 100644
    --- a/streams/CreatingOptionals.java
    +++ b/streams/CreatingOptionals.java
    @@ -1,5 +1,5 @@
     // streams/CreatingOptionals.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    diff --git a/streams/Duplicator.java b/streams/Duplicator.java
    index 1ce705a1a..78a83e2a7 100644
    --- a/streams/Duplicator.java
    +++ b/streams/Duplicator.java
    @@ -1,5 +1,5 @@
     // streams/Duplicator.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.stream.*;
    diff --git a/streams/Fibonacci.java b/streams/Fibonacci.java
    index 45a323777..3c76ca68d 100644
    --- a/streams/Fibonacci.java
    +++ b/streams/Fibonacci.java
    @@ -1,5 +1,5 @@
     // streams/Fibonacci.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.stream.*;
    diff --git a/streams/FileToWords.java b/streams/FileToWords.java
    index c78b27fe1..3fc61ca5f 100644
    --- a/streams/FileToWords.java
    +++ b/streams/FileToWords.java
    @@ -1,5 +1,5 @@
     // streams/FileToWords.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.nio.file.*;
    diff --git a/streams/FileToWordsBuilder.java b/streams/FileToWordsBuilder.java
    index 340cf998f..d51c86630 100644
    --- a/streams/FileToWordsBuilder.java
    +++ b/streams/FileToWordsBuilder.java
    @@ -1,5 +1,5 @@
     // streams/FileToWordsBuilder.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.io.*;
    diff --git a/streams/FileToWordsRegexp.java b/streams/FileToWordsRegexp.java
    index d7b3b6801..55a2cb654 100644
    --- a/streams/FileToWordsRegexp.java
    +++ b/streams/FileToWordsRegexp.java
    @@ -1,5 +1,5 @@
     // streams/FileToWordsRegexp.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.io.*;
    diff --git a/streams/FileToWordsTest.java b/streams/FileToWordsTest.java
    index 1ca687248..b94c39fd4 100644
    --- a/streams/FileToWordsTest.java
    +++ b/streams/FileToWordsTest.java
    @@ -1,5 +1,5 @@
     // streams/FileToWordsTest.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.stream.*;
    diff --git a/streams/FlatMap.java b/streams/FlatMap.java
    index 23f65215c..50ed7ed9a 100644
    --- a/streams/FlatMap.java
    +++ b/streams/FlatMap.java
    @@ -1,5 +1,5 @@
     // streams/FlatMap.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.stream.*;
    diff --git a/streams/ForEach.java b/streams/ForEach.java
    index 64364fe06..6258b8e72 100644
    --- a/streams/ForEach.java
    +++ b/streams/ForEach.java
    @@ -1,5 +1,5 @@
     // streams/ForEach.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    diff --git a/streams/FunctionMap.java b/streams/FunctionMap.java
    index 8415c6249..7176b2e3b 100644
    --- a/streams/FunctionMap.java
    +++ b/streams/FunctionMap.java
    @@ -1,5 +1,5 @@
     // streams/FunctionMap.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    diff --git a/streams/FunctionMap2.java b/streams/FunctionMap2.java
    index a110e29e1..809cb4702 100644
    --- a/streams/FunctionMap2.java
    +++ b/streams/FunctionMap2.java
    @@ -1,5 +1,5 @@
     // streams/FunctionMap2.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Different input and output types
    diff --git a/streams/FunctionMap3.java b/streams/FunctionMap3.java
    index a645160d9..ebb9e3b0e 100644
    --- a/streams/FunctionMap3.java
    +++ b/streams/FunctionMap3.java
    @@ -1,5 +1,5 @@
     // streams/FunctionMap3.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Producing numeric output streams
    diff --git a/streams/Generator.java b/streams/Generator.java
    index aeecffef2..dc3ac1762 100644
    --- a/streams/Generator.java
    +++ b/streams/Generator.java
    @@ -1,5 +1,5 @@
     // streams/Generator.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    diff --git a/streams/ImperativeRandoms.java b/streams/ImperativeRandoms.java
    index 76fb2d51c..9dad499a4 100644
    --- a/streams/ImperativeRandoms.java
    +++ b/streams/ImperativeRandoms.java
    @@ -1,5 +1,5 @@
     // streams/ImperativeRandoms.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    diff --git a/streams/Informational.java b/streams/Informational.java
    index 0836faaf3..421455120 100644
    --- a/streams/Informational.java
    +++ b/streams/Informational.java
    @@ -1,5 +1,5 @@
     // streams/Informational.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.stream.*;
    diff --git a/streams/LastElement.java b/streams/LastElement.java
    index 3d04317c1..d482c1efb 100644
    --- a/streams/LastElement.java
    +++ b/streams/LastElement.java
    @@ -1,5 +1,5 @@
     // streams/LastElement.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    diff --git a/streams/Looping.java b/streams/Looping.java
    index 377e79aef..75a30ef70 100644
    --- a/streams/Looping.java
    +++ b/streams/Looping.java
    @@ -1,5 +1,5 @@
     // streams/Looping.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import static onjava.Repeat.*;
    diff --git a/streams/Machine2.java b/streams/Machine2.java
    index f7856bd7a..a72369660 100644
    --- a/streams/Machine2.java
    +++ b/streams/Machine2.java
    @@ -1,5 +1,5 @@
     // streams/Machine2.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    diff --git a/streams/MapCollector.java b/streams/MapCollector.java
    index 72851dafb..21bf52941 100644
    --- a/streams/MapCollector.java
    +++ b/streams/MapCollector.java
    @@ -1,5 +1,5 @@
     // streams/MapCollector.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    diff --git a/streams/Matching.java b/streams/Matching.java
    index 08e0ea0a6..b5aff16b8 100644
    --- a/streams/Matching.java
    +++ b/streams/Matching.java
    @@ -1,5 +1,5 @@
     // streams/Matching.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Demonstrates short-circuiting of *Match() operations
    diff --git a/streams/NumericStreamInfo.java b/streams/NumericStreamInfo.java
    index 2e066f79f..592263b58 100644
    --- a/streams/NumericStreamInfo.java
    +++ b/streams/NumericStreamInfo.java
    @@ -1,5 +1,5 @@
     // streams/NumericStreamInfo.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.stream.*;
    diff --git a/streams/OptionalBasics.java b/streams/OptionalBasics.java
    index 5916bb800..24aa0dcfd 100644
    --- a/streams/OptionalBasics.java
    +++ b/streams/OptionalBasics.java
    @@ -1,5 +1,5 @@
     // streams/OptionalBasics.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    diff --git a/streams/OptionalFilter.java b/streams/OptionalFilter.java
    index 2a681bd4a..1636a9b2e 100644
    --- a/streams/OptionalFilter.java
    +++ b/streams/OptionalFilter.java
    @@ -1,5 +1,5 @@
     // streams/OptionalFilter.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    diff --git a/streams/OptionalFlatMap.java b/streams/OptionalFlatMap.java
    index 5fc4ec364..4e06156df 100644
    --- a/streams/OptionalFlatMap.java
    +++ b/streams/OptionalFlatMap.java
    @@ -1,5 +1,5 @@
     // streams/OptionalFlatMap.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    diff --git a/streams/OptionalMap.java b/streams/OptionalMap.java
    index 23bf14051..d4e02cac1 100644
    --- a/streams/OptionalMap.java
    +++ b/streams/OptionalMap.java
    @@ -1,5 +1,5 @@
     // streams/OptionalMap.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    diff --git a/streams/Optionals.java b/streams/Optionals.java
    index a54e9d3ec..18163f218 100644
    --- a/streams/Optionals.java
    +++ b/streams/Optionals.java
    @@ -1,5 +1,5 @@
     // streams/Optionals.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    diff --git a/streams/OptionalsFromEmptyStreams.java b/streams/OptionalsFromEmptyStreams.java
    index 1705450be..5a8240ac9 100644
    --- a/streams/OptionalsFromEmptyStreams.java
    +++ b/streams/OptionalsFromEmptyStreams.java
    @@ -1,5 +1,5 @@
     // streams/OptionalsFromEmptyStreams.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    diff --git a/streams/Peeking.java b/streams/Peeking.java
    index 2510d14f7..d3eea20ff 100644
    --- a/streams/Peeking.java
    +++ b/streams/Peeking.java
    @@ -1,5 +1,5 @@
     // streams/Peeking.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
    diff --git a/streams/Prime.java b/streams/Prime.java
    index aee81339a..96ebf3825 100644
    --- a/streams/Prime.java
    +++ b/streams/Prime.java
    @@ -1,5 +1,5 @@
     // streams/Prime.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.stream.*;
    diff --git a/streams/RandInts.java b/streams/RandInts.java
    index abb8b4e02..12416ecc5 100644
    --- a/streams/RandInts.java
    +++ b/streams/RandInts.java
    @@ -1,5 +1,5 @@
     // streams/RandInts.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package streams;
    diff --git a/streams/RandomGenerators.java b/streams/RandomGenerators.java
    index abebb3bad..e9d75fefa 100644
    --- a/streams/RandomGenerators.java
    +++ b/streams/RandomGenerators.java
    @@ -1,5 +1,5 @@
     // streams/RandomGenerators.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    diff --git a/streams/RandomWords.java b/streams/RandomWords.java
    index d27ce0e2d..ee3f83633 100644
    --- a/streams/RandomWords.java
    +++ b/streams/RandomWords.java
    @@ -1,5 +1,5 @@
     // streams/RandomWords.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    diff --git a/streams/Randoms.java b/streams/Randoms.java
    index 46b0b8772..bf91ae8d6 100644
    --- a/streams/Randoms.java
    +++ b/streams/Randoms.java
    @@ -1,5 +1,5 @@
     // streams/Randoms.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    diff --git a/streams/Ranges.java b/streams/Ranges.java
    index 8211d70f4..e0aec59c4 100644
    --- a/streams/Ranges.java
    +++ b/streams/Ranges.java
    @@ -1,5 +1,5 @@
     // streams/Ranges.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import static java.util.stream.IntStream.*;
    diff --git a/streams/Reduce.java b/streams/Reduce.java
    index c02ba4963..48ba59938 100644
    --- a/streams/Reduce.java
    +++ b/streams/Reduce.java
    @@ -1,5 +1,5 @@
     // streams/Reduce.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    diff --git a/streams/SelectElement.java b/streams/SelectElement.java
    index fa3df90fb..83a9f5e61 100644
    --- a/streams/SelectElement.java
    +++ b/streams/SelectElement.java
    @@ -1,5 +1,5 @@
     // streams/SelectElement.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    diff --git a/streams/Signal.java b/streams/Signal.java
    index 5d1bef7d4..cde125371 100644
    --- a/streams/Signal.java
    +++ b/streams/Signal.java
    @@ -1,5 +1,5 @@
     // streams/Signal.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    diff --git a/streams/SortedComparator.java b/streams/SortedComparator.java
    index fe432bc03..f0fad0906 100644
    --- a/streams/SortedComparator.java
    +++ b/streams/SortedComparator.java
    @@ -1,5 +1,5 @@
     // streams/SortedComparator.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    diff --git a/streams/SpecialCollector.java b/streams/SpecialCollector.java
    index bcd0d0171..af0460bc1 100644
    --- a/streams/SpecialCollector.java
    +++ b/streams/SpecialCollector.java
    @@ -1,5 +1,5 @@
     // streams/SpecialCollector.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    diff --git a/streams/StreamOf.java b/streams/StreamOf.java
    index bc8692ab6..3e897be2c 100644
    --- a/streams/StreamOf.java
    +++ b/streams/StreamOf.java
    @@ -1,5 +1,5 @@
     // streams/StreamOf.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.stream.*;
    diff --git a/streams/StreamOfOptionals.java b/streams/StreamOfOptionals.java
    index 34e48fda9..643145aab 100644
    --- a/streams/StreamOfOptionals.java
    +++ b/streams/StreamOfOptionals.java
    @@ -1,5 +1,5 @@
     // streams/StreamOfOptionals.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    diff --git a/streams/StreamOfRandoms.java b/streams/StreamOfRandoms.java
    index 54114bb99..64b79198a 100644
    --- a/streams/StreamOfRandoms.java
    +++ b/streams/StreamOfRandoms.java
    @@ -1,5 +1,5 @@
     // streams/StreamOfRandoms.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    diff --git a/streams/StreamOfStreams.java b/streams/StreamOfStreams.java
    index 885886017..daa15806e 100644
    --- a/streams/StreamOfStreams.java
    +++ b/streams/StreamOfStreams.java
    @@ -1,5 +1,5 @@
     // streams/StreamOfStreams.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.stream.*;
    diff --git a/streams/TreeSetOfWords.java b/streams/TreeSetOfWords.java
    index 1cd1860bd..05746f706 100644
    --- a/streams/TreeSetOfWords.java
    +++ b/streams/TreeSetOfWords.java
    @@ -1,5 +1,5 @@
     // streams/TreeSetOfWords.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    diff --git a/strings/ArrayListDisplay.java b/strings/ArrayListDisplay.java
    index 3dfe9e9c3..db22ca530 100644
    --- a/strings/ArrayListDisplay.java
    +++ b/strings/ArrayListDisplay.java
    @@ -1,5 +1,5 @@
     // strings/ArrayListDisplay.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    diff --git a/strings/BetterRead.java b/strings/BetterRead.java
    index 7c7ec9b1b..a6a5b2c48 100644
    --- a/strings/BetterRead.java
    +++ b/strings/BetterRead.java
    @@ -1,5 +1,5 @@
     // strings/BetterRead.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    diff --git a/strings/Concatenation.java b/strings/Concatenation.java
    index 3f5aa47f1..b6c01386b 100644
    --- a/strings/Concatenation.java
    +++ b/strings/Concatenation.java
    @@ -1,5 +1,5 @@
     // strings/Concatenation.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
    diff --git a/strings/Conversion.java b/strings/Conversion.java
    index c708b5f4e..9009d9b81 100644
    --- a/strings/Conversion.java
    +++ b/strings/Conversion.java
    @@ -1,5 +1,5 @@
     // strings/Conversion.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.math.*;
    diff --git a/strings/DatabaseException.java b/strings/DatabaseException.java
    index 3cd405ea3..73d6b665d 100644
    --- a/strings/DatabaseException.java
    +++ b/strings/DatabaseException.java
    @@ -1,5 +1,5 @@
     // strings/DatabaseException.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
    diff --git a/strings/Finding.java b/strings/Finding.java
    index 142676b1b..8acefbfc9 100644
    --- a/strings/Finding.java
    +++ b/strings/Finding.java
    @@ -1,5 +1,5 @@
     // strings/Finding.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.regex.*;
    diff --git a/strings/Groups.java b/strings/Groups.java
    index 6eda4978e..e4f212306 100644
    --- a/strings/Groups.java
    +++ b/strings/Groups.java
    @@ -1,5 +1,5 @@
     // strings/Groups.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.regex.*;
    diff --git a/strings/Immutable.java b/strings/Immutable.java
    index 5e3c48f33..5a7d2a0a1 100644
    --- a/strings/Immutable.java
    +++ b/strings/Immutable.java
    @@ -1,5 +1,5 @@
     // strings/Immutable.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
    diff --git a/strings/InfiniteRecursion.java b/strings/InfiniteRecursion.java
    index aa1b23cba..857f4a67a 100644
    --- a/strings/InfiniteRecursion.java
    +++ b/strings/InfiniteRecursion.java
    @@ -1,5 +1,5 @@
     // strings/InfiniteRecursion.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Accidental recursion
    diff --git a/strings/IntegerMatch.java b/strings/IntegerMatch.java
    index 8b966c644..635339ea6 100644
    --- a/strings/IntegerMatch.java
    +++ b/strings/IntegerMatch.java
    @@ -1,5 +1,5 @@
     // strings/IntegerMatch.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
    diff --git a/strings/JGrep.java b/strings/JGrep.java
    index bb5c3371c..2cde029e3 100644
    --- a/strings/JGrep.java
    +++ b/strings/JGrep.java
    @@ -1,5 +1,5 @@
     // strings/JGrep.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // A very simple version of the "grep" program
    diff --git a/strings/ReFlags.java b/strings/ReFlags.java
    index ad278b32e..7c7123caf 100644
    --- a/strings/ReFlags.java
    +++ b/strings/ReFlags.java
    @@ -1,5 +1,5 @@
     // strings/ReFlags.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.regex.*;
    diff --git a/strings/ReceiptBuilder.java b/strings/ReceiptBuilder.java
    index 50c3955de..bfca7a6b4 100644
    --- a/strings/ReceiptBuilder.java
    +++ b/strings/ReceiptBuilder.java
    @@ -1,5 +1,5 @@
     // strings/ReceiptBuilder.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    diff --git a/strings/Replacing.java b/strings/Replacing.java
    index b9e1e65c8..a098b90ba 100644
    --- a/strings/Replacing.java
    +++ b/strings/Replacing.java
    @@ -1,5 +1,5 @@
     // strings/Replacing.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
    diff --git a/strings/ReplacingStringTokenizer.java b/strings/ReplacingStringTokenizer.java
    index 5c389726b..0722af334 100644
    --- a/strings/ReplacingStringTokenizer.java
    +++ b/strings/ReplacingStringTokenizer.java
    @@ -1,5 +1,5 @@
     // strings/ReplacingStringTokenizer.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    diff --git a/strings/Resetting.java b/strings/Resetting.java
    index 5d921f31e..fc79a0381 100644
    --- a/strings/Resetting.java
    +++ b/strings/Resetting.java
    @@ -1,5 +1,5 @@
     // strings/Resetting.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.regex.*;
    diff --git a/strings/Rudolph.java b/strings/Rudolph.java
    index 481f44539..22504fba8 100644
    --- a/strings/Rudolph.java
    +++ b/strings/Rudolph.java
    @@ -1,5 +1,5 @@
     // strings/Rudolph.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
    diff --git a/strings/ScannerDelimiter.java b/strings/ScannerDelimiter.java
    index ab67e2d4f..7ba644c79 100644
    --- a/strings/ScannerDelimiter.java
    +++ b/strings/ScannerDelimiter.java
    @@ -1,5 +1,5 @@
     // strings/ScannerDelimiter.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    diff --git a/strings/SimpleFormat.java b/strings/SimpleFormat.java
    index cad6b84c0..0a6bafdba 100644
    --- a/strings/SimpleFormat.java
    +++ b/strings/SimpleFormat.java
    @@ -1,5 +1,5 @@
     // strings/SimpleFormat.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
    diff --git a/strings/SimpleRead.java b/strings/SimpleRead.java
    index 0dce6612a..da9320a63 100644
    --- a/strings/SimpleRead.java
    +++ b/strings/SimpleRead.java
    @@ -1,5 +1,5 @@
     // strings/SimpleRead.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.io.*;
    diff --git a/strings/SplitDemo.java b/strings/SplitDemo.java
    index 4b66950b6..3f6788ea8 100644
    --- a/strings/SplitDemo.java
    +++ b/strings/SplitDemo.java
    @@ -1,5 +1,5 @@
     // strings/SplitDemo.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.regex.*;
    diff --git a/strings/Splitting.java b/strings/Splitting.java
    index 698cdde32..ab91ea6d8 100644
    --- a/strings/Splitting.java
    +++ b/strings/Splitting.java
    @@ -1,5 +1,5 @@
     // strings/Splitting.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    diff --git a/strings/StartEnd.java b/strings/StartEnd.java
    index d2f630744..371b7d3dd 100644
    --- a/strings/StartEnd.java
    +++ b/strings/StartEnd.java
    @@ -1,5 +1,5 @@
     // strings/StartEnd.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.regex.*;
    diff --git a/strings/TestRegularExpression.java b/strings/TestRegularExpression.java
    index bdf75ac34..a7adafbc1 100644
    --- a/strings/TestRegularExpression.java
    +++ b/strings/TestRegularExpression.java
    @@ -1,5 +1,5 @@
     // strings/TestRegularExpression.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Simple regular expression demonstration
    diff --git a/strings/TheReplacements.java b/strings/TheReplacements.java
    index ecbf4e1ee..133967972 100644
    --- a/strings/TheReplacements.java
    +++ b/strings/TheReplacements.java
    @@ -1,5 +1,5 @@
     // strings/TheReplacements.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.regex.*;
    diff --git a/strings/ThreatAnalyzer.java b/strings/ThreatAnalyzer.java
    index 920f62b0e..11712f5e4 100644
    --- a/strings/ThreatAnalyzer.java
    +++ b/strings/ThreatAnalyzer.java
    @@ -1,5 +1,5 @@
     // strings/ThreatAnalyzer.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.regex.*;
    diff --git a/strings/Turtle.java b/strings/Turtle.java
    index a499a7aac..3e80ce9ce 100644
    --- a/strings/Turtle.java
    +++ b/strings/Turtle.java
    @@ -1,5 +1,5 @@
     // strings/Turtle.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.io.*;
    diff --git a/strings/UsingStringBuilder.java b/strings/UsingStringBuilder.java
    index e775be836..43cc3ff0c 100644
    --- a/strings/UsingStringBuilder.java
    +++ b/strings/UsingStringBuilder.java
    @@ -1,5 +1,5 @@
     // strings/UsingStringBuilder.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    diff --git a/strings/WhitherStringBuilder.java b/strings/WhitherStringBuilder.java
    index e3c8b9bde..59cf3952f 100644
    --- a/strings/WhitherStringBuilder.java
    +++ b/strings/WhitherStringBuilder.java
    @@ -1,5 +1,5 @@
     // strings/WhitherStringBuilder.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
    diff --git a/typeinfo/AnonymousImplementation.java b/typeinfo/AnonymousImplementation.java
    index 710499e86..5c4a2518c 100644
    --- a/typeinfo/AnonymousImplementation.java
    +++ b/typeinfo/AnonymousImplementation.java
    @@ -1,5 +1,5 @@
     // typeinfo/AnonymousImplementation.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Anonymous inner classes can't hide from reflection
    diff --git a/typeinfo/BoundedClassReferences.java b/typeinfo/BoundedClassReferences.java
    index 6b728284e..ace4a4691 100644
    --- a/typeinfo/BoundedClassReferences.java
    +++ b/typeinfo/BoundedClassReferences.java
    @@ -1,5 +1,5 @@
     // typeinfo/BoundedClassReferences.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
    diff --git a/typeinfo/ClassCasts.java b/typeinfo/ClassCasts.java
    index c7c1f1fd7..a44573d5e 100644
    --- a/typeinfo/ClassCasts.java
    +++ b/typeinfo/ClassCasts.java
    @@ -1,5 +1,5 @@
     // typeinfo/ClassCasts.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
    diff --git a/typeinfo/ClassInitialization.java b/typeinfo/ClassInitialization.java
    index f87a2222a..262649372 100644
    --- a/typeinfo/ClassInitialization.java
    +++ b/typeinfo/ClassInitialization.java
    @@ -1,5 +1,5 @@
     // typeinfo/ClassInitialization.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    diff --git a/typeinfo/DynamicSupplier.java b/typeinfo/DynamicSupplier.java
    index cab2e3e9e..86e47ddf1 100644
    --- a/typeinfo/DynamicSupplier.java
    +++ b/typeinfo/DynamicSupplier.java
    @@ -1,5 +1,5 @@
     // typeinfo/DynamicSupplier.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.function.*;
    diff --git a/typeinfo/FamilyVsExactType.java b/typeinfo/FamilyVsExactType.java
    index 64e4c0470..9fdfd25e2 100644
    --- a/typeinfo/FamilyVsExactType.java
    +++ b/typeinfo/FamilyVsExactType.java
    @@ -1,5 +1,5 @@
     // typeinfo/FamilyVsExactType.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // The difference between instanceof and class
    diff --git a/typeinfo/GenericClassReferences.java b/typeinfo/GenericClassReferences.java
    index a4c3b570a..b75f853f8 100644
    --- a/typeinfo/GenericClassReferences.java
    +++ b/typeinfo/GenericClassReferences.java
    @@ -1,5 +1,5 @@
     // typeinfo/GenericClassReferences.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
    diff --git a/typeinfo/HiddenImplementation.java b/typeinfo/HiddenImplementation.java
    index 9891843bc..385a93a3d 100644
    --- a/typeinfo/HiddenImplementation.java
    +++ b/typeinfo/HiddenImplementation.java
    @@ -1,5 +1,5 @@
     // typeinfo/HiddenImplementation.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Sneaking around package hiding
    diff --git a/typeinfo/InnerImplementation.java b/typeinfo/InnerImplementation.java
    index e9a97f878..d9b9202c2 100644
    --- a/typeinfo/InnerImplementation.java
    +++ b/typeinfo/InnerImplementation.java
    @@ -1,5 +1,5 @@
     // typeinfo/InnerImplementation.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Private inner classes can't hide from reflection
    diff --git a/typeinfo/InterfaceViolation.java b/typeinfo/InterfaceViolation.java
    index a4620f660..0adfba652 100644
    --- a/typeinfo/InterfaceViolation.java
    +++ b/typeinfo/InterfaceViolation.java
    @@ -1,5 +1,5 @@
     // typeinfo/InterfaceViolation.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Sneaking around an interface
    diff --git a/typeinfo/ModifyingPrivateFields.java b/typeinfo/ModifyingPrivateFields.java
    index 4baa28f16..00cfc838a 100644
    --- a/typeinfo/ModifyingPrivateFields.java
    +++ b/typeinfo/ModifyingPrivateFields.java
    @@ -1,5 +1,5 @@
     // typeinfo/ModifyingPrivateFields.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.lang.reflect.*;
    diff --git a/typeinfo/NullRobot.java b/typeinfo/NullRobot.java
    index d39972b1d..ae68d7b04 100644
    --- a/typeinfo/NullRobot.java
    +++ b/typeinfo/NullRobot.java
    @@ -1,5 +1,5 @@
     // typeinfo/NullRobot.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Using a dynamic proxy to create an Optional
    diff --git a/typeinfo/Operation.java b/typeinfo/Operation.java
    index 011f2b868..2393d2365 100644
    --- a/typeinfo/Operation.java
    +++ b/typeinfo/Operation.java
    @@ -1,5 +1,5 @@
     // typeinfo/Operation.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.function.*;
    diff --git a/typeinfo/Person.java b/typeinfo/Person.java
    index 356feeb69..611dcfcd1 100644
    --- a/typeinfo/Person.java
    +++ b/typeinfo/Person.java
    @@ -1,5 +1,5 @@
     // typeinfo/Person.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Using Optional with regular classes
    diff --git a/typeinfo/PetCount.java b/typeinfo/PetCount.java
    index 053b3faae..860c620bb 100644
    --- a/typeinfo/PetCount.java
    +++ b/typeinfo/PetCount.java
    @@ -1,5 +1,5 @@
     // typeinfo/PetCount.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Using instanceof
    diff --git a/typeinfo/PetCount2.java b/typeinfo/PetCount2.java
    index 073d1dab4..d24ebe982 100644
    --- a/typeinfo/PetCount2.java
    +++ b/typeinfo/PetCount2.java
    @@ -1,5 +1,5 @@
     // typeinfo/PetCount2.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import typeinfo.pets.*;
    diff --git a/typeinfo/PetCount3.java b/typeinfo/PetCount3.java
    index a7259c176..af028ccd8 100644
    --- a/typeinfo/PetCount3.java
    +++ b/typeinfo/PetCount3.java
    @@ -1,5 +1,5 @@
     // typeinfo/PetCount3.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Using isInstance()
    diff --git a/typeinfo/PetCount4.java b/typeinfo/PetCount4.java
    index 00f600b47..803f1c373 100644
    --- a/typeinfo/PetCount4.java
    +++ b/typeinfo/PetCount4.java
    @@ -1,5 +1,5 @@
     // typeinfo/PetCount4.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import typeinfo.pets.*;
    diff --git a/typeinfo/Position.java b/typeinfo/Position.java
    index 803545df7..15a1c5632 100644
    --- a/typeinfo/Position.java
    +++ b/typeinfo/Position.java
    @@ -1,5 +1,5 @@
     // typeinfo/Position.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    diff --git a/typeinfo/RegisteredFactories.java b/typeinfo/RegisteredFactories.java
    index 5ecdc3bfd..358bba1a7 100644
    --- a/typeinfo/RegisteredFactories.java
    +++ b/typeinfo/RegisteredFactories.java
    @@ -1,5 +1,5 @@
     // typeinfo/RegisteredFactories.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Registering Factories in the base class
    diff --git a/typeinfo/Robot.java b/typeinfo/Robot.java
    index ca13cc22d..f3c8d0534 100644
    --- a/typeinfo/Robot.java
    +++ b/typeinfo/Robot.java
    @@ -1,5 +1,5 @@
     // typeinfo/Robot.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import onjava.*;
    diff --git a/typeinfo/SelectingMethods.java b/typeinfo/SelectingMethods.java
    index 0d878567e..fa9061ce7 100644
    --- a/typeinfo/SelectingMethods.java
    +++ b/typeinfo/SelectingMethods.java
    @@ -1,5 +1,5 @@
     // typeinfo/SelectingMethods.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Looking for particular methods in a dynamic proxy
    diff --git a/typeinfo/Shapes.java b/typeinfo/Shapes.java
    index d6c169e65..e5f3243e6 100644
    --- a/typeinfo/Shapes.java
    +++ b/typeinfo/Shapes.java
    @@ -1,5 +1,5 @@
     // typeinfo/Shapes.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.stream.*;
    diff --git a/typeinfo/ShowMethods.java b/typeinfo/ShowMethods.java
    index ad9221209..4bc507f6c 100644
    --- a/typeinfo/ShowMethods.java
    +++ b/typeinfo/ShowMethods.java
    @@ -1,5 +1,5 @@
     // typeinfo/ShowMethods.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Using reflection to show all the methods of a class,
    diff --git a/typeinfo/SimpleDynamicProxy.java b/typeinfo/SimpleDynamicProxy.java
    index 09a014a85..361d87f9c 100644
    --- a/typeinfo/SimpleDynamicProxy.java
    +++ b/typeinfo/SimpleDynamicProxy.java
    @@ -1,5 +1,5 @@
     // typeinfo/SimpleDynamicProxy.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.lang.reflect.*;
    diff --git a/typeinfo/SimpleProxyDemo.java b/typeinfo/SimpleProxyDemo.java
    index b46f20fa0..d526f0c8a 100644
    --- a/typeinfo/SimpleProxyDemo.java
    +++ b/typeinfo/SimpleProxyDemo.java
    @@ -1,5 +1,5 @@
     // typeinfo/SimpleProxyDemo.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
    diff --git a/typeinfo/SnowRemovalRobot.java b/typeinfo/SnowRemovalRobot.java
    index 852be07b1..f1518eaeb 100644
    --- a/typeinfo/SnowRemovalRobot.java
    +++ b/typeinfo/SnowRemovalRobot.java
    @@ -1,5 +1,5 @@
     // typeinfo/SnowRemovalRobot.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    diff --git a/typeinfo/Staff.java b/typeinfo/Staff.java
    index fc064c1dc..3d07e2c78 100644
    --- a/typeinfo/Staff.java
    +++ b/typeinfo/Staff.java
    @@ -1,5 +1,5 @@
     // typeinfo/Staff.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    diff --git a/typeinfo/SweetShop.java b/typeinfo/SweetShop.java
    index e1b0fba3a..a1000ea3f 100644
    --- a/typeinfo/SweetShop.java
    +++ b/typeinfo/SweetShop.java
    @@ -1,5 +1,5 @@
     // typeinfo/SweetShop.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Examination of the way the class loader works
    diff --git a/typeinfo/WildcardClassReferences.java b/typeinfo/WildcardClassReferences.java
    index abe42d3ca..9a35b6e54 100644
    --- a/typeinfo/WildcardClassReferences.java
    +++ b/typeinfo/WildcardClassReferences.java
    @@ -1,5 +1,5 @@
     // typeinfo/WildcardClassReferences.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
    diff --git a/typeinfo/interfacea/A.java b/typeinfo/interfacea/A.java
    index 50f7a7f81..565a4a74d 100644
    --- a/typeinfo/interfacea/A.java
    +++ b/typeinfo/interfacea/A.java
    @@ -1,5 +1,5 @@
     // typeinfo/interfacea/A.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package typeinfo.interfacea;
    diff --git a/typeinfo/packageaccess/HiddenC.java b/typeinfo/packageaccess/HiddenC.java
    index 679c37d93..80938a066 100644
    --- a/typeinfo/packageaccess/HiddenC.java
    +++ b/typeinfo/packageaccess/HiddenC.java
    @@ -1,5 +1,5 @@
     // typeinfo/packageaccess/HiddenC.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package typeinfo.packageaccess;
    diff --git a/typeinfo/pets/Cat.java b/typeinfo/pets/Cat.java
    index feb9b2bd7..f1bfdc0ea 100644
    --- a/typeinfo/pets/Cat.java
    +++ b/typeinfo/pets/Cat.java
    @@ -1,5 +1,5 @@
     // typeinfo/pets/Cat.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package typeinfo.pets;
    diff --git a/typeinfo/pets/Cymric.java b/typeinfo/pets/Cymric.java
    index a60f9d902..c6f0a59ca 100644
    --- a/typeinfo/pets/Cymric.java
    +++ b/typeinfo/pets/Cymric.java
    @@ -1,5 +1,5 @@
     // typeinfo/pets/Cymric.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package typeinfo.pets;
    diff --git a/typeinfo/pets/Dog.java b/typeinfo/pets/Dog.java
    index 2610b54cb..0f1144a08 100644
    --- a/typeinfo/pets/Dog.java
    +++ b/typeinfo/pets/Dog.java
    @@ -1,5 +1,5 @@
     // typeinfo/pets/Dog.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package typeinfo.pets;
    diff --git a/typeinfo/pets/EgyptianMau.java b/typeinfo/pets/EgyptianMau.java
    index 219d9a363..243294678 100644
    --- a/typeinfo/pets/EgyptianMau.java
    +++ b/typeinfo/pets/EgyptianMau.java
    @@ -1,5 +1,5 @@
     // typeinfo/pets/EgyptianMau.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package typeinfo.pets;
    diff --git a/typeinfo/pets/ForNameCreator.java b/typeinfo/pets/ForNameCreator.java
    index cbfdbaf5b..e3bb51c77 100644
    --- a/typeinfo/pets/ForNameCreator.java
    +++ b/typeinfo/pets/ForNameCreator.java
    @@ -1,5 +1,5 @@
     // typeinfo/pets/ForNameCreator.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package typeinfo.pets;
    diff --git a/typeinfo/pets/Hamster.java b/typeinfo/pets/Hamster.java
    index 511f486f7..f2cc83799 100644
    --- a/typeinfo/pets/Hamster.java
    +++ b/typeinfo/pets/Hamster.java
    @@ -1,5 +1,5 @@
     // typeinfo/pets/Hamster.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package typeinfo.pets;
    diff --git a/typeinfo/pets/Individual.java b/typeinfo/pets/Individual.java
    index e83794dd4..fd54f7877 100644
    --- a/typeinfo/pets/Individual.java
    +++ b/typeinfo/pets/Individual.java
    @@ -1,5 +1,5 @@
     // typeinfo/pets/Individual.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package typeinfo.pets;
    diff --git a/typeinfo/pets/LiteralPetCreator.java b/typeinfo/pets/LiteralPetCreator.java
    index f94f358d9..b0ac27bde 100644
    --- a/typeinfo/pets/LiteralPetCreator.java
    +++ b/typeinfo/pets/LiteralPetCreator.java
    @@ -1,5 +1,5 @@
     // typeinfo/pets/LiteralPetCreator.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Using class literals
    diff --git a/typeinfo/pets/Manx.java b/typeinfo/pets/Manx.java
    index c68aa1fe1..b7771c7cc 100644
    --- a/typeinfo/pets/Manx.java
    +++ b/typeinfo/pets/Manx.java
    @@ -1,5 +1,5 @@
     // typeinfo/pets/Manx.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package typeinfo.pets;
    diff --git a/typeinfo/pets/Mouse.java b/typeinfo/pets/Mouse.java
    index 89971c899..6d267cdbb 100644
    --- a/typeinfo/pets/Mouse.java
    +++ b/typeinfo/pets/Mouse.java
    @@ -1,5 +1,5 @@
     // typeinfo/pets/Mouse.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package typeinfo.pets;
    diff --git a/typeinfo/pets/Mutt.java b/typeinfo/pets/Mutt.java
    index 8bce4906e..7c41712bc 100644
    --- a/typeinfo/pets/Mutt.java
    +++ b/typeinfo/pets/Mutt.java
    @@ -1,5 +1,5 @@
     // typeinfo/pets/Mutt.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package typeinfo.pets;
    diff --git a/typeinfo/pets/Person.java b/typeinfo/pets/Person.java
    index dc7f5c930..1a6532667 100644
    --- a/typeinfo/pets/Person.java
    +++ b/typeinfo/pets/Person.java
    @@ -1,5 +1,5 @@
     // typeinfo/pets/Person.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package typeinfo.pets;
    diff --git a/typeinfo/pets/Pet.java b/typeinfo/pets/Pet.java
    index 8556e450b..282418f8c 100644
    --- a/typeinfo/pets/Pet.java
    +++ b/typeinfo/pets/Pet.java
    @@ -1,5 +1,5 @@
     // typeinfo/pets/Pet.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package typeinfo.pets;
    diff --git a/typeinfo/pets/PetCreator.java b/typeinfo/pets/PetCreator.java
    index 5bf0c4339..99431c3cd 100644
    --- a/typeinfo/pets/PetCreator.java
    +++ b/typeinfo/pets/PetCreator.java
    @@ -1,5 +1,5 @@
     // typeinfo/pets/PetCreator.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Creates random sequences of Pets
    diff --git a/typeinfo/pets/Pets.java b/typeinfo/pets/Pets.java
    index c7cce4d08..f99847b16 100644
    --- a/typeinfo/pets/Pets.java
    +++ b/typeinfo/pets/Pets.java
    @@ -1,5 +1,5 @@
     // typeinfo/pets/Pets.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Facade to produce a default PetCreator
    diff --git a/typeinfo/pets/Pug.java b/typeinfo/pets/Pug.java
    index c2b46dc84..9be1d2e9a 100644
    --- a/typeinfo/pets/Pug.java
    +++ b/typeinfo/pets/Pug.java
    @@ -1,5 +1,5 @@
     // typeinfo/pets/Pug.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package typeinfo.pets;
    diff --git a/typeinfo/pets/Rat.java b/typeinfo/pets/Rat.java
    index 78dd5b283..099127e01 100644
    --- a/typeinfo/pets/Rat.java
    +++ b/typeinfo/pets/Rat.java
    @@ -1,5 +1,5 @@
     // typeinfo/pets/Rat.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package typeinfo.pets;
    diff --git a/typeinfo/pets/Rodent.java b/typeinfo/pets/Rodent.java
    index 09e389696..32483bc00 100644
    --- a/typeinfo/pets/Rodent.java
    +++ b/typeinfo/pets/Rodent.java
    @@ -1,5 +1,5 @@
     // typeinfo/pets/Rodent.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package typeinfo.pets;
    diff --git a/typeinfo/toys/GenericToyTest.java b/typeinfo/toys/GenericToyTest.java
    index 79e4d33d7..7c4f73a99 100644
    --- a/typeinfo/toys/GenericToyTest.java
    +++ b/typeinfo/toys/GenericToyTest.java
    @@ -1,5 +1,5 @@
     // typeinfo/toys/GenericToyTest.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Testing class Class
    diff --git a/typeinfo/toys/ToyTest.java b/typeinfo/toys/ToyTest.java
    index b093ba34a..df7d6bda6 100644
    --- a/typeinfo/toys/ToyTest.java
    +++ b/typeinfo/toys/ToyTest.java
    @@ -1,5 +1,5 @@
     // typeinfo/toys/ToyTest.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Testing class Class
    diff --git a/validating/Assert1.java b/validating/Assert1.java
    index 723405958..5527225e7 100644
    --- a/validating/Assert1.java
    +++ b/validating/Assert1.java
    @@ -1,5 +1,5 @@
     // validating/Assert1.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Non-informative style of assert
    diff --git a/validating/Assert2.java b/validating/Assert2.java
    index 3ede3c0eb..42e6eb648 100644
    --- a/validating/Assert2.java
    +++ b/validating/Assert2.java
    @@ -1,5 +1,5 @@
     // validating/Assert2.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Assert with an information-expression
    diff --git a/validating/BadMicroBenchmark.java b/validating/BadMicroBenchmark.java
    index ba7beb5ef..e10555413 100644
    --- a/validating/BadMicroBenchmark.java
    +++ b/validating/BadMicroBenchmark.java
    @@ -1,5 +1,5 @@
     // validating/BadMicroBenchmark.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    diff --git a/validating/BadMicroBenchmark2.java b/validating/BadMicroBenchmark2.java
    index b1a535979..0318edf60 100644
    --- a/validating/BadMicroBenchmark2.java
    +++ b/validating/BadMicroBenchmark2.java
    @@ -1,5 +1,5 @@
     // validating/BadMicroBenchmark2.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Relying on a common resource
    diff --git a/validating/CircularQueue.java b/validating/CircularQueue.java
    index c6c95bc48..bd5166ad1 100644
    --- a/validating/CircularQueue.java
    +++ b/validating/CircularQueue.java
    @@ -1,5 +1,5 @@
     // validating/CircularQueue.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Demonstration of Design by Contract (DbC)
    diff --git a/validating/CircularQueueException.java b/validating/CircularQueueException.java
    index 53d90672d..056123442 100644
    --- a/validating/CircularQueueException.java
    +++ b/validating/CircularQueueException.java
    @@ -1,5 +1,5 @@
     // validating/CircularQueueException.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package validating;
    diff --git a/validating/CountedList.java b/validating/CountedList.java
    index c6ad92927..e33e13b03 100644
    --- a/validating/CountedList.java
    +++ b/validating/CountedList.java
    @@ -1,5 +1,5 @@
     // validating/CountedList.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Keeps track of how many of itself are created.
    diff --git a/validating/GuavaAssertions.java b/validating/GuavaAssertions.java
    index 2adf18685..0fd8ff257 100644
    --- a/validating/GuavaAssertions.java
    +++ b/validating/GuavaAssertions.java
    @@ -1,5 +1,5 @@
     // validating/GuavaAssertions.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Assertions that are always enabled.
    diff --git a/validating/GuavaPreconditions.java b/validating/GuavaPreconditions.java
    index 9434371ac..17b15402f 100644
    --- a/validating/GuavaPreconditions.java
    +++ b/validating/GuavaPreconditions.java
    @@ -1,5 +1,5 @@
     // validating/GuavaPreconditions.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Demonstrating Guava Preconditions
    diff --git a/validating/Inverter1.java b/validating/Inverter1.java
    index 542823054..9c8a54630 100644
    --- a/validating/Inverter1.java
    +++ b/validating/Inverter1.java
    @@ -1,5 +1,5 @@
     // validating/Inverter1.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package validating;
    diff --git a/validating/Inverter2.java b/validating/Inverter2.java
    index 6c82b2069..b1ae74835 100644
    --- a/validating/Inverter2.java
    +++ b/validating/Inverter2.java
    @@ -1,5 +1,5 @@
     // validating/Inverter2.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package validating;
    diff --git a/validating/Inverter3.java b/validating/Inverter3.java
    index 8b857d5d8..f7c4bd14e 100644
    --- a/validating/Inverter3.java
    +++ b/validating/Inverter3.java
    @@ -1,5 +1,5 @@
     // validating/Inverter3.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package validating;
    diff --git a/validating/Inverter4.java b/validating/Inverter4.java
    index b1840ff47..ffd24b8f9 100644
    --- a/validating/Inverter4.java
    +++ b/validating/Inverter4.java
    @@ -1,5 +1,5 @@
     // validating/Inverter4.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package validating;
    diff --git a/validating/LoaderAssertions.java b/validating/LoaderAssertions.java
    index 696eccfea..9b1bd607a 100644
    --- a/validating/LoaderAssertions.java
    +++ b/validating/LoaderAssertions.java
    @@ -1,5 +1,5 @@
     // validating/LoaderAssertions.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Using the class loader to enable assertions
    diff --git a/validating/NonNullConstruction.java b/validating/NonNullConstruction.java
    index 1b2a37d64..b75ef2433 100644
    --- a/validating/NonNullConstruction.java
    +++ b/validating/NonNullConstruction.java
    @@ -1,5 +1,5 @@
     // validating/NonNullConstruction.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import static com.google.common.base.Preconditions.*;
    diff --git a/validating/SLF4JLevels.java b/validating/SLF4JLevels.java
    index e8b2b4cb6..19214175e 100644
    --- a/validating/SLF4JLevels.java
    +++ b/validating/SLF4JLevels.java
    @@ -1,5 +1,5 @@
     // validating/SLF4JLevels.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import org.slf4j.*;
    diff --git a/validating/SLF4JLogging.java b/validating/SLF4JLogging.java
    index 0f23bb4dd..fc39e0ede 100644
    --- a/validating/SLF4JLogging.java
    +++ b/validating/SLF4JLogging.java
    @@ -1,5 +1,5 @@
     // validating/SLF4JLogging.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import org.slf4j.*;
    diff --git a/validating/SimpleDebugging.java b/validating/SimpleDebugging.java
    index e17970690..476dcb9d8 100644
    --- a/validating/SimpleDebugging.java
    +++ b/validating/SimpleDebugging.java
    @@ -1,5 +1,5 @@
     // validating/SimpleDebugging.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // {ThrowsException}
    diff --git a/validating/StringInverter.java b/validating/StringInverter.java
    index f01e46dc9..3ef11e8ca 100644
    --- a/validating/StringInverter.java
    +++ b/validating/StringInverter.java
    @@ -1,5 +1,5 @@
     // validating/StringInverter.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package validating;
    diff --git a/validating/jmh/JMH1.java b/validating/jmh/JMH1.java
    index 007b194ac..b1767a77b 100644
    --- a/validating/jmh/JMH1.java
    +++ b/validating/jmh/JMH1.java
    @@ -1,5 +1,5 @@
     // validating/jmh/JMH1.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package validating.jmh;
    diff --git a/validating/jmh/JMH2.java b/validating/jmh/JMH2.java
    index bc3826bdd..e119f1b51 100644
    --- a/validating/jmh/JMH2.java
    +++ b/validating/jmh/JMH2.java
    @@ -1,5 +1,5 @@
     // validating/jmh/JMH2.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package validating.jmh;
    diff --git a/validating/jmh/JMH3.java b/validating/jmh/JMH3.java
    index 58471bcca..ffb46ffe0 100644
    --- a/validating/jmh/JMH3.java
    +++ b/validating/jmh/JMH3.java
    @@ -1,5 +1,5 @@
     // validating/jmh/JMH3.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package validating.jmh;
    diff --git a/validating/tests/CircularQueueTest.java b/validating/tests/CircularQueueTest.java
    index 603518552..de6b8cd86 100644
    --- a/validating/tests/CircularQueueTest.java
    +++ b/validating/tests/CircularQueueTest.java
    @@ -1,5 +1,5 @@
     // validating/tests/CircularQueueTest.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package validating;
    diff --git a/validating/tests/CountedListTest.java b/validating/tests/CountedListTest.java
    index f3188cdbb..d852485ca 100644
    --- a/validating/tests/CountedListTest.java
    +++ b/validating/tests/CountedListTest.java
    @@ -1,5 +1,5 @@
     // validating/tests/CountedListTest.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Simple use of JUnit to test CountedList.
    diff --git a/validating/tests/DynamicStringInverterTests.java b/validating/tests/DynamicStringInverterTests.java
    index b4d2e5670..329ae6320 100644
    --- a/validating/tests/DynamicStringInverterTests.java
    +++ b/validating/tests/DynamicStringInverterTests.java
    @@ -1,5 +1,5 @@
     // validating/tests/DynamicStringInverterTests.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package validating;
    diff --git a/validating/tests/StringInverterTests.java b/validating/tests/StringInverterTests.java
    index 759874f31..142512177 100644
    --- a/validating/tests/StringInverterTests.java
    +++ b/validating/tests/StringInverterTests.java
    @@ -1,5 +1,5 @@
     // validating/tests/StringInverterTests.java
    -// (c)2016 MindView LLC: see Copyright.txt
    +// (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package validating;
    
    From 06d63a1c044940e3d9b3fa87bd30453bcb15ccd0 Mon Sep 17 00:00:00 2001
    From: Bruce Eckel 
    Date: Fri, 30 Dec 2016 22:22:39 -0800
    Subject: [PATCH 176/320] Changed appendix name
    
    ---
     Copyright.txt                                                 | 2 +-
     .../AssociativeArray.java                                     | 2 +-
     {moreaboutcollections => collectiontopics}/Bits.java          | 2 +-
     .../CanonicalMapping.java                                     | 2 +-
     .../CollectionMethods.java                                    | 2 +-
     {moreaboutcollections => collectiontopics}/CountedString.java | 2 +-
     {moreaboutcollections => collectiontopics}/Enumerations.java  | 2 +-
     {moreaboutcollections => collectiontopics}/FailFast.java      | 2 +-
     {moreaboutcollections => collectiontopics}/FillMapTest.java   | 2 +-
     {moreaboutcollections => collectiontopics}/FillingLists.java  | 2 +-
     {moreaboutcollections => collectiontopics}/FunctionalMap.java | 2 +-
     {moreaboutcollections => collectiontopics}/Groundhog.java     | 2 +-
     {moreaboutcollections => collectiontopics}/Groundhog2.java    | 2 +-
     {moreaboutcollections => collectiontopics}/HTMLColorTest.java | 2 +-
     .../IndividualTest.java                                       | 2 +-
     .../LinkedHashMapDemo.java                                    | 2 +-
     {moreaboutcollections => collectiontopics}/ListOps.java       | 2 +-
     .../ListSortSearch.java                                       | 2 +-
     {moreaboutcollections => collectiontopics}/MapEntry.java      | 2 +-
     {moreaboutcollections => collectiontopics}/MapOps.java        | 2 +-
     {moreaboutcollections => collectiontopics}/NavMap.java        | 2 +-
     {moreaboutcollections => collectiontopics}/Prediction.java    | 2 +-
     {moreaboutcollections => collectiontopics}/QueueBehavior.java | 2 +-
     {moreaboutcollections => collectiontopics}/ReadOnly.java      | 2 +-
     {moreaboutcollections => collectiontopics}/References.java    | 2 +-
     {moreaboutcollections => collectiontopics}/SetOrder.java      | 2 +-
     {moreaboutcollections => collectiontopics}/SimpleDeques.java  | 2 +-
     {moreaboutcollections => collectiontopics}/SimpleHashMap.java | 2 +-
     {moreaboutcollections => collectiontopics}/SlowMap.java       | 2 +-
     {moreaboutcollections => collectiontopics}/SortedMapDemo.java | 2 +-
     {moreaboutcollections => collectiontopics}/SortedSetDemo.java | 2 +-
     .../SpringDetector.java                                       | 2 +-
     .../SpringDetector2.java                                      | 2 +-
     {moreaboutcollections => collectiontopics}/Stacks.java        | 2 +-
     .../StreamFillMaps.java                                       | 2 +-
     .../StringHashCode.java                                       | 2 +-
     .../SuppliersCollectionTest.java                              | 2 +-
     .../Synchronization.java                                      | 2 +-
     {moreaboutcollections => collectiontopics}/ToDoList.java      | 2 +-
     {moreaboutcollections => collectiontopics}/TypesForSets.java  | 2 +-
     {moreaboutcollections => collectiontopics}/Unsupported.java   | 2 +-
     {moreaboutcollections => collectiontopics}/Utilities.java     | 2 +-
     {moreaboutcollections => collectiontopics}/jmh/Deques.java    | 2 +-
     {moreaboutcollections => collectiontopics}/jmh/Lists.java     | 2 +-
     {moreaboutcollections => collectiontopics}/jmh/Maps.java      | 2 +-
     {moreaboutcollections => collectiontopics}/jmh/Queues.java    | 2 +-
     {moreaboutcollections => collectiontopics}/jmh/Sets.java      | 2 +-
     gradle/junit-jupiter.gradle                                   | 2 +-
     gradle/subprojects.gradle                                     | 4 ++--
     49 files changed, 50 insertions(+), 50 deletions(-)
     rename {moreaboutcollections => collectiontopics}/AssociativeArray.java (97%)
     rename {moreaboutcollections => collectiontopics}/Bits.java (98%)
     rename {moreaboutcollections => collectiontopics}/CanonicalMapping.java (96%)
     rename {moreaboutcollections => collectiontopics}/CollectionMethods.java (98%)
     rename {moreaboutcollections => collectiontopics}/CountedString.java (97%)
     rename {moreaboutcollections => collectiontopics}/Enumerations.java (94%)
     rename {moreaboutcollections => collectiontopics}/FailFast.java (93%)
     rename {moreaboutcollections => collectiontopics}/FillMapTest.java (95%)
     rename {moreaboutcollections => collectiontopics}/FillingLists.java (95%)
     rename {moreaboutcollections => collectiontopics}/FunctionalMap.java (94%)
     rename {moreaboutcollections => collectiontopics}/Groundhog.java (90%)
     rename {moreaboutcollections => collectiontopics}/Groundhog2.java (92%)
     rename {moreaboutcollections => collectiontopics}/HTMLColorTest.java (97%)
     rename {moreaboutcollections => collectiontopics}/IndividualTest.java (94%)
     rename {moreaboutcollections => collectiontopics}/LinkedHashMapDemo.java (95%)
     rename {moreaboutcollections => collectiontopics}/ListOps.java (99%)
     rename {moreaboutcollections => collectiontopics}/ListSortSearch.java (97%)
     rename {moreaboutcollections => collectiontopics}/MapEntry.java (96%)
     rename {moreaboutcollections => collectiontopics}/MapOps.java (98%)
     rename {moreaboutcollections => collectiontopics}/NavMap.java (98%)
     rename {moreaboutcollections => collectiontopics}/Prediction.java (92%)
     rename {moreaboutcollections => collectiontopics}/QueueBehavior.java (96%)
     rename {moreaboutcollections => collectiontopics}/ReadOnly.java (97%)
     rename {moreaboutcollections => collectiontopics}/References.java (98%)
     rename {moreaboutcollections => collectiontopics}/SetOrder.java (97%)
     rename {moreaboutcollections => collectiontopics}/SimpleDeques.java (97%)
     rename {moreaboutcollections => collectiontopics}/SimpleHashMap.java (98%)
     rename {moreaboutcollections => collectiontopics}/SlowMap.java (98%)
     rename {moreaboutcollections => collectiontopics}/SortedMapDemo.java (96%)
     rename {moreaboutcollections => collectiontopics}/SortedSetDemo.java (96%)
     rename {moreaboutcollections => collectiontopics}/SpringDetector.java (96%)
     rename {moreaboutcollections => collectiontopics}/SpringDetector2.java (94%)
     rename {moreaboutcollections => collectiontopics}/Stacks.java (98%)
     rename {moreaboutcollections => collectiontopics}/StreamFillMaps.java (97%)
     rename {moreaboutcollections => collectiontopics}/StringHashCode.java (90%)
     rename {moreaboutcollections => collectiontopics}/SuppliersCollectionTest.java (97%)
     rename {moreaboutcollections => collectiontopics}/Synchronization.java (94%)
     rename {moreaboutcollections => collectiontopics}/ToDoList.java (97%)
     rename {moreaboutcollections => collectiontopics}/TypesForSets.java (98%)
     rename {moreaboutcollections => collectiontopics}/Unsupported.java (98%)
     rename {moreaboutcollections => collectiontopics}/Utilities.java (98%)
     rename {moreaboutcollections => collectiontopics}/jmh/Deques.java (97%)
     rename {moreaboutcollections => collectiontopics}/jmh/Lists.java (98%)
     rename {moreaboutcollections => collectiontopics}/jmh/Maps.java (97%)
     rename {moreaboutcollections => collectiontopics}/jmh/Queues.java (97%)
     rename {moreaboutcollections => collectiontopics}/jmh/Sets.java (97%)
    
    diff --git a/Copyright.txt b/Copyright.txt
    index 3470ee0eb..8cc3bb56a 100644
    --- a/Copyright.txt
    +++ b/Copyright.txt
    @@ -1,5 +1,5 @@
     // Copyright.txt
    -This computer source code is Copyright ©2016 MindView LLC.
    +This computer source code is Copyright ©2017 MindView LLC.
     All Rights Reserved.
     
     Permission to use, copy, modify, and distribute this
    diff --git a/moreaboutcollections/AssociativeArray.java b/collectiontopics/AssociativeArray.java
    similarity index 97%
    rename from moreaboutcollections/AssociativeArray.java
    rename to collectiontopics/AssociativeArray.java
    index 445c00615..772f36d3e 100644
    --- a/moreaboutcollections/AssociativeArray.java
    +++ b/collectiontopics/AssociativeArray.java
    @@ -1,4 +1,4 @@
    -// moreaboutcollections/AssociativeArray.java
    +// collectiontopics/AssociativeArray.java
     // (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
    diff --git a/moreaboutcollections/Bits.java b/collectiontopics/Bits.java
    similarity index 98%
    rename from moreaboutcollections/Bits.java
    rename to collectiontopics/Bits.java
    index 82b8d2c98..bc0fe9275 100644
    --- a/moreaboutcollections/Bits.java
    +++ b/collectiontopics/Bits.java
    @@ -1,4 +1,4 @@
    -// moreaboutcollections/Bits.java
    +// collectiontopics/Bits.java
     // (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
    diff --git a/moreaboutcollections/CanonicalMapping.java b/collectiontopics/CanonicalMapping.java
    similarity index 96%
    rename from moreaboutcollections/CanonicalMapping.java
    rename to collectiontopics/CanonicalMapping.java
    index ac56492ea..330b381ce 100644
    --- a/moreaboutcollections/CanonicalMapping.java
    +++ b/collectiontopics/CanonicalMapping.java
    @@ -1,4 +1,4 @@
    -// moreaboutcollections/CanonicalMapping.java
    +// collectiontopics/CanonicalMapping.java
     // (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
    diff --git a/moreaboutcollections/CollectionMethods.java b/collectiontopics/CollectionMethods.java
    similarity index 98%
    rename from moreaboutcollections/CollectionMethods.java
    rename to collectiontopics/CollectionMethods.java
    index 8c9c1a924..0c5ba63ea 100644
    --- a/moreaboutcollections/CollectionMethods.java
    +++ b/collectiontopics/CollectionMethods.java
    @@ -1,4 +1,4 @@
    -// moreaboutcollections/CollectionMethods.java
    +// collectiontopics/CollectionMethods.java
     // (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
    diff --git a/moreaboutcollections/CountedString.java b/collectiontopics/CountedString.java
    similarity index 97%
    rename from moreaboutcollections/CountedString.java
    rename to collectiontopics/CountedString.java
    index e9d1ace2d..409bc98cd 100644
    --- a/moreaboutcollections/CountedString.java
    +++ b/collectiontopics/CountedString.java
    @@ -1,4 +1,4 @@
    -// moreaboutcollections/CountedString.java
    +// collectiontopics/CountedString.java
     // (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
    diff --git a/moreaboutcollections/Enumerations.java b/collectiontopics/Enumerations.java
    similarity index 94%
    rename from moreaboutcollections/Enumerations.java
    rename to collectiontopics/Enumerations.java
    index f856efebb..1d846645f 100644
    --- a/moreaboutcollections/Enumerations.java
    +++ b/collectiontopics/Enumerations.java
    @@ -1,4 +1,4 @@
    -// moreaboutcollections/Enumerations.java
    +// collectiontopics/Enumerations.java
     // (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
    diff --git a/moreaboutcollections/FailFast.java b/collectiontopics/FailFast.java
    similarity index 93%
    rename from moreaboutcollections/FailFast.java
    rename to collectiontopics/FailFast.java
    index 7206d7283..8a93867c9 100644
    --- a/moreaboutcollections/FailFast.java
    +++ b/collectiontopics/FailFast.java
    @@ -1,4 +1,4 @@
    -// moreaboutcollections/FailFast.java
    +// collectiontopics/FailFast.java
     // (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
    diff --git a/moreaboutcollections/FillMapTest.java b/collectiontopics/FillMapTest.java
    similarity index 95%
    rename from moreaboutcollections/FillMapTest.java
    rename to collectiontopics/FillMapTest.java
    index 329679724..599c76aba 100644
    --- a/moreaboutcollections/FillMapTest.java
    +++ b/collectiontopics/FillMapTest.java
    @@ -1,4 +1,4 @@
    -// moreaboutcollections/FillMapTest.java
    +// collectiontopics/FillMapTest.java
     // (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
    diff --git a/moreaboutcollections/FillingLists.java b/collectiontopics/FillingLists.java
    similarity index 95%
    rename from moreaboutcollections/FillingLists.java
    rename to collectiontopics/FillingLists.java
    index 1bd91ac13..b333ee8b3 100644
    --- a/moreaboutcollections/FillingLists.java
    +++ b/collectiontopics/FillingLists.java
    @@ -1,4 +1,4 @@
    -// moreaboutcollections/FillingLists.java
    +// collectiontopics/FillingLists.java
     // (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
    diff --git a/moreaboutcollections/FunctionalMap.java b/collectiontopics/FunctionalMap.java
    similarity index 94%
    rename from moreaboutcollections/FunctionalMap.java
    rename to collectiontopics/FunctionalMap.java
    index 06b8b471e..16abb45b0 100644
    --- a/moreaboutcollections/FunctionalMap.java
    +++ b/collectiontopics/FunctionalMap.java
    @@ -1,4 +1,4 @@
    -// moreaboutcollections/FunctionalMap.java
    +// collectiontopics/FunctionalMap.java
     // (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
    diff --git a/moreaboutcollections/Groundhog.java b/collectiontopics/Groundhog.java
    similarity index 90%
    rename from moreaboutcollections/Groundhog.java
    rename to collectiontopics/Groundhog.java
    index 3f993635b..9f68ca208 100644
    --- a/moreaboutcollections/Groundhog.java
    +++ b/collectiontopics/Groundhog.java
    @@ -1,4 +1,4 @@
    -// moreaboutcollections/Groundhog.java
    +// collectiontopics/Groundhog.java
     // (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
    diff --git a/moreaboutcollections/Groundhog2.java b/collectiontopics/Groundhog2.java
    similarity index 92%
    rename from moreaboutcollections/Groundhog2.java
    rename to collectiontopics/Groundhog2.java
    index 31d043ad6..e79e581df 100644
    --- a/moreaboutcollections/Groundhog2.java
    +++ b/collectiontopics/Groundhog2.java
    @@ -1,4 +1,4 @@
    -// moreaboutcollections/Groundhog2.java
    +// collectiontopics/Groundhog2.java
     // (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
    diff --git a/moreaboutcollections/HTMLColorTest.java b/collectiontopics/HTMLColorTest.java
    similarity index 97%
    rename from moreaboutcollections/HTMLColorTest.java
    rename to collectiontopics/HTMLColorTest.java
    index ca4750026..47418db07 100644
    --- a/moreaboutcollections/HTMLColorTest.java
    +++ b/collectiontopics/HTMLColorTest.java
    @@ -1,4 +1,4 @@
    -// moreaboutcollections/HTMLColorTest.java
    +// collectiontopics/HTMLColorTest.java
     // (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
    diff --git a/moreaboutcollections/IndividualTest.java b/collectiontopics/IndividualTest.java
    similarity index 94%
    rename from moreaboutcollections/IndividualTest.java
    rename to collectiontopics/IndividualTest.java
    index b701f5503..fa5e51305 100644
    --- a/moreaboutcollections/IndividualTest.java
    +++ b/collectiontopics/IndividualTest.java
    @@ -1,4 +1,4 @@
    -// moreaboutcollections/IndividualTest.java
    +// collectiontopics/IndividualTest.java
     // (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
    diff --git a/moreaboutcollections/LinkedHashMapDemo.java b/collectiontopics/LinkedHashMapDemo.java
    similarity index 95%
    rename from moreaboutcollections/LinkedHashMapDemo.java
    rename to collectiontopics/LinkedHashMapDemo.java
    index 13a13640e..12e1574bc 100644
    --- a/moreaboutcollections/LinkedHashMapDemo.java
    +++ b/collectiontopics/LinkedHashMapDemo.java
    @@ -1,4 +1,4 @@
    -// moreaboutcollections/LinkedHashMapDemo.java
    +// collectiontopics/LinkedHashMapDemo.java
     // (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
    diff --git a/moreaboutcollections/ListOps.java b/collectiontopics/ListOps.java
    similarity index 99%
    rename from moreaboutcollections/ListOps.java
    rename to collectiontopics/ListOps.java
    index e777762f1..f90890693 100644
    --- a/moreaboutcollections/ListOps.java
    +++ b/collectiontopics/ListOps.java
    @@ -1,4 +1,4 @@
    -// moreaboutcollections/ListOps.java
    +// collectiontopics/ListOps.java
     // (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
    diff --git a/moreaboutcollections/ListSortSearch.java b/collectiontopics/ListSortSearch.java
    similarity index 97%
    rename from moreaboutcollections/ListSortSearch.java
    rename to collectiontopics/ListSortSearch.java
    index af8d684a8..0f452c3c5 100644
    --- a/moreaboutcollections/ListSortSearch.java
    +++ b/collectiontopics/ListSortSearch.java
    @@ -1,4 +1,4 @@
    -// moreaboutcollections/ListSortSearch.java
    +// collectiontopics/ListSortSearch.java
     // (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
    diff --git a/moreaboutcollections/MapEntry.java b/collectiontopics/MapEntry.java
    similarity index 96%
    rename from moreaboutcollections/MapEntry.java
    rename to collectiontopics/MapEntry.java
    index e1680fad9..66ef9af3a 100644
    --- a/moreaboutcollections/MapEntry.java
    +++ b/collectiontopics/MapEntry.java
    @@ -1,4 +1,4 @@
    -// moreaboutcollections/MapEntry.java
    +// collectiontopics/MapEntry.java
     // (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
    diff --git a/moreaboutcollections/MapOps.java b/collectiontopics/MapOps.java
    similarity index 98%
    rename from moreaboutcollections/MapOps.java
    rename to collectiontopics/MapOps.java
    index 2576de0fb..5d331d0da 100644
    --- a/moreaboutcollections/MapOps.java
    +++ b/collectiontopics/MapOps.java
    @@ -1,4 +1,4 @@
    -// moreaboutcollections/MapOps.java
    +// collectiontopics/MapOps.java
     // (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
    diff --git a/moreaboutcollections/NavMap.java b/collectiontopics/NavMap.java
    similarity index 98%
    rename from moreaboutcollections/NavMap.java
    rename to collectiontopics/NavMap.java
    index 4a4082b01..92e4ef198 100644
    --- a/moreaboutcollections/NavMap.java
    +++ b/collectiontopics/NavMap.java
    @@ -1,4 +1,4 @@
    -// moreaboutcollections/NavMap.java
    +// collectiontopics/NavMap.java
     // (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
    diff --git a/moreaboutcollections/Prediction.java b/collectiontopics/Prediction.java
    similarity index 92%
    rename from moreaboutcollections/Prediction.java
    rename to collectiontopics/Prediction.java
    index ce3df03bb..98373f357 100644
    --- a/moreaboutcollections/Prediction.java
    +++ b/collectiontopics/Prediction.java
    @@ -1,4 +1,4 @@
    -// moreaboutcollections/Prediction.java
    +// collectiontopics/Prediction.java
     // (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
    diff --git a/moreaboutcollections/QueueBehavior.java b/collectiontopics/QueueBehavior.java
    similarity index 96%
    rename from moreaboutcollections/QueueBehavior.java
    rename to collectiontopics/QueueBehavior.java
    index 6c9934efb..b18733258 100644
    --- a/moreaboutcollections/QueueBehavior.java
    +++ b/collectiontopics/QueueBehavior.java
    @@ -1,4 +1,4 @@
    -// moreaboutcollections/QueueBehavior.java
    +// collectiontopics/QueueBehavior.java
     // (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
    diff --git a/moreaboutcollections/ReadOnly.java b/collectiontopics/ReadOnly.java
    similarity index 97%
    rename from moreaboutcollections/ReadOnly.java
    rename to collectiontopics/ReadOnly.java
    index 66ca4f9ee..19a8cc58e 100644
    --- a/moreaboutcollections/ReadOnly.java
    +++ b/collectiontopics/ReadOnly.java
    @@ -1,4 +1,4 @@
    -// moreaboutcollections/ReadOnly.java
    +// collectiontopics/ReadOnly.java
     // (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
    diff --git a/moreaboutcollections/References.java b/collectiontopics/References.java
    similarity index 98%
    rename from moreaboutcollections/References.java
    rename to collectiontopics/References.java
    index b934f4e64..c7885fb24 100644
    --- a/moreaboutcollections/References.java
    +++ b/collectiontopics/References.java
    @@ -1,4 +1,4 @@
    -// moreaboutcollections/References.java
    +// collectiontopics/References.java
     // (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
    diff --git a/moreaboutcollections/SetOrder.java b/collectiontopics/SetOrder.java
    similarity index 97%
    rename from moreaboutcollections/SetOrder.java
    rename to collectiontopics/SetOrder.java
    index 2f08e0ffd..fb4fcf4de 100644
    --- a/moreaboutcollections/SetOrder.java
    +++ b/collectiontopics/SetOrder.java
    @@ -1,4 +1,4 @@
    -// moreaboutcollections/SetOrder.java
    +// collectiontopics/SetOrder.java
     // (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
    diff --git a/moreaboutcollections/SimpleDeques.java b/collectiontopics/SimpleDeques.java
    similarity index 97%
    rename from moreaboutcollections/SimpleDeques.java
    rename to collectiontopics/SimpleDeques.java
    index ec1c1d01d..ead6bc1a3 100644
    --- a/moreaboutcollections/SimpleDeques.java
    +++ b/collectiontopics/SimpleDeques.java
    @@ -1,4 +1,4 @@
    -// moreaboutcollections/SimpleDeques.java
    +// collectiontopics/SimpleDeques.java
     // (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
    diff --git a/moreaboutcollections/SimpleHashMap.java b/collectiontopics/SimpleHashMap.java
    similarity index 98%
    rename from moreaboutcollections/SimpleHashMap.java
    rename to collectiontopics/SimpleHashMap.java
    index 60289ea6c..0c117243b 100644
    --- a/moreaboutcollections/SimpleHashMap.java
    +++ b/collectiontopics/SimpleHashMap.java
    @@ -1,4 +1,4 @@
    -// moreaboutcollections/SimpleHashMap.java
    +// collectiontopics/SimpleHashMap.java
     // (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
    diff --git a/moreaboutcollections/SlowMap.java b/collectiontopics/SlowMap.java
    similarity index 98%
    rename from moreaboutcollections/SlowMap.java
    rename to collectiontopics/SlowMap.java
    index 487df3640..9ee0d646a 100644
    --- a/moreaboutcollections/SlowMap.java
    +++ b/collectiontopics/SlowMap.java
    @@ -1,4 +1,4 @@
    -// moreaboutcollections/SlowMap.java
    +// collectiontopics/SlowMap.java
     // (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
    diff --git a/moreaboutcollections/SortedMapDemo.java b/collectiontopics/SortedMapDemo.java
    similarity index 96%
    rename from moreaboutcollections/SortedMapDemo.java
    rename to collectiontopics/SortedMapDemo.java
    index 9cb5cac15..a63504b6f 100644
    --- a/moreaboutcollections/SortedMapDemo.java
    +++ b/collectiontopics/SortedMapDemo.java
    @@ -1,4 +1,4 @@
    -// moreaboutcollections/SortedMapDemo.java
    +// collectiontopics/SortedMapDemo.java
     // (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
    diff --git a/moreaboutcollections/SortedSetDemo.java b/collectiontopics/SortedSetDemo.java
    similarity index 96%
    rename from moreaboutcollections/SortedSetDemo.java
    rename to collectiontopics/SortedSetDemo.java
    index 85558ec47..eccd56ad7 100644
    --- a/moreaboutcollections/SortedSetDemo.java
    +++ b/collectiontopics/SortedSetDemo.java
    @@ -1,4 +1,4 @@
    -// moreaboutcollections/SortedSetDemo.java
    +// collectiontopics/SortedSetDemo.java
     // (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
    diff --git a/moreaboutcollections/SpringDetector.java b/collectiontopics/SpringDetector.java
    similarity index 96%
    rename from moreaboutcollections/SpringDetector.java
    rename to collectiontopics/SpringDetector.java
    index 12068593b..a5af8e3af 100644
    --- a/moreaboutcollections/SpringDetector.java
    +++ b/collectiontopics/SpringDetector.java
    @@ -1,4 +1,4 @@
    -// moreaboutcollections/SpringDetector.java
    +// collectiontopics/SpringDetector.java
     // (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
    diff --git a/moreaboutcollections/SpringDetector2.java b/collectiontopics/SpringDetector2.java
    similarity index 94%
    rename from moreaboutcollections/SpringDetector2.java
    rename to collectiontopics/SpringDetector2.java
    index cca04375c..e82515ebf 100644
    --- a/moreaboutcollections/SpringDetector2.java
    +++ b/collectiontopics/SpringDetector2.java
    @@ -1,4 +1,4 @@
    -// moreaboutcollections/SpringDetector2.java
    +// collectiontopics/SpringDetector2.java
     // (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
    diff --git a/moreaboutcollections/Stacks.java b/collectiontopics/Stacks.java
    similarity index 98%
    rename from moreaboutcollections/Stacks.java
    rename to collectiontopics/Stacks.java
    index 11b0d08cf..476a5ccbc 100644
    --- a/moreaboutcollections/Stacks.java
    +++ b/collectiontopics/Stacks.java
    @@ -1,4 +1,4 @@
    -// moreaboutcollections/Stacks.java
    +// collectiontopics/Stacks.java
     // (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
    diff --git a/moreaboutcollections/StreamFillMaps.java b/collectiontopics/StreamFillMaps.java
    similarity index 97%
    rename from moreaboutcollections/StreamFillMaps.java
    rename to collectiontopics/StreamFillMaps.java
    index c4e05528a..d601357f0 100644
    --- a/moreaboutcollections/StreamFillMaps.java
    +++ b/collectiontopics/StreamFillMaps.java
    @@ -1,4 +1,4 @@
    -// moreaboutcollections/StreamFillMaps.java
    +// collectiontopics/StreamFillMaps.java
     // (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
    diff --git a/moreaboutcollections/StringHashCode.java b/collectiontopics/StringHashCode.java
    similarity index 90%
    rename from moreaboutcollections/StringHashCode.java
    rename to collectiontopics/StringHashCode.java
    index 9261d2828..c1461694f 100644
    --- a/moreaboutcollections/StringHashCode.java
    +++ b/collectiontopics/StringHashCode.java
    @@ -1,4 +1,4 @@
    -// moreaboutcollections/StringHashCode.java
    +// collectiontopics/StringHashCode.java
     // (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
    diff --git a/moreaboutcollections/SuppliersCollectionTest.java b/collectiontopics/SuppliersCollectionTest.java
    similarity index 97%
    rename from moreaboutcollections/SuppliersCollectionTest.java
    rename to collectiontopics/SuppliersCollectionTest.java
    index 86e59b718..e57f92d74 100644
    --- a/moreaboutcollections/SuppliersCollectionTest.java
    +++ b/collectiontopics/SuppliersCollectionTest.java
    @@ -1,4 +1,4 @@
    -// moreaboutcollections/SuppliersCollectionTest.java
    +// collectiontopics/SuppliersCollectionTest.java
     // (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
    diff --git a/moreaboutcollections/Synchronization.java b/collectiontopics/Synchronization.java
    similarity index 94%
    rename from moreaboutcollections/Synchronization.java
    rename to collectiontopics/Synchronization.java
    index d7e4e3f10..922ee8f86 100644
    --- a/moreaboutcollections/Synchronization.java
    +++ b/collectiontopics/Synchronization.java
    @@ -1,4 +1,4 @@
    -// moreaboutcollections/Synchronization.java
    +// collectiontopics/Synchronization.java
     // (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
    diff --git a/moreaboutcollections/ToDoList.java b/collectiontopics/ToDoList.java
    similarity index 97%
    rename from moreaboutcollections/ToDoList.java
    rename to collectiontopics/ToDoList.java
    index 1772f8cbd..870f7a7d1 100644
    --- a/moreaboutcollections/ToDoList.java
    +++ b/collectiontopics/ToDoList.java
    @@ -1,4 +1,4 @@
    -// moreaboutcollections/ToDoList.java
    +// collectiontopics/ToDoList.java
     // (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
    diff --git a/moreaboutcollections/TypesForSets.java b/collectiontopics/TypesForSets.java
    similarity index 98%
    rename from moreaboutcollections/TypesForSets.java
    rename to collectiontopics/TypesForSets.java
    index 21c980cb9..501403301 100644
    --- a/moreaboutcollections/TypesForSets.java
    +++ b/collectiontopics/TypesForSets.java
    @@ -1,4 +1,4 @@
    -// moreaboutcollections/TypesForSets.java
    +// collectiontopics/TypesForSets.java
     // (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
    diff --git a/moreaboutcollections/Unsupported.java b/collectiontopics/Unsupported.java
    similarity index 98%
    rename from moreaboutcollections/Unsupported.java
    rename to collectiontopics/Unsupported.java
    index 80e5b51a9..0cbb418d4 100644
    --- a/moreaboutcollections/Unsupported.java
    +++ b/collectiontopics/Unsupported.java
    @@ -1,4 +1,4 @@
    -// moreaboutcollections/Unsupported.java
    +// collectiontopics/Unsupported.java
     // (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
    diff --git a/moreaboutcollections/Utilities.java b/collectiontopics/Utilities.java
    similarity index 98%
    rename from moreaboutcollections/Utilities.java
    rename to collectiontopics/Utilities.java
    index bf6cc4c5c..1615c72a8 100644
    --- a/moreaboutcollections/Utilities.java
    +++ b/collectiontopics/Utilities.java
    @@ -1,4 +1,4 @@
    -// moreaboutcollections/Utilities.java
    +// collectiontopics/Utilities.java
     // (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
    diff --git a/moreaboutcollections/jmh/Deques.java b/collectiontopics/jmh/Deques.java
    similarity index 97%
    rename from moreaboutcollections/jmh/Deques.java
    rename to collectiontopics/jmh/Deques.java
    index 5f291afa0..379349b70 100644
    --- a/moreaboutcollections/jmh/Deques.java
    +++ b/collectiontopics/jmh/Deques.java
    @@ -1,4 +1,4 @@
    -// moreaboutcollections/jmh/Deques.java
    +// collectiontopics/jmh/Deques.java
     // (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
    diff --git a/moreaboutcollections/jmh/Lists.java b/collectiontopics/jmh/Lists.java
    similarity index 98%
    rename from moreaboutcollections/jmh/Lists.java
    rename to collectiontopics/jmh/Lists.java
    index b13618f84..9369335e5 100644
    --- a/moreaboutcollections/jmh/Lists.java
    +++ b/collectiontopics/jmh/Lists.java
    @@ -1,4 +1,4 @@
    -// moreaboutcollections/jmh/Lists.java
    +// collectiontopics/jmh/Lists.java
     // (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
    diff --git a/moreaboutcollections/jmh/Maps.java b/collectiontopics/jmh/Maps.java
    similarity index 97%
    rename from moreaboutcollections/jmh/Maps.java
    rename to collectiontopics/jmh/Maps.java
    index 65acda7e7..5a8ef73a9 100644
    --- a/moreaboutcollections/jmh/Maps.java
    +++ b/collectiontopics/jmh/Maps.java
    @@ -1,4 +1,4 @@
    -// moreaboutcollections/jmh/Maps.java
    +// collectiontopics/jmh/Maps.java
     // (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
    diff --git a/moreaboutcollections/jmh/Queues.java b/collectiontopics/jmh/Queues.java
    similarity index 97%
    rename from moreaboutcollections/jmh/Queues.java
    rename to collectiontopics/jmh/Queues.java
    index 62554e7da..fdb1d59eb 100644
    --- a/moreaboutcollections/jmh/Queues.java
    +++ b/collectiontopics/jmh/Queues.java
    @@ -1,4 +1,4 @@
    -// moreaboutcollections/jmh/Queues.java
    +// collectiontopics/jmh/Queues.java
     // (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
    diff --git a/moreaboutcollections/jmh/Sets.java b/collectiontopics/jmh/Sets.java
    similarity index 97%
    rename from moreaboutcollections/jmh/Sets.java
    rename to collectiontopics/jmh/Sets.java
    index dd0ef8fb3..c9913d1b1 100644
    --- a/moreaboutcollections/jmh/Sets.java
    +++ b/collectiontopics/jmh/Sets.java
    @@ -1,4 +1,4 @@
    -// moreaboutcollections/jmh/Sets.java
    +// collectiontopics/jmh/Sets.java
     // (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
    diff --git a/gradle/junit-jupiter.gradle b/gradle/junit-jupiter.gradle
    index b8719f50d..ccdd4ec02 100644
    --- a/gradle/junit-jupiter.gradle
    +++ b/gradle/junit-jupiter.gradle
    @@ -34,7 +34,7 @@ junitPlatform {
     
         filters {
             packages {
    -            exclude 'moreaboutcollections.jmh'
    +            exclude 'collectiontopics.jmh'
             }
             includeClassNamePattern '.*'
         }
    diff --git a/gradle/subprojects.gradle b/gradle/subprojects.gradle
    index 1ccbb942b..93e89ad0e 100644
    --- a/gradle/subprojects.gradle
    +++ b/gradle/subprojects.gradle
    @@ -4,13 +4,13 @@ project(':validating') {
         }
     }
     
    -project(':moreaboutcollections') {
    +project(':collectiontopics') {
         dependencies {
             compile project(':typeinfo')
             compile project(':collections')
         }
         jmh {
    -        include = 'moreaboutcollections.jmh.*'
    +        include = 'collectiontopics.jmh.*'
         }
     }
     
    
    From 49ea4c8d4b583ae4acb4faa01fcc441dc95e2571 Mon Sep 17 00:00:00 2001
    From: Bruce Eckel 
    Date: Fri, 30 Dec 2016 22:38:14 -0800
    Subject: [PATCH 177/320] Removed simulations
    
    ---
     lowlevel/BankTellerSimulation.java            | 218 ------------
     lowlevel/CarBuilder.java                      | 312 ------------------
     lowlevel/GreenhouseScheduler.java             | 202 ------------
     lowlevel/HorseRace.java                       | 132 --------
     lowlevel/Restaurant.java                      |  94 ------
     lowlevel/ToastOMatic.java                     | 204 ------------
     .../restaurant2/RestaurantWithQueues.java     | 230 -------------
     7 files changed, 1392 deletions(-)
     delete mode 100644 lowlevel/BankTellerSimulation.java
     delete mode 100644 lowlevel/CarBuilder.java
     delete mode 100644 lowlevel/GreenhouseScheduler.java
     delete mode 100644 lowlevel/HorseRace.java
     delete mode 100644 lowlevel/Restaurant.java
     delete mode 100644 lowlevel/ToastOMatic.java
     delete mode 100644 lowlevel/restaurant2/RestaurantWithQueues.java
    
    diff --git a/lowlevel/BankTellerSimulation.java b/lowlevel/BankTellerSimulation.java
    deleted file mode 100644
    index e961faf65..000000000
    --- a/lowlevel/BankTellerSimulation.java
    +++ /dev/null
    @@ -1,218 +0,0 @@
    -// lowlevel/BankTellerSimulation.java
    -// (c)2017 MindView LLC: see Copyright.txt
    -// We make no guarantees that this code is fit for any purpose.
    -// Visit http://OnJava8.com for more book information.
    -// Using queues and multithreading
    -// {java BankTellerSimulation 5}
    -import java.util.concurrent.*;
    -import java.util.*;
    -
    -// Read-only objects don't require synchronization:
    -class Customer {
    -  private final int serviceTime;
    -  public Customer(int tm) { serviceTime = tm; }
    -  public int getServiceTime() { return serviceTime; }
    -  public String toString() {
    -    return "[" + serviceTime + "]";
    -  }
    -}
    -
    -// Teach the customer line to display itself:
    -class CustomerLine extends ArrayBlockingQueue {
    -  public CustomerLine(int maxLineSize) {
    -    super(maxLineSize);
    -  }
    -  @Override
    -  public String toString() {
    -    if(this.size() == 0)
    -      return "[Empty]";
    -    StringBuilder result = new StringBuilder();
    -    for(Customer customer : this)
    -      result.append(customer);
    -    return result.toString();
    -  }
    -}
    -
    -// Randomly add customers to a queue:
    -class CustomerSupplier implements Runnable {
    -  private CustomerLine customers;
    -  private static SplittableRandom rand = new SplittableRandom(47);
    -  public CustomerSupplier(CustomerLine cq) {
    -    customers = cq;
    -  }
    -  @Override
    -  public void run() {
    -    try {
    -      while(!Thread.interrupted()) {
    -        TimeUnit.MILLISECONDS.sleep(rand.nextInt(300));
    -        customers.put(new Customer(rand.nextInt(1000)));
    -      }
    -    } catch(InterruptedException e) {
    -      System.out.println("CustomerSupplier interrupted");
    -    }
    -    System.out.println("CustomerSupplier terminating");
    -  }
    -}
    -
    -class Teller implements Runnable, Comparable {
    -  private static int counter = 0;
    -  private final int id = counter++;
    -  // Customers served during this shift:
    -  private int customersServed = 0;
    -  private CustomerLine customers;
    -  private boolean servingCustomerLine = true;
    -  public Teller(CustomerLine cq) { customers = cq; }
    -  public void run() {
    -    try {
    -      while(!Thread.interrupted()) {
    -        Customer customer = customers.take();
    -        TimeUnit.MILLISECONDS.sleep(
    -          customer.getServiceTime());
    -        synchronized(this) {
    -          customersServed++;
    -          while(!servingCustomerLine)
    -            wait();
    -        }
    -      }
    -    } catch(InterruptedException e) {
    -      System.out.println(this + "interrupted");
    -    }
    -    System.out.println(this + "terminating");
    -  }
    -  public synchronized void doSomethingElse() {
    -    customersServed = 0;
    -    servingCustomerLine = false;
    -  }
    -  public synchronized void serveCustomerLine() {
    -    assert !servingCustomerLine:
    -      "already serving: " + this;
    -    servingCustomerLine = true;
    -    notifyAll();
    -  }
    -  public String toString() {
    -    return "Teller " + id + " ";
    -  }
    -  public String shortString() { return "T" + id; }
    -  // Used by priority queue:
    -  public synchronized int compareTo(Teller other) {
    -    return customersServed < other.customersServed ? -1 :
    -      (customersServed == other.customersServed ? 0 : 1);
    -  }
    -}
    -
    -class TellerManager implements Runnable {
    -  private ExecutorService exec;
    -  private CustomerLine customers;
    -  private PriorityQueue workingTellers =
    -    new PriorityQueue<>();
    -  private Queue tellersDoingOtherThings =
    -    new LinkedList<>();
    -  private int adjustmentPeriod;
    -
    -  public TellerManager(ExecutorService e,
    -    CustomerLine customers, int adjustmentPeriod) {
    -    exec = e;
    -    this.customers = customers;
    -    this.adjustmentPeriod = adjustmentPeriod;
    -    // Start with a single teller:
    -    Teller teller = new Teller(customers);
    -    exec.execute(teller);
    -    workingTellers.add(teller);
    -  }
    -  public void adjustTellerNumber() {
    -    // This is actually a control system. By adjusting
    -    // the numbers, you can reveal stability issues in
    -    // the control mechanism.
    -    // If line is too long, add another teller:
    -    if(customers.size() / workingTellers.size() > 2) {
    -        // If tellers are on break or doing
    -        // another job, bring one back:
    -        if(tellersDoingOtherThings.size() > 0) {
    -          Teller teller =
    -            tellersDoingOtherThings.remove();
    -          teller.serveCustomerLine();
    -          workingTellers.offer(teller);
    -          return;
    -        }
    -      // Else create (hire) a new teller
    -      Teller teller = new Teller(customers);
    -      exec.execute(teller);
    -      workingTellers.add(teller);
    -      return;
    -    }
    -    // If line is short enough, remove a teller:
    -    if(workingTellers.size() > 1 &&
    -      customers.size() / workingTellers.size() < 2)
    -        reassignOneTeller();
    -    // If there is no line, we only need one teller:
    -    if(customers.size() == 0)
    -      while(workingTellers.size() > 1)
    -        reassignOneTeller();
    -  }
    -  // Give a teller a different job or a break:
    -  private void reassignOneTeller() {
    -    Teller teller = workingTellers.poll();
    -    teller.doSomethingElse();
    -    tellersDoingOtherThings.offer(teller);
    -  }
    -  @Override
    -  public void run() {
    -    try {
    -      while(!Thread.interrupted()) {
    -        TimeUnit.MILLISECONDS.sleep(adjustmentPeriod);
    -        adjustTellerNumber();
    -        System.out.print(customers + " { ");
    -        for(Teller teller : workingTellers)
    -          System.out.print(teller.shortString() + " ");
    -        System.out.println("}");
    -      }
    -    } catch(InterruptedException e) {
    -      System.out.println(this + "interrupted");
    -    }
    -    System.out.println(this + "terminating");
    -  }
    -  @Override
    -  public String toString() { return "TellerManager "; }
    -}
    -
    -public class BankTellerSimulation {
    -  static final int MAX_LINE_SIZE = 50;
    -  static final int ADJUSTMENT_PERIOD = 1000;
    -  public static void
    -  main(String[] args) throws Exception {
    -    ExecutorService es = Executors.newCachedThreadPool();
    -    // If line is too long, customers will leave:
    -    CustomerLine customers =
    -      new CustomerLine(MAX_LINE_SIZE);
    -    es.execute(new CustomerSupplier(customers));
    -    // Manager will add and remove tellers as necessary:
    -    es.execute(new TellerManager(
    -      es, customers, ADJUSTMENT_PERIOD));
    -    if(args.length > 0) // Optional argument
    -      TimeUnit.SECONDS.sleep(new Integer(args[0]));
    -    else {
    -      System.out.println("Press 'Enter' to quit");
    -      System.in.read();
    -    }
    -    es.shutdownNow();
    -  }
    -}
    -/* Output:
    -[768][193][807][125] { T1 T0 }
    -[125][634][682][267][954][506][639][213] { T2 T0 T1 }
    -[213][592][770][919][552][727][998][902] { T2 T0 T1 }
    -[552][727][998][902][769][373][313][683][177][526] { T3 T2
    -T1 T0 }
    -TellerManager interrupted
    -Teller 3 interrupted
    -CustomerSupplier interrupted
    -Teller 3 terminating
    -Teller 2 interrupted
    -Teller 2 terminating
    -TellerManager terminating
    -Teller 1 interrupted
    -Teller 0 interrupted
    -Teller 0 terminating
    -Teller 1 terminating
    -CustomerSupplier terminating
    -*/
    diff --git a/lowlevel/CarBuilder.java b/lowlevel/CarBuilder.java
    deleted file mode 100644
    index 2ccc58cec..000000000
    --- a/lowlevel/CarBuilder.java
    +++ /dev/null
    @@ -1,312 +0,0 @@
    -// lowlevel/CarBuilder.java
    -// (c)2017 MindView LLC: see Copyright.txt
    -// We make no guarantees that this code is fit for any purpose.
    -// Visit http://OnJava8.com for more book information.
    -// A complex example of tasks working together
    -import java.util.concurrent.*;
    -import java.util.*;
    -
    -class Car {
    -  private final int id;
    -  private boolean
    -    engine = false, driveTrain = false, wheels = false;
    -  public Car(int idn)  { id = idn; }
    -  // Empty Car object:
    -  public Car()  { id = -1; }
    -  public synchronized int getId() { return id; }
    -  public synchronized void addEngine() { engine = true; }
    -  public synchronized void addDriveTrain() {
    -    driveTrain = true;
    -  }
    -  public synchronized void addWheels() { wheels = true; }
    -  public synchronized String toString() {
    -    return "Car " + id + " [" + " engine: " + engine
    -      + " driveTrain: " + driveTrain
    -      + " wheels: " + wheels + " ]";
    -  }
    -}
    -
    -class CarQueue extends LinkedBlockingQueue {}
    -
    -class ChassisBuilder implements Runnable {
    -  private CarQueue carQueue;
    -  private int counter = 0;
    -  public ChassisBuilder(CarQueue cq) { carQueue = cq; }
    -  @Override
    -  public void run() {
    -    try {
    -      while(!Thread.interrupted()) {
    -        TimeUnit.MILLISECONDS.sleep(500);
    -        // Make chassis:
    -        Car c = new Car(counter++);
    -        System.out.println("ChassisBuilder created " + c);
    -        // Insert into queue
    -        carQueue.put(c);
    -      }
    -    } catch(InterruptedException e) {
    -      System.out.println("Interrupted: ChassisBuilder");
    -    }
    -    System.out.println("ChassisBuilder off");
    -  }
    -}
    -
    -class Assembler implements Runnable {
    -  private CarQueue chassisQueue, finishingQueue;
    -  private Car car;
    -  private CyclicBarrier barrier = new CyclicBarrier(4);
    -  private RobotPool robotPool;
    -  public
    -  Assembler(CarQueue cq, CarQueue fq, RobotPool rp) {
    -    chassisQueue = cq;
    -    finishingQueue = fq;
    -    robotPool = rp;
    -  }
    -  public Car car() { return car; }
    -  public CyclicBarrier barrier() { return barrier; }
    -  @Override
    -  public void run() {
    -    try {
    -      while(!Thread.interrupted()) {
    -        // Blocks until chassis is available:
    -        car = chassisQueue.take();
    -        // Hire robots to perform work:
    -        robotPool.hire(EngineRobot.class, this);
    -        robotPool.hire(DriveTrainRobot.class, this);
    -        robotPool.hire(WheelRobot.class, this);
    -        barrier.await(); // Until the robots finish
    -        // Put car into finishingQueue for further work
    -        finishingQueue.put(car);
    -      }
    -    } catch(InterruptedException e) {
    -      System.out.println(
    -        "Exiting Assembler via interrupt");
    -    } catch(BrokenBarrierException e) {
    -      // This one we want to know about
    -      throw new RuntimeException(e);
    -    }
    -    System.out.println("Assembler off");
    -  }
    -}
    -
    -class Reporter implements Runnable {
    -  private CarQueue carQueue;
    -  public Reporter(CarQueue cq) { carQueue = cq; }
    -  @Override
    -  public void run() {
    -    try {
    -      while(!Thread.interrupted()) {
    -        System.out.println(carQueue.take());
    -      }
    -    } catch(InterruptedException e) {
    -      System.out.println(
    -        "Exiting Reporter via interrupt");
    -    }
    -    System.out.println("Reporter off");
    -  }
    -}
    -
    -abstract class Robot implements Runnable {
    -  private RobotPool pool;
    -  protected Assembler assembler;
    -  public Robot(RobotPool p) { pool = p; }
    -  public Robot assignAssembler(Assembler assembler) {
    -    this.assembler = assembler;
    -    return this;
    -  }
    -  private boolean engage = false;
    -  public synchronized void engage() {
    -    engage = true;
    -    notifyAll();
    -  }
    -  // The part of run() that's different for each robot:
    -  protected abstract void performService();
    -  public void run() {
    -    try {
    -      powerDown(); // Wait until needed
    -      while(!Thread.interrupted()) {
    -        performService();
    -        assembler.barrier().await(); // Synchronize
    -        // We're done with that job...
    -        powerDown();
    -      }
    -    } catch(InterruptedException e) {
    -      System.out.println(
    -        "Exiting " + this + " via interrupt");
    -    } catch(BrokenBarrierException e) {
    -      // This one we want to know about
    -      throw new RuntimeException(e);
    -    }
    -    System.out.println(this + " off");
    -  }
    -  private synchronized void
    -  powerDown() throws InterruptedException {
    -    engage = false;
    -    assembler = null; // Disconnect from the Assembler
    -    // Put ourselves back in the available pool:
    -    pool.release(this);
    -    while(engage == false)  // Power down
    -      wait();
    -  }
    -  public String toString() {
    -    return getClass().getName();
    -  }
    -}
    -
    -class EngineRobot extends Robot {
    -  public EngineRobot(RobotPool pool) { super(pool); }
    -  protected void performService() {
    -    System.out.println(this + " installing engine");
    -    assembler.car().addEngine();
    -  }
    -}
    -
    -class DriveTrainRobot extends Robot {
    -  public DriveTrainRobot(RobotPool pool) { super(pool); }
    -  protected void performService() {
    -    System.out.println(this + " installing DriveTrain");
    -    assembler.car().addDriveTrain();
    -  }
    -}
    -
    -class WheelRobot extends Robot {
    -  public WheelRobot(RobotPool pool) { super(pool); }
    -  protected void performService() {
    -    System.out.println(this + " installing Wheels");
    -    assembler.car().addWheels();
    -  }
    -}
    -
    -class RobotPool {
    -  // Quietly prevents identical entries:
    -  private Set pool = new HashSet<>();
    -  public synchronized void add(Robot r) {
    -    pool.add(r);
    -    notifyAll();
    -  }
    -  public synchronized void
    -  hire(Class robotType, Assembler d)
    -  throws InterruptedException {
    -    for(Robot r : pool)
    -      if(r.getClass().equals(robotType)) {
    -        pool.remove(r);
    -        r.assignAssembler(d);
    -        r.engage(); // Power it up to do the task
    -        return;
    -      }
    -    wait(); // None available
    -    hire(robotType, d); // Try again, recursively
    -  }
    -  public synchronized void release(Robot r) { add(r); }
    -}
    -
    -public class CarBuilder {
    -  public static void
    -  main(String[] args) throws Exception {
    -    CarQueue chassisQueue = new CarQueue(),
    -             finishingQueue = new CarQueue();
    -    ExecutorService es = Executors.newCachedThreadPool();
    -    RobotPool robotPool = new RobotPool();
    -    es.execute(new EngineRobot(robotPool));
    -    es.execute(new DriveTrainRobot(robotPool));
    -    es.execute(new WheelRobot(robotPool));
    -    es.execute(new Assembler(
    -      chassisQueue, finishingQueue, robotPool));
    -    es.execute(new Reporter(finishingQueue));
    -    // Start everything running by producing chassis:
    -    es.execute(new ChassisBuilder(chassisQueue));
    -    TimeUnit.SECONDS.sleep(7);
    -    es.shutdownNow();
    -  }
    -}
    -/* Output:
    -ChassisBuilder created Car 0 [ engine: false driveTrain:
    -false wheels: false ]
    -WheelRobot installing Wheels
    -DriveTrainRobot installing DriveTrain
    -EngineRobot installing engine
    -Car 0 [ engine: true driveTrain: true wheels: true ]
    -ChassisBuilder created Car 1 [ engine: false driveTrain:
    -false wheels: false ]
    -EngineRobot installing engine
    -WheelRobot installing Wheels
    -DriveTrainRobot installing DriveTrain
    -Car 1 [ engine: true driveTrain: true wheels: true ]
    -ChassisBuilder created Car 2 [ engine: false driveTrain:
    -false wheels: false ]
    -DriveTrainRobot installing DriveTrain
    -WheelRobot installing Wheels
    -EngineRobot installing engine
    -Car 2 [ engine: true driveTrain: true wheels: true ]
    -ChassisBuilder created Car 3 [ engine: false driveTrain:
    -false wheels: false ]
    -DriveTrainRobot installing DriveTrain
    -WheelRobot installing Wheels
    -EngineRobot installing engine
    -Car 3 [ engine: true driveTrain: true wheels: true ]
    -ChassisBuilder created Car 4 [ engine: false driveTrain:
    -false wheels: false ]
    -EngineRobot installing engine
    -DriveTrainRobot installing DriveTrain
    -WheelRobot installing Wheels
    -Car 4 [ engine: true driveTrain: true wheels: true ]
    -ChassisBuilder created Car 5 [ engine: false driveTrain:
    -false wheels: false ]
    -EngineRobot installing engine
    -WheelRobot installing Wheels
    -DriveTrainRobot installing DriveTrain
    -Car 5 [ engine: true driveTrain: true wheels: true ]
    -ChassisBuilder created Car 6 [ engine: false driveTrain:
    -false wheels: false ]
    -EngineRobot installing engine
    -WheelRobot installing Wheels
    -DriveTrainRobot installing DriveTrain
    -Car 6 [ engine: true driveTrain: true wheels: true ]
    -ChassisBuilder created Car 7 [ engine: false driveTrain:
    -false wheels: false ]
    -EngineRobot installing engine
    -WheelRobot installing Wheels
    -DriveTrainRobot installing DriveTrain
    -Car 7 [ engine: true driveTrain: true wheels: true ]
    -ChassisBuilder created Car 8 [ engine: false driveTrain:
    -false wheels: false ]
    -EngineRobot installing engine
    -WheelRobot installing Wheels
    -DriveTrainRobot installing DriveTrain
    -Car 8 [ engine: true driveTrain: true wheels: true ]
    -ChassisBuilder created Car 9 [ engine: false driveTrain:
    -false wheels: false ]
    -DriveTrainRobot installing DriveTrain
    -EngineRobot installing engine
    -WheelRobot installing Wheels
    -Car 9 [ engine: true driveTrain: true wheels: true ]
    -ChassisBuilder created Car 10 [ engine: false driveTrain:
    -false wheels: false ]
    -DriveTrainRobot installing DriveTrain
    -EngineRobot installing engine
    -WheelRobot installing Wheels
    -Car 10 [ engine: true driveTrain: true wheels: true ]
    -ChassisBuilder created Car 11 [ engine: false driveTrain:
    -false wheels: false ]
    -EngineRobot installing engine
    -WheelRobot installing Wheels
    -DriveTrainRobot installing DriveTrain
    -Car 11 [ engine: true driveTrain: true wheels: true ]
    -ChassisBuilder created Car 12 [ engine: false driveTrain:
    -false wheels: false ]
    -DriveTrainRobot installing DriveTrain
    -WheelRobot installing Wheels
    -EngineRobot installing engine
    -Car 12 [ engine: true driveTrain: true wheels: true ]
    -Exiting Assembler via interrupt
    -Exiting EngineRobot via interrupt
    -Exiting WheelRobot via interrupt
    -Exiting DriveTrainRobot via interrupt
    -DriveTrainRobot off
    -Exiting Reporter via interrupt
    -Interrupted: ChassisBuilder
    -Reporter off
    -WheelRobot off
    -EngineRobot off
    -Assembler off
    -ChassisBuilder off
    -*/
    diff --git a/lowlevel/GreenhouseScheduler.java b/lowlevel/GreenhouseScheduler.java
    deleted file mode 100644
    index 84df6020b..000000000
    --- a/lowlevel/GreenhouseScheduler.java
    +++ /dev/null
    @@ -1,202 +0,0 @@
    -// lowlevel/GreenhouseScheduler.java
    -// (c)2017 MindView LLC: see Copyright.txt
    -// We make no guarantees that this code is fit for any purpose.
    -// Visit http://OnJava8.com for more book information.
    -// Rewriting innerclasses/GreenhouseController.java
    -// to use a ScheduledThreadPoolExecutor
    -// {java GreenhouseScheduler 5000}
    -import java.util.concurrent.*;
    -import java.util.*;
    -
    -public class GreenhouseScheduler {
    -  private volatile boolean light = false;
    -  private volatile boolean water = false;
    -  private String thermostat = "Day";
    -  public synchronized String getThermostat() {
    -    return thermostat;
    -  }
    -  public synchronized void setThermostat(String value) {
    -    thermostat = value;
    -  }
    -  ScheduledThreadPoolExecutor scheduler =
    -    new ScheduledThreadPoolExecutor(10);
    -  public void schedule(Runnable event, long delay) {
    -    scheduler.schedule(event,delay,TimeUnit.MILLISECONDS);
    -  }
    -  public void
    -  repeat(Runnable event, long initialDelay, long period) {
    -    scheduler.scheduleAtFixedRate(
    -      event, initialDelay, period, TimeUnit.MILLISECONDS);
    -  }
    -  class LightOn implements Runnable {
    -    @Override
    -    public void run() {
    -      // Put hardware control code here to
    -      // physically turn on the light.
    -      System.out.println("Turning on lights");
    -      light = true;
    -    }
    -  }
    -  class LightOff implements Runnable {
    -    @Override
    -    public void run() {
    -      // Put hardware control code here to
    -      // physically turn off the light.
    -      System.out.println("Turning off lights");
    -      light = false;
    -    }
    -  }
    -  class WaterOn implements Runnable {
    -    @Override
    -    public void run() {
    -      // Put hardware control code here.
    -      System.out.println("Turning greenhouse water on");
    -      water = true;
    -    }
    -  }
    -  class WaterOff implements Runnable {
    -    @Override
    -    public void run() {
    -      // Put hardware control code here.
    -      System.out.println("Turning greenhouse water off");
    -      water = false;
    -    }
    -  }
    -  class ThermostatNight implements Runnable {
    -    @Override
    -    public void run() {
    -      // Put hardware control code here.
    -      System.out.println("Thermostat to night setting");
    -      setThermostat("Night");
    -    }
    -  }
    -  class ThermostatDay implements Runnable {
    -    @Override
    -    public void run() {
    -      // Put hardware control code here.
    -      System.out.println("Thermostat to day setting");
    -      setThermostat("Day");
    -    }
    -  }
    -  class Bell implements Runnable {
    -    @Override
    -    public void run() { System.out.println("Bing!"); }
    -  }
    -  class Terminate implements Runnable {
    -    @Override
    -    public void run() {
    -      System.out.println("Terminating");
    -      scheduler.shutdownNow();
    -      // Must start a separate task to do this job,
    -      // since the scheduler was shut down:
    -      new Thread() {
    -        @Override
    -        public void run() {
    -          for(DataPoint d : data)
    -            System.out.println(d);
    -        }
    -      }.start();
    -    }
    -  }
    -  // New feature: data collection
    -  static class DataPoint {
    -    final Calendar time;
    -    final double temperature;
    -    final double humidity;
    -    public DataPoint(Calendar d, double temp, double hum) {
    -      time = d;
    -      temperature = temp;
    -      humidity = hum;
    -    }
    -    @Override
    -    public String toString() {
    -      return time.getTime() +
    -        String.format(
    -          " temperature: %1$.1f humidity: %2$.2f",
    -          temperature, humidity);
    -    }
    -  }
    -  private Calendar lastTime = Calendar.getInstance();
    -  { // Adjust date to the half hour
    -    lastTime.set(Calendar.MINUTE, 30);
    -    lastTime.set(Calendar.SECOND, 00);
    -  }
    -  private double lastTemp = 65.0f;
    -  private int tempDirection = +1;
    -  private double lastHumidity = 50.0f;
    -  private int humidityDirection = +1;
    -  private SplittableRandom rand = new SplittableRandom(47);
    -  List data = Collections.synchronizedList(
    -    new ArrayList<>());
    -  class CollectData implements Runnable {
    -    @Override
    -    public void run() {
    -      System.out.println("Collecting data");
    -      synchronized(GreenhouseScheduler.this) {
    -        // Pretend the interval is longer than it is:
    -        lastTime.set(Calendar.MINUTE,
    -          lastTime.get(Calendar.MINUTE) + 30);
    -        // One in 5 chances of reversing the direction:
    -        if(rand.nextInt(5) == 4)
    -          tempDirection = -tempDirection;
    -        // Store previous value:
    -        lastTemp +=
    -          tempDirection * (1.0f + rand.nextDouble());
    -        if(rand.nextInt(5) == 4)
    -          humidityDirection = -humidityDirection;
    -        lastHumidity +=
    -          humidityDirection * rand.nextDouble();
    -        // Calendar must be cloned, otherwise all
    -        // DataPoints hold references to same lastTime.
    -        // For basic object like Calendar, clone() is OK.
    -        data.add(new DataPoint((Calendar)lastTime.clone(),
    -          lastTemp, lastHumidity));
    -      }
    -    }
    -  }
    -  public static void main(String[] args) {
    -    GreenhouseScheduler gh = new GreenhouseScheduler();
    -    gh.schedule(gh.new Terminate(), 5000);
    -    // Former "Restart" class not necessary:
    -    gh.repeat(gh.new Bell(), 0, 1000);
    -    gh.repeat(gh.new ThermostatNight(), 0, 2000);
    -    gh.repeat(gh.new LightOn(), 0, 200);
    -    gh.repeat(gh.new LightOff(), 0, 400);
    -    gh.repeat(gh.new WaterOn(), 0, 600);
    -    gh.repeat(gh.new WaterOff(), 0, 800);
    -    gh.repeat(gh.new ThermostatDay(), 0, 1400);
    -    gh.repeat(gh.new CollectData(), 500, 500);
    -  }
    -}
    -/* Output: (First and Last 10 Lines)
    -Bing!
    -Thermostat to night setting
    -Turning on lights
    -Turning off lights
    -Turning greenhouse water on
    -Turning greenhouse water off
    -Thermostat to day setting
    -Turning on lights
    -Turning on lights
    -Turning off lights
    -...________...________...________...________...
    -Terminating
    -Wed Jul 27 11:00:00 MDT 2016 temperature: 66.3 humidity:
    -50.20
    -Wed Jul 27 11:30:00 MDT 2016 temperature: 67.3 humidity:
    -51.02
    -Wed Jul 27 12:00:00 MDT 2016 temperature: 68.8 humidity:
    -51.82
    -Wed Jul 27 12:30:00 MDT 2016 temperature: 70.0 humidity:
    -52.19
    -Wed Jul 27 13:00:00 MDT 2016 temperature: 71.5 humidity:
    -52.99
    -Wed Jul 27 13:30:00 MDT 2016 temperature: 73.0 humidity:
    -53.32
    -Wed Jul 27 14:00:00 MDT 2016 temperature: 74.4 humidity:
    -53.99
    -Wed Jul 27 14:30:00 MDT 2016 temperature: 75.5 humidity:
    -54.40
    -Wed Jul 27 15:00:00 MDT 2016 temperature: 76.8 humidity:
    -53.96
    -*/
    diff --git a/lowlevel/HorseRace.java b/lowlevel/HorseRace.java
    deleted file mode 100644
    index da2fd50f5..000000000
    --- a/lowlevel/HorseRace.java
    +++ /dev/null
    @@ -1,132 +0,0 @@
    -// lowlevel/HorseRace.java
    -// (c)2017 MindView LLC: see Copyright.txt
    -// We make no guarantees that this code is fit for any purpose.
    -// Visit http://OnJava8.com for more book information.
    -// Using CyclicBarriers
    -import java.util.concurrent.*;
    -import java.util.*;
    -import onjava.Nap;
    -
    -class Horse implements Runnable {
    -  private static int counter = 0;
    -  private final int id = counter++;
    -  private int strides = 0;
    -  private static SplittableRandom rand = new SplittableRandom(47);
    -  private static CyclicBarrier barrier;
    -  public Horse(CyclicBarrier b) { barrier = b; }
    -  public synchronized int getStrides() { return strides; }
    -  @Override
    -  public void run() {
    -    try {
    -      while(!Thread.interrupted()) {
    -        synchronized(this) {
    -          strides += rand.nextInt(3); // Yeilds 0, 1 or 2
    -        }
    -        barrier.await();
    -      }
    -    } catch(InterruptedException e) {
    -      // A legitimate way to exit
    -    } catch(BrokenBarrierException e) {
    -      // This one we want to know about
    -      throw new RuntimeException(e);
    -    }
    -  }
    -  @Override
    -  public String toString() { return "Horse " + id + " "; }
    -  public String tracks() {
    -    StringBuilder s = new StringBuilder();
    -    for(int i = 0; i < getStrides(); i++)
    -      s.append("*");
    -    s.append(id);
    -    return s.toString();
    -  }
    -}
    -
    -public class HorseRace {
    -  static final int FINISH_LINE = 60;
    -  private List horses = new ArrayList<>();
    -  private ExecutorService exec =
    -    Executors.newCachedThreadPool();
    -  private CyclicBarrier barrier;
    -  public HorseRace(int nHorses, final int pause) {
    -    barrier = new CyclicBarrier(nHorses, () -> {
    -      StringBuilder s = new StringBuilder();
    -      for(int i = 0; i < FINISH_LINE; i++)
    -        s.append("="); // The fence on the racetrack
    -      System.out.println(s);
    -      for(Horse horse : horses)
    -        System.out.println(horse.tracks());
    -      for(Horse horse : horses)
    -        if(horse.getStrides() >= FINISH_LINE) {
    -          System.out.println(horse + "won!");
    -          exec.shutdownNow();
    -          return;
    -        }
    -      new Nap(pause);
    -    });
    -    for(int i = 0; i < nHorses; i++) {
    -      Horse horse = new Horse(barrier);
    -      horses.add(horse);
    -      exec.execute(horse);
    -    }
    -  }
    -  public static void main(String[] args) {
    -    int nHorses = 7;
    -    int pause = 200;
    -    if(args.length > 0) { // Optional argument
    -      int n = new Integer(args[0]);
    -      nHorses = n > 0 ? n : nHorses;
    -    }
    -    if(args.length > 1) { // Optional argument
    -      int p = new Integer(args[1]);
    -      pause = p > -1 ? p : pause;
    -    }
    -    new HorseRace(nHorses, pause);
    -  }
    -}
    -/* Output: (First and Last 18 Lines)
    -===========================================================
    -=
    -0
    -**1
    -2
    -*3
    -**4
    -*5
    -**6
    -===========================================================
    -=
    -**0
    -***1
    -*2
    -*3
    -****4
    -**5
    -****6
    -===========================================================
    -=
    -**0
    -...________...________...________...________...
    -**********************************************6
    -===========================================================
    -=
    -**************************************************0
    -*************************************************1
    -*********************************************2
    -***********************************************************
    -3
    -*****************************************************4
    -*****************************************************5
    -***********************************************6
    -===========================================================
    -=
    -****************************************************0
    -*************************************************1
    -***********************************************2
    -***********************************************************
    -*3
    -*******************************************************4
    -*******************************************************5
    -***********************************************6
    -Horse 3 won!
    -*/
    diff --git a/lowlevel/Restaurant.java b/lowlevel/Restaurant.java
    deleted file mode 100644
    index 7cc029d9b..000000000
    --- a/lowlevel/Restaurant.java
    +++ /dev/null
    @@ -1,94 +0,0 @@
    -// lowlevel/Restaurant.java
    -// (c)2017 MindView LLC: see Copyright.txt
    -// We make no guarantees that this code is fit for any purpose.
    -// Visit http://OnJava8.com for more book information.
    -// The producer-consumer approach to task cooperation
    -import java.util.concurrent.*;
    -
    -class Meal {
    -  private final int orderNum;
    -  public Meal(int orderNum) { this.orderNum = orderNum; }
    -  @Override
    -  public String toString() { return "Meal " + orderNum; }
    -}
    -
    -class WaitPerson implements Runnable {
    -  private Restaurant restaurant;
    -  public WaitPerson(Restaurant r) { restaurant = r; }
    -  @Override
    -  public void run() {
    -    try {
    -      while(!Thread.interrupted()) {
    -        synchronized(this) {
    -          while(restaurant.meal == null)
    -            wait(); // ... for the chef to produce a meal
    -        }
    -        System.out.println(
    -          "Waitperson got " + restaurant.meal);
    -        synchronized(restaurant.chef) {
    -          restaurant.meal = null;
    -          restaurant.chef.notifyAll(); // Ready for more
    -        }
    -      }
    -    } catch(InterruptedException e) {
    -      System.out.println("WaitPerson interrupted");
    -    }
    -  }
    -}
    -
    -class Chef implements Runnable {
    -  private Restaurant restaurant;
    -  private int count = 0;
    -  public Chef(Restaurant r) { restaurant = r; }
    -  @Override
    -  public void run() {
    -    try {
    -      while(!Thread.interrupted()) {
    -        synchronized(this) {
    -          while(restaurant.meal != null)
    -            wait(); // ... for the meal to be taken
    -        }
    -        if(++count == 10) {
    -          System.out.println("Out of food, closing");
    -          restaurant.exec.shutdownNow();
    -        }
    -        System.out.print("Order up! ");
    -        synchronized(restaurant.waitPerson) {
    -          restaurant.meal = new Meal(count);
    -          restaurant.waitPerson.notifyAll();
    -        }
    -        TimeUnit.MILLISECONDS.sleep(100);
    -      }
    -    } catch(InterruptedException e) {
    -      System.out.println("Chef interrupted");
    -    }
    -  }
    -}
    -
    -public class Restaurant {
    -  Meal meal;
    -  ExecutorService exec = Executors.newCachedThreadPool();
    -  WaitPerson waitPerson = new WaitPerson(this);
    -  Chef chef = new Chef(this);
    -  public Restaurant() {
    -    exec.execute(chef);
    -    exec.execute(waitPerson);
    -  }
    -  public static void main(String[] args) {
    -    new Restaurant();
    -  }
    -}
    -/* Output:
    -Order up! Waitperson got Meal 1
    -Order up! Waitperson got Meal 2
    -Order up! Waitperson got Meal 3
    -Order up! Waitperson got Meal 4
    -Order up! Waitperson got Meal 5
    -Order up! Waitperson got Meal 6
    -Order up! Waitperson got Meal 7
    -Order up! Waitperson got Meal 8
    -Order up! Waitperson got Meal 9
    -Out of food, closing
    -Order up! WaitPerson interrupted
    -Chef interrupted
    -*/
    diff --git a/lowlevel/ToastOMatic.java b/lowlevel/ToastOMatic.java
    deleted file mode 100644
    index 9badee5c1..000000000
    --- a/lowlevel/ToastOMatic.java
    +++ /dev/null
    @@ -1,204 +0,0 @@
    -// lowlevel/ToastOMatic.java
    -// (c)2017 MindView LLC: see Copyright.txt
    -// We make no guarantees that this code is fit for any purpose.
    -// Visit http://OnJava8.com for more book information.
    -// A toaster that uses queues
    -import java.util.concurrent.*;
    -import java.util.*;
    -
    -class Toast {
    -  public enum Status { DRY, BUTTERED, JAMMED }
    -  private Status status = Status.DRY;
    -  private final int id;
    -  public Toast(int idn) { id = idn; }
    -  public void butter() { status = Status.BUTTERED; }
    -  public void jam() { status = Status.JAMMED; }
    -  public Status getStatus() { return status; }
    -  public int getId() { return id; }
    -  @Override
    -  public String toString() {
    -    return "Toast " + id + ": " + status;
    -  }
    -}
    -
    -class ToastQueue extends LinkedBlockingQueue {}
    -
    -class Toaster implements Runnable {
    -  private ToastQueue toastQueue;
    -  private int count = 0;
    -  private SplittableRandom rand = new SplittableRandom(47);
    -  public Toaster(ToastQueue tq) { toastQueue = tq; }
    -  @Override
    -  public void run() {
    -    try {
    -      while(!Thread.interrupted()) {
    -        TimeUnit.MILLISECONDS.sleep(
    -          100 + rand.nextInt(500));
    -        // Make toast
    -        Toast t = new Toast(count++);
    -        System.out.println(t);
    -        // Insert into queue
    -        toastQueue.put(t);
    -      }
    -    } catch(InterruptedException e) {
    -      System.out.println("Toaster interrupted");
    -    }
    -    System.out.println("Toaster off");
    -  }
    -}
    -
    -// Apply butter to toast:
    -class Butterer implements Runnable {
    -  private ToastQueue dryQueue, butteredQueue;
    -  public Butterer(ToastQueue dry, ToastQueue buttered) {
    -    dryQueue = dry;
    -    butteredQueue = buttered;
    -  }
    -  @Override
    -  public void run() {
    -    try {
    -      while(!Thread.interrupted()) {
    -        // Blocks until next piece of toast is available:
    -        Toast t = dryQueue.take();
    -        t.butter();
    -        System.out.println(t);
    -        butteredQueue.put(t);
    -      }
    -    } catch(InterruptedException e) {
    -      System.out.println("Butterer interrupted");
    -    }
    -    System.out.println("Butterer off");
    -  }
    -}
    -
    -// Apply jam to buttered toast:
    -class Jammer implements Runnable {
    -  private ToastQueue butteredQueue, finishedQueue;
    -  public
    -  Jammer(ToastQueue buttered, ToastQueue finished) {
    -    butteredQueue = buttered;
    -    finishedQueue = finished;
    -  }
    -  @Override
    -  public void run() {
    -    try {
    -      while(!Thread.interrupted()) {
    -        // Blocks until next piece of toast is available:
    -        Toast t = butteredQueue.take();
    -        t.jam();
    -        System.out.println(t);
    -        finishedQueue.put(t);
    -      }
    -    } catch(InterruptedException e) {
    -      System.out.println("Jammer interrupted");
    -    }
    -    System.out.println("Jammer off");
    -  }
    -}
    -
    -// Consume the toast:
    -class Eater implements Runnable {
    -  private ToastQueue finishedQueue;
    -  private int counter = 0;
    -  public Eater(ToastQueue finished) {
    -    finishedQueue = finished;
    -  }
    -  @Override
    -  public void run() {
    -    try {
    -      while(!Thread.interrupted()) {
    -        // Blocks until next piece of toast is available:
    -        Toast t = finishedQueue.take();
    -        // Verify that the toast is coming in order,
    -        // and that all pieces are getting jammed:
    -        if(t.getId() != counter++ ||
    -           t.getStatus() != Toast.Status.JAMMED) {
    -          System.out.println(">>>> Error: " + t);
    -          System.exit(1);
    -        } else
    -          System.out.println("Chomp! " + t);
    -      }
    -    } catch(InterruptedException e) {
    -      System.out.println("Eater interrupted");
    -    }
    -    System.out.println("Eater off");
    -  }
    -}
    -
    -public class ToastOMatic {
    -  public static void
    -  main(String[] args) throws Exception {
    -    ToastQueue dryQueue = new ToastQueue(),
    -               butteredQueue = new ToastQueue(),
    -               finishedQueue = new ToastQueue();
    -    ExecutorService es = Executors.newCachedThreadPool();
    -    es.execute(new Toaster(dryQueue));
    -    es.execute(new Butterer(dryQueue, butteredQueue));
    -    es.execute(new Jammer(butteredQueue, finishedQueue));
    -    es.execute(new Eater(finishedQueue));
    -    TimeUnit.SECONDS.sleep(5);
    -    es.shutdownNow();
    -  }
    -}
    -/* Output:
    -Toast 0: DRY
    -Toast 0: BUTTERED
    -Toast 0: JAMMED
    -Chomp! Toast 0: JAMMED
    -Toast 1: DRY
    -Toast 1: BUTTERED
    -Toast 1: JAMMED
    -Chomp! Toast 1: JAMMED
    -Toast 2: DRY
    -Toast 2: BUTTERED
    -Toast 2: JAMMED
    -Chomp! Toast 2: JAMMED
    -Toast 3: DRY
    -Toast 3: BUTTERED
    -Toast 3: JAMMED
    -Chomp! Toast 3: JAMMED
    -Toast 4: DRY
    -Toast 4: BUTTERED
    -Toast 4: JAMMED
    -Chomp! Toast 4: JAMMED
    -Toast 5: DRY
    -Toast 5: BUTTERED
    -Toast 5: JAMMED
    -Chomp! Toast 5: JAMMED
    -Toast 6: DRY
    -Toast 6: BUTTERED
    -Toast 6: JAMMED
    -Chomp! Toast 6: JAMMED
    -Toast 7: DRY
    -Toast 7: BUTTERED
    -Toast 7: JAMMED
    -Chomp! Toast 7: JAMMED
    -Toast 8: DRY
    -Toast 8: BUTTERED
    -Toast 8: JAMMED
    -Chomp! Toast 8: JAMMED
    -Toast 9: DRY
    -Toast 9: BUTTERED
    -Toast 9: JAMMED
    -Chomp! Toast 9: JAMMED
    -Toast 10: DRY
    -Toast 10: BUTTERED
    -Toast 10: JAMMED
    -Chomp! Toast 10: JAMMED
    -Toast 11: DRY
    -Toast 11: BUTTERED
    -Toast 11: JAMMED
    -Chomp! Toast 11: JAMMED
    -Toast 12: DRY
    -Toast 12: BUTTERED
    -Toast 12: JAMMED
    -Chomp! Toast 12: JAMMED
    -Eater interrupted
    -Eater off
    -Jammer interrupted
    -Jammer off
    -Toaster interrupted
    -Butterer interrupted
    -Butterer off
    -Toaster off
    -*/
    diff --git a/lowlevel/restaurant2/RestaurantWithQueues.java b/lowlevel/restaurant2/RestaurantWithQueues.java
    deleted file mode 100644
    index cebe83559..000000000
    --- a/lowlevel/restaurant2/RestaurantWithQueues.java
    +++ /dev/null
    @@ -1,230 +0,0 @@
    -// lowlevel/restaurant2/RestaurantWithQueues.java
    -// (c)2017 MindView LLC: see Copyright.txt
    -// We make no guarantees that this code is fit for any purpose.
    -// Visit http://OnJava8.com for more book information.
    -// {java threads.restaurant2.RestaurantWithQueues 5}
    -package threads.restaurant2;
    -import enums.menu.*;
    -import java.util.concurrent.*;
    -import java.util.*;
    -
    -// This is given to the waiter, who gives it to the chef:
    -class Order { // (A data-transfer object)
    -  private static int counter = 0;
    -  private final int id = counter++;
    -  private final Customer customer;
    -  private final WaitPerson waitPerson;
    -  private final Food food;
    -  public Order(Customer cust, WaitPerson wp, Food f) {
    -    customer = cust;
    -    waitPerson = wp;
    -    food = f;
    -  }
    -  public Food item() { return food; }
    -  public Customer getCustomer() { return customer; }
    -  public WaitPerson getWaitPerson() { return waitPerson; }
    -  @Override
    -  public String toString() {
    -    return "Order: " + id + " item: " + food +
    -      " for: " + customer +
    -      " served by: " + waitPerson;
    -  }
    -}
    -
    -// This comes back from the chef:
    -class Plate {
    -  private final Order order;
    -  private final Food food;
    -  public Plate(Order ord, Food f) {
    -    order = ord;
    -    food = f;
    -  }
    -  public Order getOrder() { return order; }
    -  public Food getFood() { return food; }
    -  @Override
    -  public String toString() { return food.toString(); }
    -}
    -
    -class Customer implements Runnable {
    -  private static int counter = 0;
    -  private final int id = counter++;
    -  private final WaitPerson waitPerson;
    -  // Only one course at a time can be received:
    -  private SynchronousQueue placeSetting =
    -    new SynchronousQueue<>();
    -  public Customer(WaitPerson w) { waitPerson = w; }
    -  public void
    -  deliver(Plate p) throws InterruptedException {
    -    // Only blocks if customer is still
    -    // eating the previous course:
    -    placeSetting.put(p);
    -  }
    -  @Override
    -  public void run() {
    -    for(Course course : Course.values()) {
    -      Food food = course.randomSelection();
    -      try {
    -        waitPerson.placeOrder(this, food);
    -        // Blocks until course is delivered:
    -        System.out.println(
    -          this + "eating " + placeSetting.take());
    -      } catch(InterruptedException e) {
    -        System.out.println(this + "waiting for " +
    -          course + " interrupted");
    -        break;
    -      }
    -    }
    -    System.out.println(this + "finished meal, leaving");
    -  }
    -  @Override
    -  public String toString() {
    -    return "Customer " + id + " ";
    -  }
    -}
    -
    -class WaitPerson implements Runnable {
    -  private static int counter = 0;
    -  private final int id = counter++;
    -  private final Restaurant restaurant;
    -  BlockingQueue filledOrders =
    -    new LinkedBlockingQueue<>();
    -  public WaitPerson(Restaurant rest) {
    -    restaurant = rest;
    -  }
    -  public void placeOrder(Customer cust, Food food) {
    -    try {
    -      // Shouldn't actually block because this is
    -      // a LinkedBlockingQueue with no size limit:
    -      restaurant.orders.put(new Order(cust, this, food));
    -    } catch(InterruptedException e) {
    -      System.out.println(
    -        this + " placeOrder interrupted");
    -    }
    -  }
    -  @Override
    -  public void run() {
    -    try {
    -      while(!Thread.interrupted()) {
    -        // Blocks until a course is ready
    -        Plate plate = filledOrders.take();
    -        System.out.println(this + "received " + plate +
    -          " delivering to " +
    -          plate.getOrder().getCustomer());
    -        plate.getOrder().getCustomer().deliver(plate);
    -      }
    -    } catch(InterruptedException e) {
    -      System.out.println(this + " interrupted");
    -    }
    -    System.out.println(this + " off duty");
    -  }
    -  @Override
    -  public String toString() {
    -    return "WaitPerson " + id + " ";
    -  }
    -}
    -
    -class Chef implements Runnable {
    -  private static int counter = 0;
    -  private final int id = counter++;
    -  private final Restaurant restaurant;
    -  private static SplittableRandom rand = new SplittableRandom(47);
    -  public Chef(Restaurant rest) { restaurant = rest; }
    -  @Override
    -  public void run() {
    -    try {
    -      while(!Thread.interrupted()) {
    -        // Blocks until an order appears:
    -        Order order = restaurant.orders.take();
    -        Food requestedItem = order.item();
    -        // Time to prepare order:
    -        TimeUnit.MILLISECONDS.sleep(rand.nextInt(500));
    -        Plate plate = new Plate(order, requestedItem);
    -        order.getWaitPerson().filledOrders.put(plate);
    -      }
    -    } catch(InterruptedException e) {
    -      System.out.println(this + " interrupted");
    -    }
    -    System.out.println(this + " off duty");
    -  }
    -  @Override
    -  public String toString() { return "Chef " + id + " "; }
    -}
    -
    -class Restaurant implements Runnable {
    -  private List waitPersons =
    -    new ArrayList<>();
    -  private List chefs = new ArrayList<>();
    -  private ExecutorService exec;
    -  private static SplittableRandom rand = new SplittableRandom(47);
    -  BlockingQueue
    -    orders = new LinkedBlockingQueue<>();
    -  public Restaurant(ExecutorService e, int nWaitPersons,
    -    int nChefs) {
    -    exec = e;
    -    for(int i = 0; i < nWaitPersons; i++) {
    -      WaitPerson waitPerson = new WaitPerson(this);
    -      waitPersons.add(waitPerson);
    -      exec.execute(waitPerson);
    -    }
    -    for(int i = 0; i < nChefs; i++) {
    -      Chef chef = new Chef(this);
    -      chefs.add(chef);
    -      exec.execute(chef);
    -    }
    -  }
    -  @Override
    -  public void run() {
    -    try {
    -      while(!Thread.interrupted()) {
    -        // A new customer arrives; assign a WaitPerson:
    -        WaitPerson wp = waitPersons.get(
    -          rand.nextInt(waitPersons.size()));
    -        Customer c = new Customer(wp);
    -        exec.execute(c);
    -        TimeUnit.MILLISECONDS.sleep(100);
    -      }
    -    } catch(InterruptedException e) {
    -      System.out.println("Restaurant interrupted");
    -    }
    -    System.out.println("Restaurant closing");
    -  }
    -}
    -
    -public class RestaurantWithQueues {
    -  public static void
    -  main(String[] args) throws Exception {
    -    ExecutorService es = Executors.newCachedThreadPool();
    -    Restaurant restaurant = new Restaurant(es, 5, 2);
    -    es.execute(restaurant);
    -    if(args.length > 0) // Optional argument
    -      TimeUnit.SECONDS.sleep(new Integer(args[0]));
    -    else {
    -      System.out.println("Press 'Enter' to quit");
    -      System.in.read();
    -    }
    -    es.shutdownNow();
    -  }
    -}
    -/* Output: (First and Last 10 Lines)
    -WaitPerson 0 received SALAD delivering to Customer 0
    -Customer 0 eating SALAD
    -WaitPerson 2 received SPRING_ROLLS delivering to Customer 1
    -Customer 1 eating SPRING_ROLLS
    -WaitPerson 1 received SOUP delivering to Customer 2
    -Customer 2 eating SOUP
    -WaitPerson 0 received LENTILS delivering to Customer 0
    -Customer 0 eating LENTILS
    -WaitPerson 0 received SPRING_ROLLS delivering to Customer 3
    -Customer 3 eating SPRING_ROLLS
    -...________...________...________...________...
    -WaitPerson 2  off duty
    -Customer 33 finished meal, leaving
    -Customer 18 finished meal, leaving
    -Customer 35 finished meal, leaving
    -Customer 46 finished meal, leaving
    -WaitPerson 4  off duty
    -Customer 24 finished meal, leaving
    -Customer 30 finished meal, leaving
    -Customer 34 finished meal, leaving
    -Customer 48 finished meal, leaving
    -*/
    
    From 8c4b4e789618c273e258f13680a69fe9d517b88b Mon Sep 17 00:00:00 2001
    From: Bruce Eckel 
    Date: Sat, 31 Dec 2016 14:57:31 -0800
    Subject: [PATCH 178/320] Added QuittingCompletable.java
    
    ---
     concurrent/ParallelStreamPuzzle2.java | 14 ++++++-----
     concurrent/QuittingCompletable.java   | 35 +++++++++++++++++++++++++++
     concurrent/Summing.java               |  8 +++---
     concurrent/Summing2.java              |  8 +++---
     files/PathAnalysis.java               |  2 +-
     onjava/RmDir.java                     | 28 ++++++++++-----------
     6 files changed, 66 insertions(+), 29 deletions(-)
     create mode 100644 concurrent/QuittingCompletable.java
    
    diff --git a/concurrent/ParallelStreamPuzzle2.java b/concurrent/ParallelStreamPuzzle2.java
    index 237af9e22..f1fb00cf2 100644
    --- a/concurrent/ParallelStreamPuzzle2.java
    +++ b/concurrent/ParallelStreamPuzzle2.java
    @@ -9,7 +9,7 @@
     import java.nio.file.*;
     
     public class ParallelStreamPuzzle2 {
    -  public static ConcurrentLinkedDeque trace =
    +  public static Deque trace =
         new ConcurrentLinkedDeque<>();
       static class
       IntGenerator implements Supplier {
    @@ -20,11 +20,13 @@ public synchronized Integer get() {  // [1]
           return current++;
         }
       }
    -  public static void main(String[] args) throws Exception {
    -    List x = Stream.generate(new IntGenerator())
    -      .limit(10)
    -      .parallel()
    -      .collect(Collectors.toList());
    +  public static void
    +  main(String[] args) throws Exception {
    +    List x =
    +      Stream.generate(new IntGenerator())
    +        .limit(10)
    +        .parallel()
    +        .collect(Collectors.toList());
         System.out.println(x);
         Files.write(Paths.get("PSP2.txt"), trace);
       }
    diff --git a/concurrent/QuittingCompletable.java b/concurrent/QuittingCompletable.java
    new file mode 100644
    index 000000000..539c0998e
    --- /dev/null
    +++ b/concurrent/QuittingCompletable.java
    @@ -0,0 +1,35 @@
    +// concurrent/QuittingCompletable.java
    +// (c)2017 MindView LLC: see Copyright.txt
    +// We make no guarantees that this code is fit for any purpose.
    +// Visit http://OnJava8.com for more book information.
    +import java.util.*;
    +import java.util.stream.*;
    +import java.util.concurrent.*;
    +import onjava.Nap;
    +
    +public class QuittingCompletable {
    +  public static void main(String[] args) {
    +    List tasks =
    +      IntStream.range(1, QuittingTasks.COUNT)
    +        .mapToObj(QuittableTask::new)
    +        .collect(Collectors.toList());
    +    List> cfutures =
    +      tasks.stream()
    +        .map(CompletableFuture::runAsync)
    +        .collect(Collectors.toList());
    +    new Nap(1000);
    +    tasks.forEach(QuittableTask::quit);
    +    cfutures.forEach(CompletableFuture::join);
    +  }
    +}
    +/* Output:
    +125 148 115 127 120 118 106 140 77 119 97 80 143 17 92 147
    +89 123 16 12 138 25 13 101 135 96 76 73 130 133 37 132 134
    +149 137 122 29 49 60 40 142 131 53 1 98 145 126 65 5 64 82
    +79 68 86 141 61 128 22 7 26 19 139 114 146 14 15 43 34 10
    +75 87 90 31 47 38 62 18 63 41 42 144 66 23 6 4 91 70 83 102
    +103 54 69 74 56 71 94 88 78 81 57 52 93 45 48 44 32 28 36
    +33 104 105 112 109 100 117 24 108 21 116 20 9 85 8 84 72
    +107 113 121 124 136 129 99 95 55 3 27 2 59 67 50 58 51 39
    +30 35 46 110 111 11
    +*/
    diff --git a/concurrent/Summing.java b/concurrent/Summing.java
    index 14202a529..937a4898e 100644
    --- a/concurrent/Summing.java
    +++ b/concurrent/Summing.java
    @@ -7,18 +7,18 @@
     import onjava.Timer;
     
     public class Summing {
    -  static volatile long x;
    +  static volatile long result;
       static void timeTest(String id, long checkValue,
         LongSupplier operation) {
         System.out.print(id + ": ");
         Timer timer = new Timer();
    -    long result = operation.getAsLong();
    +     // Prevent optimization:
    +    result = operation.getAsLong();
         if(result == checkValue)
           System.out.println(timer.duration() + "ms");
         else
           System.out.format("result: %d%ncheckValue: %d%n",
             result, checkValue);
    -    x = result; // Prevent optimization
       }
       public static final int SZ = 100_000_000;
       // This even works:
    @@ -34,7 +34,7 @@ public static void main(String[] args) {
         timeTest("Sum Iterated", CHECK, () ->
           LongStream.iterate(0, i -> i + 1)
             .limit(SZ+1).sum());
    -    // Takes longer, runs out of memory above 1_000_000:
    +    // Slower & runs out of memory above 1_000_000:
         // timeTest("Sum Iterated Parallel", CHECK, () ->
         //   LongStream.iterate(0, i -> i + 1)
         //     .parallel()
    diff --git a/concurrent/Summing2.java b/concurrent/Summing2.java
    index c6ea6179d..a361a660b 100644
    --- a/concurrent/Summing2.java
    +++ b/concurrent/Summing2.java
    @@ -36,8 +36,8 @@ public static void main(String[] args) {
     }
     /* Output:
     200000010000000
    -Array Stream Sum: 22ms
    -Parallel: 21ms
    -Basic Sum: 16ms
    -parallelPrefix: 116ms
    +Array Stream Sum: 104ms
    +Parallel: 81ms
    +Basic Sum: 106ms
    +parallelPrefix: 265ms
     */
    diff --git a/files/PathAnalysis.java b/files/PathAnalysis.java
    index d1de44152..b76be5519 100644
    --- a/files/PathAnalysis.java
    +++ b/files/PathAnalysis.java
    @@ -32,7 +32,7 @@ static void say(String id, Object result) {
         if(Files.isSymbolicLink(p))
           say("SymbolicLink", Files.readSymbolicLink(p));
         if(FileSystems.getDefault()
    -        .supportedFileAttributeViews().contains("posix"))
    +       .supportedFileAttributeViews().contains("posix"))
           say("PosixFilePermissions",
             Files.getPosixFilePermissions(p));
       }
    diff --git a/onjava/RmDir.java b/onjava/RmDir.java
    index 89a495d48..45cae6d27 100644
    --- a/onjava/RmDir.java
    +++ b/onjava/RmDir.java
    @@ -10,20 +10,20 @@
     public class RmDir {
       public static void rmdir(Path dir) throws IOException {
         Files.walkFileTree(dir,new SimpleFileVisitor() {
    -       @Override
    -       public FileVisitResult
    -       visitFile(Path file, BasicFileAttributes attrs)
    -       throws IOException {
    -           Files.delete(file);
    -           return FileVisitResult.CONTINUE;
    -       }
    -       @Override
    -       public FileVisitResult
    -       postVisitDirectory(Path dir, IOException exc)
    -       throws IOException {
    -           Files.delete(dir);
    -           return FileVisitResult.CONTINUE;
    -       }
    +      @Override
    +      public FileVisitResult
    +      visitFile(Path file, BasicFileAttributes attrs)
    +      throws IOException {
    +        Files.delete(file);
    +        return FileVisitResult.CONTINUE;
    +      }
    +      @Override
    +      public FileVisitResult
    +      postVisitDirectory(Path dir, IOException exc)
    +      throws IOException {
    +        Files.delete(dir);
    +        return FileVisitResult.CONTINUE;
    +      }
         });
       }
     }
    
    From 620703ef6f7b2db87d21e4fca722904dd390dc7a Mon Sep 17 00:00:00 2001
    From: Bruce Eckel 
    Date: Mon, 2 Jan 2017 14:20:31 -0800
    Subject: [PATCH 179/320] eliminated volatile
    
    ---
     concurrent/Summing.java | 4 +---
     1 file changed, 1 insertion(+), 3 deletions(-)
    
    diff --git a/concurrent/Summing.java b/concurrent/Summing.java
    index 937a4898e..286861cd0 100644
    --- a/concurrent/Summing.java
    +++ b/concurrent/Summing.java
    @@ -7,13 +7,11 @@
     import onjava.Timer;
     
     public class Summing {
    -  static volatile long result;
       static void timeTest(String id, long checkValue,
         LongSupplier operation) {
         System.out.print(id + ": ");
         Timer timer = new Timer();
    -     // Prevent optimization:
    -    result = operation.getAsLong();
    +    long result = operation.getAsLong();
         if(result == checkValue)
           System.out.println(timer.duration() + "ms");
         else
    
    From 65246aea15e39e2cd15f4bdf709ae742f2db0240 Mon Sep 17 00:00:00 2001
    From: Bruce Eckel 
    Date: Mon, 2 Jan 2017 14:20:54 -0800
    Subject: [PATCH 180/320] changed to AtomicInteger
    
    ---
     concurrent/ParallelStreamPuzzle2.java | 12 +++++++-----
     1 file changed, 7 insertions(+), 5 deletions(-)
    
    diff --git a/concurrent/ParallelStreamPuzzle2.java b/concurrent/ParallelStreamPuzzle2.java
    index f1fb00cf2..881e0032c 100644
    --- a/concurrent/ParallelStreamPuzzle2.java
    +++ b/concurrent/ParallelStreamPuzzle2.java
    @@ -6,6 +6,7 @@
     import java.util.function.*;
     import java.util.stream.*;
     import java.util.concurrent.*;
    +import java.util.concurrent.atomic.*;
     import java.nio.file.*;
     
     public class ParallelStreamPuzzle2 {
    @@ -13,11 +14,12 @@ public class ParallelStreamPuzzle2 {
         new ConcurrentLinkedDeque<>();
       static class
       IntGenerator implements Supplier {
    -    private int current = 0;
    -    public synchronized Integer get() {  // [1]
    -      trace.add(current + ": " +
    +    private AtomicInteger current =
    +      new AtomicInteger();
    +    public Integer get() {
    +      trace.add(current.get() + ": " +
             Thread.currentThread().getName());
    -      return current++;
    +      return current.getAndIncrement();
         }
       }
       public static void
    @@ -32,5 +34,5 @@ public synchronized Integer get() {  // [1]
       }
     }
     /* Output:
    -[2, 3, 4, 5, 6, 7, 8, 9, 10, 63]
    +[4, 25, 27, 32, 37, 44, 49, 56, 61, 73]
     */
    
    From 5de72c00d7a47dd94cda28adc75b1d3e58014512 Mon Sep 17 00:00:00 2001
    From: Bruce Eckel 
    Date: Mon, 2 Jan 2017 14:21:29 -0800
    Subject: [PATCH 181/320] added return operations
    
    ---
     concurrent/DualCompletableOperations.java | 37 ++++++++++++-----------
     1 file changed, 20 insertions(+), 17 deletions(-)
    
    diff --git a/concurrent/DualCompletableOperations.java b/concurrent/DualCompletableOperations.java
    index 0aa9ebf1e..118c3ad9f 100644
    --- a/concurrent/DualCompletableOperations.java
    +++ b/concurrent/DualCompletableOperations.java
    @@ -3,6 +3,7 @@
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.concurrent.*;
    +import static onjava.CompletableUtilities.*;
     
     public class DualCompletableOperations {
       static CompletableFuture cfA, cfB;
    @@ -17,41 +18,41 @@ static void join() {
       }
       public static void main(String[] args) {
         init();
    -    cfA.runAfterEitherAsync(cfB, () ->
    -      System.out.println("runAfterEither"));
    +    voidr(cfA.runAfterEitherAsync(cfB, () ->
    +      System.out.println("runAfterEither")));
         join();
     
         init();
    -    cfA.runAfterBothAsync(cfB, () ->
    -      System.out.println("runAfterBoth"));
    +    voidr(cfA.runAfterBothAsync(cfB, () ->
    +      System.out.println("runAfterBoth")));
         join();
     
         init();
    -    cfA.applyToEitherAsync(cfB, w -> {
    +    showr(cfA.applyToEitherAsync(cfB, w -> {
           System.out.println("applyToEither: " + w);
           return w;
    -    });
    +    }));
         join();
     
         init();
    -    cfA.acceptEitherAsync(cfB, w -> {
    +    voidr(cfA.acceptEitherAsync(cfB, w -> {
           System.out.println("acceptEither: " + w);
    -    });
    +    }));
         join();
     
         init();
    -    cfA.thenAcceptBothAsync(cfB, (w1, w2) -> {
    +    voidr(cfA.thenAcceptBothAsync(cfB, (w1, w2) -> {
           System.out.println("thenAcceptBoth: "
             + w1 + ", " + w2);
    -    });
    +    }));
         join();
     
         init();
    -    cfA.thenCombineAsync(cfB, (w1, w2) -> {
    +    showr(cfA.thenCombineAsync(cfB, (w1, w2) -> {
           System.out.println("thenCombine: "
             + w1 + ", " + w2);
           return w1;
    -    });
    +    }));
         join();
     
         init();
    @@ -79,10 +80,11 @@ public static void main(String[] args) {
     *****************
     Workable[BW]
     Workable[AW]
    -*****************
     runAfterBoth
    +*****************
     Workable[BW]
     applyToEither: Workable[BW]
    +Workable[BW]
     Workable[AW]
     *****************
     Workable[BW]
    @@ -91,21 +93,22 @@ public static void main(String[] args) {
     *****************
     Workable[BW]
     Workable[AW]
    -*****************
     thenAcceptBoth: Workable[AW], Workable[BW]
    +*****************
     Workable[BW]
     Workable[AW]
    -*****************
     thenCombine: Workable[AW], Workable[BW]
    +Workable[AW]
    +*****************
     Workable[CW]
     anyOf
    -Workable[DW]
     Workable[BW]
    +Workable[DW]
     Workable[AW]
     *****************
     Workable[CW]
    -Workable[DW]
     Workable[BW]
    +Workable[DW]
     Workable[AW]
     *****************
     allOf
    
    From 8268b577c98801c332e6d41f14480d2d4154123b Mon Sep 17 00:00:00 2001
    From: Bruce Eckel 
    Date: Mon, 2 Jan 2017 14:22:17 -0800
    Subject: [PATCH 182/320] Separated into their own utility class
    
    ---
     concurrent/CompletableOperations.java | 21 +++------------------
     concurrent/CompletableUtilities.java  | 27 +++++++++++++++++++++++++++
     2 files changed, 30 insertions(+), 18 deletions(-)
     create mode 100644 concurrent/CompletableUtilities.java
    
    diff --git a/concurrent/CompletableOperations.java b/concurrent/CompletableOperations.java
    index 18e3baaa6..3d3e3f487 100644
    --- a/concurrent/CompletableOperations.java
    +++ b/concurrent/CompletableOperations.java
    @@ -3,6 +3,7 @@
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.concurrent.*;
    +import static onjava.CompletableUtilities.*;
     
     public class CompletableOperations {
       static CompletableFuture cfi(int i) {
    @@ -10,30 +11,14 @@ static CompletableFuture cfi(int i) {
           CompletableFuture.completedFuture(
             new Integer(i));
       }
    -  // Get and show value stored in a CF:
    -  static void showr(CompletableFuture c) {
    -    try {
    -      System.out.println(c.get());
    -    } catch(InterruptedException
    -            | ExecutionException e) {
    -      throw new RuntimeException(e);
    -    }
    -  }
    -  // For CF operations that have no value:
    -  static void voidr(CompletableFuture c) {
    -    try {
    -      c.get(); // Returns void
    -    } catch(InterruptedException
    -            | ExecutionException e) {
    -      throw new RuntimeException(e);
    -    }
    -  }
       public static void main(String[] args) {
         showr(cfi(1)); // Basic test
         voidr(cfi(2).runAsync(() ->
           System.out.println("runAsync")));
         voidr(cfi(3).thenRunAsync(() ->
           System.out.println("thenRunAsync")));
    +    voidr(CompletableFuture.runAsync(() ->
    +      System.out.println("runAsync is static")));
         showr(CompletableFuture.supplyAsync(() -> 99));
         voidr(cfi(4).thenAcceptAsync(i ->
           System.out.println("thenAcceptAsync: " + i)));
    diff --git a/concurrent/CompletableUtilities.java b/concurrent/CompletableUtilities.java
    new file mode 100644
    index 000000000..3ee2ab6dc
    --- /dev/null
    +++ b/concurrent/CompletableUtilities.java
    @@ -0,0 +1,27 @@
    +// concurrent/CompletableUtilities.java
    +// (c)2017 MindView LLC: see Copyright.txt
    +// We make no guarantees that this code is fit for any purpose.
    +// Visit http://OnJava8.com for more book information.
    +package onjava;
    +import java.util.concurrent.*;
    +
    +public class CompletableUtilities {
    +  // Get and show value stored in a CF:
    +  public static void showr(CompletableFuture c) {
    +    try {
    +      System.out.println(c.get());
    +    } catch(InterruptedException
    +            | ExecutionException e) {
    +      throw new RuntimeException(e);
    +    }
    +  }
    +  // For CF operations that have no value:
    +  public static void voidr(CompletableFuture c) {
    +    try {
    +      c.get(); // Returns void
    +    } catch(InterruptedException
    +            | ExecutionException e) {
    +      throw new RuntimeException(e);
    +    }
    +  }
    +}
    
    From 45d4e5d85ba8f7420c3b0bf456ee3107174c32f5 Mon Sep 17 00:00:00 2001
    From: Bruce Eckel 
    Date: Mon, 2 Jan 2017 14:22:25 -0800
    Subject: [PATCH 183/320] touch-ups
    
    ---
     concurrent/Batter.java                     | 12 ++++++------
     concurrent/CatchCompletableExceptions.java |  4 ++--
     concurrent/CompletedMachina.java           |  4 ++--
     concurrent/FrostedCake.java                |  4 ++--
     4 files changed, 12 insertions(+), 12 deletions(-)
    
    diff --git a/concurrent/Batter.java b/concurrent/Batter.java
    index 6c5d84a63..6b8c5b2e5 100644
    --- a/concurrent/Batter.java
    +++ b/concurrent/Batter.java
    @@ -14,16 +14,16 @@ static  T prepare(T ingredient) {
         new Nap(100);
         return ingredient;
       }
    -  static  CompletableFuture cf(T ingredient) {
    +  static  CompletableFuture prep(T ingredient) {
         return CompletableFuture
           .completedFuture(ingredient)
    -      .thenApply(Batter::prepare);
    +      .thenApplyAsync(Batter::prepare);
       }
       public static CompletableFuture mix() {
    -    CompletableFuture eggs = cf(new Eggs());
    -    CompletableFuture milk = cf(new Milk());
    -    CompletableFuture sugar = cf(new Sugar());
    -    CompletableFuture flour = cf(new Flour());
    +    CompletableFuture eggs = prep(new Eggs());
    +    CompletableFuture milk = prep(new Milk());
    +    CompletableFuture sugar = prep(new Sugar());
    +    CompletableFuture flour = prep(new Flour());
         CompletableFuture
           .allOf(eggs, milk, sugar, flour)
           .join();
    diff --git a/concurrent/CatchCompletableExceptions.java b/concurrent/CatchCompletableExceptions.java
    index c4bfd0318..f0e39d89a 100644
    --- a/concurrent/CatchCompletableExceptions.java
    +++ b/concurrent/CatchCompletableExceptions.java
    @@ -7,8 +7,8 @@
     
     public class CatchCompletableExceptions {
       static void handleException(int failcount) {
    -    // Call Function only if there's an exception,
    -    // Must produce same type as came in:
    +    // Call the Function only if there's an
    +    // exception, must produce same type as came in:
         CompletableExceptions
           .test("exceptionally", failcount)
           .exceptionally((ex) -> { // Function
    diff --git a/concurrent/CompletedMachina.java b/concurrent/CompletedMachina.java
    index 8a7388ad4..efba32c4e 100644
    --- a/concurrent/CompletedMachina.java
    +++ b/concurrent/CompletedMachina.java
    @@ -7,8 +7,8 @@
     public class CompletedMachina {
       public static void main(String[] args) {
         CompletableFuture cf =
    -        CompletableFuture.completedFuture(
    -          new Machina(0));
    +      CompletableFuture.completedFuture(
    +        new Machina(0));
         try {
           Machina m = cf.get();  // Doesn't block
         } catch(InterruptedException |
    diff --git a/concurrent/FrostedCake.java b/concurrent/FrostedCake.java
    index 8df76e080..e35703e50 100644
    --- a/concurrent/FrostedCake.java
    +++ b/concurrent/FrostedCake.java
    @@ -26,7 +26,7 @@ public static void main(String[] args) {
           .thenCombineAsync(Frosting.make(),
             (cake, frosting) ->
               new FrostedCake(cake, frosting))
    -      .thenAcceptAsync(System.out::println).join());
    -      // Need to rewrite...
    +      .thenAcceptAsync(System.out::println)
    +      .join());
       }
     }
    
    From a2a7b53b95a9d0d0889e863b720c820988ada78b Mon Sep 17 00:00:00 2001
    From: Bruce Eckel 
    Date: Tue, 3 Jan 2017 10:50:09 -0800
    Subject: [PATCH 184/320] Cleanup and fixes
    
    ---
     lowlevel/Atomicity.java               | 10 ++++-----
     lowlevel/AtomicityTest.java           |  7 ++++--
     lowlevel/CriticalSection.java         |  4 ++--
     lowlevel/ExplicitCriticalSection.java |  4 ++--
     lowlevel/QuittableTask.java           | 16 --------------
     lowlevel/QuittingTasks.java           | 31 ---------------------------
     6 files changed, 14 insertions(+), 58 deletions(-)
     delete mode 100644 lowlevel/QuittableTask.java
     delete mode 100644 lowlevel/QuittingTasks.java
    
    diff --git a/lowlevel/Atomicity.java b/lowlevel/Atomicity.java
    index ead737124..ea4a5e20b 100644
    --- a/lowlevel/Atomicity.java
    +++ b/lowlevel/Atomicity.java
    @@ -16,26 +16,26 @@ public class Atomicity {
       public Atomicity();
         Code:
            0: aload_0
    -       1: invokespecial #1                  // Method
    +       1: invokespecial #1     // Method
     java/lang/Object."":()V
            4: return
       void f1();
         Code:
            0: aload_0
            1: dup
    -       2: getfield      #2                  // Field i:I
    +       2: getfield      #2     // Field i:I
            5: iconst_1
            6: iadd
    -       7: putfield      #2                  // Field i:I
    +       7: putfield      #2     // Field i:I
           10: return
       void f2();
         Code:
            0: aload_0
            1: dup
    -       2: getfield      #2                  // Field i:I
    +       2: getfield      #2     // Field i:I
            5: iconst_3
            6: iadd
    -       7: putfield      #2                  // Field i:I
    +       7: putfield      #2     // Field i:I
           10: return
     }
     */
    diff --git a/lowlevel/AtomicityTest.java b/lowlevel/AtomicityTest.java
    index 24dee7ab8..0174f9617 100644
    --- a/lowlevel/AtomicityTest.java
    +++ b/lowlevel/AtomicityTest.java
    @@ -8,7 +8,9 @@
     public class AtomicityTest implements Runnable {
       private int i = 0;
       public int getValue() { return i; }
    -  private synchronized void evenIncrement() { i++; i++; }
    +  private synchronized void evenIncrement() {
    +    i++; i++;
    +  }
       @Override
       public void run() {
         while(true)
    @@ -16,7 +18,8 @@ public void run() {
       }
       public static void main(String[] args) {
         new TimedAbort(4);
    -    ExecutorService es = Executors.newCachedThreadPool();
    +    ExecutorService es =
    +      Executors.newCachedThreadPool();
         AtomicityTest at = new AtomicityTest();
         es.execute(at);
         while(true) {
    diff --git a/lowlevel/CriticalSection.java b/lowlevel/CriticalSection.java
    index 35a853bfd..044cbf654 100644
    --- a/lowlevel/CriticalSection.java
    +++ b/lowlevel/CriticalSection.java
    @@ -6,8 +6,8 @@
     // Synchronizing blocks instead of entire methods. Also
     // demonstrates protection of a non-thread-safe class
     // with a thread-safe one.
    -// {java threads.CriticalSection}
    -package threads;
    +// {java lowlevel.CriticalSection}
    +package lowlevel;
     import java.util.concurrent.*;
     import java.util.concurrent.atomic.*;
     import java.util.*;
    diff --git a/lowlevel/ExplicitCriticalSection.java b/lowlevel/ExplicitCriticalSection.java
    index 6b2246420..c69d92b9c 100644
    --- a/lowlevel/ExplicitCriticalSection.java
    +++ b/lowlevel/ExplicitCriticalSection.java
    @@ -4,8 +4,8 @@
     // Visit http://OnJava8.com for more book information.
     // {ThrowsException} on a multiprocessor machine
     // Using explicit Lock objects to create critical sections
    -// {java threads.ExplicitCriticalSection}
    -package threads;
    +// {java lowlevel.ExplicitCriticalSection}
    +package lowlevel;
     import java.util.concurrent.locks.*;
     
     // Synchronize the entire method:
    diff --git a/lowlevel/QuittableTask.java b/lowlevel/QuittableTask.java
    deleted file mode 100644
    index 2b9268395..000000000
    --- a/lowlevel/QuittableTask.java
    +++ /dev/null
    @@ -1,16 +0,0 @@
    -// lowlevel/QuittableTask.java
    -// (c)2017 MindView LLC: see Copyright.txt
    -// We make no guarantees that this code is fit for any purpose.
    -// Visit http://OnJava8.com for more book information.
    -import onjava.Nap;
    -
    -public class QuittableTask implements Runnable {
    -  private boolean running = true;
    -  public void quit() { running = false; }
    -  public boolean running() { return running; }
    -  @Override
    -  public void run() {
    -    while(running)
    -      new Nap(100);
    -  }
    -}
    diff --git a/lowlevel/QuittingTasks.java b/lowlevel/QuittingTasks.java
    deleted file mode 100644
    index 107d6cc75..000000000
    --- a/lowlevel/QuittingTasks.java
    +++ /dev/null
    @@ -1,31 +0,0 @@
    -// lowlevel/QuittingTasks.java
    -// (c)2017 MindView LLC: see Copyright.txt
    -// We make no guarantees that this code is fit for any purpose.
    -// Visit http://OnJava8.com for more book information.
    -import java.util.*;
    -import java.util.stream.*;
    -import java.util.concurrent.*;
    -
    -public class QuittingTasks {
    -  public static void main(String[] args)
    -    throws InterruptedException {
    -    ExecutorService exec =
    -      Executors.newCachedThreadPool();
    -    List tasks =
    -      IntStream.range(1, 1000)
    -        .mapToObj(i -> new QuittableTask())
    -        .peek(exec::execute)
    -        .collect(Collectors.toList());
    -    TimeUnit.MILLISECONDS.sleep(100);
    -    tasks.forEach(QuittableTask::quit);
    -    exec.shutdown();
    -    exec.awaitTermination(1, TimeUnit.SECONDS);
    -    // See if any tasks are still running:
    -    System.out.println(
    -      tasks.stream()
    -        .anyMatch(QuittableTask::running));
    -  }
    -}
    -/* Output:
    -false
    -*/
    
    From 52ac9f6dff71335996b73dcb17e35f9e345e0e94 Mon Sep 17 00:00:00 2001
    From: Bruce Eckel 
    Date: Fri, 6 Jan 2017 15:03:36 -0800
    Subject: [PATCH 185/320] Checked exceptions etc. for CFs and Streams
    
    ---
     concurrent/Breakable.java             |  5 +++-
     concurrent/CompletableExceptions.java |  7 +++++
     concurrent/StreamExceptions.java      | 41 ++++++++++++++++++++++++++
     concurrent/ThrowsChecked.java         | 42 +++++++++++++++++++++++++++
     4 files changed, 94 insertions(+), 1 deletion(-)
     create mode 100644 concurrent/StreamExceptions.java
     create mode 100644 concurrent/ThrowsChecked.java
    
    diff --git a/concurrent/Breakable.java b/concurrent/Breakable.java
    index efab6d596..a3b632d7f 100644
    --- a/concurrent/Breakable.java
    +++ b/concurrent/Breakable.java
    @@ -17,9 +17,12 @@ public String toString() {
           " [" + failcount + "]";
       }
       public static Breakable work(Breakable b) {
    -    if(--b.failcount == 0)
    +    if(--b.failcount == 0) {
    +      System.out.println(
    +        "Throwing Exception for " + b.id + "");
           throw new RuntimeException(
             "Breakable_" + b.id + " failed");
    +    }
         System.out.println(b);
         return b;
       }
    diff --git a/concurrent/CompletableExceptions.java b/concurrent/CompletableExceptions.java
    index 407247c0c..b035c5cf3 100644
    --- a/concurrent/CompletableExceptions.java
    +++ b/concurrent/CompletableExceptions.java
    @@ -48,21 +48,28 @@ public static void main(String[] args) {
       }
     }
     /* Output:
    +Throwing Exception for A
     Breakable_B [1]
    +Throwing Exception for B
     Breakable_C [2]
     Breakable_C [1]
    +Throwing Exception for C
     Breakable_D [3]
     Breakable_D [2]
     Breakable_D [1]
    +Throwing Exception for D
     Breakable_E [4]
     Breakable_E [3]
     Breakable_E [2]
     Breakable_E [1]
     Breakable_F [1]
    +Throwing Exception for F
     java.lang.RuntimeException: Breakable_F failed
     Breakable_G [1]
    +Throwing Exception for G
     true
     Breakable_H [1]
    +Throwing Exception for H
     true
     done? false
     java.lang.RuntimeException: forced
    diff --git a/concurrent/StreamExceptions.java b/concurrent/StreamExceptions.java
    new file mode 100644
    index 000000000..372e53fc5
    --- /dev/null
    +++ b/concurrent/StreamExceptions.java
    @@ -0,0 +1,41 @@
    +// concurrent/StreamExceptions.java
    +// (c)2017 MindView LLC: see Copyright.txt
    +// We make no guarantees that this code is fit for any purpose.
    +// Visit http://OnJava8.com for more book information.
    +import java.util.concurrent.*;
    +import java.util.stream.*;
    +import onjava.Nap;
    +
    +public class StreamExceptions {
    +  static Stream
    +  test(String id, int failcount) {
    +    return
    +      Stream.of(new Breakable(id, failcount))
    +        .map(Breakable::work)
    +        .map(Breakable::work)
    +        .map(Breakable::work)
    +        .map(Breakable::work);
    +  }
    +  public static void main(String[] args) {
    +    // No operations are even applied ...
    +    test("A", 1);
    +    test("B", 2);
    +    Stream c = test("C", 3);
    +    test("D", 4);
    +    test("E", 5);
    +    // ... until there's a terminal operation:
    +    System.out.println("Entering try");
    +    try {
    +      c.forEach(System.out::println);   // [1]
    +    } catch(Exception e) {
    +      System.out.println(e.getMessage());
    +    }
    +  }
    +}
    +/* Output:
    +Entering try
    +Breakable_C [2]
    +Breakable_C [1]
    +Throwing Exception for C
    +Breakable_C failed
    +*/
    diff --git a/concurrent/ThrowsChecked.java b/concurrent/ThrowsChecked.java
    new file mode 100644
    index 000000000..bbebadd18
    --- /dev/null
    +++ b/concurrent/ThrowsChecked.java
    @@ -0,0 +1,42 @@
    +// concurrent/ThrowsChecked.java
    +// (c)2017 MindView LLC: see Copyright.txt
    +// We make no guarantees that this code is fit for any purpose.
    +// Visit http://OnJava8.com for more book information.
    +import java.util.stream.*;
    +import java.util.concurrent.*;
    +
    +public class ThrowsChecked {
    +  class Checked extends Exception {}
    +  static ThrowsChecked nochecked(ThrowsChecked tc) {
    +    return tc;
    +  }
    +  static ThrowsChecked
    +  withchecked(ThrowsChecked tc) throws Checked {
    +    return tc;
    +  }
    +  static void testStream() {
    +    Stream.of(new ThrowsChecked())
    +      .map(ThrowsChecked::nochecked)
    +      // .map(ThrowsChecked::withchecked); // [1]
    +      .map(tc -> {
    +        try {
    +          return withchecked(tc);
    +        } catch(Checked e) {
    +          throw new RuntimeException(e);
    +        }
    +      });
    +  }
    +  static void testCompletableFuture() {
    +    CompletableFuture
    +      .completedFuture(new ThrowsChecked())
    +      .thenApply(ThrowsChecked::nochecked)
    +      // .thenApply(ThrowsChecked::withchecked); // [2]
    +      .thenApply(tc -> {
    +        try {
    +          return withchecked(tc);
    +        } catch(Checked e) {
    +          throw new RuntimeException(e);
    +        }
    +      });
    +  }
    +}
    
    From f2049d70ab3ceb9374347c370c82f3bc225f5586 Mon Sep 17 00:00:00 2001
    From: Bruce Eckel 
    Date: Fri, 6 Jan 2017 15:59:01 -0800
    Subject: [PATCH 186/320] Update to Gradle 3.3
    
    ---
     gradle/wrapper/gradle-wrapper.properties | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
    index ab0ff321f..293fd09bf 100644
    --- a/gradle/wrapper/gradle-wrapper.properties
    +++ b/gradle/wrapper/gradle-wrapper.properties
    @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME
     distributionPath=wrapper/dists
     zipStoreBase=GRADLE_USER_HOME
     zipStorePath=wrapper/dists
    -distributionUrl=https\://services.gradle.org/distributions/gradle-3.2.1-bin.zip
    +distributionUrl=https\://services.gradle.org/distributions/gradle-3.3-bin.zip
    
    From ca066ef9c5a8527b10e0a131da285300f9444cf8 Mon Sep 17 00:00:00 2001
    From: Bruce Eckel 
    Date: Sat, 7 Jan 2017 10:42:19 -0800
    Subject: [PATCH 187/320] Update to release 21 of Guava
    
    ---
     gradle/subprojects.gradle | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/gradle/subprojects.gradle b/gradle/subprojects.gradle
    index 93e89ad0e..cc5ebba57 100644
    --- a/gradle/subprojects.gradle
    +++ b/gradle/subprojects.gradle
    @@ -64,7 +64,7 @@ project(':collections') {
     configure(subprojects - project(':onjava')) {
         dependencies {
             compile project(':onjava')
    -        compile 'com.google.guava:guava:19.0'
    +        compile 'com.google.guava:guava:21.0-rc2'
             compileOnly "org.openjdk.jmh:jmh-core:${jmh.jmhVersion}"
         }
     }
    
    From 79bb072693851a262fd0f8c6e489366e45d85c92 Mon Sep 17 00:00:00 2001
    From: Bruce Eckel 
    Date: Sun, 8 Jan 2017 22:55:49 -0800
    Subject: [PATCH 188/320] Improvements during editing
    
    ---
     collectiontopics/CanonicalMapping.java        |   2 +-
     collectiontopics/ComposedEquality.java        |  65 ++++++++++
     collectiontopics/CountedString.java           |   4 +-
     collectiontopics/Equality.java                |  76 ++++++++++++
     collectiontopics/EqualityFactory.java         |   9 ++
     collectiontopics/Groundhog2.java              |   4 +-
     collectiontopics/MapEntry.java                |   4 +-
     collectiontopics/SuccinctEquality.java        |  46 ++++++++
     collectiontopics/TypesForSets.java            |   1 -
     collectiontopics/Unsupported.java             |  37 +++---
     generics/Holder.java                          |   1 -
     onjava/CountMap.java                          |  13 +-
     onjava/Countries.java                         |  11 +-
     patterns/ShapeFactory1.java                   |  47 ++++++++
     patterns/ShapeFactory2.java                   | 111 +++++++-----------
     patterns/ShapeFactory3.java                   |  53 +++++++++
     .../GameEnvironment.java                      |   6 +-
     patterns/factory/ShapeFactory1.java           |  79 -------------
     patterns/recyclea/RecycleA.java               |   3 +-
     patterns/shapes/BadShapeCreation.java         |  12 ++
     patterns/shapes/Circle.java                   |   7 ++
     patterns/shapes/Shape.java                    |  21 ++++
     patterns/shapes/Square.java                   |   7 ++
     patterns/shapes/Triangle.java                 |   7 ++
     typeinfo/pets/Individual.java                 |   3 +-
     25 files changed, 434 insertions(+), 195 deletions(-)
     create mode 100644 collectiontopics/ComposedEquality.java
     create mode 100644 collectiontopics/Equality.java
     create mode 100644 collectiontopics/EqualityFactory.java
     create mode 100644 collectiontopics/SuccinctEquality.java
     create mode 100644 patterns/ShapeFactory1.java
     create mode 100644 patterns/ShapeFactory3.java
     rename patterns/{absfactory => abstractfactory}/GameEnvironment.java (93%)
     delete mode 100644 patterns/factory/ShapeFactory1.java
     create mode 100644 patterns/shapes/BadShapeCreation.java
     create mode 100644 patterns/shapes/Circle.java
     create mode 100644 patterns/shapes/Shape.java
     create mode 100644 patterns/shapes/Square.java
     create mode 100644 patterns/shapes/Triangle.java
    
    diff --git a/collectiontopics/CanonicalMapping.java b/collectiontopics/CanonicalMapping.java
    index 330b381ce..15ffcb065 100644
    --- a/collectiontopics/CanonicalMapping.java
    +++ b/collectiontopics/CanonicalMapping.java
    @@ -15,7 +15,7 @@ class Element {
       @Override
       public boolean equals(Object r) {
         return r instanceof Element &&
    -      ident.equals(((Element)r).ident);
    +      Objects.equals(ident, ((Element)r).ident);
       }
       @Override
       protected void finalize() {
    diff --git a/collectiontopics/ComposedEquality.java b/collectiontopics/ComposedEquality.java
    new file mode 100644
    index 000000000..246f190be
    --- /dev/null
    +++ b/collectiontopics/ComposedEquality.java
    @@ -0,0 +1,65 @@
    +// collectiontopics/ComposedEquality.java
    +// (c)2017 MindView LLC: see Copyright.txt
    +// We make no guarantees that this code is fit for any purpose.
    +// Visit http://OnJava8.com for more book information.
    +import java.util.*;
    +
    +class Part {
    +  String ss;
    +  double dd;
    +  public Part(String ss, double dd) {
    +    this.ss = ss;
    +    this.dd = dd;
    +  }
    +  @Override
    +  public boolean equals(Object rval) {
    +    return rval instanceof Part &&
    +      Objects.equals(ss, ((Part)rval).ss) &&
    +      Objects.equals(dd, ((Part)rval).dd);
    +  }
    +}
    +
    +public class ComposedEquality extends SuccinctEquality {
    +  Part part;
    +  public ComposedEquality(int i, String s, double d) {
    +    super(i, s, d);
    +    part = new Part(s, d);
    +    System.out.println("made 'ComposedEquality'");
    +  }
    +  @Override
    +  public boolean equals(Object rval) {
    +    return rval instanceof ComposedEquality &&
    +      super.equals(rval) &&
    +      Objects.equals(part, ((ComposedEquality)rval).part);
    +  }
    +  public static void main(String[] args) {
    +    Equality.testAll( (i, s, d) ->
    +      new ComposedEquality(i, s, d));
    +  }
    +}
    +/* Output:
    +made 'Equality'
    +made 'SuccinctEquality'
    +made 'ComposedEquality'
    +made 'Equality'
    +made 'SuccinctEquality'
    +made 'ComposedEquality'
    +made 'Equality'
    +made 'SuccinctEquality'
    +made 'ComposedEquality'
    +-- Testing null --
    +null instanceof Equality: false
    +Expected false, got false
    +-- Testing same object --
    +same object instanceof Equality: true
    +Expected true, got true
    +-- Testing different type --
    +different type instanceof Equality: false
    +Expected false, got false
    +-- Testing same values --
    +same values instanceof Equality: true
    +Expected true, got true
    +-- Testing different values --
    +different values instanceof Equality: true
    +Expected false, got false
    +*/
    diff --git a/collectiontopics/CountedString.java b/collectiontopics/CountedString.java
    index 409bc98cd..3d3d370fb 100644
    --- a/collectiontopics/CountedString.java
    +++ b/collectiontopics/CountedString.java
    @@ -37,8 +37,8 @@ public int hashCode() {
       @Override
       public boolean equals(Object o) {
         return o instanceof CountedString &&
    -      s.equals(((CountedString)o).s) &&
    -      id == ((CountedString)o).id;
    +      Objects.equals(s, ((CountedString)o).s) &&
    +      Objects.equals(id, ((CountedString)o).id);
       }
       public static void main(String[] args) {
         Map map =
    diff --git a/collectiontopics/Equality.java b/collectiontopics/Equality.java
    new file mode 100644
    index 000000000..b4e9f7fe3
    --- /dev/null
    +++ b/collectiontopics/Equality.java
    @@ -0,0 +1,76 @@
    +// collectiontopics/Equality.java
    +// (c)2017 MindView LLC: see Copyright.txt
    +// We make no guarantees that this code is fit for any purpose.
    +// Visit http://OnJava8.com for more book information.
    +import java.util.*;
    +
    +public class Equality {
    +  protected int i;
    +  protected String s;
    +  protected double d;
    +  public Equality(int i, String s, double d) {
    +    this.i = i;
    +    this.s = s;
    +    this.d = d;
    +    System.out.println("made 'Equality'");
    +  }
    +  @Override
    +  public boolean equals(Object rval) {
    +    if(rval == null)
    +      return false;
    +    if(rval == this)
    +      return true;
    +    if(!(rval instanceof Equality))
    +      return false;
    +    Equality other = (Equality)rval;
    +    if(!Objects.equals(i, other.i))
    +      return false;
    +    if(!Objects.equals(s, other.s))
    +      return false;
    +    if(!Objects.equals(d, other.d))
    +      return false;
    +    return true;
    +  }
    +  public void
    +  test(String descr, String expected, Object rval) {
    +    System.out.format("-- Testing %s --%n" +
    +      "%s instanceof Equality: %s%n" +
    +      "Expected %s, got %s%n",
    +      descr, descr, rval instanceof Equality,
    +      expected, equals(rval));
    +  }
    +  public static void testAll(EqualityFactory eqf) {
    +    Equality
    +      e = eqf.make(1, "Monty", 3.14),
    +      eq = eqf.make(1, "Monty", 3.14),
    +      neq = eqf.make(99, "Bob", 1.618);
    +    e.test("null", "false", null);
    +    e.test("same object", "true", e);
    +    e.test("different type", "false", new Integer(99));
    +    e.test("same values", "true", eq);
    +    e.test("different values", "false", neq);
    +  }
    +  public static void main(String[] args) {
    +    testAll( (i, s, d) -> new Equality(i, s, d));
    +  }
    +}
    +/* Output:
    +made 'Equality'
    +made 'Equality'
    +made 'Equality'
    +-- Testing null --
    +null instanceof Equality: false
    +Expected false, got false
    +-- Testing same object --
    +same object instanceof Equality: true
    +Expected true, got true
    +-- Testing different type --
    +different type instanceof Equality: false
    +Expected false, got false
    +-- Testing same values --
    +same values instanceof Equality: true
    +Expected true, got true
    +-- Testing different values --
    +different values instanceof Equality: true
    +Expected false, got false
    +*/
    diff --git a/collectiontopics/EqualityFactory.java b/collectiontopics/EqualityFactory.java
    new file mode 100644
    index 000000000..0fe779b2b
    --- /dev/null
    +++ b/collectiontopics/EqualityFactory.java
    @@ -0,0 +1,9 @@
    +// collectiontopics/EqualityFactory.java
    +// (c)2017 MindView LLC: see Copyright.txt
    +// We make no guarantees that this code is fit for any purpose.
    +// Visit http://OnJava8.com for more book information.
    +import java.util.*;
    +
    +interface EqualityFactory {
    +  Equality make(int i, String s, double d);
    +}
    diff --git a/collectiontopics/Groundhog2.java b/collectiontopics/Groundhog2.java
    index e79e581df..a642c706f 100644
    --- a/collectiontopics/Groundhog2.java
    +++ b/collectiontopics/Groundhog2.java
    @@ -4,6 +4,7 @@
     // Visit http://OnJava8.com for more book information.
     // A class that's used as a key in a HashMap
     // must override hashCode() and equals()
    +import java.util.*;
     
     public class Groundhog2 extends Groundhog {
       public Groundhog2(int n) { super(n); }
    @@ -12,6 +13,7 @@ public class Groundhog2 extends Groundhog {
       @Override
       public boolean equals(Object o) {
         return o instanceof Groundhog2 &&
    -      (number == ((Groundhog2)o).number);
    +      Objects.equals(
    +        number, ((Groundhog2)o).number);
       }
     }
    diff --git a/collectiontopics/MapEntry.java b/collectiontopics/MapEntry.java
    index 66ef9af3a..80979cb00 100644
    --- a/collectiontopics/MapEntry.java
    +++ b/collectiontopics/MapEntry.java
    @@ -34,10 +34,10 @@ public boolean equals(Object o) {
         MapEntry me = (MapEntry)o;
         return
           (key == null ? me.getKey() == null :
    -       key.equals(me.getKey()))
    +        key.equals(me.getKey()))
            &&
           (value == null ? me.getValue() == null :
    -       value.equals(me.getValue()));
    +        value.equals(me.getValue()));
       }
       @Override
       public String toString() { return key + "=" + value; }
    diff --git a/collectiontopics/SuccinctEquality.java b/collectiontopics/SuccinctEquality.java
    new file mode 100644
    index 000000000..dbb3c3495
    --- /dev/null
    +++ b/collectiontopics/SuccinctEquality.java
    @@ -0,0 +1,46 @@
    +// collectiontopics/SuccinctEquality.java
    +// (c)2017 MindView LLC: see Copyright.txt
    +// We make no guarantees that this code is fit for any purpose.
    +// Visit http://OnJava8.com for more book information.
    +import java.util.*;
    +
    +public class SuccinctEquality extends Equality {
    +  public SuccinctEquality(int i, String s, double d) {
    +    super(i, s, d);
    +    System.out.println("made 'SuccinctEquality'");
    +  }
    +  @Override
    +  public boolean equals(Object rval) {
    +    return rval instanceof SuccinctEquality &&
    +      Objects.equals(i, ((SuccinctEquality)rval).i) &&
    +      Objects.equals(s, ((SuccinctEquality)rval).s) &&
    +      Objects.equals(d, ((SuccinctEquality)rval).d);
    +  }
    +  public static void main(String[] args) {
    +    Equality.testAll( (i, s, d) ->
    +      new SuccinctEquality(i, s, d));
    +  }
    +}
    +/* Output:
    +made 'Equality'
    +made 'SuccinctEquality'
    +made 'Equality'
    +made 'SuccinctEquality'
    +made 'Equality'
    +made 'SuccinctEquality'
    +-- Testing null --
    +null instanceof Equality: false
    +Expected false, got false
    +-- Testing same object --
    +same object instanceof Equality: true
    +Expected true, got true
    +-- Testing different type --
    +different type instanceof Equality: false
    +Expected false, got false
    +-- Testing same values --
    +same values instanceof Equality: true
    +Expected true, got true
    +-- Testing different values --
    +different values instanceof Equality: true
    +Expected false, got false
    +*/
    diff --git a/collectiontopics/TypesForSets.java b/collectiontopics/TypesForSets.java
    index 501403301..499295007 100644
    --- a/collectiontopics/TypesForSets.java
    +++ b/collectiontopics/TypesForSets.java
    @@ -12,7 +12,6 @@ class SetType {
       public SetType(int n) { i = n; }
       @Override
       public boolean equals(Object o) {
    -    if (o == this) return true;
         return o instanceof SetType &&
           Objects.equals(i, ((SetType)o).i);
       }
    diff --git a/collectiontopics/Unsupported.java b/collectiontopics/Unsupported.java
    index 0cbb418d4..0eb3c93c8 100644
    --- a/collectiontopics/Unsupported.java
    +++ b/collectiontopics/Unsupported.java
    @@ -6,37 +6,28 @@
     import java.util.*;
     
     public class Unsupported {
    +  static void check(String description, Runnable tst) {
    +    try {
    +      tst.run();
    +    } catch(Exception e) {
    +      System.out.println(description + "(): " + e);
    +    }
    +  }
       static void test(String msg, List list) {
         System.out.println("--- " + msg + " ---");
         Collection c = list;
         Collection subList = list.subList(1,8);
         // Copy of the sublist:
         Collection c2 = new ArrayList<>(subList);
    -    try { c.retainAll(c2); } catch(Exception e) {
    -      System.out.println("retainAll(): " + e);
    -    }
    -    try { c.removeAll(c2); } catch(Exception e) {
    -      System.out.println("removeAll(): " + e);
    -    }
    -    try { c.clear(); } catch(Exception e) {
    -      System.out.println("clear(): " + e);
    -    }
    -    try { c.add("X"); } catch(Exception e) {
    -      System.out.println("add(): " + e);
    -    }
    -    try { c.addAll(c2); } catch(Exception e) {
    -      System.out.println("addAll(): " + e);
    -    }
    -    try { c.remove("C"); } catch(Exception e) {
    -      System.out.println("remove(): " + e);
    -    }
    +    check("retainAll", () -> c.retainAll(c2));
    +    check("removeAll", () -> c.removeAll(c2));
    +    check("clear", () -> c.clear());
    +    check("add", () -> c.add("X"));
    +    check("addAll", () -> c.addAll(c2));
    +    check("remove", () -> c.remove("C"));
         // The List.set() method modifies the value but
         // doesn't change the size of the data structure:
    -    try {
    -      list.set(0, "X");
    -    } catch(Exception e) {
    -      System.out.println("List.set(): " + e);
    -    }
    +    check("List.set", () -> list.set(0, "X"));
       }
       public static void main(String[] args) {
         List list =
    diff --git a/generics/Holder.java b/generics/Holder.java
    index dec557cb8..6e17cb1eb 100644
    --- a/generics/Holder.java
    +++ b/generics/Holder.java
    @@ -12,7 +12,6 @@ public Holder() {}
       public T get() { return value; }
       @Override
       public boolean equals(Object o) {
    -    if (o == this) return true;
         return o instanceof Holder &&
           Objects.equals(value, ((Holder)o).value);
       }
    diff --git a/onjava/CountMap.java b/onjava/CountMap.java
    index bd653f882..31bc86320 100644
    --- a/onjava/CountMap.java
    +++ b/onjava/CountMap.java
    @@ -6,6 +6,7 @@
     // {java onjava.CountMap}
     package onjava;
     import java.util.*;
    +import java.util.stream.*;
     
     public class CountMap
     extends AbstractMap {
    @@ -31,7 +32,8 @@ private static class Entry
         Entry(int index) { this.index = index; }
         @Override
         public boolean equals(Object o) {
    -      return Integer.valueOf(index).equals(o);
    +      return o instanceof Entry &&
    +        Objects.equals(index, ((Entry)o).index);
         }
         @Override
         public Integer getKey() { return index; }
    @@ -49,11 +51,10 @@ public int hashCode() {
       @Override
       public Set> entrySet() {
         // LinkedHashSet retains initialization order:
    -    Set> entries =
    -      new LinkedHashSet<>();
    -    for(int i = 0; i < size; i++)
    -      entries.add(new Entry(i));
    -    return entries;
    +    return IntStream.range(0, size)
    +      .mapToObj(Entry::new)
    +      .collect(
    +        Collectors.toCollection(LinkedHashSet::new));
       }
       public static void main(String[] args) {
         CountMap cm = new CountMap(60);
    diff --git a/onjava/Countries.java b/onjava/Countries.java
    index 4cd976342..467bf0855 100644
    --- a/onjava/Countries.java
    +++ b/onjava/Countries.java
    @@ -220,7 +220,12 @@ private static class Entry
           Entry(int index) { this.index = index; }
           @Override
           public boolean equals(Object o) {
    -        return DATA[index][0].equals(o);
    +        return o instanceof FlyweightMap &&
    +          Objects.equals(DATA[index][0], o);
    +      }
    +      @Override
    +      public int hashCode() {
    +        return DATA[index][0].hashCode();
           }
           @Override
           public String getKey() { return DATA[index][0]; }
    @@ -230,10 +235,6 @@ public boolean equals(Object o) {
           public String setValue(String value) {
             throw new UnsupportedOperationException();
           }
    -      @Override
    -      public int hashCode() {
    -        return DATA[index][0].hashCode();
    -      }
         }
         // Implement size() & iterator() for AbstractSet:
         static class EntrySet
    diff --git a/patterns/ShapeFactory1.java b/patterns/ShapeFactory1.java
    new file mode 100644
    index 000000000..554033151
    --- /dev/null
    +++ b/patterns/ShapeFactory1.java
    @@ -0,0 +1,47 @@
    +// patterns/ShapeFactory1.java
    +// (c)2017 MindView LLC: see Copyright.txt
    +// We make no guarantees that this code is fit for any purpose.
    +// Visit http://OnJava8.com for more book information.
    +// A simple static factory method
    +import java.util.*;
    +import java.util.stream.*;
    +import patterns.shapes.*;
    +
    +class StaticFactory {
    +  static Shape create(String type) {
    +    switch(type) {
    +      case "Circle": return new Circle();
    +      case "Square": return new Square();
    +      case "Triangle": return new Triangle();
    +      default:
    +        throw new BadShapeCreation(type);
    +    }
    +  }
    +}
    +
    +public class ShapeFactory1 {
    +  public static void main(String[] args) {
    +    Stream.of("Circle", "Square", "Triangle",
    +      "Square", "Circle", "Circle", "Triangle")
    +      .map(StaticFactory::create)
    +      .peek(Shape::draw)
    +      .peek(Shape::erase)
    +      .count(); // Terminal operation
    +  }
    +}
    +/* Output:
    +Circle[0] draw
    +Circle[0] erase
    +Square[1] draw
    +Square[1] erase
    +Triangle[2] draw
    +Triangle[2] erase
    +Square[3] draw
    +Square[3] erase
    +Circle[4] draw
    +Circle[4] erase
    +Circle[5] draw
    +Circle[5] erase
    +Triangle[6] draw
    +Triangle[6] erase
    +*/
    diff --git a/patterns/ShapeFactory2.java b/patterns/ShapeFactory2.java
    index 67633a3a0..6670c0d35 100644
    --- a/patterns/ShapeFactory2.java
    +++ b/patterns/ShapeFactory2.java
    @@ -2,87 +2,60 @@
     // (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
    -// Polymorphic factory methods
     import java.util.*;
    -import java.util.function.*;
    +import java.lang.reflect.*;
     import java.util.stream.*;
    +import patterns.shapes.*;
     
    -class BadShapeCreation extends RuntimeException {
    -  BadShapeCreation(String msg) {
    -    super(msg);
    -  }
    -}
    -
    -interface Shape {
    -  void draw();
    -  void erase();
    -}
    -
    -abstract class ShapeFactory {
    -  static Map> factories =
    +class DynamicFactory {
    +  static Map factories =
         new HashMap<>();
    -  static Shape createShape(String id) {
    -    if(!factories.containsKey(id)) {
    -      try {
    -        Class.forName(id); // Load dynamically
    -      } catch(ClassNotFoundException e) {
    -        throw new BadShapeCreation(id);
    -      }
    -      // See if it was put in:
    -      if(!factories.containsKey(id))
    -        throw new BadShapeCreation(id);
    +  static Constructor load(String id) {
    +    System.out.println("loading " + id);
    +    try {
    +      return Class.forName("patterns.shapes." + id)
    +        .getConstructor();
    +    } catch(Exception e) {
    +      throw new BadShapeCreation(id);
         }
    -    return factories.get(id).get();
    -  }
    -}
    -
    -final class Circle implements Shape {
    -  private Circle() {}
    -  public void draw() {
    -    System.out.println("Circle.draw");
       }
    -  public void erase() {
    -    System.out.println("Circle.erase");
    -  }
    -  static {
    -    ShapeFactory.factories.put("Circle", Circle::new);
    -  }
    -}
    -
    -final class Square implements Shape {
    -  private Square() {}
    -  public void draw() {
    -    System.out.println("Square.draw");
    -  }
    -  public void erase() {
    -    System.out.println("Square.erase");
    -  }
    -  static {
    -    ShapeFactory.factories.put("Square", Square::new);
    +  static Shape create(String id) {
    +    try {
    +      return (Shape)factories
    +        .computeIfAbsent(id, DynamicFactory::load)
    +        .newInstance();
    +    } catch(Exception e) {
    +      throw new BadShapeCreation(id);
    +    }
       }
     }
     
     public class ShapeFactory2 {
       public static void main(String[] args) {
    -    List shapes = Stream.of("Circle", "Square",
    -      "Square", "Circle", "Circle", "Square")
    -      .map(ShapeFactory::createShape)
    -      .collect(Collectors.toList());
    -    shapes.forEach(Shape::draw);
    -    shapes.forEach(Shape::erase);
    +    Stream.of("Circle", "Square", "Triangle",
    +      "Square", "Circle", "Circle", "Triangle")
    +      .map(DynamicFactory::create)
    +      .peek(Shape::draw)
    +      .peek(Shape::erase)
    +      .count();
       }
     }
     /* Output:
    -Circle.draw
    -Square.draw
    -Square.draw
    -Circle.draw
    -Circle.draw
    -Square.draw
    -Circle.erase
    -Square.erase
    -Square.erase
    -Circle.erase
    -Circle.erase
    -Square.erase
    +loading Circle
    +Circle[0] draw
    +Circle[0] erase
    +loading Square
    +Square[1] draw
    +Square[1] erase
    +loading Triangle
    +Triangle[2] draw
    +Triangle[2] erase
    +Square[3] draw
    +Square[3] erase
    +Circle[4] draw
    +Circle[4] erase
    +Circle[5] draw
    +Circle[5] erase
    +Triangle[6] draw
    +Triangle[6] erase
     */
    diff --git a/patterns/ShapeFactory3.java b/patterns/ShapeFactory3.java
    new file mode 100644
    index 000000000..c9c8a79a9
    --- /dev/null
    +++ b/patterns/ShapeFactory3.java
    @@ -0,0 +1,53 @@
    +// patterns/ShapeFactory3.java
    +// (c)2017 MindView LLC: see Copyright.txt
    +// We make no guarantees that this code is fit for any purpose.
    +// Visit http://OnJava8.com for more book information.
    +// Polymorphic factory methods
    +import java.util.*;
    +import java.util.function.*;
    +import java.util.stream.*;
    +import patterns.shapes.*;
    +
    +interface PolymorphicFactory {
    +  Shape create();
    +}
    +
    +class RandomShapes implements Supplier {
    +  private final PolymorphicFactory[] factories;
    +  private Random rand = new Random(42);
    +  public
    +  RandomShapes(PolymorphicFactory... factories) {
    +    this.factories = factories;
    +  }
    +  public Shape get() {
    +    return factories[
    +      rand.nextInt(factories.length)].create();
    +  }
    +}
    +
    +public class ShapeFactory3 {
    +  public static void main(String[] args) {
    +    RandomShapes rs = new RandomShapes(
    +      Circle::new, Square::new, Triangle::new
    +    );
    +    Stream.generate(rs)
    +      .limit(6)
    +      .peek(Shape::draw)
    +      .peek(Shape::erase)
    +      .count();
    +  }
    +}
    +/* Output:
    +Triangle[0] draw
    +Triangle[0] erase
    +Circle[1] draw
    +Circle[1] erase
    +Circle[2] draw
    +Circle[2] erase
    +Triangle[3] draw
    +Triangle[3] erase
    +Circle[4] draw
    +Circle[4] erase
    +Square[5] draw
    +Square[5] erase
    +*/
    diff --git a/patterns/absfactory/GameEnvironment.java b/patterns/abstractfactory/GameEnvironment.java
    similarity index 93%
    rename from patterns/absfactory/GameEnvironment.java
    rename to patterns/abstractfactory/GameEnvironment.java
    index c583796de..16acdc681 100644
    --- a/patterns/absfactory/GameEnvironment.java
    +++ b/patterns/abstractfactory/GameEnvironment.java
    @@ -1,10 +1,10 @@
    -// patterns/absfactory/GameEnvironment.java
    +// patterns/abstractfactory/GameEnvironment.java
     // (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // An example of the Abstract Factory pattern
    -// {java patterns.absfactory.GameEnvironment}
    -package patterns.absfactory;
    +// {java patterns.abstractfactory.GameEnvironment}
    +package patterns.abstractfactory;
     import java.util.function.*;
     
     interface Obstacle {
    diff --git a/patterns/factory/ShapeFactory1.java b/patterns/factory/ShapeFactory1.java
    deleted file mode 100644
    index 109c1eada..000000000
    --- a/patterns/factory/ShapeFactory1.java
    +++ /dev/null
    @@ -1,79 +0,0 @@
    -// patterns/factory/ShapeFactory1.java
    -// (c)2017 MindView LLC: see Copyright.txt
    -// We make no guarantees that this code is fit for any purpose.
    -// Visit http://OnJava8.com for more book information.
    -// A simple static factory method
    -// {java patterns.factory.ShapeFactory1}
    -package patterns.factory;
    -import java.util.*;
    -import java.util.stream.*;
    -
    -class BadShapeCreation extends RuntimeException {
    -  BadShapeCreation(String msg) {
    -    super(msg);
    -  }
    -}
    -
    -abstract class Shape {
    -  public abstract void draw();
    -  public abstract void erase();
    -  static Shape factory(String type) {
    -    switch(type) {
    -      case "Circle": return new Circle();
    -      case "Square": return new Square();
    -      default:
    -        throw new BadShapeCreation(type);
    -    }
    -  }
    -}
    -
    -class Circle extends Shape {
    -  Circle() {} // Friendly constructor
    -  @Override
    -  public void draw() {
    -    System.out.println("Circle.draw");
    -  }
    -  @Override
    -  public void erase() {
    -    System.out.println("Circle.erase");
    -  }
    -}
    -
    -class Square extends Shape {
    -  Square() {} // Friendly constructor
    -  @Override
    -  public void draw() {
    -    System.out.println("Square.draw");
    -  }
    -  @Override
    -  public void erase() {
    -    System.out.println("Square.erase");
    -  }
    -}
    -
    -public class ShapeFactory1 {
    -  public static void main(String[] args) {
    -    List shapes = Stream.of(
    -      "Circle", "Square",
    -      "Square", "Circle",
    -      "Circle", "Square")
    -      .map(Shape::factory)
    -      .collect(Collectors.toList());
    -    shapes.forEach(Shape::draw);
    -    shapes.forEach(Shape::erase);
    -  }
    -}
    -/* Output:
    -Circle.draw
    -Square.draw
    -Square.draw
    -Circle.draw
    -Circle.draw
    -Square.draw
    -Circle.erase
    -Square.erase
    -Square.erase
    -Circle.erase
    -Circle.erase
    -Square.erase
    -*/
    diff --git a/patterns/recyclea/RecycleA.java b/patterns/recyclea/RecycleA.java
    index 9dc54a758..702fdb973 100644
    --- a/patterns/recyclea/RecycleA.java
    +++ b/patterns/recyclea/RecycleA.java
    @@ -66,7 +66,8 @@ class TrashFactory {
         Arrays.asList(
           Aluminum::new, Paper::new, Glass::new);
       static final int SZ = ttypes.size();
    -  private static SplittableRandom rand = new SplittableRandom(47);
    +  private static SplittableRandom rand =
    +    new SplittableRandom(47);
       public static Trash newTrash() {
         return ttypes
           .get(rand.nextInt(SZ))
    diff --git a/patterns/shapes/BadShapeCreation.java b/patterns/shapes/BadShapeCreation.java
    new file mode 100644
    index 000000000..daa3f7f57
    --- /dev/null
    +++ b/patterns/shapes/BadShapeCreation.java
    @@ -0,0 +1,12 @@
    +// patterns/shapes/BadShapeCreation.java
    +// (c)2017 MindView LLC: see Copyright.txt
    +// We make no guarantees that this code is fit for any purpose.
    +// Visit http://OnJava8.com for more book information.
    +package patterns.shapes;
    +
    +public class BadShapeCreation
    +extends RuntimeException {
    +  public BadShapeCreation(String msg) {
    +    super(msg);
    +  }
    +}
    diff --git a/patterns/shapes/Circle.java b/patterns/shapes/Circle.java
    new file mode 100644
    index 000000000..b50d5abfe
    --- /dev/null
    +++ b/patterns/shapes/Circle.java
    @@ -0,0 +1,7 @@
    +// patterns/shapes/Circle.java
    +// (c)2017 MindView LLC: see Copyright.txt
    +// We make no guarantees that this code is fit for any purpose.
    +// Visit http://OnJava8.com for more book information.
    +package patterns.shapes;
    +
    +public class Circle extends Shape {}
    diff --git a/patterns/shapes/Shape.java b/patterns/shapes/Shape.java
    new file mode 100644
    index 000000000..dfff783cc
    --- /dev/null
    +++ b/patterns/shapes/Shape.java
    @@ -0,0 +1,21 @@
    +// patterns/shapes/Shape.java
    +// (c)2017 MindView LLC: see Copyright.txt
    +// We make no guarantees that this code is fit for any purpose.
    +// Visit http://OnJava8.com for more book information.
    +package patterns.shapes;
    +
    +public class Shape {
    +  private static int counter = 0;
    +  private int id = counter++;
    +  @Override
    +  public String toString() {
    +    return
    +      getClass().getSimpleName() + "[" + id + "]";
    +  }
    +  public void draw() {
    +    System.out.println(this + " draw");
    +  }
    +  public void erase() {
    +    System.out.println(this + " erase");
    +  }
    +}
    diff --git a/patterns/shapes/Square.java b/patterns/shapes/Square.java
    new file mode 100644
    index 000000000..602b3282c
    --- /dev/null
    +++ b/patterns/shapes/Square.java
    @@ -0,0 +1,7 @@
    +// patterns/shapes/Square.java
    +// (c)2017 MindView LLC: see Copyright.txt
    +// We make no guarantees that this code is fit for any purpose.
    +// Visit http://OnJava8.com for more book information.
    +package patterns.shapes;
    +
    +public class Square extends Shape {}
    diff --git a/patterns/shapes/Triangle.java b/patterns/shapes/Triangle.java
    new file mode 100644
    index 000000000..11559f896
    --- /dev/null
    +++ b/patterns/shapes/Triangle.java
    @@ -0,0 +1,7 @@
    +// patterns/shapes/Triangle.java
    +// (c)2017 MindView LLC: see Copyright.txt
    +// We make no guarantees that this code is fit for any purpose.
    +// Visit http://OnJava8.com for more book information.
    +package patterns.shapes;
    +
    +public class Triangle extends Shape {}
    diff --git a/typeinfo/pets/Individual.java b/typeinfo/pets/Individual.java
    index fd54f7877..e30bce871 100644
    --- a/typeinfo/pets/Individual.java
    +++ b/typeinfo/pets/Individual.java
    @@ -3,6 +3,7 @@
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package typeinfo.pets;
    +import java.util.*;
     
     public class
     Individual implements Comparable {
    @@ -21,7 +22,7 @@ public String toString() {
       @Override
       public boolean equals(Object o) {
         return o instanceof Individual &&
    -      id == ((Individual)o).id;
    +      Objects.equals(id, ((Individual)o).id);
       }
       @Override
       public int hashCode() {
    
    From 5d0f0fe3f9798809f777729bb7259d3e3c8e026c Mon Sep 17 00:00:00 2001
    From: Bruce Eckel 
    Date: Mon, 9 Jan 2017 14:26:12 -0800
    Subject: [PATCH 189/320] Rewrites
    
    ---
     collectiontopics/QueueBehavior.java         | 55 ++++++++++-------
     collectiontopics/SimpleDeques.java          |  6 +-
     collectiontopics/SortedSetDemo.java         | 11 ++--
     collectiontopics/ToDoList.java              | 66 ++++++++++-----------
     collectiontopics/TypesForSets.java          | 52 +++++++++-------
     onjava/CountMap.java                        | 24 +++++++-
     patterns/PaperScissorsRock.java             |  3 +-
     patterns/ShapeFactory1.java                 | 14 +----
     patterns/ShapeFactory2.java                 | 25 ++++----
     patterns/doubledispatch/TypedBinMember.java |  2 +-
     patterns/shapes/FactoryMethod.java          |  9 +++
     patterns/shapes/FactoryTest.java            | 17 ++++++
     patterns/trash/Trash.java                   |  4 +-
     patterns/trashvisitor/Visitable.java        |  2 +-
     patterns/trashvisitor/Visitor.java          |  2 +-
     patterns/visitor/BeeAndFlowers.java         |  3 +-
     16 files changed, 178 insertions(+), 117 deletions(-)
     create mode 100644 patterns/shapes/FactoryMethod.java
     create mode 100644 patterns/shapes/FactoryTest.java
    
    diff --git a/collectiontopics/QueueBehavior.java b/collectiontopics/QueueBehavior.java
    index b18733258..923eab610 100644
    --- a/collectiontopics/QueueBehavior.java
    +++ b/collectiontopics/QueueBehavior.java
    @@ -2,36 +2,49 @@
     // (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
    -// Compares the behavior of some of the queues
    -import java.util.concurrent.*;
    +// Compares basic behavior
     import java.util.*;
    +import java.util.stream.*;
    +import java.util.concurrent.*;
     
     public class QueueBehavior {
    -  private static String[] s =
    -    ("one two three four five six seven " +
    -    "eight nine ten").split(" ");
    -  static void test(Queue queue) {
    -    for(String ss : s)
    -      queue.offer(ss);
    +  static Stream strings() {
    +    return Arrays.stream(
    +      ("one two three four five six seven " +
    +       "eight nine ten").split(" "));
    +  }
    +  static void test(int id, Queue queue) {
    +    System.out.print(id + ": ");
    +    strings().map(queue::offer).count();
         while(queue.peek() != null)
           System.out.print(queue.remove() + " ");
         System.out.println();
       }
       public static void main(String[] args) {
    -   int count = 10;
    -   test(new LinkedList<>());
    -    test(new PriorityQueue<>());
    -    test(new ArrayBlockingQueue<>(count));
    -    test(new ConcurrentLinkedQueue<>());
    -    test(new LinkedBlockingQueue<>());
    -    test(new PriorityBlockingQueue<>());
    +    int count = 10;
    +    test(1, new LinkedList<>());
    +    test(2, new PriorityQueue<>());
    +    test(3, new ArrayBlockingQueue<>(count));
    +    test(4, new ConcurrentLinkedQueue<>());
    +    test(5, new LinkedBlockingQueue<>());
    +    test(6, new PriorityBlockingQueue<>());
    +    test(7, new ArrayDeque<>());
    +    test(8, new ConcurrentLinkedDeque<>());
    +    test(9, new LinkedBlockingDeque<>());
    +    test(10, new LinkedTransferQueue<>());
    +    test(11, new SynchronousQueue<>());
       }
     }
     /* Output:
    -one two three four five six seven eight nine ten
    -eight five four nine one seven six ten three two
    -one two three four five six seven eight nine ten
    -one two three four five six seven eight nine ten
    -one two three four five six seven eight nine ten
    -eight five four nine one seven six ten three two
    +1: one two three four five six seven eight nine ten
    +2: eight five four nine one seven six ten three two
    +3: one two three four five six seven eight nine ten
    +4: one two three four five six seven eight nine ten
    +5: one two three four five six seven eight nine ten
    +6: eight five four nine one seven six ten three two
    +7: one two three four five six seven eight nine ten
    +8: one two three four five six seven eight nine ten
    +9: one two three four five six seven eight nine ten
    +10: one two three four five six seven eight nine ten
    +11:
     */
    diff --git a/collectiontopics/SimpleDeques.java b/collectiontopics/SimpleDeques.java
    index ead6bc1a3..1600178e9 100644
    --- a/collectiontopics/SimpleDeques.java
    +++ b/collectiontopics/SimpleDeques.java
    @@ -3,8 +3,8 @@
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Very basic test of Deques
    -import java.util.concurrent.*;
     import java.util.*;
    +import java.util.concurrent.*;
     import java.util.function.*;
     
     class CountString implements Supplier {
    @@ -12,7 +12,9 @@ class CountString implements Supplier {
       public CountString() {}
       public CountString(int start) { n = start; }
       @Override
    -  public String get() { return Integer.toString(n++); }
    +  public String get() {
    +    return Integer.toString(n++);
    +  }
     }
     
     public class SimpleDeques {
    diff --git a/collectiontopics/SortedSetDemo.java b/collectiontopics/SortedSetDemo.java
    index eccd56ad7..837978d46 100644
    --- a/collectiontopics/SortedSetDemo.java
    +++ b/collectiontopics/SortedSetDemo.java
    @@ -2,15 +2,16 @@
     // (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
    -// What you can do with a TreeSet
     import java.util.*;
    +import static java.util.stream.Collectors.*;
     
     public class SortedSetDemo {
       public static void main(String[] args) {
    -    SortedSet sortedSet = new TreeSet<>();
    -    Collections.addAll(sortedSet,
    -      "one two three four five six seven eight"
    -        .split(" "));
    +    SortedSet sortedSet =
    +      Arrays.stream(
    +        "one two three four five six seven eight"
    +        .split(" "))
    +        .collect(toCollection(TreeSet::new));
         System.out.println(sortedSet);
         String low = sortedSet.first();
         String high = sortedSet.last();
    diff --git a/collectiontopics/ToDoList.java b/collectiontopics/ToDoList.java
    index 870f7a7d1..17e668cc8 100644
    --- a/collectiontopics/ToDoList.java
    +++ b/collectiontopics/ToDoList.java
    @@ -5,44 +5,42 @@
     // A more complex use of PriorityQueue
     import java.util.*;
     
    -class ToDoList extends PriorityQueue {
    -  static class ToDoItem implements Comparable {
    -    private char primary;
    -    private int secondary;
    -    private String item;
    -    public ToDoItem(String td, char pri, int sec) {
    -      primary = pri;
    -      secondary = sec;
    -      item = td;
    -    }
    -    @Override
    -    public int compareTo(ToDoItem arg) {
    -      if(primary > arg.primary)
    +class ToDoItem implements Comparable {
    +  private char primary;
    +  private int secondary;
    +  private String item;
    +  public ToDoItem(String td, char pri, int sec) {
    +    primary = pri;
    +    secondary = sec;
    +    item = td;
    +  }
    +  @Override
    +  public int compareTo(ToDoItem arg) {
    +    if(primary > arg.primary)
    +      return +1;
    +    if(primary == arg.primary)
    +      if(secondary > arg.secondary)
             return +1;
    -      if(primary == arg.primary)
    -        if(secondary > arg.secondary)
    -          return +1;
    -        else if(secondary == arg.secondary)
    -          return 0;
    -      return -1;
    -    }
    -    @Override
    -    public String toString() {
    -      return Character.toString(primary) +
    -        secondary + ": " + item;
    -    }
    +      else if(secondary == arg.secondary)
    +        return 0;
    +    return -1;
       }
    -  public void add(String td, char pri, int sec) {
    -    super.add(new ToDoItem(td, pri, sec));
    +  @Override
    +  public String toString() {
    +    return Character.toString(primary) +
    +      secondary + ": " + item;
       }
    +}
    +
    +class ToDoList {
       public static void main(String[] args) {
    -    ToDoList toDo = new ToDoList();
    -    toDo.add("Empty trash", 'C', 4);
    -    toDo.add("Feed dog", 'A', 2);
    -    toDo.add("Feed bird", 'B', 7);
    -    toDo.add("Mow lawn", 'C', 3);
    -    toDo.add("Water lawn", 'A', 1);
    -    toDo.add("Feed cat", 'B', 1);
    +    PriorityQueue toDo = new PriorityQueue<>();
    +    toDo.add(new ToDoItem("Empty trash", 'C', 4));
    +    toDo.add(new ToDoItem("Feed dog", 'A', 2));
    +    toDo.add(new ToDoItem("Feed bird", 'B', 7));
    +    toDo.add(new ToDoItem("Mow lawn", 'C', 3));
    +    toDo.add(new ToDoItem("Water lawn", 'A', 1));
    +    toDo.add(new ToDoItem("Feed cat", 'B', 1));
         while(!toDo.isEmpty())
           System.out.println(toDo.remove());
       }
    diff --git a/collectiontopics/TypesForSets.java b/collectiontopics/TypesForSets.java
    index 499295007..cd672c9d6 100644
    --- a/collectiontopics/TypesForSets.java
    +++ b/collectiontopics/TypesForSets.java
    @@ -6,9 +6,10 @@
     import java.util.*;
     import java.util.function.*;
     import java.util.Objects;
    +import onjava.CountMap;
     
     class SetType {
    -  int i;
    +  protected int i;
       public SetType(int n) { i = n; }
       @Override
       public boolean equals(Object o) {
    @@ -16,13 +17,17 @@ public boolean equals(Object o) {
           Objects.equals(i, ((SetType)o).i);
       }
       @Override
    -  public int hashCode() { return Objects.hash(i); }
    -  @Override
    -  public String toString() { return Integer.toString(i); }
    +  public String toString() {
    +    return Integer.toString(i);
    +  }
     }
     
     class HashType extends SetType {
       public HashType(int n) { super(n); }
    +  @Override
    +  public int hashCode() {
    +    return Objects.hashCode(i);
    +  }
     }
     
     class TreeType extends SetType
    @@ -30,16 +35,19 @@ class TreeType extends SetType
       public TreeType(int n) { super(n); }
       @Override
       public int compareTo(TreeType arg) {
    -    return (arg.i < i ? -1 : (arg.i == i ? 0 : 1));
    +    return Integer.compare(arg.i, i);
    +    // Equivalent to:
    +    // return arg.i < i ? -1 : (arg.i == i ? 0 : 1);
       }
     }
     
     public class TypesForSets {
    -  static  Set
    +  static  void
       fill(Set set, Function type) {
    -    for(int i = 0; i < 10; i++)
    -        set.add(type.apply(i));
    -    return set;
    +    for(int i = 10; i >= 5; i--) // Descending
    +      set.add(type.apply(i));
    +    for(int i = 0; i < 5; i++) // Ascending
    +      set.add(type.apply(i));
       }
       static  void
       test(Set set, Function type) {
    @@ -60,23 +68,27 @@ public static void main(String[] args) {
         try {
           test(new TreeSet<>(), SetType::new);
         } catch(Exception e) {
    -      System.out.println("Expected: " + e.getMessage());
    +      System.out.println(e.getMessage());
         }
         try {
           test(new TreeSet<>(), HashType::new);
         } catch(Exception e) {
    -      System.out.println("Expected: " + e.getMessage());
    +      System.out.println(e.getMessage());
         }
       }
     }
     /* Output:
    -[1, 2, 3, 4, 5, 6, 7, 8, 9, 0]
    -[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    -[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
    -[1, 2, 3, 4, 5, 6, 7, 8, 9, 0]
    -[1, 2, 3, 4, 5, 6, 7, 8, 9, 0]
    -[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    -[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    -Expected: SetType cannot be cast to java.lang.Comparable
    -Expected: HashType cannot be cast to java.lang.Comparable
    +[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
    +[10, 9, 8, 7, 6, 5, 0, 1, 2, 3, 4]
    +[10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
    +[1, 6, 8, 6, 2, 7, 8, 9, 4, 10, 7, 5, 1, 3, 4, 9, 9,
    +10, 5, 3, 2, 0, 4, 1, 2, 0, 8, 3, 0, 10, 6, 5, 7]
    +[3, 1, 4, 8, 7, 6, 9, 5, 3, 0, 10, 5, 5, 10, 7, 8, 8,
    +9, 1, 4, 10, 2, 6, 9, 1, 6, 0, 3, 2, 0, 7, 2, 4]
    +[10, 9, 8, 7, 6, 5, 0, 1, 2, 3, 4, 10, 9, 8, 7, 6, 5,
    +0, 1, 2, 3, 4, 10, 9, 8, 7, 6, 5, 0, 1, 2, 3, 4]
    +[10, 9, 8, 7, 6, 5, 0, 1, 2, 3, 4, 10, 9, 8, 7, 6, 5,
    +0, 1, 2, 3, 4, 10, 9, 8, 7, 6, 5, 0, 1, 2, 3, 4]
    +SetType cannot be cast to java.lang.Comparable
    +HashType cannot be cast to java.lang.Comparable
     */
    diff --git a/onjava/CountMap.java b/onjava/CountMap.java
    index 31bc86320..9f087e440 100644
    --- a/onjava/CountMap.java
    +++ b/onjava/CountMap.java
    @@ -19,8 +19,7 @@ private static String value(int key) {
           Integer.toString(key / chars.length);
       }
       public CountMap(int size) {
    -    if(size < 0) this.size = 0;
    -    else this.size = size;
    +    this.size = size < 0 ? 0 : size;
       }
       @Override
       public String get(Object key) {
    @@ -57,9 +56,17 @@ public Set> entrySet() {
             Collectors.toCollection(LinkedHashSet::new));
       }
       public static void main(String[] args) {
    +    final int LIM = 6;
         CountMap cm = new CountMap(60);
         System.out.println(cm);
         System.out.println(cm.get(500));
    +    cm.values().stream()
    +      .limit(LIM)
    +      .forEach(System.out::println);
    +    System.out.println();
    +    new Random().ints(LIM, 0, 1000)
    +      .mapToObj(cm::get)
    +      .forEach(System.out::println);
       }
     }
     /* Output:
    @@ -72,4 +79,17 @@ public static void main(String[] args) {
     49=X1, 50=Y1, 51=Z1, 52=A2, 53=B2, 54=C2, 55=D2, 56=E2,
     57=F2, 58=G2, 59=H2}
     G19
    +A0
    +B0
    +C0
    +D0
    +E0
    +F0
    +
    +E4
    +X33
    +P15
    +L28
    +M24
    +Y36
     */
    diff --git a/patterns/PaperScissorsRock.java b/patterns/PaperScissorsRock.java
    index 963da941a..f5c5e6148 100644
    --- a/patterns/PaperScissorsRock.java
    +++ b/patterns/PaperScissorsRock.java
    @@ -86,7 +86,8 @@ class ItemFactory {
         Arrays.asList(
           Scissors::new, Paper::new, Rock::new);
       static final int SZ = items.size();
    -  private static SplittableRandom rand = new SplittableRandom(47);
    +  private static SplittableRandom rand =
    +    new SplittableRandom(47);
       public static Item newItem() {
         return items.get(rand.nextInt(SZ)).get();
       }
    diff --git a/patterns/ShapeFactory1.java b/patterns/ShapeFactory1.java
    index 554033151..2a4108879 100644
    --- a/patterns/ShapeFactory1.java
    +++ b/patterns/ShapeFactory1.java
    @@ -7,8 +7,8 @@
     import java.util.stream.*;
     import patterns.shapes.*;
     
    -class StaticFactory {
    -  static Shape create(String type) {
    +public class ShapeFactory1 implements FactoryMethod {
    +  public Shape create(String type) {
         switch(type) {
           case "Circle": return new Circle();
           case "Square": return new Square();
    @@ -17,16 +17,8 @@ static Shape create(String type) {
             throw new BadShapeCreation(type);
         }
       }
    -}
    -
    -public class ShapeFactory1 {
       public static void main(String[] args) {
    -    Stream.of("Circle", "Square", "Triangle",
    -      "Square", "Circle", "Circle", "Triangle")
    -      .map(StaticFactory::create)
    -      .peek(Shape::draw)
    -      .peek(Shape::erase)
    -      .count(); // Terminal operation
    +    FactoryTest.test(new ShapeFactory1());
       }
     }
     /* Output:
    diff --git a/patterns/ShapeFactory2.java b/patterns/ShapeFactory2.java
    index 6670c0d35..0253fc864 100644
    --- a/patterns/ShapeFactory2.java
    +++ b/patterns/ShapeFactory2.java
    @@ -7,37 +7,32 @@
     import java.util.stream.*;
     import patterns.shapes.*;
     
    -class DynamicFactory {
    -  static Map factories =
    +public class ShapeFactory2 implements FactoryMethod {
    +  Map factories =
         new HashMap<>();
       static Constructor load(String id) {
         System.out.println("loading " + id);
         try {
           return Class.forName("patterns.shapes." + id)
             .getConstructor();
    -    } catch(Exception e) {
    +    } catch(ClassNotFoundException |
    +            NoSuchMethodException e) {
           throw new BadShapeCreation(id);
         }
       }
    -  static Shape create(String id) {
    +  public Shape create(String id) {
         try {
           return (Shape)factories
    -        .computeIfAbsent(id, DynamicFactory::load)
    +        .computeIfAbsent(id, ShapeFactory2::load)
             .newInstance();
    -    } catch(Exception e) {
    +    } catch(InstantiationException |
    +            IllegalAccessException |
    +            InvocationTargetException e) {
           throw new BadShapeCreation(id);
         }
       }
    -}
    -
    -public class ShapeFactory2 {
       public static void main(String[] args) {
    -    Stream.of("Circle", "Square", "Triangle",
    -      "Square", "Circle", "Circle", "Triangle")
    -      .map(DynamicFactory::create)
    -      .peek(Shape::draw)
    -      .peek(Shape::erase)
    -      .count();
    +    FactoryTest.test(new ShapeFactory2());
       }
     }
     /* Output:
    diff --git a/patterns/doubledispatch/TypedBinMember.java b/patterns/doubledispatch/TypedBinMember.java
    index 72b11b75e..456d02c01 100644
    --- a/patterns/doubledispatch/TypedBinMember.java
    +++ b/patterns/doubledispatch/TypedBinMember.java
    @@ -8,7 +8,7 @@
     package patterns.doubledispatch;
     import java.util.*;
     
    -interface TypedBinMember {
    +public interface TypedBinMember {
       // The new method:
       boolean addToBin(List bins);
     }
    diff --git a/patterns/shapes/FactoryMethod.java b/patterns/shapes/FactoryMethod.java
    new file mode 100644
    index 000000000..b03c8239c
    --- /dev/null
    +++ b/patterns/shapes/FactoryMethod.java
    @@ -0,0 +1,9 @@
    +// patterns/shapes/FactoryMethod.java
    +// (c)2017 MindView LLC: see Copyright.txt
    +// We make no guarantees that this code is fit for any purpose.
    +// Visit http://OnJava8.com for more book information.
    +package patterns.shapes;
    +
    +public interface FactoryMethod {
    +  Shape create(String type);
    +}
    diff --git a/patterns/shapes/FactoryTest.java b/patterns/shapes/FactoryTest.java
    new file mode 100644
    index 000000000..2a9e671ee
    --- /dev/null
    +++ b/patterns/shapes/FactoryTest.java
    @@ -0,0 +1,17 @@
    +// patterns/shapes/FactoryTest.java
    +// (c)2017 MindView LLC: see Copyright.txt
    +// We make no guarantees that this code is fit for any purpose.
    +// Visit http://OnJava8.com for more book information.
    +package patterns.shapes;
    +import java.util.stream.*;
    +
    +public class FactoryTest {
    +  public static void test(FactoryMethod factory) {
    +    Stream.of("Circle", "Square", "Triangle",
    +      "Square", "Circle", "Circle", "Triangle")
    +      .map(factory::create)
    +      .peek(Shape::draw)
    +      .peek(Shape::erase)
    +      .count(); // Terminal operation
    +  }
    +}
    diff --git a/patterns/trash/Trash.java b/patterns/trash/Trash.java
    index 297144ee1..e8d9d3517 100644
    --- a/patterns/trash/Trash.java
    +++ b/patterns/trash/Trash.java
    @@ -66,8 +66,8 @@ public static  T factory(Info info) {
             try {
               // Get the dynamic constructor method
               // that takes a double argument:
    -          Constructor ctor = trashType.getConstructor(
    -                  double.class);
    +          Constructor ctor =
    +            trashType.getConstructor(double.class);
               // Call the constructor to create a
               // new object:
               return (T)ctor.newInstance(info.data);
    diff --git a/patterns/trashvisitor/Visitable.java b/patterns/trashvisitor/Visitable.java
    index 040dec17d..7d736b3e9 100644
    --- a/patterns/trashvisitor/Visitable.java
    +++ b/patterns/trashvisitor/Visitable.java
    @@ -6,7 +6,7 @@
     // Trash hierarchy without modifying the base class
     package patterns.trashvisitor;
     
    -interface Visitable {
    +public interface Visitable {
       // The new method:
       void accept(Visitor v);
     }
    diff --git a/patterns/trashvisitor/Visitor.java b/patterns/trashvisitor/Visitor.java
    index f098440ce..0a97e3a2d 100644
    --- a/patterns/trashvisitor/Visitor.java
    +++ b/patterns/trashvisitor/Visitor.java
    @@ -5,7 +5,7 @@
     // The base interface for visitors
     package patterns.trashvisitor;
     
    -interface Visitor {
    +public interface Visitor {
       void visit(Aluminum a);
       void visit(Paper p);
       void visit(Glass g);
    diff --git a/patterns/visitor/BeeAndFlowers.java b/patterns/visitor/BeeAndFlowers.java
    index 6ba97f11b..3f05cd5e0 100644
    --- a/patterns/visitor/BeeAndFlowers.java
    +++ b/patterns/visitor/BeeAndFlowers.java
    @@ -75,7 +75,8 @@ class FlowerFactory {
         Arrays.asList(Gladiolus::new,
           Renuculus::new, Chrysanthemum::new);
       static final int SZ = flowers.size();
    -  private static SplittableRandom rand = new SplittableRandom(47);
    +  private static SplittableRandom rand =
    +    new SplittableRandom(47);
       public static Flower newFlower() {
         return flowers.get(rand.nextInt(SZ)).get();
       }
    
    From 5ec9f9b9017ec064f9bb512b10375af6d338cf4d Mon Sep 17 00:00:00 2001
    From: Bruce Eckel 
    Date: Tue, 10 Jan 2017 14:11:16 -0800
    Subject: [PATCH 190/320] new appendix
    
    ---
     collectiontopics/Bits.java                    |  2 +-
     collectiontopics/CanonicalMapping.java        |  4 +-
     collectiontopics/Prediction.java              | 18 ------
     collectiontopics/SpringDetector.java          | 39 ------------
     collectiontopics/SpringDetector2.java         | 22 -------
     .../ComposedEquality.java                     |  2 +-
     .../CountedString.java                        |  5 +-
     equalshashcode/DefaultComparison.java         | 24 +++++++
     .../Equality.java                             |  2 +-
     .../EqualityFactory.java                      |  2 +-
     .../Groundhog.java                            |  2 +-
     .../Groundhog2.java                           |  2 +-
     .../IndividualTest.java                       | 19 ++++--
     .../MapEntry.java                             | 26 ++++----
     equalshashcode/Prediction.java                | 15 +++++
     .../SimpleHashMap.java                        | 47 +++++++-------
     .../SlowMap.java                              | 41 ++++++------
     equalshashcode/SpringDetector.java            | 62 +++++++++++++++++++
     equalshashcode/SpringDetector2.java           | 25 ++++++++
     .../StringHashCode.java                       |  2 +-
     equalshashcode/SubtypeEquality.java           | 60 ++++++++++++++++++
     equalshashcode/SubtypeEquality2.java          | 40 ++++++++++++
     .../SuccinctEquality.java                     |  2 +-
     generics/Holder.java                          |  2 +-
     gradle/subprojects.gradle                     |  9 ++-
     onjava/CountMap.java                          | 16 ++---
     onjava/Countries.java                         |  2 +-
     typeinfo/pets/Individual.java                 |  8 +--
     28 files changed, 328 insertions(+), 172 deletions(-)
     delete mode 100644 collectiontopics/Prediction.java
     delete mode 100644 collectiontopics/SpringDetector.java
     delete mode 100644 collectiontopics/SpringDetector2.java
     rename {collectiontopics => equalshashcode}/ComposedEquality.java (97%)
     rename {collectiontopics => equalshashcode}/CountedString.java (95%)
     create mode 100644 equalshashcode/DefaultComparison.java
     rename {collectiontopics => equalshashcode}/Equality.java (98%)
     rename {collectiontopics => equalshashcode}/EqualityFactory.java (86%)
     rename {collectiontopics => equalshashcode}/Groundhog.java (91%)
     rename {collectiontopics => equalshashcode}/Groundhog2.java (94%)
     rename {collectiontopics => equalshashcode}/IndividualTest.java (64%)
     rename {collectiontopics => equalshashcode}/MapEntry.java (56%)
     create mode 100644 equalshashcode/Prediction.java
     rename {collectiontopics => equalshashcode}/SimpleHashMap.java (63%)
     rename {collectiontopics => equalshashcode}/SlowMap.java (60%)
     create mode 100644 equalshashcode/SpringDetector.java
     create mode 100644 equalshashcode/SpringDetector2.java
     rename {collectiontopics => equalshashcode}/StringHashCode.java (91%)
     create mode 100644 equalshashcode/SubtypeEquality.java
     create mode 100644 equalshashcode/SubtypeEquality2.java
     rename {collectiontopics => equalshashcode}/SuccinctEquality.java (96%)
    
    diff --git a/collectiontopics/Bits.java b/collectiontopics/Bits.java
    index bc0fe9275..3235ae390 100644
    --- a/collectiontopics/Bits.java
    +++ b/collectiontopics/Bits.java
    @@ -14,7 +14,7 @@ public static void printBitSet(BitSet b) {
         System.out.println("bit pattern: " + bbits);
       }
       public static void main(String[] args) {
    -    SplittableRandom rand = new SplittableRandom(47);
    +    Random rand = new Random(47);
         // Take the LSB of nextInt():
         byte bt = (byte)rand.nextInt();
         BitSet bb = new BitSet();
    diff --git a/collectiontopics/CanonicalMapping.java b/collectiontopics/CanonicalMapping.java
    index 15ffcb065..c00e3975f 100644
    --- a/collectiontopics/CanonicalMapping.java
    +++ b/collectiontopics/CanonicalMapping.java
    @@ -11,7 +11,9 @@ class Element {
       @Override
       public String toString() { return ident; }
       @Override
    -  public int hashCode() { return ident.hashCode(); }
    +  public int hashCode() {
    +    return Objects.hashCode(ident);
    +  }
       @Override
       public boolean equals(Object r) {
         return r instanceof Element &&
    diff --git a/collectiontopics/Prediction.java b/collectiontopics/Prediction.java
    deleted file mode 100644
    index 98373f357..000000000
    --- a/collectiontopics/Prediction.java
    +++ /dev/null
    @@ -1,18 +0,0 @@
    -// collectiontopics/Prediction.java
    -// (c)2017 MindView LLC: see Copyright.txt
    -// We make no guarantees that this code is fit for any purpose.
    -// Visit http://OnJava8.com for more book information.
    -// Predicting the weather with groundhogs
    -import java.util.*;
    -
    -public class Prediction {
    -  private static SplittableRandom rand = new SplittableRandom(47);
    -  private boolean shadow = rand.nextDouble() > 0.5;
    -  @Override
    -  public String toString() {
    -    if(shadow)
    -      return "Six more weeks of Winter!";
    -    else
    -      return "Early Spring!";
    -  }
    -}
    diff --git a/collectiontopics/SpringDetector.java b/collectiontopics/SpringDetector.java
    deleted file mode 100644
    index a5af8e3af..000000000
    --- a/collectiontopics/SpringDetector.java
    +++ /dev/null
    @@ -1,39 +0,0 @@
    -// collectiontopics/SpringDetector.java
    -// (c)2017 MindView LLC: see Copyright.txt
    -// We make no guarantees that this code is fit for any purpose.
    -// Visit http://OnJava8.com for more book information.
    -// What will the weather be?
    -import java.lang.reflect.*;
    -import java.util.*;
    -
    -public class SpringDetector {
    -  // Uses a Groundhog or class derived from Groundhog:
    -  public static 
    -  void detectSpring(Class type) throws Exception {
    -    Constructor ghog = type.getConstructor(int.class);
    -    Map map = new HashMap<>();
    -    for(int i = 0; i < 10; i++)
    -      map.put(ghog.newInstance(i), new Prediction());
    -    System.out.println("map = " + map);
    -    Groundhog gh = ghog.newInstance(3);
    -    System.out.println("Looking up prediction for " + gh);
    -    if(map.containsKey(gh))
    -      System.out.println(map.get(gh));
    -    else
    -      System.out.println("Key not found: " + gh);
    -  }
    -  public static void
    -  main(String[] args) throws Exception {
    -    detectSpring(Groundhog.class);
    -  }
    -}
    -/* Output:
    -map = {Groundhog #2=Early Spring!, Groundhog #5=Early
    -Spring!, Groundhog #6=Early Spring!, Groundhog #4=Early
    -Spring!, Groundhog #9=Six more weeks of Winter!, Groundhog
    -#8=Six more weeks of Winter!, Groundhog #0=Early Spring!,
    -Groundhog #1=Early Spring!, Groundhog #3=Early Spring!,
    -Groundhog #7=Six more weeks of Winter!}
    -Looking up prediction for Groundhog #3
    -Key not found: Groundhog #3
    -*/
    diff --git a/collectiontopics/SpringDetector2.java b/collectiontopics/SpringDetector2.java
    deleted file mode 100644
    index e82515ebf..000000000
    --- a/collectiontopics/SpringDetector2.java
    +++ /dev/null
    @@ -1,22 +0,0 @@
    -// collectiontopics/SpringDetector2.java
    -// (c)2017 MindView LLC: see Copyright.txt
    -// We make no guarantees that this code is fit for any purpose.
    -// Visit http://OnJava8.com for more book information.
    -// A working key
    -
    -public class SpringDetector2 {
    -  public static void
    -  main(String[] args) throws Exception {
    -    SpringDetector.detectSpring(Groundhog2.class);
    -  }
    -}
    -/* Output:
    -map = {Groundhog #0=Early Spring!, Groundhog #1=Early
    -Spring!, Groundhog #2=Early Spring!, Groundhog #3=Early
    -Spring!, Groundhog #4=Early Spring!, Groundhog #5=Early
    -Spring!, Groundhog #6=Early Spring!, Groundhog #7=Six more
    -weeks of Winter!, Groundhog #8=Six more weeks of Winter!,
    -Groundhog #9=Six more weeks of Winter!}
    -Looking up prediction for Groundhog #3
    -Early Spring!
    -*/
    diff --git a/collectiontopics/ComposedEquality.java b/equalshashcode/ComposedEquality.java
    similarity index 97%
    rename from collectiontopics/ComposedEquality.java
    rename to equalshashcode/ComposedEquality.java
    index 246f190be..b9931a66e 100644
    --- a/collectiontopics/ComposedEquality.java
    +++ b/equalshashcode/ComposedEquality.java
    @@ -1,4 +1,4 @@
    -// collectiontopics/ComposedEquality.java
    +// equalshashcode/ComposedEquality.java
     // (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
    diff --git a/collectiontopics/CountedString.java b/equalshashcode/CountedString.java
    similarity index 95%
    rename from collectiontopics/CountedString.java
    rename to equalshashcode/CountedString.java
    index 3d3d370fb..3b0064d6b 100644
    --- a/collectiontopics/CountedString.java
    +++ b/equalshashcode/CountedString.java
    @@ -1,4 +1,4 @@
    -// collectiontopics/CountedString.java
    +// equalshashcode/CountedString.java
     // (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
    @@ -41,8 +41,7 @@ public boolean equals(Object o) {
           Objects.equals(id, ((CountedString)o).id);
       }
       public static void main(String[] args) {
    -    Map map =
    -      new HashMap<>();
    +    Map map = new HashMap<>();
         CountedString[] cs = new CountedString[5];
         for(int i = 0; i < cs.length; i++) {
           cs[i] = new CountedString("hi");
    diff --git a/equalshashcode/DefaultComparison.java b/equalshashcode/DefaultComparison.java
    new file mode 100644
    index 000000000..a702d4da7
    --- /dev/null
    +++ b/equalshashcode/DefaultComparison.java
    @@ -0,0 +1,24 @@
    +// equalshashcode/DefaultComparison.java
    +// (c)2017 MindView LLC: see Copyright.txt
    +// We make no guarantees that this code is fit for any purpose.
    +// Visit http://OnJava8.com for more book information.
    +
    +class DefaultComparison {
    +  private int i, j, k;
    +  public DefaultComparison(int i, int j, int k) {
    +    this.i = i;
    +    this.j = j;
    +    this.k = k;
    +  }
    +  public static void main(String[] args) {
    +    DefaultComparison
    +      a = new DefaultComparison(1, 2, 3),
    +      b = new DefaultComparison(1, 2, 3);
    +    System.out.println(a == a);
    +    System.out.println(a == b);
    +  }
    +}
    +/* Output:
    +true
    +false
    +*/
    diff --git a/collectiontopics/Equality.java b/equalshashcode/Equality.java
    similarity index 98%
    rename from collectiontopics/Equality.java
    rename to equalshashcode/Equality.java
    index b4e9f7fe3..4fd0e36a4 100644
    --- a/collectiontopics/Equality.java
    +++ b/equalshashcode/Equality.java
    @@ -1,4 +1,4 @@
    -// collectiontopics/Equality.java
    +// equalshashcode/Equality.java
     // (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
    diff --git a/collectiontopics/EqualityFactory.java b/equalshashcode/EqualityFactory.java
    similarity index 86%
    rename from collectiontopics/EqualityFactory.java
    rename to equalshashcode/EqualityFactory.java
    index 0fe779b2b..0f391cbd8 100644
    --- a/collectiontopics/EqualityFactory.java
    +++ b/equalshashcode/EqualityFactory.java
    @@ -1,4 +1,4 @@
    -// collectiontopics/EqualityFactory.java
    +// equalshashcode/EqualityFactory.java
     // (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
    diff --git a/collectiontopics/Groundhog.java b/equalshashcode/Groundhog.java
    similarity index 91%
    rename from collectiontopics/Groundhog.java
    rename to equalshashcode/Groundhog.java
    index 9f68ca208..2f0513f43 100644
    --- a/collectiontopics/Groundhog.java
    +++ b/equalshashcode/Groundhog.java
    @@ -1,4 +1,4 @@
    -// collectiontopics/Groundhog.java
    +// equalshashcode/Groundhog.java
     // (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
    diff --git a/collectiontopics/Groundhog2.java b/equalshashcode/Groundhog2.java
    similarity index 94%
    rename from collectiontopics/Groundhog2.java
    rename to equalshashcode/Groundhog2.java
    index a642c706f..70f253d81 100644
    --- a/collectiontopics/Groundhog2.java
    +++ b/equalshashcode/Groundhog2.java
    @@ -1,4 +1,4 @@
    -// collectiontopics/Groundhog2.java
    +// equalshashcode/Groundhog2.java
     // (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
    diff --git a/collectiontopics/IndividualTest.java b/equalshashcode/IndividualTest.java
    similarity index 64%
    rename from collectiontopics/IndividualTest.java
    rename to equalshashcode/IndividualTest.java
    index fa5e51305..fc4334150 100644
    --- a/collectiontopics/IndividualTest.java
    +++ b/equalshashcode/IndividualTest.java
    @@ -1,4 +1,4 @@
    -// collectiontopics/IndividualTest.java
    +// equalshashcode/IndividualTest.java
     // (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
    @@ -13,12 +13,19 @@ public static void main(String[] args) {
             MapOfList.petPeople.values())
           for(Pet p : lp)
             pets.add(p);
    -    System.out.println(pets);
    +    pets.forEach(System.out::println);
       }
     }
     /* Output:
    -[Cat Elsie May, Cat Pinkola, Cat Shackleton, Cat Stanford
    -aka Stinky el Negro, Cymric Molly, Dog Margrett, Mutt Spot,
    -Pug Louie aka Louis Snorkelstein Dupree, Rat Fizzy, Rat
    -Freckly, Rat Fuzzy]
    +Cat Elsie May
    +Cat Pinkola
    +Cat Shackleton
    +Cat Stanford aka Stinky el Negro
    +Cymric Molly
    +Dog Margrett
    +Mutt Spot
    +Pug Louie aka Louis Snorkelstein Dupree
    +Rat Fizzy
    +Rat Freckly
    +Rat Fuzzy
     */
    diff --git a/collectiontopics/MapEntry.java b/equalshashcode/MapEntry.java
    similarity index 56%
    rename from collectiontopics/MapEntry.java
    rename to equalshashcode/MapEntry.java
    index 80979cb00..a6c106036 100644
    --- a/collectiontopics/MapEntry.java
    +++ b/equalshashcode/MapEntry.java
    @@ -1,4 +1,4 @@
    -// collectiontopics/MapEntry.java
    +// equalshashcode/MapEntry.java
     // (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
    @@ -24,21 +24,19 @@ public V setValue(V v) {
       }
       @Override
       public int hashCode() {
    -    return (key==null ? 0 : key.hashCode()) ^
    -      (value==null ? 0 : value.hashCode());
    +    return Objects.hash(key, value);
       }
    +  @SuppressWarnings("unchecked")
       @Override
    -  public boolean equals(Object o) {
    -    if(!(o instanceof MapEntry)) return false;
    -    @SuppressWarnings("unchecked")
    -    MapEntry me = (MapEntry)o;
    -    return
    -      (key == null ? me.getKey() == null :
    -        key.equals(me.getKey()))
    -       &&
    -      (value == null ? me.getValue() == null :
    -        value.equals(me.getValue()));
    +  public boolean equals(Object rval) {
    +    return rval instanceof MapEntry &&
    +      Objects.equals(key,
    +        ((MapEntry)rval).getKey()) &&
    +      Objects.equals(value,
    +        ((MapEntry)rval).getValue());
       }
       @Override
    -  public String toString() { return key + "=" + value; }
    +  public String toString() {
    +    return key + "=" + value;
    +  }
     }
    diff --git a/equalshashcode/Prediction.java b/equalshashcode/Prediction.java
    new file mode 100644
    index 000000000..7706aec1f
    --- /dev/null
    +++ b/equalshashcode/Prediction.java
    @@ -0,0 +1,15 @@
    +// equalshashcode/Prediction.java
    +// (c)2017 MindView LLC: see Copyright.txt
    +// We make no guarantees that this code is fit for any purpose.
    +// Visit http://OnJava8.com for more book information.
    +// Predicting the weather
    +import java.util.*;
    +
    +public class Prediction {
    +  private static Random rand = new Random(47);
    +  @Override
    +  public String toString() {
    +    return rand.nextBoolean() ?
    +      "Six more weeks of Winter!" : "Early Spring!";
    +  }
    +}
    diff --git a/collectiontopics/SimpleHashMap.java b/equalshashcode/SimpleHashMap.java
    similarity index 63%
    rename from collectiontopics/SimpleHashMap.java
    rename to equalshashcode/SimpleHashMap.java
    index 0c117243b..4658ec53e 100644
    --- a/collectiontopics/SimpleHashMap.java
    +++ b/equalshashcode/SimpleHashMap.java
    @@ -1,4 +1,4 @@
    -// collectiontopics/SimpleHashMap.java
    +// equalshashcode/SimpleHashMap.java
     // (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
    @@ -62,30 +62,29 @@ public Set> entrySet() {
       public static void main(String[] args) {
         SimpleHashMap m =
           new SimpleHashMap<>();
    -    m.putAll(Countries.capitals(25));
    -    System.out.println(m);
    -    System.out.println(m.get("ERITREA"));
    -    System.out.println(m.entrySet());
    +    m.putAll(Countries.capitals(8));
    +    m.forEach((k, v) ->
    +      System.out.println(k + "=" + v));
    +    System.out.println(m.get("BENIN"));
    +    m.entrySet().forEach(System.out::println);
       }
     }
     /* Output:
    -{CAPE VERDE=Praia, ANGOLA=Luanda, ETHIOPIA=Addis Ababa,
    -BENIN=Porto-Novo, CONGO=Brazzaville, LESOTHO=Maseru,
    -CENTRAL AFRICAN REPUBLIC=Bangui, EQUATORIAL GUINEA=Malabo,
    -ERITREA=Asmara, COMOROS=Moroni, BURKINA FASO=Ouagadougou,
    -GABON=Libreville, THE GAMBIA=Banjul, GUINEA=Conakry,
    -EGYPT=Cairo, BURUNDI=Bujumbura, ALGERIA=Algiers,
    -CAMEROON=Yaounde, GHANA=Accra, KENYA=Nairobi, COTE D'IVOIR
    -(IVORY COAST)=Yamoussoukro, BISSAU=Bissau,
    -DJIBOUTI=Dijibouti, CHAD=N'djamena, BOTSWANA=Gaberone}
    -Asmara
    -[CAPE VERDE=Praia, ANGOLA=Luanda, ETHIOPIA=Addis Ababa,
    -BENIN=Porto-Novo, CONGO=Brazzaville, LESOTHO=Maseru,
    -CENTRAL AFRICAN REPUBLIC=Bangui, EQUATORIAL GUINEA=Malabo,
    -ERITREA=Asmara, COMOROS=Moroni, BURKINA FASO=Ouagadougou,
    -GABON=Libreville, THE GAMBIA=Banjul, GUINEA=Conakry,
    -EGYPT=Cairo, BURUNDI=Bujumbura, ALGERIA=Algiers,
    -CAMEROON=Yaounde, GHANA=Accra, KENYA=Nairobi, COTE D'IVOIR
    -(IVORY COAST)=Yamoussoukro, BISSAU=Bissau,
    -DJIBOUTI=Dijibouti, CHAD=N'djamena, BOTSWANA=Gaberone]
    +CAMEROON=Yaounde
    +ANGOLA=Luanda
    +BURKINA FASO=Ouagadougou
    +BURUNDI=Bujumbura
    +ALGERIA=Algiers
    +BENIN=Porto-Novo
    +CAPE VERDE=Praia
    +BOTSWANA=Gaberone
    +Porto-Novo
    +CAMEROON=Yaounde
    +ANGOLA=Luanda
    +BURKINA FASO=Ouagadougou
    +BURUNDI=Bujumbura
    +ALGERIA=Algiers
    +BENIN=Porto-Novo
    +CAPE VERDE=Praia
    +BOTSWANA=Gaberone
     */
    diff --git a/collectiontopics/SlowMap.java b/equalshashcode/SlowMap.java
    similarity index 60%
    rename from collectiontopics/SlowMap.java
    rename to equalshashcode/SlowMap.java
    index 9ee0d646a..2add1e475 100644
    --- a/collectiontopics/SlowMap.java
    +++ b/equalshashcode/SlowMap.java
    @@ -1,4 +1,4 @@
    -// collectiontopics/SlowMap.java
    +// equalshashcode/SlowMap.java
     // (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
    @@ -36,24 +36,29 @@ public Set> entrySet() {
       }
       public static void main(String[] args) {
         SlowMap m= new SlowMap<>();
    -    m.putAll(Countries.capitals(15));
    -    System.out.println(m);
    -    System.out.println(m.get("BULGARIA"));
    -    System.out.println(m.entrySet());
    +    m.putAll(Countries.capitals(8));
    +    m.forEach((k, v) ->
    +      System.out.println(k + "=" + v));
    +    System.out.println(m.get("BENIN"));
    +    m.entrySet().forEach(System.out::println);
       }
     }
     /* Output:
    -{ANGOLA=Luanda, CAPE VERDE=Praia, EGYPT=Cairo,
    -BURUNDI=Bujumbura, BENIN=Porto-Novo, ALGERIA=Algiers,
    -CAMEROON=Yaounde, CONGO=Brazzaville, CENTRAL AFRICAN
    -REPUBLIC=Bangui, EQUATORIAL GUINEA=Malabo, COMOROS=Moroni,
    -DJIBOUTI=Dijibouti, BURKINA FASO=Ouagadougou,
    -CHAD=N'djamena, BOTSWANA=Gaberone}
    -null
    -[ANGOLA=Luanda, CAPE VERDE=Praia, EGYPT=Cairo,
    -BURUNDI=Bujumbura, BENIN=Porto-Novo, ALGERIA=Algiers,
    -CAMEROON=Yaounde, CONGO=Brazzaville, CENTRAL AFRICAN
    -REPUBLIC=Bangui, EQUATORIAL GUINEA=Malabo, COMOROS=Moroni,
    -DJIBOUTI=Dijibouti, BURKINA FASO=Ouagadougou,
    -CHAD=N'djamena, BOTSWANA=Gaberone]
    +CAMEROON=Yaounde
    +ANGOLA=Luanda
    +BURKINA FASO=Ouagadougou
    +BURUNDI=Bujumbura
    +ALGERIA=Algiers
    +BENIN=Porto-Novo
    +CAPE VERDE=Praia
    +BOTSWANA=Gaberone
    +Porto-Novo
    +CAMEROON=Yaounde
    +ANGOLA=Luanda
    +BURKINA FASO=Ouagadougou
    +BURUNDI=Bujumbura
    +ALGERIA=Algiers
    +BENIN=Porto-Novo
    +CAPE VERDE=Praia
    +BOTSWANA=Gaberone
     */
    diff --git a/equalshashcode/SpringDetector.java b/equalshashcode/SpringDetector.java
    new file mode 100644
    index 000000000..713d032c1
    --- /dev/null
    +++ b/equalshashcode/SpringDetector.java
    @@ -0,0 +1,62 @@
    +// equalshashcode/SpringDetector.java
    +// (c)2017 MindView LLC: see Copyright.txt
    +// We make no guarantees that this code is fit for any purpose.
    +// Visit http://OnJava8.com for more book information.
    +// What will the weather be?
    +import java.util.*;
    +import java.util.stream.*;
    +import java.util.function.*;
    +import java.lang.reflect.*;
    +
    +public class SpringDetector {
    +  public static 
    +  void detectSpring(Class type) {
    +    try {
    +      Constructor ghog =
    +        type.getConstructor(int.class);
    +      Map map =
    +        IntStream.range(0, 10)
    +        .mapToObj(i -> {
    +          try {
    +            return ghog.newInstance(i);
    +          } catch(Exception e) {
    +            throw new RuntimeException(e);
    +          }
    +        })
    +        .collect(Collectors.toMap(
    +          Function.identity(),
    +          gh -> new Prediction()));
    +      map.forEach((k, v) ->
    +        System.out.println(k + ": " + v));
    +      Groundhog gh = ghog.newInstance(3);
    +      System.out.println(
    +        "Looking up prediction for " + gh);
    +      if(map.containsKey(gh))
    +        System.out.println(map.get(gh));
    +      else
    +        System.out.println("Key not found: " + gh);
    +    } catch(NoSuchMethodException |
    +            IllegalAccessException |
    +            InvocationTargetException |
    +            InstantiationException e) {
    +      throw new RuntimeException(e);
    +    }
    +  }
    +  public static void main(String[] args) {
    +    detectSpring(Groundhog.class);
    +  }
    +}
    +/* Output:
    +Groundhog #3: Six more weeks of Winter!
    +Groundhog #0: Early Spring!
    +Groundhog #8: Six more weeks of Winter!
    +Groundhog #6: Early Spring!
    +Groundhog #4: Early Spring!
    +Groundhog #2: Six more weeks of Winter!
    +Groundhog #1: Early Spring!
    +Groundhog #9: Early Spring!
    +Groundhog #5: Six more weeks of Winter!
    +Groundhog #7: Six more weeks of Winter!
    +Looking up prediction for Groundhog #3
    +Key not found: Groundhog #3
    +*/
    diff --git a/equalshashcode/SpringDetector2.java b/equalshashcode/SpringDetector2.java
    new file mode 100644
    index 000000000..ed9db7249
    --- /dev/null
    +++ b/equalshashcode/SpringDetector2.java
    @@ -0,0 +1,25 @@
    +// equalshashcode/SpringDetector2.java
    +// (c)2017 MindView LLC: see Copyright.txt
    +// We make no guarantees that this code is fit for any purpose.
    +// Visit http://OnJava8.com for more book information.
    +// A working key
    +
    +public class SpringDetector2 {
    +  public static void main(String[] args) {
    +    SpringDetector.detectSpring(Groundhog2.class);
    +  }
    +}
    +/* Output:
    +Groundhog #0: Six more weeks of Winter!
    +Groundhog #1: Early Spring!
    +Groundhog #2: Six more weeks of Winter!
    +Groundhog #3: Early Spring!
    +Groundhog #4: Early Spring!
    +Groundhog #5: Six more weeks of Winter!
    +Groundhog #6: Early Spring!
    +Groundhog #7: Early Spring!
    +Groundhog #8: Six more weeks of Winter!
    +Groundhog #9: Six more weeks of Winter!
    +Looking up prediction for Groundhog #3
    +Early Spring!
    +*/
    diff --git a/collectiontopics/StringHashCode.java b/equalshashcode/StringHashCode.java
    similarity index 91%
    rename from collectiontopics/StringHashCode.java
    rename to equalshashcode/StringHashCode.java
    index c1461694f..69b3df468 100644
    --- a/collectiontopics/StringHashCode.java
    +++ b/equalshashcode/StringHashCode.java
    @@ -1,4 +1,4 @@
    -// collectiontopics/StringHashCode.java
    +// equalshashcode/StringHashCode.java
     // (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
    diff --git a/equalshashcode/SubtypeEquality.java b/equalshashcode/SubtypeEquality.java
    new file mode 100644
    index 000000000..50cf361b8
    --- /dev/null
    +++ b/equalshashcode/SubtypeEquality.java
    @@ -0,0 +1,60 @@
    +// equalshashcode/SubtypeEquality.java
    +// (c)2017 MindView LLC: see Copyright.txt
    +// We make no guarantees that this code is fit for any purpose.
    +// Visit http://OnJava8.com for more book information.
    +import java.util.*;
    +
    +enum Size { SMALL, MEDIUM, LARGE }
    +
    +class Animal {
    +  private static int counter = 0;
    +  private final int id = counter++;
    +  private final String name;
    +  private final Size size;
    +  public Animal(String name, Size size) {
    +    this.name = name;
    +    this.size = size;
    +  }
    +  @Override
    +  public boolean equals(Object rval) {
    +    return rval instanceof Animal &&
    +      // Objects.equals(id, ((Animal)rval).id) && // [1]
    +      Objects.equals(name, ((Animal)rval).name) &&
    +      Objects.equals(size, ((Animal)rval).size);
    +  }
    +  @Override
    +  public int hashCode() {
    +    return Objects.hash(name, size);
    +    // return Objects.hash(name, size, id);  // [2]
    +  }
    +  @Override
    +  public String toString() {
    +    return String.format("%s[%d]: %s %s %x",
    +      getClass().getSimpleName(), id,
    +      name, size, hashCode());
    +  }
    +}
    +
    +class Dog extends Animal {
    +  public Dog(String name, Size size) {
    +    super(name, size);
    +  }
    +}
    +
    +class Pig extends Animal {
    +  public Pig(String name, Size size) {
    +    super(name, size);
    +  }
    +}
    +
    +public class SubtypeEquality {
    +  public static void main(String[] args) {
    +    Set pets = new HashSet<>();
    +    pets.add(new Dog("Ralph", Size.MEDIUM));
    +    pets.add(new Pig("Ralph", Size.MEDIUM));
    +    pets.forEach(System.out::println);
    +  }
    +}
    +/* Output:
    +Dog[0]: Ralph MEDIUM a752aeee
    +*/
    diff --git a/equalshashcode/SubtypeEquality2.java b/equalshashcode/SubtypeEquality2.java
    new file mode 100644
    index 000000000..990ddf762
    --- /dev/null
    +++ b/equalshashcode/SubtypeEquality2.java
    @@ -0,0 +1,40 @@
    +// equalshashcode/SubtypeEquality2.java
    +// (c)2017 MindView LLC: see Copyright.txt
    +// We make no guarantees that this code is fit for any purpose.
    +// Visit http://OnJava8.com for more book information.
    +import java.util.*;
    +
    +class Dog2 extends Animal {
    +  public Dog2(String name, Size size) {
    +    super(name, size);
    +  }
    +  @Override
    +  public boolean equals(Object rval) {
    +    return rval instanceof Dog2 &&
    +      super.equals(rval);
    +  }
    +}
    +
    +class Pig2 extends Animal {
    +  public Pig2(String name, Size size) {
    +    super(name, size);
    +  }
    +  @Override
    +  public boolean equals(Object rval) {
    +    return rval instanceof Pig2 &&
    +      super.equals(rval);
    +  }
    +}
    +
    +public class SubtypeEquality2 {
    +  public static void main(String[] args) {
    +    Set pets = new HashSet<>();
    +    pets.add(new Dog2("Ralph", Size.MEDIUM));
    +    pets.add(new Pig2("Ralph", Size.MEDIUM));
    +    pets.forEach(System.out::println);
    +  }
    +}
    +/* Output:
    +Dog2[0]: Ralph MEDIUM a752aeee
    +Pig2[1]: Ralph MEDIUM a752aeee
    +*/
    diff --git a/collectiontopics/SuccinctEquality.java b/equalshashcode/SuccinctEquality.java
    similarity index 96%
    rename from collectiontopics/SuccinctEquality.java
    rename to equalshashcode/SuccinctEquality.java
    index dbb3c3495..a1734dadb 100644
    --- a/collectiontopics/SuccinctEquality.java
    +++ b/equalshashcode/SuccinctEquality.java
    @@ -1,4 +1,4 @@
    -// collectiontopics/SuccinctEquality.java
    +// equalshashcode/SuccinctEquality.java
     // (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
    diff --git a/generics/Holder.java b/generics/Holder.java
    index 6e17cb1eb..0d8e85d00 100644
    --- a/generics/Holder.java
    +++ b/generics/Holder.java
    @@ -17,7 +17,7 @@ public boolean equals(Object o) {
       }
       @Override
       public int hashCode() {
    -    return Objects.hash(value);
    +    return Objects.hashCode(value);
       }
       public static void main(String[] args) {
         Holder apple = new Holder<>(new Apple());
    diff --git a/gradle/subprojects.gradle b/gradle/subprojects.gradle
    index cc5ebba57..d22a7cff2 100644
    --- a/gradle/subprojects.gradle
    +++ b/gradle/subprojects.gradle
    @@ -5,13 +5,16 @@ project(':validating') {
     }
     
     project(':collectiontopics') {
    +    jmh {
    +        include = 'collectiontopics.jmh.*'
    +    }
    +}
    +
    +project(':equalshashcode') {
         dependencies {
             compile project(':typeinfo')
             compile project(':collections')
         }
    -    jmh {
    -        include = 'collectiontopics.jmh.*'
    -    }
     }
     
     project(':lowlevel') {
    diff --git a/onjava/CountMap.java b/onjava/CountMap.java
    index 9f087e440..5d7327995 100644
    --- a/onjava/CountMap.java
    +++ b/onjava/CountMap.java
    @@ -44,7 +44,7 @@ public String setValue(String value) {
         }
         @Override
         public int hashCode() {
    -      return Integer.valueOf(index).hashCode();
    +      return Objects.hashCode(index);
         }
       }
       @Override
    @@ -64,7 +64,7 @@ public static void main(String[] args) {
           .limit(LIM)
           .forEach(System.out::println);
         System.out.println();
    -    new Random().ints(LIM, 0, 1000)
    +    new Random(47).ints(LIM, 0, 1000)
           .mapToObj(cm::get)
           .forEach(System.out::println);
       }
    @@ -86,10 +86,10 @@ public static void main(String[] args) {
     E0
     F0
     
    -E4
    -X33
    -P15
    -L28
    -M24
    -Y36
    +Y9
    +J21
    +R26
    +D33
    +Z36
    +N16
     */
    diff --git a/onjava/Countries.java b/onjava/Countries.java
    index 467bf0855..7d077b5e5 100644
    --- a/onjava/Countries.java
    +++ b/onjava/Countries.java
    @@ -225,7 +225,7 @@ public boolean equals(Object o) {
           }
           @Override
           public int hashCode() {
    -        return DATA[index][0].hashCode();
    +        return Objects.hashCode(DATA[index][0]);
           }
           @Override
           public String getKey() { return DATA[index][0]; }
    diff --git a/typeinfo/pets/Individual.java b/typeinfo/pets/Individual.java
    index e30bce871..f7e7d204b 100644
    --- a/typeinfo/pets/Individual.java
    +++ b/typeinfo/pets/Individual.java
    @@ -26,11 +26,7 @@ public boolean equals(Object o) {
       }
       @Override
       public int hashCode() {
    -    int result = 17;
    -    if(name != null)
    -      result = 37 * result + name.hashCode();
    -    result = 37 * result + (int)id;
    -    return result;
    +    return Objects.hash(name, id);
       }
       @Override
       public int compareTo(Individual arg) {
    @@ -39,7 +35,7 @@ public int compareTo(Individual arg) {
         String argFirst = arg.getClass().getSimpleName();
         int firstCompare = first.compareTo(argFirst);
         if(firstCompare != 0)
    -    return firstCompare;
    +      return firstCompare;
         if(name != null && arg.name != null) {
           int secondCompare = name.compareTo(arg.name);
           if(secondCompare != 0)
    
    From d3ca481bdbb3742d601ab0ae5f42bed2ae2265d9 Mon Sep 17 00:00:00 2001
    From: Bruce Eckel 
    Date: Wed, 11 Jan 2017 09:11:59 -0800
    Subject: [PATCH 191/320] Fixed packaging so jmh build works
    
    ---
     collectiontopics/References.java | 9 ++++++---
     collectiontopics/jmh/Deques.java | 2 +-
     collectiontopics/jmh/Lists.java  | 2 +-
     collectiontopics/jmh/Maps.java   | 2 +-
     collectiontopics/jmh/Queues.java | 2 +-
     collectiontopics/jmh/Sets.java   | 2 +-
     6 files changed, 11 insertions(+), 8 deletions(-)
    
    diff --git a/collectiontopics/References.java b/collectiontopics/References.java
    index c7885fb24..68e9ec52a 100644
    --- a/collectiontopics/References.java
    +++ b/collectiontopics/References.java
    @@ -37,7 +37,8 @@ public static void main(String[] args) {
         for(int i = 0; i < size; i++) {
           sa.add(new SoftReference<>(
             new VeryBig("Soft " + i), rq));
    -      System.out.println("Just created: " + sa.getLast());
    +      System.out.println(
    +        "Just created: " + sa.getLast());
           checkQueue();
         }
         LinkedList> wa =
    @@ -45,7 +46,8 @@ public static void main(String[] args) {
         for(int i = 0; i < size; i++) {
           wa.add(new WeakReference<>(
             new VeryBig("Weak " + i), rq));
    -      System.out.println("Just created: " + wa.getLast());
    +      System.out.println(
    +        "Just created: " + wa.getLast());
           checkQueue();
         }
         SoftReference s =
    @@ -58,7 +60,8 @@ public static void main(String[] args) {
         for(int i = 0; i < size; i++) {
           pa.add(new PhantomReference<>(
             new VeryBig("Phantom " + i), rq));
    -      System.out.println("Just created: " + pa.getLast());
    +      System.out.println(
    +        "Just created: " + pa.getLast());
           checkQueue();
         }
       }
    diff --git a/collectiontopics/jmh/Deques.java b/collectiontopics/jmh/Deques.java
    index 379349b70..1a16b81b9 100644
    --- a/collectiontopics/jmh/Deques.java
    +++ b/collectiontopics/jmh/Deques.java
    @@ -3,7 +3,7 @@
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Performance differences between Deques
    -package understandingcollections.jmh;
    +package collectiontopics.jmh;
     import org.openjdk.jmh.annotations.*;
     import java.util.concurrent.TimeUnit;
     import java.util.*;
    diff --git a/collectiontopics/jmh/Lists.java b/collectiontopics/jmh/Lists.java
    index 9369335e5..86ee291a7 100644
    --- a/collectiontopics/jmh/Lists.java
    +++ b/collectiontopics/jmh/Lists.java
    @@ -3,7 +3,7 @@
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Performance differences between Lists
    -package understandingcollections.jmh;
    +package collectiontopics.jmh;
     import org.openjdk.jmh.annotations.*;
     import java.util.*;
     import java.util.concurrent.*;
    diff --git a/collectiontopics/jmh/Maps.java b/collectiontopics/jmh/Maps.java
    index 5a8ef73a9..bb2ef5e97 100644
    --- a/collectiontopics/jmh/Maps.java
    +++ b/collectiontopics/jmh/Maps.java
    @@ -3,7 +3,7 @@
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Performance differences between Maps
    -package understandingcollections.jmh;
    +package collectiontopics.jmh;
     import org.openjdk.jmh.annotations.*;
     import org.openjdk.jmh.infra.Blackhole;
     import java.util.*;
    diff --git a/collectiontopics/jmh/Queues.java b/collectiontopics/jmh/Queues.java
    index fdb1d59eb..5f300f5db 100644
    --- a/collectiontopics/jmh/Queues.java
    +++ b/collectiontopics/jmh/Queues.java
    @@ -3,7 +3,7 @@
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Performance differences between Queues
    -package understandingcollections.jmh;
    +package collectiontopics.jmh;
     import org.openjdk.jmh.annotations.*;
     import java.util.*;
     import java.util.concurrent.*;
    diff --git a/collectiontopics/jmh/Sets.java b/collectiontopics/jmh/Sets.java
    index c9913d1b1..3ab4f68ee 100644
    --- a/collectiontopics/jmh/Sets.java
    +++ b/collectiontopics/jmh/Sets.java
    @@ -3,7 +3,7 @@
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Demonstrates performance differences in Sets
    -package understandingcollections.jmh;
    +package collectiontopics.jmh;
     import org.openjdk.jmh.annotations.*;
     import org.openjdk.jmh.infra.Blackhole;
     import java.util.*;
    
    From 8833d2e228a644208d2a38da3c83110955bb7f62 Mon Sep 17 00:00:00 2001
    From: Bruce Eckel 
    Date: Wed, 11 Jan 2017 16:18:57 -0800
    Subject: [PATCH 192/320] Name changes and new TimedAbort
    
    ---
     ...venSupplier.java => AtomicEvenProducer.java} |  8 +++-----
     lowlevel/EvenChecker.java                       | 16 +++++++++-------
     .../{EvenSupplier.java => EvenProducer.java}    | 17 ++++++++---------
     lowlevel/ExceptionThread.java                   |  3 ++-
     lowlevel/IntGenerator.java                      | 15 +++++++++++++++
     lowlevel/IntSupplier.java                       | 12 ------------
     ...EvenSupplier.java => MutexEvenProducer.java} |  8 +++-----
     ...plier.java => SynchronizedEvenProducer.java} | 11 +++++------
     lowlevel/TestAbort.java                         | 17 +++++++++++++++++
     lowlevel/WorkStealingPool.java                  |  6 ++++--
     onjava/TimedAbort.java                          | 14 ++++++--------
     11 files changed, 72 insertions(+), 55 deletions(-)
     rename lowlevel/{AtomicEvenSupplier.java => AtomicEvenProducer.java} (72%)
     rename lowlevel/{EvenSupplier.java => EvenProducer.java} (61%)
     create mode 100644 lowlevel/IntGenerator.java
     delete mode 100644 lowlevel/IntSupplier.java
     rename lowlevel/{MutexEvenSupplier.java => MutexEvenProducer.java} (77%)
     rename lowlevel/{SynchronizedEvenSupplier.java => SynchronizedEvenProducer.java} (67%)
     create mode 100644 lowlevel/TestAbort.java
    
    diff --git a/lowlevel/AtomicEvenSupplier.java b/lowlevel/AtomicEvenProducer.java
    similarity index 72%
    rename from lowlevel/AtomicEvenSupplier.java
    rename to lowlevel/AtomicEvenProducer.java
    index 364f2b12d..d4a626055 100644
    --- a/lowlevel/AtomicEvenSupplier.java
    +++ b/lowlevel/AtomicEvenProducer.java
    @@ -1,13 +1,12 @@
    -// lowlevel/AtomicEvenSupplier.java
    +// lowlevel/AtomicEvenProducer.java
     // (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Atomic classes are occasionally useful in regular code
     // {IgnoreOutput} // No output validation
     import java.util.concurrent.atomic.*;
    -import onjava.TimedAbort;
     
    -public class AtomicEvenSupplier extends IntSupplier {
    +public class AtomicEvenProducer extends IntGenerator {
       private AtomicInteger currentEvenValue =
         new AtomicInteger(0);
       @Override
    @@ -15,7 +14,6 @@ public int next() {
         return currentEvenValue.addAndGet(2);
       }
       public static void main(String[] args) {
    -    new TimedAbort(4);
    -    EvenChecker.test(new AtomicEvenSupplier());
    +    EvenChecker.test(new AtomicEvenProducer());
       }
     }
    diff --git a/lowlevel/EvenChecker.java b/lowlevel/EvenChecker.java
    index ff5adbc2a..2a1e958cb 100644
    --- a/lowlevel/EvenChecker.java
    +++ b/lowlevel/EvenChecker.java
    @@ -3,13 +3,14 @@
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.concurrent.*;
    +import onjava.TimedAbort;
     
     public class EvenChecker implements Runnable {
    -  private IntSupplier generator;
    +  private IntGenerator generator;
       private final int id;
    -  public EvenChecker(IntSupplier g, int ident) {
    -    generator = g;
    -    id = ident;
    +  public EvenChecker(IntGenerator generator, int id) {
    +    this.generator = generator;
    +    this.id = id;
       }
       @Override
       public void run() {
    @@ -21,8 +22,8 @@ public void run() {
           }
         }
       }
    -  // Test any type of IntSupplier:
    -  public static void test(IntSupplier gp, int count) {
    +  // Test any IntGenerator:
    +  public static void test(IntGenerator gp, int count) {
         System.out.println("Press Control-C to exit");
         ExecutorService es = Executors.newCachedThreadPool();
         for(int i = 0; i < count; i++)
    @@ -30,7 +31,8 @@ public static void test(IntSupplier gp, int count) {
         es.shutdown();
       }
       // Default value for count:
    -  public static void test(IntSupplier gp) {
    +  public static void test(IntGenerator gp) {
    +    new TimedAbort(4);
         test(gp, 10);
       }
     }
    diff --git a/lowlevel/EvenSupplier.java b/lowlevel/EvenProducer.java
    similarity index 61%
    rename from lowlevel/EvenSupplier.java
    rename to lowlevel/EvenProducer.java
    index c1d07f3c4..c274ad094 100644
    --- a/lowlevel/EvenSupplier.java
    +++ b/lowlevel/EvenProducer.java
    @@ -1,26 +1,25 @@
    -// lowlevel/EvenSupplier.java
    +// lowlevel/EvenProducer.java
     // (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // When threads collide
    -import onjava.TimedAbort;
     
    -public class EvenSupplier extends IntSupplier {
    +public class EvenProducer extends IntGenerator {
       private int currentEvenValue = 0;
       @Override
       public int next() {
    -    ++currentEvenValue; // Danger point here!
    +    ++currentEvenValue; // [1]
         ++currentEvenValue;
         return currentEvenValue;
       }
       public static void main(String[] args) {
    -    new TimedAbort(4);
    -    EvenChecker.test(new EvenSupplier());
    +    EvenChecker.test(new EvenProducer());
       }
     }
     /* Output:
     Press Control-C to exit
    -193 not even!
    -191 not even!
    -TimedAbort 4
    +841 not even!
    +847 not even!
    +845 not even!
    +843 not even!
     */
    diff --git a/lowlevel/ExceptionThread.java b/lowlevel/ExceptionThread.java
    index e23e67cd2..c9f7f82a4 100644
    --- a/lowlevel/ExceptionThread.java
    +++ b/lowlevel/ExceptionThread.java
    @@ -12,7 +12,8 @@ public void run() {
         throw new RuntimeException();
       }
       public static void main(String[] args) {
    -    ExecutorService es = Executors.newCachedThreadPool();
    +    ExecutorService es =
    +      Executors.newCachedThreadPool();
         es.execute(new ExceptionThread());
         es.shutdown();
       }
    diff --git a/lowlevel/IntGenerator.java b/lowlevel/IntGenerator.java
    new file mode 100644
    index 000000000..c9714d5d0
    --- /dev/null
    +++ b/lowlevel/IntGenerator.java
    @@ -0,0 +1,15 @@
    +// lowlevel/IntGenerator.java
    +// (c)2017 MindView LLC: see Copyright.txt
    +// We make no guarantees that this code is fit for any purpose.
    +// Visit http://OnJava8.com for more book information.
    +import java.util.concurrent.atomic.AtomicBoolean;
    +
    +public abstract class IntGenerator {
    +  private AtomicBoolean canceled =
    +    new AtomicBoolean();
    +  public abstract int next();
    +  public void cancel() { canceled.set(true); }
    +  public boolean isCanceled() {
    +    return canceled.get();
    +  }
    +}
    diff --git a/lowlevel/IntSupplier.java b/lowlevel/IntSupplier.java
    deleted file mode 100644
    index d311a6a39..000000000
    --- a/lowlevel/IntSupplier.java
    +++ /dev/null
    @@ -1,12 +0,0 @@
    -// lowlevel/IntSupplier.java
    -// (c)2017 MindView LLC: see Copyright.txt
    -// We make no guarantees that this code is fit for any purpose.
    -// Visit http://OnJava8.com for more book information.
    -
    -public abstract class IntSupplier {
    -  private volatile boolean canceled = false;
    -  public abstract int next();
    -  // Allow this to be canceled:
    -  public void cancel() { canceled = true; }
    -  public boolean isCanceled() { return canceled; }
    -}
    diff --git a/lowlevel/MutexEvenSupplier.java b/lowlevel/MutexEvenProducer.java
    similarity index 77%
    rename from lowlevel/MutexEvenSupplier.java
    rename to lowlevel/MutexEvenProducer.java
    index 443bf0594..fbee4bb44 100644
    --- a/lowlevel/MutexEvenSupplier.java
    +++ b/lowlevel/MutexEvenProducer.java
    @@ -1,13 +1,12 @@
    -// lowlevel/MutexEvenSupplier.java
    +// lowlevel/MutexEvenProducer.java
     // (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Preventing thread collisions with mutexes
     // {IgnoreOutput} // No output validation
     import java.util.concurrent.locks.*;
    -import onjava.TimedAbort;
     
    -public class MutexEvenSupplier extends IntSupplier {
    +public class MutexEvenProducer extends IntGenerator {
       private int currentEvenValue = 0;
       private Lock lock = new ReentrantLock();
       @Override
    @@ -23,7 +22,6 @@ public int next() {
         }
       }
       public static void main(String[] args) {
    -    new TimedAbort(4);
    -    EvenChecker.test(new MutexEvenSupplier());
    +    EvenChecker.test(new MutexEvenProducer());
       }
     }
    diff --git a/lowlevel/SynchronizedEvenSupplier.java b/lowlevel/SynchronizedEvenProducer.java
    similarity index 67%
    rename from lowlevel/SynchronizedEvenSupplier.java
    rename to lowlevel/SynchronizedEvenProducer.java
    index 178a833c5..c1bba5f77 100644
    --- a/lowlevel/SynchronizedEvenSupplier.java
    +++ b/lowlevel/SynchronizedEvenProducer.java
    @@ -1,23 +1,22 @@
    -// lowlevel/SynchronizedEvenSupplier.java
    +// lowlevel/SynchronizedEvenProducer.java
     // (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Simplifying mutexes with the synchronized keyword
     // {IgnoreOutput} // No output validation
    -import onjava.TimedAbort;
    +import onjava.Nap;
     
     public class
    -SynchronizedEvenSupplier extends IntSupplier {
    +SynchronizedEvenProducer extends IntGenerator {
       private int currentEvenValue = 0;
       @Override
       public synchronized int next() {
         ++currentEvenValue;
    -    Thread.yield(); // Cause failure faster
    +    new Nap(10); // Cause failure faster
         ++currentEvenValue;
         return currentEvenValue;
       }
       public static void main(String[] args) {
    -    new TimedAbort(4);
    -    EvenChecker.test(new SynchronizedEvenSupplier());
    +    EvenChecker.test(new SynchronizedEvenProducer());
       }
     }
    diff --git a/lowlevel/TestAbort.java b/lowlevel/TestAbort.java
    new file mode 100644
    index 000000000..82f36c93c
    --- /dev/null
    +++ b/lowlevel/TestAbort.java
    @@ -0,0 +1,17 @@
    +// lowlevel/TestAbort.java
    +// (c)2017 MindView LLC: see Copyright.txt
    +// We make no guarantees that this code is fit for any purpose.
    +// Visit http://OnJava8.com for more book information.
    +import onjava.*;
    +
    +public class TestAbort {
    +  public static void main(String[] args) {
    +    new TimedAbort(1);
    +    System.out.println("Napping for 4");
    +    new Nap(4000);
    +  }
    +}
    +/* Output:
    +Napping for 4
    +TimedAbort 1
    +*/
    diff --git a/lowlevel/WorkStealingPool.java b/lowlevel/WorkStealingPool.java
    index a564172e9..a24f3722f 100644
    --- a/lowlevel/WorkStealingPool.java
    +++ b/lowlevel/WorkStealingPool.java
    @@ -2,6 +2,7 @@
     // (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
    +import java.util.stream.*;
     import java.util.concurrent.*;
     
     class ShowThread implements Runnable {
    @@ -19,8 +20,9 @@ public static void main(String[] args)
           Runtime.getRuntime().availableProcessors());
         ExecutorService exec =
           Executors.newWorkStealingPool();
    -    for(int i = 0; i < 10; i++)
    -      exec.execute(new ShowThread());
    +    IntStream.range(0, 10)
    +      .mapToObj(n -> new ShowThread())
    +      .forEach(exec::execute);
         exec.awaitTermination(1, TimeUnit.SECONDS);
       }
     }
    diff --git a/onjava/TimedAbort.java b/onjava/TimedAbort.java
    index 7c06df071..5c5d262c4 100644
    --- a/onjava/TimedAbort.java
    +++ b/onjava/TimedAbort.java
    @@ -4,16 +4,14 @@
     // Visit http://OnJava8.com for more book information.
     // Terminate a program after n seconds
     package onjava;
    -import java.util.*;
    +import java.util.concurrent.*;
     
     public class TimedAbort {
       public TimedAbort(int n) {
    -    new java.util.Timer().schedule(new TimerTask() {
    -      @Override
    -      public void run() {
    -        System.out.println("TimedAbort " + n);
    -        System.exit(0);
    -      }
    -    }, n * 1000);
    +    CompletableFuture.runAsync(() -> {
    +      new Nap(1000 * n);
    +      System.out.println("TimedAbort " + n);
    +      System.exit(0);
    +    });
       }
     }
    
    From bc786ef438f4b5c3cb3b4fa26e7c8301c2512ab2 Mon Sep 17 00:00:00 2001
    From: Bruce Eckel 
    Date: Thu, 12 Jan 2017 11:15:03 -0800
    Subject: [PATCH 193/320] Some cleanups during rewrite
    
    ---
     lowlevel/AttemptLocking.java            |  3 +-
     lowlevel/CriticalSection.java           |  3 -
     lowlevel/ExplicitCriticalSection.java   | 79 -------------------------
     lowlevel/MutexEvenProducer.java         |  3 +-
     lowlevel/PriorityBlockingQueueDemo.java |  2 +-
     lowlevel/SyncObject.java                |  5 +-
     6 files changed, 8 insertions(+), 87 deletions(-)
     delete mode 100644 lowlevel/ExplicitCriticalSection.java
    
    diff --git a/lowlevel/AttemptLocking.java b/lowlevel/AttemptLocking.java
    index 8b66f39bc..64d79ee67 100644
    --- a/lowlevel/AttemptLocking.java
    +++ b/lowlevel/AttemptLocking.java
    @@ -6,6 +6,7 @@
     // to give up on trying to acquire a lock
     import java.util.concurrent.*;
     import java.util.concurrent.locks.*;
    +import onjava.Nap;
     
     public class AttemptLocking {
       private ReentrantLock lock = new ReentrantLock();
    @@ -46,7 +47,7 @@ public void run() {
             System.out.println("acquired");
           }
         }.start();
    -    Thread.yield(); // Give the 2nd task a chance
    +    new Nap(10);  // Give the 2nd task a chance
         al.untimed(); // False -- lock grabbed by task
         al.timed();   // False -- lock grabbed by task
       }
    diff --git a/lowlevel/CriticalSection.java b/lowlevel/CriticalSection.java
    index 044cbf654..bc30fdb26 100644
    --- a/lowlevel/CriticalSection.java
    +++ b/lowlevel/CriticalSection.java
    @@ -2,12 +2,9 @@
     // (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
    -// (Behavior may have changed in Java 8)
     // Synchronizing blocks instead of entire methods. Also
     // demonstrates protection of a non-thread-safe class
     // with a thread-safe one.
    -// {java lowlevel.CriticalSection}
    -package lowlevel;
     import java.util.concurrent.*;
     import java.util.concurrent.atomic.*;
     import java.util.*;
    diff --git a/lowlevel/ExplicitCriticalSection.java b/lowlevel/ExplicitCriticalSection.java
    deleted file mode 100644
    index c69d92b9c..000000000
    --- a/lowlevel/ExplicitCriticalSection.java
    +++ /dev/null
    @@ -1,79 +0,0 @@
    -// lowlevel/ExplicitCriticalSection.java
    -// (c)2017 MindView LLC: see Copyright.txt
    -// We make no guarantees that this code is fit for any purpose.
    -// Visit http://OnJava8.com for more book information.
    -// {ThrowsException} on a multiprocessor machine
    -// Using explicit Lock objects to create critical sections
    -// {java lowlevel.ExplicitCriticalSection}
    -package lowlevel;
    -import java.util.concurrent.locks.*;
    -
    -// Synchronize the entire method:
    -class ExplicitPairManager1 extends PairManager {
    -  private Lock lock = new ReentrantLock();
    -  @Override
    -  public void increment() {
    -    lock.lock();
    -    try {
    -      p.incrementX();
    -      p.incrementY();
    -      store(getPair());
    -    } finally {
    -      lock.unlock();
    -    }
    -  }
    -}
    -
    -// Use a critical section:
    -class ExplicitPairManager2 extends PairManager {
    -  private Lock lock = new ReentrantLock();
    -  @Override
    -  public void increment() {
    -    Pair temp;
    -    lock.lock();
    -    try {
    -      p.incrementX();
    -      p.incrementY();
    -      temp = getPair();
    -    } finally {
    -      lock.unlock();
    -    }
    -    store(temp);
    -  }
    -}
    -
    -public class ExplicitCriticalSection {
    -  public static void
    -  main(String[] args) throws Exception {
    -    PairManager
    -      pman1 = new ExplicitPairManager1(),
    -      pman2 = new ExplicitPairManager2();
    -    CriticalSection.testApproaches(pman1, pman2);
    -  }
    -}
    -/* Output:
    -pm1: Pair: x: 10, y: 10 checkCounter = 1713716
    -pm2: Pair: x: 10, y: 10 checkCounter = 1717747
    -___[ Error Output ]___
    -Exception in thread "pool-1-thread-4" Exception in thread
    -"pool-1-thread-3" threads.Pair$PairValuesNotEqualException:
    -Pair values not equal: x: 2, y: 1
    -        at threads.Pair.checkState(CriticalSection.java:37)
    -        at
    -threads.PairChecker.run(CriticalSection.java:111)
    -        at java.util.concurrent.ThreadPoolExecutor.runWorke
    -r(ThreadPoolExecutor.java:1142)
    -        at java.util.concurrent.ThreadPoolExecutor$Worker.r
    -un(ThreadPoolExecutor.java:617)
    -        at java.lang.Thread.run(Thread.java:745)
    -threads.Pair$PairValuesNotEqualException: Pair values not
    -equal: x: 2, y: 1
    -        at threads.Pair.checkState(CriticalSection.java:37)
    -        at
    -threads.PairChecker.run(CriticalSection.java:111)
    -        at java.util.concurrent.ThreadPoolExecutor.runWorke
    -r(ThreadPoolExecutor.java:1142)
    -        at java.util.concurrent.ThreadPoolExecutor$Worker.r
    -un(ThreadPoolExecutor.java:617)
    -        at java.lang.Thread.run(Thread.java:745)
    -*/
    diff --git a/lowlevel/MutexEvenProducer.java b/lowlevel/MutexEvenProducer.java
    index fbee4bb44..ab1244b02 100644
    --- a/lowlevel/MutexEvenProducer.java
    +++ b/lowlevel/MutexEvenProducer.java
    @@ -5,6 +5,7 @@
     // Preventing thread collisions with mutexes
     // {IgnoreOutput} // No output validation
     import java.util.concurrent.locks.*;
    +import onjava.Nap;
     
     public class MutexEvenProducer extends IntGenerator {
       private int currentEvenValue = 0;
    @@ -14,7 +15,7 @@ public int next() {
         lock.lock();
         try {
           ++currentEvenValue;
    -      Thread.yield(); // Cause failure faster
    +      new Nap(10); // Cause failure faster
           ++currentEvenValue;
           return currentEvenValue;
         } finally {
    diff --git a/lowlevel/PriorityBlockingQueueDemo.java b/lowlevel/PriorityBlockingQueueDemo.java
    index f8b2690d8..32cbebef8 100644
    --- a/lowlevel/PriorityBlockingQueueDemo.java
    +++ b/lowlevel/PriorityBlockingQueueDemo.java
    @@ -73,7 +73,7 @@ public void run() {
         // Fill it up fast with random priorities:
         for(int i = 0; i < 20; i++) {
           queue.add(new PrioritizedTask(rand.nextInt(10)));
    -      Thread.yield();
    +      new Nap(10);
         }
         // Trickle in highest-priority jobs:
         for(int i = 0; i < 10; i++) {
    diff --git a/lowlevel/SyncObject.java b/lowlevel/SyncObject.java
    index 5ff881385..ac2c96d97 100644
    --- a/lowlevel/SyncObject.java
    +++ b/lowlevel/SyncObject.java
    @@ -3,20 +3,21 @@
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Synchronizing on another object
    +import onjava.Nap;
     
     class DualSynch {
       private Object syncObject = new Object();
       public synchronized void f() {
         for(int i = 0; i < 5; i++) {
           System.out.println("f()");
    -      Thread.yield();
    +      new Nap(10);
         }
       }
       public void g() {
         synchronized(syncObject) {
           for(int i = 0; i < 5; i++) {
             System.out.println("g()");
    -        Thread.yield();
    +        new Nap(10);
           }
         }
       }
    
    From 737320b37b3934d6047c323113041c55ebf49b7d Mon Sep 17 00:00:00 2001
    From: Bruce Eckel 
    Date: Thu, 12 Jan 2017 16:49:36 -0800
    Subject: [PATCH 194/320] Appendix rewrites
    
    ---
     lowlevel/AtomicEvenProducer.java       |   4 +-
     lowlevel/AtomicIntegerTest.java        |   8 +-
     lowlevel/Atomicity.java                |  13 +--
     lowlevel/AtomicityTest.java            |  10 +--
     lowlevel/AttemptLocking.java           |  17 ++--
     lowlevel/DelayQueueDemo.java           | 110 ++++++++++++-------------
     lowlevel/EvenChecker.java              |  15 ++--
     lowlevel/EvenProducer.java             |  11 +--
     lowlevel/MutexEvenProducer.java        |   4 +-
     lowlevel/SerialNumberChecker.java      |  55 +++++--------
     lowlevel/SyncObject.java               |  44 ++++------
     lowlevel/SynchronizedEvenProducer.java |   4 +-
     onjava/Nap.java                        |   4 +
     onjava/TimedAbort.java                 |   7 +-
     14 files changed, 148 insertions(+), 158 deletions(-)
    
    diff --git a/lowlevel/AtomicEvenProducer.java b/lowlevel/AtomicEvenProducer.java
    index d4a626055..a965e0011 100644
    --- a/lowlevel/AtomicEvenProducer.java
    +++ b/lowlevel/AtomicEvenProducer.java
    @@ -3,7 +3,6 @@
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Atomic classes are occasionally useful in regular code
    -// {IgnoreOutput} // No output validation
     import java.util.concurrent.atomic.*;
     
     public class AtomicEvenProducer extends IntGenerator {
    @@ -17,3 +16,6 @@ public static void main(String[] args) {
         EvenChecker.test(new AtomicEvenProducer());
       }
     }
    +/* Output:
    +No odd numbers discovered
    +*/
    diff --git a/lowlevel/AtomicIntegerTest.java b/lowlevel/AtomicIntegerTest.java
    index f9f3bc260..9c372350c 100644
    --- a/lowlevel/AtomicIntegerTest.java
    +++ b/lowlevel/AtomicIntegerTest.java
    @@ -17,11 +17,9 @@ public void run() {
           evenIncrement();
       }
       public static void main(String[] args) {
    -    new TimedAbort(5); // Terminate after 5 seconds
    -    ExecutorService exec =
    -      Executors.newCachedThreadPool();
    +    new TimedAbort(4, "No failures discovered");
         AtomicIntegerTest ait = new AtomicIntegerTest();
    -    exec.execute(ait);
    +    CompletableFuture.runAsync(ait);
         while(true) {
           int val = ait.getValue();
           if(val % 2 != 0) {
    @@ -32,5 +30,5 @@ public static void main(String[] args) {
       }
     }
     /* Output:
    -TimedAbort 5
    +No failures discovered
     */
    diff --git a/lowlevel/Atomicity.java b/lowlevel/Atomicity.java
    index ea4a5e20b..19c73c8a7 100644
    --- a/lowlevel/Atomicity.java
    +++ b/lowlevel/Atomicity.java
    @@ -13,29 +13,32 @@ public class Atomicity {
     Compiled from "Atomicity.java"
     public class Atomicity {
       int i;
    +
       public Atomicity();
         Code:
            0: aload_0
    -       1: invokespecial #1     // Method
    +       1: invokespecial #1   // Method
     java/lang/Object."":()V
            4: return
    +
       void f1();
         Code:
            0: aload_0
            1: dup
    -       2: getfield      #2     // Field i:I
    +       2: getfield      #2   // Field i:I
            5: iconst_1
            6: iadd
    -       7: putfield      #2     // Field i:I
    +       7: putfield      #2   // Field i:I
           10: return
    +
       void f2();
         Code:
            0: aload_0
            1: dup
    -       2: getfield      #2     // Field i:I
    +       2: getfield      #2   // Field i:I
            5: iconst_3
            6: iadd
    -       7: putfield      #2     // Field i:I
    +       7: putfield      #2   // Field i:I
           10: return
     }
     */
    diff --git a/lowlevel/AtomicityTest.java b/lowlevel/AtomicityTest.java
    index 0174f9617..53acd2b82 100644
    --- a/lowlevel/AtomicityTest.java
    +++ b/lowlevel/AtomicityTest.java
    @@ -17,20 +17,18 @@ public void run() {
           evenIncrement();
       }
       public static void main(String[] args) {
    -    new TimedAbort(4);
    -    ExecutorService es =
    -      Executors.newCachedThreadPool();
    +    new TimedAbort(4, "No failures found");
         AtomicityTest at = new AtomicityTest();
    -    es.execute(at);
    +    CompletableFuture.runAsync(at);
         while(true) {
           int val = at.getValue();
           if(val % 2 != 0) {
    -        System.out.println(val);
    +        System.out.println("failed with: " + val);
             System.exit(0);
           }
         }
       }
     }
     /* Output:
    -1
    +failed with: 21
     */
    diff --git a/lowlevel/AttemptLocking.java b/lowlevel/AttemptLocking.java
    index 64d79ee67..510b5e529 100644
    --- a/lowlevel/AttemptLocking.java
    +++ b/lowlevel/AttemptLocking.java
    @@ -38,16 +38,12 @@ public static void main(String[] args) {
         final AttemptLocking al = new AttemptLocking();
         al.untimed(); // True -- lock is available
         al.timed();   // True -- lock is available
    -    // Now create a separate task to grab the lock:
    -    new Thread() {
    -      { setDaemon(true); }
    -      @Override
    -      public void run() {
    +    // Now create a second task to grab the lock:
    +    CompletableFuture.runAsync( () -> {
             al.lock.lock();
             System.out.println("acquired");
    -      }
    -    }.start();
    -    new Nap(10);  // Give the 2nd task a chance
    +    });
    +    new Nap(100);  // Give the second task a chance
         al.untimed(); // False -- lock grabbed by task
         al.timed();   // False -- lock grabbed by task
       }
    @@ -55,6 +51,7 @@ public void run() {
     /* Output:
     tryLock(): true
     tryLock(2, TimeUnit.SECONDS): true
    -tryLock(): true
    -tryLock(2, TimeUnit.SECONDS): true
    +acquired
    +tryLock(): false
    +tryLock(2, TimeUnit.SECONDS): false
     */
    diff --git a/lowlevel/DelayQueueDemo.java b/lowlevel/DelayQueueDemo.java
    index d76e22f0c..4fc0bba2d 100644
    --- a/lowlevel/DelayQueueDemo.java
    +++ b/lowlevel/DelayQueueDemo.java
    @@ -2,8 +2,9 @@
     // (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
    -import java.util.concurrent.*;
     import java.util.*;
    +import java.util.stream.*;
    +import java.util.concurrent.*;
     import static java.util.concurrent.TimeUnit.*;
     
     class DelayedTask implements Runnable, Delayed {
    @@ -12,7 +13,7 @@ class DelayedTask implements Runnable, Delayed {
       private final int delta;
       private final long trigger;
       protected static List sequence =
    -    new ArrayList<>();
    +    new CopyOnWriteArrayList<>();
       public DelayedTask(int delayInMilliseconds) {
         delta = delayInMilliseconds;
         trigger = System.nanoTime() +
    @@ -32,74 +33,69 @@ public int compareTo(Delayed arg) {
         return 0;
       }
       @Override
    -  public void run() { System.out.print(this + " "); }
    +  public void run() {
    +    System.out.print(this + " ");
    +  }
       @Override
       public String toString() {
    -    return String.format("[%1$-4d]", delta) +
    -      " Task " + id;
    +    return
    +      String.format("[%d] Task %d", delta, id);
       }
       public String summary() {
    -    return "(" + id + ":" + delta + ")";
    +    return String.format("(%d:%d)", id, delta);
       }
    -  public static class EndSentinel extends DelayedTask {
    -    private ExecutorService exec;
    -    public EndSentinel(int delay, ExecutorService e) {
    -      super(delay);
    -      exec = e;
    -    }
    +  public static class EndTask extends DelayedTask {
    +    public EndTask(int delay) { super(delay); }
         @Override
         public void run() {
    -      for(DelayedTask pt : sequence) {
    -        System.out.print(pt.summary() + " ");
    -      }
    -      System.out.println();
    -      System.out.println(this + " Calling shutdownNow()");
    -      exec.shutdownNow();
    -    }
    -  }
    -}
    -
    -class DelayedTaskConsumer implements Runnable {
    -  private DelayQueue q;
    -  public DelayedTaskConsumer(DelayQueue q) {
    -    this.q = q;
    -  }
    -  @Override
    -  public void run() {
    -    try {
    -      while(!Thread.interrupted())
    -        q.take().run(); // Run task with current thread
    -    } catch(InterruptedException e) {
    -      // Acceptable way to exit
    +      sequence.forEach(dt ->
    +        System.out.println(dt.summary() + " "));
         }
    -    System.out.println("Finished DelayedTaskConsumer");
       }
     }
     
     public class DelayQueueDemo {
    -  public static void main(String[] args) {
    -    SplittableRandom rand = new SplittableRandom(47);
    -    ExecutorService es = Executors.newCachedThreadPool();
    -    DelayQueue queue =
    -      new DelayQueue<>();
    -    // Fill with tasks that have random delays:
    -    for(int i = 0; i < 20; i++)
    -      queue.put(new DelayedTask(rand.nextInt(5000)));
    -    // Set the stopping point
    -    queue.add(new DelayedTask.EndSentinel(5000, es));
    -    es.execute(new DelayedTaskConsumer(queue));
    +  public static void
    +  main(String[] args) throws Exception {
    +    DelayQueue tasks =
    +      Stream.concat(
    +        // Tasks with random delays:
    +        new Random(47).ints(20, 0, 4000)
    +          .mapToObj(DelayedTask::new),
    +        // Add the summarizing task:
    +        Stream.of(
    +          new DelayedTask.EndTask(4000)))
    +      .collect(Collectors
    +        .toCollection(DelayQueue::new));
    +    DelayQueue delayQueue =
    +      new DelayQueue<>(tasks);
    +    while(delayQueue.size() > 0)
    +      delayQueue.take().run();
       }
     }
     /* Output:
    -[70  ] Task 10 [125 ] Task 13 [267 ] Task 19 [635 ] Task 0
    -[650 ] Task 16 [682 ] Task 17 [807 ] Task 11 [1131] Task 18
    -[1177] Task 4 [1193] Task 9 [1634] Task 15 [1656] Task 6
    -[2400] Task 12 [3479] Task 5 [3737] Task 1 [3768] Task 7
    -[3941] Task 2 [4720] Task 3 [4762] Task 14 [4948] Task 8
    -(0:635) (1:3737) (2:3941) (3:4720) (4:1177) (5:3479)
    -(6:1656) (7:3768) (8:4948) (9:1193) (10:70) (11:807)
    -(12:2400) (13:125) (14:4762) (15:1634) (16:650) (17:682)
    -(18:1131) (19:267) (20:5000)
    -[5000] Task 20 Calling shutdownNow()
    -Finished DelayedTaskConsumer
    +[128] Task 12 [429] Task 6 [551] Task 13 [555] Task 2 [693] Task 3 [809] Task 15
    + [961] Task 5 [1258] Task 1 [1258] Task 20 [1520] Task 19 [1861] Task 4 [1998] T
    +ask 17 [2200] Task 8 [2207] Task 10 [2288] Task 11 [2522] Task 9 [2589] Task 14
    +[2861] Task 18 [2868] Task 7 [3278] Task 16 (0:4000)
    +(1:1258)
    +(2:555)
    +(3:693)
    +(4:1861)
    +(5:961)
    +(6:429)
    +(7:2868)
    +(8:2200)
    +(9:2522)
    +(10:2207)
    +(11:2288)
    +(12:128)
    +(13:551)
    +(14:2589)
    +(15:809)
    +(16:3278)
    +(17:1998)
    +(18:2861)
    +(19:1520)
    +(20:1258)
     */
    diff --git a/lowlevel/EvenChecker.java b/lowlevel/EvenChecker.java
    index 2a1e958cb..75c89e0fb 100644
    --- a/lowlevel/EvenChecker.java
    +++ b/lowlevel/EvenChecker.java
    @@ -2,6 +2,8 @@
     // (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
    +import java.util.*;
    +import java.util.stream.*;
     import java.util.concurrent.*;
     import onjava.TimedAbort;
     
    @@ -24,15 +26,16 @@ public void run() {
       }
       // Test any IntGenerator:
       public static void test(IntGenerator gp, int count) {
    -    System.out.println("Press Control-C to exit");
    -    ExecutorService es = Executors.newCachedThreadPool();
    -    for(int i = 0; i < count; i++)
    -      es.execute(new EvenChecker(gp, i));
    -    es.shutdown();
    +    List> checkers =
    +      IntStream.range(0, count)
    +        .mapToObj(i -> new EvenChecker(gp, i))
    +        .map(CompletableFuture::runAsync)
    +        .collect(Collectors.toList());
    +    checkers.forEach(CompletableFuture::join);
       }
       // Default value for count:
       public static void test(IntGenerator gp) {
    -    new TimedAbort(4);
    +    new TimedAbort(4, "No odd numbers discovered");
         test(gp, 10);
       }
     }
    diff --git a/lowlevel/EvenProducer.java b/lowlevel/EvenProducer.java
    index c274ad094..d51ec8380 100644
    --- a/lowlevel/EvenProducer.java
    +++ b/lowlevel/EvenProducer.java
    @@ -17,9 +17,10 @@ public static void main(String[] args) {
       }
     }
     /* Output:
    -Press Control-C to exit
    -841 not even!
    -847 not even!
    -845 not even!
    -843 not even!
    +1563 not even!
    +1573 not even!
    +1571 not even!
    +1569 not even!
    +1567 not even!
    +1565 not even!
     */
    diff --git a/lowlevel/MutexEvenProducer.java b/lowlevel/MutexEvenProducer.java
    index ab1244b02..999d0ed02 100644
    --- a/lowlevel/MutexEvenProducer.java
    +++ b/lowlevel/MutexEvenProducer.java
    @@ -3,7 +3,6 @@
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Preventing thread collisions with mutexes
    -// {IgnoreOutput} // No output validation
     import java.util.concurrent.locks.*;
     import onjava.Nap;
     
    @@ -26,3 +25,6 @@ public static void main(String[] args) {
         EvenChecker.test(new MutexEvenProducer());
       }
     }
    +/*
    +No odd numbers discovered
    +*/
    diff --git a/lowlevel/SerialNumberChecker.java b/lowlevel/SerialNumberChecker.java
    index a04677b4e..09ef4235a 100644
    --- a/lowlevel/SerialNumberChecker.java
    +++ b/lowlevel/SerialNumberChecker.java
    @@ -3,65 +3,54 @@
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Operations that might seem safe are not,
    -// when threads are present
    -// {java SerialNumberChecker 4}
    +// when threads are present.
    +import java.util.*;
     import java.util.concurrent.*;
     import onjava.Nap;
     
     // Reuses storage so we don't run out of memory:
     class CircularSet {
       private int[] array;
    -  private int len;
    +  private int size;
       private int index = 0;
       public CircularSet(int size) {
         array = new int[size];
    -    len = size;
         // Initialize to a value not produced
         // by the SerialNumberSupplier:
    -    for(int i = 0; i < size; i++)
    -      array[i] = -1;
    +    Arrays.fill(array, -1);
    +    this.size = size;
       }
       public synchronized void add(int i) {
         array[index] = i;
         // Wrap index and write over old elements:
    -    index = ++index % len;
    +    index = ++index % size;
       }
       public synchronized boolean contains(int val) {
    -    for(int i = 0; i < len; i++)
    +    for(int i = 0; i < size; i++)
           if(array[i] == val) return true;
         return false;
       }
     }
     
    -public class SerialNumberChecker {
    -  private static final int SIZE = 10;
    -  private static CircularSet serials =
    -    new CircularSet(1000);
    -  private static ExecutorService exec =
    -    Executors.newCachedThreadPool();
    -  static class SerialChecker implements Runnable {
    -    @Override
    -    public void run() {
    -      while(true) {
    -        int serial =
    -          SerialNumberSupplier.nextSerialNumber();
    -        if(serials.contains(serial)) {
    -          System.out.println("Duplicate: " + serial);
    -          System.exit(0);
    -        }
    -        serials.add(serial);
    +public class SerialNumberChecker implements Runnable {
    +  private CircularSet serials = new CircularSet(1000);
    +  @Override
    +  public void run() {
    +    while(true) {
    +      int serial =
    +        SerialNumberSupplier.nextSerialNumber();
    +      if(serials.contains(serial)) {
    +        System.out.println("Duplicate: " + serial);
    +        System.exit(0);
           }
    +      serials.add(serial);
         }
       }
       public static void main(String[] args) {
    -    for(int i = 0; i < SIZE; i++)
    -      exec.execute(new SerialChecker());
    -    // Stop after n seconds if there's an argument:
    -    if(args.length > 0) {
    -      new Nap(new Integer(args[0]) * 1000);
    -      System.out.println("No duplicates detected");
    -      System.exit(0);
    -    }
    +    for(int i = 0; i < 10; i++)
    +      CompletableFuture.runAsync(
    +        new SerialNumberChecker());
    +    new Nap(4000, "No duplicates detected");
       }
     }
     /* Output:
    diff --git a/lowlevel/SyncObject.java b/lowlevel/SyncObject.java
    index ac2c96d97..f5c88352d 100644
    --- a/lowlevel/SyncObject.java
    +++ b/lowlevel/SyncObject.java
    @@ -3,47 +3,39 @@
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Synchronizing on another object
    +import java.util.concurrent.*;
     import onjava.Nap;
     
     class DualSynch {
    -  private Object syncObject = new Object();
       public synchronized void f() {
    -    for(int i = 0; i < 5; i++) {
    -      System.out.println("f()");
    -      new Nap(10);
    -    }
    +    for(int i = 0; i < 5; i++)
    +      System.out.println("f() " + i);
       }
    +  private Object syncObject = new Object();
       public void g() {
         synchronized(syncObject) {
    -      for(int i = 0; i < 5; i++) {
    -        System.out.println("g()");
    -        new Nap(10);
    -      }
    +      for(int i = 0; i < 5; i++)
    +        System.out.println("g() " + i);
         }
       }
     }
     
     public class SyncObject {
       public static void main(String[] args) {
    -    final DualSynch ds = new DualSynch();
    -    new Thread() {
    -      @Override
    -      public void run() {
    -        ds.f();
    -      }
    -    }.start();
    +    DualSynch ds = new DualSynch();
    +    CompletableFuture.runAsync(() -> ds.f());
         ds.g();
       }
     }
     /* Output:
    -g()
    -g()
    -g()
    -g()
    -g()
    -f()
    -f()
    -f()
    -f()
    -f()
    +g() 0
    +g() 1
    +f() 0
    +g() 2
    +f() 1
    +g() 3
    +f() 2
    +g() 4
    +f() 3
    +f() 4
     */
    diff --git a/lowlevel/SynchronizedEvenProducer.java b/lowlevel/SynchronizedEvenProducer.java
    index c1bba5f77..0c922f7d7 100644
    --- a/lowlevel/SynchronizedEvenProducer.java
    +++ b/lowlevel/SynchronizedEvenProducer.java
    @@ -3,7 +3,6 @@
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Simplifying mutexes with the synchronized keyword
    -// {IgnoreOutput} // No output validation
     import onjava.Nap;
     
     public class
    @@ -20,3 +19,6 @@ public static void main(String[] args) {
         EvenChecker.test(new SynchronizedEvenProducer());
       }
     }
    +/* Output:
    +No odd numbers discovered
    +*/
    diff --git a/onjava/Nap.java b/onjava/Nap.java
    index c4a66b4b2..13516694a 100644
    --- a/onjava/Nap.java
    +++ b/onjava/Nap.java
    @@ -14,4 +14,8 @@ public Nap(int n) {
           throw new RuntimeException(e);
         }
       }
    +  public Nap(int n, String msg) {
    +    this(n);
    +    System.out.println(msg);
    +  }
     }
    diff --git a/onjava/TimedAbort.java b/onjava/TimedAbort.java
    index 5c5d262c4..5de4ac55f 100644
    --- a/onjava/TimedAbort.java
    +++ b/onjava/TimedAbort.java
    @@ -7,11 +7,14 @@
     import java.util.concurrent.*;
     
     public class TimedAbort {
    -  public TimedAbort(int n) {
    +  public TimedAbort(int n, String msg) {
         CompletableFuture.runAsync(() -> {
           new Nap(1000 * n);
    -      System.out.println("TimedAbort " + n);
    +      System.out.println(msg);
           System.exit(0);
         });
       }
    +  public TimedAbort(int n) {
    +    this(n, "TimedAbort " + n);
    +  }
     }
    
    From 4d87d1c720916315a087eb734cc1d72b1b1e8b76 Mon Sep 17 00:00:00 2001
    From: Bruce Eckel 
    Date: Thu, 12 Jan 2017 16:57:37 -0800
    Subject: [PATCH 195/320] Exclude from automatic execution
    
    ---
     patterns/visualobserver/BoxObserver.java | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/patterns/visualobserver/BoxObserver.java b/patterns/visualobserver/BoxObserver.java
    index 51f028480..a70370536 100644
    --- a/patterns/visualobserver/BoxObserver.java
    +++ b/patterns/visualobserver/BoxObserver.java
    @@ -4,7 +4,7 @@
     // Visit http://OnJava8.com for more book information.
     // Demonstration of Observer pattern using
     // Java's built-in observer classes
    -// {java patterns.visualobserver.BoxObserver}
    +// {ValidateByHand}
     package patterns.visualobserver;
     import javax.swing.*;
     import java.awt.*;
    
    From 54ddb4208a68ef41ea0da035187e975dc0deea3a Mon Sep 17 00:00:00 2001
    From: Bruce Eckel 
    Date: Thu, 12 Jan 2017 17:07:13 -0800
    Subject: [PATCH 196/320] Test exclusions to find CI bug
    
    ---
     patterns/visualobserver/BoxObserver.java | 2 +-
     validating/BadMicroBenchmark.java        | 1 +
     2 files changed, 2 insertions(+), 1 deletion(-)
    
    diff --git a/patterns/visualobserver/BoxObserver.java b/patterns/visualobserver/BoxObserver.java
    index a70370536..8f3a8a04e 100644
    --- a/patterns/visualobserver/BoxObserver.java
    +++ b/patterns/visualobserver/BoxObserver.java
    @@ -4,7 +4,7 @@
     // Visit http://OnJava8.com for more book information.
     // Demonstration of Observer pattern using
     // Java's built-in observer classes
    -// {ValidateByHand}
    +// {ValidateByHand} --- TEST TEST TEST
     package patterns.visualobserver;
     import javax.swing.*;
     import java.awt.*;
    diff --git a/validating/BadMicroBenchmark.java b/validating/BadMicroBenchmark.java
    index e10555413..357ab540e 100644
    --- a/validating/BadMicroBenchmark.java
    +++ b/validating/BadMicroBenchmark.java
    @@ -2,6 +2,7 @@
     // (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
    +// {ValidateByHand} --- TEST TEST TEST
     import java.util.*;
     import onjava.Timer;
     
    
    From 3e6025f135785c2a7070f863aec6c7db71212351 Mon Sep 17 00:00:00 2001
    From: Bruce Eckel 
    Date: Fri, 13 Jan 2017 07:03:17 -0800
    Subject: [PATCH 197/320] Discovered issue with Travis CI
    
    ---
     patterns/visualobserver/BoxObserver.java | 1 -
     validating/BadMicroBenchmark.java        | 2 +-
     2 files changed, 1 insertion(+), 2 deletions(-)
    
    diff --git a/patterns/visualobserver/BoxObserver.java b/patterns/visualobserver/BoxObserver.java
    index 8f3a8a04e..072f0d931 100644
    --- a/patterns/visualobserver/BoxObserver.java
    +++ b/patterns/visualobserver/BoxObserver.java
    @@ -4,7 +4,6 @@
     // Visit http://OnJava8.com for more book information.
     // Demonstration of Observer pattern using
     // Java's built-in observer classes
    -// {ValidateByHand} --- TEST TEST TEST
     package patterns.visualobserver;
     import javax.swing.*;
     import java.awt.*;
    diff --git a/validating/BadMicroBenchmark.java b/validating/BadMicroBenchmark.java
    index 357ab540e..6a4cf7259 100644
    --- a/validating/BadMicroBenchmark.java
    +++ b/validating/BadMicroBenchmark.java
    @@ -2,7 +2,7 @@
     // (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
    -// {ValidateByHand} --- TEST TEST TEST
    +// {ValidateByHand}
     import java.util.*;
     import onjava.Timer;
     
    
    From fac3233fddda7d7dac86f914f4dcd4dc3dd50602 Mon Sep 17 00:00:00 2001
    From: Bruce Eckel 
    Date: Fri, 13 Jan 2017 07:03:28 -0800
    Subject: [PATCH 198/320] Completely refactored
    
    ---
     lowlevel/DelayQueueDemo.java            |   9 +-
     lowlevel/PriorityBlockingQueueDemo.java | 208 ++++++++++++------------
     2 files changed, 104 insertions(+), 113 deletions(-)
    
    diff --git a/lowlevel/DelayQueueDemo.java b/lowlevel/DelayQueueDemo.java
    index 4fc0bba2d..e2fbb295a 100644
    --- a/lowlevel/DelayQueueDemo.java
    +++ b/lowlevel/DelayQueueDemo.java
    @@ -63,14 +63,11 @@ public class DelayQueueDemo {
             new Random(47).ints(20, 0, 4000)
               .mapToObj(DelayedTask::new),
             // Add the summarizing task:
    -        Stream.of(
    -          new DelayedTask.EndTask(4000)))
    +        Stream.of(new DelayedTask.EndTask(4000)))
           .collect(Collectors
             .toCollection(DelayQueue::new));
    -    DelayQueue delayQueue =
    -      new DelayQueue<>(tasks);
    -    while(delayQueue.size() > 0)
    -      delayQueue.take().run();
    +    while(tasks.size() > 0)
    +      tasks.take().run();
       }
     }
     /* Output:
    diff --git a/lowlevel/PriorityBlockingQueueDemo.java b/lowlevel/PriorityBlockingQueueDemo.java
    index 32cbebef8..f9159846b 100644
    --- a/lowlevel/PriorityBlockingQueueDemo.java
    +++ b/lowlevel/PriorityBlockingQueueDemo.java
    @@ -2,148 +2,142 @@
     // (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
    -import java.util.concurrent.*;
     import java.util.*;
    +import java.util.stream.*;
    +import java.util.concurrent.*;
    +import java.util.concurrent.atomic.*;
     import onjava.Nap;
     
    -class PrioritizedTask implements
    -Runnable, Comparable  {
    -  private SplittableRandom rand = new SplittableRandom(47);
    -  private static int counter = 0;
    -  private final int id = counter++;
    +class Prioritized implements Comparable  {
    +  private static AtomicInteger counter =
    +    new AtomicInteger();
    +  private final int id = counter.getAndAdd(1);
       private final int priority;
    -  protected static List sequence =
    -    new ArrayList<>();
    -  public PrioritizedTask(int priority) {
    +  private static List sequence =
    +    new CopyOnWriteArrayList<>();
    +  public Prioritized(int priority) {
         this.priority = priority;
         sequence.add(this);
       }
       @Override
    -  public int compareTo(PrioritizedTask arg) {
    +  public int compareTo(Prioritized arg) {
         return priority < arg.priority ? 1 :
           (priority > arg.priority ? -1 : 0);
       }
       @Override
    -  public void run() {
    -    new Nap(rand.nextInt(250));
    -    System.out.println(this);
    -  }
    -  @Override
       public String toString() {
    -    return String.format("[%1$-3d]", priority) +
    -      " Task " + id;
    -  }
    -  public String summary() {
    -    return "(" + id + ":" + priority + ")";
    +    return String.format(
    +      "[%d] Prioritized %d", priority, id);
       }
    -  public static
    -  class EndSentinel extends PrioritizedTask {
    -    private ExecutorService exec;
    -    public EndSentinel(ExecutorService e) {
    -      super(-1); // Lowest priority in this program
    -      exec = e;
    -    }
    -    @Override
    -    public void run() {
    -      int count = 0;
    -      for(PrioritizedTask pt : sequence) {
    -        System.out.print(pt.summary());
    -        if(++count % 5 == 0)
    -          System.out.println();
    -      }
    -      System.out.println();
    -      System.out.println(this + " Calling shutdownNow()");
    -      exec.shutdownNow();
    +  public void displaySequence() {
    +    int count = 0;
    +    for(Prioritized pt : sequence) {
    +      System.out.printf("(%d:%d)", pt.id, pt.priority);
    +      if(++count % 5 == 0)
    +        System.out.println();
         }
       }
    +  public static class EndSentinel extends Prioritized {
    +    public EndSentinel() { super(-1); }
    +  }
     }
     
    -class PrioritizedTaskProducer implements Runnable {
    -  private SplittableRandom rand = new SplittableRandom(47);
    -  private Queue queue;
    -  private ExecutorService exec;
    -  public PrioritizedTaskProducer(
    -    Queue q, ExecutorService e) {
    +class Producer implements Runnable {
    +  private static AtomicInteger seed =
    +    new AtomicInteger(47);
    +  private SplittableRandom rand =
    +    new SplittableRandom(seed.getAndAdd(10));
    +  private Queue queue;
    +  public Producer(Queue q) {
         queue = q;
    -    exec = e; // Used for EndSentinel
       }
       @Override
       public void run() {
    -    // Unbounded queue; never blocks.
    -    // Fill it up fast with random priorities:
    -    for(int i = 0; i < 20; i++) {
    -      queue.add(new PrioritizedTask(rand.nextInt(10)));
    -      new Nap(10);
    -    }
    -    // Trickle in highest-priority jobs:
    -    for(int i = 0; i < 10; i++) {
    -      new Nap(250);
    -      queue.add(new PrioritizedTask(10));
    -    }
    -    // Add jobs, lowest priority first:
    -    for(int i = 0; i < 10; i++)
    -      queue.add(new PrioritizedTask(i));
    -    // A sentinel to stop all the tasks:
    -    queue.add(new PrioritizedTask.EndSentinel(exec));
    -    System.out.println(
    -      "Finished PrioritizedTaskProducer");
    +    rand.ints(10, 0, 20)
    +      .mapToObj(Prioritized::new)
    +      .peek(p -> new Nap(rand.nextInt(
    +        PriorityBlockingQueueDemo.NAPTIME)))
    +      .forEach(p -> queue.add(p));
    +    queue.add(new Prioritized.EndSentinel());
       }
     }
     
    -class PrioritizedTaskConsumer implements Runnable {
    -  private PriorityBlockingQueue q;
    -  public PrioritizedTaskConsumer(
    -    PriorityBlockingQueue q) {
    +class Consumer implements Runnable {
    +  private PriorityBlockingQueue q;
    +  private SplittableRandom rand =
    +    new SplittableRandom(47);
    +  public
    +  Consumer(PriorityBlockingQueue q) {
         this.q = q;
       }
       @Override
       public void run() {
    -    try {
    -      while(!Thread.interrupted())
    -        // Use current thread to run the task:
    -        q.take().run();
    -    } catch(InterruptedException e) {
    -      // Acceptable way to exit
    +    while(true) {
    +      try {
    +        Prioritized pt = q.take();
    +        System.out.println(pt);
    +        if(pt instanceof Prioritized.EndSentinel) {
    +          pt.displaySequence();
    +          break;
    +        }
    +        new Nap(rand.nextInt(
    +          PriorityBlockingQueueDemo.NAPTIME));
    +      } catch(InterruptedException e) {
    +        throw new RuntimeException(e);
    +      }
         }
    -    System.out.println(
    -      "Finished PrioritizedTaskConsumer");
       }
     }
     
     public class PriorityBlockingQueueDemo {
    -  public static void
    -  main(String[] args) throws Exception {
    -    ExecutorService es = Executors.newCachedThreadPool();
    -    PriorityBlockingQueue queue =
    +  static final int NAPTIME = 50;
    +  public static void main(String[] args) {
    +    PriorityBlockingQueue queue =
           new PriorityBlockingQueue<>();
    -    es.execute(new PrioritizedTaskProducer(queue, es));
    -    es.execute(new PrioritizedTaskConsumer(queue));
    +    CompletableFuture.runAsync(new Producer(queue));
    +    CompletableFuture.runAsync(new Producer(queue));
    +    CompletableFuture.runAsync(new Producer(queue));
    +    CompletableFuture.runAsync(new Consumer(queue))
    +      .join();
       }
     }
    -/* Output: (First and Last 12 Lines)
    -[9  ] Task 5
    -[8  ] Task 7
    -[10 ] Task 20
    -[8  ] Task 8
    -[10 ] Task 21
    -[7  ] Task 4
    -[10 ] Task 22
    -[7  ] Task 19
    -[10 ] Task 23
    -[7  ] Task 11
    -[10 ] Task 24
    -[7  ] Task 1
    -...________...________...________...________...
    -[0  ] Task 16
    -(0:5)(1:7)(2:1)(3:0)(4:7)
    -(5:9)(6:6)(7:8)(8:8)(9:3)
    -(10:0)(11:7)(12:0)(13:5)(14:2)
    -(15:4)(16:0)(17:2)(18:1)(19:7)
    -(20:10)(21:10)(22:10)(23:10)(24:10)
    -(25:10)(26:10)(27:10)(28:10)(29:10)
    -(30:0)(31:1)(32:2)(33:3)(34:4)
    -(35:5)(36:6)(37:7)(38:8)(39:9)
    -(40:-1)
    -[-1 ] Task 40 Calling shutdownNow()
    -Finished PrioritizedTaskConsumer
    +/* Output:
    +[12] Prioritized 1
    +[17] Prioritized 2
    +[15] Prioritized 0
    +[18] Prioritized 17
    +[17] Prioritized 10
    +[16] Prioritized 20
    +[16] Prioritized 16
    +[15] Prioritized 15
    +[14] Prioritized 8
    +[14] Prioritized 13
    +[13] Prioritized 12
    +[12] Prioritized 19
    +[12] Prioritized 14
    +[11] Prioritized 6
    +[11] Prioritized 22
    +[11] Prioritized 4
    +[11] Prioritized 31
    +[10] Prioritized 30
    +[10] Prioritized 26
    +[8] Prioritized 18
    +[8] Prioritized 23
    +[8] Prioritized 9
    +[6] Prioritized 24
    +[3] Prioritized 3
    +[2] Prioritized 29
    +[1] Prioritized 7
    +[0] Prioritized 27
    +[0] Prioritized 5
    +[0] Prioritized 21
    +[0] Prioritized 11
    +[-1] Prioritized 25
    +(0:15)(2:17)(1:12)(3:3)(4:11)
    +(5:0)(6:11)(7:1)(8:14)(9:8)
    +(10:17)(11:0)(12:13)(13:14)(14:12)
    +(15:15)(16:16)(17:18)(18:8)(19:12)
    +(20:16)(21:0)(22:11)(23:8)(24:6)
    +(25:-1)(26:10)(27:0)(28:-1)(29:2)
    +(30:10)(31:11)(32:-1)
     */
    
    From d360aa59e7c7c7b3789c16113eee371b1314b415 Mon Sep 17 00:00:00 2001
    From: Bruce Eckel 
    Date: Fri, 13 Jan 2017 07:08:54 -0800
    Subject: [PATCH 199/320] Execution tag fix
    
    ---
     patterns/visualobserver/BoxObserver.java | 1 +
     1 file changed, 1 insertion(+)
    
    diff --git a/patterns/visualobserver/BoxObserver.java b/patterns/visualobserver/BoxObserver.java
    index 072f0d931..51f028480 100644
    --- a/patterns/visualobserver/BoxObserver.java
    +++ b/patterns/visualobserver/BoxObserver.java
    @@ -4,6 +4,7 @@
     // Visit http://OnJava8.com for more book information.
     // Demonstration of Observer pattern using
     // Java's built-in observer classes
    +// {java patterns.visualobserver.BoxObserver}
     package patterns.visualobserver;
     import javax.swing.*;
     import java.awt.*;
    
    From bd6b0af400947c439f0943caa52bfb9bf80298b5 Mon Sep 17 00:00:00 2001
    From: Bruce Eckel 
    Date: Fri, 13 Jan 2017 14:28:08 -0800
    Subject: [PATCH 200/320] Added "Constructors are not Thread-Safe"
    
    ---
     concurrent/GuardedIDField.java            | 18 ++++++++++
     concurrent/HasID.java                     |  8 +++++
     concurrent/IDChecker.java                 | 41 +++++++++++++++++++++
     concurrent/SharedConstructorArgument.java | 44 +++++++++++++++++++++++
     concurrent/StaticIDField.java             | 10 ++++++
     concurrent/TestStaticIDField.java         | 13 +++++++
     gradle/subprojects.gradle                 |  2 +-
     7 files changed, 135 insertions(+), 1 deletion(-)
     create mode 100644 concurrent/GuardedIDField.java
     create mode 100644 concurrent/HasID.java
     create mode 100644 concurrent/IDChecker.java
     create mode 100644 concurrent/SharedConstructorArgument.java
     create mode 100644 concurrent/StaticIDField.java
     create mode 100644 concurrent/TestStaticIDField.java
    
    diff --git a/concurrent/GuardedIDField.java b/concurrent/GuardedIDField.java
    new file mode 100644
    index 000000000..0ab48d2eb
    --- /dev/null
    +++ b/concurrent/GuardedIDField.java
    @@ -0,0 +1,18 @@
    +// concurrent/GuardedIDField.java
    +// (c)2017 MindView LLC: see Copyright.txt
    +// We make no guarantees that this code is fit for any purpose.
    +// Visit http://OnJava8.com for more book information.
    +import java.util.concurrent.atomic.*;
    +
    +public class GuardedIDField implements HasID {
    +  private static AtomicInteger counter =
    +    new AtomicInteger();
    +  private int id = counter.getAndAdd(1);
    +  public int getID() { return id; }
    +  public static void main(String[] args) {
    +    IDChecker.test(GuardedIDField::new);
    +  }
    +}
    +/* Output:
    +0
    +*/
    diff --git a/concurrent/HasID.java b/concurrent/HasID.java
    new file mode 100644
    index 000000000..4e679a59f
    --- /dev/null
    +++ b/concurrent/HasID.java
    @@ -0,0 +1,8 @@
    +// concurrent/HasID.java
    +// (c)2017 MindView LLC: see Copyright.txt
    +// We make no guarantees that this code is fit for any purpose.
    +// Visit http://OnJava8.com for more book information.
    +
    +public interface HasID {
    +  int getID();
    +}
    diff --git a/concurrent/IDChecker.java b/concurrent/IDChecker.java
    new file mode 100644
    index 000000000..e4f7cac5a
    --- /dev/null
    +++ b/concurrent/IDChecker.java
    @@ -0,0 +1,41 @@
    +// concurrent/IDChecker.java
    +// (c)2017 MindView LLC: see Copyright.txt
    +// We make no guarantees that this code is fit for any purpose.
    +// Visit http://OnJava8.com for more book information.
    +import java.util.*;
    +import java.util.function.*;
    +import java.util.stream.*;
    +import java.util.concurrent.*;
    +import com.google.common.collect.Sets;
    +
    +public class IDChecker {
    +  public static int SIZE = 100_000;
    +  static class MakeObjects
    +  implements Supplier> {
    +    private Supplier gen;
    +    public MakeObjects(Supplier gen) {
    +      this.gen = gen;
    +    }
    +    @Override
    +    public List get() {
    +      return
    +        Stream.generate(gen)
    +          .limit(SIZE)
    +          .map(HasID::getID)
    +          .collect(Collectors.toList());
    +    }
    +  }
    +  public static void test(Supplier gen) {
    +    CompletableFuture>
    +      groupA = CompletableFuture
    +        .supplyAsync(new MakeObjects(gen)),
    +      groupB = CompletableFuture
    +        .supplyAsync(new MakeObjects(gen));
    +    groupA.thenAcceptBoth(groupB, (a, b) -> {
    +      System.out.println(
    +        Sets.intersection(
    +          Sets.newHashSet(a),
    +          Sets.newHashSet(b)).size());
    +    }).join();
    +  }
    +}
    diff --git a/concurrent/SharedConstructorArgument.java b/concurrent/SharedConstructorArgument.java
    new file mode 100644
    index 000000000..0cf835d85
    --- /dev/null
    +++ b/concurrent/SharedConstructorArgument.java
    @@ -0,0 +1,44 @@
    +// concurrent/SharedConstructorArgument.java
    +// (c)2017 MindView LLC: see Copyright.txt
    +// We make no guarantees that this code is fit for any purpose.
    +// Visit http://OnJava8.com for more book information.
    +import java.util.concurrent.atomic.*;
    +
    +interface SharedArg {
    +  int get();
    +}
    +
    +class Unsafe implements SharedArg {
    +  private int i = 0;
    +  public int get() { return i++; }
    +}
    +
    +class Safe implements SharedArg {
    +  private static AtomicInteger counter =
    +    new AtomicInteger();
    +  public int get() {
    +    return counter.getAndAdd(1);
    +  }
    +}
    +
    +class SharedUser implements HasID {
    +  private final int id;
    +  public SharedUser(SharedArg sa) {
    +    id = sa.get();
    +  }
    +  @Override
    +  public int getID() { return id; }
    +}
    +
    +public class SharedConstructorArgument {
    +  public static void main(String[] args) {
    +    Unsafe us = new Unsafe();
    +    IDChecker.test(() -> new SharedUser(us));
    +    Safe sa = new Safe();
    +    IDChecker.test(() -> new SharedUser(sa));
    +  }
    +}
    +/* Output:
    +47747
    +0
    +*/
    diff --git a/concurrent/StaticIDField.java b/concurrent/StaticIDField.java
    new file mode 100644
    index 000000000..9e563dfdb
    --- /dev/null
    +++ b/concurrent/StaticIDField.java
    @@ -0,0 +1,10 @@
    +// concurrent/StaticIDField.java
    +// (c)2017 MindView LLC: see Copyright.txt
    +// We make no guarantees that this code is fit for any purpose.
    +// Visit http://OnJava8.com for more book information.
    +
    +public class StaticIDField implements HasID {
    +  private static int counter = 0;
    +  private int id = counter++;
    +  public int getID() { return id; }
    +}
    diff --git a/concurrent/TestStaticIDField.java b/concurrent/TestStaticIDField.java
    new file mode 100644
    index 000000000..5ad53adb7
    --- /dev/null
    +++ b/concurrent/TestStaticIDField.java
    @@ -0,0 +1,13 @@
    +// concurrent/TestStaticIDField.java
    +// (c)2017 MindView LLC: see Copyright.txt
    +// We make no guarantees that this code is fit for any purpose.
    +// Visit http://OnJava8.com for more book information.
    +
    +public class TestStaticIDField {
    +  public static void main(String[] args) {
    +    IDChecker.test(StaticIDField::new);
    +  }
    +}
    +/* Output:
    +47643
    +*/
    diff --git a/gradle/subprojects.gradle b/gradle/subprojects.gradle
    index d22a7cff2..e114237dc 100644
    --- a/gradle/subprojects.gradle
    +++ b/gradle/subprojects.gradle
    @@ -67,7 +67,7 @@ project(':collections') {
     configure(subprojects - project(':onjava')) {
         dependencies {
             compile project(':onjava')
    -        compile 'com.google.guava:guava:21.0-rc2'
    +        compile 'com.google.guava:guava:21.0'
             compileOnly "org.openjdk.jmh:jmh-core:${jmh.jmhVersion}"
         }
     }
    
    From 5710360504b129807d3bf2375d6c36191f895f69 Mon Sep 17 00:00:00 2001
    From: Bruce Eckel 
    Date: Sat, 14 Jan 2017 00:34:41 -0800
    Subject: [PATCH 201/320] Added SynchronizedComparison.java
    
    ---
     lowlevel/CriticalSection.java        | 143 ---------------------------
     lowlevel/SynchronizedComparison.java |  77 +++++++++++++++
     2 files changed, 77 insertions(+), 143 deletions(-)
     delete mode 100644 lowlevel/CriticalSection.java
     create mode 100644 lowlevel/SynchronizedComparison.java
    
    diff --git a/lowlevel/CriticalSection.java b/lowlevel/CriticalSection.java
    deleted file mode 100644
    index bc30fdb26..000000000
    --- a/lowlevel/CriticalSection.java
    +++ /dev/null
    @@ -1,143 +0,0 @@
    -// lowlevel/CriticalSection.java
    -// (c)2017 MindView LLC: see Copyright.txt
    -// We make no guarantees that this code is fit for any purpose.
    -// Visit http://OnJava8.com for more book information.
    -// Synchronizing blocks instead of entire methods. Also
    -// demonstrates protection of a non-thread-safe class
    -// with a thread-safe one.
    -import java.util.concurrent.*;
    -import java.util.concurrent.atomic.*;
    -import java.util.*;
    -import onjava.*;
    -
    -class Pair { // Not thread-safe
    -  private int x, y;
    -  public Pair(int x, int y) {
    -    this.x = x;
    -    this.y = y;
    -  }
    -  public Pair() { this(0, 0); }
    -  public int getX() { return x; }
    -  public int getY() { return y; }
    -  public void incrementX() { x++; }
    -  public void incrementY() { y++; }
    -  @Override
    -  public String toString() {
    -    return "x: " + x + ", y: " + y;
    -  }
    -  public class PairValuesNotEqualException
    -  extends RuntimeException {
    -    public PairValuesNotEqualException() {
    -      super("Pair values not equal: " + Pair.this);
    -    }
    -  }
    -  // Arbitrary invariant -- both variables must be equal:
    -  public void checkState() {
    -    if(x != y)
    -      throw new PairValuesNotEqualException();
    -  }
    -}
    -
    -// Protect a Pair inside a thread-safe class:
    -abstract class PairManager {
    -  AtomicInteger checkCounter = new AtomicInteger(0);
    -  protected Pair p = new Pair();
    -  private List storage =
    -    Collections.synchronizedList(new ArrayList<>());
    -  public synchronized Pair getPair() {
    -    // Make a copy to keep the original safe:
    -    return new Pair(p.getX(), p.getY());
    -  }
    -  // Assume this is a time consuming operation
    -  protected void store(Pair p) {
    -    storage.add(p);
    -    new Nap(50);
    -  }
    -  public abstract void increment();
    -}
    -
    -// Synchronize the entire method:
    -class PairManager1 extends PairManager {
    -  @Override
    -  public synchronized void increment() {
    -    p.incrementX();
    -    p.incrementY();
    -    store(getPair());
    -  }
    -}
    -
    -// Use a critical section:
    -class PairManager2 extends PairManager {
    -  @Override
    -  public void increment() {
    -    Pair temp;
    -    synchronized(this) {
    -      p.incrementX();
    -      p.incrementY();
    -      temp = getPair();
    -    }
    -    store(temp);
    -  }
    -}
    -
    -class PairManipulator implements Runnable {
    -  private PairManager pm;
    -  public PairManipulator(PairManager pm) {
    -    this.pm = pm;
    -  }
    -  @Override
    -  public void run() {
    -    while(true)
    -      pm.increment();
    -  }
    -  @Override
    -  public String toString() {
    -    return "Pair: " + pm.getPair() +
    -      " checkCounter = " + pm.checkCounter.get();
    -  }
    -}
    -
    -class PairChecker implements Runnable {
    -  private PairManager pm;
    -  public PairChecker(PairManager pm) {
    -    this.pm = pm;
    -  }
    -  @Override
    -  public void run() {
    -    while(true) {
    -      pm.checkCounter.incrementAndGet();
    -      pm.getPair().checkState();
    -    }
    -  }
    -}
    -
    -public class CriticalSection {
    -  // Test the two different approaches:
    -  static void
    -  testApproaches(PairManager pman1, PairManager pman2) {
    -    ExecutorService es = Executors.newCachedThreadPool();
    -    PairManipulator
    -      pm1 = new PairManipulator(pman1),
    -      pm2 = new PairManipulator(pman2);
    -    PairChecker
    -      pcheck1 = new PairChecker(pman1),
    -      pcheck2 = new PairChecker(pman2);
    -    es.execute(pm1);
    -    es.execute(pm2);
    -    es.execute(pcheck1);
    -    es.execute(pcheck2);
    -    new Nap(500);
    -    System.out.println("pm1: " + pm1 + "\npm2: " + pm2);
    -    System.exit(0);
    -  }
    -  public static void main(String[] args) {
    -    new TimedAbort(4);
    -    PairManager
    -      pman1 = new PairManager1(),
    -      pman2 = new PairManager2();
    -    testApproaches(pman1, pman2);
    -  }
    -}
    -/* Output:
    -TimedAbort 4
    -*/
    diff --git a/lowlevel/SynchronizedComparison.java b/lowlevel/SynchronizedComparison.java
    new file mode 100644
    index 000000000..bedb5e0f4
    --- /dev/null
    +++ b/lowlevel/SynchronizedComparison.java
    @@ -0,0 +1,77 @@
    +// lowlevel/SynchronizedComparison.java
    +// (c)2017 MindView LLC: see Copyright.txt
    +// We make no guarantees that this code is fit for any purpose.
    +// Visit http://OnJava8.com for more book information.
    +// Synchronizing blocks instead of entire methods
    +// speeds up access.
    +import java.util.*;
    +import java.util.stream.*;
    +import java.util.concurrent.*;
    +import java.util.concurrent.atomic.*;
    +import onjava.Nap;
    +
    +abstract class Guarded {
    +  AtomicLong callCount = new AtomicLong();
    +  public abstract void method();
    +  @Override
    +  public String toString() {
    +    return getClass().getSimpleName() +
    +      ": " + callCount.get();
    +  }
    +}
    +
    +class SynchronizedMethod extends Guarded {
    +  public synchronized void method() {
    +    new Nap(10);
    +    callCount.incrementAndGet();
    +  }
    +}
    +
    +class CriticalSection extends Guarded {
    +  public void method() {
    +    new Nap(10);
    +    synchronized(this) {
    +      callCount.incrementAndGet();
    +    }
    +  }
    +}
    +
    +class Caller implements Runnable {
    +  private Guarded g;
    +  public Caller(Guarded g) { this.g = g; }
    +  private AtomicBoolean stop =
    +    new AtomicBoolean(false);
    +  class Stop extends TimerTask {
    +    @Override
    +    public void run() { stop.set(true); }
    +  }
    +  @Override
    +  public void run() {
    +    new Timer().schedule(new Stop(), 2500);
    +    while(!stop.get())
    +      g.method();
    +  }
    +}
    +
    +public class SynchronizedComparison {
    +  static void test(Guarded g) {
    +    List> callers =
    +      Stream.of(
    +        new Caller(g),
    +        new Caller(g),
    +        new Caller(g),
    +        new Caller(g))
    +        .map(CompletableFuture::runAsync)
    +        .collect(Collectors.toList());
    +    callers.forEach(CompletableFuture::join);
    +    System.out.println(g);
    +  }
    +  public static void main(String[] args) {
    +    test(new CriticalSection());
    +    test(new SynchronizedMethod());
    +  }
    +}
    +/* Output:
    +CriticalSection: 972
    +SynchronizedMethod: 247
    +*/
    
    From fdc2b9949475a73a828bc605ad0ea7be765e59be Mon Sep 17 00:00:00 2001
    From: Bruce Eckel 
    Date: Sat, 14 Jan 2017 00:34:54 -0800
    Subject: [PATCH 202/320] identifier refactoring
    
    ---
     concurrent/SharedConstructorArgument.java | 8 ++++----
     1 file changed, 4 insertions(+), 4 deletions(-)
    
    diff --git a/concurrent/SharedConstructorArgument.java b/concurrent/SharedConstructorArgument.java
    index 0cf835d85..8de1e70b2 100644
    --- a/concurrent/SharedConstructorArgument.java
    +++ b/concurrent/SharedConstructorArgument.java
    @@ -32,10 +32,10 @@ public SharedUser(SharedArg sa) {
     
     public class SharedConstructorArgument {
       public static void main(String[] args) {
    -    Unsafe us = new Unsafe();
    -    IDChecker.test(() -> new SharedUser(us));
    -    Safe sa = new Safe();
    -    IDChecker.test(() -> new SharedUser(sa));
    +    Unsafe unsafe = new Unsafe();
    +    IDChecker.test(() -> new SharedUser(unsafe));
    +    Safe safe = new Safe();
    +    IDChecker.test(() -> new SharedUser(safe));
       }
     }
     /* Output:
    
    From 9fef34e1692731d1707c8b95d2ccf9656a6eaa0d Mon Sep 17 00:00:00 2001
    From: Bruce Eckel 
    Date: Sat, 14 Jan 2017 07:17:31 -0800
    Subject: [PATCH 203/320] Turn off parallel and daemon for clearer output
    
    ---
     .travis.yml  | 3 ++-
     appveyor.yml | 3 ++-
     2 files changed, 4 insertions(+), 2 deletions(-)
    
    diff --git a/.travis.yml b/.travis.yml
    index 5d2b80ba6..a9e2a082d 100644
    --- a/.travis.yml
    +++ b/.travis.yml
    @@ -3,5 +3,6 @@ jdk:
       - oraclejdk8
     install: true
     script:
    -  - ./gradlew --parallel --stacktrace run
    +  - ./gradlew --no-daemon --stacktrace run
    +#  - ./gradlew --parallel --stacktrace run
     #  - ./gradlew --parallel --stacktrace :validating:jmh
    diff --git a/appveyor.yml b/appveyor.yml
    index e703c4c0b..0d99cee33 100644
    --- a/appveyor.yml
    +++ b/appveyor.yml
    @@ -1,5 +1,6 @@
     build_script:
    -  - gradlew.bat --parallel --stacktrace run
    +  - gradlew.bat --no-daemon --stacktrace run
    +#  - gradlew.bat --parallel --stacktrace run
     #  - gradlew.bat --parallel --stacktrace :validating:jmh
     
     test: off
    
    From 9c671edde99176f5356488640f9b2c19c16a8d2e Mon Sep 17 00:00:00 2001
    From: Bruce Eckel 
    Date: Sat, 14 Jan 2017 07:34:50 -0800
    Subject: [PATCH 204/320] Remove BoxObserver from automated build
    
    ---
     patterns/{visualobserver => }/BoxObserver.java | 5 ++---
     1 file changed, 2 insertions(+), 3 deletions(-)
     rename patterns/{visualobserver => }/BoxObserver.java (95%)
    
    diff --git a/patterns/visualobserver/BoxObserver.java b/patterns/BoxObserver.java
    similarity index 95%
    rename from patterns/visualobserver/BoxObserver.java
    rename to patterns/BoxObserver.java
    index 51f028480..b19a448c0 100644
    --- a/patterns/visualobserver/BoxObserver.java
    +++ b/patterns/BoxObserver.java
    @@ -1,11 +1,10 @@
    -// patterns/visualobserver/BoxObserver.java
    +// patterns/BoxObserver.java
     // (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Demonstration of Observer pattern using
     // Java's built-in observer classes
    -// {java patterns.visualobserver.BoxObserver}
    -package patterns.visualobserver;
    +// {ValidateByHand} // CI servers have problems
     import javax.swing.*;
     import java.awt.*;
     import java.awt.event.*;
    
    From fed9a0993bb6264e2e36f954e41b8ad387cc086b Mon Sep 17 00:00:00 2001
    From: Bruce Eckel 
    Date: Sat, 14 Jan 2017 07:41:28 -0800
    Subject: [PATCH 205/320] Take out of CI build
    
    ---
     arrays/ParallelPrefix3.java | 1 +
     1 file changed, 1 insertion(+)
    
    diff --git a/arrays/ParallelPrefix3.java b/arrays/ParallelPrefix3.java
    index 2723483ff..e436023ad 100644
    --- a/arrays/ParallelPrefix3.java
    +++ b/arrays/ParallelPrefix3.java
    @@ -2,6 +2,7 @@
     // (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
    +// {ValidateByHand} // CI Systems have trouble
     import java.util.*;
     
     public class ParallelPrefix3 {
    
    From a179863adbb31a8153b3cd077fd7a77aee81333d Mon Sep 17 00:00:00 2001
    From: Bruce Eckel 
    Date: Sat, 14 Jan 2017 15:49:57 -0800
    Subject: [PATCH 206/320] Doesn't need CopyOnWrite
    
    ---
     lowlevel/DelayQueueDemo.java | 7 +++----
     1 file changed, 3 insertions(+), 4 deletions(-)
    
    diff --git a/lowlevel/DelayQueueDemo.java b/lowlevel/DelayQueueDemo.java
    index e2fbb295a..8913d1f29 100644
    --- a/lowlevel/DelayQueueDemo.java
    +++ b/lowlevel/DelayQueueDemo.java
    @@ -13,7 +13,7 @@ class DelayedTask implements Runnable, Delayed {
       private final int delta;
       private final long trigger;
       protected static List sequence =
    -    new CopyOnWriteArrayList<>();
    +    new ArrayList<>();
       public DelayedTask(int delayInMilliseconds) {
         delta = delayInMilliseconds;
         trigger = System.nanoTime() +
    @@ -49,7 +49,7 @@ public static class EndTask extends DelayedTask {
         @Override
         public void run() {
           sequence.forEach(dt ->
    -        System.out.println(dt.summary() + " "));
    +        System.out.println(dt.summary()));
         }
       }
     }
    @@ -58,8 +58,7 @@ public class DelayQueueDemo {
       public static void
       main(String[] args) throws Exception {
         DelayQueue tasks =
    -      Stream.concat(
    -        // Tasks with random delays:
    +      Stream.concat( // Random delays:
             new Random(47).ints(20, 0, 4000)
               .mapToObj(DelayedTask::new),
             // Add the summarizing task:
    
    From 35610180900acd9179c9e4924dc98b3c3566cb20 Mon Sep 17 00:00:00 2001
    From: Bruce Eckel 
    Date: Sat, 14 Jan 2017 15:50:24 -0800
    Subject: [PATCH 207/320] finishing
    
    ---
     lowlevel/SynchronizedComparison.java | 20 +++++++++++++++++---
     1 file changed, 17 insertions(+), 3 deletions(-)
    
    diff --git a/lowlevel/SynchronizedComparison.java b/lowlevel/SynchronizedComparison.java
    index bedb5e0f4..203338018 100644
    --- a/lowlevel/SynchronizedComparison.java
    +++ b/lowlevel/SynchronizedComparison.java
    @@ -39,6 +39,8 @@ public void method() {
     class Caller implements Runnable {
       private Guarded g;
       public Caller(Guarded g) { this.g = g; }
    +  private AtomicLong successfulCalls =
    +    new AtomicLong();
       private AtomicBoolean stop =
         new AtomicBoolean(false);
       class Stop extends TimerTask {
    @@ -48,8 +50,12 @@ class Stop extends TimerTask {
       @Override
       public void run() {
         new Timer().schedule(new Stop(), 2500);
    -    while(!stop.get())
    +    while(!stop.get()) {
           g.method();
    +      successfulCalls.getAndIncrement();
    +    }
    +    System.out.println(
    +      "-> " + successfulCalls.get());
       }
     }
     
    @@ -72,6 +78,14 @@ public static void main(String[] args) {
       }
     }
     /* Output:
    -CriticalSection: 972
    -SynchronizedMethod: 247
    +-> 152
    +-> 152
    +-> 153
    +-> 153
    +CriticalSection: 610
    +-> 44
    +-> 28
    +-> 62
    +-> 24
    +SynchronizedMethod: 158
     */
    
    From 551389ccd0f1d0a05535c35568a791557c33a13a Mon Sep 17 00:00:00 2001
    From: Bruce Eckel 
    Date: Sat, 14 Jan 2017 15:50:43 -0800
    Subject: [PATCH 208/320] Name change
    
    ---
     lowlevel/SyncObject.java   | 41 ----------------------
     lowlevel/SyncOnObject.java | 70 ++++++++++++++++++++++++++++++++++++++
     2 files changed, 70 insertions(+), 41 deletions(-)
     delete mode 100644 lowlevel/SyncObject.java
     create mode 100644 lowlevel/SyncOnObject.java
    
    diff --git a/lowlevel/SyncObject.java b/lowlevel/SyncObject.java
    deleted file mode 100644
    index f5c88352d..000000000
    --- a/lowlevel/SyncObject.java
    +++ /dev/null
    @@ -1,41 +0,0 @@
    -// lowlevel/SyncObject.java
    -// (c)2017 MindView LLC: see Copyright.txt
    -// We make no guarantees that this code is fit for any purpose.
    -// Visit http://OnJava8.com for more book information.
    -// Synchronizing on another object
    -import java.util.concurrent.*;
    -import onjava.Nap;
    -
    -class DualSynch {
    -  public synchronized void f() {
    -    for(int i = 0; i < 5; i++)
    -      System.out.println("f() " + i);
    -  }
    -  private Object syncObject = new Object();
    -  public void g() {
    -    synchronized(syncObject) {
    -      for(int i = 0; i < 5; i++)
    -        System.out.println("g() " + i);
    -    }
    -  }
    -}
    -
    -public class SyncObject {
    -  public static void main(String[] args) {
    -    DualSynch ds = new DualSynch();
    -    CompletableFuture.runAsync(() -> ds.f());
    -    ds.g();
    -  }
    -}
    -/* Output:
    -g() 0
    -g() 1
    -f() 0
    -g() 2
    -f() 1
    -g() 3
    -f() 2
    -g() 4
    -f() 3
    -f() 4
    -*/
    diff --git a/lowlevel/SyncOnObject.java b/lowlevel/SyncOnObject.java
    new file mode 100644
    index 000000000..6151bb5cf
    --- /dev/null
    +++ b/lowlevel/SyncOnObject.java
    @@ -0,0 +1,70 @@
    +// lowlevel/SyncOnObject.java
    +// (c)2017 MindView LLC: see Copyright.txt
    +// We make no guarantees that this code is fit for any purpose.
    +// Visit http://OnJava8.com for more book information.
    +// Synchronizing on another object
    +import java.util.*;
    +import java.util.stream.*;
    +import java.util.concurrent.*;
    +import onjava.Nap;
    +
    +class DualSynch {
    +  ConcurrentLinkedQueue trace =
    +    new ConcurrentLinkedQueue<>();
    +  public synchronized void f(boolean nap) {
    +    for(int i = 0; i < 5; i++) {
    +      trace.add(String.format("f() " + i));
    +      if(nap) new Nap(10);
    +    }
    +  }
    +  private Object syncObject = new Object();
    +  public void g(boolean nap) {
    +    synchronized(syncObject) {
    +      for(int i = 0; i < 5; i++) {
    +        trace.add(String.format("g() " + i));
    +        if(nap) new Nap(10);
    +      }
    +    }
    +  }
    +}
    +
    +public class SyncOnObject {
    +  static void test(boolean fNap, boolean gNap) {
    +    DualSynch ds = new DualSynch();
    +    List> cfs =
    +      Arrays.stream(new Runnable[] {
    +        () -> ds.f(fNap), () -> ds.g(gNap) })
    +        .map(CompletableFuture::runAsync)
    +        .collect(Collectors.toList());
    +    cfs.forEach(CompletableFuture::join);
    +    ds.trace.forEach(System.out::println);
    +  }
    +  public static void main(String[] args) {
    +    test(true, false);
    +    System.out.println("****");
    +    test(false, true);
    +  }
    +}
    +/* Output:
    +f() 0
    +g() 0
    +g() 1
    +g() 2
    +g() 3
    +g() 4
    +f() 1
    +f() 2
    +f() 3
    +f() 4
    +****
    +f() 0
    +g() 0
    +f() 1
    +f() 2
    +f() 3
    +f() 4
    +g() 1
    +g() 2
    +g() 3
    +g() 4
    +*/
    
    From a05aa3e445a0a04e8ac9e2476483c181f77e67a1 Mon Sep 17 00:00:00 2001
    From: Bruce Eckel 
    Date: Sun, 15 Jan 2017 16:00:44 -0800
    Subject: [PATCH 209/320] New/improved synchronization examples
    
    ---
     concurrent/SynchronizedConstructor.java       | 27 ++++++++++
     lowlevel/AtomicIntegerTest.java               | 24 ++-------
     lowlevel/AtomicSerialNumbers.java             | 21 ++++++++
     lowlevel/Atomicity.java                       | 50 +++++--------------
     lowlevel/AtomicityTest.java                   | 34 -------------
     lowlevel/CircularSet.java                     | 29 +++++++++++
     lowlevel/IntTestable.java                     | 15 ++++++
     lowlevel/NotAtomic.java                       | 44 ++++++++++++++++
     lowlevel/SafeReturn.java                      | 21 ++++++++
     lowlevel/SerialNumberChecker.java             | 42 +++-------------
     lowlevel/SerialNumberTest.java                | 13 +++++
     ...NumberSupplier.java => SerialNumbers.java} |  8 +--
     lowlevel/SynchronizedSerialNumbers.java       | 19 +++++++
     lowlevel/UnsafeReturn.java                    | 21 ++++++++
     14 files changed, 240 insertions(+), 128 deletions(-)
     create mode 100644 concurrent/SynchronizedConstructor.java
     create mode 100644 lowlevel/AtomicSerialNumbers.java
     delete mode 100644 lowlevel/AtomicityTest.java
     create mode 100644 lowlevel/CircularSet.java
     create mode 100644 lowlevel/IntTestable.java
     create mode 100644 lowlevel/NotAtomic.java
     create mode 100644 lowlevel/SafeReturn.java
     create mode 100644 lowlevel/SerialNumberTest.java
     rename lowlevel/{SerialNumberSupplier.java => SerialNumbers.java} (56%)
     create mode 100644 lowlevel/SynchronizedSerialNumbers.java
     create mode 100644 lowlevel/UnsafeReturn.java
    
    diff --git a/concurrent/SynchronizedConstructor.java b/concurrent/SynchronizedConstructor.java
    new file mode 100644
    index 000000000..300a9d151
    --- /dev/null
    +++ b/concurrent/SynchronizedConstructor.java
    @@ -0,0 +1,27 @@
    +// concurrent/SynchronizedConstructor.java
    +// (c)2017 MindView LLC: see Copyright.txt
    +// We make no guarantees that this code is fit for any purpose.
    +// Visit http://OnJava8.com for more book information.
    +import java.util.concurrent.atomic.*;
    +
    +class SyncConstructor implements HasID {
    +  private final int id;
    +  private static Object constructorLock = new Object();
    +  public SyncConstructor(SharedArg sa) {
    +    synchronized(constructorLock) {
    +      id = sa.get();
    +    }
    +  }
    +  @Override
    +  public int getID() { return id; }
    +}
    +
    +public class SynchronizedConstructor {
    +  public static void main(String[] args) {
    +    Unsafe unsafe = new Unsafe();
    +    IDChecker.test(() -> new SyncConstructor(unsafe));
    +  }
    +}
    +/* Output:
    +0
    +*/
    diff --git a/lowlevel/AtomicIntegerTest.java b/lowlevel/AtomicIntegerTest.java
    index 9c372350c..31c6a106c 100644
    --- a/lowlevel/AtomicIntegerTest.java
    +++ b/lowlevel/AtomicIntegerTest.java
    @@ -7,28 +7,14 @@
     import java.util.*;
     import onjava.*;
     
    -public class AtomicIntegerTest implements Runnable {
    +public class AtomicIntegerTest extends IntTestable {
       private AtomicInteger i = new AtomicInteger(0);
    -  public int getValue() { return i.get(); }
    -  private void evenIncrement() { i.addAndGet(2); }
    -  @Override
    -  public void run() {
    -    while(true)
    -      evenIncrement();
    -  }
    +  public int getAsInt() { return i.get(); }
    +  public void evenIncrement() { i.addAndGet(2); }
       public static void main(String[] args) {
    -    new TimedAbort(4, "No failures discovered");
    -    AtomicIntegerTest ait = new AtomicIntegerTest();
    -    CompletableFuture.runAsync(ait);
    -    while(true) {
    -      int val = ait.getValue();
    -      if(val % 2 != 0) {
    -        System.out.println(val);
    -        System.exit(0);
    -      }
    -    }
    +    Atomicity.test(new AtomicIntegerTest());
       }
     }
     /* Output:
    -No failures discovered
    +No failures found
     */
    diff --git a/lowlevel/AtomicSerialNumbers.java b/lowlevel/AtomicSerialNumbers.java
    new file mode 100644
    index 000000000..53547bccb
    --- /dev/null
    +++ b/lowlevel/AtomicSerialNumbers.java
    @@ -0,0 +1,21 @@
    +// lowlevel/AtomicSerialNumbers.java
    +// (c)2017 MindView LLC: see Copyright.txt
    +// We make no guarantees that this code is fit for any purpose.
    +// Visit http://OnJava8.com for more book information.
    +import java.util.concurrent.atomic.*;
    +
    +public class
    +AtomicSerialNumbers extends SerialNumbers {
    +  private AtomicInteger serialNumber =
    +    new AtomicInteger();
    +  public synchronized int nextSerialNumber() {
    +    return serialNumber.getAndIncrement();
    +  }
    +  public static void main(String[] args) {
    +    SerialNumberChecker.test(
    +      new AtomicSerialNumbers());
    +  }
    +}
    +/* Output:
    +No duplicates detected
    +*/
    diff --git a/lowlevel/Atomicity.java b/lowlevel/Atomicity.java
    index 19c73c8a7..380a5f1be 100644
    --- a/lowlevel/Atomicity.java
    +++ b/lowlevel/Atomicity.java
    @@ -2,43 +2,19 @@
     // (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
    -// {javap -c Atomicity}
    +import java.util.concurrent.*;
    +import onjava.TimedAbort;
     
     public class Atomicity {
    -  int i;
    -  void f1() { i++; }
    -  void f2() { i += 3; }
    +  public static void test(IntTestable it) {
    +    new TimedAbort(4, "No failures found");
    +    CompletableFuture.runAsync(it);
    +    while(true) {
    +      int val = it.getAsInt();
    +      if(val % 2 != 0) {
    +        System.out.println("failed with: " + val);
    +        System.exit(0);
    +      }
    +    }
    +  }
     }
    -/* Output:
    -Compiled from "Atomicity.java"
    -public class Atomicity {
    -  int i;
    -
    -  public Atomicity();
    -    Code:
    -       0: aload_0
    -       1: invokespecial #1   // Method
    -java/lang/Object."":()V
    -       4: return
    -
    -  void f1();
    -    Code:
    -       0: aload_0
    -       1: dup
    -       2: getfield      #2   // Field i:I
    -       5: iconst_1
    -       6: iadd
    -       7: putfield      #2   // Field i:I
    -      10: return
    -
    -  void f2();
    -    Code:
    -       0: aload_0
    -       1: dup
    -       2: getfield      #2   // Field i:I
    -       5: iconst_3
    -       6: iadd
    -       7: putfield      #2   // Field i:I
    -      10: return
    -}
    -*/
    diff --git a/lowlevel/AtomicityTest.java b/lowlevel/AtomicityTest.java
    deleted file mode 100644
    index 53acd2b82..000000000
    --- a/lowlevel/AtomicityTest.java
    +++ /dev/null
    @@ -1,34 +0,0 @@
    -// lowlevel/AtomicityTest.java
    -// (c)2017 MindView LLC: see Copyright.txt
    -// We make no guarantees that this code is fit for any purpose.
    -// Visit http://OnJava8.com for more book information.
    -import java.util.concurrent.*;
    -import onjava.TimedAbort;
    -
    -public class AtomicityTest implements Runnable {
    -  private int i = 0;
    -  public int getValue() { return i; }
    -  private synchronized void evenIncrement() {
    -    i++; i++;
    -  }
    -  @Override
    -  public void run() {
    -    while(true)
    -      evenIncrement();
    -  }
    -  public static void main(String[] args) {
    -    new TimedAbort(4, "No failures found");
    -    AtomicityTest at = new AtomicityTest();
    -    CompletableFuture.runAsync(at);
    -    while(true) {
    -      int val = at.getValue();
    -      if(val % 2 != 0) {
    -        System.out.println("failed with: " + val);
    -        System.exit(0);
    -      }
    -    }
    -  }
    -}
    -/* Output:
    -failed with: 21
    -*/
    diff --git a/lowlevel/CircularSet.java b/lowlevel/CircularSet.java
    new file mode 100644
    index 000000000..8f76fd197
    --- /dev/null
    +++ b/lowlevel/CircularSet.java
    @@ -0,0 +1,29 @@
    +// lowlevel/CircularSet.java
    +// (c)2017 MindView LLC: see Copyright.txt
    +// We make no guarantees that this code is fit for any purpose.
    +// Visit http://OnJava8.com for more book information.
    +// Reuses storage so we don't run out of memory
    +import java.util.*;
    +
    +public class CircularSet {
    +  private int[] array;
    +  private int size;
    +  private int index = 0;
    +  public CircularSet(int size) {
    +    this.size = size;
    +    array = new int[size];
    +    // Initialize to a value not produced
    +    // by SerialNumbers:
    +    Arrays.fill(array, -1);
    +  }
    +  public synchronized void add(int i) {
    +    array[index] = i;
    +    // Wrap index and write over old elements:
    +    index = ++index % size;
    +  }
    +  public synchronized boolean contains(int val) {
    +    for(int i = 0; i < size; i++)
    +      if(array[i] == val) return true;
    +    return false;
    +  }
    +}
    diff --git a/lowlevel/IntTestable.java b/lowlevel/IntTestable.java
    new file mode 100644
    index 000000000..a2a033fea
    --- /dev/null
    +++ b/lowlevel/IntTestable.java
    @@ -0,0 +1,15 @@
    +// lowlevel/IntTestable.java
    +// (c)2017 MindView LLC: see Copyright.txt
    +// We make no guarantees that this code is fit for any purpose.
    +// Visit http://OnJava8.com for more book information.
    +import java.util.function.*;
    +
    +public abstract class
    +IntTestable implements Runnable, IntSupplier {
    +  abstract void evenIncrement();
    +  @Override
    +  public void run() {
    +    while(true)
    +      evenIncrement();
    +  }
    +}
    diff --git a/lowlevel/NotAtomic.java b/lowlevel/NotAtomic.java
    new file mode 100644
    index 000000000..ab9577a99
    --- /dev/null
    +++ b/lowlevel/NotAtomic.java
    @@ -0,0 +1,44 @@
    +// lowlevel/NotAtomic.java
    +// (c)2017 MindView LLC: see Copyright.txt
    +// We make no guarantees that this code is fit for any purpose.
    +// Visit http://OnJava8.com for more book information.
    +// {javap -c NotAtomic}
    +
    +public class NotAtomic {
    +  int i;
    +  void f1() { i++; }
    +  void f2() { i += 3; }
    +}
    +/* Output:
    +Compiled from "NotAtomic.java"
    +public class NotAtomic {
    +  int i;
    +
    +  public NotAtomic();
    +    Code:
    +       0: aload_0
    +       1: invokespecial #1   // Method
    +java/lang/Object."":()V
    +       4: return
    +
    +  void f1();
    +    Code:
    +       0: aload_0
    +       1: dup
    +       2: getfield      #2   // Field i:I
    +       5: iconst_1
    +       6: iadd
    +       7: putfield      #2   // Field i:I
    +      10: return
    +
    +  void f2();
    +    Code:
    +       0: aload_0
    +       1: dup
    +       2: getfield      #2   // Field i:I
    +       5: iconst_3
    +       6: iadd
    +       7: putfield      #2   // Field i:I
    +      10: return
    +}
    +*/
    diff --git a/lowlevel/SafeReturn.java b/lowlevel/SafeReturn.java
    new file mode 100644
    index 000000000..19e82ca7f
    --- /dev/null
    +++ b/lowlevel/SafeReturn.java
    @@ -0,0 +1,21 @@
    +// lowlevel/SafeReturn.java
    +// (c)2017 MindView LLC: see Copyright.txt
    +// We make no guarantees that this code is fit for any purpose.
    +// Visit http://OnJava8.com for more book information.
    +import java.util.function.*;
    +import java.util.concurrent.*;
    +import onjava.TimedAbort;
    +
    +public class SafeReturn extends IntTestable {
    +  private int i = 0;
    +  public synchronized int getAsInt() { return i; }
    +  public synchronized void evenIncrement() {
    +    i++; i++;
    +  }
    +  public static void main(String[] args) {
    +    Atomicity.test(new SafeReturn());
    +  }
    +}
    +/* Output:
    +No failures found
    +*/
    diff --git a/lowlevel/SerialNumberChecker.java b/lowlevel/SerialNumberChecker.java
    index 09ef4235a..f03c28542 100644
    --- a/lowlevel/SerialNumberChecker.java
    +++ b/lowlevel/SerialNumberChecker.java
    @@ -2,43 +2,20 @@
     // (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
    -// Operations that might seem safe are not,
    -// when threads are present.
    -import java.util.*;
    +// Test SerialNumbers implementations for thread-safety
     import java.util.concurrent.*;
     import onjava.Nap;
     
    -// Reuses storage so we don't run out of memory:
    -class CircularSet {
    -  private int[] array;
    -  private int size;
    -  private int index = 0;
    -  public CircularSet(int size) {
    -    array = new int[size];
    -    // Initialize to a value not produced
    -    // by the SerialNumberSupplier:
    -    Arrays.fill(array, -1);
    -    this.size = size;
    -  }
    -  public synchronized void add(int i) {
    -    array[index] = i;
    -    // Wrap index and write over old elements:
    -    index = ++index % size;
    -  }
    -  public synchronized boolean contains(int val) {
    -    for(int i = 0; i < size; i++)
    -      if(array[i] == val) return true;
    -    return false;
    -  }
    -}
    -
     public class SerialNumberChecker implements Runnable {
       private CircularSet serials = new CircularSet(1000);
    +  private SerialNumbers producer;
    +  public SerialNumberChecker(SerialNumbers producer) {
    +    this.producer = producer;
    +  }
       @Override
       public void run() {
         while(true) {
    -      int serial =
    -        SerialNumberSupplier.nextSerialNumber();
    +      int serial = producer.nextSerialNumber();
           if(serials.contains(serial)) {
             System.out.println("Duplicate: " + serial);
             System.exit(0);
    @@ -46,13 +23,10 @@ public void run() {
           serials.add(serial);
         }
       }
    -  public static void main(String[] args) {
    +  static void test(SerialNumbers producer) {
         for(int i = 0; i < 10; i++)
           CompletableFuture.runAsync(
    -        new SerialNumberChecker());
    +        new SerialNumberChecker(producer));
         new Nap(4000, "No duplicates detected");
       }
     }
    -/* Output:
    -Duplicate: 4119
    -*/
    diff --git a/lowlevel/SerialNumberTest.java b/lowlevel/SerialNumberTest.java
    new file mode 100644
    index 000000000..d19b8f6ba
    --- /dev/null
    +++ b/lowlevel/SerialNumberTest.java
    @@ -0,0 +1,13 @@
    +// lowlevel/SerialNumberTest.java
    +// (c)2017 MindView LLC: see Copyright.txt
    +// We make no guarantees that this code is fit for any purpose.
    +// Visit http://OnJava8.com for more book information.
    +
    +public class SerialNumberTest {
    +  public static void main(String[] args) {
    +    SerialNumberChecker.test(new SerialNumbers());
    +  }
    +}
    +/* Output:
    +Duplicate: 4119
    +*/
    diff --git a/lowlevel/SerialNumberSupplier.java b/lowlevel/SerialNumbers.java
    similarity index 56%
    rename from lowlevel/SerialNumberSupplier.java
    rename to lowlevel/SerialNumbers.java
    index 73c7d2d55..bf046b7ae 100644
    --- a/lowlevel/SerialNumberSupplier.java
    +++ b/lowlevel/SerialNumbers.java
    @@ -1,11 +1,11 @@
    -// lowlevel/SerialNumberSupplier.java
    +// lowlevel/SerialNumbers.java
     // (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
    -public class SerialNumberSupplier {
    -  private static volatile int serialNumber = 0;
    -  public static int nextSerialNumber() {
    +public class SerialNumbers {
    +  private volatile int serialNumber = 0;
    +  public int nextSerialNumber() {
         return serialNumber++; // Not thread-safe
       }
     }
    diff --git a/lowlevel/SynchronizedSerialNumbers.java b/lowlevel/SynchronizedSerialNumbers.java
    new file mode 100644
    index 000000000..fff565e23
    --- /dev/null
    +++ b/lowlevel/SynchronizedSerialNumbers.java
    @@ -0,0 +1,19 @@
    +// lowlevel/SynchronizedSerialNumbers.java
    +// (c)2017 MindView LLC: see Copyright.txt
    +// We make no guarantees that this code is fit for any purpose.
    +// Visit http://OnJava8.com for more book information.
    +
    +public class
    +SynchronizedSerialNumbers extends SerialNumbers {
    +  private int serialNumber = 0;
    +  public synchronized int nextSerialNumber() {
    +    return serialNumber++;
    +  }
    +  public static void main(String[] args) {
    +    SerialNumberChecker.test(
    +      new SynchronizedSerialNumbers());
    +  }
    +}
    +/* Output:
    +No duplicates detected
    +*/
    diff --git a/lowlevel/UnsafeReturn.java b/lowlevel/UnsafeReturn.java
    new file mode 100644
    index 000000000..42a763574
    --- /dev/null
    +++ b/lowlevel/UnsafeReturn.java
    @@ -0,0 +1,21 @@
    +// lowlevel/UnsafeReturn.java
    +// (c)2017 MindView LLC: see Copyright.txt
    +// We make no guarantees that this code is fit for any purpose.
    +// Visit http://OnJava8.com for more book information.
    +import java.util.function.*;
    +import java.util.concurrent.*;
    +import onjava.TimedAbort;
    +
    +public class UnsafeReturn extends IntTestable {
    +  private int i = 0;
    +  public int getAsInt() { return i; }
    +  public synchronized void evenIncrement() {
    +    i++; i++;
    +  }
    +  public static void main(String[] args) {
    +    Atomicity.test(new UnsafeReturn());
    +  }
    +}
    +/* Output:
    +failed with: 21
    +*/
    
    From 47d7a825465c033640afa1d4378109c2b7f854bf Mon Sep 17 00:00:00 2001
    From: Bruce Eckel 
    Date: Mon, 16 Jan 2017 11:44:37 -0800
    Subject: [PATCH 210/320] Try snapshot with Jansi fixed
    
    ---
     gradle/wrapper/gradle-wrapper.properties | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
    index 293fd09bf..7a99648b8 100644
    --- a/gradle/wrapper/gradle-wrapper.properties
    +++ b/gradle/wrapper/gradle-wrapper.properties
    @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME
     distributionPath=wrapper/dists
     zipStoreBase=GRADLE_USER_HOME
     zipStorePath=wrapper/dists
    -distributionUrl=https\://services.gradle.org/distributions/gradle-3.3-bin.zip
    +distributionUrl=https\://services.gradle.org/distributions-snapshots/gradle-3.4-20170116000026+0000-bin.zip
    
    From f26eb5689e85dbb224783f24671a09efdcbbd194 Mon Sep 17 00:00:00 2001
    From: Bruce Eckel 
    Date: Tue, 17 Jan 2017 07:31:29 -0800
    Subject: [PATCH 211/320] Travis CI failing on this
    
    ---
     concurrent/Summing2.java | 1 +
     1 file changed, 1 insertion(+)
    
    diff --git a/concurrent/Summing2.java b/concurrent/Summing2.java
    index a361a660b..dabece6ea 100644
    --- a/concurrent/Summing2.java
    +++ b/concurrent/Summing2.java
    @@ -2,6 +2,7 @@
     // (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
    +// {ValidateByHand} // CI has trouble
     import java.util.*;
     
     public class Summing2 {
    
    From b8552ee24c380eabc753aa20da18e298e013e5df Mon Sep 17 00:00:00 2001
    From: Bruce Eckel 
    Date: Wed, 18 Jan 2017 16:10:02 -0800
    Subject: [PATCH 212/320] Bump JMH version
    
    ---
     gradle/jmh.gradle | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/gradle/jmh.gradle b/gradle/jmh.gradle
    index bf8c770c6..ce61db4bd 100644
    --- a/gradle/jmh.gradle
    +++ b/gradle/jmh.gradle
    @@ -9,7 +9,7 @@ sourceSets {
     }
     
     jmh {
    -    jmhVersion = '1.17.3'
    +    jmhVersion = '1.17.4'
         duplicateClassesStrategy = 'warn'
         failOnError = true
         // See https://github.com/melix/jmh-gradle-plugin
    
    From d8658f0a522b5a92fbd58369c904c2a28a496abe Mon Sep 17 00:00:00 2001
    From: Bruce Eckel 
    Date: Wed, 18 Jan 2017 16:10:15 -0800
    Subject: [PATCH 213/320] Final pass-through edits
    
    ---
     concurrent/DiningPhilosophers.java        | 11 +++------
     concurrent/SharedConstructorArgument.java |  2 +-
     concurrent/SynchronizedConstructor.java   |  6 +++--
     concurrent/SynchronizedFactory.java       | 29 +++++++++++++++++++++++
     lowlevel/ReOrdering.java                  | 19 +++++++++++++++
     lowlevel/SettingDefaultHandler.java       |  3 ++-
     lowlevel/SynchronizedComparison.java      |  8 +++----
     7 files changed, 61 insertions(+), 17 deletions(-)
     create mode 100644 concurrent/SynchronizedFactory.java
     create mode 100644 lowlevel/ReOrdering.java
    
    diff --git a/concurrent/DiningPhilosophers.java b/concurrent/DiningPhilosophers.java
    index bc3154cae..942779e78 100644
    --- a/concurrent/DiningPhilosophers.java
    +++ b/concurrent/DiningPhilosophers.java
    @@ -5,7 +5,7 @@
     // Hidden deadlock
     import java.util.*;
     import java.util.concurrent.*;
    -import static java.util.concurrent.TimeUnit.*;
    +import onjava.Nap;
     
     public class DiningPhilosophers {
       private StickHolder[] sticks;
    @@ -17,7 +17,7 @@ public DiningPhilosophers(int n) {
         Arrays.setAll(philosophers, i ->
           new Philosopher(i,
             sticks[i], sticks[(i + 1) % n]));    // [1]
    -    // Fix by reversing stick order:
    +    // Fix by reversing stick order for this one:
         // philosophers[1] =                     // [2]
         //   new Philosopher(0, sticks[0], sticks[1]);
         Arrays.stream(philosophers)
    @@ -27,11 +27,6 @@ public static void main(String[] args) {
         // Returns right away:
         new DiningPhilosophers(5);               // [4]
         // Keeps main() from exiting:
    -    ScheduledExecutorService sched =
    -      Executors.newScheduledThreadPool(1);
    -    sched.schedule( () -> {
    -      System.out.println("Shutdown");
    -      sched.shutdown();
    -    }, 3, SECONDS);
    +    new Nap(3000, "Shutdown");
       }
     }
    diff --git a/concurrent/SharedConstructorArgument.java b/concurrent/SharedConstructorArgument.java
    index 8de1e70b2..b49f857af 100644
    --- a/concurrent/SharedConstructorArgument.java
    +++ b/concurrent/SharedConstructorArgument.java
    @@ -17,7 +17,7 @@ class Safe implements SharedArg {
       private static AtomicInteger counter =
         new AtomicInteger();
       public int get() {
    -    return counter.getAndAdd(1);
    +    return counter.getAndIncrement();
       }
     }
     
    diff --git a/concurrent/SynchronizedConstructor.java b/concurrent/SynchronizedConstructor.java
    index 300a9d151..0533f8bbc 100644
    --- a/concurrent/SynchronizedConstructor.java
    +++ b/concurrent/SynchronizedConstructor.java
    @@ -6,7 +6,8 @@
     
     class SyncConstructor implements HasID {
       private final int id;
    -  private static Object constructorLock = new Object();
    +  private static Object
    +    constructorLock = new Object();
       public SyncConstructor(SharedArg sa) {
         synchronized(constructorLock) {
           id = sa.get();
    @@ -19,7 +20,8 @@ public SyncConstructor(SharedArg sa) {
     public class SynchronizedConstructor {
       public static void main(String[] args) {
         Unsafe unsafe = new Unsafe();
    -    IDChecker.test(() -> new SyncConstructor(unsafe));
    +    IDChecker.test(() ->
    +      new SyncConstructor(unsafe));
       }
     }
     /* Output:
    diff --git a/concurrent/SynchronizedFactory.java b/concurrent/SynchronizedFactory.java
    new file mode 100644
    index 000000000..d16d3a3e4
    --- /dev/null
    +++ b/concurrent/SynchronizedFactory.java
    @@ -0,0 +1,29 @@
    +// concurrent/SynchronizedFactory.java
    +// (c)2017 MindView LLC: see Copyright.txt
    +// We make no guarantees that this code is fit for any purpose.
    +// Visit http://OnJava8.com for more book information.
    +import java.util.concurrent.atomic.*;
    +
    +class SyncFactory implements HasID {
    +  private final int id;
    +  private SyncFactory(SharedArg sa) {
    +    id = sa.get();
    +  }
    +  @Override
    +  public int getID() { return id; }
    +  public static synchronized
    +  SyncFactory factory(SharedArg sa) {
    +    return new SyncFactory(sa);
    +  }
    +}
    +
    +public class SynchronizedFactory {
    +  public static void main(String[] args) {
    +    Unsafe unsafe = new Unsafe();
    +    IDChecker.test(() ->
    +      SyncFactory.factory(unsafe));
    +  }
    +}
    +/* Output:
    +0
    +*/
    diff --git a/lowlevel/ReOrdering.java b/lowlevel/ReOrdering.java
    new file mode 100644
    index 000000000..9de9c4b81
    --- /dev/null
    +++ b/lowlevel/ReOrdering.java
    @@ -0,0 +1,19 @@
    +// lowlevel/ReOrdering.java
    +// (c)2017 MindView LLC: see Copyright.txt
    +// We make no guarantees that this code is fit for any purpose.
    +// Visit http://OnJava8.com for more book information.
    +
    +public class ReOrdering implements Runnable {
    +  int one, two, three, four, five, six;
    +  volatile int volaTile;
    +  @Override
    +  public void run() {
    +    one = 1;
    +    two = 2;
    +    three = 3;
    +    volaTile = 92;
    +    int x = four;
    +    int y = five;
    +    int z = six;
    +  }
    +}
    diff --git a/lowlevel/SettingDefaultHandler.java b/lowlevel/SettingDefaultHandler.java
    index ac50eaf4d..9b13362bf 100644
    --- a/lowlevel/SettingDefaultHandler.java
    +++ b/lowlevel/SettingDefaultHandler.java
    @@ -8,7 +8,8 @@ public class SettingDefaultHandler {
       public static void main(String[] args) {
         Thread.setDefaultUncaughtExceptionHandler(
           new MyUncaughtExceptionHandler());
    -    ExecutorService es = Executors.newCachedThreadPool();
    +    ExecutorService es =
    +      Executors.newCachedThreadPool();
         es.execute(new ExceptionThread());
         es.shutdown();
       }
    diff --git a/lowlevel/SynchronizedComparison.java b/lowlevel/SynchronizedComparison.java
    index 203338018..62a38305c 100644
    --- a/lowlevel/SynchronizedComparison.java
    +++ b/lowlevel/SynchronizedComparison.java
    @@ -43,13 +43,11 @@ class Caller implements Runnable {
         new AtomicLong();
       private AtomicBoolean stop =
         new AtomicBoolean(false);
    -  class Stop extends TimerTask {
    -    @Override
    -    public void run() { stop.set(true); }
    -  }
       @Override
       public void run() {
    -    new Timer().schedule(new Stop(), 2500);
    +    new Timer().schedule(new TimerTask() {
    +      public void run() { stop.set(true); }
    +    }, 2500);
         while(!stop.get()) {
           g.method();
           successfulCalls.getAndIncrement();
    
    From 022b281ba2909ffc960dd05d56ee2092250b9976 Mon Sep 17 00:00:00 2001
    From: Bruce Eckel 
    Date: Fri, 20 Jan 2017 10:35:45 -0800
    Subject: [PATCH 214/320] Try nightly gradle build
    
    ---
     gradle/wrapper/gradle-wrapper.properties | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
    index 7a99648b8..0a6e31bee 100644
    --- a/gradle/wrapper/gradle-wrapper.properties
    +++ b/gradle/wrapper/gradle-wrapper.properties
    @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME
     distributionPath=wrapper/dists
     zipStoreBase=GRADLE_USER_HOME
     zipStorePath=wrapper/dists
    -distributionUrl=https\://services.gradle.org/distributions-snapshots/gradle-3.4-20170116000026+0000-bin.zip
    +distributionUrl=https\://services.gradle.org/distributions-snapshots/gradle-3.5-20170120000025+0000-bin.zip
    
    From 052deaba26067088f52df5149427ca528365af57 Mon Sep 17 00:00:00 2001
    From: Bruce Eckel 
    Date: Fri, 20 Jan 2017 10:58:00 -0800
    Subject: [PATCH 215/320] Test removal for CI problems
    
    ---
     concurrent/Summing3.java     | 1 +
     newio/AvailableCharSets.java | 1 +
     2 files changed, 2 insertions(+)
    
    diff --git a/concurrent/Summing3.java b/concurrent/Summing3.java
    index 2a739b8b9..bcd483260 100644
    --- a/concurrent/Summing3.java
    +++ b/concurrent/Summing3.java
    @@ -2,6 +2,7 @@
     // (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
    +// {ValidateByHand} // CI has trouble
     import java.util.*;
     
     public class Summing3 {
    diff --git a/newio/AvailableCharSets.java b/newio/AvailableCharSets.java
    index 555b3dfb9..64c0e3a92 100644
    --- a/newio/AvailableCharSets.java
    +++ b/newio/AvailableCharSets.java
    @@ -3,6 +3,7 @@
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Displays Charsets and aliases
    +// {ValidateByHand} // CI has trouble
     import java.nio.charset.*;
     import java.util.*;
     
    
    From 18ade9f18ef826f94628b898bb617a755f075453 Mon Sep 17 00:00:00 2001
    From: Bruce Eckel 
    Date: Fri, 20 Jan 2017 11:05:18 -0800
    Subject: [PATCH 216/320] Test removal for CI problems
    
    ---
     concurrent/Summing4.java | 1 +
     1 file changed, 1 insertion(+)
    
    diff --git a/concurrent/Summing4.java b/concurrent/Summing4.java
    index 1bbeb6be5..27353141b 100644
    --- a/concurrent/Summing4.java
    +++ b/concurrent/Summing4.java
    @@ -2,6 +2,7 @@
     // (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
    +// {ValidateByHand} // CI has trouble
     import java.util.*;
     
     public class Summing4 {
    
    From f3ef6ec758b6256fdf2a770c47e28d0f2dc118dc Mon Sep 17 00:00:00 2001
    From: Bruce Eckel 
    Date: Fri, 20 Jan 2017 21:30:44 -0800
    Subject: [PATCH 217/320] Format/Streamify
    
    ---
     annotations/AtUnitExample1.java             |  4 +-
     annotations/AtUnitExample4.java             |  9 ++-
     annotations/AtUnitExample5.java             |  4 +-
     annotations/AtUnitExternalTest.java         |  7 ++-
     annotations/PasswordUtils.java              |  3 +-
     annotations/StackLStringTest.java           |  3 +-
     arrays/ArrayOptions.java                    |  2 +-
     arrays/CollectionComparison.java            |  7 ++-
     arrays/TestCount.java                       | 13 +++--
     arrays/TestRand.java                        | 13 +++--
     enums/CarWash.java                          |  8 ++-
     enums/ConstantSpecificMethod.java           |  3 +-
     enums/EnumSets.java                         | 11 ++--
     enums/Input.java                            |  8 ++-
     enums/NotClasses.java                       | 12 +++-
     enums/OverrideConstantSpecific.java         |  8 ++-
     enums/PostOffice.java                       | 19 +++++--
     enums/Reflection.java                       |  9 ++-
     enums/RoShamBo1.java                        |  2 +-
     enums/SecurityCategory.java                 | 11 +++-
     enums/SpaceShip.java                        |  3 +-
     enums/VendingMachine.java                   |  7 ++-
     enums/cartoons/EnumImplementation.java      |  6 +-
     files/ListOfLines.java                      | 16 +++---
     generics/BankTeller.java                    | 24 +++++---
     generics/CRGWithBasicHolder.java            |  4 +-
     generics/ComparablePet.java                 |  4 +-
     generics/CovariantReturnTypes.java          |  2 +-
     generics/GenericCast.java                   | 36 ++++++++----
     generics/HasF.java                          |  4 +-
     generics/PrimitiveGenericTest.java          | 12 ++--
     generics/RestrictedComparablePets.java      |  8 ++-
     network/SimpleClient2.java                  |  2 +-
     onjava/Count.java                           | 43 ++++++++++----
     onjava/Enums.java                           |  2 +-
     onjava/Rand.java                            | 62 +++++++++++++++------
     onjava/TypeCounter.java                     | 17 +++---
     patterns/doubledispatch/Aluminum.java       |  3 +-
     patterns/doubledispatch/Cardboard.java      |  3 +-
     patterns/doubledispatch/DoubleDispatch.java |  3 +-
     patterns/doubledispatch/Glass.java          |  3 +-
     patterns/doubledispatch/Paper.java          |  3 +-
     patterns/doubledispatch/TypedBin.java       |  2 +-
     patterns/recyclec/RecycleC.java             |  6 +-
     streams/SpecialCollector.java               |  6 +-
     strings/Finding.java                        |  3 +-
     {onjava => strings}/Hex.java                |  2 +-
     strings/UsingStringBuilder.java             | 19 +++++--
     typeinfo/ModifyingPrivateFields.java        |  3 +-
     typeinfo/PetCount3.java                     | 29 ++++------
     typeinfo/Position.java                      |  7 ++-
     typeinfo/SelectingMethods.java              | 12 +++-
     52 files changed, 332 insertions(+), 180 deletions(-)
     rename {onjava => strings}/Hex.java (98%)
    
    diff --git a/annotations/AtUnitExample1.java b/annotations/AtUnitExample1.java
    index a5efe07c6..cd0954264 100644
    --- a/annotations/AtUnitExample1.java
    +++ b/annotations/AtUnitExample1.java
    @@ -23,7 +23,9 @@ public int methodTwo() {
       @Test private boolean m3() { return true; }
       // Shows output for failure:
       @Test boolean failureTest() { return false; }
    -  @Test boolean anotherDisappointment() { return false; }
    +  @Test boolean anotherDisappointment() {
    +    return false;
    +  }
     }
     /* Output:
     annotations.AtUnitExample1
    diff --git a/annotations/AtUnitExample4.java b/annotations/AtUnitExample4.java
    index f0cfb8a55..d40ca8c06 100644
    --- a/annotations/AtUnitExample4.java
    +++ b/annotations/AtUnitExample4.java
    @@ -15,11 +15,14 @@ public class AtUnitExample4 {
         "middle, and then thin again at the far end.";
       private String word;
       private Random rand = new Random(); // Time-based seed
    -  public AtUnitExample4(String word) { this.word = word; }
    +  public AtUnitExample4(String word) {
    +    this.word = word;
    +  }
       public String getWord() { return word; }
       public String scrambleWord() {
         List chars =
    -      Arrays.asList(ConvertTo.boxed(word.toCharArray()));
    +      Arrays.asList(
    +        ConvertTo.boxed(word.toCharArray()));
         Collections.shuffle(chars, rand);
         StringBuilder result = new StringBuilder();
         for(char ch : chars)
    @@ -41,7 +44,7 @@ public String scrambleWord() {
         return getWord().equals("are");
       }
       @Test boolean scramble1() {
    -    // Change to specific seed to get verifiable results:
    +    // Use specific seed to get verifiable results:
         rand = new Random(47);
         System.out.println("'" + getWord() + "'");
         String scrambled = scrambleWord();
    diff --git a/annotations/AtUnitExample5.java b/annotations/AtUnitExample5.java
    index 7bd473b58..f613ea512 100644
    --- a/annotations/AtUnitExample5.java
    +++ b/annotations/AtUnitExample5.java
    @@ -11,7 +11,9 @@
     
     public class AtUnitExample5 {
       private String text;
    -  public AtUnitExample5(String text) { this.text = text; }
    +  public AtUnitExample5(String text) {
    +    this.text = text;
    +  }
       @Override
       public String toString() { return text; }
       @TestProperty static PrintWriter output;
    diff --git a/annotations/AtUnitExternalTest.java b/annotations/AtUnitExternalTest.java
    index 0860dffff..9d1d91379 100644
    --- a/annotations/AtUnitExternalTest.java
    +++ b/annotations/AtUnitExternalTest.java
    @@ -9,11 +9,14 @@
     import onjava.atunit.*;
     import onjava.*;
     
    -public class AtUnitExternalTest extends AtUnitExample1 {
    +public class
    +AtUnitExternalTest extends AtUnitExample1 {
       @Test boolean tMethodOne() {
         return methodOne().equals("This is methodOne");
       }
    -  @Test boolean tMethodTwo() { return methodTwo() == 2; }
    +  @Test boolean tMethodTwo() {
    +    return methodTwo() == 2;
    +  }
     }
     /* Output:
     annotations.AtUnitExternalTest
    diff --git a/annotations/PasswordUtils.java b/annotations/PasswordUtils.java
    index eb3ce4dd8..20c83cf74 100644
    --- a/annotations/PasswordUtils.java
    +++ b/annotations/PasswordUtils.java
    @@ -12,7 +12,8 @@ public boolean validatePassword(String passwd) {
       }
       @UseCase(id = 48)
       public String encryptPassword(String passwd) {
    -   return new StringBuilder(passwd).reverse().toString();
    +   return new StringBuilder(passwd)
    +    .reverse().toString();
       }
       @UseCase(id = 49, description =
       "New passwords can't equal previously used ones")
    diff --git a/annotations/StackLStringTest.java b/annotations/StackLStringTest.java
    index 4dc69fc68..f6d9911b9 100644
    --- a/annotations/StackLStringTest.java
    +++ b/annotations/StackLStringTest.java
    @@ -9,7 +9,8 @@
     import onjava.atunit.*;
     import onjava.*;
     
    -public class StackLStringTest extends StackL {
    +public class
    +StackLStringTest extends StackL {
       @Test void tPush() {
         push("one");
         assert top().equals("one");
    diff --git a/arrays/ArrayOptions.java b/arrays/ArrayOptions.java
    index 26ffd433c..0aaa85d53 100644
    --- a/arrays/ArrayOptions.java
    +++ b/arrays/ArrayOptions.java
    @@ -9,7 +9,7 @@
     public class ArrayOptions {
       public static void main(String[] args) {
         // Arrays of objects:
    -    BerylliumSphere[] a; // Local uninitialized variable
    +    BerylliumSphere[] a; // Uninitialized local
         BerylliumSphere[] b = new BerylliumSphere[5];
     
         // The references inside the array are
    diff --git a/arrays/CollectionComparison.java b/arrays/CollectionComparison.java
    index f747fdafd..108faed91 100644
    --- a/arrays/CollectionComparison.java
    +++ b/arrays/CollectionComparison.java
    @@ -10,12 +10,15 @@ class BerylliumSphere {
       private static long counter;
       private final long id = counter++;
       @Override
    -  public String toString() { return "Sphere " + id; }
    +  public String toString() {
    +    return "Sphere " + id;
    +  }
     }
     
     public class CollectionComparison {
       public static void main(String[] args) {
    -    BerylliumSphere[] spheres = new BerylliumSphere[10];
    +    BerylliumSphere[] spheres =
    +      new BerylliumSphere[10];
         for(int i = 0; i < 5; i++)
           spheres[i] = new BerylliumSphere();
         show(spheres);
    diff --git a/arrays/TestCount.java b/arrays/TestCount.java
    index 806b8a33a..9f1b137f2 100644
    --- a/arrays/TestCount.java
    +++ b/arrays/TestCount.java
    @@ -20,7 +20,8 @@ public static void main(String[] args) {
         show(a1);
         a1 = new Count.Boolean().array(SZ + 2);
         show(a1);
    -    boolean[] a1b = new Count.Pboolean().array(SZ + 3);
    +    boolean[] a1b =
    +      new Count.Pboolean().array(SZ + 3);
         show(a1b);
     
         System.out.println("Byte");
    @@ -63,8 +64,9 @@ public static void main(String[] args) {
         int[] a5 = new int[SZ];
         Arrays.setAll(a5, new Count.Integer()::get);
         show(a5);
    -    Integer[] a5b = Stream.generate(new Count.Integer())
    -      .limit(SZ + 1).toArray(Integer[]::new);
    +    Integer[] a5b =
    +      Stream.generate(new Count.Integer())
    +        .limit(SZ + 1).toArray(Integer[]::new);
         show(a5b);
         a5b = new Count.Integer().array(SZ + 2);
         show(a5b);
    @@ -105,8 +107,9 @@ public static void main(String[] args) {
         double[] a8 = new double[SZ];
         Arrays.setAll(a8, new Count.Double()::get);
         show(a8);
    -    Double[] a8b = Stream.generate(new Count.Double())
    -      .limit(SZ + 1).toArray(Double[]::new);
    +    Double[] a8b =
    +      Stream.generate(new Count.Double())
    +        .limit(SZ + 1).toArray(Double[]::new);
         show(a8b);
         a8b = new Count.Double().array(SZ + 2);
         show(a8b);
    diff --git a/arrays/TestRand.java b/arrays/TestRand.java
    index 85bc15d56..26da84b45 100644
    --- a/arrays/TestRand.java
    +++ b/arrays/TestRand.java
    @@ -20,7 +20,8 @@ public static void main(String[] args) {
         show(a1);
         a1 = new Rand.Boolean().array(SZ + 2);
         show(a1);
    -    boolean[] a1b = new Rand.Pboolean().array(SZ + 3);
    +    boolean[] a1b =
    +      new Rand.Pboolean().array(SZ + 3);
         show(a1b);
     
         System.out.println("Byte");
    @@ -63,8 +64,9 @@ public static void main(String[] args) {
         int[] a5 = new int[SZ];
         Arrays.setAll(a5, new Rand.Integer()::get);
         show(a5);
    -    Integer[] a5b = Stream.generate(new Rand.Integer())
    -      .limit(SZ + 1).toArray(Integer[]::new);
    +    Integer[] a5b =
    +      Stream.generate(new Rand.Integer())
    +        .limit(SZ + 1).toArray(Integer[]::new);
         show(a5b);
         a5b = new Rand.Integer().array(SZ + 2);
         show(a5b);
    @@ -105,8 +107,9 @@ public static void main(String[] args) {
         double[] a8 = new double[SZ];
         Arrays.setAll(a8, new Rand.Double()::get);
         show(a8);
    -    Double[] a8b = Stream.generate(new Rand.Double())
    -      .limit(SZ + 1).toArray(Double[]::new);
    +    Double[] a8b =
    +      Stream.generate(new Rand.Double())
    +        .limit(SZ + 1).toArray(Double[]::new);
         show(a8b);
         a8b = new Rand.Double().array(SZ + 2);
         show(a8b);
    diff --git a/enums/CarWash.java b/enums/CarWash.java
    index 8aec591fe..8111cb305 100644
    --- a/enums/CarWash.java
    +++ b/enums/CarWash.java
    @@ -52,13 +52,17 @@ void action() {
       }
       EnumSet cycles =
         EnumSet.of(Cycle.BASIC, Cycle.RINSE);
    -  public void add(Cycle cycle) { cycles.add(cycle); }
    +  public void add(Cycle cycle) {
    +    cycles.add(cycle);
    +  }
       public void washCar() {
         for(Cycle c : cycles)
           c.action();
       }
       @Override
    -  public String toString() { return cycles.toString(); }
    +  public String toString() {
    +    return cycles.toString();
    +  }
       public static void main(String[] args) {
         CarWash wash = new CarWash();
         System.out.println(wash);
    diff --git a/enums/ConstantSpecificMethod.java b/enums/ConstantSpecificMethod.java
    index 6154612c5..7e485e2c7 100644
    --- a/enums/ConstantSpecificMethod.java
    +++ b/enums/ConstantSpecificMethod.java
    @@ -10,7 +10,8 @@ public enum ConstantSpecificMethod {
         @Override
         String getInfo() {
           return
    -        DateFormat.getDateInstance().format(new Date());
    +        DateFormat.getDateInstance()
    +          .format(new Date());
         }
       },
       CLASSPATH {
    diff --git a/enums/EnumSets.java b/enums/EnumSets.java
    index 6f793957d..838b26991 100644
    --- a/enums/EnumSets.java
    +++ b/enums/EnumSets.java
    @@ -11,15 +11,18 @@
     public class EnumSets {
       public static void main(String[] args) {
         EnumSet points =
    -      EnumSet.noneOf(AlarmPoints.class); // Empty set
    +      EnumSet.noneOf(AlarmPoints.class); // Empty
         points.add(BATHROOM);
         System.out.println(points);
    -    points.addAll(EnumSet.of(STAIR1, STAIR2, KITCHEN));
    +    points.addAll(
    +      EnumSet.of(STAIR1, STAIR2, KITCHEN));
         System.out.println(points);
         points = EnumSet.allOf(AlarmPoints.class);
    -    points.removeAll(EnumSet.of(STAIR1, STAIR2, KITCHEN));
    +    points.removeAll(
    +      EnumSet.of(STAIR1, STAIR2, KITCHEN));
         System.out.println(points);
    -    points.removeAll(EnumSet.range(OFFICE1, OFFICE4));
    +    points.removeAll(
    +      EnumSet.range(OFFICE1, OFFICE4));
         System.out.println(points);
         points = EnumSet.complementOf(points);
         System.out.println(points);
    diff --git a/enums/Input.java b/enums/Input.java
    index 37d55d80d..e9a178d82 100644
    --- a/enums/Input.java
    +++ b/enums/Input.java
    @@ -16,16 +16,18 @@ public int amount() { // Disallow
       STOP { // This must be the last instance.
         @Override
         public int amount() { // Disallow
    -      throw new RuntimeException("SHUT_DOWN.amount()");
    +      throw new
    +        RuntimeException("SHUT_DOWN.amount()");
         }
       };
       int value; // In cents
       Input(int value) { this.value = value; }
       Input() {}
       int amount() { return value; }; // In cents
    -  static SplittableRandom rand = new SplittableRandom(47);
    +  static Random rand = new Random(47);
       public static Input randomSelection() {
         // Don't include STOP:
    -    return values()[rand.nextInt(values().length - 1)];
    +    return
    +      values()[rand.nextInt(values().length - 1)];
       }
     }
    diff --git a/enums/NotClasses.java b/enums/NotClasses.java
    index fdc5c38d8..7e0ce2876 100644
    --- a/enums/NotClasses.java
    +++ b/enums/NotClasses.java
    @@ -7,15 +7,21 @@
     enum LikeClasses {
       WINKEN {
         @Override
    -    void behavior() { System.out.println("Behavior1"); }
    +    void behavior() {
    +      System.out.println("Behavior1");
    +    }
       },
       BLINKEN {
         @Override
    -    void behavior() { System.out.println("Behavior2"); }
    +    void behavior() {
    +      System.out.println("Behavior2");
    +    }
       },
       NOD {
         @Override
    -    void behavior() { System.out.println("Behavior3"); }
    +    void behavior() {
    +      System.out.println("Behavior3");
    +    }
       };
       abstract void behavior();
     }
    diff --git a/enums/OverrideConstantSpecific.java b/enums/OverrideConstantSpecific.java
    index 759131a5a..6ea818eea 100644
    --- a/enums/OverrideConstantSpecific.java
    +++ b/enums/OverrideConstantSpecific.java
    @@ -7,9 +7,13 @@ public enum OverrideConstantSpecific {
       NUT, BOLT,
       WASHER {
         @Override
    -    void f() { System.out.println("Overridden method"); }
    +    void f() {
    +      System.out.println("Overridden method");
    +    }
       };
    -  void f() { System.out.println("default behavior"); }
    +  void f() {
    +    System.out.println("default behavior");
    +  }
       public static void main(String[] args) {
         for(OverrideConstantSpecific ocs : values()) {
           System.out.print(ocs + ": ");
    diff --git a/enums/PostOffice.java b/enums/PostOffice.java
    index ef692b19f..4d00b25e6 100644
    --- a/enums/PostOffice.java
    +++ b/enums/PostOffice.java
    @@ -7,7 +7,7 @@
     import onjava.*;
     
     class Mail {
    -  // The NO's lower the probability of random selection:
    +  // The NO's reduce probability of random selection:
       enum GeneralDelivery {YES,NO1,NO2,NO3,NO4,NO5}
       enum Scannability {UNSCANNABLE,YES1,YES2,YES3,YES4}
       enum Readability {ILLEGIBLE,YES1,YES2,YES3,YES4}
    @@ -35,10 +35,13 @@ public static Mail randomMail() {
         Mail m = new Mail();
         m.generalDelivery =
           Enums.random(GeneralDelivery.class);
    -    m.scannability = Enums.random(Scannability.class);
    -    m.readability = Enums.random(Readability.class);
    +    m.scannability =
    +      Enums.random(Scannability.class);
    +    m.readability =
    +      Enums.random(Readability.class);
         m.address = Enums.random(Address.class);
    -    m.returnAddress = Enums.random(ReturnAddress.class);
    +    m.returnAddress =
    +      Enums.random(ReturnAddress.class);
         return m;
       }
       public static
    @@ -49,9 +52,13 @@ Iterable generator(final int count) {
           public Iterator iterator() {
             return new Iterator() {
               @Override
    -          public boolean hasNext() { return n-- > 0; }
    +          public boolean hasNext() {
    +            return n-- > 0;
    +          }
               @Override
    -          public Mail next() { return randomMail(); }
    +          public Mail next() {
    +            return randomMail();
    +          }
               @Override
               public void remove() { // Not implemented
                 throw new UnsupportedOperationException();
    diff --git a/enums/Reflection.java b/enums/Reflection.java
    index b3a44ccce..479d23e75 100644
    --- a/enums/Reflection.java
    +++ b/enums/Reflection.java
    @@ -26,15 +26,18 @@ public static Set analyze(Class enumClass) {
         return methods;
       }
       public static void main(String[] args) {
    -    Set exploreMethods = analyze(Explore.class);
    +    Set exploreMethods =
    +      analyze(Explore.class);
         Set enumMethods = analyze(Enum.class);
    -    System.out.println("Explore.containsAll(Enum)? " +
    +    System.out.println(
    +      "Explore.containsAll(Enum)? " +
           exploreMethods.containsAll(enumMethods));
         System.out.print("Explore.removeAll(Enum): ");
         exploreMethods.removeAll(enumMethods);
         System.out.println(exploreMethods);
         // Decompile the code for the enum:
    -    OSExecute.command("javap -cp build/classes/main Explore");
    +    OSExecute.command(
    +      "javap -cp build/classes/main Explore");
       }
     }
     /* Output:
    diff --git a/enums/RoShamBo1.java b/enums/RoShamBo1.java
    index d49e1dc33..930958836 100644
    --- a/enums/RoShamBo1.java
    +++ b/enums/RoShamBo1.java
    @@ -62,7 +62,7 @@ public Outcome compete(Item it) {
     
     public class RoShamBo1 {
       static final int SIZE = 20;
    -  private static SplittableRandom rand = new SplittableRandom(47);
    +  private static Random rand = new Random(47);
       public static Item newItem() {
         switch(rand.nextInt(3)) {
           default:
    diff --git a/enums/SecurityCategory.java b/enums/SecurityCategory.java
    index 1b7dfa37e..f915f28f5 100644
    --- a/enums/SecurityCategory.java
    +++ b/enums/SecurityCategory.java
    @@ -6,14 +6,19 @@
     import onjava.*;
     
     enum SecurityCategory {
    -  STOCK(Security.Stock.class), BOND(Security.Bond.class);
    +  STOCK(Security.Stock.class),
    +  BOND(Security.Bond.class);
       Security[] values;
       SecurityCategory(Class kind) {
         values = kind.getEnumConstants();
       }
       interface Security {
    -    enum Stock implements Security { SHORT, LONG, MARGIN }
    -    enum Bond implements Security { MUNICIPAL, JUNK }
    +    enum Stock implements Security {
    +      SHORT, LONG, MARGIN
    +    }
    +    enum Bond implements Security {
    +      MUNICIPAL, JUNK
    +    }
       }
       public Security randomSelection() {
         return Enums.random(values);
    diff --git a/enums/SpaceShip.java b/enums/SpaceShip.java
    index 0c2ceb46e..95e23f4e5 100644
    --- a/enums/SpaceShip.java
    +++ b/enums/SpaceShip.java
    @@ -14,7 +14,8 @@ public String toString() {
         return id.charAt(0) + lower;
       }
       public static void main(String[] args) {
    -    Stream.of(values()).forEach(System.out::println);
    +    Stream.of(values())
    +      .forEach(System.out::println);
       }
     }
     /* Output:
    diff --git a/enums/VendingMachine.java b/enums/VendingMachine.java
    index d9c545091..d5d7bf4df 100644
    --- a/enums/VendingMachine.java
    +++ b/enums/VendingMachine.java
    @@ -125,7 +125,9 @@ public static void main(String[] args) {
     // For a basic sanity check:
     class RandomInputSupplier implements Supplier {
       @Override
    -  public Input get() { return Input.randomSelection(); }
    +  public Input get() {
    +    return Input.randomSelection();
    +  }
     }
     
     // Create Inputs from a file of ';'-separated strings:
    @@ -147,7 +149,8 @@ public FileInputSupplier(String fileName) {
       public Input get() {
         if(!input.hasNext())
           return null;
    -    return Enum.valueOf(Input.class, input.next().trim());
    +    return Enum.valueOf(
    +      Input.class, input.next().trim());
       }
     }
     /* Output:
    diff --git a/enums/cartoons/EnumImplementation.java b/enums/cartoons/EnumImplementation.java
    index f58a145a5..68eab3581 100644
    --- a/enums/cartoons/EnumImplementation.java
    +++ b/enums/cartoons/EnumImplementation.java
    @@ -10,8 +10,10 @@
     
     enum CartoonCharacter
     implements Supplier {
    -  SLAPPY, SPANKY, PUNCHY, SILLY, BOUNCY, NUTTY, BOB;
    -  private SplittableRandom rand = new SplittableRandom(47);
    +  SLAPPY, SPANKY, PUNCHY,
    +  SILLY, BOUNCY, NUTTY, BOB;
    +  private Random rand =
    +    new Random(47);
       @Override
       public CartoonCharacter get() {
         return values()[rand.nextInt(values().length)];
    diff --git a/files/ListOfLines.java b/files/ListOfLines.java
    index 553bed723..0e948545b 100644
    --- a/files/ListOfLines.java
    +++ b/files/ListOfLines.java
    @@ -8,15 +8,13 @@
     public class ListOfLines {
       public static void
       main(String[] args) throws Exception {
    -    List lines = Files.readAllLines(
    -      Paths.get("../streams/Cheese.dat"));
    -    for(String line : lines) {
    -      if(line.startsWith("//"))
    -        continue;
    -      System.out.println(
    -        line.substring(0, line.length()/2));
    -    }
    -
    +    Files.readAllLines(
    +      Paths.get("../streams/Cheese.dat"))
    +      .stream()
    +      .filter(line -> !line.startsWith("//"))
    +      .map(line ->
    +        line.substring(0, line.length()/2))
    +      .forEach(System.out::println);
       }
     }
     /* Output:
    diff --git a/generics/BankTeller.java b/generics/BankTeller.java
    index 125ca9bf4..c0116a6ae 100644
    --- a/generics/BankTeller.java
    +++ b/generics/BankTeller.java
    @@ -10,19 +10,26 @@ class Customer {
       private static long counter = 1;
       private final long id = counter++;
       @Override
    -  public String toString() { return "Customer " + id; }
    +  public String toString() {
    +    return "Customer " + id;
    +  }
     }
     
     class Teller {
       private static long counter = 1;
       private final long id = counter++;
       @Override
    -  public String toString() { return "Teller " + id; }
    +  public String toString() {
    +    return "Teller " + id;
    +  }
     }
     
     class Bank {
    -  private List tellers = new ArrayList<>();
    -  public void put(BankTeller bt) { tellers.add(bt); }
    +  private List tellers =
    +    new ArrayList<>();
    +  public void put(BankTeller bt) {
    +    tellers.add(bt);
    +  }
     }
     
     public class BankTeller {
    @@ -32,17 +39,20 @@ public static void serve(Teller t, Customer c) {
       public static void main(String[] args) {
         // Demonstrate create():
         RandomList tellers =
    -      Suppliers.create(RandomList::new, Teller::new, 4);
    +      Suppliers.create(
    +        RandomList::new, Teller::new, 4);
         // Demonstrate fill():
         List customers = Suppliers.fill(
           new ArrayList<>(), Customer::new, 12);
    -    customers.forEach(c -> serve(tellers.select(), c));
    +    customers.forEach(c ->
    +      serve(tellers.select(), c));
         // Demonstrate assisted latent typing:
         Bank bank = Suppliers.fill(
           new Bank(), Bank::put, BankTeller::new, 3);
         // Can also use second version of fill():
         List customers2 = Suppliers.fill(
    -      new ArrayList<>(), List::add, Customer::new, 12);
    +      new ArrayList<>(),
    +      List::add, Customer::new, 12);
       }
     }
     /* Output:
    diff --git a/generics/CRGWithBasicHolder.java b/generics/CRGWithBasicHolder.java
    index 71b5ab0d2..4db0784a3 100644
    --- a/generics/CRGWithBasicHolder.java
    +++ b/generics/CRGWithBasicHolder.java
    @@ -7,7 +7,9 @@ class Subtype extends BasicHolder {}
     
     public class CRGWithBasicHolder {
       public static void main(String[] args) {
    -    Subtype st1 = new Subtype(), st2 = new Subtype();
    +    Subtype
    +      st1 = new Subtype(),
    +      st2 = new Subtype();
         st1.set(st2);
         Subtype st3 = st1.get();
         st1.f();
    diff --git a/generics/ComparablePet.java b/generics/ComparablePet.java
    index 1e401eafb..356cc6472 100644
    --- a/generics/ComparablePet.java
    +++ b/generics/ComparablePet.java
    @@ -6,5 +6,7 @@
     public class ComparablePet
     implements Comparable {
       @Override
    -  public int compareTo(ComparablePet arg) { return 0; }
    +  public int compareTo(ComparablePet arg) {
    +    return 0;
    +  }
     }
    diff --git a/generics/CovariantReturnTypes.java b/generics/CovariantReturnTypes.java
    index 741e10615..5a1c4797e 100644
    --- a/generics/CovariantReturnTypes.java
    +++ b/generics/CovariantReturnTypes.java
    @@ -11,7 +11,7 @@ interface OrdinaryGetter {
     }
     
     interface DerivedGetter extends OrdinaryGetter {
    -  // Return type of overridden method is allowed to vary:
    +  // Overridden method return type can vary:
       @Override
       Derived get();
     }
    diff --git a/generics/GenericCast.java b/generics/GenericCast.java
    index 7ceed13d2..9c1ca2828 100644
    --- a/generics/GenericCast.java
    +++ b/generics/GenericCast.java
    @@ -2,30 +2,46 @@
     // (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
    +import java.util.*;
     import java.util.stream.*;
     
     class FixedSizeStack {
    -  private int index = 0;
    +  private final int size;
       private Object[] storage;
    +  private int index = 0;
       public FixedSizeStack(int size) {
    +    this.size = size;
         storage = new Object[size];
       }
    -  public void push(T item) { storage[index++] = item; }
    +  public void push(T item) {
    +    if(index < size)
    +      storage[index++] = item;
    +  }
       @SuppressWarnings("unchecked")
    -  public T pop() { return (T)storage[--index]; }
    +  public T pop() {
    +    return index == 0 ? null : (T)storage[--index];
    +  }
    +  @SuppressWarnings("unchecked")
    +  Stream stream() {
    +    return (Stream)Arrays.stream(storage);
    +  }
     }
     
     public class GenericCast {
    -  public static final int SIZE = 10;
    +  static String[] letters =
    +    "ABCDEFGHIJKLMNOPQRS".split("");
       public static void main(String[] args) {
         FixedSizeStack strings =
    -      new FixedSizeStack<>(SIZE);
    -    Stream.of("A B C D E F G H I J".split(" "))
    -      .forEach(s -> strings.push(s));
    -    for(int i = 0; i < SIZE; i++)
    -      System.out.print(strings.pop() + " ");
    +      new FixedSizeStack<>(letters.length);
    +    Arrays.stream("ABCDEFGHIJKLMNOPQRS".split(""))
    +      .forEach(strings::push);
    +    System.out.println(strings.pop());
    +    strings.stream()
    +      .map(s -> s + " ")
    +      .forEach(System.out::print);
       }
     }
     /* Output:
    -J I H G F E D C B A
    +S
    +A B C D E F G H I J K L M N O P Q R S
     */
    diff --git a/generics/HasF.java b/generics/HasF.java
    index 7547d7475..70f8c0606 100644
    --- a/generics/HasF.java
    +++ b/generics/HasF.java
    @@ -4,5 +4,7 @@
     // Visit http://OnJava8.com for more book information.
     
     public class HasF {
    -  public void f() { System.out.println("HasF.f()"); }
    +  public void f() {
    +    System.out.println("HasF.f()");
    +  }
     }
    diff --git a/generics/PrimitiveGenericTest.java b/generics/PrimitiveGenericTest.java
    index 931805095..6072b7e82 100644
    --- a/generics/PrimitiveGenericTest.java
    +++ b/generics/PrimitiveGenericTest.java
    @@ -9,23 +9,19 @@
     // Fill an array using a generator:
     interface FillArray {
       static  T[] fill(T[] a, Supplier gen) {
    -    for(int i = 0; i < a.length; i++)
    -      a[i] = gen.get();
    +    Arrays.setAll(a, n -> gen.get());
         return a;
       }
       static int[] fill(int[] a, IntSupplier gen) {
    -    for(int i = 0; i < a.length; i++)
    -      a[i] = gen.getAsInt();
    +    Arrays.setAll(a, n -> gen.getAsInt());
         return a;
       }
       static long[] fill(long[] a, LongSupplier gen) {
    -    for(int i = 0; i < a.length; i++)
    -      a[i] = gen.getAsLong();
    +    Arrays.setAll(a, n -> gen.getAsLong());
         return a;
       }
       static double[] fill(double[] a, DoubleSupplier gen) {
    -    for(int i = 0; i < a.length; i++)
    -      a[i] = gen.getAsDouble();
    +    Arrays.setAll(a, n -> gen.getAsDouble());
         return a;
       }
     }
    diff --git a/generics/RestrictedComparablePets.java b/generics/RestrictedComparablePets.java
    index 3deed6317..a9e9ad742 100644
    --- a/generics/RestrictedComparablePets.java
    +++ b/generics/RestrictedComparablePets.java
    @@ -5,11 +5,15 @@
     
     class Hamster extends ComparablePet
     implements Comparable {
    -  public int compareTo(ComparablePet arg) { return 0; }
    +  public int compareTo(ComparablePet arg) {
    +    return 0;
    +  }
     }
     
     // Or just:
     
     class Gecko extends ComparablePet {
    -  public int compareTo(ComparablePet arg) { return 0; }
    +  public int compareTo(ComparablePet arg) {
    +    return 0;
    +  }
     }
    diff --git a/network/SimpleClient2.java b/network/SimpleClient2.java
    index ec5a68db6..b6a990dc6 100644
    --- a/network/SimpleClient2.java
    +++ b/network/SimpleClient2.java
    @@ -35,7 +35,7 @@ public void run() {
                   // Enable auto-flush:
                   socket.getOutputStream())), true)
         ) {
    -      for (int i = 0; i < 25; i++) {
    +      for(int i = 0; i < 25; i++) {
             out.println("Client " + id + ": " + i);
             String str = in.readLine();
             System.out.println(str);
    diff --git a/onjava/Count.java b/onjava/Count.java
    index 2b71ac9dc..f8c326494 100644
    --- a/onjava/Count.java
    +++ b/onjava/Count.java
    @@ -17,7 +17,9 @@ public java.lang.Boolean get() {
           b = !b;
           return java.lang.Boolean.valueOf(b);
         }
    -    public java.lang.Boolean get(int n) { return get(); }
    +    public java.lang.Boolean get(int n) {
    +      return get();
    +    }
         public java.lang.Boolean[] array(int sz) {
           java.lang.Boolean[] result =
             new java.lang.Boolean[sz];
    @@ -41,9 +43,12 @@ public static class Byte
         private byte b;
         @Override
         public java.lang.Byte get() { return b++; }
    -    public java.lang.Byte get(int n) { return get(); }
    +    public java.lang.Byte get(int n) {
    +      return get();
    +    }
         public java.lang.Byte[] array(int sz) {
    -      java.lang.Byte[] result = new java.lang.Byte[sz];
    +      java.lang.Byte[] result =
    +        new java.lang.Byte[sz];
           Arrays.setAll(result, n -> get());
           return result;
         }
    @@ -92,9 +97,12 @@ public static class Short
         short s;
         @Override
         public java.lang.Short get() { return s++; }
    -    public java.lang.Short get(int n) { return get(); }
    +    public java.lang.Short get(int n) {
    +      return get();
    +    }
         public java.lang.Short[] array(int sz) {
    -      java.lang.Short[] result = new java.lang.Short[sz];
    +      java.lang.Short[] result =
    +        new java.lang.Short[sz];
           Arrays.setAll(result, n -> get());
           return result;
         }
    @@ -112,7 +120,9 @@ public static class Integer
         int i;
         @Override
         public java.lang.Integer get() { return i++; }
    -    public java.lang.Integer get(int n) { return get(); }
    +    public java.lang.Integer get(int n) {
    +      return get();
    +    }
         public java.lang.Integer[] array(int sz) {
           java.lang.Integer[] result =
             new java.lang.Integer[sz];
    @@ -135,14 +145,18 @@ public static class Long
         private long l;
         @Override
         public java.lang.Long get() { return l++; }
    -    public java.lang.Long get(int n) { return get(); }
    +    public java.lang.Long get(int n) {
    +      return get();
    +    }
         public java.lang.Long[] array(int sz) {
    -      java.lang.Long[] result = new java.lang.Long[sz];
    +      java.lang.Long[] result =
    +        new java.lang.Long[sz];
           Arrays.setAll(result, n -> get());
           return result;
         }
       }
    -  public static class Plong implements LongSupplier {
    +  public static
    +  class Plong implements LongSupplier {
         private long l;
         public long get() { return l++; }
         public long get(int n) { return get(); }
    @@ -159,9 +173,12 @@ public class Float
         public java.lang.Float get() {
           return java.lang.Float.valueOf(i++);
         }
    -    public java.lang.Float get(int n) { return get(); }
    +    public java.lang.Float get(int n) {
    +      return get();
    +    }
         public java.lang.Float[] array(int sz) {
    -      java.lang.Float[] result = new java.lang.Float[sz];
    +      java.lang.Float[] result =
    +        new java.lang.Float[sz];
           Arrays.setAll(result, n -> get());
           return result;
         }
    @@ -181,7 +198,9 @@ public class Double
         public java.lang.Double get() {
           return java.lang.Double.valueOf(i++);
         }
    -    public java.lang.Double get(int n) { return get(); }
    +    public java.lang.Double get(int n) {
    +      return get();
    +    }
         public java.lang.Double[] array(int sz) {
           java.lang.Double[] result =
             new java.lang.Double[sz];
    diff --git a/onjava/Enums.java b/onjava/Enums.java
    index 9c9308b92..f7df73a2e 100644
    --- a/onjava/Enums.java
    +++ b/onjava/Enums.java
    @@ -6,7 +6,7 @@
     import java.util.*;
     
     public class Enums {
    -  private static SplittableRandom rand = new SplittableRandom(47);
    +  private static Random rand = new Random(47);
       public static
       > T random(Class ec) {
         return random(ec.getEnumConstants());
    diff --git a/onjava/Rand.java b/onjava/Rand.java
    index 1c3525d8d..79d42ce69 100644
    --- a/onjava/Rand.java
    +++ b/onjava/Rand.java
    @@ -39,9 +39,12 @@ public static class Byte
         public java.lang.Byte get() {
           return (byte)r.nextInt(MOD);
         }
    -    public java.lang.Byte get(int n) { return get(); }
    +    public java.lang.Byte get(int n) {
    +      return get();
    +    }
         public java.lang.Byte[] array(int sz) {
    -      java.lang.Byte[] result = new java.lang.Byte[sz];
    +      java.lang.Byte[] result =
    +        new java.lang.Byte[sz];
           Arrays.setAll(result, n -> get());
           return result;
         }
    @@ -80,9 +83,12 @@ public static class Short
         public java.lang.Short get() {
           return (short)r.nextInt(MOD);
         }
    -    public java.lang.Short get(int n) { return get(); }
    +    public java.lang.Short get(int n) {
    +      return get();
    +    }
         public java.lang.Short[] array(int sz) {
    -      java.lang.Short[] result = new java.lang.Short[sz];
    +      java.lang.Short[] result =
    +        new java.lang.Short[sz];
           Arrays.setAll(result, n -> get());
           return result;
         }
    @@ -99,7 +105,9 @@ public static class Integer
         public java.lang.Integer get() {
           return r.nextInt(MOD);
         }
    -    public java.lang.Integer get(int n) { return get(); }
    +    public java.lang.Integer get(int n) {
    +      return get();
    +    }
         public java.lang.Integer[] array(int sz) {
           int[] primitive = new Pint().array(sz);
           java.lang.Integer[] result =
    @@ -112,7 +120,9 @@ public java.lang.Integer[] array(int sz) {
       public static class Pint implements IntSupplier {
         SplittableRandom r = new SplittableRandom(47);
         @Override
    -    public int getAsInt() { return r.nextInt(MOD); }
    +    public int getAsInt() {
    +      return r.nextInt(MOD);
    +    }
         public int get(int n) { return getAsInt(); }
         public int[] array(int sz) {
           return r.ints(sz, 0, MOD).toArray();
    @@ -125,16 +135,20 @@ public static class Long
         public java.lang.Long get() {
           return r.nextLong(MOD);
         }
    -    public java.lang.Long get(int n) { return get(); }
    +    public java.lang.Long get(int n) {
    +      return get();
    +    }
         public java.lang.Long[] array(int sz) {
           long[] primitive = new Plong().array(sz);
    -      java.lang.Long[] result = new java.lang.Long[sz];
    +      java.lang.Long[] result =
    +        new java.lang.Long[sz];
           for(int i = 0; i < sz; i++)
             result[i] = primitive[i];
           return result;
         }
       }
    -  public static class Plong implements LongSupplier {
    +  public static
    +  class Plong implements LongSupplier {
         SplittableRandom r = new SplittableRandom(47);
         @Override
         public long getAsLong() {
    @@ -152,9 +166,12 @@ public static class Float
         public java.lang.Float get() {
           return (float)trim(r.nextDouble());
         }
    -    public java.lang.Float get(int n) { return get(); }
    +    public java.lang.Float get(int n) {
    +      return get();
    +    }
         public java.lang.Float[] array(int sz) {
    -      java.lang.Float[] result = new java.lang.Float[sz];
    +      java.lang.Float[] result =
    +        new java.lang.Float[sz];
           Arrays.setAll(result, n -> get());
           return result;
         }
    @@ -165,7 +182,8 @@ public float[] array(int sz) {
         }
       }
       static double trim(double d) {
    -    return ((double)Math.round(d * 1000.0)) / 100.0;
    +    return
    +      ((double)Math.round(d * 1000.0)) / 100.0;
       }
       public static class Double
       implements Supplier {
    @@ -174,9 +192,12 @@ public static class Double
         public java.lang.Double get() {
           return trim(r.nextDouble());
         }
    -    public java.lang.Double get(int n) { return get(); }
    +    public java.lang.Double get(int n) {
    +      return get();
    +    }
         public java.lang.Double[] array(int sz) {
    -      double[] primitive = new Rand.Pdouble().array(sz);
    +      double[] primitive =
    +        new Rand.Pdouble().array(sz);
           java.lang.Double[] result =
             new java.lang.Double[sz];
           for(int i = 0; i < sz; i++)
    @@ -184,13 +205,16 @@ public java.lang.Double[] array(int sz) {
           return result;
         }
       }
    -  public static class Pdouble implements DoubleSupplier {
    +  public static
    +  class Pdouble implements DoubleSupplier {
         SplittableRandom r = new SplittableRandom(47);
         @Override
         public double getAsDouble() {
           return trim(r.nextDouble());
         }
    -    public double get(int n) { return getAsDouble(); }
    +    public double get(int n) {
    +      return getAsDouble();
    +    }
         public double[] array(int sz) {
           double[] result = r.doubles(sz).toArray();
           Arrays.setAll(result,
    @@ -201,7 +225,7 @@ public double[] array(int sz) {
       public static class String
       implements Supplier {
         SplittableRandom r = new SplittableRandom(47);
    -    private int strlen = 7; // Default string length
    +    private int strlen = 7; // Default length
         public String() {}
         public String(int strLength) {
           strlen = strLength;
    @@ -213,7 +237,9 @@ public java.lang.String get() {
                      StringBuilder::appendCodePoint,
                      StringBuilder::append).toString();
         }
    -    public java.lang.String get(int n) { return get(); }
    +    public java.lang.String get(int n) {
    +      return get();
    +    }
         public java.lang.String[] array(int sz) {
           java.lang.String[] result =
             new java.lang.String[sz];
    diff --git a/onjava/TypeCounter.java b/onjava/TypeCounter.java
    index e14d7891c..9c0fae021 100644
    --- a/onjava/TypeCounter.java
    +++ b/onjava/TypeCounter.java
    @@ -5,6 +5,7 @@
     // Counts instances of a type family
     package onjava;
     import java.util.*;
    +import java.util.stream.*;
     
     public class
     TypeCounter extends HashMap, Integer> {
    @@ -30,15 +31,11 @@ private void countClass(Class type) {
       }
       @Override
       public String toString() {
    -    StringBuilder result = new StringBuilder("{");
    -    for(Map.Entry, Integer> pair : entrySet()) {
    -      result.append(pair.getKey().getSimpleName());
    -      result.append("=");
    -      result.append(pair.getValue());
    -      result.append(", ");
    -    }
    -    result.delete(result.length() - 2, result.length());
    -    result.append("}");
    -    return result.toString();
    +    String result = entrySet().stream()
    +      .map(pair -> String.format("%s=%s",
    +        pair.getKey().getSimpleName(),
    +        pair.getValue()))
    +      .collect(Collectors.joining(", "));
    +    return "{" + result + "}";
       }
     }
    diff --git a/patterns/doubledispatch/Aluminum.java b/patterns/doubledispatch/Aluminum.java
    index 09621f09d..b17f1d91f 100644
    --- a/patterns/doubledispatch/Aluminum.java
    +++ b/patterns/doubledispatch/Aluminum.java
    @@ -12,6 +12,7 @@ public class Aluminum extends patterns.trash.Aluminum
       public Aluminum(double wt) { super(wt); }
       @Override
       public boolean addToBin(List tbins) {
    -    return tbins.stream().anyMatch(tb -> tb.add(this));
    +    return tbins.stream()
    +      .anyMatch(tb -> tb.add(this));
       }
     }
    diff --git a/patterns/doubledispatch/Cardboard.java b/patterns/doubledispatch/Cardboard.java
    index f0b2591d4..c5e9d382d 100644
    --- a/patterns/doubledispatch/Cardboard.java
    +++ b/patterns/doubledispatch/Cardboard.java
    @@ -12,6 +12,7 @@ public class Cardboard extends patterns.trash.Cardboard
       public Cardboard(double wt) { super(wt); }
       @Override
       public boolean addToBin(List tbins) {
    -    return tbins.stream().anyMatch(tb -> tb.add(this));
    +    return tbins.stream()
    +      .anyMatch(tb -> tb.add(this));
       }
     }
    diff --git a/patterns/doubledispatch/DoubleDispatch.java b/patterns/doubledispatch/DoubleDispatch.java
    index 90f6b9c49..4b82310a2 100644
    --- a/patterns/doubledispatch/DoubleDispatch.java
    +++ b/patterns/doubledispatch/DoubleDispatch.java
    @@ -65,7 +65,8 @@ public static void main(String[] args) {
         // individually-typed bins:
         bins.sortIntoBins(bin);
         // Perform sumValue for each bin...
    -    bins.binSet().forEach(tb -> Trash.sumValue(tb.v));
    +    bins.binSet()
    +      .forEach(tb -> Trash.sumValue(tb.v));
         // ... and for the master bin
         Trash.sumValue(bin);
       }
    diff --git a/patterns/doubledispatch/Glass.java b/patterns/doubledispatch/Glass.java
    index fc8474969..2f26540a0 100644
    --- a/patterns/doubledispatch/Glass.java
    +++ b/patterns/doubledispatch/Glass.java
    @@ -12,6 +12,7 @@ public class Glass extends patterns.trash.Glass
       public Glass(double wt) { super(wt); }
       @Override
       public boolean addToBin(List tbins) {
    -    return tbins.stream().anyMatch(tb -> tb.add(this));
    +    return tbins.stream()
    +      .anyMatch(tb -> tb.add(this));
       }
     }
    diff --git a/patterns/doubledispatch/Paper.java b/patterns/doubledispatch/Paper.java
    index 0be35588b..47eea3171 100644
    --- a/patterns/doubledispatch/Paper.java
    +++ b/patterns/doubledispatch/Paper.java
    @@ -12,6 +12,7 @@ public class Paper extends patterns.trash.Paper
       public Paper(double wt) { super(wt); }
       @Override
       public boolean addToBin(List tbins) {
    -    return tbins.stream().anyMatch(tb -> tb.add(this));
    +    return tbins.stream()
    +      .anyMatch(tb -> tb.add(this));
       }
     }
    diff --git a/patterns/doubledispatch/TypedBin.java b/patterns/doubledispatch/TypedBin.java
    index 7529745f8..72c84e4c5 100644
    --- a/patterns/doubledispatch/TypedBin.java
    +++ b/patterns/doubledispatch/TypedBin.java
    @@ -7,7 +7,7 @@
     import patterns.trash.*;
     import java.util.*;
     
    -public abstract class TypedBin {
    +public class TypedBin {
       List v = new ArrayList<>();
       protected boolean addIt(Trash t) {
         v.add(t);
    diff --git a/patterns/recyclec/RecycleC.java b/patterns/recyclec/RecycleC.java
    index 93ad664b8..abdc25d56 100644
    --- a/patterns/recyclec/RecycleC.java
    +++ b/patterns/recyclec/RecycleC.java
    @@ -26,14 +26,14 @@ boolean grab(Trash t) {
     }
     
     class TbinList
    -extends ArrayList> { // [*1*]
    +extends ArrayList> { // [1]
       boolean sort(T t) {
         for(Tbin ts : this)
           if(ts.grab(t))
             return true;
         return false; // bin not found for t
       }
    -  void sortBin(Tbin bin) { // [*2*]
    +  void sortBin(Tbin bin) { // [2]
         for(T aBin : bin)
           if(!sort(aBin))
             System.err.println("Bin not found");
    @@ -53,7 +53,7 @@ public static void main(String[] args) {
         // add one line here: [*3*]
         trashBins.add(new Tbin<>(Cardboard.class));
     
    -    trashBins.sortBin(bin); // [*4*]
    +    trashBins.sortBin(bin); // [4]
     
         trashBins.forEach(Trash::sumValue);
         Trash.sumValue(bin);
    diff --git a/streams/SpecialCollector.java b/streams/SpecialCollector.java
    index af0460bc1..9261ba0c5 100644
    --- a/streams/SpecialCollector.java
    +++ b/streams/SpecialCollector.java
    @@ -13,9 +13,9 @@ public class SpecialCollector {
             .collect(ArrayList::new,
                      ArrayList::add,
                      ArrayList::addAll);
    -    for(String s : words)
    -      if(s.equals("cheese"))
    -        System.out.println(s);
    +    words.stream()
    +      .filter(s -> s.equals("cheese"))
    +      .forEach(System.out::println);
       }
     }
     /* Output:
    diff --git a/strings/Finding.java b/strings/Finding.java
    index 8acefbfc9..001e304d8 100644
    --- a/strings/Finding.java
    +++ b/strings/Finding.java
    @@ -7,7 +7,8 @@
     public class Finding {
       public static void main(String[] args) {
         Matcher m = Pattern.compile("\\w+")
    -      .matcher("Evening is full of the linnet's wings");
    +      .matcher(
    +        "Evening is full of the linnet's wings");
         while(m.find())
           System.out.print(m.group() + " ");
         System.out.println();
    diff --git a/onjava/Hex.java b/strings/Hex.java
    similarity index 98%
    rename from onjava/Hex.java
    rename to strings/Hex.java
    index b3482d3a3..9257d87f5 100644
    --- a/onjava/Hex.java
    +++ b/strings/Hex.java
    @@ -1,4 +1,4 @@
    -// onjava/Hex.java
    +// strings/Hex.java
     // (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
    diff --git a/strings/UsingStringBuilder.java b/strings/UsingStringBuilder.java
    index 43cc3ff0c..b7002a72e 100644
    --- a/strings/UsingStringBuilder.java
    +++ b/strings/UsingStringBuilder.java
    @@ -3,11 +3,11 @@
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    +import java.util.stream.*;
     
     public class UsingStringBuilder {
    -  public static Random rand = new Random(47);
    -  @Override
    -  public String toString() {
    +  public static String string1() {
    +    Random rand = new Random(47);
         StringBuilder result = new StringBuilder("[");
         for(int i = 0; i < 25; i++) {
           result.append(rand.nextInt(100));
    @@ -17,12 +17,21 @@ public String toString() {
         result.append("]");
         return result.toString();
       }
    +  public static String string2() {
    +    String result = new Random(47)
    +      .ints(25, 0, 100)
    +      .mapToObj(Integer::toString)
    +      .collect(Collectors.joining(", "));
    +    return "[" + result + "]";
    +  }
       public static void main(String[] args) {
    -    UsingStringBuilder usb = new UsingStringBuilder();
    -    System.out.println(usb);
    +    System.out.println(string1());
    +    System.out.println(string2());
       }
     }
     /* Output:
     [58, 55, 93, 61, 61, 29, 68, 0, 22, 7, 88, 28, 51, 89, 9,
     78, 98, 61, 20, 58, 16, 40, 11, 22, 4]
    +[58, 55, 93, 61, 61, 29, 68, 0, 22, 7, 88, 28, 51, 89, 9,
    +78, 98, 61, 20, 58, 16, 40, 11, 22, 4]
     */
    diff --git a/typeinfo/ModifyingPrivateFields.java b/typeinfo/ModifyingPrivateFields.java
    index 00cfc838a..5f1baf11c 100644
    --- a/typeinfo/ModifyingPrivateFields.java
    +++ b/typeinfo/ModifyingPrivateFields.java
    @@ -22,7 +22,8 @@ public class ModifyingPrivateFields {
         System.out.println(pf);
         Field f = pf.getClass().getDeclaredField("i");
         f.setAccessible(true);
    -    System.out.println("f.getInt(pf): " + f.getInt(pf));
    +    System.out.println(
    +      "f.getInt(pf): " + f.getInt(pf));
         f.setInt(pf, 47);
         System.out.println(pf);
         f = pf.getClass().getDeclaredField("s");
    diff --git a/typeinfo/PetCount3.java b/typeinfo/PetCount3.java
    index af028ccd8..803f2b925 100644
    --- a/typeinfo/PetCount3.java
    +++ b/typeinfo/PetCount3.java
    @@ -9,8 +9,8 @@
     import typeinfo.pets.*;
     
     public class PetCount3 {
    -  static class Counter
    -  extends LinkedHashMap, Integer> {
    +  static class Counter extends
    +  LinkedHashMap, Integer> {
         public Counter() {
           super(LiteralPetCreator.ALL_TYPES.stream()
             .map(lpc -> Pair.make(lpc, 0))
    @@ -19,24 +19,19 @@ public Counter() {
         }
         public void count(Pet pet) {
           // Class.isInstance() eliminates instanceofs:
    -      for(Map.Entry, Integer>
    -        pair : entrySet())
    -        if(pair.getKey().isInstance(pet))
    -          put(pair.getKey(), pair.getValue() + 1);
    +      entrySet().stream()
    +        .filter(pair -> pair.getKey().isInstance(pet))
    +        .forEach(pair ->
    +          put(pair.getKey(), pair.getValue() + 1));
         }
         @Override
         public String toString() {
    -      StringBuilder result = new StringBuilder("{");
    -      for(Map.Entry, Integer>
    -          pair : entrySet()) {
    -        result.append(pair.getKey().getSimpleName());
    -        result.append("=");
    -        result.append(pair.getValue());
    -        result.append(", ");
    -      }
    -      result.delete(result.length() - 2, result.length());
    -      result.append("}");
    -      return result.toString();
    +      String result = entrySet().stream()
    +        .map(pair -> String.format("%s=%s",
    +          pair.getKey().getSimpleName(),
    +          pair.getValue()))
    +        .collect(Collectors.joining(", "));
    +      return "{" + result + "}";
         }
       }
       public static void main(String[] args) {
    diff --git a/typeinfo/Position.java b/typeinfo/Position.java
    index 15a1c5632..c1bfaf81f 100644
    --- a/typeinfo/Position.java
    +++ b/typeinfo/Position.java
    @@ -25,12 +25,13 @@ public void setTitle(String newTitle) {
       public Person getPerson() { return person; }
       public void setPerson(Person newPerson) {
         // Uses empty Person if newPerson is null:
    -    person =
    -      Optional.ofNullable(newPerson).orElse(new Person());
    +    person = Optional.ofNullable(newPerson)
    +      .orElse(new Person());
       }
       @Override
       public String toString() {
    -    return "Position: " + title + ", Employee: " + person;
    +    return "Position: " + title +
    +      ", Employee: " + person;
       }
       public static void main(String[] args) {
         System.out.println(new Position("CEO"));
    diff --git a/typeinfo/SelectingMethods.java b/typeinfo/SelectingMethods.java
    index fa9061ce7..918df79ba 100644
    --- a/typeinfo/SelectingMethods.java
    +++ b/typeinfo/SelectingMethods.java
    @@ -30,15 +30,21 @@ interface SomeMethods {
     
     class Implementation implements SomeMethods {
       @Override
    -  public void boring1() { System.out.println("boring1"); }
    +  public void boring1() {
    +    System.out.println("boring1");
    +  }
       @Override
    -  public void boring2() { System.out.println("boring2"); }
    +  public void boring2() {
    +    System.out.println("boring2");
    +  }
       @Override
       public void interesting(String arg) {
         System.out.println("interesting " + arg);
       }
       @Override
    -  public void boring3() { System.out.println("boring3"); }
    +  public void boring3() {
    +    System.out.println("boring3");
    +  }
     }
     
     class SelectingMethods {
    
    From ad33d2247fa105945f3c54d398f66742f86689f8 Mon Sep 17 00:00:00 2001
    From: Bruce Eckel 
    Date: Sat, 21 Jan 2017 11:39:19 -0800
    Subject: [PATCH 218/320] Code review/streamification
    
    ---
     references/AddingClone.java           | 15 ++++++++-------
     references/CloneArrayList.java        | 11 ++++++-----
     references/CopyConstructor.java       |  2 +-
     references/ImmutableInteger.java      | 11 ++++++++---
     references/MutableInteger.java        | 10 +++++-----
     references/SimplerMutableInteger.java | 18 +++++++++---------
     references/Snake.java                 |  3 ++-
     7 files changed, 39 insertions(+), 31 deletions(-)
    
    diff --git a/references/AddingClone.java b/references/AddingClone.java
    index f0fab39df..d9972c950 100644
    --- a/references/AddingClone.java
    +++ b/references/AddingClone.java
    @@ -5,6 +5,7 @@
     // You must go through a few gyrations
     // to add cloning to your own class
     import java.util.*;
    +import java.util.stream.*;
     
     class Int2 implements Cloneable {
       private int i;
    @@ -41,18 +42,18 @@ public static void main(String[] args) {
         // Anything inherited is also cloneable:
         Int3 x3 = new Int3(7);
         x3 = (Int3)x3.clone();
    -    ArrayList v = new ArrayList<>();
    -    for(int i = 0; i < 10; i++ )
    -      v.add(new Int2(i));
    +    ArrayList v = IntStream.range(0, 10)
    +      .mapToObj(Int2::new)
    +      .collect(Collectors
    +        .toCollection(ArrayList::new));
         System.out.println("v: " + v);
         ArrayList v2 =
           (ArrayList)v.clone();
         // Now clone each element:
    -    for(int i = 0; i < v.size(); i++)
    -      v2.set(i, v2.get(i).clone());
    +    IntStream.range(0, v.size())
    +      .forEach(i -> v2.set(i, v.get(i).clone()));
         // Increment all v2's elements:
    -    for(Int2 i2 : v2)
    -      i2.increment();
    +    v2.forEach(Int2::increment);
         System.out.println("v2: " + v2);
         // See if it changed v's elements:
         System.out.println("v: " + v);
    diff --git a/references/CloneArrayList.java b/references/CloneArrayList.java
    index 9dbe7f4cd..5135a3734 100644
    --- a/references/CloneArrayList.java
    +++ b/references/CloneArrayList.java
    @@ -5,6 +5,7 @@
     // The clone() operation works for only a few
     // items in the standard Java library
     import java.util.*;
    +import java.util.stream.*;
     
     class Int {
       private int i;
    @@ -18,15 +19,15 @@ public String toString() {
     
     public class CloneArrayList {
       public static void main(String[] args) {
    -    ArrayList v = new ArrayList<>();
    -    for(int i = 0; i < 10; i++)
    -      v.add(new Int(i));
    +    ArrayList v = IntStream.range(0, 10)
    +      .mapToObj(Int::new)
    +      .collect(Collectors
    +        .toCollection(ArrayList::new));
         System.out.println("v: " + v);
         @SuppressWarnings("unchecked")
         ArrayList v2 = (ArrayList)v.clone();
         // Increment all v2's elements:
    -    for(Int e : v2)
    -      e.increment();
    +    v2.forEach(Int::increment);
         // See if it changed v's elements:
         System.out.println("v: " + v);
       }
    diff --git a/references/CopyConstructor.java b/references/CopyConstructor.java
    index f65287380..edaeefd20 100644
    --- a/references/CopyConstructor.java
    +++ b/references/CopyConstructor.java
    @@ -117,7 +117,7 @@ public static void ripen(Tomato t) {
           t.getClass().getName());
       }
       public static void slice(Fruit f) {
    -    f = new Fruit(f); // Hmmm... will this work? (2)
    +    f = new Fruit(f); // [2] Hmmm... will this work?
         System.out.println("In slice, f is a " +
           f.getClass().getName());
       }
    diff --git a/references/ImmutableInteger.java b/references/ImmutableInteger.java
    index 06243267f..3dc86a28a 100644
    --- a/references/ImmutableInteger.java
    +++ b/references/ImmutableInteger.java
    @@ -4,13 +4,18 @@
     // Visit http://OnJava8.com for more book information.
     // The Integer class cannot be changed
     import java.util.*;
    +import java.util.stream.*;
     
     public class ImmutableInteger {
       public static void main(String[] args) {
    -    List v = new ArrayList<>();
    -    for(int i = 0; i < 10; i++)
    -      v.add(Integer.valueOf(i));
    +    List v = IntStream.range(0, 10)
    +      .mapToObj(Integer::new)
    +      .collect(Collectors.toList());
    +    System.out.println(v);
         // But how do you change the int
         // inside the Integer?
       }
     }
    +/* Output:
    +[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    +*/
    diff --git a/references/MutableInteger.java b/references/MutableInteger.java
    index 8958af5e3..30c99e0c9 100644
    --- a/references/MutableInteger.java
    +++ b/references/MutableInteger.java
    @@ -4,6 +4,7 @@
     // Visit http://OnJava8.com for more book information.
     // A changeable wrapper class
     import java.util.*;
    +import java.util.stream.*;
     
     class IntValue {
       private int n;
    @@ -19,12 +20,11 @@ public String toString() {
     
     public class MutableInteger {
       public static void main(String[] args) {
    -    List v = new ArrayList<>();
    -    for(int i = 0; i < 10; i++)
    -      v.add(new IntValue(i));
    +    List v = IntStream.range(0, 10)
    +      .mapToObj(IntValue::new)
    +      .collect(Collectors.toList());
         System.out.println(v);
    -    for(int i = 0; i < v.size(); i++)
    -      v.get(i).increment();
    +    v.forEach(IntValue::increment);
         System.out.println(v);
       }
     }
    diff --git a/references/SimplerMutableInteger.java b/references/SimplerMutableInteger.java
    index 3db01005f..e0f7d24c6 100644
    --- a/references/SimplerMutableInteger.java
    +++ b/references/SimplerMutableInteger.java
    @@ -4,6 +4,7 @@
     // Visit http://OnJava8.com for more book information.
     // A trivial wrapper class
     import java.util.*;
    +import java.util.stream.*;
     
     class IntValue2 {
       public int n;
    @@ -12,16 +13,15 @@ class IntValue2 {
     
     public class SimplerMutableInteger {
       public static void main(String[] args) {
    -    List v = new ArrayList<>();
    -    for(int i = 0; i < 10; i++)
    -      v.add(new IntValue2(i));
    -    for(IntValue2 i : v)
    -      System.out.print(i.n + " ");
    +    List v = IntStream.range(0, 10)
    +      .mapToObj(IntValue2::new)
    +      .collect(Collectors.toList());
    +    v.forEach(iv2 ->
    +      System.out.print(iv2.n + " "));
         System.out.println();
    -    for(int i = 0; i < v.size(); i++)
    -      v.get(i).n = v.get(i).n + 1;
    -    for(IntValue2 i : v)
    -      System.out.print(i.n + " ");
    +    v.forEach(iv2 -> iv2.n += 1);
    +    v.forEach(iv2 ->
    +      System.out.print(iv2.n + " "));
       }
     }
     /* Output:
    diff --git a/references/Snake.java b/references/Snake.java
    index 199d1d8f3..624855490 100644
    --- a/references/Snake.java
    +++ b/references/Snake.java
    @@ -40,7 +40,8 @@ public static void main(String[] args) {
         Snake s2 = s.clone();
         System.out.println("s2 = " + s2);
         s.increment();
    -    System.out.println("after s.increment, s2 = " + s2);
    +    System.out.println(
    +      "after s.increment, s2 = " + s2);
       }
     }
     /* Output:
    
    From f7e0a748d7b0a5364c5e3cfa441788e9ea0ca144 Mon Sep 17 00:00:00 2001
    From: Bruce Eckel 
    Date: Sat, 21 Jan 2017 12:51:00 -0800
    Subject: [PATCH 219/320] Refactor/Streamify
    
    ---
     iostreams/BasicFileOutput.java          | 10 ++++------
     iostreams/BufferedInputFile.java        | 25 +++++++++++--------------
     iostreams/FileOutputShortcut.java       | 11 ++++-------
     iostreams/FormattedMemoryInput.java     |  7 ++++---
     iostreams/StoringAndRecoveringData.java |  7 +++++--
     iostreams/TestEOF.java                  |  5 +++--
     iostreams/UsingRandomAccessFile.java    | 11 ++++++++---
     7 files changed, 39 insertions(+), 37 deletions(-)
    
    diff --git a/iostreams/BasicFileOutput.java b/iostreams/BasicFileOutput.java
    index eaee98955..810bdc5ff 100644
    --- a/iostreams/BasicFileOutput.java
    +++ b/iostreams/BasicFileOutput.java
    @@ -7,8 +7,7 @@
     
     public class BasicFileOutput {
       static String file = "BasicFileOutput.dat";
    -  public static void
    -  main(String[] args) throws IOException {
    +  public static void main(String[] args) {
         try(
           BufferedReader in = new BufferedReader(
             new StringReader(
    @@ -17,10 +16,9 @@ public class BasicFileOutput {
           PrintWriter out = new PrintWriter(
             new BufferedWriter(new FileWriter(file)))
         ) {
    -      int lineCount = 1;
    -      String s;
    -      while((s = in.readLine()) != null )
    -        out.println(lineCount++ + ": " + s);
    +      in.lines().forEach(out::println);
    +    } catch(IOException e) {
    +      throw new RuntimeException(e);
         }
         // Show the stored file:
         System.out.println(BufferedInputFile.read(file));
    diff --git a/iostreams/BufferedInputFile.java b/iostreams/BufferedInputFile.java
    index cee5c3d33..ff7c0caf1 100644
    --- a/iostreams/BufferedInputFile.java
    +++ b/iostreams/BufferedInputFile.java
    @@ -4,23 +4,20 @@
     // Visit http://OnJava8.com for more book information.
     // {ValidateByHand}
     import java.io.*;
    +import java.util.stream.*;
     
     public class BufferedInputFile {
    -  public static String
    -  read(String filename) throws IOException {
    -    try(
    -      BufferedReader in = new BufferedReader(
    -        new FileReader(filename))
    -    ) {
    -      String s;
    -      StringBuilder sb = new StringBuilder();
    -      while((s = in.readLine())!= null)
    -        sb.append(s + "\n");
    -      return sb.toString();
    +  public static String read(String filename) {
    +    try(BufferedReader in = new BufferedReader(
    +      new FileReader(filename))) {
    +      return in.lines()
    +        .collect(Collectors.joining("\n"));
    +    } catch(IOException e) {
    +      throw new RuntimeException(e);
         }
       }
    -  public static void
    -  main(String[] args) throws IOException {
    -    System.out.print(read("BufferedInputFile.java"));
    +  public static void main(String[] args) {
    +    System.out.print(
    +      read("BufferedInputFile.java"));
       }
     }
    diff --git a/iostreams/FileOutputShortcut.java b/iostreams/FileOutputShortcut.java
    index 74b731841..f1d476557 100644
    --- a/iostreams/FileOutputShortcut.java
    +++ b/iostreams/FileOutputShortcut.java
    @@ -7,8 +7,7 @@
     
     public class FileOutputShortcut {
       static String file = "FileOutputShortcut.dat";
    -  public static void
    -  main(String[] args) throws IOException {
    +  public static void main(String[] args) {
         try(
           BufferedReader in = new BufferedReader(
             new StringReader(BufferedInputFile.read(
    @@ -16,12 +15,10 @@ public class FileOutputShortcut {
           // Here's the shortcut:
           PrintWriter out = new PrintWriter(file)
         ) {
    -      int lineCount = 1;
    -      String s;
    -      while((s = in.readLine()) != null )
    -        out.println(lineCount++ + ": " + s);
    +      in.lines().forEach(out::println);
    +    } catch(IOException e) {
    +      throw new RuntimeException(e);
         }
    -    // Show the stored file:
         System.out.println(BufferedInputFile.read(file));
       }
     }
    diff --git a/iostreams/FormattedMemoryInput.java b/iostreams/FormattedMemoryInput.java
    index 556383c41..4e38370c4 100644
    --- a/iostreams/FormattedMemoryInput.java
    +++ b/iostreams/FormattedMemoryInput.java
    @@ -6,8 +6,7 @@
     import java.io.*;
     
     public class FormattedMemoryInput {
    -  public static void
    -  main(String[] args) throws IOException {
    +  public static void main(String[] args) {
         try(
           DataInputStream in = new DataInputStream(
             new ByteArrayInputStream(
    @@ -18,7 +17,9 @@ public class FormattedMemoryInput {
           while(true)
             System.out.write((char)in.readByte());
         } catch(EOFException e) {
    -      System.out.println("End of stream");
    +      System.out.println("\nEnd of stream");
    +    } catch(IOException e) {
    +      throw new RuntimeException(e);
         }
       }
     }
    diff --git a/iostreams/StoringAndRecoveringData.java b/iostreams/StoringAndRecoveringData.java
    index cda8d864a..664eecc07 100644
    --- a/iostreams/StoringAndRecoveringData.java
    +++ b/iostreams/StoringAndRecoveringData.java
    @@ -5,8 +5,7 @@
     import java.io.*;
     
     public class StoringAndRecoveringData {
    -  public static void
    -  main(String[] args) throws IOException {
    +  public static void main(String[] args) {
         try(
           DataOutputStream out = new DataOutputStream(
             new BufferedOutputStream(
    @@ -16,6 +15,8 @@ public class StoringAndRecoveringData {
           out.writeUTF("That was pi");
           out.writeDouble(1.41413);
           out.writeUTF("Square root of 2");
    +    } catch(IOException e) {
    +      throw new RuntimeException(e);
         }
         try(
           DataInputStream in = new DataInputStream(
    @@ -28,6 +29,8 @@ public class StoringAndRecoveringData {
           System.out.println(in.readUTF());
           System.out.println(in.readDouble());
           System.out.println(in.readUTF());
    +    } catch(IOException e) {
    +      throw new RuntimeException(e);
         }
       }
     }
    diff --git a/iostreams/TestEOF.java b/iostreams/TestEOF.java
    index 87ff8c982..692ea4070 100644
    --- a/iostreams/TestEOF.java
    +++ b/iostreams/TestEOF.java
    @@ -7,8 +7,7 @@
     import java.io.*;
     
     public class TestEOF {
    -  public static void
    -  main(String[] args) throws IOException {
    +  public static void main(String[] args) {
         try(
           DataInputStream in = new DataInputStream(
             new BufferedInputStream(
    @@ -16,6 +15,8 @@ public class TestEOF {
         ) {
           while(in.available() != 0)
             System.out.write(in.readByte());
    +    } catch(IOException e) {
    +      throw new RuntimeException(e);
         }
       }
     }
    diff --git a/iostreams/UsingRandomAccessFile.java b/iostreams/UsingRandomAccessFile.java
    index 8ed27b99c..256db78c4 100644
    --- a/iostreams/UsingRandomAccessFile.java
    +++ b/iostreams/UsingRandomAccessFile.java
    @@ -6,7 +6,7 @@
     
     public class UsingRandomAccessFile {
       static String file = "rtest.dat";
    -  static void display() throws IOException {
    +  public static void display() {
         try(
           RandomAccessFile rf =
             new RandomAccessFile(file, "r")
    @@ -15,10 +15,11 @@ static void display() throws IOException {
             System.out.println(
               "Value " + i + ": " + rf.readDouble());
           System.out.println(rf.readUTF());
    +    } catch(IOException e) {
    +      throw new RuntimeException(e);
         }
       }
    -  public static void
    -  main(String[] args) throws IOException {
    +  public static void main(String[] args) {
         try(
           RandomAccessFile rf =
             new RandomAccessFile(file, "rw")
    @@ -28,6 +29,8 @@ static void display() throws IOException {
           rf.writeUTF("The end of the file");
           rf.close();
           display();
    +    } catch(IOException e) {
    +      throw new RuntimeException(e);
         }
         try(
           RandomAccessFile rf =
    @@ -37,6 +40,8 @@ static void display() throws IOException {
           rf.writeDouble(47.0001);
           rf.close();
           display();
    +    } catch(IOException e) {
    +      throw new RuntimeException(e);
         }
       }
     }
    
    From bf429783f9dac2821d741dbbc3ab74bee76715a1 Mon Sep 17 00:00:00 2001
    From: Bruce Eckel 
    Date: Sat, 21 Jan 2017 16:29:16 -0800
    Subject: [PATCH 220/320] Refactor/streamify/fix exceptions
    
    ---
     newio/BufferToText.java         |  25 ++++--
     newio/ChannelCopy.java          |   5 +-
     newio/FileLocking.java          |   5 +-
     newio/GetChannel.java           |  53 ++++++++++++
     newio/LargeMappedFiles.java     |   4 +-
     newio/LockingMappedFiles.java   |  11 +--
     newio/MappedIO.java             | 144 ++++++++++++++++++++++++++++++++
     newio/TransferTo.java           |   5 +-
     newio/UsingBuffers.java         |   3 +-
     onjava/OSExecute.java           |  23 +++--
     onjava/OSExecuteException.java  |   7 +-
     onjava/TimedAbort.java          |  11 ++-
     standardio/ChangeSystemOut.java |   3 +-
     standardio/Echo.java            |  19 ++---
     standardio/Redirecting.java     |  18 ++--
     15 files changed, 280 insertions(+), 56 deletions(-)
     create mode 100644 newio/GetChannel.java
     create mode 100644 newio/MappedIO.java
    
    diff --git a/newio/BufferToText.java b/newio/BufferToText.java
    index f573a128c..81d541a22 100644
    --- a/newio/BufferToText.java
    +++ b/newio/BufferToText.java
    @@ -10,13 +10,14 @@
     
     public class BufferToText {
       private static final int BSIZE = 1024;
    -  public static void
    -  main(String[] args) throws Exception {
    +  public static void main(String[] args) {
         try(
           FileChannel fc = new FileOutputStream(
             "data2.txt").getChannel()
         ) {
           fc.write(ByteBuffer.wrap("Some text".getBytes()));
    +    } catch(IOException e) {
    +      throw new RuntimeException(e);
         }
         ByteBuffer buff = ByteBuffer.allocate(BSIZE);
         try(
    @@ -24,22 +25,28 @@ public class BufferToText {
             "data2.txt").getChannel()
         ) {
           fc.read(buff);
    +    } catch(IOException e) {
    +      throw new RuntimeException(e);
         }
         buff.flip();
         // Doesn't work:
         System.out.println(buff.asCharBuffer());
         // Decode using this system's default Charset:
         buff.rewind();
    -    String encoding = System.getProperty("file.encoding");
    -    System.out.println("Decoded using " + encoding + ": "
    +    String encoding =
    +      System.getProperty("file.encoding");
    +    System.out.println("Decoded using " +
    +      encoding + ": "
           + Charset.forName(encoding).decode(buff));
    -    // Or, we could encode with something that prints:
    +    // Encode with something that prints:
         try(
           FileChannel fc = new FileOutputStream(
             "data2.txt").getChannel()
         ) {
           fc.write(ByteBuffer.wrap(
             "Some text".getBytes("UTF-16BE")));
    +    } catch(IOException e) {
    +      throw new RuntimeException(e);
         }
         // Now try reading again:
         buff.clear();
    @@ -48,17 +55,21 @@ public class BufferToText {
             "data2.txt").getChannel()
         ) {
           fc.read(buff);
    +    } catch(IOException e) {
    +      throw new RuntimeException(e);
         }
         buff.flip();
         System.out.println(buff.asCharBuffer());
         // Use a CharBuffer to write through:
    -    buff = ByteBuffer.allocate(24); // More than needed
    +    buff = ByteBuffer.allocate(24);
         buff.asCharBuffer().put("Some text");
         try(
           FileChannel fc = new FileOutputStream(
             "data2.txt").getChannel()
         ) {
           fc.write(buff);
    +    } catch(IOException e) {
    +      throw new RuntimeException(e);
         }
         // Read and display:
         buff.clear();
    @@ -67,6 +78,8 @@ public class BufferToText {
             "data2.txt").getChannel()
         ) {
           fc.read(buff);
    +    } catch(IOException e) {
    +      throw new RuntimeException(e);
         }
         buff.flip();
         System.out.println(buff.asCharBuffer());
    diff --git a/newio/ChannelCopy.java b/newio/ChannelCopy.java
    index 6a67b97d1..6aed504fe 100644
    --- a/newio/ChannelCopy.java
    +++ b/newio/ChannelCopy.java
    @@ -10,8 +10,7 @@
     
     public class ChannelCopy {
       private static final int BSIZE = 1024;
    -  public static void
    -  main(String[] args) throws Exception {
    +  public static void main(String[] args) {
         if(args.length != 2) {
           System.out.println(
             "arguments: sourcefile destfile");
    @@ -29,6 +28,8 @@ public class ChannelCopy {
             out.write(buffer);
             buffer.clear();  // Prepare for reading
           }
    +    } catch(IOException e) {
    +      throw new RuntimeException(e);
         }
       }
     }
    diff --git a/newio/FileLocking.java b/newio/FileLocking.java
    index ad960f38e..8a8f776a8 100644
    --- a/newio/FileLocking.java
    +++ b/newio/FileLocking.java
    @@ -7,8 +7,7 @@
     import java.io.*;
     
     public class FileLocking {
    -  public static void
    -  main(String[] args) throws Exception {
    +  public static void main(String[] args) {
         try(
           FileOutputStream fos =
             new FileOutputStream("file.txt");
    @@ -20,6 +19,8 @@ public class FileLocking {
             fl.release();
             System.out.println("Released Lock");
           }
    +    } catch(IOException | InterruptedException e) {
    +      throw new RuntimeException(e);
         }
       }
     }
    diff --git a/newio/GetChannel.java b/newio/GetChannel.java
    new file mode 100644
    index 000000000..73bfe683d
    --- /dev/null
    +++ b/newio/GetChannel.java
    @@ -0,0 +1,53 @@
    +// newio/GetChannel.java
    +// (c)2017 MindView LLC: see Copyright.txt
    +// We make no guarantees that this code is fit for any purpose.
    +// Visit http://OnJava8.com for more book information.
    +// Getting channels from streams
    +import java.nio.*;
    +import java.nio.channels.*;
    +import java.io.*;
    +
    +public class GetChannel {
    +  private static String name = "data.txt";
    +  private static final int BSIZE = 1024;
    +  public static void main(String[] args) {
    +    // Write a file:
    +    try(
    +      FileChannel fc = new FileOutputStream(name)
    +        .getChannel()
    +    ) {
    +      fc.write(ByteBuffer
    +        .wrap("Some text ".getBytes()));
    +    } catch(IOException e) {
    +      throw new RuntimeException(e);
    +    }
    +    // Add to the end of the file:
    +    try(
    +      FileChannel fc = new RandomAccessFile(
    +        name, "rw").getChannel()
    +    ) {
    +      fc.position(fc.size()); // Move to the end
    +      fc.write(ByteBuffer
    +        .wrap("Some more".getBytes()));
    +    } catch(IOException e) {
    +      throw new RuntimeException(e);
    +    }
    +    // Read the file:
    +    try(
    +      FileChannel fc = new FileInputStream(name)
    +        .getChannel()
    +    ) {
    +      ByteBuffer buff = ByteBuffer.allocate(BSIZE);
    +      fc.read(buff);
    +      buff.flip();
    +      while(buff.hasRemaining())
    +        System.out.write(buff.get());
    +    } catch(IOException e) {
    +      throw new RuntimeException(e);
    +    }
    +    System.out.flush();
    +  }
    +}
    +/* Output:
    +Some text Some more
    +*/
    diff --git a/newio/LargeMappedFiles.java b/newio/LargeMappedFiles.java
    index 7ecf1e1cc..980896021 100644
    --- a/newio/LargeMappedFiles.java
    +++ b/newio/LargeMappedFiles.java
    @@ -15,8 +15,8 @@ public class LargeMappedFiles {
           RandomAccessFile tdat =
             new RandomAccessFile("test.dat", "rw")
         ) {
    -      MappedByteBuffer out = tdat.getChannel()
    -        .map(FileChannel.MapMode.READ_WRITE, 0, length);
    +      MappedByteBuffer out = tdat.getChannel().map(
    +        FileChannel.MapMode.READ_WRITE, 0, length);
           for(int i = 0; i < length; i++)
             out.put((byte)'x');
           System.out.println("Finished writing");
    diff --git a/newio/LockingMappedFiles.java b/newio/LockingMappedFiles.java
    index e13a2783c..92a4df674 100644
    --- a/newio/LockingMappedFiles.java
    +++ b/newio/LockingMappedFiles.java
    @@ -12,14 +12,15 @@ public class LockingMappedFiles {
       static FileChannel fc;
       public static void
       main(String[] args) throws Exception {
    -    fc =
    -      new RandomAccessFile("test.dat", "rw").getChannel();
    -    MappedByteBuffer out =
    -      fc.map(FileChannel.MapMode.READ_WRITE, 0, LENGTH);
    +    fc = new RandomAccessFile("test.dat", "rw")
    +      .getChannel();
    +    MappedByteBuffer out = fc.map(
    +      FileChannel.MapMode.READ_WRITE, 0, LENGTH);
         for(int i = 0; i < LENGTH; i++)
           out.put((byte)'x');
         new LockAndModify(out, 0, 0 + LENGTH/3);
    -    new LockAndModify(out, LENGTH/2, LENGTH/2 + LENGTH/4);
    +    new LockAndModify(
    +      out, LENGTH/2, LENGTH/2 + LENGTH/4);
       }
       private static class LockAndModify extends Thread {
         private ByteBuffer buff;
    diff --git a/newio/MappedIO.java b/newio/MappedIO.java
    new file mode 100644
    index 000000000..367f56b59
    --- /dev/null
    +++ b/newio/MappedIO.java
    @@ -0,0 +1,144 @@
    +// newio/MappedIO.java
    +// (c)2017 MindView LLC: see Copyright.txt
    +// We make no guarantees that this code is fit for any purpose.
    +// Visit http://OnJava8.com for more book information.
    +import java.util.*;
    +import java.nio.*;
    +import java.nio.channels.*;
    +import java.io.*;
    +
    +public class MappedIO {
    +  private static int numOfInts =      4_000_000;
    +  private static int numOfUbuffInts = 100_000;
    +  private abstract static class Tester {
    +    private String name;
    +    public Tester(String name) {
    +      this.name = name;
    +    }
    +    public void runTest() {
    +      System.out.print(name + ": ");
    +      long start = System.nanoTime();
    +      test();
    +      double duration = System.nanoTime() - start;
    +      System.out.format("%.3f%n", duration/1.0e9);
    +    }
    +    public abstract void test();
    +  }
    +  private static Tester[] tests = {
    +    new Tester("Stream Write") {
    +      @Override
    +      public void test() {
    +        try(
    +          DataOutputStream dos =
    +            new DataOutputStream(
    +              new BufferedOutputStream(
    +                new FileOutputStream(
    +                  new File("temp.tmp"))))
    +        ) {
    +          for(int i = 0; i < numOfInts; i++)
    +            dos.writeInt(i);
    +        } catch(IOException e) {
    +          throw new RuntimeException(e);
    +        }
    +      }
    +    },
    +    new Tester("Mapped Write") {
    +      @Override
    +      public void test() {
    +        try(
    +          FileChannel fc =
    +            new RandomAccessFile("temp.tmp", "rw")
    +              .getChannel()
    +        ) {
    +          IntBuffer ib =
    +            fc.map(FileChannel.MapMode.READ_WRITE,
    +              0, fc.size()).asIntBuffer();
    +          for(int i = 0; i < numOfInts; i++)
    +            ib.put(i);
    +        } catch(IOException e) {
    +          throw new RuntimeException(e);
    +        }
    +      }
    +    },
    +    new Tester("Stream Read") {
    +      @Override
    +      public void test() {
    +        try(
    +          DataInputStream dis =
    +            new DataInputStream(
    +              new BufferedInputStream(
    +                new FileInputStream("temp.tmp")))
    +        ) {
    +          for(int i = 0; i < numOfInts; i++)
    +            dis.readInt();
    +        } catch(IOException e) {
    +          throw new RuntimeException(e);
    +        }
    +      }
    +    },
    +    new Tester("Mapped Read") {
    +      @Override
    +      public void test() {
    +        try(
    +          FileChannel fc = new FileInputStream(
    +            new File("temp.tmp")).getChannel()
    +        ) {
    +          IntBuffer ib =
    +            fc.map(FileChannel.MapMode.READ_ONLY,
    +              0, fc.size()).asIntBuffer();
    +          while(ib.hasRemaining())
    +            ib.get();
    +        } catch(IOException e) {
    +          throw new RuntimeException(e);
    +        }
    +      }
    +    },
    +    new Tester("Stream Read/Write") {
    +      @Override
    +      public void test() {
    +        try(
    +          RandomAccessFile raf =
    +            new RandomAccessFile(
    +              new File("temp.tmp"), "rw")
    +        ) {
    +          raf.writeInt(1);
    +          for(int i = 0; i < numOfUbuffInts; i++) {
    +            raf.seek(raf.length() - 4);
    +            raf.writeInt(raf.readInt());
    +          }
    +        } catch(IOException e) {
    +          throw new RuntimeException(e);
    +        }
    +      }
    +    },
    +    new Tester("Mapped Read/Write") {
    +      @Override
    +      public void test() {
    +        try(
    +          FileChannel fc = new RandomAccessFile(
    +            new File("temp.tmp"), "rw").getChannel()
    +        ) {
    +          IntBuffer ib =
    +            fc.map(FileChannel.MapMode.READ_WRITE,
    +              0, fc.size()).asIntBuffer();
    +          ib.put(0);
    +          for(int i = 1; i < numOfUbuffInts; i++)
    +            ib.put(ib.get(i - 1));
    +        } catch(IOException e) {
    +          throw new RuntimeException(e);
    +        }
    +      }
    +    }
    +  };
    +  public static void main(String[] args) {
    +    Arrays.stream(tests).forEach(Tester::runTest);
    +  }
    +}
    +/* Output:
    +Stream Write: 0.269
    +Mapped Write: 0.022
    +Stream Read: 0.262
    +Mapped Read: 0.010
    +Stream Read/Write: 1.620
    +Mapped Read/Write: 0.007
    +*/
    diff --git a/newio/TransferTo.java b/newio/TransferTo.java
    index 2a6d8977d..d0cac844f 100644
    --- a/newio/TransferTo.java
    +++ b/newio/TransferTo.java
    @@ -8,8 +8,7 @@
     import java.io.*;
     
     public class TransferTo {
    -  public static void
    -  main(String[] args) throws Exception {
    +  public static void main(String[] args) {
         if(args.length != 2) {
           System.out.println(
             "arguments: sourcefile destfile");
    @@ -24,6 +23,8 @@ public class TransferTo {
           in.transferTo(0, in.size(), out);
           // Or:
           // out.transferFrom(in, 0, in.size());
    +    } catch(IOException e) {
    +      throw new RuntimeException(e);
         }
       }
     }
    diff --git a/newio/UsingBuffers.java b/newio/UsingBuffers.java
    index 4fead2c7b..e4c493992 100644
    --- a/newio/UsingBuffers.java
    +++ b/newio/UsingBuffers.java
    @@ -17,7 +17,8 @@ void symmetricScramble(CharBuffer buffer) {
       }
       public static void main(String[] args) {
         char[] data = "UsingBuffers".toCharArray();
    -    ByteBuffer bb = ByteBuffer.allocate(data.length * 2);
    +    ByteBuffer bb =
    +      ByteBuffer.allocate(data.length * 2);
         CharBuffer cb = bb.asCharBuffer();
         cb.put(data);
         System.out.println(cb.rewind());
    diff --git a/onjava/OSExecute.java b/onjava/OSExecute.java
    index 2158412b3..7dc19f616 100644
    --- a/onjava/OSExecute.java
    +++ b/onjava/OSExecute.java
    @@ -11,26 +11,23 @@ public class OSExecute {
       public static void command(String command) {
         boolean err = false;
         try {
    -      Process process =
    -        new ProcessBuilder(command.split(" ")).start();
    +      Process process = new ProcessBuilder(
    +        command.split(" ")).start();
           try(
             BufferedReader results = new BufferedReader(
    -          new InputStreamReader(process.getInputStream()));
    +          new InputStreamReader(
    +            process.getInputStream()));
             BufferedReader errors = new BufferedReader(
               new InputStreamReader(
                 process.getErrorStream()))
           ) {
    -        String s;
    -        while((s = results.readLine())!= null)
    -          System.out.println(s);
    -        // Report errors and return nonzero value
    -        // to calling process if there are problems:
    -        while((s = errors.readLine())!= null) {
    -          System.err.println(s);
    -          err = true;
    -        }
    +        results.lines()
    +          .forEach(System.out::println);
    +        err = errors.lines()
    +          .peek(System.err::println)
    +          .count() > 0;
           }
    -    } catch(Exception e) {
    +    } catch(IOException e) {
           throw new RuntimeException(e);
         }
         if(err)
    diff --git a/onjava/OSExecuteException.java b/onjava/OSExecuteException.java
    index 95c868bef..6a7b13e56 100644
    --- a/onjava/OSExecuteException.java
    +++ b/onjava/OSExecuteException.java
    @@ -4,6 +4,9 @@
     // Visit http://OnJava8.com for more book information.
     package onjava;
     
    -public class OSExecuteException extends RuntimeException {
    -  public OSExecuteException(String why) { super(why); }
    +public class
    +OSExecuteException extends RuntimeException {
    +  public OSExecuteException(String why) {
    +    super(why);
    +  }
     }
    diff --git a/onjava/TimedAbort.java b/onjava/TimedAbort.java
    index 5de4ac55f..bee2adccd 100644
    --- a/onjava/TimedAbort.java
    +++ b/onjava/TimedAbort.java
    @@ -7,9 +7,17 @@
     import java.util.concurrent.*;
     
     public class TimedAbort {
    +  private volatile boolean restart = true;
       public TimedAbort(int n, String msg) {
         CompletableFuture.runAsync(() -> {
    -      new Nap(1000 * n);
    +      try {
    +        while(restart) {
    +          restart = false;
    +          TimeUnit.SECONDS.sleep(n);
    +        }
    +      } catch(InterruptedException e) {
    +        throw new RuntimeException(e);
    +      }
           System.out.println(msg);
           System.exit(0);
         });
    @@ -17,4 +25,5 @@ public TimedAbort(int n, String msg) {
       public TimedAbort(int n) {
         this(n, "TimedAbort " + n);
       }
    +  public void restart() { restart = true; }
     }
    diff --git a/standardio/ChangeSystemOut.java b/standardio/ChangeSystemOut.java
    index 745477927..def290419 100644
    --- a/standardio/ChangeSystemOut.java
    +++ b/standardio/ChangeSystemOut.java
    @@ -7,7 +7,8 @@
     
     public class ChangeSystemOut {
       public static void main(String[] args) {
    -    PrintWriter out = new PrintWriter(System.out, true);
    +    PrintWriter out =
    +      new PrintWriter(System.out, true);
         out.println("Hello, world");
       }
     }
    diff --git a/standardio/Echo.java b/standardio/Echo.java
    index b772cd73b..3a222c93c 100644
    --- a/standardio/Echo.java
    +++ b/standardio/Echo.java
    @@ -7,15 +7,14 @@
     import onjava.TimedAbort;
     
     public class Echo {
    -  public static void
    -  main(String[] args) throws IOException {
    -    new TimedAbort(4);
    -    BufferedReader stdin = new BufferedReader(
    -      new InputStreamReader(System.in));
    -    String s;
    -    while((s=stdin.readLine()) != null &&
    -          s.length() != 0)
    -      System.out.println(s);
    -    // An empty line or Ctrl-Z terminates the program
    +  public static void main(String[] args) {
    +    TimedAbort abort = new TimedAbort(2);
    +    new BufferedReader(
    +      new InputStreamReader(System.in))
    +      .lines()
    +      .peek(ln -> abort.restart())
    +      .forEach(System.out::println);
    +    // Ctrl-Z or two seconds inactivity
    +    // terminates the program
       }
     }
    diff --git a/standardio/Redirecting.java b/standardio/Redirecting.java
    index eac91ccd2..72abc4ae2 100644
    --- a/standardio/Redirecting.java
    +++ b/standardio/Redirecting.java
    @@ -6,8 +6,7 @@
     import java.io.*;
     
     public class Redirecting {
    -  public static void
    -  main(String[] args) throws IOException {
    +  public static void main(String[] args) {
         PrintStream console = System.out;
         try(
           BufferedInputStream in = new BufferedInputStream(
    @@ -19,13 +18,14 @@ public class Redirecting {
           System.setIn(in);
           System.setOut(out);
           System.setErr(out);
    -      BufferedReader br = new BufferedReader(
    -        new InputStreamReader(System.in));
    -      String s;
    -      while((s = br.readLine()) != null)
    -        System.out.println(s);
    -      out.close(); // Remember this!
    +      new BufferedReader(
    +        new InputStreamReader(System.in))
    +        .lines()
    +        .forEach(System.out::println);
    +    } catch(IOException e) {
    +      throw new RuntimeException(e);
    +    } finally {
    +      System.setOut(console);
         }
    -    System.setOut(console);
       }
     }
    
    From 087042975689e381ae9c8bf6b05585cdbe4c21b8 Mon Sep 17 00:00:00 2001
    From: Bruce Eckel 
    Date: Sun, 22 Jan 2017 16:48:11 -0800
    Subject: [PATCH 221/320] cleanup/refactor/simplify
    
    ---
     annotations/AtUnitComposition.java            | 10 ++-
     annotations/AtUnitExample1.java               | 15 ++--
     annotations/AtUnitExample2.java               | 12 ++-
     annotations/AtUnitExample3.java               | 12 ++-
     annotations/AtUnitExample4.java               | 22 +++--
     annotations/AtUnitExample5.java               | 22 +++--
     annotations/AtUnitExternalTest.java           |  6 +-
     annotations/HashSetTest.java                  |  9 +-
     annotations/StackLStringTest.java             |  9 +-
     annotations/Testable.java                     |  3 +-
     annotations/UseCaseTracker.java               | 31 ++++---
     annotations/ifx/IfaceExtractorProcessor.java  | 29 +++---
     annotations/simplest/SimpleProcessor.java     |  7 +-
     collectiontopics/CanonicalMapping.java        |  3 +-
     collectiontopics/CollectionMethods.java       |  3 +-
     collectiontopics/FillMapTest.java             | 12 +--
     collectiontopics/FillingLists.java            |  8 +-
     collectiontopics/LinkedHashMapDemo.java       |  5 +-
     collectiontopics/ListOps.java                 |  5 +-
     collectiontopics/ListSortSearch.java          | 11 ++-
     collectiontopics/MapOps.java                  | 17 ++--
     collectiontopics/ReadOnly.java                | 10 ++-
     collectiontopics/SortedMapDemo.java           |  3 +-
     collectiontopics/Stacks.java                  |  5 +-
     collectiontopics/StreamFillMaps.java          | 12 ++-
     collectiontopics/SuppliersCollectionTest.java | 29 +++---
     collectiontopics/Synchronization.java         | 20 ++---
     collectiontopics/ToDoList.java                |  3 +-
     collectiontopics/Unsupported.java             |  3 +-
     collectiontopics/Utilities.java               | 12 ++-
     compression/GZIPcompress.java                 | 11 +--
     compression/ZipCompress.java                  |  9 +-
     concurrent/Baked.java                         |  4 +-
     concurrent/Batter.java                        |  4 +-
     concurrent/DiningPhilosophers.java            |  2 +-
     concurrent/DualCompletableOperations.java     | 12 +--
     concurrent/FrostedCake.java                   |  4 +-
     concurrent/GuardedIDField.java                |  2 +-
     concurrent/Machina.java                       |  2 +-
     concurrent/NapTask.java                       |  2 +-
     concurrent/Pizza.java                         |  2 +-
     concurrent/QuittableTask.java                 |  2 +-
     concurrent/QuittingCompletable.java           |  2 +-
     concurrent/QuittingTasks.java                 |  2 +-
     concurrent/SingleThreadExecutor.java          |  2 +-
     concurrent/Workable.java                      |  8 +-
     exceptions/WhoCalled.java                     |  2 +-
     files/AddAndSubtractPaths.java                |  2 +-
     files/PathInfo.java                           |  2 +-
     housekeeping/TerminationCondition.java        |  2 +-
     lowlevel/AttemptLocking.java                  |  2 +-
     lowlevel/CaptureUncaughtException.java        |  5 +-
     lowlevel/MutexEvenProducer.java               |  2 +-
     lowlevel/PriorityBlockingQueueDemo.java       | 81 ++++++++---------
     lowlevel/SerialNumberChecker.java             |  2 +-
     lowlevel/SyncOnObject.java                    |  4 +-
     lowlevel/SynchronizedComparison.java          |  4 +-
     lowlevel/SynchronizedEvenProducer.java        |  2 +-
     lowlevel/TestAbort.java                       |  2 +-
     lowlevel/ThreadSize.java                      |  2 +-
     network/ChatterClient.java                    |  1 -
     network/ChatterServer.java                    |  3 +-
     network/Dgram.java                            |  1 -
     network/Local.java                            | 15 ++++
     network/MultiServer.java                      | 37 ++++----
     network/SimpleClient.java                     |  7 +-
     network/SimpleClient2.java                    | 11 +--
     network/SimpleServer.java                     | 11 +--
     network/TestChatter.java                      | 18 ++++
     network/TestMultiServer.java                  | 19 ++++
     network/TestSimpleServerClient.java           | 18 ++++
     network/WhoAmI.java                           |  2 +-
     network/tests/ChatterTest.java                | 21 -----
     network/tests/MultiTest.java                  | 27 ------
     network/tests/TestSimpleServerClient.java     | 20 -----
     onjava/CountMap.java                          |  8 +-
     onjava/CountingIntegerList.java               |  3 +-
     onjava/Countries.java                         |  3 +-
     onjava/FillMap.java                           | 20 ++---
     onjava/HTMLColors.java                        |  3 +-
     onjava/Nap.java                               | 16 +++-
     onjava/atunit/AtUnit.java                     |  8 +-
     patterns/state/StateMachineDemo.java          |  6 +-
     remote/DisplayPerfectTime.java                |  3 +-
     serialization/APerson.java                    | 19 ++--
     serialization/AStoreCADState.java             | 89 ++++++++++---------
     serialization/Blip3.java                      |  8 +-
     serialization/Blips.java                      |  8 +-
     serialization/Logon.java                      | 26 +++---
     serialization/MyWorld.java                    | 24 +++--
     serialization/People.java                     |  2 +-
     serialization/RecoverCADState.java            | 28 +++---
     serialization/SerialCtl.java                  | 33 ++++---
     serialization/Worm.java                       |  2 +-
     94 files changed, 586 insertions(+), 466 deletions(-)
     create mode 100644 network/Local.java
     create mode 100644 network/TestChatter.java
     create mode 100644 network/TestMultiServer.java
     create mode 100644 network/TestSimpleServerClient.java
     delete mode 100644 network/tests/ChatterTest.java
     delete mode 100644 network/tests/MultiTest.java
     delete mode 100644 network/tests/TestSimpleServerClient.java
    
    diff --git a/annotations/AtUnitComposition.java b/annotations/AtUnitComposition.java
    index de4bccded..1b6d59106 100644
    --- a/annotations/AtUnitComposition.java
    +++ b/annotations/AtUnitComposition.java
    @@ -11,11 +11,13 @@
     
     public class AtUnitComposition {
       AtUnitExample1 testObject = new AtUnitExample1();
    -  @Test boolean tMethodOne() {
    -    return
    -      testObject.methodOne().equals("This is methodOne");
    +  @Test
    +  boolean tMethodOne() {
    +    return testObject.methodOne()
    +      .equals("This is methodOne");
       }
    -  @Test boolean tMethodTwo() {
    +  @Test
    +  boolean tMethodTwo() {
         return testObject.methodTwo() == 2;
       }
     }
    diff --git a/annotations/AtUnitExample1.java b/annotations/AtUnitExample1.java
    index cd0954264..d0f6f1e12 100644
    --- a/annotations/AtUnitExample1.java
    +++ b/annotations/AtUnitExample1.java
    @@ -16,14 +16,19 @@ public int methodTwo() {
         System.out.println("This is methodTwo");
         return 2;
       }
    -  @Test boolean methodOneTest() {
    +  @Test
    +  boolean methodOneTest() {
         return methodOne().equals("This is methodOne");
       }
    -  @Test boolean m2() { return methodTwo() == 2; }
    -  @Test private boolean m3() { return true; }
    +  @Test
    +  boolean m2() { return methodTwo() == 2; }
    +  @Test
    +  private boolean m3() { return true; }
       // Shows output for failure:
    -  @Test boolean failureTest() { return false; }
    -  @Test boolean anotherDisappointment() {
    +  @Test
    +  boolean failureTest() { return false; }
    +  @Test
    +  boolean anotherDisappointment() {
         return false;
       }
     }
    diff --git a/annotations/AtUnitExample2.java b/annotations/AtUnitExample2.java
    index d2028559a..44cf7552c 100644
    --- a/annotations/AtUnitExample2.java
    +++ b/annotations/AtUnitExample2.java
    @@ -18,16 +18,20 @@ public int methodTwo() {
         System.out.println("This is methodTwo");
         return 2;
       }
    -  @Test void assertExample() {
    +  @Test
    +  void assertExample() {
         assert methodOne().equals("This is methodOne");
       }
    -  @Test void assertFailureExample() {
    +  @Test
    +  void assertFailureExample() {
         assert 1 == 2: "What a surprise!";
       }
    -  @Test void exceptionExample() throws IOException {
    +  @Test
    +  void exceptionExample() throws IOException {
         new FileInputStream("nofile.txt"); // Throws
       }
    -  @Test boolean assertAndReturn() {
    +  @Test
    +  boolean assertAndReturn() {
         // Assertion with message:
         assert methodTwo() == 2: "methodTwo must equal 2";
         return methodOne().equals("This is methodOne");
    diff --git a/annotations/AtUnitExample3.java b/annotations/AtUnitExample3.java
    index 537773d08..aabb92dcf 100644
    --- a/annotations/AtUnitExample3.java
    +++ b/annotations/AtUnitExample3.java
    @@ -19,14 +19,18 @@ public int methodTwo() {
         System.out.println("This is methodTwo");
         return 2;
       }
    -  @TestObjectCreate static AtUnitExample3 create() {
    +  @TestObjectCreate
    +  static AtUnitExample3 create() {
         return new AtUnitExample3(47);
       }
    -  @Test boolean initialization() { return n == 47; }
    -  @Test boolean methodOneTest() {
    +  @Test
    +  boolean initialization() { return n == 47; }
    +  @Test
    +  boolean methodOneTest() {
         return methodOne().equals("This is methodOne");
       }
    -  @Test boolean m2() { return methodTwo() == 2; }
    +  @Test
    +  boolean m2() { return methodTwo() == 2; }
     }
     /* Output:
     annotations.AtUnitExample3
    diff --git a/annotations/AtUnitExample4.java b/annotations/AtUnitExample4.java
    index d40ca8c06..2837c81aa 100644
    --- a/annotations/AtUnitExample4.java
    +++ b/annotations/AtUnitExample4.java
    @@ -20,30 +20,33 @@ public AtUnitExample4(String word) {
       }
       public String getWord() { return word; }
       public String scrambleWord() {
    -    List chars =
    -      Arrays.asList(
    -        ConvertTo.boxed(word.toCharArray()));
    +    List chars = Arrays.asList(
    +      ConvertTo.boxed(word.toCharArray()));
         Collections.shuffle(chars, rand);
         StringBuilder result = new StringBuilder();
         for(char ch : chars)
           result.append(ch);
         return result.toString();
       }
    -  @TestProperty static List input =
    +  @TestProperty
    +  static List input =
         Arrays.asList(theory.split(" "));
       @TestProperty
    -    static Iterator words = input.iterator();
    -  @TestObjectCreate static AtUnitExample4 create() {
    +  static Iterator words = input.iterator();
    +  @TestObjectCreate
    +  static AtUnitExample4 create() {
         if(words.hasNext())
           return new AtUnitExample4(words.next());
         else
           return null;
       }
    -  @Test boolean words() {
    +  @Test
    +  boolean words() {
         System.out.println("'" + getWord() + "'");
         return getWord().equals("are");
       }
    -  @Test boolean scramble1() {
    +  @Test
    +  boolean scramble1() {
         // Use specific seed to get verifiable results:
         rand = new Random(47);
         System.out.println("'" + getWord() + "'");
    @@ -51,7 +54,8 @@ public String scrambleWord() {
         System.out.println(scrambled);
         return scrambled.equals("lAl");
       }
    -  @Test boolean scramble2() {
    +  @Test
    +  boolean scramble2() {
         rand = new Random(74);
         System.out.println("'" + getWord() + "'");
         String scrambled = scrambleWord();
    diff --git a/annotations/AtUnitExample5.java b/annotations/AtUnitExample5.java
    index f613ea512..20f608601 100644
    --- a/annotations/AtUnitExample5.java
    +++ b/annotations/AtUnitExample5.java
    @@ -16,9 +16,12 @@ public AtUnitExample5(String text) {
       }
       @Override
       public String toString() { return text; }
    -  @TestProperty static PrintWriter output;
    -  @TestProperty static int counter;
    -  @TestObjectCreate static AtUnitExample5 create() {
    +  @TestProperty
    +  static PrintWriter output;
    +  @TestProperty
    +  static int counter;
    +  @TestObjectCreate
    +  static AtUnitExample5 create() {
         String id = Integer.toString(counter++);
         try {
           output = new PrintWriter("Test" + id + ".txt");
    @@ -27,20 +30,23 @@ public AtUnitExample5(String text) {
         }
         return new AtUnitExample5(id);
       }
    -  @TestObjectCleanup static void
    -  cleanup(AtUnitExample5 tobj) {
    +  @TestObjectCleanup
    +  static void cleanup(AtUnitExample5 tobj) {
         System.out.println("Running cleanup");
         output.close();
       }
    -  @Test boolean test1() {
    +  @Test
    +  boolean test1() {
         output.print("test1");
         return true;
       }
    -  @Test boolean test2() {
    +  @Test
    +  boolean test2() {
         output.print("test2");
         return true;
       }
    -  @Test boolean test3() {
    +  @Test
    +  boolean test3() {
         output.print("test3");
         return true;
       }
    diff --git a/annotations/AtUnitExternalTest.java b/annotations/AtUnitExternalTest.java
    index 9d1d91379..d6ba375b1 100644
    --- a/annotations/AtUnitExternalTest.java
    +++ b/annotations/AtUnitExternalTest.java
    @@ -11,10 +11,12 @@
     
     public class
     AtUnitExternalTest extends AtUnitExample1 {
    -  @Test boolean tMethodOne() {
    +  @Test
    +  boolean tMethodOne() {
         return methodOne().equals("This is methodOne");
       }
    -  @Test boolean tMethodTwo() {
    +  @Test
    +  boolean tMethodTwo() {
         return methodTwo() == 2;
       }
     }
    diff --git a/annotations/HashSetTest.java b/annotations/HashSetTest.java
    index 1bd85e8d0..27044ed92 100644
    --- a/annotations/HashSetTest.java
    +++ b/annotations/HashSetTest.java
    @@ -11,14 +11,17 @@
     
     public class HashSetTest {
       HashSet testObject = new HashSet<>();
    -  @Test void initialization() {
    +  @Test
    +  void initialization() {
         assert testObject.isEmpty();
       }
    -  @Test void tContains() {
    +  @Test
    +  void tContains() {
         testObject.add("one");
         assert testObject.contains("one");
       }
    -  @Test void tRemove() {
    +  @Test
    +  void tRemove() {
         testObject.add("one");
         testObject.remove("one");
         assert testObject.isEmpty();
    diff --git a/annotations/StackLStringTest.java b/annotations/StackLStringTest.java
    index f6d9911b9..fa0655b59 100644
    --- a/annotations/StackLStringTest.java
    +++ b/annotations/StackLStringTest.java
    @@ -11,19 +11,22 @@
     
     public class
     StackLStringTest extends StackL {
    -  @Test void tPush() {
    +  @Test
    +  void tPush() {
         push("one");
         assert top().equals("one");
         push("two");
         assert top().equals("two");
       }
    -  @Test void tPop() {
    +  @Test
    +  void tPop() {
         push("one");
         push("two");
         assert pop().equals("two");
         assert pop().equals("one");
       }
    -  @Test void tTop() {
    +  @Test
    +  void tTop() {
         push("A");
         push("B");
         assert top().equals("B");
    diff --git a/annotations/Testable.java b/annotations/Testable.java
    index 6e39af934..b0dd168d8 100644
    --- a/annotations/Testable.java
    +++ b/annotations/Testable.java
    @@ -9,5 +9,6 @@ public class Testable {
       public void execute() {
         System.out.println("Executing..");
       }
    -  @Test void testExecute() { execute(); }
    +  @Test
    +  void testExecute() { execute(); }
     }
    diff --git a/annotations/UseCaseTracker.java b/annotations/UseCaseTracker.java
    index ced2cdcb0..4f60f30ef 100644
    --- a/annotations/UseCaseTracker.java
    +++ b/annotations/UseCaseTracker.java
    @@ -2,8 +2,9 @@
     // (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
    -import java.lang.reflect.*;
     import java.util.*;
    +import java.util.stream.*;
    +import java.lang.reflect.*;
     
     public class UseCaseTracker {
       public static void
    @@ -11,28 +12,26 @@ public class UseCaseTracker {
         for(Method m : cl.getDeclaredMethods()) {
           UseCase uc = m.getAnnotation(UseCase.class);
           if(uc != null) {
    -        System.out.println("Found Use Case:" + uc.id() +
    -          " " + uc.description());
    +        System.out.println("Found Use Case " +
    +          uc.id() + "\n  " + uc.description());
             useCases.remove(new Integer(uc.id()));
           }
         }
    -    for(int i : useCases) {
    -      System.out.println(
    -        "Warning: Missing use case-" + i);
    -    }
    +    useCases.forEach(i ->
    +      System.out.println("Missing use case " + i));
       }
       public static void main(String[] args) {
    -    // <* Can't use Arrays.asList() for some reason *>
    -    List useCases = new ArrayList<>();
    -    Collections.addAll(useCases, 47, 48, 49, 50);
    +    List useCases = IntStream.range(47, 51)
    +      .boxed().collect(Collectors.toList());
         trackUseCases(useCases, PasswordUtils.class);
       }
     }
     /* Output:
    -Found Use Case:49 New passwords can't equal previously used
    -ones
    -Found Use Case:47 Passwords must contain at least one
    -numeric
    -Found Use Case:48 no description
    -Warning: Missing use case-50
    +Found Use Case 49
    +  New passwords can't equal previously used ones
    +Found Use Case 47
    +  Passwords must contain at least one numeric
    +Found Use Case 48
    +  no description
    +Missing use case 50
     */
    diff --git a/annotations/ifx/IfaceExtractorProcessor.java b/annotations/ifx/IfaceExtractorProcessor.java
    index 14f412a6e..4869d4945 100644
    --- a/annotations/ifx/IfaceExtractorProcessor.java
    +++ b/annotations/ifx/IfaceExtractorProcessor.java
    @@ -9,6 +9,7 @@
     import javax.lang.model.element.*;
     import javax.lang.model.util.*;
     import java.util.*;
    +import java.util.stream.*;
     import java.io.*;
     
     @SupportedAnnotationTypes(
    @@ -20,14 +21,16 @@ public class IfaceExtractorProcessor
         interfaceMethods = new ArrayList<>();
       Elements elementUtils;
       private ProcessingEnvironment processingEnv;
    -  @Override public void
    -  init(ProcessingEnvironment processingEnv) {
    +  @Override
    +  public void init(
    +    ProcessingEnvironment processingEnv) {
         this.processingEnv = processingEnv;
         elementUtils = processingEnv.getElementUtils();
       }
    -  @Override public boolean
    -  process(Set annotations,
    -  RoundEnvironment env) {
    +  @Override
    +  public boolean process(
    +    Set annotations,
    +    RoundEnvironment env) {
         for(Element elem:env.getElementsAnnotatedWith(
             ExtractInterface.class)) {
           String interfaceName = elem.getAnnotation(
    @@ -66,7 +69,7 @@ public class IfaceExtractorProcessor
             ExecutableElement method =
               (ExecutableElement)elem;
             String signature = "  public ";
    -        signature += method.getReturnType()+" ";
    +        signature += method.getReturnType() + " ";
             signature += method.getSimpleName();
             signature += createArgList(
               method.getParameters());
    @@ -80,15 +83,9 @@ public class IfaceExtractorProcessor
       }
       private String createArgList(
         List parameters) {
    -    if(parameters.size() == 0)
    -      return "()";
    -    String args = "(";
    -    for(VariableElement p : parameters) {
    -      args += p.asType() + " ";
    -      args += p.getSimpleName() + ", ";
    -    }
    -    args = args.substring(0, args.length() - 2);
    -    args += ")";
    -    return args;
    +    String args = parameters.stream()
    +      .map(p -> p.asType() + " " + p.getSimpleName())
    +      .collect(Collectors.joining(", "));
    +    return "(" + args + ")";
       }
     }
    diff --git a/annotations/simplest/SimpleProcessor.java b/annotations/simplest/SimpleProcessor.java
    index 56c4e8b91..c62bcc767 100644
    --- a/annotations/simplest/SimpleProcessor.java
    +++ b/annotations/simplest/SimpleProcessor.java
    @@ -14,9 +14,10 @@
     @SupportedSourceVersion(SourceVersion.RELEASE_8)
     public class SimpleProcessor
     extends AbstractProcessor {
    -  @Override public boolean
    -  process(Set annotations,
    -  RoundEnvironment env) {
    +  @Override
    +  public boolean process(
    +    Set annotations,
    +    RoundEnvironment env) {
         for(TypeElement t : annotations)
           System.out.println(t);
         for(Element el :
    diff --git a/collectiontopics/CanonicalMapping.java b/collectiontopics/CanonicalMapping.java
    index c00e3975f..f81d0bb83 100644
    --- a/collectiontopics/CanonicalMapping.java
    +++ b/collectiontopics/CanonicalMapping.java
    @@ -41,7 +41,8 @@ public static void main(String[] args) {
         if(args.length > 0)
           size = new Integer(args[0]);
         Key[] keys = new Key[size];
    -    WeakHashMap map = new WeakHashMap<>();
    +    WeakHashMap map =
    +      new WeakHashMap<>();
         for(int i = 0; i < size; i++) {
           Key k = new Key(Integer.toString(i));
           Value v = new Value(Integer.toString(i));
    diff --git a/collectiontopics/CollectionMethods.java b/collectiontopics/CollectionMethods.java
    index 0c5ba63ea..6c6ae7f15 100644
    --- a/collectiontopics/CollectionMethods.java
    +++ b/collectiontopics/CollectionMethods.java
    @@ -59,7 +59,8 @@ public static void main(String[] args) {
         // Throw away all the elements
         // in c2 that also appear in c3:
         c2.removeAll(c3);
    -    System.out.println("c2.isEmpty() = " +  c2.isEmpty());
    +    System.out.println(
    +      "c2.isEmpty() = " +  c2.isEmpty());
         border();
         // Functional operation:
         c = new ArrayList<>(LIST);
    diff --git a/collectiontopics/FillMapTest.java b/collectiontopics/FillMapTest.java
    index 599c76aba..e7f1d3c49 100644
    --- a/collectiontopics/FillMapTest.java
    +++ b/collectiontopics/FillMapTest.java
    @@ -12,13 +12,13 @@ public static void main(String[] args) {
         Map mcs = FillMap.basic(
           new Rand.String(4), new Count.Integer(), 7);
         System.out.println(mcs);
    -    HashMap hashm = FillMap.create(
    -      new Rand.String(4), new Count.Integer(),
    -      HashMap::new, 7);
    +    HashMap hashm =
    +      FillMap.create(new Rand.String(4),
    +        new Count.Integer(), HashMap::new, 7);
         System.out.println(hashm);
    -    LinkedHashMap linkm = FillMap.create(
    -      new Rand.String(4), new Count.Integer(),
    -      LinkedHashMap::new, 7);
    +    LinkedHashMap linkm =
    +      FillMap.create(new Rand.String(4),
    +        new Count.Integer(), LinkedHashMap::new, 7);
         System.out.println(linkm);
       }
     }
    diff --git a/collectiontopics/FillingLists.java b/collectiontopics/FillingLists.java
    index b333ee8b3..f8fe104e2 100644
    --- a/collectiontopics/FillingLists.java
    +++ b/collectiontopics/FillingLists.java
    @@ -2,7 +2,7 @@
     // (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
    -// The Collections.fill() + Collections.nCopies() methods
    +// Collections.fill() & Collections.nCopies()
     import java.util.*;
     
     class StringAddress {
    @@ -17,9 +17,11 @@ public String toString() {
     public class FillingLists {
       public static void main(String[] args) {
         List list = new ArrayList<>(
    -      Collections.nCopies(4, new StringAddress("Hello")));
    +      Collections.nCopies(4,
    +        new StringAddress("Hello")));
         System.out.println(list);
    -    Collections.fill(list, new StringAddress("World!"));
    +    Collections.fill(list,
    +      new StringAddress("World!"));
         System.out.println(list);
       }
     }
    diff --git a/collectiontopics/LinkedHashMapDemo.java b/collectiontopics/LinkedHashMapDemo.java
    index 12e1574bc..70e1db15c 100644
    --- a/collectiontopics/LinkedHashMapDemo.java
    +++ b/collectiontopics/LinkedHashMapDemo.java
    @@ -12,10 +12,11 @@ public static void main(String[] args) {
           new LinkedHashMap<>(new CountMap(9));
         System.out.println(linkedMap);
         // Least-recently-used order:
    -    linkedMap = new LinkedHashMap<>(16, 0.75f, true);
    +    linkedMap =
    +      new LinkedHashMap<>(16, 0.75f, true);
         linkedMap.putAll(new CountMap(9));
         System.out.println(linkedMap);
    -    for(int i = 0; i < 6; i++) // Cause accesses:
    +    for(int i = 0; i < 6; i++)
           linkedMap.get(i);
         System.out.println(linkedMap);
         linkedMap.get(0);
    diff --git a/collectiontopics/ListOps.java b/collectiontopics/ListOps.java
    index f90890693..72ecf8ab9 100644
    --- a/collectiontopics/ListOps.java
    +++ b/collectiontopics/ListOps.java
    @@ -59,7 +59,7 @@ public static void iterManipulation(List a) {
         it.add("47");
         // Must move to an element after add():
         it.next();
    -    // Remove the element after the newly produced one:
    +    // Remove the element after the new one:
         it.remove();
         // Must move to an element after remove():
         it.next();
    @@ -75,7 +75,8 @@ public static void testVisual(List a) {
         System.out.println(a);
         // Insert, remove, and replace elements
         // using a ListIterator:
    -    ListIterator x = a.listIterator(a.size()/2);
    +    ListIterator x =
    +      a.listIterator(a.size()/2);
         x.add("one");
         System.out.println(a);
         System.out.println(x.next());
    diff --git a/collectiontopics/ListSortSearch.java b/collectiontopics/ListSortSearch.java
    index 0f452c3c5..77400b176 100644
    --- a/collectiontopics/ListSortSearch.java
    +++ b/collectiontopics/ListSortSearch.java
    @@ -13,7 +13,7 @@ public static void main(String[] args) {
         System.out.println(list);
         Collections.shuffle(list, new Random(47));
         System.out.println("Shuffled: " + list);
    -    // Use a ListIterator to trim off the last elements:
    +    // Use ListIterator to trim off last elements:
         ListIterator it = list.listIterator(10);
         while(it.hasNext()) {
           it.next();
    @@ -26,8 +26,10 @@ public static void main(String[] args) {
         int index = Collections.binarySearch(list, key);
         System.out.println(
           "Location of " + key + " is " + index +
    -      ", list.get(" + index + ") = " + list.get(index));
    -    Collections.sort(list, String.CASE_INSENSITIVE_ORDER);
    +      ", list.get(" + index + ") = " +
    +      list.get(index));
    +    Collections.sort(list,
    +      String.CASE_INSENSITIVE_ORDER);
         System.out.println(
           "Case-insensitive sorted: " + list);
         key = list.get(7);
    @@ -35,7 +37,8 @@ public static void main(String[] args) {
           String.CASE_INSENSITIVE_ORDER);
         System.out.println(
           "Location of " + key + " is " + index +
    -      ", list.get(" + index + ") = " + list.get(index));
    +      ", list.get(" + index + ") = " +
    +      list.get(index));
       }
     }
     /* Output:
    diff --git a/collectiontopics/MapOps.java b/collectiontopics/MapOps.java
    index 5d331d0da..9956f80f6 100644
    --- a/collectiontopics/MapOps.java
    +++ b/collectiontopics/MapOps.java
    @@ -14,8 +14,10 @@ public static void printKeys(Map map) {
         // Produce a Set of the keys:
         System.out.println(map.keySet());
       }
    -  public static void test(Map map) {
    -    System.out.println(map.getClass().getSimpleName());
    +  public static
    +  void test(Map map) {
    +    System.out.println(
    +      map.getClass().getSimpleName());
         map.putAll(new CountMap(25));
         // Map has 'Set' behavior for keys:
         map.putAll(new CountMap(25));
    @@ -24,9 +26,10 @@ public static void test(Map map) {
         System.out.print("Values: ");
         System.out.println(map.values());
         System.out.println(map);
    +    System.out.println("map.containsKey(11): " +
    +      map.containsKey(11));
         System.out.println(
    -      "map.containsKey(11): " + map.containsKey(11));
    -    System.out.println("map.get(11): " + map.get(11));
    +      "map.get(11): " + map.get(11));
         System.out.println("map.containsValue(\"F0\"): "
           + map.containsValue("F0"));
         Integer key = map.keySet().iterator().next();
    @@ -34,11 +37,13 @@ public static void test(Map map) {
         map.remove(key);
         printKeys(map);
         map.clear();
    -    System.out.println("map.isEmpty(): " + map.isEmpty());
    +    System.out.println(
    +      "map.isEmpty(): " + map.isEmpty());
         map.putAll(new CountMap(25));
         // Operations on the Set change the Map:
         map.keySet().removeAll(map.keySet());
    -    System.out.println("map.isEmpty(): " + map.isEmpty());
    +    System.out.println(
    +      "map.isEmpty(): " + map.isEmpty());
       }
       public static void main(String[] args) {
         test(new HashMap<>());
    diff --git a/collectiontopics/ReadOnly.java b/collectiontopics/ReadOnly.java
    index 19a8cc58e..8339bd52f 100644
    --- a/collectiontopics/ReadOnly.java
    +++ b/collectiontopics/ReadOnly.java
    @@ -28,11 +28,13 @@ public static void main(String[] args) {
         //- s.add("one"); // Can't change it
     
         // For a SortedSet:
    -    Set ss = Collections.unmodifiableSortedSet(
    -      new TreeSet<>(data));
    +    Set ss =
    +      Collections.unmodifiableSortedSet(
    +        new TreeSet<>(data));
     
    -    Map m = Collections.unmodifiableMap(
    -      new HashMap<>(Countries.capitals(6)));
    +    Map m =
    +      Collections.unmodifiableMap(
    +        new HashMap<>(Countries.capitals(6)));
         System.out.println(m); // Reading is OK
         //- m.put("Ralph", "Howdy!");
     
    diff --git a/collectiontopics/SortedMapDemo.java b/collectiontopics/SortedMapDemo.java
    index a63504b6f..90e1e297e 100644
    --- a/collectiontopics/SortedMapDemo.java
    +++ b/collectiontopics/SortedMapDemo.java
    @@ -15,7 +15,8 @@ public static void main(String[] args) {
         Integer high = sortedMap.lastKey();
         System.out.println(low);
         System.out.println(high);
    -    Iterator it = sortedMap.keySet().iterator();
    +    Iterator it =
    +      sortedMap.keySet().iterator();
         for(int i = 0; i <= 6; i++) {
           if(i == 3) low = it.next();
           if(i == 6) high = it.next();
    diff --git a/collectiontopics/Stacks.java b/collectiontopics/Stacks.java
    index 476a5ccbc..053b5d3c1 100644
    --- a/collectiontopics/Stacks.java
    +++ b/collectiontopics/Stacks.java
    @@ -5,8 +5,9 @@
     // Demonstration of Stack Class
     import java.util.*;
     
    -enum Month { JANUARY, FEBRUARY, MARCH, APRIL, MAY, JUNE,
    -  JULY, AUGUST, SEPTEMBER, OCTOBER, NOVEMBER }
    +enum Month { JANUARY, FEBRUARY, MARCH, APRIL,
    +  MAY, JUNE, JULY, AUGUST, SEPTEMBER,
    +  OCTOBER, NOVEMBER }
     
     public class Stacks {
       public static void main(String[] args) {
    diff --git a/collectiontopics/StreamFillMaps.java b/collectiontopics/StreamFillMaps.java
    index d601357f0..83295aa09 100644
    --- a/collectiontopics/StreamFillMaps.java
    +++ b/collectiontopics/StreamFillMaps.java
    @@ -7,7 +7,8 @@
     import java.util.stream.*;
     import onjava.*;
     
    -class Letters implements Supplier> {
    +class Letters
    +implements Supplier> {
       private int number = 1;
       private char letter = 'A';
       @Override
    @@ -21,7 +22,8 @@ public static void main(String[] args) {
         Map m =
           Stream.generate(new Letters())
           .limit(11)
    -      .collect(Collectors.toMap(Pair::key, Pair::value));
    +      .collect(Collectors
    +        .toMap(Pair::key, Pair::value));
         System.out.println(m);
     
         // Two separate Suppliers:
    @@ -30,14 +32,16 @@ public static void main(String[] args) {
         Map mcs = Stream.generate(
           () -> Pair.make(cc.get(), rs.get()))
           .limit(8)
    -      .collect(Collectors.toMap(Pair::key, Pair::value));
    +      .collect(Collectors
    +        .toMap(Pair::key, Pair::value));
         System.out.println(mcs);
     
         // A key Supplier and a single value:
         Map mcs2 = Stream.generate(
           () -> Pair.make(cc.get(), "Val"))
           .limit(8)
    -      .collect(Collectors.toMap(Pair::key, Pair::value));
    +      .collect(Collectors
    +        .toMap(Pair::key, Pair::value));
         System.out.println(mcs2);
       }
     }
    diff --git a/collectiontopics/SuppliersCollectionTest.java b/collectiontopics/SuppliersCollectionTest.java
    index e57f92d74..22b2661c2 100644
    --- a/collectiontopics/SuppliersCollectionTest.java
    +++ b/collectiontopics/SuppliersCollectionTest.java
    @@ -9,16 +9,19 @@
     
     class Government implements Supplier {
       static String[] foundation = (
    -    "strange women lying in ponds distributing swords " +
    -    "is no basis for a system of government").split(" ");
    +    "strange women lying in ponds " +
    +    "distributing swords is no basis " +
    +    "for a system of government").split(" ");
       private int index;
       @Override
    -  public String get() { return foundation[index++]; }
    +  public String get() {
    +    return foundation[index++];
    +  }
     }
     
     public class SuppliersCollectionTest {
       public static void main(String[] args) {
    -    // The Suppliers class from the Generics chapter:
    +    // Suppliers class from the Generics chapter:
         Set set = Suppliers.create(
           LinkedHashSet::new, new Government(), 15);
         System.out.println(set);
    @@ -30,17 +33,19 @@ public static void main(String[] args) {
         System.out.println(list);
     
         // Or we can use Streams:
    -    set = Arrays.stream(Government.foundation).collect(
    -      Collectors.toSet());
    +    set = Arrays.stream(Government.foundation)
    +      .collect(Collectors.toSet());
         System.out.println(set);
    -    list = Arrays.stream(Government.foundation).collect(
    -      Collectors.toList());
    +    list = Arrays.stream(Government.foundation)
    +      .collect(Collectors.toList());
         System.out.println(list);
    -    list = Arrays.stream(Government.foundation).collect(
    -      Collectors.toCollection(LinkedList::new));
    +    list = Arrays.stream(Government.foundation)
    +      .collect(Collectors
    +        .toCollection(LinkedList::new));
         System.out.println(list);
    -    set = Arrays.stream(Government.foundation).collect(
    -      Collectors.toCollection(LinkedHashSet::new));
    +    set = Arrays.stream(Government.foundation)
    +      .collect(Collectors
    +        .toCollection(LinkedHashSet::new));
         System.out.println(set);
       }
     }
    diff --git a/collectiontopics/Synchronization.java b/collectiontopics/Synchronization.java
    index 922ee8f86..768f013df 100644
    --- a/collectiontopics/Synchronization.java
    +++ b/collectiontopics/Synchronization.java
    @@ -10,15 +10,15 @@ public static void main(String[] args) {
         Collection c =
           Collections.synchronizedCollection(
             new ArrayList<>());
    -    List list = Collections.synchronizedList(
    -      new ArrayList<>());
    -    Set s = Collections.synchronizedSet(
    -      new HashSet<>());
    -    Set ss = Collections.synchronizedSortedSet(
    -      new TreeSet<>());
    -    Map m = Collections.synchronizedMap(
    -      new HashMap<>());
    -    Map sm =
    -      Collections.synchronizedSortedMap(new TreeMap<>());
    +    List list = Collections
    +      .synchronizedList(new ArrayList<>());
    +    Set s = Collections
    +      .synchronizedSet(new HashSet<>());
    +    Set ss = Collections
    +      .synchronizedSortedSet(new TreeSet<>());
    +    Map m = Collections
    +      .synchronizedMap(new HashMap<>());
    +    Map sm = Collections
    +      .synchronizedSortedMap(new TreeMap<>());
       }
     }
    diff --git a/collectiontopics/ToDoList.java b/collectiontopics/ToDoList.java
    index 17e668cc8..8b5cb8564 100644
    --- a/collectiontopics/ToDoList.java
    +++ b/collectiontopics/ToDoList.java
    @@ -34,7 +34,8 @@ public String toString() {
     
     class ToDoList {
       public static void main(String[] args) {
    -    PriorityQueue toDo = new PriorityQueue<>();
    +    PriorityQueue toDo =
    +      new PriorityQueue<>();
         toDo.add(new ToDoItem("Empty trash", 'C', 4));
         toDo.add(new ToDoItem("Feed dog", 'A', 2));
         toDo.add(new ToDoItem("Feed bird", 'B', 7));
    diff --git a/collectiontopics/Unsupported.java b/collectiontopics/Unsupported.java
    index 0eb3c93c8..0e718671b 100644
    --- a/collectiontopics/Unsupported.java
    +++ b/collectiontopics/Unsupported.java
    @@ -6,7 +6,8 @@
     import java.util.*;
     
     public class Unsupported {
    -  static void check(String description, Runnable tst) {
    +  static void
    +  check(String description, Runnable tst) {
         try {
           tst.run();
         } catch(Exception e) {
    diff --git a/collectiontopics/Utilities.java b/collectiontopics/Utilities.java
    index 1615c72a8..c2b94bac9 100644
    --- a/collectiontopics/Utilities.java
    +++ b/collectiontopics/Utilities.java
    @@ -13,8 +13,10 @@ public static void main(String[] args) {
         System.out.println("'list' disjoint (Four)?: " +
           Collections.disjoint(list,
             Collections.singletonList("Four")));
    -    System.out.println("max: " + Collections.max(list));
    -    System.out.println("min: " + Collections.min(list));
    +    System.out.println(
    +      "max: " + Collections.max(list));
    +    System.out.println(
    +      "min: " + Collections.min(list));
         System.out.println(
           "max w/ comparator: " + Collections.max(list,
           String.CASE_INSENSITIVE_ORDER));
    @@ -45,12 +47,14 @@ public static void main(String[] args) {
         System.out.println("fill: " + list);
         System.out.println("frequency of 'pop': " +
           Collections.frequency(list, "pop"));
    -    List dups = Collections.nCopies(3, "snap");
    +    List dups =
    +      Collections.nCopies(3, "snap");
         System.out.println("dups: " + dups);
         System.out.println("'list' disjoint 'dups'?: " +
           Collections.disjoint(list, dups));
         // Getting an old-style Enumeration:
    -    Enumeration e = Collections.enumeration(dups);
    +    Enumeration e =
    +      Collections.enumeration(dups);
         Vector v = new Vector<>();
         while(e.hasMoreElements())
           v.addElement(e.nextElement());
    diff --git a/compression/GZIPcompress.java b/compression/GZIPcompress.java
    index 8b28ff9d7..77cf590d6 100644
    --- a/compression/GZIPcompress.java
    +++ b/compression/GZIPcompress.java
    @@ -8,8 +8,7 @@
     import java.io.*;
     
     public class GZIPcompress {
    -  public static void
    -  main(String[] args) throws IOException {
    +  public static void main(String[] args) {
         if(args.length == 0) {
           System.out.println(
             "Usage: \nGZIPcompress file\n" +
    @@ -29,6 +28,8 @@ public class GZIPcompress {
           int c;
           while((c = in.read()) != -1)
             out.write(c);
    +    } catch(IOException e) {
    +      throw new RuntimeException(e);
         }
         System.out.println("Reading file");
         try(
    @@ -36,9 +37,9 @@ public class GZIPcompress {
             new InputStreamReader(new GZIPInputStream(
               new FileInputStream("test.gz"))))
         ) {
    -      String s;
    -      while((s = in2.readLine()) != null)
    -        System.out.println(s);
    +      in2.lines().forEach(System.out::println);
    +    } catch(IOException e) {
    +      throw new RuntimeException(e);
         }
       }
     }
    diff --git a/compression/ZipCompress.java b/compression/ZipCompress.java
    index 0ad429257..7ac5dc985 100644
    --- a/compression/ZipCompress.java
    +++ b/compression/ZipCompress.java
    @@ -11,8 +11,7 @@
     import java.util.*;
     
     public class ZipCompress {
    -  public static void
    -  main(String[] args) throws IOException {
    +  public static void main(String[] args) {
         try(
           FileOutputStream f =
             new FileOutputStream("test.zip");
    @@ -40,6 +39,8 @@ public class ZipCompress {
           // Checksum valid only after the file is closed!
           System.out.println(
             "Checksum: " + csum.getChecksum().getValue());
    +    } catch(IOException e) {
    +      throw new RuntimeException(e);
         }
         // Now extract the files:
         System.out.println("Reading file");
    @@ -62,6 +63,8 @@ public class ZipCompress {
           if(args.length == 1)
             System.out.println(
               "Checksum: "+csumi.getChecksum().getValue());
    +    } catch(IOException e) {
    +      throw new RuntimeException(e);
         }
         // Alternative way to open and read Zip files:
         try(
    @@ -73,6 +76,8 @@ public class ZipCompress {
             System.out.println("File: " + ze2);
             // ... and extract the data as before
           }
    +    } catch(IOException e) {
    +      throw new RuntimeException(e);
         }
       }
     }
    diff --git a/concurrent/Baked.java b/concurrent/Baked.java
    index b5d7adcdf..c4b1ed0da 100644
    --- a/concurrent/Baked.java
    +++ b/concurrent/Baked.java
    @@ -9,11 +9,11 @@
     public class Baked {
       static class Pan {}
       static Pan pan(Batter b) {
    -    new Nap(100);
    +    new Nap(0.1);
         return new Pan();
       }
       static Baked heat(Pan p) {
    -    new Nap(100);
    +    new Nap(0.1);
         return new Baked();
       }
       static CompletableFuture
    diff --git a/concurrent/Batter.java b/concurrent/Batter.java
    index 6b8c5b2e5..8a814ae75 100644
    --- a/concurrent/Batter.java
    +++ b/concurrent/Batter.java
    @@ -11,7 +11,7 @@ static class Milk {}
       static class Sugar {}
       static class Flour {}
       static  T prepare(T ingredient) {
    -    new Nap(100);
    +    new Nap(0.1);
         return ingredient;
       }
       static  CompletableFuture prep(T ingredient) {
    @@ -27,7 +27,7 @@ public static CompletableFuture mix() {
         CompletableFuture
           .allOf(eggs, milk, sugar, flour)
           .join();
    -    new Nap(100); // Mixing time
    +    new Nap(0.1); // Mixing time
         return
           CompletableFuture.completedFuture(new Batter());
       }
    diff --git a/concurrent/DiningPhilosophers.java b/concurrent/DiningPhilosophers.java
    index 942779e78..13d08aca0 100644
    --- a/concurrent/DiningPhilosophers.java
    +++ b/concurrent/DiningPhilosophers.java
    @@ -27,6 +27,6 @@ public static void main(String[] args) {
         // Returns right away:
         new DiningPhilosophers(5);               // [4]
         // Keeps main() from exiting:
    -    new Nap(3000, "Shutdown");
    +    new Nap(3, "Shutdown");
       }
     }
    diff --git a/concurrent/DualCompletableOperations.java b/concurrent/DualCompletableOperations.java
    index 118c3ad9f..2c4ac45a1 100644
    --- a/concurrent/DualCompletableOperations.java
    +++ b/concurrent/DualCompletableOperations.java
    @@ -8,8 +8,8 @@
     public class DualCompletableOperations {
       static CompletableFuture cfA, cfB;
       static void init() {
    -    cfA = Workable.make("A", 150);
    -    cfB = Workable.make("B", 100); // Always wins
    +    cfA = Workable.make("A", 0.15);
    +    cfB = Workable.make("B", 0.10); // Always wins
       }
       static void join() {
         cfA.join();
    @@ -57,16 +57,16 @@ public static void main(String[] args) {
     
         init();
         CompletableFuture
    -      cfC = Workable.make("C", 75),
    -      cfD = Workable.make("D", 99);
    +      cfC = Workable.make("C", 0.08),
    +      cfD = Workable.make("D", 0.09);
         CompletableFuture.anyOf(cfA, cfB, cfC, cfD)
           .thenRunAsync(() ->
             System.out.println("anyOf"));
         join();
     
         init();
    -    cfC = Workable.make("C", 75);
    -    cfD = Workable.make("D", 99);
    +    cfC = Workable.make("C", 0.08);
    +    cfD = Workable.make("D", 0.09);
         CompletableFuture.allOf(cfA, cfB, cfC, cfD)
           .thenRunAsync(() ->
             System.out.println("allOf"));
    diff --git a/concurrent/FrostedCake.java b/concurrent/FrostedCake.java
    index e35703e50..0203e7223 100644
    --- a/concurrent/FrostedCake.java
    +++ b/concurrent/FrostedCake.java
    @@ -9,7 +9,7 @@
     class Frosting {
       private Frosting() {}
       static CompletableFuture make() {
    -    new Nap(100);
    +    new Nap(0.1);
         return CompletableFuture
           .completedFuture(new Frosting());
       }
    @@ -17,7 +17,7 @@ static CompletableFuture make() {
     
     public class FrostedCake {
       public FrostedCake(Baked baked, Frosting frosting) {
    -    new Nap(100);
    +    new Nap(0.1);
       }
       @Override
       public String toString() { return "FrostedCake"; }
    diff --git a/concurrent/GuardedIDField.java b/concurrent/GuardedIDField.java
    index 0ab48d2eb..88e5ad940 100644
    --- a/concurrent/GuardedIDField.java
    +++ b/concurrent/GuardedIDField.java
    @@ -7,7 +7,7 @@
     public class GuardedIDField implements HasID {
       private static AtomicInteger counter =
         new AtomicInteger();
    -  private int id = counter.getAndAdd(1);
    +  private int id = counter.getAndIncrement();
       public int getID() { return id; }
       public static void main(String[] args) {
         IDChecker.test(GuardedIDField::new);
    diff --git a/concurrent/Machina.java b/concurrent/Machina.java
    index ccb4a42cc..1275391fc 100644
    --- a/concurrent/Machina.java
    +++ b/concurrent/Machina.java
    @@ -17,7 +17,7 @@ State step() {
       public Machina(int id) { this.id = id; }
       public static Machina work(Machina m) {
         if(!m.state.equals(State.END)){
    -      new Nap(100);
    +      new Nap(0.1);
           m.state = m.state.step();
         }
         System.out.println(m);
    diff --git a/concurrent/NapTask.java b/concurrent/NapTask.java
    index f890cbfe8..26e17bf7a 100644
    --- a/concurrent/NapTask.java
    +++ b/concurrent/NapTask.java
    @@ -9,7 +9,7 @@ public class NapTask implements Runnable {
       public NapTask(int id) { this.id = id; }
       @Override
       public void run() {
    -    new Nap(100); // Milliseconds
    +    new Nap(0.1); // Seconds
         System.out.println(this + " " +
           Thread.currentThread().getName());
       }
    diff --git a/concurrent/Pizza.java b/concurrent/Pizza.java
    index f5684fba0..a2dfad92e 100644
    --- a/concurrent/Pizza.java
    +++ b/concurrent/Pizza.java
    @@ -13,7 +13,7 @@ public enum Step {
         Step(int effort) { this.effort = effort; }
         Step forward() {
           if(equals(BOXED)) return BOXED;
    -      new Nap(effort * 100);
    +      new Nap(effort * 0.1);
           return values()[ordinal() + 1];
         }
       }
    diff --git a/concurrent/QuittableTask.java b/concurrent/QuittableTask.java
    index 466b24809..2e473f4ea 100644
    --- a/concurrent/QuittableTask.java
    +++ b/concurrent/QuittableTask.java
    @@ -14,7 +14,7 @@ public class QuittableTask implements Runnable {
       @Override
       public void run() {
         while(running.get())         // [1]
    -      new Nap(100);
    +      new Nap(0.1);
         System.out.print(id + " ");  // [2]
       }
     }
    diff --git a/concurrent/QuittingCompletable.java b/concurrent/QuittingCompletable.java
    index 539c0998e..a4d3995cd 100644
    --- a/concurrent/QuittingCompletable.java
    +++ b/concurrent/QuittingCompletable.java
    @@ -17,7 +17,7 @@ public static void main(String[] args) {
           tasks.stream()
             .map(CompletableFuture::runAsync)
             .collect(Collectors.toList());
    -    new Nap(1000);
    +    new Nap(1);
         tasks.forEach(QuittableTask::quit);
         cfutures.forEach(CompletableFuture::join);
       }
    diff --git a/concurrent/QuittingTasks.java b/concurrent/QuittingTasks.java
    index 316d95fb3..b9825a277 100644
    --- a/concurrent/QuittingTasks.java
    +++ b/concurrent/QuittingTasks.java
    @@ -17,7 +17,7 @@ public static void main(String[] args) {
             .mapToObj(QuittableTask::new)
             .peek(qt -> es.execute(qt))
             .collect(Collectors.toList());
    -    new Nap(1000);
    +    new Nap(1);
         tasks.forEach(QuittableTask::quit);
         es.shutdown();
       }
    diff --git a/concurrent/SingleThreadExecutor.java b/concurrent/SingleThreadExecutor.java
    index e251492b9..2ef99677c 100644
    --- a/concurrent/SingleThreadExecutor.java
    +++ b/concurrent/SingleThreadExecutor.java
    @@ -19,7 +19,7 @@ public static void main(String[] args) {
           System.out.println(
             Thread.currentThread().getName() +
             " awaiting termination");
    -      new Nap(100);
    +      new Nap(0.1);
         }
       }
     }
    diff --git a/concurrent/Workable.java b/concurrent/Workable.java
    index 6c3c4083b..a04bc113c 100644
    --- a/concurrent/Workable.java
    +++ b/concurrent/Workable.java
    @@ -7,8 +7,8 @@
     
     public class Workable {
       String id;
    -  final int duration;
    -  public Workable(String id, int duration) {
    +  final double duration;
    +  public Workable(String id, double duration) {
         this.id = id;
         this.duration = duration;
       }
    @@ -17,13 +17,13 @@ public String toString() {
         return "Workable[" + id + "]";
       }
       public static Workable work(Workable tt) {
    -    new Nap(tt.duration); // Milliseconds
    +    new Nap(tt.duration); // Seconds
         tt.id = tt.id + "W";
         System.out.println(tt);
         return tt;
       }
       public static CompletableFuture
    -  make(String id, int duration) {
    +  make(String id, double duration) {
         return
           CompletableFuture.completedFuture(
             new Workable(id, duration))
    diff --git a/exceptions/WhoCalled.java b/exceptions/WhoCalled.java
    index d4a7bf9cf..f27a0bb6a 100644
    --- a/exceptions/WhoCalled.java
    +++ b/exceptions/WhoCalled.java
    @@ -9,7 +9,7 @@ static void f() {
         // Generate an exception to fill in the stack trace
         try {
           throw new Exception();
    -    } catch (Exception e) {
    +    } catch(Exception e) {
           for(StackTraceElement ste : e.getStackTrace())
             System.out.println(ste.getMethodName());
         }
    diff --git a/files/AddAndSubtractPaths.java b/files/AddAndSubtractPaths.java
    index 1cf1e8d83..c13121bab 100644
    --- a/files/AddAndSubtractPaths.java
    +++ b/files/AddAndSubtractPaths.java
    @@ -18,7 +18,7 @@ static void show(int id, Path result) {
         try {
           System.out.println("RealPath: "
             + result.toRealPath());
    -    } catch (IOException e) {
    +    } catch(IOException e) {
           System.out.println(e);
         }
       }
    diff --git a/files/PathInfo.java b/files/PathInfo.java
    index 112744f2d..fc6ba1d59 100644
    --- a/files/PathInfo.java
    +++ b/files/PathInfo.java
    @@ -33,7 +33,7 @@ public static void main(String[] args) {
         info(ap.getParent());
         try {
           info(p.toRealPath());
    -    } catch (IOException e) {
    +    } catch(IOException e) {
           System.out.println(e);
         }
         URI u = p.toUri();
    diff --git a/housekeeping/TerminationCondition.java b/housekeeping/TerminationCondition.java
    index af882ba36..2ef78ecba 100644
    --- a/housekeeping/TerminationCondition.java
    +++ b/housekeeping/TerminationCondition.java
    @@ -32,7 +32,7 @@ public static void main(String[] args) {
         new Book(true);
         // Force garbage collection & finalization:
         System.gc();
    -    new Nap(1000); // Delay
    +    new Nap(1); // One second delay
       }
     }
     /* Output:
    diff --git a/lowlevel/AttemptLocking.java b/lowlevel/AttemptLocking.java
    index 510b5e529..969143e6c 100644
    --- a/lowlevel/AttemptLocking.java
    +++ b/lowlevel/AttemptLocking.java
    @@ -43,7 +43,7 @@ public static void main(String[] args) {
             al.lock.lock();
             System.out.println("acquired");
         });
    -    new Nap(100);  // Give the second task a chance
    +    new Nap(0.1);  // Give the second task a chance
         al.untimed(); // False -- lock grabbed by task
         al.timed();   // False -- lock grabbed by task
       }
    diff --git a/lowlevel/CaptureUncaughtException.java b/lowlevel/CaptureUncaughtException.java
    index 7183ca80f..b540e341f 100644
    --- a/lowlevel/CaptureUncaughtException.java
    +++ b/lowlevel/CaptureUncaughtException.java
    @@ -39,8 +39,9 @@ public Thread newThread(Runnable r) {
     
     public class CaptureUncaughtException {
       public static void main(String[] args) {
    -    ExecutorService exec = Executors.newCachedThreadPool(
    -      new HandlerThreadFactory());
    +    ExecutorService exec =
    +      Executors.newCachedThreadPool(
    +        new HandlerThreadFactory());
         exec.execute(new ExceptionThread2());
         exec.shutdown();
       }
    diff --git a/lowlevel/MutexEvenProducer.java b/lowlevel/MutexEvenProducer.java
    index 999d0ed02..c3f98866a 100644
    --- a/lowlevel/MutexEvenProducer.java
    +++ b/lowlevel/MutexEvenProducer.java
    @@ -14,7 +14,7 @@ public int next() {
         lock.lock();
         try {
           ++currentEvenValue;
    -      new Nap(10); // Cause failure faster
    +      new Nap(0.01); // Cause failure faster
           ++currentEvenValue;
           return currentEvenValue;
         } finally {
    diff --git a/lowlevel/PriorityBlockingQueueDemo.java b/lowlevel/PriorityBlockingQueueDemo.java
    index f9159846b..93664a663 100644
    --- a/lowlevel/PriorityBlockingQueueDemo.java
    +++ b/lowlevel/PriorityBlockingQueueDemo.java
    @@ -11,7 +11,7 @@
     class Prioritized implements Comparable  {
       private static AtomicInteger counter =
         new AtomicInteger();
    -  private final int id = counter.getAndAdd(1);
    +  private final int id = counter.getAndIncrement();
       private final int priority;
       private static List sequence =
         new CopyOnWriteArrayList<>();
    @@ -55,8 +55,7 @@ public Producer(Queue q) {
       public void run() {
         rand.ints(10, 0, 20)
           .mapToObj(Prioritized::new)
    -      .peek(p -> new Nap(rand.nextInt(
    -        PriorityBlockingQueueDemo.NAPTIME)))
    +      .peek(p -> new Nap(rand.nextDouble() / 10))
           .forEach(p -> queue.add(p));
         queue.add(new Prioritized.EndSentinel());
       }
    @@ -80,8 +79,7 @@ public void run() {
               pt.displaySequence();
               break;
             }
    -        new Nap(rand.nextInt(
    -          PriorityBlockingQueueDemo.NAPTIME));
    +        new Nap(rand.nextDouble() / 10);
           } catch(InterruptedException e) {
             throw new RuntimeException(e);
           }
    @@ -90,7 +88,6 @@ public void run() {
     }
     
     public class PriorityBlockingQueueDemo {
    -  static final int NAPTIME = 50;
       public static void main(String[] args) {
         PriorityBlockingQueue queue =
           new PriorityBlockingQueue<>();
    @@ -102,42 +99,42 @@ public static void main(String[] args) {
       }
     }
     /* Output:
    -[12] Prioritized 1
    -[17] Prioritized 2
    -[15] Prioritized 0
    -[18] Prioritized 17
    -[17] Prioritized 10
    -[16] Prioritized 20
    -[16] Prioritized 16
    -[15] Prioritized 15
    -[14] Prioritized 8
    -[14] Prioritized 13
    -[13] Prioritized 12
    -[12] Prioritized 19
    -[12] Prioritized 14
    -[11] Prioritized 6
    -[11] Prioritized 22
    +[15] Prioritized 1
    +[17] Prioritized 0
    +[17] Prioritized 5
    +[16] Prioritized 6
    +[14] Prioritized 9
    +[12] Prioritized 2
     [11] Prioritized 4
    -[11] Prioritized 31
    -[10] Prioritized 30
    -[10] Prioritized 26
    -[8] Prioritized 18
    -[8] Prioritized 23
    -[8] Prioritized 9
    -[6] Prioritized 24
    -[3] Prioritized 3
    -[2] Prioritized 29
    -[1] Prioritized 7
    -[0] Prioritized 27
    -[0] Prioritized 5
    +[11] Prioritized 12
    +[13] Prioritized 13
    +[12] Prioritized 16
    +[14] Prioritized 18
    +[15] Prioritized 23
    +[18] Prioritized 26
    +[16] Prioritized 29
    +[12] Prioritized 17
    +[11] Prioritized 30
    +[11] Prioritized 24
    +[10] Prioritized 15
    +[10] Prioritized 22
    +[8] Prioritized 25
    +[8] Prioritized 11
    +[8] Prioritized 10
    +[6] Prioritized 31
    +[3] Prioritized 7
    +[2] Prioritized 20
    +[1] Prioritized 3
    +[0] Prioritized 19
    +[0] Prioritized 8
    +[0] Prioritized 14
     [0] Prioritized 21
    -[0] Prioritized 11
    -[-1] Prioritized 25
    -(0:15)(2:17)(1:12)(3:3)(4:11)
    -(5:0)(6:11)(7:1)(8:14)(9:8)
    -(10:17)(11:0)(12:13)(13:14)(14:12)
    -(15:15)(16:16)(17:18)(18:8)(19:12)
    -(20:16)(21:0)(22:11)(23:8)(24:6)
    -(25:-1)(26:10)(27:0)(28:-1)(29:2)
    -(30:10)(31:11)(32:-1)
    +[-1] Prioritized 28
    +(0:17)(2:12)(1:15)(3:1)(4:11)
    +(5:17)(6:16)(7:3)(8:0)(9:14)
    +(10:8)(11:8)(12:11)(13:13)(14:0)
    +(15:10)(16:12)(17:12)(18:14)(19:0)
    +(20:2)(21:0)(22:10)(23:15)(24:11)
    +(25:8)(26:18)(27:-1)(28:-1)(29:16)
    +(30:11)(31:6)(32:-1)
     */
    diff --git a/lowlevel/SerialNumberChecker.java b/lowlevel/SerialNumberChecker.java
    index f03c28542..72ab795f0 100644
    --- a/lowlevel/SerialNumberChecker.java
    +++ b/lowlevel/SerialNumberChecker.java
    @@ -27,6 +27,6 @@ static void test(SerialNumbers producer) {
         for(int i = 0; i < 10; i++)
           CompletableFuture.runAsync(
             new SerialNumberChecker(producer));
    -    new Nap(4000, "No duplicates detected");
    +    new Nap(4, "No duplicates detected");
       }
     }
    diff --git a/lowlevel/SyncOnObject.java b/lowlevel/SyncOnObject.java
    index 6151bb5cf..0d0ff1526 100644
    --- a/lowlevel/SyncOnObject.java
    +++ b/lowlevel/SyncOnObject.java
    @@ -14,7 +14,7 @@ class DualSynch {
       public synchronized void f(boolean nap) {
         for(int i = 0; i < 5; i++) {
           trace.add(String.format("f() " + i));
    -      if(nap) new Nap(10);
    +      if(nap) new Nap(0.01);
         }
       }
       private Object syncObject = new Object();
    @@ -22,7 +22,7 @@ public void g(boolean nap) {
         synchronized(syncObject) {
           for(int i = 0; i < 5; i++) {
             trace.add(String.format("g() " + i));
    -        if(nap) new Nap(10);
    +        if(nap) new Nap(0.01);
           }
         }
       }
    diff --git a/lowlevel/SynchronizedComparison.java b/lowlevel/SynchronizedComparison.java
    index 62a38305c..a76a62b56 100644
    --- a/lowlevel/SynchronizedComparison.java
    +++ b/lowlevel/SynchronizedComparison.java
    @@ -22,14 +22,14 @@ public String toString() {
     
     class SynchronizedMethod extends Guarded {
       public synchronized void method() {
    -    new Nap(10);
    +    new Nap(0.01);
         callCount.incrementAndGet();
       }
     }
     
     class CriticalSection extends Guarded {
       public void method() {
    -    new Nap(10);
    +    new Nap(0.01);
         synchronized(this) {
           callCount.incrementAndGet();
         }
    diff --git a/lowlevel/SynchronizedEvenProducer.java b/lowlevel/SynchronizedEvenProducer.java
    index 0c922f7d7..b6f4f4843 100644
    --- a/lowlevel/SynchronizedEvenProducer.java
    +++ b/lowlevel/SynchronizedEvenProducer.java
    @@ -11,7 +11,7 @@
       @Override
       public synchronized int next() {
         ++currentEvenValue;
    -    new Nap(10); // Cause failure faster
    +    new Nap(0.01); // Cause failure faster
         ++currentEvenValue;
         return currentEvenValue;
       }
    diff --git a/lowlevel/TestAbort.java b/lowlevel/TestAbort.java
    index 82f36c93c..2c38fc5c7 100644
    --- a/lowlevel/TestAbort.java
    +++ b/lowlevel/TestAbort.java
    @@ -8,7 +8,7 @@ public class TestAbort {
       public static void main(String[] args) {
         new TimedAbort(1);
         System.out.println("Napping for 4");
    -    new Nap(4000);
    +    new Nap(4);
       }
     }
     /* Output:
    diff --git a/lowlevel/ThreadSize.java b/lowlevel/ThreadSize.java
    index 2865694a1..522ff717e 100644
    --- a/lowlevel/ThreadSize.java
    +++ b/lowlevel/ThreadSize.java
    @@ -9,7 +9,7 @@
     public class ThreadSize {
       static class Dummy extends Thread {
         @Override
    -    public void run() { new Nap(1000); }
    +    public void run() { new Nap(1); }
       }
       public static void main(String[] args) {
         ExecutorService exec =
    diff --git a/network/ChatterClient.java b/network/ChatterClient.java
    index 3d32c017b..e545df71b 100644
    --- a/network/ChatterClient.java
    +++ b/network/ChatterClient.java
    @@ -3,7 +3,6 @@
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Starts multiple clients, each of which sends datagrams.
    -package network;
     import java.net.*;
     import java.io.*;
     
    diff --git a/network/ChatterServer.java b/network/ChatterServer.java
    index 13022e034..181b75fdd 100644
    --- a/network/ChatterServer.java
    +++ b/network/ChatterServer.java
    @@ -3,7 +3,6 @@
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // A server that echoes datagrams
    -package network;
     import java.net.*;
     import java.io.*;
     
    @@ -12,7 +11,7 @@ public class ChatterServer implements Runnable {
       private byte[] buf = new byte[1000];
       private DatagramPacket dp =
         new DatagramPacket(buf, buf.length);
    -
    +  @Override
       public void run() {
         // Can listen & send on the same socket:
         try (
    diff --git a/network/Dgram.java b/network/Dgram.java
    index 342113770..9fbd774d1 100644
    --- a/network/Dgram.java
    +++ b/network/Dgram.java
    @@ -3,7 +3,6 @@
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Converts between Strings and DataGramPackets
    -package network;
     import java.net.*;
     
     public class Dgram {
    diff --git a/network/Local.java b/network/Local.java
    new file mode 100644
    index 000000000..35202670e
    --- /dev/null
    +++ b/network/Local.java
    @@ -0,0 +1,15 @@
    +// network/Local.java
    +// (c)2017 MindView LLC: see Copyright.txt
    +// We make no guarantees that this code is fit for any purpose.
    +// Visit http://OnJava8.com for more book information.
    +import java.net.*;
    +
    +public class Local {
    +  public static InetAddress host() {
    +    try {
    +      return InetAddress.getByName(null);
    +    } catch(UnknownHostException e) {
    +      throw new RuntimeException(e);
    +    }
    +  }
    +}
    diff --git a/network/MultiServer.java b/network/MultiServer.java
    index 9e5568a3e..54d005eb6 100644
    --- a/network/MultiServer.java
    +++ b/network/MultiServer.java
    @@ -2,21 +2,20 @@
     // (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
    -// Uses threads to handle any number of clients.
    -package network;
    +// Uses concurrency to handle any number of clients.
     import java.io.*;
     import java.net.*;
    -import java.util.concurrent.ExecutorService;
    -import java.util.concurrent.Executors;
    +import java.util.concurrent.*;
     
     class ServeOne implements Runnable {
    -  private ServerSocket ss;
       static final int PORT = 8080;
    -  public ServeOne(ServerSocket ss) throws IOException {
    +  private ServerSocket ss;
    +  public ServeOne(ServerSocket ss) {
         this.ss = ss;
       }
       @Override
       public void run() {
    +    System.out.println("Starting ServeOne");
         try (
           Socket socket = ss.accept();
           BufferedReader in =
    @@ -31,29 +30,33 @@ public void run() {
                   socket.getOutputStream())), true)
         ) {
           in.lines().anyMatch(message -> {
    -        if (message.equals("END")) {
    -          System.out.println("Received END. Closing Socket.");
    +        if(message.equals("END")) {
    +          System.out.println(
    +            "Received END. Closing Socket.");
               return true;
             }
    -        System.out.println("Message  : " + message);
    +        System.out.println(
    +          "Message  : " + message);
             out.println(message);
             return false;
           });
    -    } catch (IOException e) {
    +    } catch(IOException e) {
           throw new RuntimeException(e);
         }
       }
     }
     
     public class MultiServer implements Runnable {
    -  private ExecutorService pool;
    +  @Override
       public void run() {
    -    pool = Executors.newFixedThreadPool(30);
    -    try (ServerSocket ss = new ServerSocket(ServeOne.PORT)) {
    -      while (true) {
    -        pool.submit(new ServeOne(ss));
    -      }
    -    } catch (IOException e) {
    +    System.out.println("Running MultiServer");
    +    try (
    +      ServerSocket ss =
    +        new ServerSocket(ServeOne.PORT)
    +    ) {
    +      while(true)
    +        CompletableFuture.runAsync(new ServeOne(ss));
    +    } catch(IOException e) {
           throw new RuntimeException(e);
         }
       }
    diff --git a/network/SimpleClient.java b/network/SimpleClient.java
    index 117ad8fd9..de144706f 100644
    --- a/network/SimpleClient.java
    +++ b/network/SimpleClient.java
    @@ -4,7 +4,6 @@
     // Visit http://OnJava8.com for more book information.
     // Sends lines to the server and
     // reads lines the server sends.
    -package network;
     import java.net.*;
     import java.io.*;
     
    @@ -13,10 +12,12 @@ public class SimpleClient implements Runnable {
       public SimpleClient(InetAddress hostAddress) {
         this.hostAddress = hostAddress;
       }
    +  @Override
       public void run() {
         System.out.println("hostAddress = " + hostAddress);
         try (
    -      Socket socket = new Socket(hostAddress, SimpleServer.PORT);
    +      Socket socket =
    +        new Socket(hostAddress, SimpleServer.PORT);
           BufferedReader in =
             new BufferedReader(
               new InputStreamReader(
    @@ -35,7 +36,7 @@ public void run() {
             System.out.println("client Message : " + str);
           }
           out.println("END");
    -    } catch (IOException e) {
    +    } catch(IOException e) {
           throw new RuntimeException(e);
         }
       }
    diff --git a/network/SimpleClient2.java b/network/SimpleClient2.java
    index b6a990dc6..cdb747228 100644
    --- a/network/SimpleClient2.java
    +++ b/network/SimpleClient2.java
    @@ -2,7 +2,6 @@
     // (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
    -package network;
     import java.net.*;
     import java.io.*;
     
    @@ -10,17 +9,13 @@ public class SimpleClient2 implements Runnable {
       private InetAddress address;
       private static int counter = 0;
       private int id = counter++;
    -  private static int threadcount = 0;
    -  public static int threadCount() {
    -    return threadcount;
    -  }
       public SimpleClient2(InetAddress address) {
         System.out.println("Making client " + id);
         this.address = address;
    -    threadcount++;
       }
       @Override
       public void run() {
    +    System.out.println("Running client " + id);
         try (
           Socket socket =
             new Socket(address, ServeOne.PORT);
    @@ -41,10 +36,8 @@ public void run() {
             System.out.println(str);
           }
           out.println("END");
    -    } catch (IOException ex) {
    +    } catch(IOException ex) {
             throw new RuntimeException(ex);
    -    } finally {
    -      threadcount--; // Ending this thread
         }
       }
     }
    diff --git a/network/SimpleServer.java b/network/SimpleServer.java
    index 03d657cdc..73a0b4bd3 100644
    --- a/network/SimpleServer.java
    +++ b/network/SimpleServer.java
    @@ -3,14 +3,13 @@
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Echoes what the client sends.
    -package network;
     import java.io.*;
     import java.net.*;
     
     public class SimpleServer implements Runnable {
       // Choose a port outside of the range 1-1024:
       public static final int PORT = 8080;
    -
    +  @Override
       public void run() {
         try (
           ServerSocket s = new ServerSocket(PORT);
    @@ -30,14 +29,16 @@ public void run() {
           System.out.println("Connection: " + socket);
           in.lines().anyMatch(message->{
             if (message.equals("END")) {
    -          System.out.println("Received END. Closing Socket.");
    +          System.out.println(
    +            "Received END. Closing Socket.");
               return true;
             }
    -        System.out.println("Server Response: " + message);
    +        System.out.println(
    +          "Server Response: " + message);
             out.println(message);
             return false;
           });
    -    } catch (IOException e) {
    +    } catch(IOException e) {
           throw new RuntimeException(e);
         }
       }
    diff --git a/network/TestChatter.java b/network/TestChatter.java
    new file mode 100644
    index 000000000..b801bf7bb
    --- /dev/null
    +++ b/network/TestChatter.java
    @@ -0,0 +1,18 @@
    +// network/TestChatter.java
    +// (c)2017 MindView LLC: see Copyright.txt
    +// We make no guarantees that this code is fit for any purpose.
    +// Visit http://OnJava8.com for more book information.
    +import java.util.concurrent.*;
    +import java.net.*;
    +import onjava.Nap;
    +
    +public class TestChatter {
    +  public static void main(String[] args) {
    +    CompletableFuture.runAsync(
    +      new ChatterServer());
    +    CompletableFuture.runAsync(
    +      new ChatterClient(Local.host()));
    +    new Nap(1);
    +    // No exceptions means success
    +  }
    +}
    diff --git a/network/TestMultiServer.java b/network/TestMultiServer.java
    new file mode 100644
    index 000000000..7fbf36e66
    --- /dev/null
    +++ b/network/TestMultiServer.java
    @@ -0,0 +1,19 @@
    +// network/TestMultiServer.java
    +// (c)2017 MindView LLC: see Copyright.txt
    +// We make no guarantees that this code is fit for any purpose.
    +// Visit http://OnJava8.com for more book information.
    +import java.net.*;
    +import java.util.concurrent.*;
    +import onjava.Nap;
    +
    +public class TestMultiServer {
    +  public static void main(String[] args) {
    +    CompletableFuture.runAsync(new MultiServer());
    +    for(int i = 0; i < 10; i++) {
    +      CompletableFuture.runAsync(
    +        new SimpleClient2(Local.host()));
    +    }
    +    new Nap(2);
    +    // No exceptions mean success
    +  }
    +}
    diff --git a/network/TestSimpleServerClient.java b/network/TestSimpleServerClient.java
    new file mode 100644
    index 000000000..055be581a
    --- /dev/null
    +++ b/network/TestSimpleServerClient.java
    @@ -0,0 +1,18 @@
    +// network/TestSimpleServerClient.java
    +// (c)2017 MindView LLC: see Copyright.txt
    +// We make no guarantees that this code is fit for any purpose.
    +// Visit http://OnJava8.com for more book information.
    +import java.net.*;
    +import java.util.concurrent.*;
    +import onjava.Nap;
    +
    +public class TestSimpleServerClient {
    +  public static void main(String[] args) {
    +    CompletableFuture.runAsync(
    +      new SimpleServer());
    +    CompletableFuture.runAsync(
    +      new SimpleClient(Local.host()));
    +    new Nap(1);
    +    // Success if no exceptions happen
    +  }
    +}
    diff --git a/network/WhoAmI.java b/network/WhoAmI.java
    index 773c1cbd4..c636a7ccc 100644
    --- a/network/WhoAmI.java
    +++ b/network/WhoAmI.java
    @@ -7,7 +7,7 @@
     
     public class WhoAmI {
       public static void
    -  main(String[] args) throws Exception {
    +  main(String[] args) throws UnknownHostException {
         InetAddress whoami = InetAddress.getLocalHost();
         System.out.println(whoami.getHostName());
         System.out.println(whoami.getHostAddress());
    diff --git a/network/tests/ChatterTest.java b/network/tests/ChatterTest.java
    deleted file mode 100644
    index 806c9977f..000000000
    --- a/network/tests/ChatterTest.java
    +++ /dev/null
    @@ -1,21 +0,0 @@
    -// network/tests/ChatterTest.java
    -// (c)2017 MindView LLC: see Copyright.txt
    -// We make no guarantees that this code is fit for any purpose.
    -// Visit http://OnJava8.com for more book information.
    -package network;
    -import java.net.*;
    -import org.junit.jupiter.api.*;
    -
    -public class ChatterTest {
    -  @BeforeAll
    -  static void startMsg() {
    -    System.out.println(">>> ChatterTest");
    -  }
    -  @Test
    -  void chatterTest() throws Exception {
    -    // <* These must be handed to an executor: *>
    -    new ChatterServer();
    -    new ChatterClient(InetAddress.getLocalHost());
    -    // No exceptions means success
    -  }
    -}
    diff --git a/network/tests/MultiTest.java b/network/tests/MultiTest.java
    deleted file mode 100644
    index 9178de2fe..000000000
    --- a/network/tests/MultiTest.java
    +++ /dev/null
    @@ -1,27 +0,0 @@
    -// network/tests/MultiTest.java
    -// (c)2017 MindView LLC: see Copyright.txt
    -// We make no guarantees that this code is fit for any purpose.
    -// Visit http://OnJava8.com for more book information.
    -package network;
    -import java.net.*;
    -import java.util.concurrent.*;
    -import org.junit.jupiter.api.*;
    -
    -public class MultiTest {
    -  @BeforeAll
    -  static void startMsg() {
    -    System.out.println(">>> MultiClientTest");
    -  }
    -  @Test
    -  void multiTest() throws Exception {
    -    final int MAX_THREADS = 40;
    -    new MultiServer();
    -    InetAddress address = InetAddress.getByName(null);
    -    while(true) {
    -      if(SimpleClient2.threadCount() < MAX_THREADS)
    -        new SimpleClient2(address);
    -      TimeUnit.MILLISECONDS.sleep(100);
    -    }
    -    // No exceptions mean success
    -  }
    -}
    diff --git a/network/tests/TestSimpleServerClient.java b/network/tests/TestSimpleServerClient.java
    deleted file mode 100644
    index 7218eced2..000000000
    --- a/network/tests/TestSimpleServerClient.java
    +++ /dev/null
    @@ -1,20 +0,0 @@
    -// network/tests/TestSimpleServerClient.java
    -// (c)2017 MindView LLC: see Copyright.txt
    -// We make no guarantees that this code is fit for any purpose.
    -// Visit http://OnJava8.com for more book information.
    -package network;
    -import java.net.*;
    -import org.junit.jupiter.api.*;
    -
    -public class TestSimpleServerClient {
    -  @BeforeAll
    -  static void startMsg() {
    -    System.out.println(">>> TestSimpleServerClient");
    -  }
    -  @Test
    -  void basicTest() throws Exception {
    -    SimpleServer server = new SimpleServer();
    -    SimpleClient client = new SimpleClient(InetAddress.getLocalHost());
    -    // Success if no exceptions happen
    -  }
    -}
    diff --git a/onjava/CountMap.java b/onjava/CountMap.java
    index 5d7327995..71fe527ce 100644
    --- a/onjava/CountMap.java
    +++ b/onjava/CountMap.java
    @@ -37,7 +37,9 @@ public boolean equals(Object o) {
         @Override
         public Integer getKey() { return index; }
         @Override
    -    public String getValue() { return value(index); }
    +    public String getValue() {
    +      return value(index);
    +    }
         @Override
         public String setValue(String value) {
           throw new UnsupportedOperationException();
    @@ -52,8 +54,8 @@ public Set> entrySet() {
         // LinkedHashSet retains initialization order:
         return IntStream.range(0, size)
           .mapToObj(Entry::new)
    -      .collect(
    -        Collectors.toCollection(LinkedHashSet::new));
    +      .collect(Collectors
    +        .toCollection(LinkedHashSet::new));
       }
       public static void main(String[] args) {
         final int LIM = 6;
    diff --git a/onjava/CountingIntegerList.java b/onjava/CountingIntegerList.java
    index b7d9e4e8d..f55aa043c 100644
    --- a/onjava/CountingIntegerList.java
    +++ b/onjava/CountingIntegerList.java
    @@ -21,7 +21,8 @@ public Integer get(int index) {
       @Override
       public int size() { return size; }
       public static void main(String[] args) {
    -    List cil = new CountingIntegerList(30);
    +    List cil =
    +      new CountingIntegerList(30);
         System.out.println(cil);
         System.out.println(cil.get(500));
       }
    diff --git a/onjava/Countries.java b/onjava/Countries.java
    index 7d077b5e5..fc82676dc 100644
    --- a/onjava/Countries.java
    +++ b/onjava/Countries.java
    @@ -275,7 +275,8 @@ Iterator> iterator() {
             return new Iter();
           }
         }
    -    private static Set> entries =
    +    private static
    +    Set> entries =
           new EntrySet(DATA.length);
         @Override
         public Set> entrySet() {
    diff --git a/onjava/FillMap.java b/onjava/FillMap.java
    index 33d202e1e..9b87bc1f2 100644
    --- a/onjava/FillMap.java
    +++ b/onjava/FillMap.java
    @@ -12,8 +12,8 @@ public class FillMap {
       basic(Supplier> pairGen, int size) {
         return Stream.generate(pairGen)
           .limit(size)
    -      .collect(
    -        Collectors.toMap(Pair::key, Pair::value));
    +      .collect(Collectors
    +        .toMap(Pair::key, Pair::value));
       }
       public static  Map
       basic(Supplier keyGen,
    @@ -21,18 +21,18 @@ public class FillMap {
         return Stream.generate(
           () -> Pair.make(keyGen.get(), valueGen.get()))
           .limit(size)
    -      .collect(
    -        Collectors.toMap(Pair::key, Pair::value));
    +      .collect(Collectors
    +        .toMap(Pair::key, Pair::value));
       }
       public static >
       M create(Supplier keyGen,
                Supplier valueGen,
                Supplier mapSupplier, int size) {
    -    return Stream.generate(
    -      () -> Pair.make(keyGen.get(), valueGen.get()))
    -      .limit(size)
    -      .collect(
    -        Collectors.toMap(Pair::key, Pair::value,
    -                         (k, v) -> k, mapSupplier));
    +    return Stream.generate( () ->
    +      Pair.make(keyGen.get(), valueGen.get()))
    +        .limit(size)
    +        .collect(Collectors
    +          .toMap(Pair::key, Pair::value,
    +                 (k, v) -> k, mapSupplier));
       }
     }
    diff --git a/onjava/HTMLColors.java b/onjava/HTMLColors.java
    index 5dea21def..0f773983c 100644
    --- a/onjava/HTMLColors.java
    +++ b/onjava/HTMLColors.java
    @@ -186,7 +186,8 @@ public static Integer rgb(String colorName) {
         Arrays.stream(ARRAY)
           .map(item -> (Integer)item[0])
           .collect(Collectors.toList());
    -  public static void show(Map.Entry e) {
    +  public static
    +  void show(Map.Entry e) {
         System.out.format(
           "0x%06X: %s\n", e.getKey(), e.getValue());
       }
    diff --git a/onjava/Nap.java b/onjava/Nap.java
    index 13516694a..bb76d32b6 100644
    --- a/onjava/Nap.java
    +++ b/onjava/Nap.java
    @@ -2,14 +2,22 @@
     // (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
    -// Sleep for n milliseconds
     package onjava;
     import java.util.concurrent.*;
     
     public class Nap {
    +  // Seconds:
       public Nap(int n) {
         try {
    -      TimeUnit.MILLISECONDS.sleep(n);
    +      TimeUnit.SECONDS.sleep(n);
    +    } catch(InterruptedException e) {
    +      throw new RuntimeException(e);
    +    }
    +  }
    +  // Fractions of a second:
    +  public Nap(double d) {
    +    try {
    +      TimeUnit.MILLISECONDS.sleep((int)(1000 * d));
         } catch(InterruptedException e) {
           throw new RuntimeException(e);
         }
    @@ -18,4 +26,8 @@ public Nap(int n, String msg) {
         this(n);
         System.out.println(msg);
       }
    +  public Nap(double d, String msg) {
    +    this(d);
    +    System.out.println(msg);
    +  }
     }
    diff --git a/onjava/atunit/AtUnit.java b/onjava/atunit/AtUnit.java
    index ee6528df2..19d29d146 100644
    --- a/onjava/atunit/AtUnit.java
    +++ b/onjava/atunit/AtUnit.java
    @@ -146,7 +146,8 @@ private static Method checkForCleanupMethod(Method m) {
         m.setAccessible(true);
         return m;
       }
    -  private static Object createTestObject(Method creator) {
    +  private static Object
    +  createTestObject(Method creator) {
         if(creator != null) {
           try {
             return creator.invoke(testClass);
    @@ -161,8 +162,9 @@ private static Object createTestObject(Method creator) {
             return testClass.newInstance();
           } catch(InstantiationException |
                   IllegalAccessException e) {
    -        throw new RuntimeException("Couldn't create a " +
    -          "test object. Try using a @TestObject method.");
    +        throw new RuntimeException(
    +          "Couldn't create a test object. " +
    +          "Try using a @TestObject method.");
           }
         }
       }
    diff --git a/patterns/state/StateMachineDemo.java b/patterns/state/StateMachineDemo.java
    index 24f21262c..de84445c9 100644
    --- a/patterns/state/StateMachineDemo.java
    +++ b/patterns/state/StateMachineDemo.java
    @@ -27,7 +27,7 @@ class Wash implements State {
       @Override
       public void run() {
         System.out.println("Washing");
    -    new Nap(500);
    +    new Nap(0.5);
       }
     }
     
    @@ -35,7 +35,7 @@ class Spin implements State {
       @Override
       public void run() {
         System.out.println("Spinning");
    -    new Nap(500);
    +    new Nap(0.5);
       }
     }
     
    @@ -43,7 +43,7 @@ class Rinse implements State {
       @Override
       public void run() {
         System.out.println("Rinsing");
    -    new Nap(500);
    +    new Nap(0.5);
       }
     }
     
    diff --git a/remote/DisplayPerfectTime.java b/remote/DisplayPerfectTime.java
    index 333b3bce7..c3556b324 100644
    --- a/remote/DisplayPerfectTime.java
    +++ b/remote/DisplayPerfectTime.java
    @@ -15,6 +15,7 @@ public class DisplayPerfectTime {
         PerfectTime pt =
           (PerfectTime)reg.lookup("PerfectTime");
         for(int i = 0; i < 10; i++)
    -      System.out.println("Time: "+ pt.getPerfectTime());
    +      System.out.println(
    +        "Time: "+ pt.getPerfectTime());
       }
     }
    diff --git a/serialization/APerson.java b/serialization/APerson.java
    index 7faabd0d7..fa9f2b951 100644
    --- a/serialization/APerson.java
    +++ b/serialization/APerson.java
    @@ -3,7 +3,7 @@
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Use the XOM library to write and read XML
    -// You must install nu.xom.Node from http://www.xom.nu
    +// nu.xom.Node comes from http://www.xom.nu
     import nu.xom.*;
     import java.io.*;
     import java.util.*;
    @@ -25,18 +25,21 @@ public Element getXML() {
         person.appendChild(lastName);
         return person;
       }
    -  // Constructor restores a APerson from an XML Element:
    +  // Constructor restores a APerson from XML:
       public APerson(Element person) {
    -    first =
    -      person.getFirstChildElement("first").getValue();
    -    last =
    -      person.getFirstChildElement("last").getValue();
    +    first = person
    +      .getFirstChildElement("first").getValue();
    +    last = person
    +      .getFirstChildElement("last").getValue();
       }
       @Override
    -  public String toString() { return first + " " + last; }
    +  public String toString() {
    +    return first + " " + last;
    +  }
       // Make it human-readable:
       public static void
    -  format(OutputStream os, Document doc) throws Exception {
    +  format(OutputStream os, Document doc)
    +  throws Exception {
         Serializer serializer =
           new Serializer(os,"ISO-8859-1");
         serializer.setIndent(4);
    diff --git a/serialization/AStoreCADState.java b/serialization/AStoreCADState.java
    index ef903780a..7b66507f0 100644
    --- a/serialization/AStoreCADState.java
    +++ b/serialization/AStoreCADState.java
    @@ -5,23 +5,25 @@
     // Saving the state of a fictitious CAD system
     import java.io.*;
     import java.util.*;
    +import java.util.stream.*;
    +
    +enum Color { RED, BLUE, GREEN }
     
     abstract class Shape implements Serializable {
    -  public static final int RED = 1, BLUE = 2, GREEN = 3;
       private int xPos, yPos, dimension;
    -  private static SplittableRandom rand = new SplittableRandom(47);
    +  private static Random rand = new Random(47);
       private static int counter = 0;
    -  public abstract void setColor(int newColor);
    -  public abstract int getColor();
    +  public abstract void setColor(Color newColor);
    +  public abstract Color getColor();
       public Shape(int xVal, int yVal, int dim) {
         xPos = xVal;
         yPos = yVal;
         dimension = dim;
       }
       public String toString() {
    -    return getClass() +
    -      "color[" + getColor() + "] xPos[" + xPos +
    -      "] yPos[" + yPos + "] dim[" + dimension + "]\n";
    +    return getClass() + "color[" + getColor() +
    +      "] xPos[" + xPos + "] yPos[" + yPos +
    +      "] dim[" + dimension + "]\n";
       }
       public static Shape randomFactory() {
         int xVal = rand.nextInt(100);
    @@ -37,55 +39,56 @@ public static Shape randomFactory() {
     }
     
     class Circle extends Shape {
    -  private static int color = RED;
    +  private static Color color = Color.RED;
       public Circle(int xVal, int yVal, int dim) {
         super(xVal, yVal, dim);
       }
    -  public void setColor(int newColor) { color = newColor; }
    -  public int getColor() { return color; }
    +  public void setColor(Color newColor) {
    +    color = newColor;
    +  }
    +  public Color getColor() { return color; }
     }
     
     class Square extends Shape {
    -  private static int color;
    +  private static Color color = Color.RED;
       public Square(int xVal, int yVal, int dim) {
         super(xVal, yVal, dim);
    -    color = RED;
       }
    -  public void setColor(int newColor) { color = newColor; }
    -  public int getColor() { return color; }
    +  public void setColor(Color newColor) {
    +    color = newColor;
    +  }
    +  public Color getColor() { return color; }
     }
     
     class Line extends Shape {
    -  private static int color = RED;
    +  private static Color color = Color.RED;
       public static void
       serializeStaticState(ObjectOutputStream os)
    -  throws IOException { os.writeInt(color); }
    +  throws IOException { os.writeObject(color); }
       public static void
       deserializeStaticState(ObjectInputStream os)
    -  throws IOException { color = os.readInt(); }
    +  throws IOException, ClassNotFoundException {
    +    color = (Color)os.readObject();
    +  }
       public Line(int xVal, int yVal, int dim) {
         super(xVal, yVal, dim);
       }
    -  public void setColor(int newColor) { color = newColor; }
    -  public int getColor() { return color; }
    +  public void setColor(Color newColor) {
    +    color = newColor;
    +  }
    +  public Color getColor() { return color; }
     }
     
     public class AStoreCADState {
    -  public static void
    -  main(String[] args) throws Exception {
    +  public static void main(String[] args) {
         List> shapeTypes =
    -      new ArrayList<>();
    -    // Add references to the class objects:
    -    shapeTypes.add(Circle.class);
    -    shapeTypes.add(Square.class);
    -    shapeTypes.add(Line.class);
    -    List shapes = new ArrayList<>();
    -    // Make some shapes:
    -    for(int i = 0; i < 10; i++)
    -      shapes.add(Shape.randomFactory());
    +      Arrays.asList(
    +        Circle.class, Square.class, Line.class);
    +    List shapes = IntStream.range(0, 10)
    +      .mapToObj(i -> Shape.randomFactory())
    +      .collect(Collectors.toList());
         // Set all the static colors to GREEN:
    -    for(int i = 0; i < 10; i++)
    -      ((Shape)shapes.get(i)).setColor(Shape.GREEN);
    +    shapes.forEach(s -> s.setColor(Color.GREEN));
         // Save the state vector:
         try(
           ObjectOutputStream out =
    @@ -95,21 +98,23 @@ public class AStoreCADState {
           out.writeObject(shapeTypes);
           Line.serializeStaticState(out);
           out.writeObject(shapes);
    +    } catch(IOException e) {
    +      throw new RuntimeException(e);
         }
         // Display the shapes:
         System.out.println(shapes);
       }
     }
     /* Output:
    -[class Circlecolor[3] xPos[35] yPos[37] dim[41]
    -, class Squarecolor[3] xPos[20] yPos[77] dim[79]
    -, class Linecolor[3] xPos[56] yPos[68] dim[48]
    -, class Circlecolor[3] xPos[93] yPos[70] dim[7]
    -, class Squarecolor[3] xPos[0] yPos[25] dim[62]
    -, class Linecolor[3] xPos[34] yPos[50] dim[82]
    -, class Circlecolor[3] xPos[31] yPos[67] dim[66]
    -, class Squarecolor[3] xPos[54] yPos[21] dim[6]
    -, class Linecolor[3] xPos[63] yPos[39] dim[63]
    -, class Circlecolor[3] xPos[13] yPos[90] dim[92]
    +[class Circlecolor[GREEN] xPos[58] yPos[55] dim[93]
    +, class Squarecolor[GREEN] xPos[61] yPos[61] dim[29]
    +, class Linecolor[GREEN] xPos[68] yPos[0] dim[22]
    +, class Circlecolor[GREEN] xPos[7] yPos[88] dim[28]
    +, class Squarecolor[GREEN] xPos[51] yPos[89] dim[9]
    +, class Linecolor[GREEN] xPos[78] yPos[98] dim[61]
    +, class Circlecolor[GREEN] xPos[20] yPos[58] dim[16]
    +, class Squarecolor[GREEN] xPos[40] yPos[11] dim[22]
    +, class Linecolor[GREEN] xPos[4] yPos[83] dim[6]
    +, class Circlecolor[GREEN] xPos[75] yPos[10] dim[42]
     ]
     */
    diff --git a/serialization/Blip3.java b/serialization/Blip3.java
    index 41b0e9ed2..4c141def2 100644
    --- a/serialization/Blip3.java
    +++ b/serialization/Blip3.java
    @@ -36,9 +36,7 @@ public void readExternal(ObjectInput in)
         s = (String)in.readObject();
         i = in.readInt();
       }
    -  public static void
    -  main(String[] args) throws IOException,
    -  ClassNotFoundException {
    +  public static void main(String[] args) {
         System.out.println("Constructing objects:");
         Blip3 b3 = new Blip3("A String ", 47);
         System.out.println(b3);
    @@ -48,6 +46,8 @@ public void readExternal(ObjectInput in)
         ) {
           System.out.println("Saving object:");
           o.writeObject(b3);
    +    } catch(IOException e) {
    +      throw new RuntimeException(e);
         }
         // Now get it back:
         System.out.println("Recovering b3:");
    @@ -56,6 +56,8 @@ public void readExternal(ObjectInput in)
             new FileInputStream("Blip3.serialized"))
         ) {
           b3 = (Blip3)in.readObject();
    +    } catch(IOException | ClassNotFoundException e) {
    +      throw new RuntimeException(e);
         }
         System.out.println(b3);
       }
    diff --git a/serialization/Blips.java b/serialization/Blips.java
    index 8a9f17a00..4a98f1237 100644
    --- a/serialization/Blips.java
    +++ b/serialization/Blips.java
    @@ -38,9 +38,7 @@ public void readExternal(ObjectInput in)
     }
     
     public class Blips {
    -  public static void
    -  main(String[] args) throws IOException,
    -  ClassNotFoundException {
    +  public static void main(String[] args) {
         System.out.println("Constructing objects:");
         Blip1 b1 = new Blip1();
         Blip2 b2 = new Blip2();
    @@ -51,6 +49,8 @@ public class Blips {
           System.out.println("Saving objects:");
           o.writeObject(b1);
           o.writeObject(b2);
    +    } catch(IOException e) {
    +      throw new RuntimeException(e);
         }
         // Now get them back:
         System.out.println("Recovering b1:");
    @@ -59,6 +59,8 @@ public class Blips {
             new FileInputStream("Blips.serialized"))
         ) {
           b1 = (Blip1)in.readObject();
    +    } catch(IOException | ClassNotFoundException e) {
    +      throw new RuntimeException(e);
         }
         // OOPS! Throws an exception:
         //- System.out.println("Recovering b2:");
    diff --git a/serialization/Logon.java b/serialization/Logon.java
    index 237f4af23..eafa30d69 100644
    --- a/serialization/Logon.java
    +++ b/serialization/Logon.java
    @@ -6,6 +6,7 @@
     import java.util.concurrent.*;
     import java.io.*;
     import java.util.*;
    +import onjava.Nap;
     
     public class Logon implements Serializable {
       private Date date = new Date();
    @@ -17,20 +18,23 @@ public Logon(String name, String pwd) {
       }
       @Override
       public String toString() {
    -    return "logon info: \n   username: " + username +
    -      "\n   date: " + date + "\n   password: " + password;
    +    return "logon info: \n   username: " +
    +      username + "\n   date: " + date +
    +      "\n   password: " + password;
       }
    -  public static void
    -  main(String[] args) throws Exception {
    +  public static void main(String[] args) {
         Logon a = new Logon("Hulk", "myLittlePony");
         System.out.println("logon a = " + a);
         try(
    -      ObjectOutputStream o = new ObjectOutputStream(
    -        new FileOutputStream("Logon.dat"))
    +      ObjectOutputStream o =
    +        new ObjectOutputStream(
    +          new FileOutputStream("Logon.dat"))
         ) {
           o.writeObject(a);
    +    } catch(IOException e) {
    +      throw new RuntimeException(e);
         }
    -    TimeUnit.SECONDS.sleep(1); // Delay
    +    new Nap(1);
         // Now get them back:
         try(
           ObjectInputStream in = new ObjectInputStream(
    @@ -39,6 +43,8 @@ public String toString() {
           System.out.println(
             "Recovering object at " + new Date());
           a = (Logon)in.readObject();
    +    } catch(IOException | ClassNotFoundException e) {
    +      throw new RuntimeException(e);
         }
         System.out.println("logon a = " + a);
       }
    @@ -46,11 +52,11 @@ public String toString() {
     /* Output:
     logon a = logon info:
        username: Hulk
    -   date: Wed Jul 27 10:50:53 MDT 2016
    +   date: Sat Jan 21 22:06:35 PST 2017
        password: myLittlePony
    -Recovering object at Wed Jul 27 10:50:55 MDT 2016
    +Recovering object at Sat Jan 21 22:06:36 PST 2017
     logon a = logon info:
        username: Hulk
    -   date: Wed Jul 27 10:50:53 MDT 2016
    +   date: Sat Jan 21 22:06:35 PST 2017
        password: null
     */
    diff --git a/serialization/MyWorld.java b/serialization/MyWorld.java
    index 8aafa5d3f..de5cad4ec 100644
    --- a/serialization/MyWorld.java
    +++ b/serialization/MyWorld.java
    @@ -22,14 +22,15 @@ public String toString() {
     }
     
     public class MyWorld {
    -  public static void
    -  main(String[] args) throws IOException,
    -  ClassNotFoundException {
    +  public static void main(String[] args) {
         House house = new House();
         List animals = new ArrayList<>();
    -    animals.add(new Animal("Bosco the dog", house));
    -    animals.add(new Animal("Ralph the hamster", house));
    -    animals.add(new Animal("Molly the cat", house));
    +    animals.add(
    +      new Animal("Bosco the dog", house));
    +    animals.add(
    +      new Animal("Ralph the hamster", house));
    +    animals.add(
    +      new Animal("Molly the cat", house));
         System.out.println("animals: " + animals);
         try(
           ByteArrayOutputStream buf1 =
    @@ -62,11 +63,16 @@ public class MyWorld {
                 animals1 = (List)in1.readObject(),
                 animals2 = (List)in1.readObject(),
                 animals3 = (List)in2.readObject();
    -          System.out.println("animals1: " + animals1);
    -          System.out.println("animals2: " + animals2);
    -          System.out.println("animals3: " + animals3);
    +          System.out.println(
    +            "animals1: " + animals1);
    +          System.out.println(
    +            "animals2: " + animals2);
    +          System.out.println(
    +            "animals3: " + animals3);
             }
           }
    +    } catch(IOException | ClassNotFoundException e) {
    +      throw new RuntimeException(e);
         }
       }
     }
    diff --git a/serialization/People.java b/serialization/People.java
    index f16a19907..6205bfabd 100644
    --- a/serialization/People.java
    +++ b/serialization/People.java
    @@ -2,7 +2,7 @@
     // (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
    -// You must install nu.xom.Node from http://www.xom.nu
    +// nu.xom.Node comes from http://www.xom.nu
     // {RunFirst: APerson}
     import nu.xom.*;
     import java.io.File;
    diff --git a/serialization/RecoverCADState.java b/serialization/RecoverCADState.java
    index 3ed44b47d..6f3b50670 100644
    --- a/serialization/RecoverCADState.java
    +++ b/serialization/RecoverCADState.java
    @@ -9,8 +9,7 @@
     
     public class RecoverCADState {
       @SuppressWarnings("unchecked")
    -  public static void
    -  main(String[] args) throws Exception {
    +  public static void main(String[] args) {
         try(
           ObjectInputStream in =
             new ObjectInputStream(
    @@ -20,21 +19,24 @@ public class RecoverCADState {
           List> shapeTypes =
             (List>)in.readObject();
           Line.deserializeStaticState(in);
    -      List shapes = (List)in.readObject();
    +      List shapes =
    +        (List)in.readObject();
           System.out.println(shapes);
    +    } catch(IOException | ClassNotFoundException e) {
    +      throw new RuntimeException(e);
         }
       }
     }
     /* Output:
    -[class Circlecolor[1] xPos[35] yPos[37] dim[41]
    -, class Squarecolor[0] xPos[20] yPos[77] dim[79]
    -, class Linecolor[3] xPos[56] yPos[68] dim[48]
    -, class Circlecolor[1] xPos[93] yPos[70] dim[7]
    -, class Squarecolor[0] xPos[0] yPos[25] dim[62]
    -, class Linecolor[3] xPos[34] yPos[50] dim[82]
    -, class Circlecolor[1] xPos[31] yPos[67] dim[66]
    -, class Squarecolor[0] xPos[54] yPos[21] dim[6]
    -, class Linecolor[3] xPos[63] yPos[39] dim[63]
    -, class Circlecolor[1] xPos[13] yPos[90] dim[92]
    +[class Circlecolor[RED] xPos[58] yPos[55] dim[93]
    +, class Squarecolor[RED] xPos[61] yPos[61] dim[29]
    +, class Linecolor[GREEN] xPos[68] yPos[0] dim[22]
    +, class Circlecolor[RED] xPos[7] yPos[88] dim[28]
    +, class Squarecolor[RED] xPos[51] yPos[89] dim[9]
    +, class Linecolor[GREEN] xPos[78] yPos[98] dim[61]
    +, class Circlecolor[RED] xPos[20] yPos[58] dim[16]
    +, class Squarecolor[RED] xPos[40] yPos[11] dim[22]
    +, class Linecolor[GREEN] xPos[4] yPos[83] dim[6]
    +, class Circlecolor[RED] xPos[75] yPos[10] dim[42]
     ]
     */
    diff --git a/serialization/SerialCtl.java b/serialization/SerialCtl.java
    index 929ce2a8c..56add3431 100644
    --- a/serialization/SerialCtl.java
    +++ b/serialization/SerialCtl.java
    @@ -25,20 +25,29 @@ private void readObject(ObjectInputStream stream)
         stream.defaultReadObject();
         b = (String)stream.readObject();
       }
    -  public static void
    -  main(String[] args) throws IOException,
    -  ClassNotFoundException {
    +  public static void main(String[] args) {
         SerialCtl sc = new SerialCtl("Test1", "Test2");
         System.out.println("Before:\n" + sc);
    -    ByteArrayOutputStream buf =
    -      new ByteArrayOutputStream();
    -    ObjectOutputStream o = new ObjectOutputStream(buf);
    -    o.writeObject(sc);
    -    // Now get it back:
    -    ObjectInputStream in = new ObjectInputStream(
    -      new ByteArrayInputStream(buf.toByteArray()));
    -    SerialCtl sc2 = (SerialCtl)in.readObject();
    -    System.out.println("After:\n" + sc2);
    +    try (
    +      ByteArrayOutputStream buf =
    +        new ByteArrayOutputStream();
    +      ObjectOutputStream o =
    +        new ObjectOutputStream(buf);
    +    ) {
    +      o.writeObject(sc);
    +      // Now get it back:
    +      try (
    +        ObjectInputStream in =
    +          new ObjectInputStream(
    +            new ByteArrayInputStream(
    +              buf.toByteArray()));
    +      ) {
    +        SerialCtl sc2 = (SerialCtl)in.readObject();
    +        System.out.println("After:\n" + sc2);
    +      }
    +    } catch(IOException | ClassNotFoundException e) {
    +      throw new RuntimeException(e);
    +    }
       }
     }
     /* Output:
    diff --git a/serialization/Worm.java b/serialization/Worm.java
    index 740f05580..6e5e9595e 100644
    --- a/serialization/Worm.java
    +++ b/serialization/Worm.java
    @@ -16,7 +16,7 @@ public String toString() {
     }
     
     public class Worm implements Serializable {
    -  private static SplittableRandom rand = new SplittableRandom(47);
    +  private static Random rand = new Random(47);
       private Data[] d = {
         new Data(rand.nextInt(10)),
         new Data(rand.nextInt(10)),
    
    From 04039c7b6aa0250a52f3157d067277eabe523deb Mon Sep 17 00:00:00 2001
    From: Bruce Eckel 
    Date: Mon, 23 Jan 2017 08:18:49 -0800
    Subject: [PATCH 222/320] Formatting experiments
    
    ---
     arrays/AlphabeticSearch.java                  | 12 +++++++----
     .../ApplesAndOrangesWithoutGenerics.java      |  2 +-
     collections/ListIteration.java                |  4 ++--
     .../interfaceprocessor/StringProcessor.java   |  4 ++--
     lowlevel/DelayQueueDemo.java                  | 12 +++++++----
     network/ChatterClient.java                    |  6 ++++--
     network/ChatterServer.java                    |  4 +++-
     objects/ShowProperties.java                   |  3 ++-
     operators/URShift.java                        |  2 +-
     reuse/DerivedSpaceShip.java                   | 10 ++++++---
     validating/GuavaPreconditions.java            | 20 ++++++++++++------
     validating/tests/CircularQueueTest.java       | 21 ++++++++++++-------
     12 files changed, 66 insertions(+), 34 deletions(-)
    
    diff --git a/arrays/AlphabeticSearch.java b/arrays/AlphabeticSearch.java
    index a01f11495..acaa73684 100644
    --- a/arrays/AlphabeticSearch.java
    +++ b/arrays/AlphabeticSearch.java
    @@ -14,12 +14,16 @@ public static void main(String[] args) {
         show(sa);
         int index = Arrays.binarySearch(sa,
           sa[10], String.CASE_INSENSITIVE_ORDER);
    -    System.out.println( "Index: "+ index + "\n"+ sa[index]);
    +    System.out.println(
    +     "Index: "+ index + "\n"+ sa[index]);
       }
     }
     /* Output:
     [anmkkyh, bhmupju, btpenpc, cjwzmmr, cuxszgv,
    -eloztdv, ewcippc, ezdeklu, fcjpthl, fqmlgsh, gmeinne, hyoubzl, jbvlgwc, jlxpqds,
    -ljlbynx, mvducuj, qgekgly, skddcat, taprwxz, uybypgp, vjsszkn, vniyapk, vqqakbm,
    -vwodhcf, ydpulcq, ygpoalk, yskvett, zehpfmm, zofmmvm, zrxmclh] Index: 10 gmeinne
    +eloztdv, ewcippc, ezdeklu, fcjpthl,
    +fqmlgsh, gmeinne, hyoubzl, jbvlgwc, jlxpqds,
    +ljlbynx, mvducuj, qgekgly, skddcat,
    +taprwxz, uybypgp, vjsszkn, vniyapk, vqqakbm,
    +vwodhcf, ydpulcq, ygpoalk, yskvett,
    +zehpfmm, zofmmvm, zrxmclh] Index: 10 gmeinne
     */
    diff --git a/collections/ApplesAndOrangesWithoutGenerics.java b/collections/ApplesAndOrangesWithoutGenerics.java
    index 775e25f9f..92103377c 100644
    --- a/collections/ApplesAndOrangesWithoutGenerics.java
    +++ b/collections/ApplesAndOrangesWithoutGenerics.java
    @@ -32,6 +32,6 @@ public static void main(String[] args) {
     ___[ Error Output ]___
     Exception in thread "main" java.lang.ClassCastException:
     Orange cannot be cast to Apple
    -        at ApplesAndOrangesWithoutGenerics.main(ApplesAndOr
    +   at ApplesAndOrangesWithoutGenerics.main(ApplesAndOr
     angesWithoutGenerics.java:23)
     */
    diff --git a/collections/ListIteration.java b/collections/ListIteration.java
    index cf4c1558a..3925e4a1b 100644
    --- a/collections/ListIteration.java
    +++ b/collections/ListIteration.java
    @@ -27,8 +27,8 @@ public static void main(String[] args) {
       }
     }
     /* Output:
    -Rat, 1, 0; Manx, 2, 1; Cymric, 3, 2; Mutt, 4, 3; Pug, 5, 4;
    -Cymric, 6, 5; Pug, 7, 6; Manx, 8, 7;
    +Rat, 1, 0; Manx, 2, 1; Cymric, 3, 2; Mutt, 4, 3;
    +Pug, 5, 4; Cymric, 6, 5; Pug, 7, 6; Manx, 8, 7;
     7 6 5 4 3 2 1 0
     [Rat, Manx, Cymric, Mutt, Pug, Cymric, Pug, Manx]
     [Rat, Manx, Cymric, Cymric, Rat, EgyptianMau, Hamster,
    diff --git a/interfaces/interfaceprocessor/StringProcessor.java b/interfaces/interfaceprocessor/StringProcessor.java
    index c5c229a40..01ec16806 100644
    --- a/interfaces/interfaceprocessor/StringProcessor.java
    +++ b/interfaces/interfaceprocessor/StringProcessor.java
    @@ -44,6 +44,6 @@ public String process(Object input) {
     Using Processor Downcase
     if she weighs the same as a duck, she's made of wood
     Using Processor Splitter
    -[If, she, weighs, the, same, as, a, duck,, she's, made, of,
    -wood]
    +[If, she, weighs, the, same, as, a, duck,, she's, made,
    +of, wood]
     */
    diff --git a/lowlevel/DelayQueueDemo.java b/lowlevel/DelayQueueDemo.java
    index 8913d1f29..d845bf366 100644
    --- a/lowlevel/DelayQueueDemo.java
    +++ b/lowlevel/DelayQueueDemo.java
    @@ -70,10 +70,14 @@ public class DelayQueueDemo {
       }
     }
     /* Output:
    -[128] Task 12 [429] Task 6 [551] Task 13 [555] Task 2 [693] Task 3 [809] Task 15
    - [961] Task 5 [1258] Task 1 [1258] Task 20 [1520] Task 19 [1861] Task 4 [1998] T
    -ask 17 [2200] Task 8 [2207] Task 10 [2288] Task 11 [2522] Task 9 [2589] Task 14
    -[2861] Task 18 [2868] Task 7 [3278] Task 16 (0:4000)
    +[128] Task 12 [429] Task 6 [551] Task 13
    + [555] Task 2 [693] Task 3 [809] Task 15
    + [961] Task 5 [1258] Task 1 [1258] Task 20
    +  [1520] Task 19 [1861] Task 4 [1998] T
    +ask 17 [2200] Task 8 [2207] Task 10 [2288]
    +Task 11 [2522] Task 9 [2589] Task 14
    +[2861] Task 18 [2868] Task 7 [3278]
    +Task 16 (0:4000)
     (1:1258)
     (2:555)
     (3:693)
    diff --git a/network/ChatterClient.java b/network/ChatterClient.java
    index e545df71b..f8c6462a6 100644
    --- a/network/ChatterClient.java
    +++ b/network/ChatterClient.java
    @@ -16,7 +16,8 @@ public class ChatterClient implements Runnable {
     
       public ChatterClient(InetAddress hostAddress) {
         this.hostAddress = hostAddress;
    -    System.out.println("ChatterClient #" + id + " starting");
    +    System.out.println(
    +      "ChatterClient #" + id + " starting");
       }
       public void sendAndEcho(String msg) {
         try (
    @@ -42,6 +43,7 @@ public void sendAndEcho(String msg) {
       @Override
       public void run() {
         for(int i = 0; i <= 5; i++)
    -      sendAndEcho("Client #" + id + ", message #" + i);
    +      sendAndEcho(
    +        "Client #" + id + ", message #" + i);
       }
     }
    diff --git a/network/ChatterServer.java b/network/ChatterServer.java
    index 181b75fdd..3df541c01 100644
    --- a/network/ChatterServer.java
    +++ b/network/ChatterServer.java
    @@ -35,6 +35,8 @@ public void run() {
                 dp.getAddress(), dp.getPort());
             socket.send(echo);
           }
    -    } catch(IOException e) { throw new RuntimeException(e); }
    +    } catch(IOException e) {
    +      throw new RuntimeException(e);
    +    }
       }
     }
    diff --git a/objects/ShowProperties.java b/objects/ShowProperties.java
    index 06dbd419f..73f00f2e5 100644
    --- a/objects/ShowProperties.java
    +++ b/objects/ShowProperties.java
    @@ -31,7 +31,8 @@ public static void main(String[] args) {
     user.dir=C:\Users\Bruce\Documents\GitHub\on-ja...
     java.runtime.version=1.8.0_102-b14
     java.awt.graphicsenv=sun.awt.Win32GraphicsEnvironment
    -java.endorsed.dirs=C:\Program Files (x86)\Java\jdk1.8.0_...
    +java.endorsed.dirs=C:\Program Files
    +(x86)\Java\jdk1.8.0_...
     os.arch=x86
     java.io.tmpdir=C:\Users\Bruce\AppData\Local\Temp\
                       ...
    diff --git a/operators/URShift.java b/operators/URShift.java
    index 95350a57e..1ea173921 100644
    --- a/operators/URShift.java
    +++ b/operators/URShift.java
    @@ -30,7 +30,7 @@ public static void main(String[] args) {
     /* Output:
     11111111111111111111111111111111
     1111111111111111111111
    -11111111111111111111111111111111111111111111111111111111111
    +111111111111111111111111111111111111111111111111111111111
     11111
     111111111111111111111111111111111111111111111111111111
     11111111111111111111111111111111
    diff --git a/reuse/DerivedSpaceShip.java b/reuse/DerivedSpaceShip.java
    index 548958f26..737e23e16 100644
    --- a/reuse/DerivedSpaceShip.java
    +++ b/reuse/DerivedSpaceShip.java
    @@ -3,13 +3,17 @@
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
    -public class DerivedSpaceShip extends SpaceShipControls {
    +public class
    +DerivedSpaceShip extends SpaceShipControls {
       private String name;
    -  public DerivedSpaceShip(String name) { this.name = name; }
    +  public DerivedSpaceShip(String name) {
    +    this.name = name;
    +  }
       @Override
       public String toString() { return name; }
       public static void main(String[] args) {
    -    DerivedSpaceShip protector = new DerivedSpaceShip("NSEA Protector");
    +    DerivedSpaceShip protector =
    +        new DerivedSpaceShip("NSEA Protector");
         protector.forward(100);
       }
     }
    diff --git a/validating/GuavaPreconditions.java b/validating/GuavaPreconditions.java
    index 17b15402f..fe06c574f 100644
    --- a/validating/GuavaPreconditions.java
    +++ b/validating/GuavaPreconditions.java
    @@ -93,15 +93,19 @@ public static void main(String[] args) {
     null
     NullPointerException
     Robert
    -IndexOutOfBoundsException: index (6) must be less than size (6)
    +IndexOutOfBoundsException: index (6) must be less
    +than size (6)
     Bob
    -IndexOutOfBoundsException: index (6) must be less than size (3)
    +IndexOutOfBoundsException: index (6) must be less
    +than size (3)
     null
     NullPointerException
     Robert
     Success
     Bob
    -IndexOutOfBoundsException: index (6) must not be greater than size (3)
    +IndexOutOfBoundsException: index (6)
    +must not be greater
    +than size (3)
     null
     NullPointerException
     Hieronymus
    @@ -109,11 +113,15 @@ public static void main(String[] args) {
     Hieronymus
     Success
     Hieronymus
    -IndexOutOfBoundsException: end index (11) must not be greater than size (10)
    +IndexOutOfBoundsException: end index (11)
    +must not be greater
    +than size (10)
     Hieronymus
    -IndexOutOfBoundsException: start index (-1) must not be negative
    +IndexOutOfBoundsException: start index (-1)
    +must not be negative
     Hieronymus
    -IndexOutOfBoundsException: end index (6) must not be less than start index (7)
    +IndexOutOfBoundsException: end index (6)
    +must not be less than start index (7)
     null
     NullPointerException
     */
    diff --git a/validating/tests/CircularQueueTest.java b/validating/tests/CircularQueueTest.java
    index de6b8cd86..eb96d230c 100644
    --- a/validating/tests/CircularQueueTest.java
    +++ b/validating/tests/CircularQueueTest.java
    @@ -92,7 +92,8 @@ public void circularity() {
     testNullPut
     put() null item
     testCircularity
    -in = 0, out = 0, full() = true, empty() = false, CircularQueue =
    +in = 0, out = 0, full() = true, empty() = false,
    +CircularQueue =
     [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
     0
     1
    @@ -104,10 +105,12 @@ public void circularity() {
     7
     8
     9
    -in = 0, out = 0, full() = false, empty() = true, CircularQueue =
    +in = 0, out = 0, full() = false, empty() = true,
    +CircularQueue =
     [null, null, null, null, null, null, null, null, null,
     null]
    -in = 0, out = 0, full() = true, empty() = false, CircularQueue =
    +in = 0, out = 0, full() = true, empty() = false,
    +CircularQueue =
     [10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
     10
     11
    @@ -119,16 +122,19 @@ public void circularity() {
     17
     18
     19
    -in = 0, out = 0, full() = false, empty() = true, CircularQueue =
    +in = 0, out = 0, full() = false, empty() = true,
    +CircularQueue =
     [null, null, null, null, null, null, null, null, null,
     null]
     testFull
    -in = 5, out = 0, full() = false, empty() = false, CircularQueue =
    +in = 5, out = 0, full() = false, empty() = false,
    +CircularQueue =
     [0, 1, 2, 3, 4, null, null, null, null, null]
     0
     1
     put() into full CircularQueue
    -in = 2, out = 2, full() = true, empty() = false, CircularQueue =
    +in = 2, out = 2, full() = true, empty() = false,
    +CircularQueue =
     [10, 11, 2, 3, 4, 5, 6, 7, 8, 9]
     testEmpty
     0
    @@ -137,7 +143,8 @@ public void circularity() {
     3
     4
     get() from empty CircularQueue
    -in = 5, out = 5, full() = false, empty() = true, CircularQueue =
    +in = 5, out = 5, full() = false, empty() = true,
    +CircularQueue =
     [null, null, null, null, null, null, null, null, null,
     null]
     */
    
    From 840f7bad3c1a9ee41e258ed27d23dda719cce1eb Mon Sep 17 00:00:00 2001
    From: Bruce Eckel 
    Date: Mon, 23 Jan 2017 08:19:11 -0800
    Subject: [PATCH 223/320] Change delay time to double
    
    ---
     onjava/Nap.java        | 21 ++++-----------------
     onjava/TimedAbort.java | 11 ++++++-----
     2 files changed, 10 insertions(+), 22 deletions(-)
    
    diff --git a/onjava/Nap.java b/onjava/Nap.java
    index bb76d32b6..ba9df34a2 100644
    --- a/onjava/Nap.java
    +++ b/onjava/Nap.java
    @@ -6,28 +6,15 @@
     import java.util.concurrent.*;
     
     public class Nap {
    -  // Seconds:
    -  public Nap(int n) {
    +  public Nap(double t) { // Seconds
         try {
    -      TimeUnit.SECONDS.sleep(n);
    +      TimeUnit.MILLISECONDS.sleep((int)(1000 * t));
         } catch(InterruptedException e) {
           throw new RuntimeException(e);
         }
       }
    -  // Fractions of a second:
    -  public Nap(double d) {
    -    try {
    -      TimeUnit.MILLISECONDS.sleep((int)(1000 * d));
    -    } catch(InterruptedException e) {
    -      throw new RuntimeException(e);
    -    }
    -  }
    -  public Nap(int n, String msg) {
    -    this(n);
    -    System.out.println(msg);
    -  }
    -  public Nap(double d, String msg) {
    -    this(d);
    +  public Nap(double t, String msg) {
    +    this(t);
         System.out.println(msg);
       }
     }
    diff --git a/onjava/TimedAbort.java b/onjava/TimedAbort.java
    index bee2adccd..b378738d4 100644
    --- a/onjava/TimedAbort.java
    +++ b/onjava/TimedAbort.java
    @@ -2,18 +2,19 @@
     // (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
    -// Terminate a program after n seconds
    +// Terminate a program after t seconds
     package onjava;
     import java.util.concurrent.*;
     
     public class TimedAbort {
       private volatile boolean restart = true;
    -  public TimedAbort(int n, String msg) {
    +  public TimedAbort(double t, String msg) {
         CompletableFuture.runAsync(() -> {
           try {
             while(restart) {
               restart = false;
    -          TimeUnit.SECONDS.sleep(n);
    +          TimeUnit.MILLISECONDS
    +            .sleep((int)(1000 * t));
             }
           } catch(InterruptedException e) {
             throw new RuntimeException(e);
    @@ -22,8 +23,8 @@ public TimedAbort(int n, String msg) {
           System.exit(0);
         });
       }
    -  public TimedAbort(int n) {
    -    this(n, "TimedAbort " + n);
    +  public TimedAbort(double t) {
    +    this(t, "TimedAbort " + t);
       }
       public void restart() { restart = true; }
     }
    
    From bd0d56076cb7475c886a38baa710ef6bf55129d7 Mon Sep 17 00:00:00 2001
    From: Bruce Eckel 
    Date: Mon, 23 Jan 2017 14:40:55 -0800
    Subject: [PATCH 224/320] Aleksey couldn't help with these
    
    ---
     collectiontopics/jmh/Deques.java | 64 ----------------------
     collectiontopics/jmh/Lists.java  | 94 --------------------------------
     collectiontopics/jmh/Maps.java   | 72 ------------------------
     collectiontopics/jmh/Queues.java | 63 ---------------------
     collectiontopics/jmh/Sets.java   | 65 ----------------------
     gradle/subprojects.gradle        |  6 --
     6 files changed, 364 deletions(-)
     delete mode 100644 collectiontopics/jmh/Deques.java
     delete mode 100644 collectiontopics/jmh/Lists.java
     delete mode 100644 collectiontopics/jmh/Maps.java
     delete mode 100644 collectiontopics/jmh/Queues.java
     delete mode 100644 collectiontopics/jmh/Sets.java
    
    diff --git a/collectiontopics/jmh/Deques.java b/collectiontopics/jmh/Deques.java
    deleted file mode 100644
    index 1a16b81b9..000000000
    --- a/collectiontopics/jmh/Deques.java
    +++ /dev/null
    @@ -1,64 +0,0 @@
    -// collectiontopics/jmh/Deques.java
    -// (c)2017 MindView LLC: see Copyright.txt
    -// We make no guarantees that this code is fit for any purpose.
    -// Visit http://OnJava8.com for more book information.
    -// Performance differences between Deques
    -package collectiontopics.jmh;
    -import org.openjdk.jmh.annotations.*;
    -import java.util.concurrent.TimeUnit;
    -import java.util.*;
    -
    -@State(Scope.Thread)
    -@OutputTimeUnit(TimeUnit.MICROSECONDS)
    -@Warmup(iterations = 5, batchSize = 5000)
    -@Measurement(iterations = 5, batchSize = 5000)
    -@BenchmarkMode(Mode.SingleShotTime)
    -@Fork(1)
    -public class Deques {
    -  private Deque deque;
    -
    -  @Param({
    -    "java.util.LinkedList",
    -    "java.util.ArrayDeque",
    -    "java.util.concurrent.ConcurrentLinkedDeque",
    -    "java.util.concurrent.LinkedBlockingDeque",
    -  })
    -  private String type;
    -
    -  @Param({
    -    "1",
    -    "10",
    -    "100",
    -    "1000",
    -    "10000",
    -    "100000"
    -  })
    -  private int size;
    -
    -  @Setup
    -  @SuppressWarnings("unchecked")
    -  public void setup() throws Exception {
    -    deque = (Deque)
    -      Class.forName(type).newInstance();
    -    for(int i = 0; i < size; i++)
    -      deque.add(Integer.toString(i));
    -  }
    -  @Benchmark
    -  public Deque addFirst() {
    -    deque.addFirst("test");
    -    return deque;
    -  }
    -  @Benchmark
    -  public Deque addLast() {
    -    deque.addLast("test");
    -    return deque;
    -  }
    -  @Benchmark
    -  public String pollFirst() {
    -    return deque.pollFirst();
    -  }
    -  @Benchmark
    -  public String pollLast() {
    -    return deque.pollLast();
    -  }
    -}
    diff --git a/collectiontopics/jmh/Lists.java b/collectiontopics/jmh/Lists.java
    deleted file mode 100644
    index 86ee291a7..000000000
    --- a/collectiontopics/jmh/Lists.java
    +++ /dev/null
    @@ -1,94 +0,0 @@
    -// collectiontopics/jmh/Lists.java
    -// (c)2017 MindView LLC: see Copyright.txt
    -// We make no guarantees that this code is fit for any purpose.
    -// Visit http://OnJava8.com for more book information.
    -// Performance differences between Lists
    -package collectiontopics.jmh;
    -import org.openjdk.jmh.annotations.*;
    -import java.util.*;
    -import java.util.concurrent.*;
    -
    -@State(Scope.Thread)
    -@OutputTimeUnit(TimeUnit.MICROSECONDS)
    -@Warmup(iterations = 5, batchSize = 5000)
    -@Measurement(iterations = 5, batchSize = 5000)
    -@BenchmarkMode(Mode.SingleShotTime)
    -@Fork(1)
    -public class Lists {
    -  private List list;
    -
    -  @Param({
    -    "java.util.ArrayList",
    -    "java.util.Vector",
    -    "java.util.LinkedList",
    -    "java.util.concurrent.CopyOnWriteArrayList"
    -  })
    -  private String type;
    -
    -  @Param({
    -    "1",
    -    "10",
    -    "100",
    -    "1000",
    -    "10000",
    -    "100000"
    -  })
    -  private int size;
    -
    -  private int middle;
    -  private ListIterator it;
    -
    -  @Setup
    -  @SuppressWarnings("unchecked")
    -  public void setup() throws Exception {
    -    list = (List)
    -      Class.forName(type).newInstance();
    -    for(int i = 0; i < size; i++)
    -      list.add(Integer.toString(i));
    -    middle = size / 2;
    -    it = list.listIterator(middle);
    -  }
    -  @Benchmark
    -  public List append() {
    -    list.add("test");
    -    return list;
    -  }
    -  @Benchmark
    -  public List insert() {
    -    list.add(middle, "test");
    -    return list;
    -  }
    -  @Benchmark
    -  public String get() {
    -    return list.get(middle);
    -  }
    -  @Benchmark
    -  public List set() {
    -    list.set(middle, "test");
    -    return list;
    -  }
    -  @Benchmark
    -  public List iteradd() {
    -    try {
    -      it.add("test");
    -    } catch(UnsupportedOperationException e) {
    -      System.err.println(
    -        "-> Unsupported: listIterator.add() in " +
    -        list.getClass().getSimpleName());
    -    }
    -    return list;
    -  }
    -  @Benchmark
    -  public List remove() {
    -    middle = list.size() / 2;
    -    if(middle - 1 > 0)
    -      try {
    -        list.remove(middle - 1);
    -      } catch(ArrayIndexOutOfBoundsException e) {
    -        System.out.println("Out of bounds -> size: "
    -          + list.size() + " middle - 1: " + (middle - 1) +
    -          " for " + list.getClass().getSimpleName());
    -      }
    -    return list;
    -  }
    -}
    diff --git a/collectiontopics/jmh/Maps.java b/collectiontopics/jmh/Maps.java
    deleted file mode 100644
    index bb2ef5e97..000000000
    --- a/collectiontopics/jmh/Maps.java
    +++ /dev/null
    @@ -1,72 +0,0 @@
    -// collectiontopics/jmh/Maps.java
    -// (c)2017 MindView LLC: see Copyright.txt
    -// We make no guarantees that this code is fit for any purpose.
    -// Visit http://OnJava8.com for more book information.
    -// Performance differences between Maps
    -package collectiontopics.jmh;
    -import org.openjdk.jmh.annotations.*;
    -import org.openjdk.jmh.infra.Blackhole;
    -import java.util.*;
    -import java.util.concurrent.*;
    -
    -@State(Scope.Thread)
    -@OutputTimeUnit(TimeUnit.MICROSECONDS)
    -@Warmup(iterations = 5, batchSize = 5000)
    -@Measurement(iterations = 5, batchSize = 5000)
    -@BenchmarkMode(Mode.SingleShotTime)
    -@Fork(1)
    -public class Maps {
    -  private Map map;
    -
    -  @Param({
    -    "java.util.HashMap",
    -    "java.util.Hashtable",
    -    "java.util.TreeMap",
    -    "java.util.LinkedHashMap",
    -    "java.util.IdentityHashMap",
    -    "java.util.WeakHashMap",
    -    "java.util.concurrent.ConcurrentHashMap",
    -    "java.util.concurrent.ConcurrentSkipListMap",
    -  })
    -  private String type;
    -
    -  @Param({
    -    "1",
    -    "10",
    -    "100",
    -    "1000",
    -    "10000",
    -  })
    -  private int size;
    -
    -  private String key;
    -
    -  @Setup
    -  @SuppressWarnings("unchecked")
    -  public void setup() throws Exception {
    -    map = (Map)
    -      Class.forName(type).newInstance();
    -    for(int i = 0; i < size; i++)
    -      map.put(Integer.toString(i), Integer.toString(i));
    -    key = Integer.toString(size / 2);
    -  }
    -  @Benchmark
    -  public boolean containsKey() {
    -    return map.containsKey(key);
    -  }
    -  @Benchmark
    -  public String get() {
    -    return map.get(key);
    -  }
    -  @Benchmark
    -  public Map put() {
    -    map.put("test", "test");
    -    return map;
    -  }
    -  @Benchmark
    -  public void iterate(Blackhole bh) {
    -    Iterator it = map.entrySet().iterator();
    -    while(it.hasNext())
    -      bh.consume(it.next());
    -  }
    -}
    diff --git a/collectiontopics/jmh/Queues.java b/collectiontopics/jmh/Queues.java
    deleted file mode 100644
    index 5f300f5db..000000000
    --- a/collectiontopics/jmh/Queues.java
    +++ /dev/null
    @@ -1,63 +0,0 @@
    -// collectiontopics/jmh/Queues.java
    -// (c)2017 MindView LLC: see Copyright.txt
    -// We make no guarantees that this code is fit for any purpose.
    -// Visit http://OnJava8.com for more book information.
    -// Performance differences between Queues
    -package collectiontopics.jmh;
    -import org.openjdk.jmh.annotations.*;
    -import java.util.*;
    -import java.util.concurrent.*;
    -
    -@State(Scope.Thread)
    -@OutputTimeUnit(TimeUnit.MICROSECONDS)
    -@Warmup(iterations = 5, batchSize = 5000)
    -@Measurement(iterations = 5, batchSize = 5000)
    -@BenchmarkMode(Mode.SingleShotTime)
    -@Fork(1)
    -public class Queues {
    -  private Queue queue;
    -
    -  @Param({
    -    "java.util.LinkedList",
    -    "java.util.concurrent.ConcurrentLinkedQueue",
    -    "java.util.concurrent.LinkedBlockingQueue",
    -    "java.util.concurrent.LinkedTransferQueue",
    -    "java.util.concurrent.PriorityBlockingQueue",
    -    "java.util.PriorityQueue",
    -    // Requires a size for construction:
    -    //"java.util.concurrent.ArrayBlockingQueue",
    -    // Won't accept more than one element:
    -    //"java.util.concurrent.SynchronousQueue",
    -    // Requires "Delayed" elements:
    -    //"java.util.concurrent.DelayQueue",
    -  })
    -  private String type;
    -
    -  @Param({
    -    "1",
    -    "10",
    -    "100",
    -    "1000",
    -    "10000",
    -    "100000"
    -  })
    -  private int size;
    -
    -  @Setup
    -  @SuppressWarnings("unchecked")
    -  public void setup() throws Exception {
    -    queue = (Queue)
    -      Class.forName(type).newInstance();
    -    for(int i = 0; i < size; i++)
    -      queue.add(Integer.toString(i));
    -  }
    -  @Benchmark
    -  public Queue add() {
    -    queue.add("test");
    -    return queue;
    -  }
    -  @Benchmark
    -  public String poll() {
    -    return queue.poll();
    -  }
    -}
    diff --git a/collectiontopics/jmh/Sets.java b/collectiontopics/jmh/Sets.java
    deleted file mode 100644
    index 3ab4f68ee..000000000
    --- a/collectiontopics/jmh/Sets.java
    +++ /dev/null
    @@ -1,65 +0,0 @@
    -// collectiontopics/jmh/Sets.java
    -// (c)2017 MindView LLC: see Copyright.txt
    -// We make no guarantees that this code is fit for any purpose.
    -// Visit http://OnJava8.com for more book information.
    -// Demonstrates performance differences in Sets
    -package collectiontopics.jmh;
    -import org.openjdk.jmh.annotations.*;
    -import org.openjdk.jmh.infra.Blackhole;
    -import java.util.*;
    -import java.util.concurrent.*;
    -
    -@State(Scope.Thread)
    -@OutputTimeUnit(TimeUnit.MICROSECONDS)
    -@Warmup(iterations = 5, batchSize = 5000)
    -@Measurement(iterations = 5, batchSize = 5000)
    -@BenchmarkMode(Mode.SingleShotTime)
    -@Fork(1)
    -public class Sets {
    -  private Set set;
    -
    -  @Param({
    -    "java.util.HashSet",
    -    "java.util.TreeSet",
    -    "java.util.LinkedHashSet",
    -    "java.util.concurrent.ConcurrentSkipListSet",
    -    "java.util.concurrent.CopyOnWriteArraySet",
    -  })
    -  private String type;
    -
    -  @Param({
    -    "1",
    -    "10",
    -    "100",
    -    "1000",
    -    "10000",
    -  })
    -  private int size;
    -
    -  private String key;
    -
    -  @Setup
    -  @SuppressWarnings("unchecked")
    -  public void setup() throws Exception {
    -    set = (Set)
    -      Class.forName(type).newInstance();
    -    for(int i = 0; i < size; i++)
    -      set.add(Integer.toString(i));
    -    key = Integer.toString(size/2);
    -  }
    -  @Benchmark
    -  public Set add() {
    -    set.add("test");
    -    return set;
    -  }
    -  @Benchmark
    -  public boolean contains() {
    -    return set.contains(key);
    -  }
    -  @Benchmark
    -  public void iterate(Blackhole bh) {
    -    Iterator it = set.iterator();
    -    while(it.hasNext())
    -      bh.consume(it.next());
    -  }
    -}
    diff --git a/gradle/subprojects.gradle b/gradle/subprojects.gradle
    index e114237dc..e9d857d87 100644
    --- a/gradle/subprojects.gradle
    +++ b/gradle/subprojects.gradle
    @@ -4,12 +4,6 @@ project(':validating') {
         }
     }
     
    -project(':collectiontopics') {
    -    jmh {
    -        include = 'collectiontopics.jmh.*'
    -    }
    -}
    -
     project(':equalshashcode') {
         dependencies {
             compile project(':typeinfo')
    
    From c51767d5d590b2bd2895d2148daaf0e15fefbf33 Mon Sep 17 00:00:00 2001
    From: Bruce Eckel 
    Date: Mon, 23 Jan 2017 14:41:17 -0800
    Subject: [PATCH 225/320] Still refactoring, trying to get them to work right
    
    ---
     network/ChatterClient.java                    |  2 +-
     network/ChatterServer.java                    |  5 +--
     network/MultiServer.java                      | 23 +++++-----
     network/SimpleClient.java                     | 28 +++++++-----
     network/SimpleClient2.java                    | 43 -------------------
     network/SimpleServer.java                     | 19 ++++----
     network/TestMultiServer.java                  |  5 ++-
     ...erverClient.java => TestSimpleServer.java} |  4 +-
     8 files changed, 48 insertions(+), 81 deletions(-)
     delete mode 100644 network/SimpleClient2.java
     rename network/{TestSimpleServerClient.java => TestSimpleServer.java} (85%)
    
    diff --git a/network/ChatterClient.java b/network/ChatterClient.java
    index f8c6462a6..c938ead3d 100644
    --- a/network/ChatterClient.java
    +++ b/network/ChatterClient.java
    @@ -42,7 +42,7 @@ public void sendAndEcho(String msg) {
       }
       @Override
       public void run() {
    -    for(int i = 0; i <= 5; i++)
    +    for(int i = 0; i < 10; i++)
           sendAndEcho(
             "Client #" + id + ", message #" + i);
       }
    diff --git a/network/ChatterServer.java b/network/ChatterServer.java
    index 3df541c01..11b3c6b14 100644
    --- a/network/ChatterServer.java
    +++ b/network/ChatterServer.java
    @@ -27,9 +27,8 @@ public void run() {
             System.out.println(rcvd);
             String echoString =
               "Echoed: " + rcvd;
    -        // Extract the address and port from the
    -        // received datagram to find out where to
    -        // send it back to:
    +        // Extract address and port from received
    +        // datagram and send it back there:
             DatagramPacket echo =
               Dgram.toDatagram(echoString,
                 dp.getAddress(), dp.getPort());
    diff --git a/network/MultiServer.java b/network/MultiServer.java
    index 54d005eb6..a530cac04 100644
    --- a/network/MultiServer.java
    +++ b/network/MultiServer.java
    @@ -7,15 +7,16 @@
     import java.net.*;
     import java.util.concurrent.*;
     
    -class ServeOne implements Runnable {
    -  static final int PORT = 8080;
    +class Serve1 implements Runnable {
       private ServerSocket ss;
    -  public ServeOne(ServerSocket ss) {
    +  public Serve1(ServerSocket ss) {
         this.ss = ss;
       }
       @Override
    +  public String toString() { return "Serve1: "; }
    +  @Override
       public void run() {
    -    System.out.println("Starting ServeOne");
    +    System.out.println(this + "Running");
         try (
           Socket socket = ss.accept();
           BufferedReader in =
    @@ -31,12 +32,12 @@ public void run() {
         ) {
           in.lines().anyMatch(message -> {
             if(message.equals("END")) {
    -          System.out.println(
    +          System.out.println(this +
                 "Received END. Closing Socket.");
               return true;
             }
             System.out.println(
    -          "Message  : " + message);
    +          this + "Message: " + message);
             out.println(message);
             return false;
           });
    @@ -49,13 +50,15 @@ public void run() {
     public class MultiServer implements Runnable {
       @Override
       public void run() {
    -    System.out.println("Running MultiServer");
    +    System.out.println("Server: Running");
         try (
           ServerSocket ss =
    -        new ServerSocket(ServeOne.PORT)
    +        new ServerSocket(SimpleClient.PORT)
         ) {
    -      while(true)
    -        CompletableFuture.runAsync(new ServeOne(ss));
    +      System.out.println("Server: " + ss);
    +      for(int i = 0; i < 10; i++)
    +        CompletableFuture
    +          .runAsync(new Serve1(ss));
         } catch(IOException e) {
           throw new RuntimeException(e);
         }
    diff --git a/network/SimpleClient.java b/network/SimpleClient.java
    index de144706f..e9110f62d 100644
    --- a/network/SimpleClient.java
    +++ b/network/SimpleClient.java
    @@ -2,22 +2,30 @@
     // (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
    -// Sends lines to the server and
    -// reads lines the server sends.
    +// Sends to the server, reads from the server
     import java.net.*;
     import java.io.*;
    +import java.util.concurrent.atomic.*;
     
     public class SimpleClient implements Runnable {
    +  // Choose a port outside of the range 1-1024:
    +  public static final int PORT = 8080;
    +  private static AtomicInteger idcount =
    +    new AtomicInteger(0);
    +  private final int id = idcount.getAndIncrement();
       private InetAddress hostAddress;
       public SimpleClient(InetAddress hostAddress) {
         this.hostAddress = hostAddress;
       }
       @Override
    +  public String toString() {
    +    return "Client[" + id + "]: ";
    +  }
    +  @Override
       public void run() {
    -    System.out.println("hostAddress = " + hostAddress);
    -    try (
    -      Socket socket =
    -        new Socket(hostAddress, SimpleServer.PORT);
    +    System.out.println(this + "Running");
    +    try(
    +      Socket socket = new Socket(hostAddress, PORT);
           BufferedReader in =
             new BufferedReader(
               new InputStreamReader(
    @@ -29,11 +37,11 @@ public void run() {
                   // Enable auto-flush:
                   socket.getOutputStream())), true);
         ) {
    -      System.out.println("socket: " + socket);
    +      System.out.println(this.toString() + socket);
           for(int i = 0; i < 10; i ++) {
    -        out.println("hello " + i);
    -        String str = in.readLine();
    -        System.out.println("client Message : " + str);
    +        out.println(this + "(*" + i + "*)");
    +        System.out.println(this +
    +          "Received '" + in.readLine() + "'");
           }
           out.println("END");
         } catch(IOException e) {
    diff --git a/network/SimpleClient2.java b/network/SimpleClient2.java
    deleted file mode 100644
    index cdb747228..000000000
    --- a/network/SimpleClient2.java
    +++ /dev/null
    @@ -1,43 +0,0 @@
    -// network/SimpleClient2.java
    -// (c)2017 MindView LLC: see Copyright.txt
    -// We make no guarantees that this code is fit for any purpose.
    -// Visit http://OnJava8.com for more book information.
    -import java.net.*;
    -import java.io.*;
    -
    -public class SimpleClient2 implements Runnable {
    -  private InetAddress address;
    -  private static int counter = 0;
    -  private int id = counter++;
    -  public SimpleClient2(InetAddress address) {
    -    System.out.println("Making client " + id);
    -    this.address = address;
    -  }
    -  @Override
    -  public void run() {
    -    System.out.println("Running client " + id);
    -    try (
    -      Socket socket =
    -        new Socket(address, ServeOne.PORT);
    -      BufferedReader in =
    -        new BufferedReader(
    -          new InputStreamReader(
    -            socket.getInputStream()));
    -      PrintWriter out =
    -        new PrintWriter(
    -          new BufferedWriter(
    -            new OutputStreamWriter(
    -              // Enable auto-flush:
    -              socket.getOutputStream())), true)
    -    ) {
    -      for(int i = 0; i < 25; i++) {
    -        out.println("Client " + id + ": " + i);
    -        String str = in.readLine();
    -        System.out.println(str);
    -      }
    -      out.println("END");
    -    } catch(IOException ex) {
    -        throw new RuntimeException(ex);
    -    }
    -  }
    -}
    diff --git a/network/SimpleServer.java b/network/SimpleServer.java
    index 73a0b4bd3..c58c5c4ae 100644
    --- a/network/SimpleServer.java
    +++ b/network/SimpleServer.java
    @@ -7,12 +7,13 @@
     import java.net.*;
     
     public class SimpleServer implements Runnable {
    -  // Choose a port outside of the range 1-1024:
    -  public static final int PORT = 8080;
    +  @Override
    +  public String toString() { return "Server: "; }
       @Override
       public void run() {
         try (
    -      ServerSocket s = new ServerSocket(PORT);
    +      ServerSocket s =
    +        new ServerSocket(SimpleClient.PORT);
           // Blocks until a connection occurs:
           Socket socket = s.accept();
           BufferedReader in =
    @@ -26,16 +27,14 @@ public void run() {
                   // Enable auto-flush:
                   socket.getOutputStream())), true)
         ) {
    -      System.out.println("Connection: " + socket);
    -      in.lines().anyMatch(message->{
    -        if (message.equals("END")) {
    -          System.out.println(
    +      System.out.println(this.toString() + socket);
    +      in.lines().anyMatch(message -> {
    +        if(message.equals("END")) {
    +          System.out.println(this +
                 "Received END. Closing Socket.");
               return true;
             }
    -        System.out.println(
    -          "Server Response: " + message);
    -        out.println(message);
    +        out.println(this + message);
             return false;
           });
         } catch(IOException e) {
    diff --git a/network/TestMultiServer.java b/network/TestMultiServer.java
    index 7fbf36e66..f2e018fa6 100644
    --- a/network/TestMultiServer.java
    +++ b/network/TestMultiServer.java
    @@ -9,11 +9,12 @@
     public class TestMultiServer {
       public static void main(String[] args) {
         CompletableFuture.runAsync(new MultiServer());
    +    new Nap(1); // Let the server get started
         for(int i = 0; i < 10; i++) {
           CompletableFuture.runAsync(
    -        new SimpleClient2(Local.host()));
    +        new SimpleClient(Local.host()));
         }
    -    new Nap(2);
    +    new Nap(4);
         // No exceptions mean success
       }
     }
    diff --git a/network/TestSimpleServerClient.java b/network/TestSimpleServer.java
    similarity index 85%
    rename from network/TestSimpleServerClient.java
    rename to network/TestSimpleServer.java
    index 055be581a..abefad70c 100644
    --- a/network/TestSimpleServerClient.java
    +++ b/network/TestSimpleServer.java
    @@ -1,4 +1,4 @@
    -// network/TestSimpleServerClient.java
    +// network/TestSimpleServer.java
     // (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
    @@ -6,7 +6,7 @@
     import java.util.concurrent.*;
     import onjava.Nap;
     
    -public class TestSimpleServerClient {
    +public class TestSimpleServer {
       public static void main(String[] args) {
         CompletableFuture.runAsync(
           new SimpleServer());
    
    From 8b00b51c6f1a52618e34e524e679dbbae5ea6dc4 Mon Sep 17 00:00:00 2001
    From: Bruce Eckel 
    Date: Tue, 24 Jan 2017 09:26:37 -0800
    Subject: [PATCH 226/320] Refactored to removed redundant Serve1 class
    
    MultiServer still not working correctly
    ---
     network/ChatterClient.java    |  8 +++---
     network/MultiServer.java      | 49 +++++------------------------------
     network/SimpleClient.java     | 12 ++++-----
     network/SimpleServer.java     | 11 +++++---
     network/TestMultiServer.java  |  6 +++--
     network/TestSimpleServer.java | 22 +++++++++++-----
     6 files changed, 43 insertions(+), 65 deletions(-)
    
    diff --git a/network/ChatterClient.java b/network/ChatterClient.java
    index c938ead3d..78b51f311 100644
    --- a/network/ChatterClient.java
    +++ b/network/ChatterClient.java
    @@ -7,15 +7,15 @@
     import java.io.*;
     
     public class ChatterClient implements Runnable {
    -  private InetAddress hostAddress;
    +  private InetAddress host;
       private byte[] buf = new byte[1000];
       private DatagramPacket dp =
         new DatagramPacket(buf, buf.length);
       private static int counter = 0;
       private int id = counter++;
     
    -  public ChatterClient(InetAddress hostAddress) {
    -    this.hostAddress = hostAddress;
    +  public ChatterClient(InetAddress host) {
    +    this.host = host;
         System.out.println(
           "ChatterClient #" + id + " starting");
       }
    @@ -26,7 +26,7 @@ public void sendAndEcho(String msg) {
         ) {
           // Make and send a datagram:
           s.send(Dgram.toDatagram(
    -        msg, hostAddress, ChatterServer.INPORT));
    +        msg, host, ChatterServer.INPORT));
           // Block until it echoes back:
           s.receive(dp);
           // Display the echoed contents:
    diff --git a/network/MultiServer.java b/network/MultiServer.java
    index a530cac04..f538ccb57 100644
    --- a/network/MultiServer.java
    +++ b/network/MultiServer.java
    @@ -7,58 +7,21 @@
     import java.net.*;
     import java.util.concurrent.*;
     
    -class Serve1 implements Runnable {
    -  private ServerSocket ss;
    -  public Serve1(ServerSocket ss) {
    -    this.ss = ss;
    -  }
    -  @Override
    -  public String toString() { return "Serve1: "; }
    -  @Override
    -  public void run() {
    -    System.out.println(this + "Running");
    -    try (
    -      Socket socket = ss.accept();
    -      BufferedReader in =
    -        new BufferedReader(
    -          new InputStreamReader(
    -            socket.getInputStream()));
    -      PrintWriter out =
    -        new PrintWriter(
    -          new BufferedWriter(
    -            new OutputStreamWriter(
    -              // Boolean enables auto-flush
    -              socket.getOutputStream())), true)
    -    ) {
    -      in.lines().anyMatch(message -> {
    -        if(message.equals("END")) {
    -          System.out.println(this +
    -            "Received END. Closing Socket.");
    -          return true;
    -        }
    -        System.out.println(
    -          this + "Message: " + message);
    -        out.println(message);
    -        return false;
    -      });
    -    } catch(IOException e) {
    -      throw new RuntimeException(e);
    -    }
    -  }
    -}
    -
     public class MultiServer implements Runnable {
    +  private final int port;
    +  public MultiServer(int port) {
    +    this.port = port;
    +  }
       @Override
       public void run() {
         System.out.println("Server: Running");
         try (
    -      ServerSocket ss =
    -        new ServerSocket(SimpleClient.PORT)
    +      ServerSocket ss = new ServerSocket(port)
         ) {
           System.out.println("Server: " + ss);
           for(int i = 0; i < 10; i++)
             CompletableFuture
    -          .runAsync(new Serve1(ss));
    +          .runAsync(new SimpleServer(ss));
         } catch(IOException e) {
           throw new RuntimeException(e);
         }
    diff --git a/network/SimpleClient.java b/network/SimpleClient.java
    index e9110f62d..0cd88845b 100644
    --- a/network/SimpleClient.java
    +++ b/network/SimpleClient.java
    @@ -8,14 +8,14 @@
     import java.util.concurrent.atomic.*;
     
     public class SimpleClient implements Runnable {
    -  // Choose a port outside of the range 1-1024:
    -  public static final int PORT = 8080;
    +  public final int port;
       private static AtomicInteger idcount =
         new AtomicInteger(0);
       private final int id = idcount.getAndIncrement();
    -  private InetAddress hostAddress;
    -  public SimpleClient(InetAddress hostAddress) {
    -    this.hostAddress = hostAddress;
    +  private InetAddress host;
    +  public SimpleClient(InetAddress host, int port) {
    +    this.host = host;
    +    this.port = port;
       }
       @Override
       public String toString() {
    @@ -25,7 +25,7 @@ public String toString() {
       public void run() {
         System.out.println(this + "Running");
         try(
    -      Socket socket = new Socket(hostAddress, PORT);
    +      Socket socket = new Socket(host, port);
           BufferedReader in =
             new BufferedReader(
               new InputStreamReader(
    diff --git a/network/SimpleServer.java b/network/SimpleServer.java
    index c58c5c4ae..56e0cf36d 100644
    --- a/network/SimpleServer.java
    +++ b/network/SimpleServer.java
    @@ -7,15 +7,18 @@
     import java.net.*;
     
     public class SimpleServer implements Runnable {
    +  private ServerSocket ss;
    +  public SimpleServer(ServerSocket ss) {
    +    this.ss = ss;
    +  }
       @Override
       public String toString() { return "Server: "; }
       @Override
       public void run() {
    +    System.out.println(this + "Running");
         try (
    -      ServerSocket s =
    -        new ServerSocket(SimpleClient.PORT);
           // Blocks until a connection occurs:
    -      Socket socket = s.accept();
    +      Socket socket = ss.accept();
           BufferedReader in =
             new BufferedReader(
               new InputStreamReader(
    @@ -24,7 +27,7 @@ public void run() {
             new PrintWriter(
               new BufferedWriter(
                 new OutputStreamWriter(
    -              // Enable auto-flush:
    +              // Boolean enables auto-flush:
                   socket.getOutputStream())), true)
         ) {
           System.out.println(this.toString() + socket);
    diff --git a/network/TestMultiServer.java b/network/TestMultiServer.java
    index f2e018fa6..cd68e23c4 100644
    --- a/network/TestMultiServer.java
    +++ b/network/TestMultiServer.java
    @@ -7,12 +7,14 @@
     import onjava.Nap;
     
     public class TestMultiServer {
    +  public static final int port = 8080;
       public static void main(String[] args) {
    -    CompletableFuture.runAsync(new MultiServer());
    +    CompletableFuture.runAsync(
    +      new MultiServer(port));
         new Nap(1); // Let the server get started
         for(int i = 0; i < 10; i++) {
           CompletableFuture.runAsync(
    -        new SimpleClient(Local.host()));
    +        new SimpleClient(Local.host(), port));
         }
         new Nap(4);
         // No exceptions mean success
    diff --git a/network/TestSimpleServer.java b/network/TestSimpleServer.java
    index abefad70c..99f3ca55c 100644
    --- a/network/TestSimpleServer.java
    +++ b/network/TestSimpleServer.java
    @@ -2,17 +2,27 @@
     // (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
    +import java.io.*;
     import java.net.*;
     import java.util.concurrent.*;
     import onjava.Nap;
     
     public class TestSimpleServer {
    +  // Choose a port outside of the range 1-1024:
    +  public static final int port = 8080;
       public static void main(String[] args) {
    -    CompletableFuture.runAsync(
    -      new SimpleServer());
    -    CompletableFuture.runAsync(
    -      new SimpleClient(Local.host()));
    -    new Nap(1);
    -    // Success if no exceptions happen
    +    try (
    +      ServerSocket ss =
    +        new ServerSocket(port)
    +    ) {
    +      CompletableFuture.runAsync(
    +        new SimpleServer(ss));
    +      CompletableFuture.runAsync(
    +        new SimpleClient(Local.host(), port));
    +      new Nap(1);
    +      // Success if no exceptions happen
    +    } catch(IOException e) {
    +      throw new RuntimeException(e);
    +    }
       }
     }
    
    From 63e43bbe05eacf6ee2d8f64cb32c593f6ac12da5 Mon Sep 17 00:00:00 2001
    From: Bruce Eckel 
    Date: Sun, 16 Apr 2017 10:18:21 -0700
    Subject: [PATCH 227/320] Removed two appendices
    
    ---
     check.bat                               |  2 +-
     collectiontopics/CollectionMethods.java | 14 +++---
     collectiontopics/HTMLColorTest.java     |  6 +--
     collectiontopics/NavMap.java            | 14 +++---
     enums/menu/Meal.java                    | 12 ++---
     enums/menu/Meal2.java                   | 12 ++---
     network/ChatterClient.java              | 49 ---------------------
     network/ChatterServer.java              | 41 -----------------
     network/Dgram.java                      | 19 --------
     network/Local.java                      | 15 -------
     network/LocalHost.java                  | 27 ------------
     network/MultiServer.java                | 29 -------------
     network/SimpleClient.java               | 51 ----------------------
     network/SimpleServer.java               | 47 --------------------
     network/TestChatter.java                | 18 --------
     network/TestMultiServer.java            | 22 ----------
     network/TestSimpleServer.java           | 28 ------------
     network/WhoAmI.java                     | 19 --------
     onjava/HTMLColors.java                  |  3 +-
     patterns/SingletonPattern.java          | 58 +++++++++++++++++++++++++
     references/LocalCopy.java               | 57 ++++++++++++++++++++++++
     remote/DisplayPerfectTime.java          | 21 ---------
     remote/PerfectTime.java                 | 11 -----
     remote/PerfectTimeImpl.java             | 13 ------
     remote/PerfectTimeServer.java           | 23 ----------
     25 files changed, 147 insertions(+), 464 deletions(-)
     delete mode 100644 network/ChatterClient.java
     delete mode 100644 network/ChatterServer.java
     delete mode 100644 network/Dgram.java
     delete mode 100644 network/Local.java
     delete mode 100644 network/LocalHost.java
     delete mode 100644 network/MultiServer.java
     delete mode 100644 network/SimpleClient.java
     delete mode 100644 network/SimpleServer.java
     delete mode 100644 network/TestChatter.java
     delete mode 100644 network/TestMultiServer.java
     delete mode 100644 network/TestSimpleServer.java
     delete mode 100644 network/WhoAmI.java
     create mode 100644 patterns/SingletonPattern.java
     create mode 100644 references/LocalCopy.java
     delete mode 100644 remote/DisplayPerfectTime.java
     delete mode 100644 remote/PerfectTime.java
     delete mode 100644 remote/PerfectTimeImpl.java
     delete mode 100644 remote/PerfectTimeServer.java
    
    diff --git a/check.bat b/check.bat
    index c250560b1..25446ee4b 100644
    --- a/check.bat
    +++ b/check.bat
    @@ -1,2 +1,2 @@
     cp ..\..\OnJava-Tools\verify_output.py .
    -python verify_output.py
    +py -3 verify_output.py
    diff --git a/collectiontopics/CollectionMethods.java b/collectiontopics/CollectionMethods.java
    index 6c6ae7f15..1bf8691ea 100644
    --- a/collectiontopics/CollectionMethods.java
    +++ b/collectiontopics/CollectionMethods.java
    @@ -79,10 +79,10 @@ public static void main(String[] args) {
     Azure
     ten
     eleven
    -------------------------------
    +******************************
     Collections.max(c) = ten
     Collections.min(c) = AliceBlue
    -------------------------------
    +******************************
     AliceBlue
     AntiqueWhite
     Aquamarine
    @@ -93,7 +93,7 @@ public static void main(String[] args) {
     BurlyWood
     CadetBlue
     Chartreuse
    -------------------------------
    +******************************
     AntiqueWhite
     Aquamarine
     Azure
    @@ -103,13 +103,13 @@ public static void main(String[] args) {
     BurlyWood
     CadetBlue
     Chartreuse
    -------------------------------
    +******************************
     AntiqueWhite
     Aquamarine
     Azure
     ten
     eleven
    -------------------------------
    +******************************
     AntiqueWhite
     Aquamarine
     Azure
    @@ -119,11 +119,11 @@ public static void main(String[] args) {
     BurlyWood
     CadetBlue
     Chartreuse
    -------------------------------
    +******************************
     c.contains(Azure) = true
     c.containsAll(c2) = true
     c2.isEmpty() = true
    -------------------------------
    +******************************
     PapayaWhip
     PeachPuff
     Peru
    diff --git a/collectiontopics/HTMLColorTest.java b/collectiontopics/HTMLColorTest.java
    index 47418db07..517ee575c 100644
    --- a/collectiontopics/HTMLColorTest.java
    +++ b/collectiontopics/HTMLColorTest.java
    @@ -37,7 +37,7 @@ public static void main(String[] args) {
     0xFFF8DC: Cornsilk
     0xDC143C: Crimson
     0x00FFFF: Cyan
    -------------------------------
    +******************************
     AliceBlue             0xF0F8FF
     AntiqueWhite          0xFAEBD7
     Aquamarine            0x7FFFD4
    @@ -58,7 +58,7 @@ public static void main(String[] args) {
     Cornsilk              0xFFF8DC
     Crimson               0xDC143C
     Cyan                  0x00FFFF
    -------------------------------
    +******************************
     AliceBlue
     AntiqueWhite
     Aquamarine
    @@ -79,7 +79,7 @@ public static void main(String[] args) {
     Cornsilk
     Crimson
     Cyan
    -------------------------------
    +******************************
     0xF0F8FF
     0xFAEBD7
     0x7FFFD4
    diff --git a/collectiontopics/NavMap.java b/collectiontopics/NavMap.java
    index 92e4ef198..0f682b8a3 100644
    --- a/collectiontopics/NavMap.java
    +++ b/collectiontopics/NavMap.java
    @@ -35,9 +35,9 @@ public static void main(String[] args) {
     }
     /* Output:
     0x000000: Black
    -------------------------------
    +******************************
     0xFFFFFF: White
    -------------------------------
    +******************************
     0x000000: Black
     0x000080: Navy
     0x00008B: DarkBlue
    @@ -51,11 +51,11 @@ public static void main(String[] args) {
     0x00CED1: DarkTurquoise
     0x00FA9A: MediumSpringGreen
     0x00FF00: Lime
    -------------------------------
    +******************************
     0x00BFFF: DeepSkyBlue
    -------------------------------
    +******************************
     0x008B8B: DarkCyan
    -------------------------------
    +******************************
     0x00FF00: Lime
     0x00FA9A: MediumSpringGreen
     0x00CED1: DarkTurquoise
    @@ -69,7 +69,7 @@ public static void main(String[] args) {
     0x00008B: DarkBlue
     0x000080: Navy
     0x000000: Black
    -------------------------------
    +******************************
     0xFFE4E1: MistyRose
     0xFFEBCD: BlanchedAlmond
     0xFFEFD5: PapayaWhip
    @@ -83,7 +83,7 @@ public static void main(String[] args) {
     0xFFFFE0: LightYellow
     0xFFFFF0: Ivory
     0xFFFFFF: White
    -------------------------------
    +******************************
     0xDA70D6: Orchid
     0xDAA520: GoldenRod
     0xDB7093: PaleVioletRed
    diff --git a/enums/menu/Meal.java b/enums/menu/Meal.java
    index adfe92a65..f83a30024 100644
    --- a/enums/menu/Meal.java
    +++ b/enums/menu/Meal.java
    @@ -12,7 +12,7 @@ public static void main(String[] args) {
             Food food = course.randomSelection();
             System.out.println(food);
           }
    -      System.out.println("---");
    +      System.out.println("***");
         }
       }
     }
    @@ -21,25 +21,25 @@ public static void main(String[] args) {
     VINDALOO
     GELATO
     CAPPUCCINO
    ----
    +***
     SPRING_ROLLS
     BURRITO
     GELATO
     HERB_TEA
    ----
    +***
     SPRING_ROLLS
     BURRITO
     TIRAMISU
     CAPPUCCINO
    ----
    +***
     SPRING_ROLLS
     BURRITO
     BLACK_FOREST_CAKE
     LATTE
    ----
    +***
     SALAD
     PAD_THAI
     GELATO
     TEA
    ----
    +***
     */
    diff --git a/enums/menu/Meal2.java b/enums/menu/Meal2.java
    index 5d63b54f1..ef0c38738 100644
    --- a/enums/menu/Meal2.java
    +++ b/enums/menu/Meal2.java
    @@ -41,7 +41,7 @@ public static void main(String[] args) {
             Food food = meal.randomSelection();
             System.out.println(food);
           }
    -      System.out.println("---");
    +      System.out.println("***");
         }
       }
     }
    @@ -50,25 +50,25 @@ public static void main(String[] args) {
     VINDALOO
     GELATO
     CAPPUCCINO
    ----
    +***
     SPRING_ROLLS
     BURRITO
     GELATO
     HERB_TEA
    ----
    +***
     SPRING_ROLLS
     BURRITO
     TIRAMISU
     CAPPUCCINO
    ----
    +***
     SPRING_ROLLS
     BURRITO
     BLACK_FOREST_CAKE
     LATTE
    ----
    +***
     SALAD
     PAD_THAI
     GELATO
     TEA
    ----
    +***
     */
    diff --git a/network/ChatterClient.java b/network/ChatterClient.java
    deleted file mode 100644
    index 78b51f311..000000000
    --- a/network/ChatterClient.java
    +++ /dev/null
    @@ -1,49 +0,0 @@
    -// network/ChatterClient.java
    -// (c)2017 MindView LLC: see Copyright.txt
    -// We make no guarantees that this code is fit for any purpose.
    -// Visit http://OnJava8.com for more book information.
    -// Starts multiple clients, each of which sends datagrams.
    -import java.net.*;
    -import java.io.*;
    -
    -public class ChatterClient implements Runnable {
    -  private InetAddress host;
    -  private byte[] buf = new byte[1000];
    -  private DatagramPacket dp =
    -    new DatagramPacket(buf, buf.length);
    -  private static int counter = 0;
    -  private int id = counter++;
    -
    -  public ChatterClient(InetAddress host) {
    -    this.host = host;
    -    System.out.println(
    -      "ChatterClient #" + id + " starting");
    -  }
    -  public void sendAndEcho(String msg) {
    -    try (
    -      // Auto-assign port number:
    -      DatagramSocket s = new DatagramSocket();
    -    ) {
    -      // Make and send a datagram:
    -      s.send(Dgram.toDatagram(
    -        msg, host, ChatterServer.INPORT));
    -      // Block until it echoes back:
    -      s.receive(dp);
    -      // Display the echoed contents:
    -      String rcvd = "Client #" + id +
    -        ", rcvd from " +
    -        dp.getAddress() + ", " +
    -        dp.getPort() + ": " +
    -        Dgram.toString(dp);
    -      System.out.println(rcvd);
    -    } catch(IOException e) {
    -      throw new RuntimeException(e);
    -    }
    -  }
    -  @Override
    -  public void run() {
    -    for(int i = 0; i < 10; i++)
    -      sendAndEcho(
    -        "Client #" + id + ", message #" + i);
    -  }
    -}
    diff --git a/network/ChatterServer.java b/network/ChatterServer.java
    deleted file mode 100644
    index 11b3c6b14..000000000
    --- a/network/ChatterServer.java
    +++ /dev/null
    @@ -1,41 +0,0 @@
    -// network/ChatterServer.java
    -// (c)2017 MindView LLC: see Copyright.txt
    -// We make no guarantees that this code is fit for any purpose.
    -// Visit http://OnJava8.com for more book information.
    -// A server that echoes datagrams
    -import java.net.*;
    -import java.io.*;
    -
    -public class ChatterServer implements Runnable {
    -  static final int INPORT = 1711;
    -  private byte[] buf = new byte[1000];
    -  private DatagramPacket dp =
    -    new DatagramPacket(buf, buf.length);
    -  @Override
    -  public void run() {
    -    // Can listen & send on the same socket:
    -    try (
    -      DatagramSocket socket = new DatagramSocket(INPORT)
    -    ) {
    -      System.out.println("Server started");
    -      while(true) {
    -        // Block until a datagram appears:
    -        socket.receive(dp);
    -        String rcvd = Dgram.toString(dp) +
    -          ", from address: " + dp.getAddress() +
    -          ", port: " + dp.getPort();
    -        System.out.println(rcvd);
    -        String echoString =
    -          "Echoed: " + rcvd;
    -        // Extract address and port from received
    -        // datagram and send it back there:
    -        DatagramPacket echo =
    -          Dgram.toDatagram(echoString,
    -            dp.getAddress(), dp.getPort());
    -        socket.send(echo);
    -      }
    -    } catch(IOException e) {
    -      throw new RuntimeException(e);
    -    }
    -  }
    -}
    diff --git a/network/Dgram.java b/network/Dgram.java
    deleted file mode 100644
    index 9fbd774d1..000000000
    --- a/network/Dgram.java
    +++ /dev/null
    @@ -1,19 +0,0 @@
    -// network/Dgram.java
    -// (c)2017 MindView LLC: see Copyright.txt
    -// We make no guarantees that this code is fit for any purpose.
    -// Visit http://OnJava8.com for more book information.
    -// Converts between Strings and DataGramPackets
    -import java.net.*;
    -
    -public class Dgram {
    -  public static DatagramPacket toDatagram(
    -    String s, InetAddress destIA, int destPort) {
    -    byte[] buf = s.getBytes();
    -    return new DatagramPacket(buf, buf.length,
    -      destIA, destPort);
    -  }
    -  public static String toString(DatagramPacket p) {
    -    return
    -      new String(p.getData(), 0, p.getLength());
    -  }
    -}
    diff --git a/network/Local.java b/network/Local.java
    deleted file mode 100644
    index 35202670e..000000000
    --- a/network/Local.java
    +++ /dev/null
    @@ -1,15 +0,0 @@
    -// network/Local.java
    -// (c)2017 MindView LLC: see Copyright.txt
    -// We make no guarantees that this code is fit for any purpose.
    -// Visit http://OnJava8.com for more book information.
    -import java.net.*;
    -
    -public class Local {
    -  public static InetAddress host() {
    -    try {
    -      return InetAddress.getByName(null);
    -    } catch(UnknownHostException e) {
    -      throw new RuntimeException(e);
    -    }
    -  }
    -}
    diff --git a/network/LocalHost.java b/network/LocalHost.java
    deleted file mode 100644
    index 487680a60..000000000
    --- a/network/LocalHost.java
    +++ /dev/null
    @@ -1,27 +0,0 @@
    -// network/LocalHost.java
    -// (c)2017 MindView LLC: see Copyright.txt
    -// We make no guarantees that this code is fit for any purpose.
    -// Visit http://OnJava8.com for more book information.
    -// The local loopback IP address
    -import java.net.*;
    -
    -public class LocalHost {
    -  public static void
    -  main(String[] args) throws Exception {
    -    InetAddress
    -      local1 = InetAddress.getByName(null),
    -      local2 = InetAddress.getByName("localhost"),
    -      local3 = InetAddress.getByName("127.0.0.1"),
    -      local4 = InetAddress.getLoopbackAddress();
    -    System.out.println(local1);
    -    System.out.println(local2);
    -    System.out.println(local3);
    -    System.out.println(local4);
    -  }
    -}
    -/* Output:
    -localhost/127.0.0.1
    -localhost/127.0.0.1
    -/127.0.0.1
    -localhost/127.0.0.1
    -*/
    diff --git a/network/MultiServer.java b/network/MultiServer.java
    deleted file mode 100644
    index f538ccb57..000000000
    --- a/network/MultiServer.java
    +++ /dev/null
    @@ -1,29 +0,0 @@
    -// network/MultiServer.java
    -// (c)2017 MindView LLC: see Copyright.txt
    -// We make no guarantees that this code is fit for any purpose.
    -// Visit http://OnJava8.com for more book information.
    -// Uses concurrency to handle any number of clients.
    -import java.io.*;
    -import java.net.*;
    -import java.util.concurrent.*;
    -
    -public class MultiServer implements Runnable {
    -  private final int port;
    -  public MultiServer(int port) {
    -    this.port = port;
    -  }
    -  @Override
    -  public void run() {
    -    System.out.println("Server: Running");
    -    try (
    -      ServerSocket ss = new ServerSocket(port)
    -    ) {
    -      System.out.println("Server: " + ss);
    -      for(int i = 0; i < 10; i++)
    -        CompletableFuture
    -          .runAsync(new SimpleServer(ss));
    -    } catch(IOException e) {
    -      throw new RuntimeException(e);
    -    }
    -  }
    -}
    diff --git a/network/SimpleClient.java b/network/SimpleClient.java
    deleted file mode 100644
    index 0cd88845b..000000000
    --- a/network/SimpleClient.java
    +++ /dev/null
    @@ -1,51 +0,0 @@
    -// network/SimpleClient.java
    -// (c)2017 MindView LLC: see Copyright.txt
    -// We make no guarantees that this code is fit for any purpose.
    -// Visit http://OnJava8.com for more book information.
    -// Sends to the server, reads from the server
    -import java.net.*;
    -import java.io.*;
    -import java.util.concurrent.atomic.*;
    -
    -public class SimpleClient implements Runnable {
    -  public final int port;
    -  private static AtomicInteger idcount =
    -    new AtomicInteger(0);
    -  private final int id = idcount.getAndIncrement();
    -  private InetAddress host;
    -  public SimpleClient(InetAddress host, int port) {
    -    this.host = host;
    -    this.port = port;
    -  }
    -  @Override
    -  public String toString() {
    -    return "Client[" + id + "]: ";
    -  }
    -  @Override
    -  public void run() {
    -    System.out.println(this + "Running");
    -    try(
    -      Socket socket = new Socket(host, port);
    -      BufferedReader in =
    -        new BufferedReader(
    -          new InputStreamReader(
    -            socket.getInputStream()));
    -      PrintWriter out =
    -        new PrintWriter(
    -          new BufferedWriter(
    -            new OutputStreamWriter(
    -              // Enable auto-flush:
    -              socket.getOutputStream())), true);
    -    ) {
    -      System.out.println(this.toString() + socket);
    -      for(int i = 0; i < 10; i ++) {
    -        out.println(this + "(*" + i + "*)");
    -        System.out.println(this +
    -          "Received '" + in.readLine() + "'");
    -      }
    -      out.println("END");
    -    } catch(IOException e) {
    -      throw new RuntimeException(e);
    -    }
    -  }
    -}
    diff --git a/network/SimpleServer.java b/network/SimpleServer.java
    deleted file mode 100644
    index 56e0cf36d..000000000
    --- a/network/SimpleServer.java
    +++ /dev/null
    @@ -1,47 +0,0 @@
    -// network/SimpleServer.java
    -// (c)2017 MindView LLC: see Copyright.txt
    -// We make no guarantees that this code is fit for any purpose.
    -// Visit http://OnJava8.com for more book information.
    -// Echoes what the client sends.
    -import java.io.*;
    -import java.net.*;
    -
    -public class SimpleServer implements Runnable {
    -  private ServerSocket ss;
    -  public SimpleServer(ServerSocket ss) {
    -    this.ss = ss;
    -  }
    -  @Override
    -  public String toString() { return "Server: "; }
    -  @Override
    -  public void run() {
    -    System.out.println(this + "Running");
    -    try (
    -      // Blocks until a connection occurs:
    -      Socket socket = ss.accept();
    -      BufferedReader in =
    -        new BufferedReader(
    -          new InputStreamReader(
    -            socket.getInputStream()));
    -      PrintWriter out =
    -        new PrintWriter(
    -          new BufferedWriter(
    -            new OutputStreamWriter(
    -              // Boolean enables auto-flush:
    -              socket.getOutputStream())), true)
    -    ) {
    -      System.out.println(this.toString() + socket);
    -      in.lines().anyMatch(message -> {
    -        if(message.equals("END")) {
    -          System.out.println(this +
    -            "Received END. Closing Socket.");
    -          return true;
    -        }
    -        out.println(this + message);
    -        return false;
    -      });
    -    } catch(IOException e) {
    -      throw new RuntimeException(e);
    -    }
    -  }
    -}
    diff --git a/network/TestChatter.java b/network/TestChatter.java
    deleted file mode 100644
    index b801bf7bb..000000000
    --- a/network/TestChatter.java
    +++ /dev/null
    @@ -1,18 +0,0 @@
    -// network/TestChatter.java
    -// (c)2017 MindView LLC: see Copyright.txt
    -// We make no guarantees that this code is fit for any purpose.
    -// Visit http://OnJava8.com for more book information.
    -import java.util.concurrent.*;
    -import java.net.*;
    -import onjava.Nap;
    -
    -public class TestChatter {
    -  public static void main(String[] args) {
    -    CompletableFuture.runAsync(
    -      new ChatterServer());
    -    CompletableFuture.runAsync(
    -      new ChatterClient(Local.host()));
    -    new Nap(1);
    -    // No exceptions means success
    -  }
    -}
    diff --git a/network/TestMultiServer.java b/network/TestMultiServer.java
    deleted file mode 100644
    index cd68e23c4..000000000
    --- a/network/TestMultiServer.java
    +++ /dev/null
    @@ -1,22 +0,0 @@
    -// network/TestMultiServer.java
    -// (c)2017 MindView LLC: see Copyright.txt
    -// We make no guarantees that this code is fit for any purpose.
    -// Visit http://OnJava8.com for more book information.
    -import java.net.*;
    -import java.util.concurrent.*;
    -import onjava.Nap;
    -
    -public class TestMultiServer {
    -  public static final int port = 8080;
    -  public static void main(String[] args) {
    -    CompletableFuture.runAsync(
    -      new MultiServer(port));
    -    new Nap(1); // Let the server get started
    -    for(int i = 0; i < 10; i++) {
    -      CompletableFuture.runAsync(
    -        new SimpleClient(Local.host(), port));
    -    }
    -    new Nap(4);
    -    // No exceptions mean success
    -  }
    -}
    diff --git a/network/TestSimpleServer.java b/network/TestSimpleServer.java
    deleted file mode 100644
    index 99f3ca55c..000000000
    --- a/network/TestSimpleServer.java
    +++ /dev/null
    @@ -1,28 +0,0 @@
    -// network/TestSimpleServer.java
    -// (c)2017 MindView LLC: see Copyright.txt
    -// We make no guarantees that this code is fit for any purpose.
    -// Visit http://OnJava8.com for more book information.
    -import java.io.*;
    -import java.net.*;
    -import java.util.concurrent.*;
    -import onjava.Nap;
    -
    -public class TestSimpleServer {
    -  // Choose a port outside of the range 1-1024:
    -  public static final int port = 8080;
    -  public static void main(String[] args) {
    -    try (
    -      ServerSocket ss =
    -        new ServerSocket(port)
    -    ) {
    -      CompletableFuture.runAsync(
    -        new SimpleServer(ss));
    -      CompletableFuture.runAsync(
    -        new SimpleClient(Local.host(), port));
    -      new Nap(1);
    -      // Success if no exceptions happen
    -    } catch(IOException e) {
    -      throw new RuntimeException(e);
    -    }
    -  }
    -}
    diff --git a/network/WhoAmI.java b/network/WhoAmI.java
    deleted file mode 100644
    index c636a7ccc..000000000
    --- a/network/WhoAmI.java
    +++ /dev/null
    @@ -1,19 +0,0 @@
    -// network/WhoAmI.java
    -// (c)2017 MindView LLC: see Copyright.txt
    -// We make no guarantees that this code is fit for any purpose.
    -// Visit http://OnJava8.com for more book information.
    -// Discovers your machine name and network address.
    -import java.net.*;
    -
    -public class WhoAmI {
    -  public static void
    -  main(String[] args) throws UnknownHostException {
    -    InetAddress whoami = InetAddress.getLocalHost();
    -    System.out.println(whoami.getHostName());
    -    System.out.println(whoami.getHostAddress());
    -  }
    -}
    -/* Output:
    -MindviewToshibaLaptop
    -192.168.0.104
    -*/
    diff --git a/onjava/HTMLColors.java b/onjava/HTMLColors.java
    index 0f773983c..c595e8b48 100644
    --- a/onjava/HTMLColors.java
    +++ b/onjava/HTMLColors.java
    @@ -230,6 +230,7 @@ public static void showInv(Map m) {
         showInv(m, m.size());
       }
       public static void border() {
    -    System.out.println("------------------------------");
    +    System.out.println(
    +      "******************************");
       }
     }
    diff --git a/patterns/SingletonPattern.java b/patterns/SingletonPattern.java
    new file mode 100644
    index 000000000..831639823
    --- /dev/null
    +++ b/patterns/SingletonPattern.java
    @@ -0,0 +1,58 @@
    +// patterns/SingletonPattern.java
    +// (c)2017 MindView LLC: see Copyright.txt
    +// We make no guarantees that this code is fit for any purpose.
    +// Visit http://OnJava8.com for more book information.
    +
    +interface Resource {
    +  int getValue();
    +  void setValue(int x);
    +}
    +
    +// Since this isn't inherited from a Cloneable
    +// base class and cloneability isn't added,
    +// making it final prevents cloneability from
    +// being added through inheritance. This also
    +// implements thread-safe lazy initialization:
    +
    +final class Singleton {
    +  private static class
    +  ResourceImpl implements Resource {
    +    private int i;
    +    private ResourceImpl(int i) {
    +      this.i = i;
    +    }
    +    public synchronized int getValue() {
    +      return i;
    +    }
    +    public synchronized void setValue(int x) {
    +      i = x;
    +    }
    +  }
    +  private static class ResourceHolder {
    +    private static Resource resource =
    +      new ResourceImpl(47);
    +  }
    +  public static Resource getResource() {
    +    return ResourceHolder.resource;
    +  }
    +}
    +
    +public class SingletonPattern {
    +  public static void main(String[] args) {
    +    Resource r = Singleton.getResource();
    +    System.out.println(r.getValue());
    +    Resource s2 = Singleton.getResource();
    +    s2.setValue(9);
    +    System.out.println(r.getValue());
    +    try {
    +      // Can't do this: compile-time error.
    +      // Singleton s3 = (Singleton)s2.clone();
    +    } catch(Exception e) {
    +      throw new RuntimeException(e);
    +    }
    +  }
    +}
    +/* Output:
    +47
    +9
    +*/
    diff --git a/references/LocalCopy.java b/references/LocalCopy.java
    new file mode 100644
    index 000000000..60175c7c7
    --- /dev/null
    +++ b/references/LocalCopy.java
    @@ -0,0 +1,57 @@
    +// references/LocalCopy.java
    +// (c)2017 MindView LLC: see Copyright.txt
    +// We make no guarantees that this code is fit for any purpose.
    +// Visit http://OnJava8.com for more book information.
    +// Creating local copies with clone()
    +
    +class Duplo implements Cloneable {
    +  private int n;
    +  public Duplo(int n) { this.n = n; }
    +  @Override
    +  public Duplo clone() { // [1]
    +    try {
    +      return (Duplo)super.clone();
    +    } catch(CloneNotSupportedException e) {
    +      throw new RuntimeException(e);
    +    }
    +  }
    +  public int getValue() { return n; }
    +  public void setValue(int n) { this.n = n; }
    +  public void increment() { n++; }
    +  @Override
    +  public String toString() {
    +    return Integer.toString(n);
    +  }
    +}
    +
    +public class LocalCopy {
    +  public static Duplo g(Duplo v) {
    +    // Passing a reference, modifies outside object:
    +    v.increment();
    +    return v;
    +  }
    +  public static Duplo f(Duplo v) {
    +    v = v.clone(); // [2] Local copy
    +    v.increment();
    +    return v;
    +  }
    +  public static void main(String[] args) {
    +    Duplo a = new Duplo(11);
    +    Duplo b = g(a);
    +    // Reference equivalence, not object equivalence:
    +    System.out.println("a == b: " + (a == b) +
    +      "\na = " + a + "\nb = " + b);
    +    Duplo c = new Duplo(47);
    +    Duplo d = f(c);
    +    System.out.println("c == d: " + (c == d) +
    +      "\nc = " + c + "\nd = " + d);
    +  }
    +}
    +/* Output:
    +a == b: true
    +a = 12
    +b = 12
    +c == d: false
    +c = 47
    +d = 48
    +*/
    diff --git a/remote/DisplayPerfectTime.java b/remote/DisplayPerfectTime.java
    deleted file mode 100644
    index c3556b324..000000000
    --- a/remote/DisplayPerfectTime.java
    +++ /dev/null
    @@ -1,21 +0,0 @@
    -// remote/DisplayPerfectTime.java
    -// (c)2017 MindView LLC: see Copyright.txt
    -// We make no guarantees that this code is fit for any purpose.
    -// Visit http://OnJava8.com for more book information.
    -// Uses remote object PerfectTime
    -// {ValidateByHand}
    -package remote;
    -import java.rmi.registry.*;
    -
    -public class DisplayPerfectTime {
    -  public static void
    -  main(String[] args) throws Exception {
    -    Registry reg =
    -      LocateRegistry.getRegistry("localhost");
    -    PerfectTime pt =
    -      (PerfectTime)reg.lookup("PerfectTime");
    -    for(int i = 0; i < 10; i++)
    -      System.out.println(
    -        "Time: "+ pt.getPerfectTime());
    -  }
    -}
    diff --git a/remote/PerfectTime.java b/remote/PerfectTime.java
    deleted file mode 100644
    index 73c9c67b4..000000000
    --- a/remote/PerfectTime.java
    +++ /dev/null
    @@ -1,11 +0,0 @@
    -// remote/PerfectTime.java
    -// (c)2017 MindView LLC: see Copyright.txt
    -// We make no guarantees that this code is fit for any purpose.
    -// Visit http://OnJava8.com for more book information.
    -// The PerfectTime remote interface
    -package remote;
    -import java.rmi.*;
    -
    -public interface PerfectTime extends Remote {
    -  long getPerfectTime() throws RemoteException;
    -}
    diff --git a/remote/PerfectTimeImpl.java b/remote/PerfectTimeImpl.java
    deleted file mode 100644
    index a1a913025..000000000
    --- a/remote/PerfectTimeImpl.java
    +++ /dev/null
    @@ -1,13 +0,0 @@
    -// remote/PerfectTimeImpl.java
    -// (c)2017 MindView LLC: see Copyright.txt
    -// We make no guarantees that this code is fit for any purpose.
    -// Visit http://OnJava8.com for more book information.
    -// Implementing the PerfectTime remote object
    -package remote;
    -import java.rmi.RemoteException;
    -
    -public class PerfectTimeImpl implements PerfectTime {
    -  public long getPerfectTime() throws RemoteException {
    -    return System.currentTimeMillis();
    -  }
    -}
    diff --git a/remote/PerfectTimeServer.java b/remote/PerfectTimeServer.java
    deleted file mode 100644
    index b466b04e6..000000000
    --- a/remote/PerfectTimeServer.java
    +++ /dev/null
    @@ -1,23 +0,0 @@
    -// remote/PerfectTimeServer.java
    -// (c)2017 MindView LLC: see Copyright.txt
    -// We make no guarantees that this code is fit for any purpose.
    -// Visit http://OnJava8.com for more book information.
    -// Server for the PerfectTime remote object
    -// {ValidateByHand}
    -package remote;
    -import java.rmi.registry.Registry;
    -import java.rmi.registry.LocateRegistry;
    -import java.rmi.RemoteException;
    -import java.rmi.server.UnicastRemoteObject;
    -
    -public class PerfectTimeServer {
    -  public static void
    -  main(String[] args) throws RemoteException {
    -    PerfectTimeImpl pt = new PerfectTimeImpl();
    -    PerfectTime stub = (PerfectTime)
    -      UnicastRemoteObject.exportObject(pt, 0);
    -    Registry registry = LocateRegistry.getRegistry();
    -    registry.rebind("PerfectTime", stub);
    -    System.out.println("Ready to do time");
    -  }
    -}
    
    From 69e3fca3248d0739dcf18c4f4f3a377de1083a0c Mon Sep 17 00:00:00 2001
    From: Bruce Eckel 
    Date: Sun, 16 Apr 2017 15:03:46 -0700
    Subject: [PATCH 228/320] Update to 3.5 release
    
    ---
     gradle/wrapper/gradle-wrapper.properties | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
    index 0a6e31bee..a2a607a91 100644
    --- a/gradle/wrapper/gradle-wrapper.properties
    +++ b/gradle/wrapper/gradle-wrapper.properties
    @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME
     distributionPath=wrapper/dists
     zipStoreBase=GRADLE_USER_HOME
     zipStorePath=wrapper/dists
    -distributionUrl=https\://services.gradle.org/distributions-snapshots/gradle-3.5-20170120000025+0000-bin.zip
    +distributionUrl=https://services.gradle.org/distributions/gradle-3.5-bin.zip
    
    From fe1aac1c73656138831b7cf640d5ff2308a05606 Mon Sep 17 00:00:00 2001
    From: Bruce Eckel 
    Date: Fri, 28 Apr 2017 09:49:10 -0600
    Subject: [PATCH 229/320] Replace "CompileTimeError" with "Will Not Compile"
    
    ---
     .../com/mindviewinc/plugins/TaggingPlugin.groovy       | 10 +++++-----
     .../main/groovy/com/mindviewinc/plugins/Tags.groovy    | 10 +++++-----
     2 files changed, 10 insertions(+), 10 deletions(-)
    
    diff --git a/buildSrc/src/main/groovy/com/mindviewinc/plugins/TaggingPlugin.groovy b/buildSrc/src/main/groovy/com/mindviewinc/plugins/TaggingPlugin.groovy
    index 5b917902a..9e05de155 100644
    --- a/buildSrc/src/main/groovy/com/mindviewinc/plugins/TaggingPlugin.groovy
    +++ b/buildSrc/src/main/groovy/com/mindviewinc/plugins/TaggingPlugin.groovy
    @@ -9,9 +9,9 @@ import org.apache.tools.ant.util.TeeOutputStream
     
     class TaggingPlugin implements Plugin {
         private final static String DEBUG_PROJECT_PROPERTY_KEY = 'debug'
    -    
    +
         void apply(Project project) {
    -        boolean debug = project.hasProperty(DEBUG_PROJECT_PROPERTY_KEY) ? Boolean.valueOf(project.getProperty(DEBUG_PROJECT_PROPERTY_KEY)) : false        
    +        boolean debug = project.hasProperty(DEBUG_PROJECT_PROPERTY_KEY) ? Boolean.valueOf(project.getProperty(DEBUG_PROJECT_PROPERTY_KEY)) : false
             List createdTasks = []
     
             project.projectDir.eachFileRecurse { file ->
    @@ -21,7 +21,7 @@ class TaggingPlugin implements Plugin {
                     if(debug && tags.hasTags()) println tags
     
                     // Exclude java sources that will not compile
    -                if (tags.compileTimeError) {
    +                if (tags.willNotCompile) {
                         project.sourceSets.main.java.excludes.add(file.name)
                     } else {
                         JavaExec javaTask = null
    @@ -76,9 +76,9 @@ class TaggingPlugin implements Plugin {
                     }
                 }
             }
    -        
    +
             project.tasks.create('run') {
                 dependsOn createdTasks
             }
         }
    -}
    \ No newline at end of file
    +}
    diff --git a/buildSrc/src/main/groovy/com/mindviewinc/plugins/Tags.groovy b/buildSrc/src/main/groovy/com/mindviewinc/plugins/Tags.groovy
    index 91d7a8b2d..f2405c1c6 100644
    --- a/buildSrc/src/main/groovy/com/mindviewinc/plugins/Tags.groovy
    +++ b/buildSrc/src/main/groovy/com/mindviewinc/plugins/Tags.groovy
    @@ -2,7 +2,7 @@ package com.mindviewinc.plugins
     
     class Tags {
         Boolean hasMainMethod = false
    -    Boolean compileTimeError = false
    +    Boolean willNotCompile = false
         Boolean throwsException = false
         Boolean errorOutputExpected = false
         Boolean validateByHand = false
    @@ -33,7 +33,7 @@ class Tags {
                         else
                             args << p
             }
    -        compileTimeError = hasTag('CompileTimeError')
    +        willNotCompile = hasTag('WillNotCompile')
             throwsException = hasTag('ThrowsException')
             errorOutputExpected = hasTag('ErrorOutputExpected')
             validateByHand = hasTag('ValidateByHand')
    @@ -68,7 +68,7 @@ class Tags {
             }
         }
         public boolean hasTags() {
    -        return compileTimeError ||
    +        return willNotCompile ||
             throwsException ||
             errorOutputExpected ||
             validateByHand ||
    @@ -87,7 +87,7 @@ class Tags {
             }
             """
             hasMainMethod
    -        compileTimeError
    +        willNotCompile
             throwsException
             errorOutputExpected
             validateByHand
    @@ -105,4 +105,4 @@ class Tags {
             }
             result
         }
    -}
    \ No newline at end of file
    +}
    
    From 847890c3d44ac8262e52e042bf1b01c850d1ce34 Mon Sep 17 00:00:00 2001
    From: Bruce Eckel 
    Date: Fri, 28 Apr 2017 09:54:06 -0600
    Subject: [PATCH 230/320] Change tags to {WillNotCompile}
    
    ---
     exceptions/TryAnything.java             | 2 +-
     functional/Closure3.java                | 2 +-
     functional/Closure5.java                | 2 +-
     functional/Closure7.java                | 2 +-
     functional/Closure9.java                | 2 +-
     generics/Erased.java                    | 2 +-
     generics/HijackedInterface.java         | 2 +-
     generics/Manipulation.java              | 2 +-
     generics/MultipleInterfaceVariants.java | 2 +-
     generics/NonCovariantGenerics.java      | 2 +-
     generics/UseList.java                   | 2 +-
     housekeeping/OverloadingVarargs2.java   | 2 +-
     interfaces/AttemptToUseBasic.java       | 2 +-
     polymorphism/PrivateOverride2.java      | 2 +-
     reuse/Lisa.java                         | 2 +-
     15 files changed, 15 insertions(+), 15 deletions(-)
    
    diff --git a/exceptions/TryAnything.java b/exceptions/TryAnything.java
    index 547a16c95..88e78a898 100644
    --- a/exceptions/TryAnything.java
    +++ b/exceptions/TryAnything.java
    @@ -2,7 +2,7 @@
     // (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
    -// {CompileTimeError} (Will not compile)
    +// {WillNotCompile}
     
     class Anything {}
     
    diff --git a/functional/Closure3.java b/functional/Closure3.java
    index 3bba09ea4..4719f90cf 100644
    --- a/functional/Closure3.java
    +++ b/functional/Closure3.java
    @@ -2,7 +2,7 @@
     // (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
    -// {CompileTimeError} (Will not compile)
    +// {WillNotCompile}
     import java.util.function.*;
     
     public class Closure3 {
    diff --git a/functional/Closure5.java b/functional/Closure5.java
    index d9a5df2f6..ad98bad24 100644
    --- a/functional/Closure5.java
    +++ b/functional/Closure5.java
    @@ -2,7 +2,7 @@
     // (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
    -// {CompileTimeError} (Will not compile)
    +// {WillNotCompile}
     import java.util.function.*;
     
     public class Closure5 {
    diff --git a/functional/Closure7.java b/functional/Closure7.java
    index dba502fc4..f67a6b583 100644
    --- a/functional/Closure7.java
    +++ b/functional/Closure7.java
    @@ -2,7 +2,7 @@
     // (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
    -// {CompileTimeError} (Will not compile)
    +// {WillNotCompile}
     import java.util.function.*;
     
     public class Closure7 {
    diff --git a/functional/Closure9.java b/functional/Closure9.java
    index 4b6c8e27a..af3cb8f4b 100644
    --- a/functional/Closure9.java
    +++ b/functional/Closure9.java
    @@ -2,7 +2,7 @@
     // (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
    -// {CompileTimeError} (Will not compile)
    +// {WillNotCompile}
     import java.util.*;
     import java.util.function.*;
     
    diff --git a/generics/Erased.java b/generics/Erased.java
    index 8a1edd9dc..0c60fbfd4 100644
    --- a/generics/Erased.java
    +++ b/generics/Erased.java
    @@ -2,7 +2,7 @@
     // (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
    -// {CompileTimeError} (Will not compile)
    +// {WillNotCompile}
     
     public class Erased {
       private final int SIZE = 100;
    diff --git a/generics/HijackedInterface.java b/generics/HijackedInterface.java
    index 7787d1f42..c417ecab2 100644
    --- a/generics/HijackedInterface.java
    +++ b/generics/HijackedInterface.java
    @@ -2,7 +2,7 @@
     // (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
    -// {CompileTimeError} (Will not compile)
    +// {WillNotCompile}
     
     class Cat
       extends ComparablePet implements Comparable{
    diff --git a/generics/Manipulation.java b/generics/Manipulation.java
    index 484aa809b..855bb3015 100644
    --- a/generics/Manipulation.java
    +++ b/generics/Manipulation.java
    @@ -2,7 +2,7 @@
     // (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
    -// {CompileTimeError} (Will not compile)
    +// {WillNotCompile}
     
     class Manipulator {
       private T obj;
    diff --git a/generics/MultipleInterfaceVariants.java b/generics/MultipleInterfaceVariants.java
    index 95054a4ab..aca655945 100644
    --- a/generics/MultipleInterfaceVariants.java
    +++ b/generics/MultipleInterfaceVariants.java
    @@ -2,7 +2,7 @@
     // (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
    -// {CompileTimeError} (Will not compile)
    +// {WillNotCompile}
     package generics;
     
     interface Payable {}
    diff --git a/generics/NonCovariantGenerics.java b/generics/NonCovariantGenerics.java
    index 7df8f464c..c532708ed 100644
    --- a/generics/NonCovariantGenerics.java
    +++ b/generics/NonCovariantGenerics.java
    @@ -2,7 +2,7 @@
     // (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
    -// {CompileTimeError} (Will not compile)
    +// {WillNotCompile}
     import java.util.*;
     
     public class NonCovariantGenerics {
    diff --git a/generics/UseList.java b/generics/UseList.java
    index 329768789..ff0262b03 100644
    --- a/generics/UseList.java
    +++ b/generics/UseList.java
    @@ -2,7 +2,7 @@
     // (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
    -// {CompileTimeError} (Will not compile)
    +// {WillNotCompile}
     import java.util.*;
     
     public class UseList {
    diff --git a/housekeeping/OverloadingVarargs2.java b/housekeeping/OverloadingVarargs2.java
    index 340da66f8..a9b779d8d 100644
    --- a/housekeeping/OverloadingVarargs2.java
    +++ b/housekeeping/OverloadingVarargs2.java
    @@ -2,7 +2,7 @@
     // (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
    -// {CompileTimeError} (Will not compile)
    +// {WillNotCompile}
     
     public class OverloadingVarargs2 {
       static void f(float i, Character... args) {
    diff --git a/interfaces/AttemptToUseBasic.java b/interfaces/AttemptToUseBasic.java
    index 5b71bc59f..25901d865 100644
    --- a/interfaces/AttemptToUseBasic.java
    +++ b/interfaces/AttemptToUseBasic.java
    @@ -2,7 +2,7 @@
     // (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
    -// {CompileTimeError} (Will not compile)
    +// {WillNotCompile}
     
     public class AttemptToUseBasic {
       Basic b = new Basic();
    diff --git a/polymorphism/PrivateOverride2.java b/polymorphism/PrivateOverride2.java
    index df695d55f..fa4768669 100644
    --- a/polymorphism/PrivateOverride2.java
    +++ b/polymorphism/PrivateOverride2.java
    @@ -3,7 +3,7 @@
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Detecting a mistaken override using @Override
    -// {CompileTimeError} (Will not compile)
    +// {WillNotCompile}
     package polymorphism;
     
     public class PrivateOverride2 {
    diff --git a/reuse/Lisa.java b/reuse/Lisa.java
    index bc0df2071..6d175fe5d 100644
    --- a/reuse/Lisa.java
    +++ b/reuse/Lisa.java
    @@ -2,7 +2,7 @@
     // (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
    -// {CompileTimeError} (Will not compile)
    +// {WillNotCompile}
     
     class Lisa extends Homer {
       @Override void doh(Milhouse m) {
    
    From 58a380bb184f8934e9b628dee02fa435cbea0bff Mon Sep 17 00:00:00 2001
    From: Bruce Eckel 
    Date: Mon, 1 May 2017 05:58:47 -0600
    Subject: [PATCH 231/320] Extracted javadoc appendix
    
    ---
     check.bat                                | 2 +-
     {objects => javadoc}/Documentation1.java | 2 +-
     {objects => javadoc}/Documentation2.java | 2 +-
     {objects => javadoc}/Documentation3.java | 2 +-
     {objects => javadoc}/HelloDateDoc.java   | 2 +-
     onjava/HTMLColors.java                   | 2 +-
     6 files changed, 6 insertions(+), 6 deletions(-)
     rename {objects => javadoc}/Documentation1.java (90%)
     rename {objects => javadoc}/Documentation2.java (89%)
     rename {objects => javadoc}/Documentation3.java (90%)
     rename {objects => javadoc}/HelloDateDoc.java (95%)
    
    diff --git a/check.bat b/check.bat
    index 25446ee4b..c250560b1 100644
    --- a/check.bat
    +++ b/check.bat
    @@ -1,2 +1,2 @@
     cp ..\..\OnJava-Tools\verify_output.py .
    -py -3 verify_output.py
    +python verify_output.py
    diff --git a/objects/Documentation1.java b/javadoc/Documentation1.java
    similarity index 90%
    rename from objects/Documentation1.java
    rename to javadoc/Documentation1.java
    index 42d7bfb9a..906df8dd7 100644
    --- a/objects/Documentation1.java
    +++ b/javadoc/Documentation1.java
    @@ -1,4 +1,4 @@
    -// objects/Documentation1.java
    +// javadoc/Documentation1.java
     // (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
    diff --git a/objects/Documentation2.java b/javadoc/Documentation2.java
    similarity index 89%
    rename from objects/Documentation2.java
    rename to javadoc/Documentation2.java
    index db857a29b..a19594726 100644
    --- a/objects/Documentation2.java
    +++ b/javadoc/Documentation2.java
    @@ -1,4 +1,4 @@
    -// objects/Documentation2.java
    +// javadoc/Documentation2.java
     // (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
    diff --git a/objects/Documentation3.java b/javadoc/Documentation3.java
    similarity index 90%
    rename from objects/Documentation3.java
    rename to javadoc/Documentation3.java
    index 582b83468..34f62ac3d 100644
    --- a/objects/Documentation3.java
    +++ b/javadoc/Documentation3.java
    @@ -1,4 +1,4 @@
    -// objects/Documentation3.java
    +// javadoc/Documentation3.java
     // (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
    diff --git a/objects/HelloDateDoc.java b/javadoc/HelloDateDoc.java
    similarity index 95%
    rename from objects/HelloDateDoc.java
    rename to javadoc/HelloDateDoc.java
    index 93f326dd3..8aef609bf 100644
    --- a/objects/HelloDateDoc.java
    +++ b/javadoc/HelloDateDoc.java
    @@ -1,4 +1,4 @@
    -// objects/HelloDateDoc.java
    +// javadoc/HelloDateDoc.java
     // (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
    diff --git a/onjava/HTMLColors.java b/onjava/HTMLColors.java
    index c595e8b48..f960d23af 100644
    --- a/onjava/HTMLColors.java
    +++ b/onjava/HTMLColors.java
    @@ -189,7 +189,7 @@ public static Integer rgb(String colorName) {
       public static
       void show(Map.Entry e) {
         System.out.format(
    -      "0x%06X: %s\n", e.getKey(), e.getValue());
    +      "0x%06X: %s%n", e.getKey(), e.getValue());
       }
       public static void
       show(Map m, int count) {
    
    From 196a375b85a386a228ca16eb20c92853540640aa Mon Sep 17 00:00:00 2001
    From: Bruce Eckel 
    Date: Mon, 1 May 2017 06:47:35 -0600
    Subject: [PATCH 232/320] Fixed bug, RedundantThrows stopped working
    
    ---
     checkstyle.xml | 3 ++-
     1 file changed, 2 insertions(+), 1 deletion(-)
    
    diff --git a/checkstyle.xml b/checkstyle.xml
    index 8731d2620..aabea2c45 100644
    --- a/checkstyle.xml
    +++ b/checkstyle.xml
    @@ -153,7 +153,8 @@
     
     
             
    -        
    +        
    +
             
             
     
    
    From b2f63b666cff9bb0c9e9220fd9951e08057ded16 Mon Sep 17 00:00:00 2001
    From: Bruce Eckel 
    Date: Mon, 1 May 2017 07:01:55 -0600
    Subject: [PATCH 233/320] batchfile shorthand to run checkstyle
    
    ---
     chkstyle.bat | 2 ++
     1 file changed, 2 insertions(+)
     create mode 100644 chkstyle.bat
    
    diff --git a/chkstyle.bat b/chkstyle.bat
    new file mode 100644
    index 000000000..f389e5b75
    --- /dev/null
    +++ b/chkstyle.bat
    @@ -0,0 +1,2 @@
    +gradlew clean
    +gradlew checkstyleMain 1> checkstyleout.txt 2>&1
    
    From 97dcdebc0c3341f5e6f148337aa80a5ee6d66509 Mon Sep 17 00:00:00 2001
    From: Bruce Eckel 
    Date: Mon, 1 May 2017 14:33:10 -0600
    Subject: [PATCH 234/320] Checkstyle passing
    
    ---
     arrays/ArrayCopying.java                      |  4 +--
     arrays/SimpleSetAll.java                      |  2 +-
     check.bat                                     |  2 +-
     chkstyle.bat                                  |  2 +-
     collections/AdapterMethodIdiom.java           |  2 +-
     collectiontopics/CanonicalMapping.java        |  6 ++--
     collectiontopics/FillingLists.java            |  2 +-
     collectiontopics/References.java              |  2 +-
     collectiontopics/SimpleDeques.java            |  4 +--
     collectiontopics/ToDoList.java                |  2 +-
     collectiontopics/TypesForSets.java            |  7 ++--
     concurrent/CatchCompletableExceptions.java    |  1 -
     concurrent/CompletableExceptions.java         |  1 -
     concurrent/CompletablePizza.java              |  2 +-
     concurrent/FrostedCake.java                   |  2 +-
     concurrent/IDChecker.java                     |  4 +--
     concurrent/PizzaParallelSteps.java            |  2 +-
     concurrent/PizzaStreams.java                  |  2 +-
     concurrent/SharedConstructorArgument.java     |  2 +-
     concurrent/StreamExceptions.java              |  1 -
     concurrent/SynchronizedConstructor.java       |  2 +-
     concurrent/SynchronizedFactory.java           |  2 +-
     enums/VendingMachine.java                     |  2 +-
     equalshashcode/ComposedEquality.java          |  2 +-
     equalshashcode/DefaultComparison.java         |  2 +-
     equalshashcode/SubtypeEquality.java           |  6 ++--
     equalshashcode/SubtypeEquality2.java          |  4 +--
     exceptions/AutoCloseableDetails.java          |  2 +-
     exceptions/CleanupIdiom.java                  |  2 +-
     exceptions/CloseExceptions.java               |  2 +-
     exceptions/ConstructorException.java          |  2 +-
     exceptions/ExtraFeatures.java                 |  6 ++--
     exceptions/FullConstructors.java              |  4 +--
     exceptions/LoggingExceptions.java             |  2 +-
     exceptions/RethrowNew.java                    |  4 +--
     exceptions/StormyInning.java                  |  2 +-
     functional/FunctionVariants.java              |  8 ++---
     functional/MethodReferences.java              |  2 +-
     generics/DynamicProxyMixin.java               |  2 +-
     generics/FactoryConstraint.java               |  4 +--
     generics/FilledList.java                      |  4 +--
     generics/GenericCast.java                     |  2 +-
     generics/InstantiateGenericType.java          |  2 +-
     generics/Manipulation.java                    |  2 +-
     generics/Manipulator2.java                    |  2 +-
     generics/Manipulator3.java                    |  2 +-
     generics/Mixins.java                          |  2 +-
     generics/ReturnGenericType.java               |  2 +-
     generics/Store.java                           |  5 ++-
     generics/decorator/Decoration.java            |  6 ++--
     innerclasses/AnonymousConstructor.java        |  2 +-
     innerclasses/BigEgg.java                      |  2 +-
     innerclasses/BigEgg2.java                     |  2 +-
     innerclasses/LocalInnerClass.java             |  2 +-
     interfaces/Applicator.java                    | 10 +++---
     .../interfaceprocessor/FilterProcessor.java   |  2 +-
     lowlevel/DelayQueueDemo.java                  |  4 +--
     lowlevel/PriorityBlockingQueueDemo.java       |  7 ++--
     lowlevel/SafeReturn.java                      |  1 -
     lowlevel/SynchronizedComparison.java          |  2 +-
     lowlevel/UnsafeReturn.java                    |  1 -
     newio/MappedIO.java                           |  2 +-
     onjava/Count.java                             | 31 +++++++++---------
     onjava/CountMap.java                          |  6 ++--
     onjava/Rand.java                              | 32 +++++++++----------
     patterns/Facade.java                          |  6 ++--
     patterns/ProxyDemo.java                       |  2 +-
     patterns/ShapeFactory3.java                   |  1 -
     patterns/SingletonPattern.java                |  2 +-
     patterns/StateDemo.java                       |  2 +-
     patterns/TemplateMethod.java                  |  2 +-
     patterns/adapt/Adapter.java                   |  2 +-
     patterns/chain/ChainOfResponsibility.java     |  4 +--
     patterns/dynatrash/DynaTrash.java             |  2 +-
     patterns/observer/ObservedFlower.java         |  6 ++--
     patterns/state/StateMachineDemo.java          |  2 +-
     patterns/strategy/StrategyPattern.java        |  2 +-
     polymorphism/ReferenceCounting.java           |  4 +--
     references/AddingClone.java                   |  4 +--
     references/CloneArrayList.java                |  2 +-
     references/CopyConstructor.java               | 24 +++++++-------
     references/Immutable2.java                    |  2 +-
     references/LocalCopy.java                     |  2 +-
     references/MutableInteger.java                |  2 +-
     references/SimplerMutableInteger.java         |  2 +-
     reuse/FinalData.java                          |  2 +-
     reuse/Orc.java                                |  2 +-
     serialization/AStoreCADState.java             |  8 ++---
     serialization/Blips.java                      |  2 +-
     serialization/Worm.java                       |  2 +-
     streams/MapCollector.java                     |  2 +-
     typeinfo/Person.java                          |  7 ++--
     typeinfo/PetCount3.java                       |  2 +-
     typeinfo/Position.java                        |  4 +--
     typeinfo/SelectingMethods.java                |  2 +-
     typeinfo/SimpleDynamicProxy.java              |  2 +-
     typeinfo/SimpleProxyDemo.java                 |  2 +-
     97 files changed, 173 insertions(+), 188 deletions(-)
    
    diff --git a/arrays/ArrayCopying.java b/arrays/ArrayCopying.java
    index 01022e242..8d4ae37e6 100644
    --- a/arrays/ArrayCopying.java
    +++ b/arrays/ArrayCopying.java
    @@ -9,7 +9,7 @@
     
     class Sup { // Superclass
       private int id;
    -  public Sup(int n) { id = n; }
    +  Sup(int n) { id = n; }
       @Override
       public String toString() {
         return getClass().getSimpleName() + id;
    @@ -17,7 +17,7 @@ public String toString() {
     }
     
     class Sub extends Sup { // Subclass
    -  public Sub(int n) { super(n); }
    +  Sub(int n) { super(n); }
     }
     
     public class ArrayCopying {
    diff --git a/arrays/SimpleSetAll.java b/arrays/SimpleSetAll.java
    index 060a986de..ce281c972 100644
    --- a/arrays/SimpleSetAll.java
    +++ b/arrays/SimpleSetAll.java
    @@ -7,7 +7,7 @@
     
     class Bob {
       final int id;
    -  public Bob(int n) { id = n; }
    +  Bob(int n) { id = n; }
       @Override
       public String toString() { return "Bob" + id; }
     }
    diff --git a/check.bat b/check.bat
    index c250560b1..25446ee4b 100644
    --- a/check.bat
    +++ b/check.bat
    @@ -1,2 +1,2 @@
     cp ..\..\OnJava-Tools\verify_output.py .
    -python verify_output.py
    +py -3 verify_output.py
    diff --git a/chkstyle.bat b/chkstyle.bat
    index f389e5b75..24838fc01 100644
    --- a/chkstyle.bat
    +++ b/chkstyle.bat
    @@ -1,2 +1,2 @@
    -gradlew clean
    +@echo run gradlew clean first!
     gradlew checkstyleMain 1> checkstyleout.txt 2>&1
    diff --git a/collections/AdapterMethodIdiom.java b/collections/AdapterMethodIdiom.java
    index 528cb8292..a7ebc6167 100644
    --- a/collections/AdapterMethodIdiom.java
    +++ b/collections/AdapterMethodIdiom.java
    @@ -7,7 +7,7 @@
     import java.util.*;
     
     class ReversibleArrayList extends ArrayList {
    -  public ReversibleArrayList(Collection c) {
    +  ReversibleArrayList(Collection c) {
         super(c);
       }
       public Iterable reversed() {
    diff --git a/collectiontopics/CanonicalMapping.java b/collectiontopics/CanonicalMapping.java
    index f81d0bb83..f3bbdae2b 100644
    --- a/collectiontopics/CanonicalMapping.java
    +++ b/collectiontopics/CanonicalMapping.java
    @@ -7,7 +7,7 @@
     
     class Element {
       private String ident;
    -  public Element(String id) { ident = id; }
    +  Element(String id) { ident = id; }
       @Override
       public String toString() { return ident; }
       @Override
    @@ -27,11 +27,11 @@ protected void finalize() {
     }
     
     class Key extends Element {
    -  public Key(String id) { super(id); }
    +  Key(String id) { super(id); }
     }
     
     class Value extends Element {
    -  public Value(String id) { super(id); }
    +  Value(String id) { super(id); }
     }
     
     public class CanonicalMapping {
    diff --git a/collectiontopics/FillingLists.java b/collectiontopics/FillingLists.java
    index f8fe104e2..e29fd4560 100644
    --- a/collectiontopics/FillingLists.java
    +++ b/collectiontopics/FillingLists.java
    @@ -7,7 +7,7 @@
     
     class StringAddress {
       private String s;
    -  public StringAddress(String s) { this.s = s; }
    +  StringAddress(String s) { this.s = s; }
       @Override
       public String toString() {
         return super.toString() + " " + s;
    diff --git a/collectiontopics/References.java b/collectiontopics/References.java
    index 68e9ec52a..ea99741f1 100644
    --- a/collectiontopics/References.java
    +++ b/collectiontopics/References.java
    @@ -10,7 +10,7 @@ class VeryBig {
       private static final int SIZE = 10000;
       private long[] la = new long[SIZE];
       private String ident;
    -  public VeryBig(String id) { ident = id; }
    +  VeryBig(String id) { ident = id; }
       @Override
       public String toString() { return ident; }
       @Override
    diff --git a/collectiontopics/SimpleDeques.java b/collectiontopics/SimpleDeques.java
    index 1600178e9..c938ec001 100644
    --- a/collectiontopics/SimpleDeques.java
    +++ b/collectiontopics/SimpleDeques.java
    @@ -9,8 +9,8 @@
     
     class CountString implements Supplier {
       private int n = 0;
    -  public CountString() {}
    -  public CountString(int start) { n = start; }
    +  CountString() {}
    +  CountString(int start) { n = start; }
       @Override
       public String get() {
         return Integer.toString(n++);
    diff --git a/collectiontopics/ToDoList.java b/collectiontopics/ToDoList.java
    index 8b5cb8564..1da979ba2 100644
    --- a/collectiontopics/ToDoList.java
    +++ b/collectiontopics/ToDoList.java
    @@ -9,7 +9,7 @@ class ToDoItem implements Comparable {
       private char primary;
       private int secondary;
       private String item;
    -  public ToDoItem(String td, char pri, int sec) {
    +  ToDoItem(String td, char pri, int sec) {
         primary = pri;
         secondary = sec;
         item = td;
    diff --git a/collectiontopics/TypesForSets.java b/collectiontopics/TypesForSets.java
    index cd672c9d6..b7840f64c 100644
    --- a/collectiontopics/TypesForSets.java
    +++ b/collectiontopics/TypesForSets.java
    @@ -6,11 +6,10 @@
     import java.util.*;
     import java.util.function.*;
     import java.util.Objects;
    -import onjava.CountMap;
     
     class SetType {
       protected int i;
    -  public SetType(int n) { i = n; }
    +  SetType(int n) { i = n; }
       @Override
       public boolean equals(Object o) {
         return o instanceof SetType &&
    @@ -23,7 +22,7 @@ public String toString() {
     }
     
     class HashType extends SetType {
    -  public HashType(int n) { super(n); }
    +  HashType(int n) { super(n); }
       @Override
       public int hashCode() {
         return Objects.hashCode(i);
    @@ -32,7 +31,7 @@ public int hashCode() {
     
     class TreeType extends SetType
     implements Comparable {
    -  public TreeType(int n) { super(n); }
    +  TreeType(int n) { super(n); }
       @Override
       public int compareTo(TreeType arg) {
         return Integer.compare(arg.i, i);
    diff --git a/concurrent/CatchCompletableExceptions.java b/concurrent/CatchCompletableExceptions.java
    index f0e39d89a..3f4036be3 100644
    --- a/concurrent/CatchCompletableExceptions.java
    +++ b/concurrent/CatchCompletableExceptions.java
    @@ -3,7 +3,6 @@
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.concurrent.*;
    -import onjava.Nap;
     
     public class CatchCompletableExceptions {
       static void handleException(int failcount) {
    diff --git a/concurrent/CompletableExceptions.java b/concurrent/CompletableExceptions.java
    index b035c5cf3..e7bac94bc 100644
    --- a/concurrent/CompletableExceptions.java
    +++ b/concurrent/CompletableExceptions.java
    @@ -3,7 +3,6 @@
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.concurrent.*;
    -import onjava.Nap;
     
     public class CompletableExceptions {
       static CompletableFuture
    diff --git a/concurrent/CompletablePizza.java b/concurrent/CompletablePizza.java
    index 6072e81a2..fb800abe5 100644
    --- a/concurrent/CompletablePizza.java
    +++ b/concurrent/CompletablePizza.java
    @@ -8,7 +8,7 @@
     import onjava.Timer;
     
     public class CompletablePizza {
    -  static int QUANTITY = 5;
    +  static final int QUANTITY = 5;
       public static CompletableFuture
       makeCF(Pizza za) {
         return CompletableFuture
    diff --git a/concurrent/FrostedCake.java b/concurrent/FrostedCake.java
    index 0203e7223..0d5a84b4d 100644
    --- a/concurrent/FrostedCake.java
    +++ b/concurrent/FrostedCake.java
    @@ -6,7 +6,7 @@
     import java.util.stream.*;
     import onjava.Nap;
     
    -class Frosting {
    +final class Frosting {
       private Frosting() {}
       static CompletableFuture make() {
         new Nap(0.1);
    diff --git a/concurrent/IDChecker.java b/concurrent/IDChecker.java
    index e4f7cac5a..f21a63d3c 100644
    --- a/concurrent/IDChecker.java
    +++ b/concurrent/IDChecker.java
    @@ -9,11 +9,11 @@
     import com.google.common.collect.Sets;
     
     public class IDChecker {
    -  public static int SIZE = 100_000;
    +  public static final int SIZE = 100_000;
       static class MakeObjects
       implements Supplier> {
         private Supplier gen;
    -    public MakeObjects(Supplier gen) {
    +    MakeObjects(Supplier gen) {
           this.gen = gen;
         }
         @Override
    diff --git a/concurrent/PizzaParallelSteps.java b/concurrent/PizzaParallelSteps.java
    index 32e53360a..26f5e9a8c 100644
    --- a/concurrent/PizzaParallelSteps.java
    +++ b/concurrent/PizzaParallelSteps.java
    @@ -7,7 +7,7 @@
     import onjava.Timer;
     
     public class PizzaParallelSteps {
    -  static int QUANTITY = 5;
    +  static final int QUANTITY = 5;
       public static void main(String[] args) {
         Timer timer = new Timer();
         IntStream.range(0, QUANTITY)
    diff --git a/concurrent/PizzaStreams.java b/concurrent/PizzaStreams.java
    index d16fc13f3..58f81d6f8 100644
    --- a/concurrent/PizzaStreams.java
    +++ b/concurrent/PizzaStreams.java
    @@ -7,7 +7,7 @@
     import onjava.Timer;
     
     public class PizzaStreams {
    -  static int QUANTITY = 5;
    +  static final int QUANTITY = 5;
       public static void main(String[] args) {
         Timer timer = new Timer();
         IntStream.range(0, QUANTITY)
    diff --git a/concurrent/SharedConstructorArgument.java b/concurrent/SharedConstructorArgument.java
    index b49f857af..0d987088e 100644
    --- a/concurrent/SharedConstructorArgument.java
    +++ b/concurrent/SharedConstructorArgument.java
    @@ -23,7 +23,7 @@ public int get() {
     
     class SharedUser implements HasID {
       private final int id;
    -  public SharedUser(SharedArg sa) {
    +  SharedUser(SharedArg sa) {
         id = sa.get();
       }
       @Override
    diff --git a/concurrent/StreamExceptions.java b/concurrent/StreamExceptions.java
    index 372e53fc5..facae761e 100644
    --- a/concurrent/StreamExceptions.java
    +++ b/concurrent/StreamExceptions.java
    @@ -4,7 +4,6 @@
     // Visit http://OnJava8.com for more book information.
     import java.util.concurrent.*;
     import java.util.stream.*;
    -import onjava.Nap;
     
     public class StreamExceptions {
       static Stream
    diff --git a/concurrent/SynchronizedConstructor.java b/concurrent/SynchronizedConstructor.java
    index 0533f8bbc..520829ee3 100644
    --- a/concurrent/SynchronizedConstructor.java
    +++ b/concurrent/SynchronizedConstructor.java
    @@ -8,7 +8,7 @@ class SyncConstructor implements HasID {
       private final int id;
       private static Object
         constructorLock = new Object();
    -  public SyncConstructor(SharedArg sa) {
    +  SyncConstructor(SharedArg sa) {
         synchronized(constructorLock) {
           id = sa.get();
         }
    diff --git a/concurrent/SynchronizedFactory.java b/concurrent/SynchronizedFactory.java
    index d16d3a3e4..4f682082b 100644
    --- a/concurrent/SynchronizedFactory.java
    +++ b/concurrent/SynchronizedFactory.java
    @@ -4,7 +4,7 @@
     // Visit http://OnJava8.com for more book information.
     import java.util.concurrent.atomic.*;
     
    -class SyncFactory implements HasID {
    +final class SyncFactory implements HasID {
       private final int id;
       private SyncFactory(SharedArg sa) {
         id = sa.get();
    diff --git a/enums/VendingMachine.java b/enums/VendingMachine.java
    index d5d7bf4df..d1027e22f 100644
    --- a/enums/VendingMachine.java
    +++ b/enums/VendingMachine.java
    @@ -133,7 +133,7 @@ public Input get() {
     // Create Inputs from a file of ';'-separated strings:
     class FileInputSupplier implements Supplier {
       private Iterator input;
    -  public FileInputSupplier(String fileName) {
    +  FileInputSupplier(String fileName) {
         try {
           input = Files.lines(Paths.get(fileName))
             .skip(1) // Skip the comment line
    diff --git a/equalshashcode/ComposedEquality.java b/equalshashcode/ComposedEquality.java
    index b9931a66e..f9faf9331 100644
    --- a/equalshashcode/ComposedEquality.java
    +++ b/equalshashcode/ComposedEquality.java
    @@ -7,7 +7,7 @@
     class Part {
       String ss;
       double dd;
    -  public Part(String ss, double dd) {
    +  Part(String ss, double dd) {
         this.ss = ss;
         this.dd = dd;
       }
    diff --git a/equalshashcode/DefaultComparison.java b/equalshashcode/DefaultComparison.java
    index a702d4da7..541e918ea 100644
    --- a/equalshashcode/DefaultComparison.java
    +++ b/equalshashcode/DefaultComparison.java
    @@ -5,7 +5,7 @@
     
     class DefaultComparison {
       private int i, j, k;
    -  public DefaultComparison(int i, int j, int k) {
    +  DefaultComparison(int i, int j, int k) {
         this.i = i;
         this.j = j;
         this.k = k;
    diff --git a/equalshashcode/SubtypeEquality.java b/equalshashcode/SubtypeEquality.java
    index 50cf361b8..4dc1d060a 100644
    --- a/equalshashcode/SubtypeEquality.java
    +++ b/equalshashcode/SubtypeEquality.java
    @@ -11,7 +11,7 @@ class Animal {
       private final int id = counter++;
       private final String name;
       private final Size size;
    -  public Animal(String name, Size size) {
    +  Animal(String name, Size size) {
         this.name = name;
         this.size = size;
       }
    @@ -36,13 +36,13 @@ public String toString() {
     }
     
     class Dog extends Animal {
    -  public Dog(String name, Size size) {
    +  Dog(String name, Size size) {
         super(name, size);
       }
     }
     
     class Pig extends Animal {
    -  public Pig(String name, Size size) {
    +  Pig(String name, Size size) {
         super(name, size);
       }
     }
    diff --git a/equalshashcode/SubtypeEquality2.java b/equalshashcode/SubtypeEquality2.java
    index 990ddf762..881749293 100644
    --- a/equalshashcode/SubtypeEquality2.java
    +++ b/equalshashcode/SubtypeEquality2.java
    @@ -5,7 +5,7 @@
     import java.util.*;
     
     class Dog2 extends Animal {
    -  public Dog2(String name, Size size) {
    +  Dog2(String name, Size size) {
         super(name, size);
       }
       @Override
    @@ -16,7 +16,7 @@ public boolean equals(Object rval) {
     }
     
     class Pig2 extends Animal {
    -  public Pig2(String name, Size size) {
    +  Pig2(String name, Size size) {
         super(name, size);
       }
       @Override
    diff --git a/exceptions/AutoCloseableDetails.java b/exceptions/AutoCloseableDetails.java
    index 23f8a172a..e6f8f77d4 100644
    --- a/exceptions/AutoCloseableDetails.java
    +++ b/exceptions/AutoCloseableDetails.java
    @@ -5,7 +5,7 @@
     
     class Reporter implements AutoCloseable {
       String name = getClass().getSimpleName();
    -  public Reporter() {
    +  Reporter() {
         System.out.println("Creating " + name);
       }
       public void close() {
    diff --git a/exceptions/CleanupIdiom.java b/exceptions/CleanupIdiom.java
    index 48ce0d45f..e4727258b 100644
    --- a/exceptions/CleanupIdiom.java
    +++ b/exceptions/CleanupIdiom.java
    @@ -17,7 +17,7 @@ class ConstructionException extends Exception {}
     
     class NeedsCleanup2 extends NeedsCleanup {
       // Construction can fail:
    -  public NeedsCleanup2() throws ConstructionException {}
    +  NeedsCleanup2() throws ConstructionException {}
     }
     
     public class CleanupIdiom {
    diff --git a/exceptions/CloseExceptions.java b/exceptions/CloseExceptions.java
    index 9ad598b43..6a1a51b0d 100644
    --- a/exceptions/CloseExceptions.java
    +++ b/exceptions/CloseExceptions.java
    @@ -7,7 +7,7 @@ class CloseException extends Exception {}
     
     class Reporter2 implements AutoCloseable {
       String name = getClass().getSimpleName();
    -  public Reporter2() {
    +  Reporter2() {
         System.out.println("Creating " + name);
       }
       public void close() throws CloseException {
    diff --git a/exceptions/ConstructorException.java b/exceptions/ConstructorException.java
    index d3342b388..3c48ecf77 100644
    --- a/exceptions/ConstructorException.java
    +++ b/exceptions/ConstructorException.java
    @@ -6,7 +6,7 @@
     class CE extends Exception {}
     
     class SecondExcept extends Reporter {
    -  public SecondExcept() throws CE {
    +  SecondExcept() throws CE {
         super();
         throw new CE();
       }
    diff --git a/exceptions/ExtraFeatures.java b/exceptions/ExtraFeatures.java
    index b45c27e39..6cf69f427 100644
    --- a/exceptions/ExtraFeatures.java
    +++ b/exceptions/ExtraFeatures.java
    @@ -6,9 +6,9 @@
     
     class MyException2 extends Exception {
       private int x;
    -  public MyException2() {}
    -  public MyException2(String msg) { super(msg); }
    -  public MyException2(String msg, int x) {
    +  MyException2() {}
    +  MyException2(String msg) { super(msg); }
    +  MyException2(String msg, int x) {
         super(msg);
         this.x = x;
       }
    diff --git a/exceptions/FullConstructors.java b/exceptions/FullConstructors.java
    index 1851d2d6c..80c04657f 100644
    --- a/exceptions/FullConstructors.java
    +++ b/exceptions/FullConstructors.java
    @@ -4,8 +4,8 @@
     // Visit http://OnJava8.com for more book information.
     
     class MyException extends Exception {
    -  public MyException() {}
    -  public MyException(String msg) { super(msg); }
    +  MyException() {}
    +  MyException(String msg) { super(msg); }
     }
     
     public class FullConstructors {
    diff --git a/exceptions/LoggingExceptions.java b/exceptions/LoggingExceptions.java
    index ebdd809d8..c28510f8a 100644
    --- a/exceptions/LoggingExceptions.java
    +++ b/exceptions/LoggingExceptions.java
    @@ -10,7 +10,7 @@
     class LoggingException extends Exception {
       private static Logger logger =
         Logger.getLogger("LoggingException");
    -  public LoggingException() {
    +  LoggingException() {
         StringWriter trace = new StringWriter();
         printStackTrace(new PrintWriter(trace));
         logger.severe(trace.toString());
    diff --git a/exceptions/RethrowNew.java b/exceptions/RethrowNew.java
    index cc2601b07..e03f75099 100644
    --- a/exceptions/RethrowNew.java
    +++ b/exceptions/RethrowNew.java
    @@ -5,11 +5,11 @@
     // Rethrow a different object from the one you caught
     
     class OneException extends Exception {
    -  public OneException(String s) { super(s); }
    +  OneException(String s) { super(s); }
     }
     
     class TwoException extends Exception {
    -  public TwoException(String s) { super(s); }
    +  TwoException(String s) { super(s); }
     }
     
     public class RethrowNew {
    diff --git a/exceptions/StormyInning.java b/exceptions/StormyInning.java
    index 5b2b727c0..1656d062e 100644
    --- a/exceptions/StormyInning.java
    +++ b/exceptions/StormyInning.java
    @@ -11,7 +11,7 @@ class Foul extends BaseballException {}
     class Strike extends BaseballException {}
     
     abstract class Inning {
    -  public Inning() throws BaseballException {}
    +  Inning() throws BaseballException {}
       public void event() throws BaseballException {
         // Doesn't actually have to throw anything
       }
    diff --git a/functional/FunctionVariants.java b/functional/FunctionVariants.java
    index 976f7f283..d09476ca6 100644
    --- a/functional/FunctionVariants.java
    +++ b/functional/FunctionVariants.java
    @@ -8,26 +8,26 @@ class Foo {}
     
     class Bar {
       Foo f;
    -  public Bar(Foo f) { this.f = f; }
    +  Bar(Foo f) { this.f = f; }
     }
     
     class IBaz {
       int i;
    -  public IBaz(int i) {
    +  IBaz(int i) {
         this.i = i;
       }
     }
     
     class LBaz {
       long l;
    -  public LBaz(long l) {
    +  LBaz(long l) {
         this.l = l;
       }
     }
     
     class DBaz {
       double d;
    -  public DBaz(double d) {
    +  DBaz(double d) {
         this.d = d;
       }
     }
    diff --git a/functional/MethodReferences.java b/functional/MethodReferences.java
    index 85a4f0b93..dde6ba0e0 100644
    --- a/functional/MethodReferences.java
    +++ b/functional/MethodReferences.java
    @@ -20,7 +20,7 @@ static void hello(String name) { // [3]
       }
       static class Description {
         String about;
    -    public Description(String desc) { about = desc; }
    +    Description(String desc) { about = desc; }
         void help(String msg) { // [4]
           System.out.println(about + " " + msg);
         }
    diff --git a/generics/DynamicProxyMixin.java b/generics/DynamicProxyMixin.java
    index 337ab3e8e..75e162b9f 100644
    --- a/generics/DynamicProxyMixin.java
    +++ b/generics/DynamicProxyMixin.java
    @@ -10,7 +10,7 @@
     class MixinProxy implements InvocationHandler {
       Map delegatesByMethod;
       @SuppressWarnings("unchecked")
    -  public MixinProxy(Tuple2>... pairs) {
    +  MixinProxy(Tuple2>... pairs) {
         delegatesByMethod = new HashMap<>();
         for(Tuple2> pair : pairs) {
           for(Method method : pair.a2.getMethods()) {
    diff --git a/generics/FactoryConstraint.java b/generics/FactoryConstraint.java
    index 36957a867..734eabecb 100644
    --- a/generics/FactoryConstraint.java
    +++ b/generics/FactoryConstraint.java
    @@ -16,7 +16,7 @@ public Integer get() {
     
     class Widget {
       private int id;
    -  public Widget(int n) { id = n; }
    +  Widget(int n) { id = n; }
       @Override
       public String toString() {
         return "Widget " + id;
    @@ -38,7 +38,7 @@ class Fudge {
     
     class Foo2 {
       private List x = new ArrayList<>();
    -  public Foo2(Supplier factory) {
    +  Foo2(Supplier factory) {
         Suppliers.fill(x, factory, 5);
       }
       @Override
    diff --git a/generics/FilledList.java b/generics/FilledList.java
    index b9e1cb285..064715f06 100644
    --- a/generics/FilledList.java
    +++ b/generics/FilledList.java
    @@ -6,8 +6,8 @@
     import java.util.function.*;
     import onjava.*;
     
    -class FilledList extends ArrayList {
    -  public FilledList(Supplier gen, int size) {
    +public class FilledList extends ArrayList {
    +  FilledList(Supplier gen, int size) {
         Suppliers.fill(this, gen, size);
       }
       public FilledList(T t, int size) {
    diff --git a/generics/GenericCast.java b/generics/GenericCast.java
    index 9c1ca2828..ddf5deae1 100644
    --- a/generics/GenericCast.java
    +++ b/generics/GenericCast.java
    @@ -9,7 +9,7 @@ class FixedSizeStack {
       private final int size;
       private Object[] storage;
       private int index = 0;
    -  public FixedSizeStack(int size) {
    +  FixedSizeStack(int size) {
         this.size = size;
         storage = new Object[size];
       }
    diff --git a/generics/InstantiateGenericType.java b/generics/InstantiateGenericType.java
    index 627e17bc3..4c46b04ba 100644
    --- a/generics/InstantiateGenericType.java
    +++ b/generics/InstantiateGenericType.java
    @@ -6,7 +6,7 @@
     
     class ClassAsFactory implements Supplier {
       Class kind;
    -  public ClassAsFactory(Class kind) {
    +  ClassAsFactory(Class kind) {
         this.kind = kind;
       }
       @Override
    diff --git a/generics/Manipulation.java b/generics/Manipulation.java
    index 855bb3015..ff9cb384d 100644
    --- a/generics/Manipulation.java
    +++ b/generics/Manipulation.java
    @@ -6,7 +6,7 @@
     
     class Manipulator {
       private T obj;
    -  public Manipulator(T x) { obj = x; }
    +  Manipulator(T x) { obj = x; }
       // Error: cannot find symbol: method f():
       public void manipulate() { obj.f(); }
     }
    diff --git a/generics/Manipulator2.java b/generics/Manipulator2.java
    index c705b84ed..7d044ef87 100644
    --- a/generics/Manipulator2.java
    +++ b/generics/Manipulator2.java
    @@ -5,6 +5,6 @@
     
     class Manipulator2 {
       private T obj;
    -  public Manipulator2(T x) { obj = x; }
    +  Manipulator2(T x) { obj = x; }
       public void manipulate() { obj.f(); }
     }
    diff --git a/generics/Manipulator3.java b/generics/Manipulator3.java
    index e2a9878e4..7b7b833fb 100644
    --- a/generics/Manipulator3.java
    +++ b/generics/Manipulator3.java
    @@ -5,6 +5,6 @@
     
     class Manipulator3 {
       private HasF obj;
    -  public Manipulator3(HasF x) { obj = x; }
    +  Manipulator3(HasF x) { obj = x; }
       public void manipulate() { obj.f(); }
     }
    diff --git a/generics/Mixins.java b/generics/Mixins.java
    index a5216675b..e272f1c01 100644
    --- a/generics/Mixins.java
    +++ b/generics/Mixins.java
    @@ -8,7 +8,7 @@ interface TimeStamped { long getStamp(); }
     
     class TimeStampedImp implements TimeStamped {
       private final long timeStamp;
    -  public TimeStampedImp() {
    +  TimeStampedImp() {
         timeStamp = new Date().getTime();
       }
       @Override
    diff --git a/generics/ReturnGenericType.java b/generics/ReturnGenericType.java
    index 4f66b7e79..3d159679d 100644
    --- a/generics/ReturnGenericType.java
    +++ b/generics/ReturnGenericType.java
    @@ -5,6 +5,6 @@
     
     class ReturnGenericType {
       private T obj;
    -  public ReturnGenericType(T x) { obj = x; }
    +  ReturnGenericType(T x) { obj = x; }
       public T get() { return obj; }
     }
    diff --git a/generics/Store.java b/generics/Store.java
    index 3ce697290..3460bc15f 100644
    --- a/generics/Store.java
    +++ b/generics/Store.java
    @@ -11,7 +11,6 @@ class Product {
       private final int id;
       private String description;
       private double price;
    -  public
       Product(int idNumber, String descr, double price) {
         id = idNumber;
         description = descr;
    @@ -37,13 +36,13 @@ public Product get() {
     }
     
     class Shelf extends ArrayList {
    -  public Shelf(int nProducts) {
    +  Shelf(int nProducts) {
         Suppliers.fill(this, Product.generator, nProducts);
       }
     }
     
     class Aisle extends ArrayList {
    -  public Aisle(int nShelves, int nProducts) {
    +  Aisle(int nShelves, int nProducts) {
         for(int i = 0; i < nShelves; i++)
           add(new Shelf(nProducts));
       }
    diff --git a/generics/decorator/Decoration.java b/generics/decorator/Decoration.java
    index 7693c8aa3..d7f963253 100644
    --- a/generics/decorator/Decoration.java
    +++ b/generics/decorator/Decoration.java
    @@ -14,7 +14,7 @@ class Basic {
     
     class Decorator extends Basic {
       protected Basic basic;
    -  public Decorator(Basic basic) { this.basic = basic; }
    +  Decorator(Basic basic) { this.basic = basic; }
       @Override
       public void set(String val) { basic.set(val); }
       @Override
    @@ -23,7 +23,7 @@ class Decorator extends Basic {
     
     class TimeStamped extends Decorator {
       private final long timeStamp;
    -  public TimeStamped(Basic basic) {
    +  TimeStamped(Basic basic) {
         super(basic);
         timeStamp = new Date().getTime();
       }
    @@ -33,7 +33,7 @@ public TimeStamped(Basic basic) {
     class SerialNumbered extends Decorator {
       private static long counter = 1;
       private final long serialNumber = counter++;
    -  public SerialNumbered(Basic basic) { super(basic); }
    +  SerialNumbered(Basic basic) { super(basic); }
       public long getSerialNumber() { return serialNumber; }
     }
     
    diff --git a/innerclasses/AnonymousConstructor.java b/innerclasses/AnonymousConstructor.java
    index 25de92a5b..7395a3355 100644
    --- a/innerclasses/AnonymousConstructor.java
    +++ b/innerclasses/AnonymousConstructor.java
    @@ -5,7 +5,7 @@
     // Creating a constructor for an anonymous inner class
     
     abstract class Base {
    -  public Base(int i) {
    +  Base(int i) {
         System.out.println("Base constructor, i = " + i);
       }
       public abstract void f();
    diff --git a/innerclasses/BigEgg.java b/innerclasses/BigEgg.java
    index a510ddda5..c1572c594 100644
    --- a/innerclasses/BigEgg.java
    +++ b/innerclasses/BigEgg.java
    @@ -11,7 +11,7 @@ public Yolk() {
           System.out.println("Egg.Yolk()");
         }
       }
    -  public Egg() {
    +  Egg() {
         System.out.println("New Egg()");
         y = new Yolk();
       }
    diff --git a/innerclasses/BigEgg2.java b/innerclasses/BigEgg2.java
    index 6f8cf4aae..0eb0abce4 100644
    --- a/innerclasses/BigEgg2.java
    +++ b/innerclasses/BigEgg2.java
    @@ -14,7 +14,7 @@ public void f() {
         }
       }
       private Yolk y = new Yolk();
    -  public Egg2() { System.out.println("New Egg2()"); }
    +  Egg2() { System.out.println("New Egg2()"); }
       public void insertYolk(Yolk yy) { y = yy; }
       public void g() { y.f(); }
     }
    diff --git a/innerclasses/LocalInnerClass.java b/innerclasses/LocalInnerClass.java
    index 119c1ca93..533a25d04 100644
    --- a/innerclasses/LocalInnerClass.java
    +++ b/innerclasses/LocalInnerClass.java
    @@ -13,7 +13,7 @@ public class LocalInnerClass {
       Counter getCounter(final String name) {
         // A local inner class:
         class LocalCounter implements Counter {
    -      public LocalCounter() {
    +      LocalCounter() {
             // Local inner class can have a constructor
             System.out.println("LocalCounter()");
           }
    diff --git a/interfaces/Applicator.java b/interfaces/Applicator.java
    index 33edd1cfe..c7ad4da0d 100644
    --- a/interfaces/Applicator.java
    +++ b/interfaces/Applicator.java
    @@ -40,9 +40,8 @@ public static void apply(Processor p, Object s) {
         System.out.println("Using Processor " + p.name());
         System.out.println(p.process(s));
       }
    -  public static final String s =
    -  "Disagreement with beliefs is by definition incorrect";
       public static void main(String[] args) {
    +    String s = "We are such stuff as dreams are made on";
         apply(new Upcase(), s);
         apply(new Downcase(), s);
         apply(new Splitter(), s);
    @@ -50,10 +49,9 @@ public static void main(String[] args) {
     }
     /* Output:
     Using Processor Upcase
    -DISAGREEMENT WITH BELIEFS IS BY DEFINITION INCORRECT
    +WE ARE SUCH STUFF AS DREAMS ARE MADE ON
     Using Processor Downcase
    -disagreement with beliefs is by definition incorrect
    +we are such stuff as dreams are made on
     Using Processor Splitter
    -[Disagreement, with, beliefs, is, by, definition,
    -incorrect]
    +[We, are, such, stuff, as, dreams, are, made, on]
     */
    diff --git a/interfaces/interfaceprocessor/FilterProcessor.java b/interfaces/interfaceprocessor/FilterProcessor.java
    index 95f977a02..45b2ef754 100644
    --- a/interfaces/interfaceprocessor/FilterProcessor.java
    +++ b/interfaces/interfaceprocessor/FilterProcessor.java
    @@ -8,7 +8,7 @@
     
     class FilterAdapter implements Processor {
       Filter filter;
    -  public FilterAdapter(Filter filter) {
    +  FilterAdapter(Filter filter) {
         this.filter = filter;
       }
       @Override
    diff --git a/lowlevel/DelayQueueDemo.java b/lowlevel/DelayQueueDemo.java
    index d845bf366..c805d7387 100644
    --- a/lowlevel/DelayQueueDemo.java
    +++ b/lowlevel/DelayQueueDemo.java
    @@ -14,7 +14,7 @@ class DelayedTask implements Runnable, Delayed {
       private final long trigger;
       protected static List sequence =
         new ArrayList<>();
    -  public DelayedTask(int delayInMilliseconds) {
    +  DelayedTask(int delayInMilliseconds) {
         delta = delayInMilliseconds;
         trigger = System.nanoTime() +
           NANOSECONDS.convert(delta, MILLISECONDS);
    @@ -45,7 +45,7 @@ public String summary() {
         return String.format("(%d:%d)", id, delta);
       }
       public static class EndTask extends DelayedTask {
    -    public EndTask(int delay) { super(delay); }
    +    EndTask(int delay) { super(delay); }
         @Override
         public void run() {
           sequence.forEach(dt ->
    diff --git a/lowlevel/PriorityBlockingQueueDemo.java b/lowlevel/PriorityBlockingQueueDemo.java
    index 93664a663..c006981b0 100644
    --- a/lowlevel/PriorityBlockingQueueDemo.java
    +++ b/lowlevel/PriorityBlockingQueueDemo.java
    @@ -15,7 +15,7 @@ class Prioritized implements Comparable  {
       private final int priority;
       private static List sequence =
         new CopyOnWriteArrayList<>();
    -  public Prioritized(int priority) {
    +  Prioritized(int priority) {
         this.priority = priority;
         sequence.add(this);
       }
    @@ -38,7 +38,7 @@ public void displaySequence() {
         }
       }
       public static class EndSentinel extends Prioritized {
    -    public EndSentinel() { super(-1); }
    +    EndSentinel() { super(-1); }
       }
     }
     
    @@ -48,7 +48,7 @@ class Producer implements Runnable {
       private SplittableRandom rand =
         new SplittableRandom(seed.getAndAdd(10));
       private Queue queue;
    -  public Producer(Queue q) {
    +  Producer(Queue q) {
         queue = q;
       }
       @Override
    @@ -65,7 +65,6 @@ class Consumer implements Runnable {
       private PriorityBlockingQueue q;
       private SplittableRandom rand =
         new SplittableRandom(47);
    -  public
       Consumer(PriorityBlockingQueue q) {
         this.q = q;
       }
    diff --git a/lowlevel/SafeReturn.java b/lowlevel/SafeReturn.java
    index 19e82ca7f..829a1f98e 100644
    --- a/lowlevel/SafeReturn.java
    +++ b/lowlevel/SafeReturn.java
    @@ -4,7 +4,6 @@
     // Visit http://OnJava8.com for more book information.
     import java.util.function.*;
     import java.util.concurrent.*;
    -import onjava.TimedAbort;
     
     public class SafeReturn extends IntTestable {
       private int i = 0;
    diff --git a/lowlevel/SynchronizedComparison.java b/lowlevel/SynchronizedComparison.java
    index a76a62b56..f497e5184 100644
    --- a/lowlevel/SynchronizedComparison.java
    +++ b/lowlevel/SynchronizedComparison.java
    @@ -38,7 +38,7 @@ public void method() {
     
     class Caller implements Runnable {
       private Guarded g;
    -  public Caller(Guarded g) { this.g = g; }
    +  Caller(Guarded g) { this.g = g; }
       private AtomicLong successfulCalls =
         new AtomicLong();
       private AtomicBoolean stop =
    diff --git a/lowlevel/UnsafeReturn.java b/lowlevel/UnsafeReturn.java
    index 42a763574..e8e9df3ce 100644
    --- a/lowlevel/UnsafeReturn.java
    +++ b/lowlevel/UnsafeReturn.java
    @@ -4,7 +4,6 @@
     // Visit http://OnJava8.com for more book information.
     import java.util.function.*;
     import java.util.concurrent.*;
    -import onjava.TimedAbort;
     
     public class UnsafeReturn extends IntTestable {
       private int i = 0;
    diff --git a/newio/MappedIO.java b/newio/MappedIO.java
    index 367f56b59..6b146a219 100644
    --- a/newio/MappedIO.java
    +++ b/newio/MappedIO.java
    @@ -12,7 +12,7 @@ public class MappedIO {
       private static int numOfUbuffInts = 100_000;
       private abstract static class Tester {
         private String name;
    -    public Tester(String name) {
    +    Tester(String name) {
           this.name = name;
         }
         public void runTest() {
    diff --git a/onjava/Count.java b/onjava/Count.java
    index f8c326494..1e2f90b5b 100644
    --- a/onjava/Count.java
    +++ b/onjava/Count.java
    @@ -9,7 +9,7 @@
     import static onjava.ConvertTo.*;
     
     public interface Count {
    -  public static class Boolean
    +  class Boolean
       implements Supplier {
         private boolean b = true;
         @Override
    @@ -27,7 +27,7 @@ public java.lang.Boolean[] array(int sz) {
           return result;
         }
       }
    -  public static class Pboolean {
    +  class Pboolean {
         private boolean b = true;
         public boolean get() {
           b = !b;
    @@ -38,7 +38,7 @@ public boolean[] array(int sz) {
           return primitive(new Boolean().array(sz));
         }
       }
    -  public static class Byte
    +  class Byte
       implements Supplier {
         private byte b;
         @Override
    @@ -53,7 +53,7 @@ public java.lang.Byte[] array(int sz) {
           return result;
         }
       }
    -  public static class Pbyte {
    +  class Pbyte {
         private byte b;
         public byte get() { return b++; }
         public byte get(int n) { return get(); }
    @@ -63,7 +63,7 @@ public byte[] array(int sz) {
       }
       char[] CHARS =
         "abcdefghijklmnopqrstuvwxyz".toCharArray();
    -  public static class Character
    +  class Character
       implements Supplier {
         private int i;
         @Override
    @@ -81,7 +81,7 @@ public java.lang.Character[] array(int sz) {
           return result;
         }
       }
    -  public static class Pchar {
    +  class Pchar {
         private int i;
         public char get() {
           i = (i + 1) % CHARS.length;
    @@ -92,7 +92,7 @@ public char[] array(int sz) {
           return primitive(new Character().array(sz));
         }
       }
    -  public static class Short
    +  class Short
       implements Supplier {
         short s;
         @Override
    @@ -107,7 +107,7 @@ public java.lang.Short[] array(int sz) {
           return result;
         }
       }
    -  public static class Pshort {
    +  class Pshort {
         short s;
         public short get() { return s++; }
         public short get(int n) { return get(); }
    @@ -115,7 +115,7 @@ public short[] array(int sz) {
           return primitive(new Short().array(sz));
         }
       }
    -  public static class Integer
    +  class Integer
       implements Supplier {
         int i;
         @Override
    @@ -130,7 +130,7 @@ public java.lang.Integer[] array(int sz) {
           return result;
         }
       }
    -  public static class Pint implements IntSupplier {
    +  class Pint implements IntSupplier {
         int i;
         public int get() { return i++; }
         public int get(int n) { return get(); }
    @@ -140,7 +140,7 @@ public int[] array(int sz) {
           return primitive(new Integer().array(sz));
         }
       }
    -  public static class Long
    +  class Long
       implements Supplier {
         private long l;
         @Override
    @@ -155,7 +155,6 @@ public java.lang.Long[] array(int sz) {
           return result;
         }
       }
    -  public static
       class Plong implements LongSupplier {
         private long l;
         public long get() { return l++; }
    @@ -166,7 +165,7 @@ public long[] array(int sz) {
           return primitive(new Long().array(sz));
         }
       }
    -  public class Float
    +  class Float
       implements Supplier {
         private int i;
         @Override
    @@ -183,7 +182,7 @@ public java.lang.Float[] array(int sz) {
           return result;
         }
       }
    -  public class Pfloat {
    +  class Pfloat {
         private int i;
         public float get() { return i++; }
         public float get(int n) { return get(); }
    @@ -191,7 +190,7 @@ public float[] array(int sz) {
           return primitive(new Float().array(sz));
         }
       }
    -  public class Double
    +  class Double
       implements Supplier {
         private int i;
         @Override
    @@ -208,7 +207,7 @@ public java.lang.Double[] array(int sz) {
           return result;
         }
       }
    -  public class Pdouble implements DoubleSupplier {
    +  class Pdouble implements DoubleSupplier {
         private int i;
         public double get() { return i++; }
         public double get(int n) { return get(); }
    diff --git a/onjava/CountMap.java b/onjava/CountMap.java
    index 71fe527ce..c3208e71a 100644
    --- a/onjava/CountMap.java
    +++ b/onjava/CountMap.java
    @@ -58,15 +58,15 @@ public Set> entrySet() {
             .toCollection(LinkedHashSet::new));
       }
       public static void main(String[] args) {
    -    final int LIM = 6;
    +    final int size = 6;
         CountMap cm = new CountMap(60);
         System.out.println(cm);
         System.out.println(cm.get(500));
         cm.values().stream()
    -      .limit(LIM)
    +      .limit(size)
           .forEach(System.out::println);
         System.out.println();
    -    new Random(47).ints(LIM, 0, 1000)
    +    new Random(47).ints(size, 0, 1000)
           .mapToObj(cm::get)
           .forEach(System.out::println);
       }
    diff --git a/onjava/Rand.java b/onjava/Rand.java
    index 79d42ce69..019bac408 100644
    --- a/onjava/Rand.java
    +++ b/onjava/Rand.java
    @@ -10,7 +10,7 @@
     
     public interface Rand {
       int MOD = 10_000;
    -  public static class Boolean
    +  class Boolean
       implements Supplier {
         SplittableRandom r = new SplittableRandom(47);
         @Override
    @@ -27,12 +27,12 @@ public java.lang.Boolean[] array(int sz) {
           return result;
         }
       }
    -  public static class Pboolean {
    +  class Pboolean {
         public boolean[] array(int sz) {
           return primitive(new Boolean().array(sz));
         }
       }
    -  public static class Byte
    +  class Byte
       implements Supplier {
         SplittableRandom r = new SplittableRandom(47);
         @Override
    @@ -49,12 +49,12 @@ public java.lang.Byte[] array(int sz) {
           return result;
         }
       }
    -  public static class Pbyte {
    +  class Pbyte {
         public byte[] array(int sz) {
           return primitive(new Byte().array(sz));
         }
       }
    -  public static class Character
    +  class Character
       implements Supplier {
         SplittableRandom r = new SplittableRandom(47);
         @Override
    @@ -71,12 +71,12 @@ public java.lang.Character[] array(int sz) {
           return result;
         }
       }
    -  public static class Pchar {
    +  class Pchar {
         public char[] array(int sz) {
           return primitive(new Character().array(sz));
         }
       }
    -  public static class Short
    +  class Short
       implements Supplier {
         SplittableRandom r = new SplittableRandom(47);
         @Override
    @@ -93,12 +93,12 @@ public java.lang.Short[] array(int sz) {
           return result;
         }
       }
    -  public static class Pshort {
    +  class Pshort {
         public short[] array(int sz) {
           return primitive(new Short().array(sz));
         }
       }
    -  public static class Integer
    +  class Integer
       implements Supplier {
         SplittableRandom r = new SplittableRandom(47);
         @Override
    @@ -117,7 +117,7 @@ public java.lang.Integer[] array(int sz) {
           return result;
         }
       }
    -  public static class Pint implements IntSupplier {
    +  class Pint implements IntSupplier {
         SplittableRandom r = new SplittableRandom(47);
         @Override
         public int getAsInt() {
    @@ -128,7 +128,7 @@ public int[] array(int sz) {
           return r.ints(sz, 0, MOD).toArray();
         }
       }
    -  public static class Long
    +  class Long
       implements Supplier {
         SplittableRandom r = new SplittableRandom(47);
         @Override
    @@ -147,7 +147,6 @@ public java.lang.Long[] array(int sz) {
           return result;
         }
       }
    -  public static
       class Plong implements LongSupplier {
         SplittableRandom r = new SplittableRandom(47);
         @Override
    @@ -159,7 +158,7 @@ public long[] array(int sz) {
           return r.longs(sz, 0, MOD).toArray();
         }
       }
    -  public static class Float
    +  class Float
       implements Supplier {
         SplittableRandom r = new SplittableRandom(47);
         @Override
    @@ -176,7 +175,7 @@ public java.lang.Float[] array(int sz) {
           return result;
         }
       }
    -  public static class Pfloat {
    +  class Pfloat {
         public float[] array(int sz) {
           return primitive(new Float().array(sz));
         }
    @@ -185,7 +184,7 @@ static double trim(double d) {
         return
           ((double)Math.round(d * 1000.0)) / 100.0;
       }
    -  public static class Double
    +  class Double
       implements Supplier {
         SplittableRandom r = new SplittableRandom(47);
         @Override
    @@ -205,7 +204,6 @@ public java.lang.Double[] array(int sz) {
           return result;
         }
       }
    -  public static
       class Pdouble implements DoubleSupplier {
         SplittableRandom r = new SplittableRandom(47);
         @Override
    @@ -222,7 +220,7 @@ public double[] array(int sz) {
           return result;
         }
       }
    -  public static class String
    +  class String
       implements Supplier {
         SplittableRandom r = new SplittableRandom(47);
         private int strlen = 7; // Default length
    diff --git a/patterns/Facade.java b/patterns/Facade.java
    index 4a042d179..005acf13f 100644
    --- a/patterns/Facade.java
    +++ b/patterns/Facade.java
    @@ -3,9 +3,9 @@
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
    -class A { public A(int x) {} }
    -class B { public B(long x) {} }
    -class C { public C(double x) {} }
    +class A { A(int x) {} }
    +class B { B(long x) {} }
    +class C { C(double x) {} }
     
     // Other classes that aren't exposed by the
     // facade go here ...
    diff --git a/patterns/ProxyDemo.java b/patterns/ProxyDemo.java
    index d673a3e68..198117adb 100644
    --- a/patterns/ProxyDemo.java
    +++ b/patterns/ProxyDemo.java
    @@ -12,7 +12,7 @@ interface ProxyBase {
     
     class Proxy implements ProxyBase {
       private ProxyBase implementation;
    -  public Proxy() {
    +  Proxy() {
         implementation = new Implementation();
       }
       // Pass method calls to the implementation:
    diff --git a/patterns/ShapeFactory3.java b/patterns/ShapeFactory3.java
    index c9c8a79a9..123d27fa4 100644
    --- a/patterns/ShapeFactory3.java
    +++ b/patterns/ShapeFactory3.java
    @@ -15,7 +15,6 @@ interface PolymorphicFactory {
     class RandomShapes implements Supplier {
       private final PolymorphicFactory[] factories;
       private Random rand = new Random(42);
    -  public
       RandomShapes(PolymorphicFactory... factories) {
         this.factories = factories;
       }
    diff --git a/patterns/SingletonPattern.java b/patterns/SingletonPattern.java
    index 831639823..f2e46e301 100644
    --- a/patterns/SingletonPattern.java
    +++ b/patterns/SingletonPattern.java
    @@ -15,7 +15,7 @@ interface Resource {
     // implements thread-safe lazy initialization:
     
     final class Singleton {
    -  private static class
    +  private static final class
       ResourceImpl implements Resource {
         private int i;
         private ResourceImpl(int i) {
    diff --git a/patterns/StateDemo.java b/patterns/StateDemo.java
    index 976c8dbc9..041b4b98f 100644
    --- a/patterns/StateDemo.java
    +++ b/patterns/StateDemo.java
    @@ -13,7 +13,7 @@ interface StateBase {
     
     class State implements StateBase {
       private StateBase implementation;
    -  public State(StateBase imp) {
    +  State(StateBase imp) {
         implementation = imp;
       }
       @Override
    diff --git a/patterns/TemplateMethod.java b/patterns/TemplateMethod.java
    index ef2559162..0efbd71ce 100644
    --- a/patterns/TemplateMethod.java
    +++ b/patterns/TemplateMethod.java
    @@ -6,7 +6,7 @@
     import java.util.stream.*;
     
     abstract class ApplicationFramework {
    -  public ApplicationFramework() {
    +  ApplicationFramework() {
         templateMethod();
       }
       abstract void customize1();
    diff --git a/patterns/adapt/Adapter.java b/patterns/adapt/Adapter.java
    index 609ba8623..956740e58 100644
    --- a/patterns/adapt/Adapter.java
    +++ b/patterns/adapt/Adapter.java
    @@ -17,7 +17,7 @@ interface WhatIWant {
     
     class ProxyAdapter implements WhatIWant {
       WhatIHave whatIHave;
    -  public ProxyAdapter(WhatIHave wih) {
    +  ProxyAdapter(WhatIHave wih) {
         whatIHave = wih;
       }
       @Override
    diff --git a/patterns/chain/ChainOfResponsibility.java b/patterns/chain/ChainOfResponsibility.java
    index 140b4dffe..61fa8faa0 100644
    --- a/patterns/chain/ChainOfResponsibility.java
    +++ b/patterns/chain/ChainOfResponsibility.java
    @@ -11,11 +11,11 @@
     class Result {
       boolean success;
       List line;
    -  public Result(List data) {
    +  Result(List data) {
         success = true;
         line = data;
       }
    -  public Result() {
    +  Result() {
         success = false;
         line = Collections.emptyList();
       }
    diff --git a/patterns/dynatrash/DynaTrash.java b/patterns/dynatrash/DynaTrash.java
    index a3c0328a9..59b366407 100644
    --- a/patterns/dynatrash/DynaTrash.java
    +++ b/patterns/dynatrash/DynaTrash.java
    @@ -33,7 +33,7 @@ public Stream> values() {
     // from ParseTrash.fillBin():
     class TypeMapAdapter implements Fillable {
       TypeMap map;
    -  public TypeMapAdapter(TypeMap tm) {
    +  TypeMapAdapter(TypeMap tm) {
         map = tm;
       }
       @Override
    diff --git a/patterns/observer/ObservedFlower.java b/patterns/observer/ObservedFlower.java
    index a36c0569e..a15e8e35c 100644
    --- a/patterns/observer/ObservedFlower.java
    +++ b/patterns/observer/ObservedFlower.java
    @@ -11,7 +11,7 @@ class Flower {
       private boolean isOpen;
       private boolean alreadyOpen;
       private boolean alreadyClosed;
    -  public Flower() { isOpen = false; }
    +  Flower() { isOpen = false; }
       OpenNotifier opening = new OpenNotifier();
       CloseNotifier closing = new CloseNotifier();
       public void open() { // Opens its petals
    @@ -48,7 +48,7 @@ public void notifyObservers() {
     
     class Bee {
       private String name;
    -  public Bee(String nm)  { name = nm; }
    +  Bee(String nm)  { name = nm; }
       // Observe openings:
       public Observer openObserver() {
         return (ob, a) -> System.out.println(
    @@ -63,7 +63,7 @@ public Observer closeObserver() {
     
     class Hummingbird {
       private String name;
    -  public Hummingbird(String nm) { name = nm; }
    +  Hummingbird(String nm) { name = nm; }
       public Observer openObserver() {
         return (ob, a) -> System.out.println(
           "Hummingbird " + name +
    diff --git a/patterns/state/StateMachineDemo.java b/patterns/state/StateMachineDemo.java
    index de84445c9..3911fe019 100644
    --- a/patterns/state/StateMachineDemo.java
    +++ b/patterns/state/StateMachineDemo.java
    @@ -54,7 +54,7 @@ class Washer extends StateMachine {
         new Wash(), new Spin(),
         new Rinse(), new Spin(),
       };
    -  public Washer() { runAll(); }
    +  Washer() { runAll(); }
       @Override
       public boolean changeState() {
         if(i < states.length) {
    diff --git a/patterns/strategy/StrategyPattern.java b/patterns/strategy/StrategyPattern.java
    index d26e7801b..fbc8daa49 100644
    --- a/patterns/strategy/StrategyPattern.java
    +++ b/patterns/strategy/StrategyPattern.java
    @@ -35,7 +35,7 @@ class Bisection extends FindMinima {
     // The "Context" controls the strategy:
     class MinimaSolver {
       private FindMinima strategy;
    -  public MinimaSolver(FindMinima strat) {
    +  MinimaSolver(FindMinima strat) {
         strategy = strat;
       }
       List minima(List line) {
    diff --git a/polymorphism/ReferenceCounting.java b/polymorphism/ReferenceCounting.java
    index e594f79f7..a175fcade 100644
    --- a/polymorphism/ReferenceCounting.java
    +++ b/polymorphism/ReferenceCounting.java
    @@ -8,7 +8,7 @@ class Shared {
       private int refcount = 0;
       private static long counter = 0;
       private final long id = counter++;
    -  public Shared() {
    +  Shared() {
         System.out.println("Creating " + this);
       }
       public void addRef() { refcount++; }
    @@ -26,7 +26,7 @@ class Composing {
       private Shared shared;
       private static long counter = 0;
       private final long id = counter++;
    -  public Composing(Shared shared) {
    +  Composing(Shared shared) {
         System.out.println("Creating " + this);
         this.shared = shared;
         this.shared.addRef();
    diff --git a/references/AddingClone.java b/references/AddingClone.java
    index d9972c950..d8b1106fb 100644
    --- a/references/AddingClone.java
    +++ b/references/AddingClone.java
    @@ -9,7 +9,7 @@
     
     class Int2 implements Cloneable {
       private int i;
    -  public Int2(int ii) { i = ii; }
    +  Int2(int ii) { i = ii; }
       public void increment() { i++; }
       @Override
       public String toString() {
    @@ -28,7 +28,7 @@ public Int2 clone() {
     // Inheritance doesn't remove cloneability:
     class Int3 extends Int2 {
       private int j; // Automatically duplicated
    -  public Int3(int i) { super(i); }
    +  Int3(int i) { super(i); }
     }
     
     public class AddingClone {
    diff --git a/references/CloneArrayList.java b/references/CloneArrayList.java
    index 5135a3734..13bc77951 100644
    --- a/references/CloneArrayList.java
    +++ b/references/CloneArrayList.java
    @@ -9,7 +9,7 @@
     
     class Int {
       private int i;
    -  public Int(int ii) { i = ii; }
    +  Int(int ii) { i = ii; }
       public void increment() { i++; }
       @Override
       public String toString() {
    diff --git a/references/CopyConstructor.java b/references/CopyConstructor.java
    index edaeefd20..6627cf423 100644
    --- a/references/CopyConstructor.java
    +++ b/references/CopyConstructor.java
    @@ -14,13 +14,13 @@ class FruitQualities {
       private int smell;
       // etc.
       // No-arg constructor:
    -  public FruitQualities() {
    +  FruitQualities() {
         // Do something meaningful...
       }
       // Other constructors:
       // ...
       // Copy constructor:
    -  public FruitQualities(FruitQualities f) {
    +  FruitQualities(FruitQualities f) {
         weight = f.weight;
         color = f.color;
         firmness = f.firmness;
    @@ -32,15 +32,15 @@ public FruitQualities(FruitQualities f) {
     
     class Seed {
       // Members...
    -  public Seed() { /* No-arg constructor */ }
    -  public Seed(Seed s) { /* Copy constructor */ }
    +  Seed() { /* No-arg constructor */ }
    +  Seed(Seed s) { /* Copy constructor */ }
     }
     
     class Fruit {
       private FruitQualities fq;
       private int seeds;
       private Seed[] s;
    -  public Fruit(FruitQualities q, int seedCount) {
    +  Fruit(FruitQualities q, int seedCount) {
         fq = q;
         seeds = seedCount;
         s = new Seed[seeds];
    @@ -50,7 +50,7 @@ public Fruit(FruitQualities q, int seedCount) {
       // Other constructors:
       // ...
       // Copy constructor:
    -  public Fruit(Fruit f) {
    +  Fruit(Fruit f) {
         fq = new FruitQualities(f.fq);
         seeds = f.seeds;
         s = new Seed[seeds];
    @@ -70,10 +70,10 @@ protected FruitQualities getQualities() {
     }
     
     class Tomato extends Fruit {
    -  public Tomato() {
    +  Tomato() {
         super(new FruitQualities(), 100);
       }
    -  public Tomato(Tomato t) { // Copy-constructor
    +  Tomato(Tomato t) { // Copy-constructor
         super(t); // Upcast to base copy-constructor
         // Other copy-construction activities...
       }
    @@ -82,21 +82,21 @@ public Tomato(Tomato t) { // Copy-constructor
     class ZebraQualities extends FruitQualities {
       private int stripedness;
       // No-arg constructor:
    -  public ZebraQualities() {
    +  ZebraQualities() {
         super();
         // do something meaningful...
       }
    -  public ZebraQualities(ZebraQualities z) {
    +  ZebraQualities(ZebraQualities z) {
         super(z);
         stripedness = z.stripedness;
       }
     }
     
     class GreenZebra extends Tomato {
    -  public GreenZebra() {
    +  GreenZebra() {
         addQualities(new ZebraQualities());
       }
    -  public GreenZebra(GreenZebra g) {
    +  GreenZebra(GreenZebra g) {
         super(g); // Calls Tomato(Tomato)
         // Restore the right qualities:
         addQualities(new ZebraQualities());
    diff --git a/references/Immutable2.java b/references/Immutable2.java
    index 9275a537b..8f35edaa6 100644
    --- a/references/Immutable2.java
    +++ b/references/Immutable2.java
    @@ -6,7 +6,7 @@
     
     class Mutable {
       private int data;
    -  public Mutable(int initVal) {
    +  Mutable(int initVal) {
         data = initVal;
       }
       public Mutable add(int x) {
    diff --git a/references/LocalCopy.java b/references/LocalCopy.java
    index 60175c7c7..d7462981a 100644
    --- a/references/LocalCopy.java
    +++ b/references/LocalCopy.java
    @@ -6,7 +6,7 @@
     
     class Duplo implements Cloneable {
       private int n;
    -  public Duplo(int n) { this.n = n; }
    +  Duplo(int n) { this.n = n; }
       @Override
       public Duplo clone() { // [1]
         try {
    diff --git a/references/MutableInteger.java b/references/MutableInteger.java
    index 30c99e0c9..7f6e47d21 100644
    --- a/references/MutableInteger.java
    +++ b/references/MutableInteger.java
    @@ -8,7 +8,7 @@
     
     class IntValue {
       private int n;
    -  public IntValue(int x) { n = x; }
    +  IntValue(int x) { n = x; }
       public int getValue() { return n; }
       public void setValue(int n) { this.n = n; }
       public void increment() { n++; }
    diff --git a/references/SimplerMutableInteger.java b/references/SimplerMutableInteger.java
    index e0f7d24c6..c49ceb5eb 100644
    --- a/references/SimplerMutableInteger.java
    +++ b/references/SimplerMutableInteger.java
    @@ -8,7 +8,7 @@
     
     class IntValue2 {
       public int n;
    -  public IntValue2(int n) { this.n = n; }
    +  IntValue2(int n) { this.n = n; }
     }
     
     public class SimplerMutableInteger {
    diff --git a/reuse/FinalData.java b/reuse/FinalData.java
    index 0ee781ff3..b233c408b 100644
    --- a/reuse/FinalData.java
    +++ b/reuse/FinalData.java
    @@ -7,7 +7,7 @@
     
     class Value {
       int i; // Package access
    -  public Value(int i) { this.i = i; }
    +  Value(int i) { this.i = i; }
     }
     
     public class FinalData {
    diff --git a/reuse/Orc.java b/reuse/Orc.java
    index dc70d3cf1..9974c685b 100644
    --- a/reuse/Orc.java
    +++ b/reuse/Orc.java
    @@ -7,7 +7,7 @@
     class Villain {
       private String name;
       protected void set(String nm) { name = nm; }
    -  public Villain(String name) { this.name = name; }
    +  Villain(String name) { this.name = name; }
       @Override
       public String toString() {
         return "I'm a Villain and my name is " + name;
    diff --git a/serialization/AStoreCADState.java b/serialization/AStoreCADState.java
    index 7b66507f0..46fca27bc 100644
    --- a/serialization/AStoreCADState.java
    +++ b/serialization/AStoreCADState.java
    @@ -15,7 +15,7 @@ abstract class Shape implements Serializable {
       private static int counter = 0;
       public abstract void setColor(Color newColor);
       public abstract Color getColor();
    -  public Shape(int xVal, int yVal, int dim) {
    +  Shape(int xVal, int yVal, int dim) {
         xPos = xVal;
         yPos = yVal;
         dimension = dim;
    @@ -40,7 +40,7 @@ public static Shape randomFactory() {
     
     class Circle extends Shape {
       private static Color color = Color.RED;
    -  public Circle(int xVal, int yVal, int dim) {
    +  Circle(int xVal, int yVal, int dim) {
         super(xVal, yVal, dim);
       }
       public void setColor(Color newColor) {
    @@ -51,7 +51,7 @@ public void setColor(Color newColor) {
     
     class Square extends Shape {
       private static Color color = Color.RED;
    -  public Square(int xVal, int yVal, int dim) {
    +  Square(int xVal, int yVal, int dim) {
         super(xVal, yVal, dim);
       }
       public void setColor(Color newColor) {
    @@ -70,7 +70,7 @@ class Line extends Shape {
       throws IOException, ClassNotFoundException {
         color = (Color)os.readObject();
       }
    -  public Line(int xVal, int yVal, int dim) {
    +  Line(int xVal, int yVal, int dim) {
         super(xVal, yVal, dim);
       }
       public void setColor(Color newColor) {
    diff --git a/serialization/Blips.java b/serialization/Blips.java
    index 4a98f1237..345752da3 100644
    --- a/serialization/Blips.java
    +++ b/serialization/Blips.java
    @@ -6,7 +6,7 @@
     import java.io.*;
     
     class Blip1 implements Externalizable {
    -  public Blip1() {
    +  Blip1() {
         System.out.println("Blip1 Constructor");
       }
       @Override
    diff --git a/serialization/Worm.java b/serialization/Worm.java
    index 6e5e9595e..4ed3570e2 100644
    --- a/serialization/Worm.java
    +++ b/serialization/Worm.java
    @@ -8,7 +8,7 @@
     
     class Data implements Serializable {
       private int n;
    -  public Data(int n) { this.n = n; }
    +  Data(int n) { this.n = n; }
       @Override
       public String toString() {
         return Integer.toString(n);
    diff --git a/streams/MapCollector.java b/streams/MapCollector.java
    index 21bf52941..3d4c97bf8 100644
    --- a/streams/MapCollector.java
    +++ b/streams/MapCollector.java
    @@ -8,7 +8,7 @@
     class Pair {
       public final Character c;
       public final Integer i;
    -  public Pair(Character c, Integer i) {
    +  Pair(Character c, Integer i) {
         this.c = c;
         this.i = i;
       }
    diff --git a/typeinfo/Person.java b/typeinfo/Person.java
    index 611dcfcd1..9c6a9657b 100644
    --- a/typeinfo/Person.java
    +++ b/typeinfo/Person.java
    @@ -12,7 +12,6 @@ class Person {
       public final Optional address;
       // etc.
       public final boolean empty;
    -  public
       Person(String first, String last, String address) {
         this.first = Optional.ofNullable(first);
         this.last = Optional.ofNullable(last);
    @@ -21,11 +20,11 @@ class Person {
              && !this.last.isPresent()
              && !this.address.isPresent();
       }
    -  public Person(String first, String last) {
    +  Person(String first, String last) {
         this(first, last, null);
       }
    -  public Person(String last) { this(null, last, null); }
    -  public Person() { this(null, null, null); }
    +  Person(String last) { this(null, last, null); }
    +  Person() { this(null, null, null); }
       @Override
       public String toString() {
         if(empty)
    diff --git a/typeinfo/PetCount3.java b/typeinfo/PetCount3.java
    index 803f2b925..9977f9c07 100644
    --- a/typeinfo/PetCount3.java
    +++ b/typeinfo/PetCount3.java
    @@ -11,7 +11,7 @@
     public class PetCount3 {
       static class Counter extends
       LinkedHashMap, Integer> {
    -    public Counter() {
    +    Counter() {
           super(LiteralPetCreator.ALL_TYPES.stream()
             .map(lpc -> Pair.make(lpc, 0))
             .collect(
    diff --git a/typeinfo/Position.java b/typeinfo/Position.java
    index c1bfaf81f..1912bb956 100644
    --- a/typeinfo/Position.java
    +++ b/typeinfo/Position.java
    @@ -9,11 +9,11 @@ class EmptyTitleException extends RuntimeException {}
     class Position {
       private String title;
       private Person person;
    -  public Position(String jobTitle, Person employee) {
    +  Position(String jobTitle, Person employee) {
         setTitle(jobTitle);
         setPerson(employee);
       }
    -  public Position(String jobTitle) {
    +  Position(String jobTitle) {
         this(jobTitle, null);
       }
       public String getTitle() { return title; }
    diff --git a/typeinfo/SelectingMethods.java b/typeinfo/SelectingMethods.java
    index 918df79ba..14c8058ab 100644
    --- a/typeinfo/SelectingMethods.java
    +++ b/typeinfo/SelectingMethods.java
    @@ -7,7 +7,7 @@
     
     class MethodSelector implements InvocationHandler {
       private Object proxied;
    -  public MethodSelector(Object proxied) {
    +  MethodSelector(Object proxied) {
         this.proxied = proxied;
       }
       @Override
    diff --git a/typeinfo/SimpleDynamicProxy.java b/typeinfo/SimpleDynamicProxy.java
    index 361d87f9c..50857ccb2 100644
    --- a/typeinfo/SimpleDynamicProxy.java
    +++ b/typeinfo/SimpleDynamicProxy.java
    @@ -6,7 +6,7 @@
     
     class DynamicProxyHandler implements InvocationHandler {
       private Object proxied;
    -  public DynamicProxyHandler(Object proxied) {
    +  DynamicProxyHandler(Object proxied) {
         this.proxied = proxied;
       }
       @Override
    diff --git a/typeinfo/SimpleProxyDemo.java b/typeinfo/SimpleProxyDemo.java
    index d526f0c8a..4ea8fea3d 100644
    --- a/typeinfo/SimpleProxyDemo.java
    +++ b/typeinfo/SimpleProxyDemo.java
    @@ -21,7 +21,7 @@ public void somethingElse(String arg) {
     
     class SimpleProxy implements Interface {
       private Interface proxied;
    -  public SimpleProxy(Interface proxied) {
    +  SimpleProxy(Interface proxied) {
         this.proxied = proxied;
       }
       @Override
    
    From 4f795333a66ed2d37bd42c7484093a16f1f8d8ff Mon Sep 17 00:00:00 2001
    From: Bruce Eckel 
    Date: Mon, 1 May 2017 15:49:21 -0600
    Subject: [PATCH 235/320] added "Package Access vs. Public Constructors"
     section
    
    ---
     hiding/CreatePackageAccessObject.java       | 12 ++++++++++++
     hiding/packageaccess/PublicConstructor.java |  9 +++++++++
     2 files changed, 21 insertions(+)
     create mode 100644 hiding/CreatePackageAccessObject.java
     create mode 100644 hiding/packageaccess/PublicConstructor.java
    
    diff --git a/hiding/CreatePackageAccessObject.java b/hiding/CreatePackageAccessObject.java
    new file mode 100644
    index 000000000..3e057ea3f
    --- /dev/null
    +++ b/hiding/CreatePackageAccessObject.java
    @@ -0,0 +1,12 @@
    +// hiding/CreatePackageAccessObject.java
    +// (c)2017 MindView LLC: see Copyright.txt
    +// We make no guarantees that this code is fit for any purpose.
    +// Visit http://OnJava8.com for more book information.
    +// {WillNotCompile}
    +import hiding.packageaccess.*;
    +
    +public class CreatePackageAccessObject {
    +  public static void main(String[] args) {
    +    new PublicConstructor();
    +  }
    +}
    diff --git a/hiding/packageaccess/PublicConstructor.java b/hiding/packageaccess/PublicConstructor.java
    new file mode 100644
    index 000000000..2e7c050ff
    --- /dev/null
    +++ b/hiding/packageaccess/PublicConstructor.java
    @@ -0,0 +1,9 @@
    +// hiding/packageaccess/PublicConstructor.java
    +// (c)2017 MindView LLC: see Copyright.txt
    +// We make no guarantees that this code is fit for any purpose.
    +// Visit http://OnJava8.com for more book information.
    +package hiding.packageaccess;
    +
    +class PublicConstructor {
    +  public PublicConstructor() {}
    +}
    
    From bb8b44564913c296a24468e30cf295a28be4cbf4 Mon Sep 17 00:00:00 2001
    From: Bruce Eckel 
    Date: Mon, 1 May 2017 17:43:21 -0600
    Subject: [PATCH 236/320] Findbugs and working with gradlew run
    
    ---
     annotations/AtUnitExample2.java        |  3 ++-
     annotations/UseCaseTracker.java        |  2 +-
     arrays/SimpleSetAll.java               |  2 +-
     collections/MapOfList.java             |  2 +-
     collectiontopics/CanonicalMapping.java |  2 +-
     collectiontopics/References.java       |  2 +-
     concurrent/CompletableOperations.java  |  2 +-
     concurrent/CountingTask.java           |  2 +-
     concurrent/DiningPhilosophers.java     |  1 +
     concurrent/InterferingTask.java        |  2 +-
     concurrent/ParallelStreamPuzzle2.java  |  2 +-
     equalshashcode/Equality.java           |  2 +-
     functional/Closure7.java               |  2 +-
     innerclasses/GreenhouseController.java |  2 +-
     operators/EqualsMethod.java            |  4 ++--
     operators/Equivalence.java             |  4 ++--
     serialization/Blips.java               |  2 +-
     serialization/FreezeAlien.java         | 11 +++++++----
     18 files changed, 27 insertions(+), 22 deletions(-)
    
    diff --git a/annotations/AtUnitExample2.java b/annotations/AtUnitExample2.java
    index 44cf7552c..a72282fa2 100644
    --- a/annotations/AtUnitExample2.java
    +++ b/annotations/AtUnitExample2.java
    @@ -28,7 +28,8 @@ void assertFailureExample() {
       }
       @Test
       void exceptionExample() throws IOException {
    -    new FileInputStream("nofile.txt"); // Throws
    +    try(FileInputStream fis =
    +        new FileInputStream("nofile.txt")) {} // Throws
       }
       @Test
       boolean assertAndReturn() {
    diff --git a/annotations/UseCaseTracker.java b/annotations/UseCaseTracker.java
    index 4f60f30ef..c6188e9f9 100644
    --- a/annotations/UseCaseTracker.java
    +++ b/annotations/UseCaseTracker.java
    @@ -14,7 +14,7 @@ public class UseCaseTracker {
           if(uc != null) {
             System.out.println("Found Use Case " +
               uc.id() + "\n  " + uc.description());
    -        useCases.remove(new Integer(uc.id()));
    +        useCases.remove(Integer.valueOf(uc.id()));
           }
         }
         useCases.forEach(i ->
    diff --git a/arrays/SimpleSetAll.java b/arrays/SimpleSetAll.java
    index ce281c972..1234eb592 100644
    --- a/arrays/SimpleSetAll.java
    +++ b/arrays/SimpleSetAll.java
    @@ -14,7 +14,7 @@ class Bob {
     
     public class SimpleSetAll {
       public static final int SZ = 8;
    -  public static int val = 1;
    +  static int val = 1;
       static char[] chars = "abcdefghijklmnopqrstuvwxyz"
         .toCharArray();
       static char getChar(int n) { return chars[n]; }
    diff --git a/collections/MapOfList.java b/collections/MapOfList.java
    index 151d4e1e4..877ebd375 100644
    --- a/collections/MapOfList.java
    +++ b/collections/MapOfList.java
    @@ -8,7 +8,7 @@
     import java.util.*;
     
     public class MapOfList {
    -  public static Map>
    +  public static final Map>
         petPeople = new HashMap<>();
       static {
         petPeople.put(new Person("Dawn"),
    diff --git a/collectiontopics/CanonicalMapping.java b/collectiontopics/CanonicalMapping.java
    index f3bbdae2b..fecd6d3cb 100644
    --- a/collectiontopics/CanonicalMapping.java
    +++ b/collectiontopics/CanonicalMapping.java
    @@ -39,7 +39,7 @@ public static void main(String[] args) {
         int size = 1000;
         // Or, choose size via the command line:
         if(args.length > 0)
    -      size = new Integer(args[0]);
    +      size = Integer.valueOf(args[0]);
         Key[] keys = new Key[size];
         WeakHashMap map =
           new WeakHashMap<>();
    diff --git a/collectiontopics/References.java b/collectiontopics/References.java
    index ea99741f1..30dfd45df 100644
    --- a/collectiontopics/References.java
    +++ b/collectiontopics/References.java
    @@ -31,7 +31,7 @@ public static void main(String[] args) {
         int size = 10;
         // Or, choose size via the command line:
         if(args.length > 0)
    -      size = new Integer(args[0]);
    +      size = Integer.valueOf(args[0]);
         LinkedList> sa =
           new LinkedList<>();
         for(int i = 0; i < size; i++) {
    diff --git a/concurrent/CompletableOperations.java b/concurrent/CompletableOperations.java
    index 3d3e3f487..ffa066126 100644
    --- a/concurrent/CompletableOperations.java
    +++ b/concurrent/CompletableOperations.java
    @@ -9,7 +9,7 @@ public class CompletableOperations {
       static CompletableFuture cfi(int i) {
         return
           CompletableFuture.completedFuture(
    -        new Integer(i));
    +        Integer.valueOf(i));
       }
       public static void main(String[] args) {
         showr(cfi(1)); // Basic test
    diff --git a/concurrent/CountingTask.java b/concurrent/CountingTask.java
    index ddcbacf19..1f3bbc2f1 100644
    --- a/concurrent/CountingTask.java
    +++ b/concurrent/CountingTask.java
    @@ -9,7 +9,7 @@ public class CountingTask implements Callable {
       public CountingTask(int id) { this.id = id; }
       @Override
       public Integer call() {
    -    Integer val = new Integer(0);
    +    Integer val = 0;
         for(int i = 0; i < 100; i++)
           val++;
         System.out.println(id + " " +
    diff --git a/concurrent/DiningPhilosophers.java b/concurrent/DiningPhilosophers.java
    index 13d08aca0..2fc2e7989 100644
    --- a/concurrent/DiningPhilosophers.java
    +++ b/concurrent/DiningPhilosophers.java
    @@ -3,6 +3,7 @@
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Hidden deadlock
    +// {ValidateByHand} Gradle has trouble
     import java.util.*;
     import java.util.concurrent.*;
     import onjava.Nap;
    diff --git a/concurrent/InterferingTask.java b/concurrent/InterferingTask.java
    index 9ed9632bc..4c564acc7 100644
    --- a/concurrent/InterferingTask.java
    +++ b/concurrent/InterferingTask.java
    @@ -5,7 +5,7 @@
     
     public class InterferingTask implements Runnable {
       final int id;
    -  private static Integer val = new Integer(0);
    +  private static Integer val = 0;
       public InterferingTask(int id) { this.id = id; }
       @Override
       public void run() {
    diff --git a/concurrent/ParallelStreamPuzzle2.java b/concurrent/ParallelStreamPuzzle2.java
    index 881e0032c..8f72fd76f 100644
    --- a/concurrent/ParallelStreamPuzzle2.java
    +++ b/concurrent/ParallelStreamPuzzle2.java
    @@ -10,7 +10,7 @@
     import java.nio.file.*;
     
     public class ParallelStreamPuzzle2 {
    -  public static Deque trace =
    +  public static final Deque trace =
         new ConcurrentLinkedDeque<>();
       static class
       IntGenerator implements Supplier {
    diff --git a/equalshashcode/Equality.java b/equalshashcode/Equality.java
    index 4fd0e36a4..07e37a41f 100644
    --- a/equalshashcode/Equality.java
    +++ b/equalshashcode/Equality.java
    @@ -46,7 +46,7 @@ public static void testAll(EqualityFactory eqf) {
           neq = eqf.make(99, "Bob", 1.618);
         e.test("null", "false", null);
         e.test("same object", "true", e);
    -    e.test("different type", "false", new Integer(99));
    +    e.test("different type", "false", Integer.valueOf(99));
         e.test("same values", "true", eq);
         e.test("different values", "false", neq);
       }
    diff --git a/functional/Closure7.java b/functional/Closure7.java
    index f67a6b583..bb7f54ea0 100644
    --- a/functional/Closure7.java
    +++ b/functional/Closure7.java
    @@ -7,7 +7,7 @@
     
     public class Closure7 {
       IntSupplier makeFun(int x) {
    -    Integer i = new Integer(0);
    +    Integer i = Integer.valueOf(0);
         i = i + 1;
         return () -> x + i;
       }
    diff --git a/innerclasses/GreenhouseController.java b/innerclasses/GreenhouseController.java
    index e39a470f4..6e85f4830 100644
    --- a/innerclasses/GreenhouseController.java
    +++ b/innerclasses/GreenhouseController.java
    @@ -24,7 +24,7 @@ gc.new ThermostatDay(1400)
         if(args.length == 1)
           gc.addEvent(
             new GreenhouseControls.Terminate(
    -          new Integer(args[0])));
    +          Integer.valueOf(args[0])));
         gc.run();
       }
     }
    diff --git a/operators/EqualsMethod.java b/operators/EqualsMethod.java
    index baa3877d6..50c5a8ff2 100644
    --- a/operators/EqualsMethod.java
    +++ b/operators/EqualsMethod.java
    @@ -5,8 +5,8 @@
     
     public class EqualsMethod {
       public static void main(String[] args) {
    -    Integer n1 = new Integer(47);
    -    Integer n2 = new Integer(47);
    +    Integer n1 = 47;
    +    Integer n2 = 47;
         System.out.println(n1.equals(n2));
       }
     }
    diff --git a/operators/Equivalence.java b/operators/Equivalence.java
    index a3d26fd12..26a894908 100644
    --- a/operators/Equivalence.java
    +++ b/operators/Equivalence.java
    @@ -5,8 +5,8 @@
     
     public class Equivalence {
       public static void main(String[] args) {
    -    Integer n1 = new Integer(47);
    -    Integer n2 = new Integer(47);
    +    Integer n1 = 47;
    +    Integer n2 = 47;
         System.out.println(n1 == n2);
         System.out.println(n1 != n2);
       }
    diff --git a/serialization/Blips.java b/serialization/Blips.java
    index 345752da3..4a98f1237 100644
    --- a/serialization/Blips.java
    +++ b/serialization/Blips.java
    @@ -6,7 +6,7 @@
     import java.io.*;
     
     class Blip1 implements Externalizable {
    -  Blip1() {
    +  public Blip1() {
         System.out.println("Blip1 Constructor");
       }
       @Override
    diff --git a/serialization/FreezeAlien.java b/serialization/FreezeAlien.java
    index 701b6987f..ec046d8b8 100644
    --- a/serialization/FreezeAlien.java
    +++ b/serialization/FreezeAlien.java
    @@ -8,9 +8,12 @@
     public class FreezeAlien {
       public static void
       main(String[] args) throws Exception {
    -    ObjectOutput out = new ObjectOutputStream(
    -      new FileOutputStream("X.file"));
    -    Alien quellek = new Alien();
    -    out.writeObject(quellek);
    +    try(
    +      ObjectOutputStream out = new ObjectOutputStream(
    +        new FileOutputStream("X.file"));
    +    ) {
    +      Alien quellek = new Alien();
    +      out.writeObject(quellek);
    +    }
       }
     }
    
    From b3380488aaa2aa929a64c590dc5267ce2db78e93 Mon Sep 17 00:00:00 2001
    From: Bruce Eckel 
    Date: Tue, 2 May 2017 10:31:57 -0600
    Subject: [PATCH 237/320] Shorten appveyor build time
    
    ---
     functional/Closure7.java | 2 +-
     generics/Store.java      | 2 +-
     2 files changed, 2 insertions(+), 2 deletions(-)
    
    diff --git a/functional/Closure7.java b/functional/Closure7.java
    index bb7f54ea0..5dc34986d 100644
    --- a/functional/Closure7.java
    +++ b/functional/Closure7.java
    @@ -7,7 +7,7 @@
     
     public class Closure7 {
       IntSupplier makeFun(int x) {
    -    Integer i = Integer.valueOf(0);
    +    Integer i = 0;
         i = i + 1;
         return () -> x + i;
       }
    diff --git a/generics/Store.java b/generics/Store.java
    index 3460bc15f..659a6c354 100644
    --- a/generics/Store.java
    +++ b/generics/Store.java
    @@ -71,7 +71,7 @@ public String toString() {
         return result.toString();
       }
       public static void main(String[] args) {
    -    System.out.println(new Store(14, 5, 10));
    +    System.out.println(new Store(5, 4, 3));
       }
     }
     /* Output: (First 8 Lines)
    
    From cbdb44c4303ecc52f160132e901d555c3e6e5f4e Mon Sep 17 00:00:00 2001
    From: Bruce Eckel 
    Date: Tue, 2 May 2017 15:16:31 -0600
    Subject: [PATCH 238/320] Archived
    
    ---
     remote/tests/RMITests.java | 25 -------------------------
     1 file changed, 25 deletions(-)
     delete mode 100644 remote/tests/RMITests.java
    
    diff --git a/remote/tests/RMITests.java b/remote/tests/RMITests.java
    deleted file mode 100644
    index 4e1f7fd50..000000000
    --- a/remote/tests/RMITests.java
    +++ /dev/null
    @@ -1,25 +0,0 @@
    -// remote/tests/RMITests.java
    -// (c)2016 MindView LLC: see Copyright.txt
    -// We make no guarantees that this code is fit for any purpose.
    -// Visit http://mindviewinc.com/Books/OnJava/ for more book information.
    -package remote;
    -
    -import java.rmi.registry.*;
    -
    -import org.junit.jupiter.api.*;
    -import org.junit.jupiter.api.TestInfo;
    -
    -public class RMITests {
    -    @Test
    -    void test_remote_time() throws Exception {
    -        LocateRegistry.createRegistry(1099);
    -        PerfectTimeServer timeServer = new PerfectTimeServer();
    -        timeServer.main(null);
    -        Registry reg =
    -                LocateRegistry.getRegistry("localhost");
    -        PerfectTime pt =
    -                (PerfectTime) reg.lookup("PerfectTime");
    -        for (int i = 0; i < 10; i++)
    -            System.out.println("Time: " + pt.getPerfectTime());
    -    }
    -}
    
    From 0148b08b103925cbb186facb22b510271f44e4c5 Mon Sep 17 00:00:00 2001
    From: Bruce Eckel 
    Date: Tue, 2 May 2017 15:25:03 -0600
    Subject: [PATCH 239/320] Stop using org.gradle.parallel
    
    ---
     gradle.properties | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/gradle.properties b/gradle.properties
    index f97ebb7d3..8b1378917 100644
    --- a/gradle.properties
    +++ b/gradle.properties
    @@ -1 +1 @@
    -org.gradle.parallel=true
    +
    
    From 3febbb272262958dcd05b914d3b7e225d8d84fc6 Mon Sep 17 00:00:00 2001
    From: Bruce Eckel 
    Date: Wed, 3 May 2017 10:58:59 -0600
    Subject: [PATCH 240/320] Don't include tool files with leading underscores
    
    ---
     .gitignore | 1 +
     1 file changed, 1 insertion(+)
    
    diff --git a/.gitignore b/.gitignore
    index b2c1bb917..b656fe80d 100644
    --- a/.gitignore
    +++ b/.gitignore
    @@ -107,3 +107,4 @@ buildSrc/
     /standardio/Redirecting.txt
     /threads/PSP2.txt
     /threads/primes.txt
    +_*
    
    From 7bf05f592b5b344e7404c383e830644add739567 Mon Sep 17 00:00:00 2001
    From: Bruce Eckel 
    Date: Wed, 3 May 2017 12:00:00 -0600
    Subject: [PATCH 241/320] Output update and exclude AttemptLocking for Appveyor
    
    ---
     ShowFindbugs.py                               | 10 ---
     _verify_output.py                             |  4 ++
     annotations/AtUnitComposition.java            |  2 +-
     annotations/AtUnitExample1.java               |  4 +-
     annotations/AtUnitExample2.java               |  8 +--
     annotations/AtUnitExample3.java               |  4 +-
     annotations/AtUnitExample4.java               | 13 ++--
     annotations/AtUnitExample5.java               |  4 +-
     annotations/AtUnitExternalTest.java           |  2 +-
     annotations/HashSetTest.java                  |  4 +-
     annotations/UseCaseTracker.java               |  4 +-
     arrays/AlphabeticSearch.java                  | 14 ++--
     arrays/ParallelPrefix3.java                   |  2 +-
     check.bat                                     |  2 -
     .../ApplesAndOrangesWithoutGenerics.java      |  2 +-
     collections/GenericsAndUpcasting.java         |  8 +--
     collections/ListIteration.java                |  4 +-
     collections/MapOfList.java                    | 30 ++++----
     collectiontopics/Bits.java                    | 20 +++---
     collectiontopics/FillingLists.java            | 11 +--
     collectiontopics/ListOps.java                 | 40 +++++++++++
     collectiontopics/References.java              | 30 ++++----
     collectiontopics/TypesForSets.java            | 16 ++---
     concurrent/CachedThreadPool.java              | 14 ++--
     concurrent/CachedThreadPool2.java             | 20 +++---
     concurrent/CachedThreadPool3.java             | 12 ++--
     concurrent/CatchCompletableExceptions.java    |  3 +
     concurrent/CompletableApplyAsync.java         |  4 +-
     concurrent/CompletableApplyChained.java       |  2 +-
     concurrent/CompletableOperations.java         |  3 +-
     concurrent/CompletablePizza.java              | 42 +++++------
     concurrent/CountingStream.java                | 14 ++--
     concurrent/DualCompletableOperations.java     |  6 +-
     concurrent/MoreTasksAfterShutdown.java        |  2 +-
     concurrent/OnePizza.java                      |  2 +-
     concurrent/ParallelPrime.java                 |  2 +-
     concurrent/ParallelStreamPuzzle.java          |  2 +-
     concurrent/ParallelStreamPuzzle2.java         |  2 +-
     concurrent/ParallelStreamPuzzle3.java         |  3 +-
     concurrent/PizzaParallelSteps.java            | 46 ++++++------
     concurrent/PizzaStreams.java                  | 38 +++++-----
     concurrent/QuittingCompletable.java           | 18 ++---
     concurrent/QuittingTasks.java                 | 18 ++---
     concurrent/SharedConstructorArgument.java     |  2 +-
     concurrent/SingleThreadExecutor.java          |  5 +-
     concurrent/Summing.java                       |  6 +-
     concurrent/Summing2.java                      |  2 +-
     concurrent/Summing3.java                      |  2 +-
     concurrent/Summing4.java                      |  2 +-
     concurrent/TestStaticIDField.java             |  2 +-
     enums/ConstantSpecificMethod.java             |  4 +-
     enums/NotClasses.java                         |  3 +
     enums/PostOffice.java                         | 72 +++++++++----------
     enums/RandomTest.java                         |  6 +-
     enums/RoShamBo1.java                          | 26 +++----
     enums/RoShamBo2.java                          | 26 +++----
     enums/RoShamBo3.java                          | 26 +++----
     enums/RoShamBo4.java                          | 26 +++----
     enums/RoShamBo5.java                          | 26 +++----
     enums/RoShamBo6.java                          | 26 +++----
     enums/SecurityCategory.java                   | 10 +--
     enums/cartoons/EnumImplementation.java        |  4 +-
     enums/menu/Meal.java                          | 32 ++++-----
     enums/menu/Meal2.java                         | 32 ++++-----
     exceptions/LoggingExceptions.java             |  4 +-
     exceptions/LoggingExceptions2.java            |  2 +-
     files/AddAndSubtractPaths.java                | 24 +++----
     files/Directories.java                        | 14 ++--
     files/FileSystemDemo.java                     |  7 +-
     files/Find.java                               | 24 +++----
     files/PartsOfPaths.java                       |  8 +--
     files/PathAnalysis.java                       |  6 +-
     files/PathInfo.java                           | 14 ++--
     files/TreeWatcher.java                        |  4 +-
     generics/DynamicProxyMixin.java               |  2 +-
     generics/GenericReading.java                  |  4 +-
     generics/Mixins.java                          |  4 +-
     generics/TupleList.java                       |  4 +-
     generics/TupleTest.java                       |  6 +-
     generics/TupleTest2.java                      |  6 +-
     generics/WatercolorSets.java                  | 30 ++++----
     gg.bat                                        |  1 -
     housekeeping/NewVarArgs.java                  |  2 +-
     housekeeping/VarArgs.java                     |  2 +-
     .../interfaceprocessor/StringProcessor.java   |  4 +-
     javadoc/HelloDateDoc.java                     |  2 +-
     lowlevel/AttemptLocking.java                  |  1 +
     lowlevel/DelayQueueDemo.java                  | 13 ++--
     lowlevel/EvenProducer.java                    |  9 +--
     lowlevel/NotAtomic.java                       | 10 +--
     lowlevel/NumberOfProcessors.java              |  2 +-
     lowlevel/PriorityBlockingQueueDemo.java       | 28 ++++----
     lowlevel/SerialNumberTest.java                |  2 +-
     lowlevel/SynchronizedComparison.java          | 14 ++--
     lowlevel/TestAbort.java                       |  2 +-
     lowlevel/UnsafeReturn.java                    |  2 +-
     lowlevel/WorkStealingPool.java                | 16 ++---
     newio/AvailableCharSets.java                  |  2 +-
     newio/MappedIO.java                           | 10 +--
     objects/ShowProperties.java                   | 15 ++--
     onjava/atunit/ClassNameFinder.java            | 36 +++++-----
     operators/Equivalence.java                    |  2 +-
     operators/URShift.java                        |  2 +-
     patterns/BoxObserver.java                     |  2 +-
     preferences/PreferencesDemo.java              |  4 +-
     references/Compete.java                       |  4 +-
     references/CopyConstructor.java               | 10 +--
     references/PassReferences.java                |  4 +-
     serialization/Logon.java                      |  6 +-
     serialization/MyWorld.java                    | 24 +++----
     serialization/Worm.java                       |  6 +-
     streams/ForEach.java                          |  2 +-
     streams/SelectElement.java                    |  2 +-
     strings/Conversion.java                       |  4 +-
     typeinfo/PetCount3.java                       |  4 +-
     typeinfo/PetCount4.java                       |  4 +-
     typeinfo/SimpleDynamicProxy.java              |  2 +-
     update_extracted_example_output.py            | 35 ---------
     validating/BadMicroBenchmark2.java            |  8 +--
     validating/GuavaPreconditions.java            | 24 +++----
     validating/SLF4JLevels.java                   | 10 +--
     validating/SLF4JLogging.java                  |  2 +-
     validating/SimpleDebugging.java               |  8 +--
     123 files changed, 665 insertions(+), 671 deletions(-)
     delete mode 100644 ShowFindbugs.py
     delete mode 100644 check.bat
     delete mode 100644 gg.bat
     delete mode 100644 update_extracted_example_output.py
    
    diff --git a/ShowFindbugs.py b/ShowFindbugs.py
    deleted file mode 100644
    index ec11f8fb6..000000000
    --- a/ShowFindbugs.py
    +++ /dev/null
    @@ -1,10 +0,0 @@
    -#! py -3
    -# Requires Python 3.5
    -# Displays all the Findbugs main.html reports from "On Java 8" on Windows
    -# Must run "gradlew findbugsMain" first
    -from pathlib import Path
    -import os
    -
    -cmds = ["start " + str(report) for report in Path(".").rglob("main.html")]
    -(Path(".") / "ShowFindbugs.bat").write_text("\n".join(cmds).strip() + "\n")
    -os.system("ShowFindbugs.bat")
    diff --git a/_verify_output.py b/_verify_output.py
    index 088ca6a35..6ceb5422b 100644
    --- a/_verify_output.py
    +++ b/_verify_output.py
    @@ -2,6 +2,10 @@
     # Requires Python 3.5
     # Validates output from executable Java programs in "On Java 8."
     # Use chain of responsibility to successively try strategies until one matches
    +'''
    +Intended to be copied into the ExtractedExamples directory,
    +thus it doesn't use config.py
    +'''
     from pathlib import Path
     import textwrap
     import re
    diff --git a/annotations/AtUnitComposition.java b/annotations/AtUnitComposition.java
    index 1b6d59106..187b48a99 100644
    --- a/annotations/AtUnitComposition.java
    +++ b/annotations/AtUnitComposition.java
    @@ -23,8 +23,8 @@ boolean tMethodTwo() {
     }
     /* Output:
     annotations.AtUnitComposition
    -  . tMethodOne
       . tMethodTwo This is methodTwo
     
    +  . tMethodOne
     OK (2 tests)
     */
    diff --git a/annotations/AtUnitExample1.java b/annotations/AtUnitExample1.java
    index d0f6f1e12..4b83bf9f0 100644
    --- a/annotations/AtUnitExample1.java
    +++ b/annotations/AtUnitExample1.java
    @@ -34,15 +34,15 @@ boolean anotherDisappointment() {
     }
     /* Output:
     annotations.AtUnitExample1
    -  . anotherDisappointment (failed)
       . m2 This is methodTwo
     
       . m3
       . failureTest (failed)
       . methodOneTest
    +  . anotherDisappointment (failed)
     (5 tests)
     
     >>> 2 FAILURES <<<
    -  annotations.AtUnitExample1: anotherDisappointment
       annotations.AtUnitExample1: failureTest
    +  annotations.AtUnitExample1: anotherDisappointment
     */
    diff --git a/annotations/AtUnitExample2.java b/annotations/AtUnitExample2.java
    index a72282fa2..78ba02ac3 100644
    --- a/annotations/AtUnitExample2.java
    +++ b/annotations/AtUnitExample2.java
    @@ -40,18 +40,18 @@ boolean assertAndReturn() {
     }
     /* Output:
     annotations.AtUnitExample2
    -  . assertFailureExample java.lang.AssertionError: What a
    -surprise!
    -(failed)
       . assertExample
       . exceptionExample java.io.FileNotFoundException:
     nofile.txt (The system cannot find the file specified)
     (failed)
       . assertAndReturn This is methodTwo
     
    +  . assertFailureExample java.lang.AssertionError: What a
    +surprise!
    +(failed)
     (4 tests)
     
     >>> 2 FAILURES <<<
    -  annotations.AtUnitExample2: assertFailureExample
       annotations.AtUnitExample2: exceptionExample
    +  annotations.AtUnitExample2: assertFailureExample
     */
    diff --git a/annotations/AtUnitExample3.java b/annotations/AtUnitExample3.java
    index aabb92dcf..5d4f754e6 100644
    --- a/annotations/AtUnitExample3.java
    +++ b/annotations/AtUnitExample3.java
    @@ -34,9 +34,9 @@ boolean methodOneTest() {
     }
     /* Output:
     annotations.AtUnitExample3
    -  . m2 This is methodTwo
    -
       . methodOneTest
       . initialization
    +  . m2 This is methodTwo
    +
     OK (3 tests)
     */
    diff --git a/annotations/AtUnitExample4.java b/annotations/AtUnitExample4.java
    index 2837c81aa..1fb7ce3a7 100644
    --- a/annotations/AtUnitExample4.java
    +++ b/annotations/AtUnitExample4.java
    @@ -67,16 +67,15 @@ boolean scramble2() {
     annotations.AtUnitExample4
       . words 'All'
     (failed)
    -  . scramble1 'brontosauruses'
    -ntsaueorosurbs
    -(failed)
    -  . scramble2 'are'
    -are
    +  . scramble2 'brontosauruses'
    +tsaeborornussu
    +
    +  . scramble1 'are'
    +rae
     (failed)
     (3 tests)
     
    ->>> 3 FAILURES <<<
    +>>> 2 FAILURES <<<
       annotations.AtUnitExample4: words
       annotations.AtUnitExample4: scramble1
    -  annotations.AtUnitExample4: scramble2
     */
    diff --git a/annotations/AtUnitExample5.java b/annotations/AtUnitExample5.java
    index 20f608601..1402ca290 100644
    --- a/annotations/AtUnitExample5.java
    +++ b/annotations/AtUnitExample5.java
    @@ -53,11 +53,11 @@ boolean test3() {
     }
     /* Output:
     annotations.AtUnitExample5
    -  . test1
    -Running cleanup
       . test3
     Running cleanup
       . test2
    +Running cleanup
    +  . test1
     Running cleanup
     OK (3 tests)
     */
    diff --git a/annotations/AtUnitExternalTest.java b/annotations/AtUnitExternalTest.java
    index d6ba375b1..55410f900 100644
    --- a/annotations/AtUnitExternalTest.java
    +++ b/annotations/AtUnitExternalTest.java
    @@ -22,8 +22,8 @@ boolean tMethodTwo() {
     }
     /* Output:
     annotations.AtUnitExternalTest
    +  . tMethodOne
       . tMethodTwo This is methodTwo
     
    -  . tMethodOne
     OK (2 tests)
     */
    diff --git a/annotations/HashSetTest.java b/annotations/HashSetTest.java
    index 27044ed92..40876c073 100644
    --- a/annotations/HashSetTest.java
    +++ b/annotations/HashSetTest.java
    @@ -29,8 +29,8 @@ void tRemove() {
     }
     /* Output:
     annotations.HashSetTest
    -  . tRemove
    -  . tContains
       . initialization
    +  . tContains
    +  . tRemove
     OK (3 tests)
     */
    diff --git a/annotations/UseCaseTracker.java b/annotations/UseCaseTracker.java
    index c6188e9f9..d9fb07f51 100644
    --- a/annotations/UseCaseTracker.java
    +++ b/annotations/UseCaseTracker.java
    @@ -27,11 +27,11 @@ public static void main(String[] args) {
       }
     }
     /* Output:
    -Found Use Case 49
    -  New passwords can't equal previously used ones
     Found Use Case 47
       Passwords must contain at least one numeric
     Found Use Case 48
       no description
    +Found Use Case 49
    +  New passwords can't equal previously used ones
     Missing use case 50
     */
    diff --git a/arrays/AlphabeticSearch.java b/arrays/AlphabeticSearch.java
    index acaa73684..305b07db7 100644
    --- a/arrays/AlphabeticSearch.java
    +++ b/arrays/AlphabeticSearch.java
    @@ -19,11 +19,11 @@ public static void main(String[] args) {
       }
     }
     /* Output:
    -[anmkkyh, bhmupju, btpenpc, cjwzmmr, cuxszgv,
    -eloztdv, ewcippc, ezdeklu, fcjpthl,
    -fqmlgsh, gmeinne, hyoubzl, jbvlgwc, jlxpqds,
    -ljlbynx, mvducuj, qgekgly, skddcat,
    -taprwxz, uybypgp, vjsszkn, vniyapk, vqqakbm,
    -vwodhcf, ydpulcq, ygpoalk, yskvett,
    -zehpfmm, zofmmvm, zrxmclh] Index: 10 gmeinne
    +[anmkkyh, bhmupju, btpenpc, cjwzmmr, cuxszgv, eloztdv,
    +ewcippc, ezdeklu, fcjpthl, fqmlgsh, gmeinne, hyoubzl,
    +jbvlgwc, jlxpqds, ljlbynx, mvducuj, qgekgly, skddcat,
    +taprwxz, uybypgp, vjsszkn, vniyapk, vqqakbm, vwodhcf,
    +ydpulcq, ygpoalk, yskvett, zehpfmm, zofmmvm, zrxmclh]
    +Index: 10
    +gmeinne
     */
    diff --git a/arrays/ParallelPrefix3.java b/arrays/ParallelPrefix3.java
    index e436023ad..45297cb80 100644
    --- a/arrays/ParallelPrefix3.java
    +++ b/arrays/ParallelPrefix3.java
    @@ -2,7 +2,7 @@
     // (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
    -// {ValidateByHand} // CI Systems have trouble
    +// {ValidateByHand} CI Systems have trouble
     import java.util.*;
     
     public class ParallelPrefix3 {
    diff --git a/check.bat b/check.bat
    deleted file mode 100644
    index 25446ee4b..000000000
    --- a/check.bat
    +++ /dev/null
    @@ -1,2 +0,0 @@
    -cp ..\..\OnJava-Tools\verify_output.py .
    -py -3 verify_output.py
    diff --git a/collections/ApplesAndOrangesWithoutGenerics.java b/collections/ApplesAndOrangesWithoutGenerics.java
    index 92103377c..775e25f9f 100644
    --- a/collections/ApplesAndOrangesWithoutGenerics.java
    +++ b/collections/ApplesAndOrangesWithoutGenerics.java
    @@ -32,6 +32,6 @@ public static void main(String[] args) {
     ___[ Error Output ]___
     Exception in thread "main" java.lang.ClassCastException:
     Orange cannot be cast to Apple
    -   at ApplesAndOrangesWithoutGenerics.main(ApplesAndOr
    +        at ApplesAndOrangesWithoutGenerics.main(ApplesAndOr
     angesWithoutGenerics.java:23)
     */
    diff --git a/collections/GenericsAndUpcasting.java b/collections/GenericsAndUpcasting.java
    index 797f40d55..0ba792c67 100644
    --- a/collections/GenericsAndUpcasting.java
    +++ b/collections/GenericsAndUpcasting.java
    @@ -21,8 +21,8 @@ public static void main(String[] args) {
       }
     }
     /* Output:
    -GrannySmith@1db9742
    -Gala@106d69c
    -Fuji@52e922
    -Braeburn@25154f
    +GrannySmith@15db9742
    +Gala@6d06d69c
    +Fuji@7852e922
    +Braeburn@4e25154f
     */
    diff --git a/collections/ListIteration.java b/collections/ListIteration.java
    index 3925e4a1b..cf4c1558a 100644
    --- a/collections/ListIteration.java
    +++ b/collections/ListIteration.java
    @@ -27,8 +27,8 @@ public static void main(String[] args) {
       }
     }
     /* Output:
    -Rat, 1, 0; Manx, 2, 1; Cymric, 3, 2; Mutt, 4, 3;
    -Pug, 5, 4; Cymric, 6, 5; Pug, 7, 6; Manx, 8, 7;
    +Rat, 1, 0; Manx, 2, 1; Cymric, 3, 2; Mutt, 4, 3; Pug, 5, 4;
    +Cymric, 6, 5; Pug, 7, 6; Manx, 8, 7;
     7 6 5 4 3 2 1 0
     [Rat, Manx, Cymric, Mutt, Pug, Cymric, Pug, Manx]
     [Rat, Manx, Cymric, Cymric, Rat, EgyptianMau, Hamster,
    diff --git a/collections/MapOfList.java b/collections/MapOfList.java
    index 877ebd375..26135f8d8 100644
    --- a/collections/MapOfList.java
    +++ b/collections/MapOfList.java
    @@ -39,26 +39,26 @@ public static void main(String[] args) {
       }
     }
     /* Output:
    -People: [Person Marilyn, Person Dawn, Person Luke, Person
    -Isaac, Person Kate]
    -Pets: [[Pug Louie aka Louis Snorkelstein Dupree, Cat
    -Stanford aka Stinky el Negro, Cat Pinkola], [Cymric Molly,
    -Mutt Spot], [Rat Fuzzy, Rat Fizzy], [Rat Freckly], [Cat
    -Shackleton, Cat Elsie May, Dog Margrett]]
    -Person Marilyn has:
    -    Pug Louie aka Louis Snorkelstein Dupree
    -    Cat Stanford aka Stinky el Negro
    -    Cat Pinkola
    +People: [Person Dawn, Person Kate, Person Isaac, Person
    +Marilyn, Person Luke]
    +Pets: [[Cymric Molly, Mutt Spot], [Cat Shackleton, Cat
    +Elsie May, Dog Margrett], [Rat Freckly], [Pug Louie aka
    +Louis Snorkelstein Dupree, Cat Stanford aka Stinky el
    +Negro, Cat Pinkola], [Rat Fuzzy, Rat Fizzy]]
     Person Dawn has:
         Cymric Molly
         Mutt Spot
    -Person Luke has:
    -    Rat Fuzzy
    -    Rat Fizzy
    -Person Isaac has:
    -    Rat Freckly
     Person Kate has:
         Cat Shackleton
         Cat Elsie May
         Dog Margrett
    +Person Isaac has:
    +    Rat Freckly
    +Person Marilyn has:
    +    Pug Louie aka Louis Snorkelstein Dupree
    +    Cat Stanford aka Stinky el Negro
    +    Cat Pinkola
    +Person Luke has:
    +    Rat Fuzzy
    +    Rat Fizzy
     */
    diff --git a/collectiontopics/Bits.java b/collectiontopics/Bits.java
    index 3235ae390..8af818d17 100644
    --- a/collectiontopics/Bits.java
    +++ b/collectiontopics/Bits.java
    @@ -60,18 +60,18 @@ public static void main(String[] args) {
       }
     }
     /* Output:
    -byte value: 118
    -bits: {1, 2, 4, 5, 6}
    -bit pattern: 0110111000000000000000000000000000000000000000
    +byte value: -107
    +bits: {0, 2, 4, 7}
    +bit pattern: 1010100100000000000000000000000000000000000000
     000000000000000000
    -short value: 9795
    -bits: {0, 1, 6, 9, 10, 13}
    -bit pattern: 1100001001100100000000000000000000000000000000
    +short value: 1302
    +bits: {1, 2, 4, 8, 10}
    +bit pattern: 0110100010100000000000000000000000000000000000
     000000000000000000
    -int value: -645079414
    -bits: {1, 3, 7, 9, 10, 11, 12, 14, 15, 18, 19, 23, 24, 27,
    -28, 30, 31}
    -bit pattern: 0101000101111011001100011001101100000000000000
    +int value: -2014573909
    +bits: {0, 1, 3, 5, 7, 9, 11, 18, 19, 21, 22, 23, 24, 25,
    +26, 31}
    +bit pattern: 1101010101010000001101111110000100000000000000
     000000000000000000
     set bit 127: {127}
     set bit 255: {255}
    diff --git a/collectiontopics/FillingLists.java b/collectiontopics/FillingLists.java
    index e29fd4560..f014e2f3b 100644
    --- a/collectiontopics/FillingLists.java
    +++ b/collectiontopics/FillingLists.java
    @@ -26,9 +26,10 @@ public static void main(String[] args) {
       }
     }
     /* Output:
    -[StringAddress@1db9742 Hello, StringAddress@1db9742 Hello,
    -StringAddress@1db9742 Hello, StringAddress@1db9742 Hello]
    -[StringAddress@106d69c World!, StringAddress@106d69c
    -World!, StringAddress@106d69c World!, StringAddress@106d69c
    -World!]
    +[StringAddress@15db9742 Hello, StringAddress@15db9742
    +Hello, StringAddress@15db9742 Hello, StringAddress@15db9742
    +Hello]
    +[StringAddress@6d06d69c World!, StringAddress@6d06d69c
    +World!, StringAddress@6d06d69c World!,
    +StringAddress@6d06d69c World!]
     */
    diff --git a/collectiontopics/ListOps.java b/collectiontopics/ListOps.java
    index 72ecf8ab9..cf9e27501 100644
    --- a/collectiontopics/ListOps.java
    +++ b/collectiontopics/ListOps.java
    @@ -123,4 +123,44 @@ public static void main(String[] args) {
       }
     }
     /* Output:
    +[AliceBlue, AntiqueWhite, Aquamarine, Azure, Beige, Bisque,
    +Black, BlanchedAlmond, Blue, BlueViolet]
    +b = [AliceBlue, AntiqueWhite, Aquamarine, Azure, Beige,
    +Bisque, Black, BlanchedAlmond, Blue, BlueViolet]
    +[AliceBlue, AntiqueWhite, Aquamarine, Azure, Beige, Bisque,
    +Black, BlanchedAlmond, Blue, BlueViolet, AliceBlue,
    +AntiqueWhite, Aquamarine, Azure, Beige, Bisque, Black,
    +BlanchedAlmond, Blue, BlueViolet, AliceBlue, AntiqueWhite,
    +Aquamarine, Azure, Beige, Bisque, Black, BlanchedAlmond,
    +Blue, BlueViolet]
    +[AliceBlue, AntiqueWhite, Aquamarine, Azure, Beige, Bisque,
    +Black, BlanchedAlmond, Blue, BlueViolet, AliceBlue,
    +AntiqueWhite, Aquamarine, Azure, Beige, one, Bisque, Black,
    +BlanchedAlmond, Blue, BlueViolet, AliceBlue, AntiqueWhite,
    +Aquamarine, Azure, Beige, Bisque, Black, BlanchedAlmond,
    +Blue, BlueViolet]
    +Bisque
    +Black
    +[AliceBlue, AntiqueWhite, Aquamarine, Azure, Beige, Bisque,
    +Black, BlanchedAlmond, Blue, BlueViolet, AliceBlue,
    +AntiqueWhite, Aquamarine, Azure, Beige, one, 47,
    +BlanchedAlmond, Blue, BlueViolet, AliceBlue, AntiqueWhite,
    +Aquamarine, Azure, Beige, Bisque, Black, BlanchedAlmond,
    +Blue, BlueViolet]
    +BlueViolet Blue BlanchedAlmond Black Bisque Beige Azure
    +Aquamarine AntiqueWhite AliceBlue BlueViolet Blue
    +BlanchedAlmond 47 one Beige Azure Aquamarine AntiqueWhite
    +AliceBlue BlueViolet Blue BlanchedAlmond Black Bisque Beige
    +Azure Aquamarine AntiqueWhite AliceBlue
    +testVisual finished
    +[AliceBlue, AntiqueWhite, Aquamarine, Azure, Beige, Bisque,
    +Black, BlanchedAlmond, Blue, BlueViolet]
    +[two, one, AliceBlue, AntiqueWhite, Aquamarine, Azure,
    +Beige, Bisque, Black, BlanchedAlmond, Blue, BlueViolet]
    +two
    +two
    +one
    +BlueViolet
    +[AliceBlue, AntiqueWhite, Aquamarine, Azure, Beige, Bisque,
    +Black, BlanchedAlmond, Blue]
     */
    diff --git a/collectiontopics/References.java b/collectiontopics/References.java
    index 30dfd45df..e95cce2d5 100644
    --- a/collectiontopics/References.java
    +++ b/collectiontopics/References.java
    @@ -67,25 +67,25 @@ public static void main(String[] args) {
       }
     }
     /* Output: (First and Last 10 Lines)
    -Just created: java.lang.ref.SoftReference@1db9742
    -Just created: java.lang.ref.SoftReference@106d69c
    -Just created: java.lang.ref.SoftReference@52e922
    -Just created: java.lang.ref.SoftReference@25154f
    -Just created: java.lang.ref.SoftReference@10dea4e
    -Just created: java.lang.ref.SoftReference@647e05
    -Just created: java.lang.ref.SoftReference@1909752
    -Just created: java.lang.ref.SoftReference@1f96302
    -Just created: java.lang.ref.SoftReference@14eac69
    -Just created: java.lang.ref.SoftReference@a57993
    +Just created: java.lang.ref.SoftReference@15db9742
    +Just created: java.lang.ref.SoftReference@6d06d69c
    +Just created: java.lang.ref.SoftReference@7852e922
    +Just created: java.lang.ref.SoftReference@4e25154f
    +Just created: java.lang.ref.SoftReference@70dea4e
    +Just created: java.lang.ref.SoftReference@5c647e05
    +Just created: java.lang.ref.SoftReference@33909752
    +Just created: java.lang.ref.SoftReference@55f96302
    +Just created: java.lang.ref.SoftReference@3d4eac69
    +Just created: java.lang.ref.SoftReference@42a57993
     ...________...________...________...________...
    -Just created: java.lang.ref.PhantomReference@1ee12a7
    +Just created: java.lang.ref.PhantomReference@45ee12a7
     In queue: null
    -Just created: java.lang.ref.PhantomReference@10bedb4
    +Just created: java.lang.ref.PhantomReference@330bedb4
     In queue: null
    -Just created: java.lang.ref.PhantomReference@103dbd3
    +Just created: java.lang.ref.PhantomReference@2503dbd3
     In queue: null
    -Just created: java.lang.ref.PhantomReference@167cf4d
    +Just created: java.lang.ref.PhantomReference@4b67cf4d
     In queue: null
    -Just created: java.lang.ref.PhantomReference@a987ac
    +Just created: java.lang.ref.PhantomReference@7ea987ac
     In queue: null
     */
    diff --git a/collectiontopics/TypesForSets.java b/collectiontopics/TypesForSets.java
    index b7840f64c..45651d709 100644
    --- a/collectiontopics/TypesForSets.java
    +++ b/collectiontopics/TypesForSets.java
    @@ -80,14 +80,14 @@ public static void main(String[] args) {
     [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
     [10, 9, 8, 7, 6, 5, 0, 1, 2, 3, 4]
     [10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
    -[1, 6, 8, 6, 2, 7, 8, 9, 4, 10, 7, 5, 1, 3, 4, 9, 9,
    -10, 5, 3, 2, 0, 4, 1, 2, 0, 8, 3, 0, 10, 6, 5, 7]
    -[3, 1, 4, 8, 7, 6, 9, 5, 3, 0, 10, 5, 5, 10, 7, 8, 8,
    -9, 1, 4, 10, 2, 6, 9, 1, 6, 0, 3, 2, 0, 7, 2, 4]
    -[10, 9, 8, 7, 6, 5, 0, 1, 2, 3, 4, 10, 9, 8, 7, 6, 5,
    -0, 1, 2, 3, 4, 10, 9, 8, 7, 6, 5, 0, 1, 2, 3, 4]
    -[10, 9, 8, 7, 6, 5, 0, 1, 2, 3, 4, 10, 9, 8, 7, 6, 5,
    -0, 1, 2, 3, 4, 10, 9, 8, 7, 6, 5, 0, 1, 2, 3, 4]
    +[1, 6, 8, 6, 2, 7, 8, 9, 4, 10, 7, 5, 1, 3, 4, 9, 9, 10, 5,
    +3, 2, 0, 4, 1, 2, 0, 8, 3, 0, 10, 6, 5, 7]
    +[3, 1, 4, 8, 7, 6, 9, 5, 3, 0, 10, 5, 5, 10, 7, 8, 8, 9, 1,
    +4, 10, 2, 6, 9, 1, 6, 0, 3, 2, 0, 7, 2, 4]
    +[10, 9, 8, 7, 6, 5, 0, 1, 2, 3, 4, 10, 9, 8, 7, 6, 5, 0, 1,
    +2, 3, 4, 10, 9, 8, 7, 6, 5, 0, 1, 2, 3, 4]
    +[10, 9, 8, 7, 6, 5, 0, 1, 2, 3, 4, 10, 9, 8, 7, 6, 5, 0, 1,
    +2, 3, 4, 10, 9, 8, 7, 6, 5, 0, 1, 2, 3, 4]
     SetType cannot be cast to java.lang.Comparable
     HashType cannot be cast to java.lang.Comparable
     */
    diff --git a/concurrent/CachedThreadPool.java b/concurrent/CachedThreadPool.java
    index 5cf7fb009..4e3a95b4f 100644
    --- a/concurrent/CachedThreadPool.java
    +++ b/concurrent/CachedThreadPool.java
    @@ -16,14 +16,14 @@ public static void main(String[] args) {
       }
     }
     /* Output:
    -NapTask[2] pool-1-thread-3
     NapTask[9] pool-1-thread-10
    -NapTask[6] pool-1-thread-7
    -NapTask[5] pool-1-thread-6
    -NapTask[7] pool-1-thread-8
    -NapTask[8] pool-1-thread-9
    -NapTask[0] pool-1-thread-1
     NapTask[1] pool-1-thread-2
    -NapTask[4] pool-1-thread-5
    +NapTask[8] pool-1-thread-9
    +NapTask[7] pool-1-thread-8
    +NapTask[5] pool-1-thread-6
    +NapTask[6] pool-1-thread-7
     NapTask[3] pool-1-thread-4
    +NapTask[4] pool-1-thread-5
    +NapTask[0] pool-1-thread-1
    +NapTask[2] pool-1-thread-3
     */
    diff --git a/concurrent/CachedThreadPool2.java b/concurrent/CachedThreadPool2.java
    index 52ba937d8..c9e1a7759 100644
    --- a/concurrent/CachedThreadPool2.java
    +++ b/concurrent/CachedThreadPool2.java
    @@ -16,14 +16,14 @@ public static void main(String[] args) {
       }
     }
     /* Output:
    -0 pool-1-thread-1 200
    -4 pool-1-thread-5 300
    -3 pool-1-thread-4 400
    -1 pool-1-thread-2 200
    -2 pool-1-thread-3 200
    -6 pool-1-thread-7 500
    -8 pool-1-thread-9 757
    -5 pool-1-thread-6 657
    -7 pool-1-thread-8 657
    -9 pool-1-thread-10 857
    +1 pool-1-thread-2 117
    +0 pool-1-thread-1 117
    +2 pool-1-thread-3 217
    +4 pool-1-thread-5 407
    +3 pool-1-thread-4 337
    +5 pool-1-thread-6 507
    +7 pool-1-thread-8 707
    +6 pool-1-thread-7 607
    +8 pool-1-thread-9 807
    +9 pool-1-thread-10 907
     */
    diff --git a/concurrent/CachedThreadPool3.java b/concurrent/CachedThreadPool3.java
    index cc17e424c..96ebb8e04 100644
    --- a/concurrent/CachedThreadPool3.java
    +++ b/concurrent/CachedThreadPool3.java
    @@ -34,14 +34,14 @@ public static void main(String[] args)
     }
     /* Output:
     2 pool-1-thread-3 100
    -6 pool-1-thread-7 100
    -5 pool-1-thread-6 100
    -7 pool-1-thread-8 100
    -4 pool-1-thread-5 100
    -9 pool-1-thread-10 100
    -3 pool-1-thread-4 100
     0 pool-1-thread-1 100
     1 pool-1-thread-2 100
    +3 pool-1-thread-4 100
    +4 pool-1-thread-5 100
    +5 pool-1-thread-6 100
    +6 pool-1-thread-7 100
    +7 pool-1-thread-8 100
     8 pool-1-thread-9 100
    +9 pool-1-thread-10 100
     sum = 1000
     */
    diff --git a/concurrent/CatchCompletableExceptions.java b/concurrent/CatchCompletableExceptions.java
    index 3f4036be3..ed180ee8c 100644
    --- a/concurrent/CatchCompletableExceptions.java
    +++ b/concurrent/CatchCompletableExceptions.java
    @@ -52,11 +52,14 @@ public static void main(String[] args) {
     /* Output:
     **** Failure Mode ****
     Breakable_exceptionally [1]
    +Throwing Exception for exceptionally
     result: Breakable_java.lang.RuntimeException:
     Breakable_exceptionally failed [0]
     Breakable_handle [1]
    +Throwing Exception for handle
     result: Failure recovery object
     Breakable_whenComplete [1]
    +Throwing Exception for whenComplete
     It failed
     **** Success Mode ****
     Breakable_exceptionally [-1]
    diff --git a/concurrent/CompletableApplyAsync.java b/concurrent/CompletableApplyAsync.java
    index fd73a940e..3218fe348 100644
    --- a/concurrent/CompletableApplyAsync.java
    +++ b/concurrent/CompletableApplyAsync.java
    @@ -21,11 +21,11 @@ public static void main(String[] args) {
       }
     }
     /* Output:
    -50
    +45
     Machina0: ONE
     Machina0: TWO
     Machina0: THREE
     Machina0: complete
     Machina0: complete
    -462
    +463
     */
    diff --git a/concurrent/CompletableApplyChained.java b/concurrent/CompletableApplyChained.java
    index 2834e2a84..c3e71fb0a 100644
    --- a/concurrent/CompletableApplyChained.java
    +++ b/concurrent/CompletableApplyChained.java
    @@ -23,5 +23,5 @@ public static void main(String[] args) {
     Machina0: TWO
     Machina0: THREE
     Machina0: complete
    -460
    +452
     */
    diff --git a/concurrent/CompletableOperations.java b/concurrent/CompletableOperations.java
    index ffa066126..1e29b5746 100644
    --- a/concurrent/CompletableOperations.java
    +++ b/concurrent/CompletableOperations.java
    @@ -55,6 +55,7 @@ public static void main(String[] args) {
     1
     runAsync
     thenRunAsync
    +runAsync is static
     99
     thenAcceptAsync: 4
     47
    @@ -65,7 +66,7 @@ public static void main(String[] args) {
     cancelled: true
     completed exceptionally: true
     done: true
    -java.util.concurrent.CompletableFuture@404b9385[Completed
    +java.util.concurrent.CompletableFuture@6d311334[Completed
     exceptionally]
     777
     dependents: 1
    diff --git a/concurrent/CompletablePizza.java b/concurrent/CompletablePizza.java
    index fb800abe5..9eb936de8 100644
    --- a/concurrent/CompletablePizza.java
    +++ b/concurrent/CompletablePizza.java
    @@ -42,46 +42,46 @@ public static void main(String[] args) {
       }
     }
     /* Output:
    -56
    +69
     Pizza 0: ROLLED
     Pizza 1: ROLLED
    -Pizza 4: ROLLED
     Pizza 2: ROLLED
    -Pizza 3: ROLLED
    +Pizza 1: SAUCED
     Pizza 0: SAUCED
    -Pizza 3: SAUCED
     Pizza 2: SAUCED
    -Pizza 4: SAUCED
    -Pizza 1: SAUCED
     Pizza 0: CHEESED
    -Pizza 4: CHEESED
    -Pizza 2: CHEESED
    -Pizza 3: CHEESED
     Pizza 1: CHEESED
    +Pizza 2: CHEESED
    +Pizza 4: ROLLED
    +Pizza 3: ROLLED
     Pizza 0: TOPPED
    -Pizza 4: TOPPED
    +Pizza 3: SAUCED
     Pizza 1: TOPPED
    -Pizza 3: TOPPED
    +Pizza 3: CHEESED
    +Pizza 4: SAUCED
     Pizza 2: TOPPED
    +Pizza 3: TOPPED
     Pizza 0: BAKED
    -Pizza 4: BAKED
    -Pizza 3: BAKED
     Pizza 1: BAKED
    -Pizza 2: BAKED
    +Pizza 4: CHEESED
    +Pizza 3: BAKED
     Pizza 0: SLICED
    -Pizza 2: SLICED
    -Pizza 4: SLICED
    -Pizza 1: SLICED
     Pizza 3: SLICED
    +Pizza 3: BOXED
    +Pizza 1: SLICED
    +Pizza 2: BAKED
     Pizza 0: BOXED
     Pizza0: complete
    -Pizza 4: BOXED
    -Pizza 3: BOXED
    -Pizza 2: BOXED
     Pizza 1: BOXED
     Pizza1: complete
    +Pizza 4: TOPPED
    +Pizza 2: SLICED
    +Pizza 2: BOXED
     Pizza2: complete
     Pizza3: complete
    +Pizza 4: BAKED
    +Pizza 4: SLICED
    +Pizza 4: BOXED
     Pizza4: complete
    -1659
    +3269
     */
    diff --git a/concurrent/CountingStream.java b/concurrent/CountingStream.java
    index 0ab94d45c..73392a219 100644
    --- a/concurrent/CountingStream.java
    +++ b/concurrent/CountingStream.java
    @@ -17,15 +17,15 @@ public static void main(String[] args) {
       }
     }
     /* Output:
    -4 ForkJoinPool.commonPool-worker-5 100
     2 ForkJoinPool.commonPool-worker-1 100
    -6 main 100
    +8 ForkJoinPool.commonPool-worker-2 100
    +4 ForkJoinPool.commonPool-worker-1 100
    +3 ForkJoinPool.commonPool-worker-1 100
    +7 ForkJoinPool.commonPool-worker-1 100
    +0 ForkJoinPool.commonPool-worker-1 100
     5 ForkJoinPool.commonPool-worker-1 100
    -7 ForkJoinPool.commonPool-worker-4 100
    +6 main 100
     1 ForkJoinPool.commonPool-worker-3 100
    -8 ForkJoinPool.commonPool-worker-2 100
    -0 ForkJoinPool.commonPool-worker-6 100
    -9 ForkJoinPool.commonPool-worker-7 100
    -3 ForkJoinPool.commonPool-worker-5 100
    +9 ForkJoinPool.commonPool-worker-2 100
     1000
     */
    diff --git a/concurrent/DualCompletableOperations.java b/concurrent/DualCompletableOperations.java
    index 2c4ac45a1..db092064e 100644
    --- a/concurrent/DualCompletableOperations.java
    +++ b/concurrent/DualCompletableOperations.java
    @@ -103,13 +103,11 @@ public static void main(String[] args) {
     Workable[CW]
     anyOf
     Workable[BW]
    -Workable[DW]
     Workable[AW]
     *****************
    -Workable[CW]
    -Workable[BW]
     Workable[DW]
    +Workable[BW]
    +Workable[CW]
     Workable[AW]
     *****************
    -allOf
     */
    diff --git a/concurrent/MoreTasksAfterShutdown.java b/concurrent/MoreTasksAfterShutdown.java
    index 872e58532..ff22fa570 100644
    --- a/concurrent/MoreTasksAfterShutdown.java
    +++ b/concurrent/MoreTasksAfterShutdown.java
    @@ -20,7 +20,7 @@ public static void main(String[] args) {
     /* Output:
     java.util.concurrent.RejectedExecutionException: Task
     NapTask[99] rejected from
    -java.util.concurrent.ThreadPoolExecutor@25154f[Shutting
    +java.util.concurrent.ThreadPoolExecutor@4e25154f[Shutting
     down, pool size = 1, active threads = 1, queued tasks = 0,
     completed tasks = 0]
     NapTask[1] pool-1-thread-1
    diff --git a/concurrent/OnePizza.java b/concurrent/OnePizza.java
    index 204ef839c..5f00ff9a0 100644
    --- a/concurrent/OnePizza.java
    +++ b/concurrent/OnePizza.java
    @@ -22,5 +22,5 @@ public static void main(String[] args) {
     Pizza 0: BAKED
     Pizza 0: SLICED
     Pizza 0: BOXED
    -1612
    +1605
     */
    diff --git a/concurrent/ParallelPrime.java b/concurrent/ParallelPrime.java
    index 247deb8c2..f8c3a0647 100644
    --- a/concurrent/ParallelPrime.java
    +++ b/concurrent/ParallelPrime.java
    @@ -31,5 +31,5 @@ public static void main(String[] args)
       }
     }
     /* Output:
    -616
    +1197
     */
    diff --git a/concurrent/ParallelStreamPuzzle.java b/concurrent/ParallelStreamPuzzle.java
    index bf3dd365e..a7fb49142 100644
    --- a/concurrent/ParallelStreamPuzzle.java
    +++ b/concurrent/ParallelStreamPuzzle.java
    @@ -24,5 +24,5 @@ public static void main(String[] args) {
       }
     }
     /* Output:
    -[2, 8, 21, 24, 27, 30, 33, 37, 40, 43]
    +[1, 28, 30, 33, 36, 39, 42, 44, 46, 48]
     */
    diff --git a/concurrent/ParallelStreamPuzzle2.java b/concurrent/ParallelStreamPuzzle2.java
    index 8f72fd76f..de81c8517 100644
    --- a/concurrent/ParallelStreamPuzzle2.java
    +++ b/concurrent/ParallelStreamPuzzle2.java
    @@ -34,5 +34,5 @@ public Integer get() {
       }
     }
     /* Output:
    -[4, 25, 27, 32, 37, 44, 49, 56, 61, 73]
    +[3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
     */
    diff --git a/concurrent/ParallelStreamPuzzle3.java b/concurrent/ParallelStreamPuzzle3.java
    index 6045ba92a..f537e12ff 100644
    --- a/concurrent/ParallelStreamPuzzle3.java
    +++ b/concurrent/ParallelStreamPuzzle3.java
    @@ -2,6 +2,7 @@
     // (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
    +// {ValidateByHand}
     import java.util.*;
     import java.util.stream.*;
     
    @@ -26,7 +27,7 @@ public static void main(String[] args) {
     2: ForkJoinPool.commonPool-worker-6
     4: ForkJoinPool.commonPool-worker-1
     0: ForkJoinPool.commonPool-worker-4
    -7: main
    +7: ForkJoinPool.commonPool-worker-1
     9: ForkJoinPool.commonPool-worker-2
     [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
     */
    diff --git a/concurrent/PizzaParallelSteps.java b/concurrent/PizzaParallelSteps.java
    index 26f5e9a8c..394c6e3fd 100644
    --- a/concurrent/PizzaParallelSteps.java
    +++ b/concurrent/PizzaParallelSteps.java
    @@ -25,45 +25,45 @@ public static void main(String[] args) {
       }
     }
     /* Output:
    +Pizza 0: ROLLED
     Pizza 4: ROLLED
     Pizza 1: ROLLED
    -Pizza 3: ROLLED
    -Pizza 0: ROLLED
     Pizza 2: ROLLED
    -Pizza 4: SAUCED
    -Pizza 3: SAUCED
    -Pizza 1: SAUCED
     Pizza 2: SAUCED
     Pizza 0: SAUCED
    -Pizza 4: CHEESED
    -Pizza 1: CHEESED
    -Pizza 3: CHEESED
    +Pizza 1: SAUCED
    +Pizza 4: SAUCED
     Pizza 0: CHEESED
    +Pizza 4: CHEESED
     Pizza 2: CHEESED
    +Pizza 1: CHEESED
     Pizza 1: TOPPED
    -Pizza 3: TOPPED
    -Pizza 4: TOPPED
     Pizza 2: TOPPED
    +Pizza 4: TOPPED
     Pizza 0: TOPPED
    -Pizza 1: BAKED
    -Pizza 3: BAKED
    +Pizza 0: BAKED
     Pizza 4: BAKED
     Pizza 2: BAKED
    -Pizza 0: BAKED
    -Pizza 1: SLICED
    -Pizza 3: SLICED
    +Pizza 1: BAKED
    +Pizza 0: SLICED
     Pizza 2: SLICED
     Pizza 4: SLICED
    -Pizza 0: SLICED
    -Pizza 1: BOXED
    -Pizza 3: BOXED
    -Pizza3: complete
    +Pizza 1: SLICED
     Pizza 4: BOXED
    -Pizza4: complete
    -Pizza1: complete
    -Pizza 0: BOXED
     Pizza 2: BOXED
     Pizza2: complete
    +Pizza 0: BOXED
     Pizza0: complete
    -1673
    +Pizza4: complete
    +Pizza 1: BOXED
    +Pizza1: complete
    +Pizza 3: ROLLED
    +Pizza 3: SAUCED
    +Pizza 3: CHEESED
    +Pizza 3: TOPPED
    +Pizza 3: BAKED
    +Pizza 3: SLICED
    +Pizza 3: BOXED
    +Pizza3: complete
    +3279
     */
    diff --git a/concurrent/PizzaStreams.java b/concurrent/PizzaStreams.java
    index 58f81d6f8..e782d9ec7 100644
    --- a/concurrent/PizzaStreams.java
    +++ b/concurrent/PizzaStreams.java
    @@ -21,40 +21,40 @@ public static void main(String[] args) {
       }
     }
     /* Output:
    +Pizza 1: ROLLED
     Pizza 4: ROLLED
     Pizza 2: ROLLED
     Pizza 0: ROLLED
    -Pizza 3: ROLLED
    -Pizza 1: ROLLED
    -Pizza 0: SAUCED
    -Pizza 3: SAUCED
    +Pizza 2: SAUCED
     Pizza 4: SAUCED
     Pizza 1: SAUCED
    -Pizza 2: SAUCED
    -Pizza 0: CHEESED
    -Pizza 4: CHEESED
    -Pizza 3: CHEESED
    +Pizza 0: SAUCED
     Pizza 2: CHEESED
    +Pizza 4: CHEESED
    +Pizza 0: CHEESED
     Pizza 1: CHEESED
    -Pizza 3: TOPPED
    +Pizza 2: TOPPED
     Pizza 4: TOPPED
     Pizza 0: TOPPED
    -Pizza 2: TOPPED
     Pizza 1: TOPPED
    -Pizza 0: BAKED
    -Pizza 3: BAKED
     Pizza 4: BAKED
    -Pizza 1: BAKED
     Pizza 2: BAKED
    -Pizza 4: SLICED
    -Pizza 3: SLICED
    -Pizza 0: SLICED
    +Pizza 1: BAKED
    +Pizza 0: BAKED
     Pizza 2: SLICED
    +Pizza 4: SLICED
     Pizza 1: SLICED
    -Pizza 3: BOXED
    +Pizza 0: SLICED
    +Pizza 2: BOXED
     Pizza 4: BOXED
     Pizza 0: BOXED
     Pizza 1: BOXED
    -Pizza 2: BOXED
    -1667
    +Pizza 3: ROLLED
    +Pizza 3: SAUCED
    +Pizza 3: CHEESED
    +Pizza 3: TOPPED
    +Pizza 3: BAKED
    +Pizza 3: SLICED
    +Pizza 3: BOXED
    +3275
     */
    diff --git a/concurrent/QuittingCompletable.java b/concurrent/QuittingCompletable.java
    index a4d3995cd..0de45e2e9 100644
    --- a/concurrent/QuittingCompletable.java
    +++ b/concurrent/QuittingCompletable.java
    @@ -23,13 +23,13 @@ public static void main(String[] args) {
       }
     }
     /* Output:
    -125 148 115 127 120 118 106 140 77 119 97 80 143 17 92 147
    -89 123 16 12 138 25 13 101 135 96 76 73 130 133 37 132 134
    -149 137 122 29 49 60 40 142 131 53 1 98 145 126 65 5 64 82
    -79 68 86 141 61 128 22 7 26 19 139 114 146 14 15 43 34 10
    -75 87 90 31 47 38 62 18 63 41 42 144 66 23 6 4 91 70 83 102
    -103 54 69 74 56 71 94 88 78 81 57 52 93 45 48 44 32 28 36
    -33 104 105 112 109 100 117 24 108 21 116 20 9 85 8 84 72
    -107 113 121 124 136 129 99 95 55 3 27 2 59 67 50 58 51 39
    -30 35 46 110 111 11
    +1 3 4 5 6 2 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
    +24 25 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 52 53 54 55 56 57 58 59 60 61 62 63
    +64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83
    +84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102
    +103 104 105 106 107 108 109 110 111 112 113 114 115 116 117
    +118 119 120 121 122 123 124 7 126 127 128 129 130 131 132
    +133 134 135 136 137 138 139 140 141 142 143 144 145 146 147
    +148 149 125
     */
    diff --git a/concurrent/QuittingTasks.java b/concurrent/QuittingTasks.java
    index b9825a277..330f36690 100644
    --- a/concurrent/QuittingTasks.java
    +++ b/concurrent/QuittingTasks.java
    @@ -23,13 +23,13 @@ public static void main(String[] args) {
       }
     }
     /* Output:
    -125 148 115 127 120 118 106 140 77 119 97 80 143 17 92 147
    -89 123 16 12 138 25 13 101 135 96 76 73 130 133 37 132 134
    -149 137 122 29 49 60 40 142 131 53 1 98 145 126 65 5 64 82
    -79 68 86 141 61 128 22 7 26 19 139 114 146 14 15 43 34 10
    -75 87 90 31 47 38 62 18 63 41 42 144 66 23 6 4 91 70 83 102
    -103 54 69 74 56 71 94 88 78 81 57 52 93 45 48 44 32 28 36
    -33 104 105 112 109 100 117 24 108 21 116 20 9 85 8 84 72
    -107 113 121 124 136 129 99 95 55 3 27 2 59 67 50 58 51 39
    -30 35 46 110 111 11
    +2 33 32 28 31 30 26 29 27 22 1 25 4 23 24 6 5 7 3 8 10 9 12
    +11 21 17 13 14 15 16 18 19 20 39 34 36 37 35 38 40 52 57 53
    +54 95 88 89 91 84 90 87 85 92 86 77 94 80 81 78 59 55 71 74
    +60 58 76 79 62 83 63 82 61 64 68 65 72 69 67 66 47 75 73 49
    +45 70 42 44 51 41 43 50 46 48 56 123 126 119 120 127 121
    +114 117 99 116 115 129 96 145 142 143 148 93 140 125 139
    +124 147 101 141 128 133 100 135 137 130 144 134 146 131 149
    +138 113 132 110 109 111 105 118 97 122 107 98 102 104 103
    +106 112 108 136
     */
    diff --git a/concurrent/SharedConstructorArgument.java b/concurrent/SharedConstructorArgument.java
    index 0d987088e..f59406c8c 100644
    --- a/concurrent/SharedConstructorArgument.java
    +++ b/concurrent/SharedConstructorArgument.java
    @@ -39,6 +39,6 @@ public static void main(String[] args) {
       }
     }
     /* Output:
    -47747
    +48627
     0
     */
    diff --git a/concurrent/SingleThreadExecutor.java b/concurrent/SingleThreadExecutor.java
    index 2ef99677c..9366283d5 100644
    --- a/concurrent/SingleThreadExecutor.java
    +++ b/concurrent/SingleThreadExecutor.java
    @@ -26,20 +26,21 @@ public static void main(String[] args) {
     /* Output:
     All tasks submitted
     main awaiting termination
    +main awaiting termination
     NapTask[0] pool-1-thread-1
     main awaiting termination
     NapTask[1] pool-1-thread-1
     main awaiting termination
     NapTask[2] pool-1-thread-1
    -main awaiting termination
     NapTask[3] pool-1-thread-1
     main awaiting termination
    +main awaiting termination
     NapTask[4] pool-1-thread-1
     main awaiting termination
     NapTask[5] pool-1-thread-1
    -main awaiting termination
     NapTask[6] pool-1-thread-1
     main awaiting termination
    +main awaiting termination
     NapTask[7] pool-1-thread-1
     main awaiting termination
     NapTask[8] pool-1-thread-1
    diff --git a/concurrent/Summing.java b/concurrent/Summing.java
    index 286861cd0..aa500e184 100644
    --- a/concurrent/Summing.java
    +++ b/concurrent/Summing.java
    @@ -41,7 +41,7 @@ public static void main(String[] args) {
     }
     /* Output:
     5000000050000000
    -Sum Stream: 631ms
    -Sum Stream Parallel: 159ms
    -Sum Iterated: 2560ms
    +Sum Stream: 62ms
    +Sum Stream Parallel: 42ms
    +Sum Iterated: 116ms
     */
    diff --git a/concurrent/Summing2.java b/concurrent/Summing2.java
    index dabece6ea..0a64d0b31 100644
    --- a/concurrent/Summing2.java
    +++ b/concurrent/Summing2.java
    @@ -2,7 +2,7 @@
     // (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
    -// {ValidateByHand} // CI has trouble
    +// {ValidateByHand} CI has trouble
     import java.util.*;
     
     public class Summing2 {
    diff --git a/concurrent/Summing3.java b/concurrent/Summing3.java
    index bcd483260..77aa8a494 100644
    --- a/concurrent/Summing3.java
    +++ b/concurrent/Summing3.java
    @@ -2,7 +2,7 @@
     // (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
    -// {ValidateByHand} // CI has trouble
    +// {ValidateByHand} CI has trouble
     import java.util.*;
     
     public class Summing3 {
    diff --git a/concurrent/Summing4.java b/concurrent/Summing4.java
    index 27353141b..2ecfbf1b5 100644
    --- a/concurrent/Summing4.java
    +++ b/concurrent/Summing4.java
    @@ -2,7 +2,7 @@
     // (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
    -// {ValidateByHand} // CI has trouble
    +// {ValidateByHand} CI has trouble
     import java.util.*;
     
     public class Summing4 {
    diff --git a/concurrent/TestStaticIDField.java b/concurrent/TestStaticIDField.java
    index 5ad53adb7..c042ddec0 100644
    --- a/concurrent/TestStaticIDField.java
    +++ b/concurrent/TestStaticIDField.java
    @@ -9,5 +9,5 @@ public static void main(String[] args) {
       }
     }
     /* Output:
    -47643
    +47829
     */
    diff --git a/enums/ConstantSpecificMethod.java b/enums/ConstantSpecificMethod.java
    index 7e485e2c7..d1df6af14 100644
    --- a/enums/ConstantSpecificMethod.java
    +++ b/enums/ConstantSpecificMethod.java
    @@ -33,8 +33,8 @@ public static void main(String[] args) {
       }
     }
     /* Output:
    -Jul 27, 2016
    -C:\Users\Bruce\Documents\GitHub\on-
    +May 2, 2017
    +C:\Users\bruce\Documents\Git\on-
     java\ExtractedExamples\\gradle\wrapper\gradle-wrapper.jar
     1.8.0_102
     */
    diff --git a/enums/NotClasses.java b/enums/NotClasses.java
    index 7e0ce2876..c58a16c47 100644
    --- a/enums/NotClasses.java
    +++ b/enums/NotClasses.java
    @@ -34,8 +34,11 @@ public class NotClasses {
     abstract class LikeClasses extends
     java.lang.Enum {
       public static final LikeClasses WINKEN;
    +
       public static final LikeClasses BLINKEN;
    +
       public static final LikeClasses NOD;
    +
       public static LikeClasses[] values();
         Code:
            0: getstatic     #2                  // Field
    diff --git a/enums/PostOffice.java b/enums/PostOffice.java
    index 4d00b25e6..465268044 100644
    --- a/enums/PostOffice.java
    +++ b/enums/PostOffice.java
    @@ -144,54 +144,54 @@ public static void main(String[] args) {
       }
     }
     /* Output:
    -Mail 0, General Delivery: NO3, Address Scanability: YES2,
    -Address Readability: YES1, Address Address: OK4, Return
    -address: OK5
    -Delivering Mail 0 automatically
    +Mail 0, General Delivery: NO2, Address Scanability:
    +UNSCANNABLE, Address Readability: YES3, Address Address:
    +OK1, Return address: OK1
    +Delivering Mail 0 normally
     *****
    -Mail 1, General Delivery: NO1, Address Scanability: YES1,
    -Address Readability: YES3, Address Address: OK6, Return
    -address: OK1
    +Mail 1, General Delivery: NO5, Address Scanability: YES3,
    +Address Readability: ILLEGIBLE, Address Address: OK5,
    +Return address: OK1
     Delivering Mail 1 automatically
     *****
    -Mail 2, General Delivery: NO4, Address Scanability: YES2,
    -Address Readability: ILLEGIBLE, Address Address: OK5,
    -Return address: MISSING
    -Delivering Mail 2 automatically
    +Mail 2, General Delivery: YES, Address Scanability: YES3,
    +Address Readability: YES1, Address Address: OK1, Return
    +address: OK5
    +Using general delivery for Mail 2
     *****
    -Mail 3, General Delivery: YES, Address Scanability:
    -UNSCANNABLE, Address Readability: YES2, Address Address:
    -OK6, Return address: OK1
    -Using general delivery for Mail 3
    +Mail 3, General Delivery: NO4, Address Scanability: YES3,
    +Address Readability: YES1, Address Address: INCORRECT,
    +Return address: OK4
    +Returning Mail 3 to sender
     *****
    -Mail 4, General Delivery: YES, Address Scanability: YES4,
    -Address Readability: YES1, Address Address: OK6, Return
    -address: OK5
    -Using general delivery for Mail 4
    +Mail 4, General Delivery: NO4, Address Scanability:
    +UNSCANNABLE, Address Readability: YES1, Address Address:
    +INCORRECT, Return address: OK2
    +Returning Mail 4 to sender
     *****
    -Mail 5, General Delivery: NO5, Address Scanability: YES3,
    -Address Readability: YES3, Address Address: OK1, Return
    -address: OK4
    +Mail 5, General Delivery: NO3, Address Scanability: YES1,
    +Address Readability: ILLEGIBLE, Address Address: OK4,
    +Return address: OK2
     Delivering Mail 5 automatically
     *****
    -Mail 6, General Delivery: YES, Address Scanability:
    -UNSCANNABLE, Address Readability: YES1, Address Address:
    -OK3, Return address: MISSING
    +Mail 6, General Delivery: YES, Address Scanability: YES4,
    +Address Readability: ILLEGIBLE, Address Address: OK4,
    +Return address: OK4
     Using general delivery for Mail 6
     *****
    -Mail 7, General Delivery: NO4, Address Scanability: YES1,
    -Address Readability: YES2, Address Address: OK2, Return
    +Mail 7, General Delivery: YES, Address Scanability: YES3,
    +Address Readability: YES4, Address Address: OK2, Return
     address: MISSING
    -Delivering Mail 7 automatically
    +Using general delivery for Mail 7
     *****
    -Mail 8, General Delivery: NO1, Address Scanability: YES2,
    -Address Readability: YES3, Address Address: OK3, Return
    -address: OK3
    -Delivering Mail 8 automatically
    +Mail 8, General Delivery: NO3, Address Scanability: YES1,
    +Address Readability: YES3, Address Address: INCORRECT,
    +Return address: MISSING
    +Mail 8 is a dead letter
     *****
    -Mail 9, General Delivery: NO5, Address Scanability: YES1,
    -Address Readability: YES3, Address Address: OK2, Return
    -address: OK3
    -Delivering Mail 9 automatically
    +Mail 9, General Delivery: NO1, Address Scanability:
    +UNSCANNABLE, Address Readability: YES2, Address Address:
    +OK1, Return address: OK4
    +Delivering Mail 9 normally
     *****
     */
    diff --git a/enums/RandomTest.java b/enums/RandomTest.java
    index b81835e64..9d74531fa 100644
    --- a/enums/RandomTest.java
    +++ b/enums/RandomTest.java
    @@ -15,7 +15,7 @@ public static void main(String[] args) {
       }
     }
     /* Output:
    -JUMPING DODGING SITTING RUNNING FLYING RUNNING DODGING
    -STANDING DODGING FALLING FALLING SITTING DODGING LYING
    -JUMPING JUMPING HOPPING DODGING SITTING FALLING
    +STANDING FLYING RUNNING STANDING RUNNING STANDING LYING
    +DODGING SITTING RUNNING HOPPING HOPPING HOPPING RUNNING
    +STANDING LYING FALLING RUNNING FLYING LYING
     */
    diff --git a/enums/RoShamBo1.java b/enums/RoShamBo1.java
    index 930958836..7fba68962 100644
    --- a/enums/RoShamBo1.java
    +++ b/enums/RoShamBo1.java
    @@ -81,24 +81,24 @@ public static void main(String[] args) {
       }
     }
     /* Output:
    -Scissors vs. Rock: LOSE
    +Rock vs. Rock: DRAW
    +Paper vs. Rock: WIN
    +Paper vs. Rock: WIN
    +Paper vs. Rock: WIN
    +Scissors vs. Paper: WIN
    +Scissors vs. Scissors: DRAW
     Scissors vs. Paper: WIN
     Rock vs. Paper: LOSE
    -Rock vs. Rock: DRAW
    +Paper vs. Paper: DRAW
     Rock vs. Paper: LOSE
     Paper vs. Scissors: LOSE
    +Paper vs. Scissors: LOSE
    +Rock vs. Scissors: WIN
     Rock vs. Paper: LOSE
    -Scissors vs. Scissors: DRAW
    -Scissors vs. Rock: LOSE
    +Paper vs. Rock: WIN
     Scissors vs. Paper: WIN
    -Scissors vs. Rock: LOSE
     Paper vs. Scissors: LOSE
    -Rock vs. Rock: DRAW
    -Scissors vs. Scissors: DRAW
    -Paper vs. Paper: DRAW
    -Scissors vs. Paper: WIN
    -Scissors vs. Rock: LOSE
    -Scissors vs. Paper: WIN
    -Rock vs. Paper: LOSE
    -Rock vs. Scissors: WIN
    +Paper vs. Scissors: LOSE
    +Paper vs. Scissors: LOSE
    +Paper vs. Scissors: LOSE
     */
    diff --git a/enums/RoShamBo2.java b/enums/RoShamBo2.java
    index c977991c0..45ae33626 100644
    --- a/enums/RoShamBo2.java
    +++ b/enums/RoShamBo2.java
    @@ -31,24 +31,24 @@ public static void main(String[] args) {
       }
     }
     /* Output:
    -PAPER vs. ROCK: WIN
    +ROCK vs. ROCK: DRAW
    +SCISSORS vs. ROCK: LOSE
    +SCISSORS vs. ROCK: LOSE
    +SCISSORS vs. ROCK: LOSE
    +PAPER vs. SCISSORS: LOSE
    +PAPER vs. PAPER: DRAW
     PAPER vs. SCISSORS: LOSE
     ROCK vs. SCISSORS: WIN
    -ROCK vs. ROCK: DRAW
    +SCISSORS vs. SCISSORS: DRAW
     ROCK vs. SCISSORS: WIN
     SCISSORS vs. PAPER: WIN
    +SCISSORS vs. PAPER: WIN
    +ROCK vs. PAPER: LOSE
     ROCK vs. SCISSORS: WIN
    -PAPER vs. PAPER: DRAW
    -PAPER vs. ROCK: WIN
    +SCISSORS vs. ROCK: LOSE
     PAPER vs. SCISSORS: LOSE
    -PAPER vs. ROCK: WIN
     SCISSORS vs. PAPER: WIN
    -ROCK vs. ROCK: DRAW
    -PAPER vs. PAPER: DRAW
    -SCISSORS vs. SCISSORS: DRAW
    -PAPER vs. SCISSORS: LOSE
    -PAPER vs. ROCK: WIN
    -PAPER vs. SCISSORS: LOSE
    -ROCK vs. SCISSORS: WIN
    -ROCK vs. PAPER: LOSE
    +SCISSORS vs. PAPER: WIN
    +SCISSORS vs. PAPER: WIN
    +SCISSORS vs. PAPER: WIN
     */
    diff --git a/enums/RoShamBo3.java b/enums/RoShamBo3.java
    index a4a843b19..046912dd4 100644
    --- a/enums/RoShamBo3.java
    +++ b/enums/RoShamBo3.java
    @@ -48,24 +48,24 @@ public static void main(String[] args) {
       }
     }
     /* Output:
    -PAPER vs. ROCK: WIN
    +ROCK vs. ROCK: DRAW
    +SCISSORS vs. ROCK: LOSE
    +SCISSORS vs. ROCK: LOSE
    +SCISSORS vs. ROCK: LOSE
    +PAPER vs. SCISSORS: LOSE
    +PAPER vs. PAPER: DRAW
     PAPER vs. SCISSORS: LOSE
     ROCK vs. SCISSORS: WIN
    -ROCK vs. ROCK: DRAW
    +SCISSORS vs. SCISSORS: DRAW
     ROCK vs. SCISSORS: WIN
     SCISSORS vs. PAPER: WIN
    +SCISSORS vs. PAPER: WIN
    +ROCK vs. PAPER: LOSE
     ROCK vs. SCISSORS: WIN
    -PAPER vs. PAPER: DRAW
    -PAPER vs. ROCK: WIN
    +SCISSORS vs. ROCK: LOSE
     PAPER vs. SCISSORS: LOSE
    -PAPER vs. ROCK: WIN
     SCISSORS vs. PAPER: WIN
    -ROCK vs. ROCK: DRAW
    -PAPER vs. PAPER: DRAW
    -SCISSORS vs. SCISSORS: DRAW
    -PAPER vs. SCISSORS: LOSE
    -PAPER vs. ROCK: WIN
    -PAPER vs. SCISSORS: LOSE
    -ROCK vs. SCISSORS: WIN
    -ROCK vs. PAPER: LOSE
    +SCISSORS vs. PAPER: WIN
    +SCISSORS vs. PAPER: WIN
    +SCISSORS vs. PAPER: WIN
     */
    diff --git a/enums/RoShamBo4.java b/enums/RoShamBo4.java
    index ccaa7e5da..b129e09da 100644
    --- a/enums/RoShamBo4.java
    +++ b/enums/RoShamBo4.java
    @@ -34,24 +34,24 @@ public static void main(String[] args) {
       }
     }
     /* Output:
    -ROCK vs. PAPER: LOSE
    +PAPER vs. PAPER: DRAW
    +SCISSORS vs. PAPER: WIN
    +SCISSORS vs. PAPER: WIN
    +SCISSORS vs. PAPER: WIN
    +ROCK vs. SCISSORS: WIN
    +ROCK vs. ROCK: DRAW
     ROCK vs. SCISSORS: WIN
     PAPER vs. SCISSORS: LOSE
    -PAPER vs. PAPER: DRAW
    +SCISSORS vs. SCISSORS: DRAW
     PAPER vs. SCISSORS: LOSE
     SCISSORS vs. ROCK: LOSE
    +SCISSORS vs. ROCK: LOSE
    +PAPER vs. ROCK: WIN
     PAPER vs. SCISSORS: LOSE
    -ROCK vs. ROCK: DRAW
    -ROCK vs. PAPER: LOSE
    +SCISSORS vs. PAPER: WIN
     ROCK vs. SCISSORS: WIN
    -ROCK vs. PAPER: LOSE
     SCISSORS vs. ROCK: LOSE
    -PAPER vs. PAPER: DRAW
    -ROCK vs. ROCK: DRAW
    -SCISSORS vs. SCISSORS: DRAW
    -ROCK vs. SCISSORS: WIN
    -ROCK vs. PAPER: LOSE
    -ROCK vs. SCISSORS: WIN
    -PAPER vs. SCISSORS: LOSE
    -PAPER vs. ROCK: WIN
    +SCISSORS vs. ROCK: LOSE
    +SCISSORS vs. ROCK: LOSE
    +SCISSORS vs. ROCK: LOSE
     */
    diff --git a/enums/RoShamBo5.java b/enums/RoShamBo5.java
    index 5382aba12..eabddd3de 100644
    --- a/enums/RoShamBo5.java
    +++ b/enums/RoShamBo5.java
    @@ -36,24 +36,24 @@ public static void main(String[] args) {
       }
     }
     /* Output:
    -PAPER vs. ROCK: WIN
    +ROCK vs. ROCK: DRAW
    +SCISSORS vs. ROCK: LOSE
    +SCISSORS vs. ROCK: LOSE
    +SCISSORS vs. ROCK: LOSE
    +PAPER vs. SCISSORS: LOSE
    +PAPER vs. PAPER: DRAW
     PAPER vs. SCISSORS: LOSE
     ROCK vs. SCISSORS: WIN
    -ROCK vs. ROCK: DRAW
    +SCISSORS vs. SCISSORS: DRAW
     ROCK vs. SCISSORS: WIN
     SCISSORS vs. PAPER: WIN
    +SCISSORS vs. PAPER: WIN
    +ROCK vs. PAPER: LOSE
     ROCK vs. SCISSORS: WIN
    -PAPER vs. PAPER: DRAW
    -PAPER vs. ROCK: WIN
    +SCISSORS vs. ROCK: LOSE
     PAPER vs. SCISSORS: LOSE
    -PAPER vs. ROCK: WIN
     SCISSORS vs. PAPER: WIN
    -ROCK vs. ROCK: DRAW
    -PAPER vs. PAPER: DRAW
    -SCISSORS vs. SCISSORS: DRAW
    -PAPER vs. SCISSORS: LOSE
    -PAPER vs. ROCK: WIN
    -PAPER vs. SCISSORS: LOSE
    -ROCK vs. SCISSORS: WIN
    -ROCK vs. PAPER: LOSE
    +SCISSORS vs. PAPER: WIN
    +SCISSORS vs. PAPER: WIN
    +SCISSORS vs. PAPER: WIN
     */
    diff --git a/enums/RoShamBo6.java b/enums/RoShamBo6.java
    index 1483a8030..d1e2e0268 100644
    --- a/enums/RoShamBo6.java
    +++ b/enums/RoShamBo6.java
    @@ -23,24 +23,24 @@ public static void main(String[] args) {
       }
     }
     /* Output:
    -PAPER vs. ROCK: WIN
    +ROCK vs. ROCK: DRAW
    +SCISSORS vs. ROCK: LOSE
    +SCISSORS vs. ROCK: LOSE
    +SCISSORS vs. ROCK: LOSE
    +PAPER vs. SCISSORS: LOSE
    +PAPER vs. PAPER: DRAW
     PAPER vs. SCISSORS: LOSE
     ROCK vs. SCISSORS: WIN
    -ROCK vs. ROCK: DRAW
    +SCISSORS vs. SCISSORS: DRAW
     ROCK vs. SCISSORS: WIN
     SCISSORS vs. PAPER: WIN
    +SCISSORS vs. PAPER: WIN
    +ROCK vs. PAPER: LOSE
     ROCK vs. SCISSORS: WIN
    -PAPER vs. PAPER: DRAW
    -PAPER vs. ROCK: WIN
    +SCISSORS vs. ROCK: LOSE
     PAPER vs. SCISSORS: LOSE
    -PAPER vs. ROCK: WIN
     SCISSORS vs. PAPER: WIN
    -ROCK vs. ROCK: DRAW
    -PAPER vs. PAPER: DRAW
    -SCISSORS vs. SCISSORS: DRAW
    -PAPER vs. SCISSORS: LOSE
    -PAPER vs. ROCK: WIN
    -PAPER vs. SCISSORS: LOSE
    -ROCK vs. SCISSORS: WIN
    -ROCK vs. PAPER: LOSE
    +SCISSORS vs. PAPER: WIN
    +SCISSORS vs. PAPER: WIN
    +SCISSORS vs. PAPER: WIN
     */
    diff --git a/enums/SecurityCategory.java b/enums/SecurityCategory.java
    index f915f28f5..908ebe9cb 100644
    --- a/enums/SecurityCategory.java
    +++ b/enums/SecurityCategory.java
    @@ -33,14 +33,14 @@ public static void main(String[] args) {
       }
     }
     /* Output:
    +BOND: MUNICIPAL
    +BOND: MUNICIPAL
    +STOCK: MARGIN
     STOCK: MARGIN
    +BOND: JUNK
    +STOCK: SHORT
     STOCK: LONG
     STOCK: LONG
    -STOCK: MARGIN
     BOND: MUNICIPAL
    -BOND: MUNICIPAL
    -STOCK: LONG
    -BOND: JUNK
    -STOCK: MARGIN
     BOND: JUNK
     */
    diff --git a/enums/cartoons/EnumImplementation.java b/enums/cartoons/EnumImplementation.java
    index 68eab3581..cb3abaa0f 100644
    --- a/enums/cartoons/EnumImplementation.java
    +++ b/enums/cartoons/EnumImplementation.java
    @@ -32,6 +32,6 @@ public static void main(String[] args) {
       }
     }
     /* Output:
    -SILLY, SPANKY, PUNCHY, BOUNCY, BOB, SLAPPY, SLAPPY, BOB,
    -BOB, SLAPPY,
    +BOB, PUNCHY, BOB, SPANKY, NUTTY, PUNCHY, SLAPPY, NUTTY,
    +NUTTY, SLAPPY,
     */
    diff --git a/enums/menu/Meal.java b/enums/menu/Meal.java
    index f83a30024..3bd12ed21 100644
    --- a/enums/menu/Meal.java
    +++ b/enums/menu/Meal.java
    @@ -17,29 +17,29 @@ public static void main(String[] args) {
       }
     }
     /* Output:
    -SALAD
    +SPRING_ROLLS
     VINDALOO
    -GELATO
    -CAPPUCCINO
    +FRUIT
    +DECAF_COFFEE
     ***
    -SPRING_ROLLS
    -BURRITO
    -GELATO
    -HERB_TEA
    +SOUP
    +VINDALOO
    +FRUIT
    +TEA
     ***
    -SPRING_ROLLS
    +SALAD
     BURRITO
    -TIRAMISU
    -CAPPUCCINO
    +FRUIT
    +TEA
     ***
    -SPRING_ROLLS
    +SALAD
     BURRITO
    -BLACK_FOREST_CAKE
    +CREME_CARAMEL
     LATTE
     ***
    -SALAD
    -PAD_THAI
    -GELATO
    -TEA
    +SOUP
    +BURRITO
    +TIRAMISU
    +ESPRESSO
     ***
     */
    diff --git a/enums/menu/Meal2.java b/enums/menu/Meal2.java
    index ef0c38738..17bbdf6e9 100644
    --- a/enums/menu/Meal2.java
    +++ b/enums/menu/Meal2.java
    @@ -46,29 +46,29 @@ public static void main(String[] args) {
       }
     }
     /* Output:
    -SALAD
    +SPRING_ROLLS
     VINDALOO
    -GELATO
    -CAPPUCCINO
    +FRUIT
    +DECAF_COFFEE
     ***
    -SPRING_ROLLS
    -BURRITO
    -GELATO
    -HERB_TEA
    +SOUP
    +VINDALOO
    +FRUIT
    +TEA
     ***
    -SPRING_ROLLS
    +SALAD
     BURRITO
    -TIRAMISU
    -CAPPUCCINO
    +FRUIT
    +TEA
     ***
    -SPRING_ROLLS
    +SALAD
     BURRITO
    -BLACK_FOREST_CAKE
    +CREME_CARAMEL
     LATTE
     ***
    -SALAD
    -PAD_THAI
    -GELATO
    -TEA
    +SOUP
    +BURRITO
    +TIRAMISU
    +ESPRESSO
     ***
     */
    diff --git a/exceptions/LoggingExceptions.java b/exceptions/LoggingExceptions.java
    index c28510f8a..0569c05bf 100644
    --- a/exceptions/LoggingExceptions.java
    +++ b/exceptions/LoggingExceptions.java
    @@ -33,13 +33,13 @@ public static void main(String[] args) {
     }
     /* Output:
     ___[ Error Output ]___
    -Jul 27, 2016 10:50:30 AM LoggingException 
    +May 02, 2017 3:21:47 PM LoggingException 
     SEVERE: LoggingException
             at
     LoggingExceptions.main(LoggingExceptions.java:20)
     
     Caught LoggingException
    -Jul 27, 2016 10:50:30 AM LoggingException 
    +May 02, 2017 3:21:47 PM LoggingException 
     SEVERE: LoggingException
             at
     LoggingExceptions.main(LoggingExceptions.java:25)
    diff --git a/exceptions/LoggingExceptions2.java b/exceptions/LoggingExceptions2.java
    index a99d0a855..11ebc7057 100644
    --- a/exceptions/LoggingExceptions2.java
    +++ b/exceptions/LoggingExceptions2.java
    @@ -25,7 +25,7 @@ public static void main(String[] args) {
     }
     /* Output:
     ___[ Error Output ]___
    -Jul 27, 2016 10:50:30 AM LoggingExceptions2 logException
    +May 02, 2017 3:21:47 PM LoggingExceptions2 logException
     SEVERE: java.lang.NullPointerException
             at
     LoggingExceptions2.main(LoggingExceptions2.java:17)
    diff --git a/files/AddAndSubtractPaths.java b/files/AddAndSubtractPaths.java
    index c13121bab..d913fada1 100644
    --- a/files/AddAndSubtractPaths.java
    +++ b/files/AddAndSubtractPaths.java
    @@ -53,35 +53,35 @@ public static void main(String[] args) {
     }
     /* Output:
     Windows 10
    -C:\Users\Bruce\Documents\GitHub
    +C:\Users\bruce\Documents\Git
     (1)r on-
     java\ExtractedExamples\files\AddAndSubtractPaths.java
    -RealPath: C:\Users\Bruce\Documents\GitHub\on-
    +RealPath: C:\Users\bruce\Documents\Git\on-
     java\ExtractedExamples\files\AddAndSubtractPaths.java
     (2)r on-java\ExtractedExamples\strings\..\files
    -RealPath: C:\Users\Bruce\Documents\GitHub\on-
    +RealPath: C:\Users\bruce\Documents\Git\on-
     java\ExtractedExamples\files
     (3)r on-java\ExtractedExamples\files
    -RealPath: C:\Users\Bruce\Documents\GitHub\on-
    +RealPath: C:\Users\bruce\Documents\Git\on-
     java\ExtractedExamples\files
     (4)  ..\..
    -RealPath: C:\Users\Bruce\Documents\GitHub\on-java
    +RealPath: C:\Users\bruce\Documents\Git\on-java
     (5)  ..\..
    -RealPath: C:\Users\Bruce\Documents\GitHub\on-java
    +RealPath: C:\Users\bruce\Documents\Git\on-java
     (6)r on-java
    -RealPath: C:\Users\Bruce\Documents\GitHub\on-java
    +RealPath: C:\Users\bruce\Documents\Git\on-java
     (7)r on-java\ExtractedExamples\files\.\..\..
    -RealPath: C:\Users\Bruce\Documents\GitHub\on-java
    +RealPath: C:\Users\bruce\Documents\Git\on-java
     (8)r on-java
    -RealPath: C:\Users\Bruce\Documents\GitHub\on-java
    +RealPath: C:\Users\bruce\Documents\Git\on-java
     (9)r on-java\ExtractedExamples\files
    -RealPath: C:\Users\Bruce\Documents\GitHub\on-
    +RealPath: C:\Users\bruce\Documents\Git\on-
     java\ExtractedExamples\files
     (10)r on-java\ExtractedExamples\strings
    -RealPath: C:\Users\Bruce\Documents\GitHub\on-
    +RealPath: C:\Users\bruce\Documents\Git\on-
     java\ExtractedExamples\strings
     (11)  nonexistent
     java.nio.file.NoSuchFileException:
    -C:\Users\Bruce\Documents\GitHub\on-
    +C:\Users\bruce\Documents\Git\on-
     java\ExtractedExamples\files\nonexistent
     */
    diff --git a/files/Directories.java b/files/Directories.java
    index 0172344bc..b96d7365b 100644
    --- a/files/Directories.java
    +++ b/files/Directories.java
    @@ -59,7 +59,7 @@ static void populateTestDir() throws Exception {
     test\bag
     test\bar
     test\baz
    -test\DIR_3697011820450773773
    +test\DIR_7205037124905635827
     test\foo
     test\Hello.txt
     *********
    @@ -68,27 +68,27 @@ static void populateTestDir() throws Exception {
     test\bag\foo
     test\bag\foo\bar
     test\bag\foo\bar\baz
    -test\bag\foo\bar\baz\234245189903117886.tmp
    +test\bag\foo\bar\baz\4584994277735481362.tmp
     test\bag\foo\bar\baz\File.txt
     test\bar
     test\bar\baz
     test\bar\baz\bag
     test\bar\baz\bag\foo
    -test\bar\baz\bag\foo\8752987828022262887.tmp
    +test\bar\baz\bag\foo\4367937361263211140.tmp
     test\bar\baz\bag\foo\File.txt
     test\baz
     test\baz\bag
     test\baz\bag\foo
     test\baz\bag\foo\bar
    -test\baz\bag\foo\bar\465343347528104633.tmp
    +test\baz\bag\foo\bar\7687116918707992631.tmp
     test\baz\bag\foo\bar\File.txt
    -test\DIR_3697011820450773773
    -test\DIR_3697011820450773773\pre3304897437567097054.non
    +test\DIR_7205037124905635827
    +test\DIR_7205037124905635827\pre9154379587817312624.non
     test\foo
     test\foo\bar
     test\foo\bar\baz
     test\foo\bar\baz\bag
    -test\foo\bar\baz\bag\2118206626074637804.tmp
    +test\foo\bar\baz\bag\7686121002327077993.tmp
     test\foo\bar\baz\bag\File.txt
     test\Hello.txt
     */
    diff --git a/files/FileSystemDemo.java b/files/FileSystemDemo.java
    index 98c517761..a1591b724 100644
    --- a/files/FileSystemDemo.java
    +++ b/files/FileSystemDemo.java
    @@ -27,15 +27,14 @@ public static void main(String[] args) {
     }
     /* Output:
     Windows 10
    -File Store: SSD (C:)
    +File Store: Teenyverse (C:)
     Root Directory: C:\
    -Root Directory: D:\
     Separator: \
     UserPrincipalLookupService:
    -sun.nio.fs.WindowsFileSystem$LookupService$1@1db9742
    +sun.nio.fs.WindowsFileSystem$LookupService$1@15db9742
     isOpen: true
     isReadOnly: false
     FileSystemProvider:
    -sun.nio.fs.WindowsFileSystemProvider@106d69c
    +sun.nio.fs.WindowsFileSystemProvider@6d06d69c
     File Attribute Views: [owner, dos, acl, basic, user]
     */
    diff --git a/files/Find.java b/files/Find.java
    index 464615467..fdc7e55e5 100644
    --- a/files/Find.java
    +++ b/files/Find.java
    @@ -36,24 +36,24 @@ public class Find {
       }
     }
     /* Output:
    -test\bag\foo\bar\baz\369594599218802549.tmp
    +test\bag\foo\bar\baz\7676311745640921113.tmp
     test\bag\foo\bar\baz\File.txt
    -test\bar\baz\bag\foo\2372197258227988384.tmp
    +test\bar\baz\bag\foo\5150002287600428217.tmp
     test\bar\baz\bag\foo\File.txt
    -test\baz\bag\foo\bar\1091363470697614580.tmp
    +test\baz\bag\foo\bar\8782742629206515741.tmp
     test\baz\bag\foo\bar\File.txt
     test\dir.tmp
    -test\foo\bar\baz\bag\48863440153181406.tmp
    +test\foo\bar\baz\bag\5650574120756265046.tmp
     test\foo\bar\baz\bag\File.txt
     ***************
    -369594599218802549.tmp
    -2372197258227988384.tmp
    -1091363470697614580.tmp
    +7676311745640921113.tmp
    +5150002287600428217.tmp
    +8782742629206515741.tmp
     dir.tmp
    -48863440153181406.tmp
    +5650574120756265046.tmp
     ***************
    -369594599218802549.tmp
    -2372197258227988384.tmp
    -1091363470697614580.tmp
    -48863440153181406.tmp
    +7676311745640921113.tmp
    +5150002287600428217.tmp
    +8782742629206515741.tmp
    +5650574120756265046.tmp
     */
    diff --git a/files/PartsOfPaths.java b/files/PartsOfPaths.java
    index 9f27e035c..66be7823c 100644
    --- a/files/PartsOfPaths.java
    +++ b/files/PartsOfPaths.java
    @@ -25,18 +25,18 @@ public static void main(String[] args) {
     /* Output:
     Windows 10
     Users
    -Bruce
    +bruce
     Documents
    -GitHub
    +Git
     on-java
     ExtractedExamples
     files
     PartsOfPaths.java
     ends with '.java': false
     Users: false : false
    -Bruce: false : false
    +bruce: false : false
     Documents: false : false
    -GitHub: false : false
    +Git: false : false
     on-java: false : false
     ExtractedExamples: false : false
     files: false : false
    diff --git a/files/PathAnalysis.java b/files/PathAnalysis.java
    index b76be5519..163a89546 100644
    --- a/files/PathAnalysis.java
    +++ b/files/PathAnalysis.java
    @@ -48,9 +48,9 @@ static void say(String id, Object result) {
     notExists: false
     Hidden: false
     size: 1630
    -FileStore: SSD (C:)
    -LastModified: : 2016-07-27T15:52:49.898848Z
    -Owner: MINDVIEWTOSHIBA\Bruce (User)
    +FileStore: Teenyverse (C:)
    +LastModified: : 2017-05-02T21:19:06.828604Z
    +Owner: TEENYVERSE\bruce (User)
     ContentType: null
     SymbolicLink: false
     */
    diff --git a/files/PathInfo.java b/files/PathInfo.java
    index fc6ba1d59..d2bf515fc 100644
    --- a/files/PathInfo.java
    +++ b/files/PathInfo.java
    @@ -63,40 +63,40 @@ public static void main(String[] args) {
     Parent: null
     Root: null
     ----------------
    -toString: C:\Users\Bruce\Documents\GitHub\on-
    +toString: C:\Users\bruce\Documents\Git\on-
     java\ExtractedExamples\files\PathInfo.java
     Exists: true
     RegularFile: true
     Directory: false
     Absolute: true
     FileName: PathInfo.java
    -Parent: C:\Users\Bruce\Documents\GitHub\on-
    +Parent: C:\Users\bruce\Documents\Git\on-
     java\ExtractedExamples\files
     Root: C:\
     ----------------
    -toString: C:\Users\Bruce\Documents\GitHub\on-
    +toString: C:\Users\bruce\Documents\Git\on-
     java\ExtractedExamples\files
     Exists: true
     RegularFile: false
     Directory: true
     Absolute: true
     FileName: files
    -Parent: C:\Users\Bruce\Documents\GitHub\on-
    +Parent: C:\Users\bruce\Documents\Git\on-
     java\ExtractedExamples
     Root: C:\
     ----------------
    -toString: C:\Users\Bruce\Documents\GitHub\on-
    +toString: C:\Users\bruce\Documents\Git\on-
     java\ExtractedExamples\files\PathInfo.java
     Exists: true
     RegularFile: true
     Directory: false
     Absolute: true
     FileName: PathInfo.java
    -Parent: C:\Users\Bruce\Documents\GitHub\on-
    +Parent: C:\Users\bruce\Documents\Git\on-
     java\ExtractedExamples\files
     Root: C:\
     ----------------
    -URI: file:///C:/Users/Bruce/Documents/GitHub/on-
    +URI: file:///C:/Users/bruce/Documents/Git/on-
     java/ExtractedExamples/files/PathInfo.java
     true
     */
    diff --git a/files/TreeWatcher.java b/files/TreeWatcher.java
    index b13107cc2..bc8378d76 100644
    --- a/files/TreeWatcher.java
    +++ b/files/TreeWatcher.java
    @@ -2,6 +2,7 @@
     // (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
    +// {ValidateByHand}
     import java.io.IOException;
     import java.nio.file.*;
     import static java.nio.file.StandardWatchEventKinds.*;
    @@ -47,7 +48,4 @@ static void watchDir(Path dir) {
     evt.context(): File.txt
     evt.count(): 1
     evt.kind(): ENTRY_DELETE
    -evt.context(): File.txt
    -evt.count(): 1
    -evt.kind(): ENTRY_DELETE
     */
    diff --git a/generics/DynamicProxyMixin.java b/generics/DynamicProxyMixin.java
    index 75e162b9f..942b638d3 100644
    --- a/generics/DynamicProxyMixin.java
    +++ b/generics/DynamicProxyMixin.java
    @@ -60,6 +60,6 @@ public static void main(String[] args) {
     }
     /* Output:
     Hello
    -1469638238271
    +1493760122461
     1
     */
    diff --git a/generics/GenericReading.java b/generics/GenericReading.java
    index 8479f105e..c75cd91cc 100644
    --- a/generics/GenericReading.java
    +++ b/generics/GenericReading.java
    @@ -16,8 +16,8 @@ static void f1() {
         Fruit f = readExact(fruit);
         f = readExact(apples);
       }
    -  // If you have a class, its type is
    -  // established when the class is instantiated:
    +  // A class type is established
    +  // when the class is instantiated:
       static class Reader {
         T readExact(List list) { return list.get(0); }
       }
    diff --git a/generics/Mixins.java b/generics/Mixins.java
    index e272f1c01..d018ee0cd 100644
    --- a/generics/Mixins.java
    +++ b/generics/Mixins.java
    @@ -64,6 +64,6 @@ public static void main(String[] args) {
       }
     }
     /* Output:
    -test string 1 1469638250315 1
    -test string 2 1469638250317 2
    +test string 1 1493760126621 1
    +test string 2 1493760126621 2
     */
    diff --git a/generics/TupleList.java b/generics/TupleList.java
    index c25a135be..8a0d75e15 100644
    --- a/generics/TupleList.java
    +++ b/generics/TupleList.java
    @@ -18,6 +18,6 @@ public static void main(String[] args) {
       }
     }
     /* Output:
    -(Vehicle@107d329, Amphibian@1629346, hi, 47)
    -(Vehicle@4b9385, Amphibian@1311334, hi, 47)
    +(Vehicle@214c265e, Amphibian@448139f0, hi, 47)
    +(Vehicle@7cca494b, Amphibian@7ba4f24f, hi, 47)
     */
    diff --git a/generics/TupleTest.java b/generics/TupleTest.java
    index 7a0e3c732..da7305b30 100644
    --- a/generics/TupleTest.java
    +++ b/generics/TupleTest.java
    @@ -35,7 +35,7 @@ public static void main(String[] args) {
     }
     /* Output:
     (hi, 47)
    -(Amphibian@1c7c054, hi, 47)
    -(Vehicle@14991ad, Amphibian@d93b30, hi, 47)
    -(Vehicle@a14482, Amphibian@140e19d, hi, 47, 11.1)
    +(Amphibian@4554617c, hi, 47)
    +(Vehicle@677327b6, Amphibian@14ae5a5, hi, 47)
    +(Vehicle@135fbaa4, Amphibian@45ee12a7, hi, 47, 11.1)
     */
    diff --git a/generics/TupleTest2.java b/generics/TupleTest2.java
    index c12d77efa..f9f18216f 100644
    --- a/generics/TupleTest2.java
    +++ b/generics/TupleTest2.java
    @@ -35,7 +35,7 @@ public static void main(String[] args) {
     /* Output:
     (hi, 47)
     (hi, 47)
    -(Amphibian@a298b7, hi, 47)
    -(Vehicle@16d3586, Amphibian@154617c, hi, 47)
    -(Vehicle@17327b6, Amphibian@14ae5a5, hi, 47, 11.1)
    +(Amphibian@1540e19d, hi, 47)
    +(Vehicle@7f31245a, Amphibian@6d6f6e28, hi, 47)
    +(Vehicle@330bedb4, Amphibian@2503dbd3, hi, 47, 11.1)
     */
    diff --git a/generics/WatercolorSets.java b/generics/WatercolorSets.java
    index 365cace8a..5f584e129 100644
    --- a/generics/WatercolorSets.java
    +++ b/generics/WatercolorSets.java
    @@ -35,19 +35,19 @@ public static void main(String[] args) {
     set2: [CERULEAN_BLUE_HUE, PHTHALO_BLUE, ULTRAMARINE,
     COBALT_BLUE_HUE, PERMANENT_GREEN, VIRIDIAN_HUE, SAP_GREEN,
     YELLOW_OCHRE, BURNT_SIENNA, RAW_UMBER, BURNT_UMBER]
    -union(set1, set2): [MAGENTA, COBALT_BLUE_HUE, VIOLET,
    -VIRIDIAN_HUE, BURNT_SIENNA, ULTRAMARINE, CERULEAN_BLUE_HUE,
    -BURNT_UMBER, BRILLIANT_RED, PHTHALO_BLUE, YELLOW_OCHRE,
    -SAP_GREEN, CRIMSON, ROSE_MADDER, RAW_UMBER,
    -PERMANENT_GREEN]
    -intersection(set1, set2): [COBALT_BLUE_HUE, VIRIDIAN_HUE,
    -ULTRAMARINE, CERULEAN_BLUE_HUE, PHTHALO_BLUE,
    -PERMANENT_GREEN]
    -difference(set1, subset): [CRIMSON, MAGENTA, VIOLET,
    -ROSE_MADDER, BRILLIANT_RED]
    -difference(set2, subset): [BURNT_SIENNA, BURNT_UMBER,
    -YELLOW_OCHRE, RAW_UMBER, SAP_GREEN]
    -complement(set1, set2): [MAGENTA, VIOLET, BURNT_SIENNA,
    -BURNT_UMBER, BRILLIANT_RED, YELLOW_OCHRE, SAP_GREEN,
    -CRIMSON, ROSE_MADDER, RAW_UMBER]
    +union(set1, set2): [BURNT_UMBER, MAGENTA, RAW_UMBER,
    +VIOLET, BURNT_SIENNA, ULTRAMARINE, CRIMSON,
    +PERMANENT_GREEN, YELLOW_OCHRE, BRILLIANT_RED, PHTHALO_BLUE,
    +CERULEAN_BLUE_HUE, SAP_GREEN, COBALT_BLUE_HUE, ROSE_MADDER,
    +VIRIDIAN_HUE]
    +intersection(set1, set2): [ULTRAMARINE, PERMANENT_GREEN,
    +PHTHALO_BLUE, COBALT_BLUE_HUE, CERULEAN_BLUE_HUE,
    +VIRIDIAN_HUE]
    +difference(set1, subset): [MAGENTA, VIOLET, CRIMSON,
    +BRILLIANT_RED, ROSE_MADDER]
    +difference(set2, subset): [SAP_GREEN, BURNT_UMBER,
    +RAW_UMBER, BURNT_SIENNA, YELLOW_OCHRE]
    +complement(set1, set2): [BURNT_UMBER, MAGENTA, RAW_UMBER,
    +VIOLET, BURNT_SIENNA, CRIMSON, YELLOW_OCHRE, BRILLIANT_RED,
    +SAP_GREEN, ROSE_MADDER]
     */
    diff --git a/gg.bat b/gg.bat
    deleted file mode 100644
    index 174efa64c..000000000
    --- a/gg.bat
    +++ /dev/null
    @@ -1 +0,0 @@
    -gradlew --console plain %*
    diff --git a/housekeeping/NewVarArgs.java b/housekeeping/NewVarArgs.java
    index 2e19809aa..28eb2a9c5 100644
    --- a/housekeeping/NewVarArgs.java
    +++ b/housekeeping/NewVarArgs.java
    @@ -25,6 +25,6 @@ public static void main(String[] args) {
     47 3.14 11.11
     47 3.14 11.11
     one two three
    -A@1db9742 A@106d69c A@52e922
    +A@15db9742 A@6d06d69c A@7852e922
     1 2 3 4
     */
    diff --git a/housekeeping/VarArgs.java b/housekeeping/VarArgs.java
    index 0b15efa04..36dfb5a0a 100644
    --- a/housekeeping/VarArgs.java
    +++ b/housekeeping/VarArgs.java
    @@ -22,5 +22,5 @@ public static void main(String[] args) {
     /* Output:
     47 3.14 11.11
     one two three
    -A@1db9742 A@106d69c A@52e922
    +A@15db9742 A@6d06d69c A@7852e922
     */
    diff --git a/interfaces/interfaceprocessor/StringProcessor.java b/interfaces/interfaceprocessor/StringProcessor.java
    index 01ec16806..c5c229a40 100644
    --- a/interfaces/interfaceprocessor/StringProcessor.java
    +++ b/interfaces/interfaceprocessor/StringProcessor.java
    @@ -44,6 +44,6 @@ public String process(Object input) {
     Using Processor Downcase
     if she weighs the same as a duck, she's made of wood
     Using Processor Splitter
    -[If, she, weighs, the, same, as, a, duck,, she's, made,
    -of, wood]
    +[If, she, weighs, the, same, as, a, duck,, she's, made, of,
    +wood]
     */
    diff --git a/javadoc/HelloDateDoc.java b/javadoc/HelloDateDoc.java
    index 8aef609bf..a1c848b57 100644
    --- a/javadoc/HelloDateDoc.java
    +++ b/javadoc/HelloDateDoc.java
    @@ -22,5 +22,5 @@ public static void main(String[] args) {
     }
     /* Output:
     Hello, it's:
    -Wed Jul 27 10:50:45 MDT 2016
    +Tue May 02 15:22:28 MDT 2017
     */
    diff --git a/lowlevel/AttemptLocking.java b/lowlevel/AttemptLocking.java
    index 969143e6c..ad0ded790 100644
    --- a/lowlevel/AttemptLocking.java
    +++ b/lowlevel/AttemptLocking.java
    @@ -4,6 +4,7 @@
     // Visit http://OnJava8.com for more book information.
     // Locks in the concurrent library allow you
     // to give up on trying to acquire a lock
    +// {ValidateByHand} AppVeyor CI has trouble
     import java.util.concurrent.*;
     import java.util.concurrent.locks.*;
     import onjava.Nap;
    diff --git a/lowlevel/DelayQueueDemo.java b/lowlevel/DelayQueueDemo.java
    index c805d7387..01620f580 100644
    --- a/lowlevel/DelayQueueDemo.java
    +++ b/lowlevel/DelayQueueDemo.java
    @@ -70,14 +70,11 @@ public class DelayQueueDemo {
       }
     }
     /* Output:
    -[128] Task 12 [429] Task 6 [551] Task 13
    - [555] Task 2 [693] Task 3 [809] Task 15
    - [961] Task 5 [1258] Task 1 [1258] Task 20
    -  [1520] Task 19 [1861] Task 4 [1998] T
    -ask 17 [2200] Task 8 [2207] Task 10 [2288]
    -Task 11 [2522] Task 9 [2589] Task 14
    -[2861] Task 18 [2868] Task 7 [3278]
    -Task 16 (0:4000)
    +[128] Task 12 [429] Task 6 [551] Task 13 [555] Task 2 [693]
    +Task 3 [809] Task 15 [961] Task 5 [1258] Task 1 [1258] Task
    +20 [1520] Task 19 [1861] Task 4 [1998] Task 17 [2200] Task
    +8 [2207] Task 10 [2288] Task 11 [2522] Task 9 [2589] Task
    +14 [2861] Task 18 [2868] Task 7 [3278] Task 16 (0:4000)
     (1:1258)
     (2:555)
     (3:693)
    diff --git a/lowlevel/EvenProducer.java b/lowlevel/EvenProducer.java
    index d51ec8380..6b665fde1 100644
    --- a/lowlevel/EvenProducer.java
    +++ b/lowlevel/EvenProducer.java
    @@ -3,6 +3,7 @@
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // When threads collide
    +// {ValidateByHand}
     
     public class EvenProducer extends IntGenerator {
       private int currentEvenValue = 0;
    @@ -17,10 +18,6 @@ public static void main(String[] args) {
       }
     }
     /* Output:
    -1563 not even!
    -1573 not even!
    -1571 not even!
    -1569 not even!
    -1567 not even!
    -1565 not even!
    +303 not even!
    +301 not even!
     */
    diff --git a/lowlevel/NotAtomic.java b/lowlevel/NotAtomic.java
    index ab9577a99..4ac34dbc7 100644
    --- a/lowlevel/NotAtomic.java
    +++ b/lowlevel/NotAtomic.java
    @@ -17,7 +17,7 @@ public class NotAtomic {
       public NotAtomic();
         Code:
            0: aload_0
    -       1: invokespecial #1   // Method
    +       1: invokespecial #1                  // Method
     java/lang/Object."":()V
            4: return
     
    @@ -25,20 +25,20 @@ public class NotAtomic {
         Code:
            0: aload_0
            1: dup
    -       2: getfield      #2   // Field i:I
    +       2: getfield      #2                  // Field i:I
            5: iconst_1
            6: iadd
    -       7: putfield      #2   // Field i:I
    +       7: putfield      #2                  // Field i:I
           10: return
     
       void f2();
         Code:
            0: aload_0
            1: dup
    -       2: getfield      #2   // Field i:I
    +       2: getfield      #2                  // Field i:I
            5: iconst_3
            6: iadd
    -       7: putfield      #2   // Field i:I
    +       7: putfield      #2                  // Field i:I
           10: return
     }
     */
    diff --git a/lowlevel/NumberOfProcessors.java b/lowlevel/NumberOfProcessors.java
    index 103d6c1d2..6039f30f7 100644
    --- a/lowlevel/NumberOfProcessors.java
    +++ b/lowlevel/NumberOfProcessors.java
    @@ -10,5 +10,5 @@ public static void main(String[] args) {
       }
     }
     /* Output:
    -8
    +4
     */
    diff --git a/lowlevel/PriorityBlockingQueueDemo.java b/lowlevel/PriorityBlockingQueueDemo.java
    index c006981b0..f50b13d04 100644
    --- a/lowlevel/PriorityBlockingQueueDemo.java
    +++ b/lowlevel/PriorityBlockingQueueDemo.java
    @@ -98,38 +98,38 @@ public static void main(String[] args) {
       }
     }
     /* Output:
    -[15] Prioritized 1
    -[17] Prioritized 0
    +[17] Prioritized 2
    +[18] Prioritized 26
     [17] Prioritized 5
     [16] Prioritized 6
    +[16] Prioritized 29
    +[15] Prioritized 1
    +[15] Prioritized 23
     [14] Prioritized 9
    -[12] Prioritized 2
    -[11] Prioritized 4
    -[11] Prioritized 12
    -[13] Prioritized 13
    -[12] Prioritized 16
     [14] Prioritized 18
    -[15] Prioritized 23
    -[18] Prioritized 26
    -[16] Prioritized 29
    +[13] Prioritized 13
     [12] Prioritized 17
    -[11] Prioritized 30
    +[12] Prioritized 0
    +[12] Prioritized 16
    +[11] Prioritized 12
     [11] Prioritized 24
    +[11] Prioritized 4
    +[11] Prioritized 30
     [10] Prioritized 15
     [10] Prioritized 22
    -[8] Prioritized 25
     [8] Prioritized 11
     [8] Prioritized 10
    +[8] Prioritized 25
     [6] Prioritized 31
     [3] Prioritized 7
     [2] Prioritized 20
     [1] Prioritized 3
    +[0] Prioritized 14
     [0] Prioritized 19
     [0] Prioritized 8
    -[0] Prioritized 14
     [0] Prioritized 21
     [-1] Prioritized 28
    -(0:17)(2:12)(1:15)(3:1)(4:11)
    +(1:15)(0:12)(2:17)(3:1)(4:11)
     (5:17)(6:16)(7:3)(8:0)(9:14)
     (10:8)(11:8)(12:11)(13:13)(14:0)
     (15:10)(16:12)(17:12)(18:14)(19:0)
    diff --git a/lowlevel/SerialNumberTest.java b/lowlevel/SerialNumberTest.java
    index d19b8f6ba..9ab2b8286 100644
    --- a/lowlevel/SerialNumberTest.java
    +++ b/lowlevel/SerialNumberTest.java
    @@ -9,5 +9,5 @@ public static void main(String[] args) {
       }
     }
     /* Output:
    -Duplicate: 4119
    +Duplicate: 4687
     */
    diff --git a/lowlevel/SynchronizedComparison.java b/lowlevel/SynchronizedComparison.java
    index f497e5184..42c7aecca 100644
    --- a/lowlevel/SynchronizedComparison.java
    +++ b/lowlevel/SynchronizedComparison.java
    @@ -78,12 +78,12 @@ public static void main(String[] args) {
     /* Output:
     -> 152
     -> 152
    --> 153
    --> 153
    -CriticalSection: 610
    --> 44
    --> 28
    --> 62
    +-> 152
    +-> 150
    +CriticalSection: 606
    +-> 72
     -> 24
    -SynchronizedMethod: 158
    +-> 70
    +-> 164
    +SynchronizedMethod: 330
     */
    diff --git a/lowlevel/TestAbort.java b/lowlevel/TestAbort.java
    index 2c38fc5c7..c5dc1069d 100644
    --- a/lowlevel/TestAbort.java
    +++ b/lowlevel/TestAbort.java
    @@ -13,5 +13,5 @@ public static void main(String[] args) {
     }
     /* Output:
     Napping for 4
    -TimedAbort 1
    +TimedAbort 1.0
     */
    diff --git a/lowlevel/UnsafeReturn.java b/lowlevel/UnsafeReturn.java
    index e8e9df3ce..bdd6f8919 100644
    --- a/lowlevel/UnsafeReturn.java
    +++ b/lowlevel/UnsafeReturn.java
    @@ -16,5 +16,5 @@ public static void main(String[] args) {
       }
     }
     /* Output:
    -failed with: 21
    +failed with: 3
     */
    diff --git a/lowlevel/WorkStealingPool.java b/lowlevel/WorkStealingPool.java
    index a24f3722f..43a034195 100644
    --- a/lowlevel/WorkStealingPool.java
    +++ b/lowlevel/WorkStealingPool.java
    @@ -27,15 +27,15 @@ public static void main(String[] args)
       }
     }
     /* Output:
    -8
    -ForkJoinPool-1-worker-1
    -ForkJoinPool-1-worker-2
    -ForkJoinPool-1-worker-1
    -ForkJoinPool-1-worker-1
    -ForkJoinPool-1-worker-4
    +4
     ForkJoinPool-1-worker-1
     ForkJoinPool-1-worker-3
    -ForkJoinPool-1-worker-5
    -ForkJoinPool-1-worker-4
     ForkJoinPool-1-worker-2
    +ForkJoinPool-1-worker-2
    +ForkJoinPool-1-worker-2
    +ForkJoinPool-1-worker-2
    +ForkJoinPool-1-worker-2
    +ForkJoinPool-1-worker-2
    +ForkJoinPool-1-worker-3
    +ForkJoinPool-1-worker-1
     */
    diff --git a/newio/AvailableCharSets.java b/newio/AvailableCharSets.java
    index 64c0e3a92..ac3f4b79c 100644
    --- a/newio/AvailableCharSets.java
    +++ b/newio/AvailableCharSets.java
    @@ -3,7 +3,7 @@
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Displays Charsets and aliases
    -// {ValidateByHand} // CI has trouble
    +// {ValidateByHand} CI has trouble
     import java.nio.charset.*;
     import java.util.*;
     
    diff --git a/newio/MappedIO.java b/newio/MappedIO.java
    index 6b146a219..16cd23717 100644
    --- a/newio/MappedIO.java
    +++ b/newio/MappedIO.java
    @@ -135,10 +135,10 @@ public static void main(String[] args) {
       }
     }
     /* Output:
    -Stream Write: 0.269
    +Stream Write: 0.285
     Mapped Write: 0.022
    -Stream Read: 0.262
    -Mapped Read: 0.010
    -Stream Read/Write: 1.620
    -Mapped Read/Write: 0.007
    +Stream Read: 0.311
    +Mapped Read: 0.009
    +Stream Read/Write: 1.368
    +Mapped Read/Write: 0.005
     */
    diff --git a/objects/ShowProperties.java b/objects/ShowProperties.java
    index 73f00f2e5..2f59ebdcc 100644
    --- a/objects/ShowProperties.java
    +++ b/objects/ShowProperties.java
    @@ -14,13 +14,13 @@ public static void main(String[] args) {
     /* Output: (First 20 Lines)
     -- listing properties --
     java.runtime.name=Java(TM) SE Runtime Environment
    -sun.boot.library.path=C:\Program Files
    -(x86)\Java\jdk1.8.0_...
    +sun.boot.library.path=C:\Program
    +Files\Java\jdk1.8.0_102\jr...
     java.vm.version=25.102-b14
     java.vm.vendor=Oracle Corporation
     java.vendor.url=http://java.oracle.com/
     path.separator=;
    -java.vm.name=Java HotSpot(TM) Client VM
    +java.vm.name=Java HotSpot(TM) 64-Bit Server VM
     file.encoding.pkg=sun.io
     user.script=
     user.country=US
    @@ -28,12 +28,11 @@ public static void main(String[] args) {
     sun.os.patch.level=
     java.vm.specification.name=Java Virtual Machine
     Specification
    -user.dir=C:\Users\Bruce\Documents\GitHub\on-ja...
    +user.dir=C:\Users\bruce\Documents\Git\on-java\...
     java.runtime.version=1.8.0_102-b14
     java.awt.graphicsenv=sun.awt.Win32GraphicsEnvironment
    -java.endorsed.dirs=C:\Program Files
    -(x86)\Java\jdk1.8.0_...
    -os.arch=x86
    -java.io.tmpdir=C:\Users\Bruce\AppData\Local\Temp\
    +java.endorsed.dirs=C:\Program Files\Java\jdk1.8.0_102\jr...
    +os.arch=amd64
    +java.io.tmpdir=C:\Users\bruce\AppData\Local\Temp\
                       ...
     */
    diff --git a/onjava/atunit/ClassNameFinder.java b/onjava/atunit/ClassNameFinder.java
    index 1444fa577..68ffac0ea 100644
    --- a/onjava/atunit/ClassNameFinder.java
    +++ b/onjava/atunit/ClassNameFinder.java
    @@ -113,63 +113,63 @@ public static String thisClass(byte[] classBytes) {
     onjava.CollectionMethodDifferences
     onjava.ConvertTo
     onjava.Count$Boolean
    -onjava.Count$Pboolean
     onjava.Count$Byte
    -onjava.Count$Pbyte
     onjava.Count$Character
    -onjava.Count$Pchar
     onjava.Count$Double
    -onjava.Count$Pdouble
     onjava.Count$Float
    -onjava.Count$Pfloat
     onjava.Count$Integer
    -onjava.Count$Pint
     onjava.Count$Long
    +onjava.Count$Pboolean
    +onjava.Count$Pbyte
    +onjava.Count$Pchar
    +onjava.Count$Pdouble
    +onjava.Count$Pfloat
    +onjava.Count$Pint
     onjava.Count$Plong
    -onjava.Count$Short
     onjava.Count$Pshort
    +onjava.Count$Short
     onjava.Count
     onjava.CountingIntegerList
     onjava.CountMap
     onjava.Countries
     onjava.Enums
     onjava.FillMap
    -onjava.Hex
    +onjava.HTMLColors
     onjava.MouseClick
    +onjava.Nap
     onjava.Null
    -onjava.Operation
    +onjava.Operations
     onjava.OSExecute
     onjava.OSExecuteException
     onjava.Pair
     onjava.ProcessFiles$Strategy
     onjava.ProcessFiles
     onjava.Rand$Boolean
    -onjava.Rand$Pboolean
     onjava.Rand$Byte
    -onjava.Rand$Pbyte
     onjava.Rand$Character
    -onjava.Rand$Pchar
     onjava.Rand$Double
    -onjava.Rand$Pdouble
     onjava.Rand$Float
    -onjava.Rand$Pfloat
     onjava.Rand$Integer
    -onjava.Rand$Pint
     onjava.Rand$Long
    +onjava.Rand$Pboolean
    +onjava.Rand$Pbyte
    +onjava.Rand$Pchar
    +onjava.Rand$Pdouble
    +onjava.Rand$Pfloat
    +onjava.Rand$Pint
     onjava.Rand$Plong
    -onjava.Rand$Short
     onjava.Rand$Pshort
    +onjava.Rand$Short
     onjava.Rand$String
     onjava.Rand
     onjava.Range
     onjava.Repeat
     onjava.RmDir
     onjava.Sets
    -onjava.Sleep
     onjava.Stack
     onjava.Suppliers
     onjava.TimedAbort
    -onjava.TimeIt
    +onjava.Timer
     onjava.Tuple
     onjava.Tuple2
     onjava.Tuple3
    diff --git a/operators/Equivalence.java b/operators/Equivalence.java
    index 26a894908..268a75be8 100644
    --- a/operators/Equivalence.java
    +++ b/operators/Equivalence.java
    @@ -12,6 +12,6 @@ public static void main(String[] args) {
       }
     }
     /* Output:
    -false
     true
    +false
     */
    diff --git a/operators/URShift.java b/operators/URShift.java
    index 1ea173921..95350a57e 100644
    --- a/operators/URShift.java
    +++ b/operators/URShift.java
    @@ -30,7 +30,7 @@ public static void main(String[] args) {
     /* Output:
     11111111111111111111111111111111
     1111111111111111111111
    -111111111111111111111111111111111111111111111111111111111
    +11111111111111111111111111111111111111111111111111111111111
     11111
     111111111111111111111111111111111111111111111111111111
     11111111111111111111111111111111
    diff --git a/patterns/BoxObserver.java b/patterns/BoxObserver.java
    index b19a448c0..0bcf2bf91 100644
    --- a/patterns/BoxObserver.java
    +++ b/patterns/BoxObserver.java
    @@ -4,7 +4,7 @@
     // Visit http://OnJava8.com for more book information.
     // Demonstration of Observer pattern using
     // Java's built-in observer classes
    -// {ValidateByHand} // CI servers have problems
    +// {ValidateByHand} CI servers have problems
     import javax.swing.*;
     import java.awt.*;
     import java.awt.event.*;
    diff --git a/preferences/PreferencesDemo.java b/preferences/PreferencesDemo.java
    index e6d40260c..597ed06ff 100644
    --- a/preferences/PreferencesDemo.java
    +++ b/preferences/PreferencesDemo.java
    @@ -30,10 +30,10 @@ public class PreferencesDemo {
     Footwear: Ruby Slippers
     Companions: 4
     Are there witches?: true
    -UsageCount: 191
    +UsageCount: 58
     How many companions does Dorothy have? 4
     ___[ Error Output ]___
    -Jul 27, 2016 10:50:50 AM java.util.prefs.WindowsPreferences
    +May 02, 2017 3:23:40 PM java.util.prefs.WindowsPreferences
     
     WARNING: Could not open/create prefs root node
     Software\JavaSoft\Prefs at root 0x80000002. Windows
    diff --git a/references/Compete.java b/references/Compete.java
    index 0b0d77f40..34bf4594b 100644
    --- a/references/Compete.java
    +++ b/references/Compete.java
    @@ -84,6 +84,6 @@ public class Compete {
       }
     }
     /* Output:
    -Duplication via serialization: 776 Milliseconds
    -Duplication via cloning: 122 Milliseconds
    +Duplication via serialization: 305 Milliseconds
    +Duplication via cloning: 13 Milliseconds
     */
    diff --git a/references/CopyConstructor.java b/references/CopyConstructor.java
    index 6627cf423..46e1ee212 100644
    --- a/references/CopyConstructor.java
    +++ b/references/CopyConstructor.java
    @@ -177,10 +177,12 @@ public static void main(String[] args) {
     /* Output:
     In ripen, t is a Tomato
     In slice, f is a Fruit
    -In ripen2, t is a Tomato
    -In slice2, f is a Tomato
    +java.lang.NoSuchMethodException: Tomato.(Tomato)
    +java.lang.NoSuchMethodException: Tomato.(Tomato)
     In ripen, t is a Tomato
     In slice, f is a Fruit
    -In ripen2, t is a GreenZebra
    -In slice2, f is a GreenZebra
    +java.lang.NoSuchMethodException:
    +GreenZebra.(GreenZebra)
    +java.lang.NoSuchMethodException:
    +GreenZebra.(GreenZebra)
     */
    diff --git a/references/PassReferences.java b/references/PassReferences.java
    index d42f4a21e..effa9ca69 100644
    --- a/references/PassReferences.java
    +++ b/references/PassReferences.java
    @@ -14,6 +14,6 @@ public static void main(String[] args) {
       }
     }
     /* Output:
    -p inside main(): PassReferences@1db9742
    -h inside f(): PassReferences@1db9742
    +p inside main(): PassReferences@15db9742
    +h inside f(): PassReferences@15db9742
     */
    diff --git a/serialization/Logon.java b/serialization/Logon.java
    index eafa30d69..32d49576e 100644
    --- a/serialization/Logon.java
    +++ b/serialization/Logon.java
    @@ -52,11 +52,11 @@ public static void main(String[] args) {
     /* Output:
     logon a = logon info:
        username: Hulk
    -   date: Sat Jan 21 22:06:35 PST 2017
    +   date: Tue May 02 15:23:47 MDT 2017
        password: myLittlePony
    -Recovering object at Sat Jan 21 22:06:36 PST 2017
    +Recovering object at Tue May 02 15:23:48 MDT 2017
     logon a = logon info:
        username: Hulk
    -   date: Sat Jan 21 22:06:35 PST 2017
    +   date: Tue May 02 15:23:47 MDT 2017
        password: null
     */
    diff --git a/serialization/MyWorld.java b/serialization/MyWorld.java
    index de5cad4ec..1bff977a1 100644
    --- a/serialization/MyWorld.java
    +++ b/serialization/MyWorld.java
    @@ -77,20 +77,20 @@ public static void main(String[] args) {
       }
     }
     /* Output:
    -animals: [Bosco the dog[Animal@1db9742], House@106d69c
    -, Ralph the hamster[Animal@52e922], House@106d69c
    -, Molly the cat[Animal@25154f], House@106d69c
    +animals: [Bosco the dog[Animal@15db9742], House@6d06d69c
    +, Ralph the hamster[Animal@7852e922], House@6d06d69c
    +, Molly the cat[Animal@4e25154f], House@6d06d69c
     ]
    -animals1: [Bosco the dog[Animal@1a4f24f], House@19a45b3
    -, Ralph the hamster[Animal@99a589], House@19a45b3
    -, Molly the cat[Animal@372a00], House@19a45b3
    +animals1: [Bosco the dog[Animal@7ba4f24f], House@3b9a45b3
    +, Ralph the hamster[Animal@7699a589], House@3b9a45b3
    +, Molly the cat[Animal@58372a00], House@3b9a45b3
     ]
    -animals2: [Bosco the dog[Animal@1a4f24f], House@19a45b3
    -, Ralph the hamster[Animal@99a589], House@19a45b3
    -, Molly the cat[Animal@372a00], House@19a45b3
    +animals2: [Bosco the dog[Animal@7ba4f24f], House@3b9a45b3
    +, Ralph the hamster[Animal@7699a589], House@3b9a45b3
    +, Molly the cat[Animal@58372a00], House@3b9a45b3
     ]
    -animals3: [Bosco the dog[Animal@dd8dc3], House@103e736
    -, Ralph the hamster[Animal@8db2f2], House@103e736
    -, Molly the cat[Animal@18bf509], House@103e736
    +animals3: [Bosco the dog[Animal@4dd8dc3], House@6d03e736
    +, Ralph the hamster[Animal@568db2f2], House@6d03e736
    +, Molly the cat[Animal@378bf509], House@6d03e736
     ]
     */
    diff --git a/serialization/Worm.java b/serialization/Worm.java
    index 4ed3570e2..261988863 100644
    --- a/serialization/Worm.java
    +++ b/serialization/Worm.java
    @@ -94,9 +94,9 @@ public String toString() {
     Worm constructor: 3
     Worm constructor: 2
     Worm constructor: 1
    -w = :a(571):b(079):c(688):d(307):e(052):f(402)
    +w = :a(853):b(119):c(802):d(788):e(199):f(881)
     Worm storage
    -w2 = :a(571):b(079):c(688):d(307):e(052):f(402)
    +w2 = :a(853):b(119):c(802):d(788):e(199):f(881)
     Worm storage
    -w3 = :a(571):b(079):c(688):d(307):e(052):f(402)
    +w3 = :a(853):b(119):c(802):d(788):e(199):f(881)
     */
    diff --git a/streams/ForEach.java b/streams/ForEach.java
    index 6258b8e72..807bab60f 100644
    --- a/streams/ForEach.java
    +++ b/streams/ForEach.java
    @@ -23,6 +23,6 @@ public static void main(String[] args) {
     }
     /* Output:
     258 555 693 861 961 429 868 200 522 207 288 128 551 589
    -551 589 200 861 522 429 868 961 288 555 128 693 207 258
    +551 589 861 555 200 693 429 258 288 522 207 128 868 961
     258 555 693 861 961 429 868 200 522 207 288 128 551 589
     */
    diff --git a/streams/SelectElement.java b/streams/SelectElement.java
    index 83a9f5e61..d4aff8c6a 100644
    --- a/streams/SelectElement.java
    +++ b/streams/SelectElement.java
    @@ -20,5 +20,5 @@ public static void main(String[] args) {
     258
     258
     258
    -242
    +8
     */
    diff --git a/strings/Conversion.java b/strings/Conversion.java
    index 9009d9b81..3b4f723b8 100644
    --- a/strings/Conversion.java
    +++ b/strings/Conversion.java
    @@ -104,8 +104,8 @@ public static void main(String[] args) {
     h: 1ef462c
     y = new Conversion()
     b: true
    -s: Conversion@1db9742
    -h: 1db9742
    +s: Conversion@15db9742
    +h: 15db9742
     z = false
     b: false
     s: false
    diff --git a/typeinfo/PetCount3.java b/typeinfo/PetCount3.java
    index 9977f9c07..cbce8a242 100644
    --- a/typeinfo/PetCount3.java
    +++ b/typeinfo/PetCount3.java
    @@ -48,6 +48,6 @@ public static void main(String[] args) {
     Rat Manx Cymric Mutt Pug Cymric Pug Manx Cymric Rat
     EgyptianMau Hamster EgyptianMau Mutt Mutt Cymric Mouse Pug
     Mouse Cymric
    -{Hamster=1, Rodent=5, Mouse=2, Dog=6, Cymric=5, Manx=7,
    -Rat=2, Pug=3, Mutt=3, Pet=20, EgyptianMau=2, Cat=9}
    +{Hamster=1, Manx=7, EgyptianMau=2, Mutt=3, Rodent=5,
    +Mouse=2, Cymric=5, Pug=3, Dog=6, Rat=2, Pet=20, Cat=9}
     */
    diff --git a/typeinfo/PetCount4.java b/typeinfo/PetCount4.java
    index 803f1c373..d5c5aa4a0 100644
    --- a/typeinfo/PetCount4.java
    +++ b/typeinfo/PetCount4.java
    @@ -20,6 +20,6 @@ public static void main(String[] args) {
     Rat Manx Cymric Mutt Pug Cymric Pug Manx Cymric Rat
     EgyptianMau Hamster EgyptianMau Mutt Mutt Cymric Mouse Pug
     Mouse Cymric
    -{EgyptianMau=2, Hamster=1, Pug=3, Manx=7, Cymric=5, Dog=6,
    -Pet=20, Mutt=3, Rat=2, Mouse=2, Rodent=5, Cat=9}
    +{EgyptianMau=2, Cymric=5, Mutt=3, Cat=9, Rat=2, Pet=20,
    +Manx=7, Hamster=1, Pug=3, Rodent=5, Dog=6, Mouse=2}
     */
    diff --git a/typeinfo/SimpleDynamicProxy.java b/typeinfo/SimpleDynamicProxy.java
    index 50857ccb2..2b0ab4e13 100644
    --- a/typeinfo/SimpleDynamicProxy.java
    +++ b/typeinfo/SimpleDynamicProxy.java
    @@ -46,7 +46,7 @@ public static void main(String[] args) {
     doSomething
     **** proxy: class $Proxy0, method: public abstract void
     Interface.somethingElse(java.lang.String), args:
    -[Ljava.lang.Object;@1c7c054
    +[Ljava.lang.Object;@6bc7c054
       bonobo
     somethingElse bonobo
     */
    diff --git a/update_extracted_example_output.py b/update_extracted_example_output.py
    deleted file mode 100644
    index 3e21c2830..000000000
    --- a/update_extracted_example_output.py
    +++ /dev/null
    @@ -1,35 +0,0 @@
    -#! py -3
    -# Requires Python 3.5
    -# Updates generated output into extracted Java programs in "On Java 8"
    -from pathlib import Path
    -import pprint
    -import sys
    -
    -def remove_output(javatext):
    -    result = ""
    -    for line in javatext.splitlines():
    -        if "/* Output:" not in line:
    -            result += line.rstrip() + "\n"
    -        else:
    -            return result
    -
    -def update_file(outfile):
    -        print(str(outfile))
    -        javafile = outfile.with_suffix(".java")
    -        if not javafile.exists():
    -            print(str(outfile) + " has no javafile")
    -            sys.exit(1)
    -        javatext = javafile.read_text()
    -        if "/* Output:" not in javatext:
    -            print(str(javafile) + " has no /* Output:")
    -            sys.exit(1)
    -        new_output = outfile.read_text()
    -        new_javatext = remove_output(javatext) + new_output
    -        javafile.write_text(new_javatext)
    -
    -if __name__ == '__main__':
    -    if len(sys.argv) > 1:
    -        update_file(Path(sys.argv[1]))
    -    else:
    -        for outfile in Path(".").rglob("*.p1"):
    -            update_file(outfile)
    diff --git a/validating/BadMicroBenchmark2.java b/validating/BadMicroBenchmark2.java
    index 0318edf60..74b712f47 100644
    --- a/validating/BadMicroBenchmark2.java
    +++ b/validating/BadMicroBenchmark2.java
    @@ -28,8 +28,8 @@ public static void main(String[] args) {
       }
     }
     /* Output:
    -parallelSetAll: 1360
    -setAll: 125
    -parallelSetAll: 75
    -setAll: 17
    +parallelSetAll: 776
    +setAll: 120
    +parallelSetAll: 72
    +setAll: 15
     */
    diff --git a/validating/GuavaPreconditions.java b/validating/GuavaPreconditions.java
    index fe06c574f..622f3908b 100644
    --- a/validating/GuavaPreconditions.java
    +++ b/validating/GuavaPreconditions.java
    @@ -93,18 +93,17 @@ public static void main(String[] args) {
     null
     NullPointerException
     Robert
    -IndexOutOfBoundsException: index (6) must be less
    -than size (6)
    +IndexOutOfBoundsException: index (6) must be less than size
    +(6)
     Bob
    -IndexOutOfBoundsException: index (6) must be less
    -than size (3)
    +IndexOutOfBoundsException: index (6) must be less than size
    +(3)
     null
     NullPointerException
     Robert
     Success
     Bob
    -IndexOutOfBoundsException: index (6)
    -must not be greater
    +IndexOutOfBoundsException: index (6) must not be greater
     than size (3)
     null
     NullPointerException
    @@ -113,15 +112,14 @@ than size (3)
     Hieronymus
     Success
     Hieronymus
    -IndexOutOfBoundsException: end index (11)
    -must not be greater
    -than size (10)
    +IndexOutOfBoundsException: end index (11) must not be
    +greater than size (10)
     Hieronymus
    -IndexOutOfBoundsException: start index (-1)
    -must not be negative
    +IndexOutOfBoundsException: start index (-1) must not be
    +negative
     Hieronymus
    -IndexOutOfBoundsException: end index (6)
    -must not be less than start index (7)
    +IndexOutOfBoundsException: end index (6) must not be less
    +than start index (7)
     null
     NullPointerException
     */
    diff --git a/validating/SLF4JLevels.java b/validating/SLF4JLevels.java
    index 19214175e..3e36c9619 100644
    --- a/validating/SLF4JLevels.java
    +++ b/validating/SLF4JLevels.java
    @@ -16,14 +16,14 @@ public static void main(String[] args) {
       }
     }
     /* Output:
    -2016-08-22T14:33:01.951
    +2017-05-02T15:24:11.555
     [main] TRACE SLF4JLevels - Hello
    -2016-08-22T14:33:01.954
    +2017-05-02T15:24:11.555
     [main] DEBUG SLF4JLevels - Logging
    -2016-08-22T14:33:01.954
    +2017-05-02T15:24:11.555
     [main] INFO  SLF4JLevels - Using
    -2016-08-22T14:33:01.955
    +2017-05-02T15:24:11.555
     [main] WARN  SLF4JLevels - the SLF4J
    -2016-08-22T14:33:01.955
    +2017-05-02T15:24:11.555
     [main] ERROR SLF4JLevels - Facade
     */
    diff --git a/validating/SLF4JLogging.java b/validating/SLF4JLogging.java
    index fc39e0ede..18f285289 100644
    --- a/validating/SLF4JLogging.java
    +++ b/validating/SLF4JLogging.java
    @@ -12,6 +12,6 @@ public static void main(String[] args) {
       }
     }
     /* Output:
    -2016-08-22T14:42:44.177
    +2017-05-02T15:24:11.861
     [main] INFO  SLF4JLogging - hello logging
     */
    diff --git a/validating/SimpleDebugging.java b/validating/SimpleDebugging.java
    index 476dcb9d8..7dd9a1eb1 100644
    --- a/validating/SimpleDebugging.java
    +++ b/validating/SimpleDebugging.java
    @@ -30,8 +30,8 @@ public static void main(String[] args) {
     ___[ Error Output ]___
     Exception in thread "main" java.lang.ArithmeticException: /
     by zero
    -        at SimpleDebugging.foo3(SimpleDebugging.java:16)
    -        at SimpleDebugging.foo2(SimpleDebugging.java:10)
    -        at SimpleDebugging.foo1(SimpleDebugging.java:6)
    -        at SimpleDebugging.main(SimpleDebugging.java:19)
    +        at SimpleDebugging.foo3(SimpleDebugging.java:17)
    +        at SimpleDebugging.foo2(SimpleDebugging.java:11)
    +        at SimpleDebugging.foo1(SimpleDebugging.java:7)
    +        at SimpleDebugging.main(SimpleDebugging.java:20)
     */
    
    From 73f7ebe085b2320c1d39f23f5507313bfe47062e Mon Sep 17 00:00:00 2001
    From: Bruce Eckel 
    Date: Wed, 3 May 2017 12:25:17 -0600
    Subject: [PATCH 242/320] Added Continuous Integration Detection
    
    ---
     .../main/groovy/com/mindviewinc/plugins/TaggingPlugin.groovy  | 4 ++++
     1 file changed, 4 insertions(+)
    
    diff --git a/buildSrc/src/main/groovy/com/mindviewinc/plugins/TaggingPlugin.groovy b/buildSrc/src/main/groovy/com/mindviewinc/plugins/TaggingPlugin.groovy
    index 9e05de155..f0f0861b9 100644
    --- a/buildSrc/src/main/groovy/com/mindviewinc/plugins/TaggingPlugin.groovy
    +++ b/buildSrc/src/main/groovy/com/mindviewinc/plugins/TaggingPlugin.groovy
    @@ -13,6 +13,10 @@ class TaggingPlugin implements Plugin {
         void apply(Project project) {
             boolean debug = project.hasProperty(DEBUG_PROJECT_PROPERTY_KEY) ? Boolean.valueOf(project.getProperty(DEBUG_PROJECT_PROPERTY_KEY)) : false
             List createdTasks = []
    +        boolean runningInCI = System.getenv('CI')
    +        boolean runningInTravis = System.getenv('TRAVIS')
    +        boolean runningInAppveyor = System.getenv('APPVEYOR')
    +        // println "runningInCI: " + runningInCI
     
             project.projectDir.eachFileRecurse { file ->
                 if (file.name.endsWith('.java')) {
    
    From 65edbb34be3d7e16bdad5bf4112c6231cc02137a Mon Sep 17 00:00:00 2001
    From: Bruce Eckel 
    Date: Wed, 3 May 2017 16:02:28 -0600
    Subject: [PATCH 243/320] See if this fixes the Appveyor problem
    
    ---
     lowlevel/AtomicEvenProducer.java  | 1 +
     lowlevel/AtomicIntegerTest.java   | 1 +
     lowlevel/AtomicSerialNumbers.java | 1 +
     3 files changed, 3 insertions(+)
    
    diff --git a/lowlevel/AtomicEvenProducer.java b/lowlevel/AtomicEvenProducer.java
    index a965e0011..312860a4d 100644
    --- a/lowlevel/AtomicEvenProducer.java
    +++ b/lowlevel/AtomicEvenProducer.java
    @@ -3,6 +3,7 @@
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Atomic classes are occasionally useful in regular code
    +// {ValidateByHand} AppVeyor CI has trouble
     import java.util.concurrent.atomic.*;
     
     public class AtomicEvenProducer extends IntGenerator {
    diff --git a/lowlevel/AtomicIntegerTest.java b/lowlevel/AtomicIntegerTest.java
    index 31c6a106c..7b5e4ce53 100644
    --- a/lowlevel/AtomicIntegerTest.java
    +++ b/lowlevel/AtomicIntegerTest.java
    @@ -2,6 +2,7 @@
     // (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
    +// {ValidateByHand} AppVeyor CI has trouble
     import java.util.concurrent.*;
     import java.util.concurrent.atomic.*;
     import java.util.*;
    diff --git a/lowlevel/AtomicSerialNumbers.java b/lowlevel/AtomicSerialNumbers.java
    index 53547bccb..598886e96 100644
    --- a/lowlevel/AtomicSerialNumbers.java
    +++ b/lowlevel/AtomicSerialNumbers.java
    @@ -2,6 +2,7 @@
     // (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
    +// {ValidateByHand} AppVeyor CI has trouble
     import java.util.concurrent.atomic.*;
     
     public class
    
    From c4a780bc938acd6690ffa11ae2f1e5e4ba5be2dc Mon Sep 17 00:00:00 2001
    From: Bruce Eckel 
    Date: Wed, 3 May 2017 16:15:10 -0600
    Subject: [PATCH 244/320] Chasing Appveyor issue
    
    ---
     lowlevel/SynchronizedComparison.java | 1 +
     1 file changed, 1 insertion(+)
    
    diff --git a/lowlevel/SynchronizedComparison.java b/lowlevel/SynchronizedComparison.java
    index 42c7aecca..0d3543feb 100644
    --- a/lowlevel/SynchronizedComparison.java
    +++ b/lowlevel/SynchronizedComparison.java
    @@ -4,6 +4,7 @@
     // Visit http://OnJava8.com for more book information.
     // Synchronizing blocks instead of entire methods
     // speeds up access.
    +// {ValidateByHand} AppVeyor CI has trouble
     import java.util.*;
     import java.util.stream.*;
     import java.util.concurrent.*;
    
    From 3f2cbf7a2347eb84b6176aef8e8df126d6849d83 Mon Sep 17 00:00:00 2001
    From: Bruce Eckel 
    Date: Wed, 3 May 2017 16:45:17 -0600
    Subject: [PATCH 245/320] Added "exclude from CI" support
    
    ---
     .../main/groovy/com/mindviewinc/plugins/Tags.groovy  | 12 ++++++++++++
     1 file changed, 12 insertions(+)
    
    diff --git a/buildSrc/src/main/groovy/com/mindviewinc/plugins/Tags.groovy b/buildSrc/src/main/groovy/com/mindviewinc/plugins/Tags.groovy
    index f2405c1c6..373985315 100644
    --- a/buildSrc/src/main/groovy/com/mindviewinc/plugins/Tags.groovy
    +++ b/buildSrc/src/main/groovy/com/mindviewinc/plugins/Tags.groovy
    @@ -3,6 +3,9 @@ package com.mindviewinc.plugins
     class Tags {
         Boolean hasMainMethod = false
         Boolean willNotCompile = false
    +    Boolean excludeFromTravisCI = false
    +    Boolean excludeFromAppveyorCI = false
    +    Boolean excludeFromCI = false
         Boolean throwsException = false
         Boolean errorOutputExpected = false
         Boolean validateByHand = false
    @@ -34,6 +37,9 @@ class Tags {
                             args << p
             }
             willNotCompile = hasTag('WillNotCompile')
    +        excludeFromTravisCI = hasTag('ExcludeFromTravisCI')
    +        excludeFromAppveyorCI = hasTag('ExcludeFromAppveyorCI')
    +        excludeFromCI = hasTag('ExcludeFromCI')
             throwsException = hasTag('ThrowsException')
             errorOutputExpected = hasTag('ErrorOutputExpected')
             validateByHand = hasTag('ValidateByHand')
    @@ -69,6 +75,9 @@ class Tags {
         }
         public boolean hasTags() {
             return willNotCompile ||
    +        excludeFromTravisCI ||
    +        excludeFromAppveyorCI ||
    +        excludeFromCI ||
             throwsException ||
             errorOutputExpected ||
             validateByHand ||
    @@ -88,6 +97,9 @@ class Tags {
             """
             hasMainMethod
             willNotCompile
    +        excludeFromTravisCI
    +        excludeFromAppveyorCI
    +        excludeFromCI
             throwsException
             errorOutputExpected
             validateByHand
    
    From 80022e09bd868e2c3c7885c0f493dbfb47f9713b Mon Sep 17 00:00:00 2001
    From: Bruce Eckel 
    Date: Thu, 4 May 2017 04:49:09 -0600
    Subject: [PATCH 246/320] Exclude lowlevel appendix from Appveyor
    
    ---
     .../main/groovy/com/mindviewinc/plugins/TaggingPlugin.groovy    | 2 +-
     buildSrc/src/main/groovy/com/mindviewinc/plugins/Tags.groovy    | 2 ++
     2 files changed, 3 insertions(+), 1 deletion(-)
    
    diff --git a/buildSrc/src/main/groovy/com/mindviewinc/plugins/TaggingPlugin.groovy b/buildSrc/src/main/groovy/com/mindviewinc/plugins/TaggingPlugin.groovy
    index f0f0861b9..e975ca065 100644
    --- a/buildSrc/src/main/groovy/com/mindviewinc/plugins/TaggingPlugin.groovy
    +++ b/buildSrc/src/main/groovy/com/mindviewinc/plugins/TaggingPlugin.groovy
    @@ -25,7 +25,7 @@ class TaggingPlugin implements Plugin {
                     if(debug && tags.hasTags()) println tags
     
                     // Exclude java sources that will not compile
    -                if (tags.willNotCompile) {
    +                if (tags.willNotCompile || (tags.lowLevelAppendix && runningInAppveyor)) {
                         project.sourceSets.main.java.excludes.add(file.name)
                     } else {
                         JavaExec javaTask = null
    diff --git a/buildSrc/src/main/groovy/com/mindviewinc/plugins/Tags.groovy b/buildSrc/src/main/groovy/com/mindviewinc/plugins/Tags.groovy
    index 373985315..ed909a87c 100644
    --- a/buildSrc/src/main/groovy/com/mindviewinc/plugins/Tags.groovy
    +++ b/buildSrc/src/main/groovy/com/mindviewinc/plugins/Tags.groovy
    @@ -6,6 +6,7 @@ class Tags {
         Boolean excludeFromTravisCI = false
         Boolean excludeFromAppveyorCI = false
         Boolean excludeFromCI = false
    +    Boolean lowLevelAppendix = false
         Boolean throwsException = false
         Boolean errorOutputExpected = false
         Boolean validateByHand = false
    @@ -40,6 +41,7 @@ class Tags {
             excludeFromTravisCI = hasTag('ExcludeFromTravisCI')
             excludeFromAppveyorCI = hasTag('ExcludeFromAppveyorCI')
             excludeFromCI = hasTag('ExcludeFromCI')
    +        lowLevelAppendix = firstLine.contains("// lowlevel/")
             throwsException = hasTag('ThrowsException')
             errorOutputExpected = hasTag('ErrorOutputExpected')
             validateByHand = hasTag('ValidateByHand')
    
    From af43fbb91ac7f9b225325fa3850e1e820405f3df Mon Sep 17 00:00:00 2001
    From: Bruce Eckel 
    Date: Thu, 4 May 2017 10:09:51 -0600
    Subject: [PATCH 247/320] lowlevel is now excluded from Appveyor
    
    ---
     collections/MapOfList.java            | 8 ++++----
     equalshashcode/IndividualTest.java    | 2 +-
     lowlevel/AtomicEvenProducer.java      | 1 -
     lowlevel/AtomicIntegerTest.java       | 1 -
     lowlevel/AtomicSerialNumbers.java     | 1 -
     lowlevel/AttemptLocking.java          | 1 -
     lowlevel/SynchronizedComparison.java  | 1 -
     _verify_output.py => verify_output.py | 0
     8 files changed, 5 insertions(+), 10 deletions(-)
     rename _verify_output.py => verify_output.py (100%)
    
    diff --git a/collections/MapOfList.java b/collections/MapOfList.java
    index 26135f8d8..9c5d706e1 100644
    --- a/collections/MapOfList.java
    +++ b/collections/MapOfList.java
    @@ -21,7 +21,7 @@ public class MapOfList {
         petPeople.put(new Person("Marilyn"),
           Arrays.asList(
             new Pug("Louie aka Louis Snorkelstein Dupree"),
    -        new Cat("Stanford aka Stinky el Negro"),
    +        new Cat("Stanford"),
             new Cat("Pinkola")));
         petPeople.put(new Person("Luke"),
           Arrays.asList(new Rat("Fuzzy"), new Rat("Fizzy")));
    @@ -43,8 +43,8 @@ public static void main(String[] args) {
     Marilyn, Person Luke]
     Pets: [[Cymric Molly, Mutt Spot], [Cat Shackleton, Cat
     Elsie May, Dog Margrett], [Rat Freckly], [Pug Louie aka
    -Louis Snorkelstein Dupree, Cat Stanford aka Stinky el
    -Negro, Cat Pinkola], [Rat Fuzzy, Rat Fizzy]]
    +Louis Snorkelstein Dupree, Cat Stanford, Cat Pinkola],
    +[Rat Fuzzy, Rat Fizzy]]
     Person Dawn has:
         Cymric Molly
         Mutt Spot
    @@ -56,7 +56,7 @@ public static void main(String[] args) {
         Rat Freckly
     Person Marilyn has:
         Pug Louie aka Louis Snorkelstein Dupree
    -    Cat Stanford aka Stinky el Negro
    +    Cat Stanford
         Cat Pinkola
     Person Luke has:
         Rat Fuzzy
    diff --git a/equalshashcode/IndividualTest.java b/equalshashcode/IndividualTest.java
    index fc4334150..9a6e8112e 100644
    --- a/equalshashcode/IndividualTest.java
    +++ b/equalshashcode/IndividualTest.java
    @@ -20,7 +20,7 @@ public static void main(String[] args) {
     Cat Elsie May
     Cat Pinkola
     Cat Shackleton
    -Cat Stanford aka Stinky el Negro
    +Cat Stanford
     Cymric Molly
     Dog Margrett
     Mutt Spot
    diff --git a/lowlevel/AtomicEvenProducer.java b/lowlevel/AtomicEvenProducer.java
    index 312860a4d..a965e0011 100644
    --- a/lowlevel/AtomicEvenProducer.java
    +++ b/lowlevel/AtomicEvenProducer.java
    @@ -3,7 +3,6 @@
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Atomic classes are occasionally useful in regular code
    -// {ValidateByHand} AppVeyor CI has trouble
     import java.util.concurrent.atomic.*;
     
     public class AtomicEvenProducer extends IntGenerator {
    diff --git a/lowlevel/AtomicIntegerTest.java b/lowlevel/AtomicIntegerTest.java
    index 7b5e4ce53..31c6a106c 100644
    --- a/lowlevel/AtomicIntegerTest.java
    +++ b/lowlevel/AtomicIntegerTest.java
    @@ -2,7 +2,6 @@
     // (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
    -// {ValidateByHand} AppVeyor CI has trouble
     import java.util.concurrent.*;
     import java.util.concurrent.atomic.*;
     import java.util.*;
    diff --git a/lowlevel/AtomicSerialNumbers.java b/lowlevel/AtomicSerialNumbers.java
    index 598886e96..53547bccb 100644
    --- a/lowlevel/AtomicSerialNumbers.java
    +++ b/lowlevel/AtomicSerialNumbers.java
    @@ -2,7 +2,6 @@
     // (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
    -// {ValidateByHand} AppVeyor CI has trouble
     import java.util.concurrent.atomic.*;
     
     public class
    diff --git a/lowlevel/AttemptLocking.java b/lowlevel/AttemptLocking.java
    index ad0ded790..969143e6c 100644
    --- a/lowlevel/AttemptLocking.java
    +++ b/lowlevel/AttemptLocking.java
    @@ -4,7 +4,6 @@
     // Visit http://OnJava8.com for more book information.
     // Locks in the concurrent library allow you
     // to give up on trying to acquire a lock
    -// {ValidateByHand} AppVeyor CI has trouble
     import java.util.concurrent.*;
     import java.util.concurrent.locks.*;
     import onjava.Nap;
    diff --git a/lowlevel/SynchronizedComparison.java b/lowlevel/SynchronizedComparison.java
    index 0d3543feb..42c7aecca 100644
    --- a/lowlevel/SynchronizedComparison.java
    +++ b/lowlevel/SynchronizedComparison.java
    @@ -4,7 +4,6 @@
     // Visit http://OnJava8.com for more book information.
     // Synchronizing blocks instead of entire methods
     // speeds up access.
    -// {ValidateByHand} AppVeyor CI has trouble
     import java.util.*;
     import java.util.stream.*;
     import java.util.concurrent.*;
    diff --git a/_verify_output.py b/verify_output.py
    similarity index 100%
    rename from _verify_output.py
    rename to verify_output.py
    
    From ec7fed43edf462efc5de4609238978c2eec9e286 Mon Sep 17 00:00:00 2001
    From: Bruce Eckel 
    Date: Thu, 4 May 2017 10:25:43 -0600
    Subject: [PATCH 248/320] Remove {ValidateByHand} to test on Travis CI
    
    ---
     lowlevel/EvenProducer.java           | 1 -
     lowlevel/ExceptionThread.java        | 1 -
     lowlevel/NaiveExceptionHandling.java | 1 -
     3 files changed, 3 deletions(-)
    
    diff --git a/lowlevel/EvenProducer.java b/lowlevel/EvenProducer.java
    index 6b665fde1..5723685b2 100644
    --- a/lowlevel/EvenProducer.java
    +++ b/lowlevel/EvenProducer.java
    @@ -3,7 +3,6 @@
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // When threads collide
    -// {ValidateByHand}
     
     public class EvenProducer extends IntGenerator {
       private int currentEvenValue = 0;
    diff --git a/lowlevel/ExceptionThread.java b/lowlevel/ExceptionThread.java
    index c9f7f82a4..6664c454c 100644
    --- a/lowlevel/ExceptionThread.java
    +++ b/lowlevel/ExceptionThread.java
    @@ -2,7 +2,6 @@
     // (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
    -// {ValidateByHand}
     // {ThrowsException}
     import java.util.concurrent.*;
     
    diff --git a/lowlevel/NaiveExceptionHandling.java b/lowlevel/NaiveExceptionHandling.java
    index 0a1f9d1d7..a765bcf91 100644
    --- a/lowlevel/NaiveExceptionHandling.java
    +++ b/lowlevel/NaiveExceptionHandling.java
    @@ -2,7 +2,6 @@
     // (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
    -// {ValidateByHand}
     // {ThrowsException}
     import java.util.concurrent.*;
     
    
    From b5eed1881aa404a1dea5517a6a54a695b92619de Mon Sep 17 00:00:00 2001
    From: Bruce Eckel 
    Date: Fri, 5 May 2017 11:58:57 -0600
    Subject: [PATCH 249/320] Ignore config.py
    
    ---
     .gitignore | 1 +
     1 file changed, 1 insertion(+)
    
    diff --git a/.gitignore b/.gitignore
    index b656fe80d..48292956e 100644
    --- a/.gitignore
    +++ b/.gitignore
    @@ -108,3 +108,4 @@ buildSrc/
     /threads/PSP2.txt
     /threads/primes.txt
     _*
    +config.py
    
    From 0d20d3e5a41b5c014f4b21b71be782f8c9cd3bc5 Mon Sep 17 00:00:00 2001
    From: Bruce Eckel 
    Date: Sat, 6 May 2017 20:32:56 -0600
    Subject: [PATCH 250/320] Trying parallel again
    
    ---
     gradle.properties | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/gradle.properties b/gradle.properties
    index 8b1378917..f97ebb7d3 100644
    --- a/gradle.properties
    +++ b/gradle.properties
    @@ -1 +1 @@
    -
    +org.gradle.parallel=true
    
    From edd99881d7c0d9dd78cf626c079806104e915e94 Mon Sep 17 00:00:00 2001
    From: Bruce Eckel 
    Date: Wed, 10 May 2017 11:45:39 -0600
    Subject: [PATCH 251/320] Narrowed listing widths, fixed output
    
    Also removed Preferences appendix
    ---
     ...nitComposition.java => AUComposition.java} |   8 +-
     ...tExternalTest.java => AUExternalTest.java} |   8 +-
     annotations/AtUnitExample1.java               |   4 +-
     annotations/AtUnitExample2.java               |   6 +-
     annotations/AtUnitExample3.java               |   2 +-
     annotations/AtUnitExample4.java               |  14 +-
     annotations/AtUnitExample5.java               |   4 +-
     annotations/HashSetTest.java                  |   2 +-
     ...kLStringTest.java => StackLStringTst.java} |  10 +-
     annotations/UseCaseTracker.java               |   4 +-
     annotations/database/TableCreator.java        |  19 +-
     arrays/ArrayCopying.java                      |   4 +-
     arrays/ArraySearching.java                    |   6 +-
     arrays/AutoboxingArrays.java                  |   6 +-
     arrays/CollectionComparison.java              |   4 +-
     arrays/CompType.java                          |   8 +-
     arrays/ComparatorTest.java                    |  11 +-
     arrays/CountUpward.java                       |   4 +-
     arrays/MultiDimWrapperArray.java              |  19 +-
     arrays/MultidimensionalObjectArrays.java      |   4 +-
     arrays/RaggedArray.java                       |   4 +-
     arrays/Reverse.java                           |   8 +-
     arrays/StringSorting.java                     |  26 +--
     .../ApplesAndOrangesWithoutGenerics.java      |   9 +-
     collections/CollectionDifferences.java        |  56 +++---
     collections/CollectionSequence.java           |   6 +-
     collections/CrossCollectionIteration.java     |  12 +-
     collections/CrossCollectionIteration2.java    |  12 +-
     collections/InterfaceVsIterator.java          |  18 +-
     collections/IterableClass.java                |   3 +-
     collections/ListIteration.java                |   7 +-
     collections/MapOfList.java                    |   3 +-
     collections/NonCollectionSequence.java        |   3 +-
     collections/PetMap.java                       |   4 +-
     collections/PrintingCollections.java          |   3 +-
     collections/PriorityQueueDemo.java            |  11 +-
     collections/SetOfInteger.java                 |   4 +-
     collections/SetOperations.java                |   6 +-
     collections/SimpleIteration.java              |   8 +-
     collections/Statistics.java                   |   6 +-
     collections/UniqueWords.java                  |  17 +-
     collections/UniqueWordsAlphabetic.java        |  14 +-
     collectiontopics/Bits.java                    |  16 +-
     collectiontopics/Enumerations.java            |   5 +-
     collectiontopics/FillMapTest.java             |   9 +-
     collectiontopics/FillingLists.java            |   4 +-
     collectiontopics/ListOps.java                 |  55 ++---
     collectiontopics/ListSortSearch.java          |  14 +-
     collectiontopics/MapOps.java                  |  15 +-
     collectiontopics/ReadOnly.java                |   6 +-
     collectiontopics/SimpleDeques.java            |   9 +-
     collectiontopics/Stacks.java                  |  21 +-
     collectiontopics/StreamFillMaps.java          |   9 +-
     collectiontopics/SuppliersCollectionTest.java |  28 +--
     collectiontopics/TypesForSets.java            |  16 +-
     collectiontopics/Unsupported.java             |   4 +-
     concurrent/CachedThreadPool.java              |  12 +-
     concurrent/CachedThreadPool2.java             |  20 +-
     concurrent/CachedThreadPool3.java             |  10 +-
     concurrent/CompletableApplyAsync.java         |   4 +-
     concurrent/CompletableApplyChained.java       |   2 +-
     concurrent/CompletableOperations.java         |   4 +-
     concurrent/CompletablePizza.java              |  32 +--
     concurrent/CountingStream.java                |  16 +-
     concurrent/DualCompletableOperations.java     |   4 +-
     concurrent/LambdasAndMethodReferences.java    |   2 +-
     concurrent/MoreTasksAfterShutdown.java        |   8 +-
     concurrent/OnePizza.java                      |   2 +-
     concurrent/ParallelPrime.java                 |   2 +-
     concurrent/ParallelStreamPuzzle.java          |   2 +-
     concurrent/ParallelStreamPuzzle2.java         |   2 +-
     concurrent/PizzaParallelSteps.java            |  46 ++---
     concurrent/PizzaStreams.java                  |  36 ++--
     concurrent/QuittingCompletable.java           |  18 +-
     concurrent/QuittingTasks.java                 |  18 +-
     concurrent/SharedConstructorArgument.java     |   2 +-
     concurrent/SingleThreadExecutor.java          |   4 +-
     concurrent/Summing.java                       |   6 +-
     concurrent/Summing4.java                      |   4 +-
     concurrent/TestStaticIDField.java             |   2 +-
     control/LabeledFor.java                       |   2 +-
     control/VowelsAndConsonants.java              |   8 +-
     enums/BigEnumSet.java                         |  27 +--
     enums/ConstantSpecificMethod.java             |   9 +-
     enums/EnumClass.java                          |  17 +-
     enums/EnumMaps.java                           |   3 +-
     enums/PostOffice.java                         |  54 ++---
     enums/Reflection.java                         |  20 +-
     enums/RoShamBo2.java                          |   3 +-
     enums/VendingMachine.java                     |   3 +-
     equalshashcode/ComposedEquality.java          |   3 +-
     equalshashcode/CountedString.java             |   8 +-
     equalshashcode/Equality.java                  |   3 +-
     equalshashcode/SlowMap.java                   |   2 +-
     exceptions/Cleanup.java                       |   3 +-
     exceptions/CleanupIdiom.java                  |   3 +-
     exceptions/DynamicFields.java                 |  22 +-
     exceptions/ExceptionMethods.java              |   3 +-
     exceptions/ExtraFeatures.java                 |  21 +-
     exceptions/FullConstructors.java              |   6 +-
     exceptions/InheritingExceptions.java          |   6 +-
     exceptions/LoggingExceptions.java             |   4 +-
     exceptions/LoggingExceptions2.java            |   2 +-
     exceptions/NeverCaught.java                   |   4 +-
     exceptions/TurnOffChecking.java               |  14 +-
     exceptions/WhoCalled.java                     |   8 +-
     files/AddAndSubtractPaths.java                |  24 +--
     files/Directories.java                        |  14 +-
     files/FileSystemDemo.java                     |   3 +-
     files/Find.java                               |  24 +--
     files/PartsOfPaths.java                       |   8 +-
     files/PathAnalysis.java                       |   8 +-
     files/PathInfo.java                           |  26 +--
     files/PathWatcher.java                        |   7 +-
     functional/CurryingAndPartials.java           |   3 +-
     functional/FunctionalAnnotation.java          |   3 +-
     generics/ApplyTest.java                       |  12 +-
     generics/BasicBounds.java                     |   2 +-
     generics/CheckedList.java                     |   6 +-
     generics/DogsAndRobotMethodReferences.java    |   3 +-
     generics/DynamicProxyMixin.java               |   2 +-
     generics/EpicBattle.java                      |   6 +-
     generics/FactoryConstraint.java               |   9 +-
     generics/Fibonacci.java                       |   3 +-
     generics/GenericArray.java                    |   3 +-
     generics/GenericArray2.java                   |   4 +-
     generics/GenericReading.java                  |   3 +-
     generics/GenericVarargs.java                  |   7 +-
     generics/InheritBounds.java                   |   3 +-
     generics/IterableFibonacci.java               |   3 +-
     generics/Mixins.java                          |   8 +-
     generics/OrdinaryArguments.java               |   3 +-
     generics/RandomList.java                      |   3 +-
     generics/SelfBounding.java                    |   3 +-
     .../SelfBoundingAndCovariantArguments.java    |   6 +-
     generics/Store.java                           |   9 +-
     generics/ThrowGenericException.java           |  14 +-
     generics/TupleList.java                       |   2 +-
     generics/TupleTest.java                       |   9 +-
     generics/TupleTest2.java                      |   9 +-
     generics/WatercolorSets.java                  |  35 ++--
     generics/Wildcards.java                       |  10 +-
     generics/watercolors/Watercolors.java         |  11 +-
     hiding/FullQualification.java                 |   3 +-
     housekeeping/ArrayClassObj.java               |   4 +-
     housekeeping/Demotion.java                    |   4 +-
     housekeeping/EnumOrder.java                   |   3 +-
     housekeeping/ExplicitStatic.java              |   2 +-
     housekeeping/PrimitiveOverloading.java        |   8 +-
     housekeeping/StaticInitialization.java        |   8 +-
     housekeeping/VarargType.java                  |   3 +-
     innerclasses/DotNew.java                      |   2 +-
     innerclasses/Parcel3.java                     |   3 +-
     innerclasses/mui/MultiInterfaces.java         |   2 +-
     interfaces/AdaptedRandomDoubles.java          |   8 +-
     interfaces/Applicator.java                    |   5 +-
     interfaces/Jim.java                           |   8 +-
     interfaces/MICollision.java                   |  20 +-
     interfaces/MultipleInheritance.java           |   4 +-
     interfaces/RandomDoubles.java                 |   5 +-
     interfaces/RandomStrings.java                 |   4 +-
     .../interfaceprocessor/StringProcessor.java   |   7 +-
     javadoc/HelloDateDoc.java                     |   2 +-
     lowlevel/AtomicEvenProducer.java              |   2 +-
     lowlevel/DelayQueueDemo.java                  |  11 +-
     lowlevel/EvenProducer.java                    |   8 +-
     lowlevel/ExceptionThread.java                 |  11 +
     lowlevel/NaiveExceptionHandling.java          |  11 +
     lowlevel/NotAtomic.java                       |  15 +-
     lowlevel/NumberOfProcessors.java              |   2 +-
     lowlevel/PriorityBlockingQueueDemo.java       |  28 +--
     lowlevel/SerialNumberTest.java                |   2 +-
     lowlevel/SynchronizedComparison.java          |  20 +-
     lowlevel/ThreadSize.java                      |   2 +-
     lowlevel/UnsafeReturn.java                    |   2 +-
     lowlevel/WorkStealingPool.java                |  12 +-
     newio/AvailableCharSets.java                  |   6 +-
     newio/LockingMappedFiles.java                 |   2 +-
     newio/MappedIO.java                           |  12 +-
     newio/ViewBuffers.java                        |   4 +-
     objects/ShowProperties.java                   |  13 +-
     onjava/CollectionMethodDifferences.java       |  61 +++---
     onjava/CountingIntegerList.java               |   4 +-
     onjava/Countries.java                         |  27 ++-
     onjava/Range.java                             |   2 +-
     onjava/RmDir.java                             |   6 +-
     onjava/Suppliers.java                         |   4 +-
     onjava/atunit/AtUnit.java                     |  13 +-
     onjava/atunit/ClassNameFinder.java            |   6 +-
     operators/AutoInc.java                        |  28 +--
     operators/Literals.java                       |   2 +-
     operators/URShift.java                        |   4 +-
     patterns/chain/ChainOfResponsibility.java     |   7 +-
     polymorphism/FieldAccess.java                 |   3 +-
     polymorphism/Frog.java                        |   3 +-
     polymorphism/PrivateOverride.java             |   4 +-
     polymorphism/PrivateOverride2.java            |   4 +-
     polymorphism/RTTI.java                        |   5 +-
     preferences/PreferencesDemo.java              |  41 ----
     references/Compete.java                       |   4 +-
     references/HorrorFlick.java                   |   2 +-
     reuse/BlankFinal.java                         |   6 +-
     reuse/Detergent.java                          |   3 +-
     serialization/Logon.java                      |   6 +-
     serialization/MyWorld.java                    |  12 +-
     streams/ArrayStreams.java                     |   3 +-
     streams/FileToWordsRegexp.java                |   3 +-
     streams/ForEach.java                          |   2 +-
     streams/LastElement.java                      |   3 +-
     streams/MapCollector.java                     |   3 +-
     streams/OptionalFilter.java                   |   6 +-
     streams/OptionalFlatMap.java                  |   6 +-
     streams/OptionalMap.java                      |   3 +-
     streams/Optionals.java                        |   4 +-
     streams/Prime.java                            |   3 +-
     streams/SelectElement.java                    |   2 +-
     streams/StreamOf.java                         |   3 +-
     streams/StreamOfRandoms.java                  |   3 +-
     streams/TreeSetOfWords.java                   |  13 +-
     strings/ArrayListDisplay.java                 |   5 +-
     strings/DatabaseException.java                |   4 +-
     strings/Finding.java                          |   6 +-
     strings/Groups.java                           |   6 +-
     strings/InfiniteRecursion.java                |   3 +-
     strings/JGrep.java                            |   3 +-
     strings/ReceiptBuilder.java                   |  15 +-
     strings/Replacing.java                        |   7 +-
     strings/ReplacingStringTokenizer.java         |   6 +-
     strings/SimpleRead.java                       |   9 +-
     strings/Splitting.java                        |  25 +--
     strings/StartEnd.java                         |   6 +-
     strings/TheReplacements.java                  |   7 +-
     strings/Turtle.java                           |   3 +-
     strings/UsingStringBuilder.java               |   8 +-
     typeinfo/HiddenImplementation.java            |   3 +-
     typeinfo/NullRobot.java                       |   3 +-
     typeinfo/PetCount.java                        |   4 +-
     typeinfo/PetCount2.java                       |   4 +-
     typeinfo/PetCount3.java                       |   8 +-
     typeinfo/PetCount4.java                       |   9 +-
     typeinfo/Shapes.java                          |   3 +-
     typeinfo/ShowMethods.java                     |   3 +-
     typeinfo/SimpleDynamicProxy.java              |   3 +-
     typeinfo/SnowRemovalRobot.java                |   6 +-
     typeinfo/Staff.java                           |  20 +-
     typeinfo/pets/LiteralPetCreator.java          |  12 +-
     typeinfo/toys/GenericToyTest.java             |   3 +-
     typeinfo/toys/ToyTest.java                    |   9 +-
     validating/Assert2.java                       |   7 +-
     validating/BadMicroBenchmark2.java            |   8 +-
     validating/GuavaAssertions.java               |   3 +-
     validating/GuavaPreconditions.java            |  16 +-
     validating/LoaderAssertions.java              |   3 +-
     validating/SLF4JLevels.java                   |  10 +-
     validating/SLF4JLogging.java                  |   2 +-
     validating/SimpleDebugging.java               |  13 +-
     verify_output.py                              | 189 ------------------
     257 files changed, 1252 insertions(+), 1206 deletions(-)
     rename annotations/{AtUnitComposition.java => AUComposition.java} (78%)
     rename annotations/{AtUnitExternalTest.java => AUExternalTest.java} (75%)
     rename annotations/{StackLStringTest.java => StackLStringTst.java} (81%)
     delete mode 100644 preferences/PreferencesDemo.java
     delete mode 100644 verify_output.py
    
    diff --git a/annotations/AtUnitComposition.java b/annotations/AUComposition.java
    similarity index 78%
    rename from annotations/AtUnitComposition.java
    rename to annotations/AUComposition.java
    index 187b48a99..451af4cc6 100644
    --- a/annotations/AtUnitComposition.java
    +++ b/annotations/AUComposition.java
    @@ -1,15 +1,15 @@
    -// annotations/AtUnitComposition.java
    +// annotations/AUComposition.java
     // (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Creating non-embedded tests
     // {java onjava.atunit.AtUnit
    -// build/classes/main/annotations/AtUnitComposition.class}
    +// build/classes/main/annotations/AUComposition.class}
     package annotations;
     import onjava.atunit.*;
     import onjava.*;
     
    -public class AtUnitComposition {
    +public class AUComposition {
       AtUnitExample1 testObject = new AtUnitExample1();
       @Test
       boolean tMethodOne() {
    @@ -22,7 +22,7 @@ boolean tMethodTwo() {
       }
     }
     /* Output:
    -annotations.AtUnitComposition
    +annotations.AUComposition
       . tMethodTwo This is methodTwo
     
       . tMethodOne
    diff --git a/annotations/AtUnitExternalTest.java b/annotations/AUExternalTest.java
    similarity index 75%
    rename from annotations/AtUnitExternalTest.java
    rename to annotations/AUExternalTest.java
    index 55410f900..d2f4e5ca9 100644
    --- a/annotations/AtUnitExternalTest.java
    +++ b/annotations/AUExternalTest.java
    @@ -1,16 +1,16 @@
    -// annotations/AtUnitExternalTest.java
    +// annotations/AUExternalTest.java
     // (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Creating non-embedded tests
     // {java onjava.atunit.AtUnit
    -// build/classes/main/annotations/AtUnitExternalTest.class}
    +// build/classes/main/annotations/AUExternalTest.class}
     package annotations;
     import onjava.atunit.*;
     import onjava.*;
     
     public class
    -AtUnitExternalTest extends AtUnitExample1 {
    +AUExternalTest extends AtUnitExample1 {
       @Test
       boolean tMethodOne() {
         return methodOne().equals("This is methodOne");
    @@ -21,7 +21,7 @@ boolean tMethodTwo() {
       }
     }
     /* Output:
    -annotations.AtUnitExternalTest
    +annotations.AUExternalTest
       . tMethodOne
       . tMethodTwo This is methodTwo
     
    diff --git a/annotations/AtUnitExample1.java b/annotations/AtUnitExample1.java
    index 4b83bf9f0..2c42aad4f 100644
    --- a/annotations/AtUnitExample1.java
    +++ b/annotations/AtUnitExample1.java
    @@ -34,11 +34,11 @@ boolean anotherDisappointment() {
     }
     /* Output:
     annotations.AtUnitExample1
    +  . m3
    +  . methodOneTest
       . m2 This is methodTwo
     
    -  . m3
       . failureTest (failed)
    -  . methodOneTest
       . anotherDisappointment (failed)
     (5 tests)
     
    diff --git a/annotations/AtUnitExample2.java b/annotations/AtUnitExample2.java
    index 78ba02ac3..79c04bfd6 100644
    --- a/annotations/AtUnitExample2.java
    +++ b/annotations/AtUnitExample2.java
    @@ -40,14 +40,14 @@ boolean assertAndReturn() {
     }
     /* Output:
     annotations.AtUnitExample2
    -  . assertExample
       . exceptionExample java.io.FileNotFoundException:
     nofile.txt (The system cannot find the file specified)
     (failed)
    +  . assertExample
       . assertAndReturn This is methodTwo
     
    -  . assertFailureExample java.lang.AssertionError: What a
    -surprise!
    +  . assertFailureExample java.lang.AssertionError: What
    +a surprise!
     (failed)
     (4 tests)
     
    diff --git a/annotations/AtUnitExample3.java b/annotations/AtUnitExample3.java
    index 5d4f754e6..b4d13d6ef 100644
    --- a/annotations/AtUnitExample3.java
    +++ b/annotations/AtUnitExample3.java
    @@ -34,9 +34,9 @@ boolean methodOneTest() {
     }
     /* Output:
     annotations.AtUnitExample3
    -  . methodOneTest
       . initialization
       . m2 This is methodTwo
     
    +  . methodOneTest
     OK (3 tests)
     */
    diff --git a/annotations/AtUnitExample4.java b/annotations/AtUnitExample4.java
    index 1fb7ce3a7..f2114c441 100644
    --- a/annotations/AtUnitExample4.java
    +++ b/annotations/AtUnitExample4.java
    @@ -4,6 +4,7 @@
     // Visit http://OnJava8.com for more book information.
     // {java onjava.atunit.AtUnit
     // build/classes/main/annotations/AtUnitExample4.class}
    +// {VisuallyInspectOutput}
     package annotations;
     import java.util.*;
     import onjava.atunit.*;
    @@ -67,15 +68,16 @@ boolean scramble2() {
     annotations.AtUnitExample4
       . words 'All'
     (failed)
    -  . scramble2 'brontosauruses'
    -tsaeborornussu
    -
    -  . scramble1 'are'
    -rae
    +  . scramble1 'brontosauruses'
    +ntsaueorosurbs
    +(failed)
    +  . scramble2 'are'
    +are
     (failed)
     (3 tests)
     
    ->>> 2 FAILURES <<<
    +>>> 3 FAILURES <<<
       annotations.AtUnitExample4: words
       annotations.AtUnitExample4: scramble1
    +  annotations.AtUnitExample4: scramble2
     */
    diff --git a/annotations/AtUnitExample5.java b/annotations/AtUnitExample5.java
    index 1402ca290..20f608601 100644
    --- a/annotations/AtUnitExample5.java
    +++ b/annotations/AtUnitExample5.java
    @@ -53,11 +53,11 @@ boolean test3() {
     }
     /* Output:
     annotations.AtUnitExample5
    +  . test1
    +Running cleanup
       . test3
     Running cleanup
       . test2
    -Running cleanup
    -  . test1
     Running cleanup
     OK (3 tests)
     */
    diff --git a/annotations/HashSetTest.java b/annotations/HashSetTest.java
    index 40876c073..62fc7a162 100644
    --- a/annotations/HashSetTest.java
    +++ b/annotations/HashSetTest.java
    @@ -30,7 +30,7 @@ void tRemove() {
     /* Output:
     annotations.HashSetTest
       . initialization
    -  . tContains
       . tRemove
    +  . tContains
     OK (3 tests)
     */
    diff --git a/annotations/StackLStringTest.java b/annotations/StackLStringTst.java
    similarity index 81%
    rename from annotations/StackLStringTest.java
    rename to annotations/StackLStringTst.java
    index fa0655b59..98531711f 100644
    --- a/annotations/StackLStringTest.java
    +++ b/annotations/StackLStringTst.java
    @@ -1,16 +1,16 @@
    -// annotations/StackLStringTest.java
    +// annotations/StackLStringTst.java
     // (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Applying @Unit to generics
     // {java onjava.atunit.AtUnit
    -// build/classes/main/annotations/StackLStringTest.class}
    +// build/classes/main/annotations/StackLStringTst.class}
     package annotations;
     import onjava.atunit.*;
     import onjava.*;
     
     public class
    -StackLStringTest extends StackL {
    +StackLStringTst extends StackL {
       @Test
       void tPush() {
         push("one");
    @@ -34,9 +34,9 @@ void tTop() {
       }
     }
     /* Output:
    -annotations.StackLStringTest
    -  . tPop
    +annotations.StackLStringTst
       . tTop
       . tPush
    +  . tPop
     OK (3 tests)
     */
    diff --git a/annotations/UseCaseTracker.java b/annotations/UseCaseTracker.java
    index d9fb07f51..2376d695a 100644
    --- a/annotations/UseCaseTracker.java
    +++ b/annotations/UseCaseTracker.java
    @@ -27,10 +27,10 @@ public static void main(String[] args) {
       }
     }
     /* Output:
    -Found Use Case 47
    -  Passwords must contain at least one numeric
     Found Use Case 48
       no description
    +Found Use Case 47
    +  Passwords must contain at least one numeric
     Found Use Case 49
       New passwords can't equal previously used ones
     Missing use case 50
    diff --git a/annotations/database/TableCreator.java b/annotations/database/TableCreator.java
    index 3248645d6..a9b12066f 100644
    --- a/annotations/database/TableCreator.java
    +++ b/annotations/database/TableCreator.java
    @@ -14,7 +14,8 @@ public class TableCreator {
       public static void
       main(String[] args) throws Exception {
         if(args.length < 1) {
    -      System.out.println("arguments: annotated classes");
    +      System.out.println(
    +        "arguments: annotated classes");
           System.exit(0);
         }
         for(String className : args) {
    @@ -22,7 +23,8 @@ public class TableCreator {
           DBTable dbTable = cl.getAnnotation(DBTable.class);
           if(dbTable == null) {
             System.out.println(
    -          "No DBTable annotations in class " + className);
    +          "No DBTable annotations in class " +
    +          className);
             continue;
           }
           String tableName = dbTable.name();
    @@ -66,11 +68,12 @@ public class TableCreator {
             String tableCreate = createCommand.substring(
               0, createCommand.length() - 1) + ");";
             System.out.println("Table Creation SQL for " +
    -          className + " is :\n" + tableCreate);
    +          className + " is:\n" + tableCreate);
           }
         }
       }
    -  private static String getConstraints(Constraints con) {
    +  private static
    +  String getConstraints(Constraints con) {
         String constraints = "";
         if(!con.allowNull())
           constraints += " NOT NULL";
    @@ -82,19 +85,19 @@ private static String getConstraints(Constraints con) {
       }
     }
     /* Output:
    -Table Creation SQL for annotations.database.Member is :
    +Table Creation SQL for annotations.database.Member is:
     CREATE TABLE MEMBER(
         FIRSTNAME VARCHAR(30));
    -Table Creation SQL for annotations.database.Member is :
    +Table Creation SQL for annotations.database.Member is:
     CREATE TABLE MEMBER(
         FIRSTNAME VARCHAR(30),
         LASTNAME VARCHAR(50));
    -Table Creation SQL for annotations.database.Member is :
    +Table Creation SQL for annotations.database.Member is:
     CREATE TABLE MEMBER(
         FIRSTNAME VARCHAR(30),
         LASTNAME VARCHAR(50),
         AGE INT);
    -Table Creation SQL for annotations.database.Member is :
    +Table Creation SQL for annotations.database.Member is:
     CREATE TABLE MEMBER(
         FIRSTNAME VARCHAR(30),
         LASTNAME VARCHAR(50),
    diff --git a/arrays/ArrayCopying.java b/arrays/ArrayCopying.java
    index 8d4ae37e6..5669bf1d4 100644
    --- a/arrays/ArrayCopying.java
    +++ b/arrays/ArrayCopying.java
    @@ -61,8 +61,8 @@ public static void main(String[] args) {
         Sup[] b2 = new Sup[SZ/2];
         Arrays.setAll(b2, Sup::new);
         try {
    -      Sub[] d3 =
    -        Arrays.copyOf(b2, b2.length, Sub[].class); // [6]
    +      Sub[] d3 = Arrays.copyOf(
    +        b2, b2.length, Sub[].class); // [6]
         } catch(Exception e) {
           System.out.println(e);
         }
    diff --git a/arrays/ArraySearching.java b/arrays/ArraySearching.java
    index 67de49b4a..e08a694a7 100644
    --- a/arrays/ArraySearching.java
    +++ b/arrays/ArraySearching.java
    @@ -26,8 +26,8 @@ public static void main(String[] args) {
       }
     }
     /* Output:
    -Sorted array: [125, 267, 635, 650, 1131, 1506, 1634, 2400,
    -2766, 3063, 3768, 3941, 4720, 4762, 4948, 5070, 5682, 5807,
    -6177, 6193, 6656, 7021, 8479, 8737, 9954]
    +Sorted array: [125, 267, 635, 650, 1131, 1506, 1634,
    +2400, 2766, 3063, 3768, 3941, 4720, 4762, 4948, 5070,
    +5682, 5807, 6177, 6193, 6656, 7021, 8479, 8737, 9954]
     Location of 635 is 2, a[2] is 635
     */
    diff --git a/arrays/AutoboxingArrays.java b/arrays/AutoboxingArrays.java
    index 4e34f753c..30589cc43 100644
    --- a/arrays/AutoboxingArrays.java
    +++ b/arrays/AutoboxingArrays.java
    @@ -16,7 +16,7 @@ public static void main(String[] args) {
       }
     }
     /* Output:
    -[[1, 2, 3, 4, 5, 6, 7, 8, 9, 10], [21, 22, 23, 24, 25, 26,
    -27, 28, 29, 30], [51, 52, 53, 54, 55, 56, 57, 58, 59, 60],
    -[71, 72, 73, 74, 75, 76, 77, 78, 79, 80]]
    +[[1, 2, 3, 4, 5, 6, 7, 8, 9, 10], [21, 22, 23, 24, 25,
    +26, 27, 28, 29, 30], [51, 52, 53, 54, 55, 56, 57, 58,
    +59, 60], [71, 72, 73, 74, 75, 76, 77, 78, 79, 80]]
     */
    diff --git a/arrays/CollectionComparison.java b/arrays/CollectionComparison.java
    index 108faed91..66958372f 100644
    --- a/arrays/CollectionComparison.java
    +++ b/arrays/CollectionComparison.java
    @@ -41,8 +41,8 @@ public static void main(String[] args) {
       }
     }
     /* Output:
    -[Sphere 0, Sphere 1, Sphere 2, Sphere 3, Sphere 4, null,
    -null, null, null, null]
    +[Sphere 0, Sphere 1, Sphere 2, Sphere 3, Sphere 4,
    +null, null, null, null, null]
     Sphere 4
     [Sphere 5, Sphere 6, Sphere 7, Sphere 8, Sphere 9]
     Sphere 9
    diff --git a/arrays/CompType.java b/arrays/CompType.java
    index 0e8e6f4e5..a93b6aee4 100644
    --- a/arrays/CompType.java
    +++ b/arrays/CompType.java
    @@ -41,14 +41,14 @@ public static void main(String[] args) {
       }
     }
     /* Output:
    -Before sorting: [[i = 35, j = 37], [i = 41, j = 20], [i =
    -77, j = 79]
    +Before sorting: [[i = 35, j = 37], [i = 41, j = 20], [i
    += 77, j = 79]
     , [i = 56, j = 68], [i = 48, j = 93], [i = 70, j = 7]
     , [i = 0, j = 25], [i = 62, j = 34], [i = 50, j = 82]
     , [i = 31, j = 67], [i = 66, j = 54], [i = 21, j = 6]
     ]
    -After sorting: [[i = 0, j = 25], [i = 21, j = 6], [i = 31,
    -j = 67]
    +After sorting: [[i = 0, j = 25], [i = 21, j = 6], [i =
    +31, j = 67]
     , [i = 35, j = 37], [i = 41, j = 20], [i = 48, j = 93]
     , [i = 50, j = 82], [i = 56, j = 68], [i = 62, j = 34]
     , [i = 66, j = 54], [i = 70, j = 7], [i = 77, j = 79]
    diff --git a/arrays/ComparatorTest.java b/arrays/ComparatorTest.java
    index 0edf8b6db..79eb3c721 100644
    --- a/arrays/ComparatorTest.java
    +++ b/arrays/ComparatorTest.java
    @@ -7,7 +7,8 @@
     import onjava.*;
     import static onjava.ArrayShow.*;
     
    -class CompTypeComparator implements Comparator {
    +class CompTypeComparator
    +implements Comparator {
       public int compare(CompType o1, CompType o2) {
         return (o1.j < o2.j ? -1 : (o1.j == o2.j ? 0 : 1));
       }
    @@ -23,14 +24,14 @@ public static void main(String[] args) {
       }
     }
     /* Output:
    -Before sorting: [[i = 35, j = 37], [i = 41, j = 20], [i =
    -77, j = 79]
    +Before sorting: [[i = 35, j = 37], [i = 41, j = 20], [i
    += 77, j = 79]
     , [i = 56, j = 68], [i = 48, j = 93], [i = 70, j = 7]
     , [i = 0, j = 25], [i = 62, j = 34], [i = 50, j = 82]
     , [i = 31, j = 67], [i = 66, j = 54], [i = 21, j = 6]
     ]
    -After sorting: [[i = 21, j = 6], [i = 70, j = 7], [i = 41,
    -j = 20]
    +After sorting: [[i = 21, j = 6], [i = 70, j = 7], [i =
    +41, j = 20]
     , [i = 0, j = 25], [i = 62, j = 34], [i = 35, j = 37]
     , [i = 66, j = 54], [i = 31, j = 67], [i = 56, j = 68]
     , [i = 77, j = 79], [i = 50, j = 82], [i = 48, j = 93]
    diff --git a/arrays/CountUpward.java b/arrays/CountUpward.java
    index 3208e2cb2..e512104f0 100644
    --- a/arrays/CountUpward.java
    +++ b/arrays/CountUpward.java
    @@ -19,6 +19,6 @@ public static void main(String[] args) {
       }
     }
     /* Output:
    -[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
    -17, 18, 19]
    +[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
    +16, 17, 18, 19]
     */
    diff --git a/arrays/MultiDimWrapperArray.java b/arrays/MultiDimWrapperArray.java
    index a5e38b4a6..4f173ddd5 100644
    --- a/arrays/MultiDimWrapperArray.java
    +++ b/arrays/MultiDimWrapperArray.java
    @@ -19,17 +19,20 @@ public static void main(String[] args) {
         String[][] a3 = {
           { "The", "Quick", "Sly", "Fox" },
           { "Jumped", "Over" },
    -      { "The", "Lazy", "Brown", "Dog", "and", "friend" },
    +      { "The", "Lazy", "Brown", "Dog", "&", "friend" },
         };
    -    System.out.println("a1: " + Arrays.deepToString(a1));
    -    System.out.println("a2: " + Arrays.deepToString(a2));
    -    System.out.println("a3: " + Arrays.deepToString(a3));
    +    System.out.println(
    +      "a1: " + Arrays.deepToString(a1));
    +    System.out.println(
    +      "a2: " + Arrays.deepToString(a2));
    +    System.out.println(
    +      "a3: " + Arrays.deepToString(a3));
       }
     }
     /* Output:
     a1: [[1, 2, 3], [4, 5, 6]]
    -a2: [[[1.1, 2.2], [3.3, 4.4]], [[5.5, 6.6], [7.7, 8.8]],
    -[[9.9, 1.2], [2.3, 3.4]]]
    -a3: [[The, Quick, Sly, Fox], [Jumped, Over], [The, Lazy,
    -Brown, Dog, and, friend]]
    +a2: [[[1.1, 2.2], [3.3, 4.4]], [[5.5, 6.6], [7.7,
    +8.8]], [[9.9, 1.2], [2.3, 3.4]]]
    +a3: [[The, Quick, Sly, Fox], [Jumped, Over], [The,
    +Lazy, Brown, Dog, &, friend]]
     */
    diff --git a/arrays/MultidimensionalObjectArrays.java b/arrays/MultidimensionalObjectArrays.java
    index d63c7c4ba..ab147767b 100644
    --- a/arrays/MultidimensionalObjectArrays.java
    +++ b/arrays/MultidimensionalObjectArrays.java
    @@ -20,6 +20,6 @@ public static void main(String[] args) {
     }
     /* Output:
     [[Sphere 0, Sphere 1], [Sphere 2, Sphere 3, Sphere 4,
    -Sphere 5], [Sphere 6, Sphere 7, Sphere 8, Sphere 9, Sphere
    -10, Sphere 11, Sphere 12, Sphere 13]]
    +Sphere 5], [Sphere 6, Sphere 7, Sphere 8, Sphere 9,
    +Sphere 10, Sphere 11, Sphere 12, Sphere 13]]
     */
    diff --git a/arrays/RaggedArray.java b/arrays/RaggedArray.java
    index c5c356059..0877f954c 100644
    --- a/arrays/RaggedArray.java
    +++ b/arrays/RaggedArray.java
    @@ -21,6 +21,6 @@ public static void main(String[] args) {
       }
     }
     /* Output:
    -[[[1], []], [[2, 3, 4, 5], [6]], [[7, 8, 9], [10, 11, 12],
    -[]]]
    +[[[1], []], [[2, 3, 4, 5], [6]], [[7, 8, 9], [10, 11,
    +12], []]]
     */
    diff --git a/arrays/Reverse.java b/arrays/Reverse.java
    index 7bfc848fd..a6553e7df 100644
    --- a/arrays/Reverse.java
    +++ b/arrays/Reverse.java
    @@ -17,14 +17,14 @@ public static void main(String[] args) {
       }
     }
     /* Output:
    -Before sorting: [[i = 35, j = 37], [i = 41, j = 20], [i =
    -77, j = 79]
    +Before sorting: [[i = 35, j = 37], [i = 41, j = 20], [i
    += 77, j = 79]
     , [i = 56, j = 68], [i = 48, j = 93], [i = 70, j = 7]
     , [i = 0, j = 25], [i = 62, j = 34], [i = 50, j = 82]
     , [i = 31, j = 67], [i = 66, j = 54], [i = 21, j = 6]
     ]
    -After sorting: [[i = 77, j = 79], [i = 70, j = 7], [i = 66,
    -j = 54]
    +After sorting: [[i = 77, j = 79], [i = 70, j = 7], [i =
    +66, j = 54]
     , [i = 62, j = 34], [i = 56, j = 68], [i = 50, j = 82]
     , [i = 48, j = 93], [i = 41, j = 20], [i = 35, j = 37]
     , [i = 31, j = 67], [i = 21, j = 6], [i = 0, j = 25]
    diff --git a/arrays/StringSorting.java b/arrays/StringSorting.java
    index 29609b38e..7972c7cce 100644
    --- a/arrays/StringSorting.java
    +++ b/arrays/StringSorting.java
    @@ -20,20 +20,20 @@ public static void main(String[] args) {
       }
     }
     /* Output:
    -Before sort: [btpenpc, cuxszgv, gmeinne, eloztdv, ewcippc,
    -ygpoalk, ljlbynx, taprwxz, bhmupju, cjwzmmr, anmkkyh,
    -fcjpthl, skddcat, jbvlgwc, mvducuj, ydpulcq, zehpfmm,
    -zrxmclh, qgekgly, hyoubzl]
    -After sort: [anmkkyh, bhmupju, btpenpc, cjwzmmr, cuxszgv,
    -eloztdv, ewcippc, fcjpthl, gmeinne, hyoubzl, jbvlgwc,
    -ljlbynx, mvducuj, qgekgly, skddcat, taprwxz, ydpulcq,
    -ygpoalk, zehpfmm, zrxmclh]
    -Reverse sort: [zrxmclh, zehpfmm, ygpoalk, ydpulcq, taprwxz,
    -skddcat, qgekgly, mvducuj, ljlbynx, jbvlgwc, hyoubzl,
    -gmeinne, fcjpthl, ewcippc, eloztdv, cuxszgv, cjwzmmr,
    -btpenpc, bhmupju, anmkkyh]
    -Case-insensitive sort: [anmkkyh, bhmupju, btpenpc, cjwzmmr,
    +Before sort: [btpenpc, cuxszgv, gmeinne, eloztdv,
    +ewcippc, ygpoalk, ljlbynx, taprwxz, bhmupju, cjwzmmr,
    +anmkkyh, fcjpthl, skddcat, jbvlgwc, mvducuj, ydpulcq,
    +zehpfmm, zrxmclh, qgekgly, hyoubzl]
    +After sort: [anmkkyh, bhmupju, btpenpc, cjwzmmr,
     cuxszgv, eloztdv, ewcippc, fcjpthl, gmeinne, hyoubzl,
     jbvlgwc, ljlbynx, mvducuj, qgekgly, skddcat, taprwxz,
     ydpulcq, ygpoalk, zehpfmm, zrxmclh]
    +Reverse sort: [zrxmclh, zehpfmm, ygpoalk, ydpulcq,
    +taprwxz, skddcat, qgekgly, mvducuj, ljlbynx, jbvlgwc,
    +hyoubzl, gmeinne, fcjpthl, ewcippc, eloztdv, cuxszgv,
    +cjwzmmr, btpenpc, bhmupju, anmkkyh]
    +Case-insensitive sort: [anmkkyh, bhmupju, btpenpc,
    +cjwzmmr, cuxszgv, eloztdv, ewcippc, fcjpthl, gmeinne,
    +hyoubzl, jbvlgwc, ljlbynx, mvducuj, qgekgly, skddcat,
    +taprwxz, ydpulcq, ygpoalk, zehpfmm, zrxmclh]
     */
    diff --git a/collections/ApplesAndOrangesWithoutGenerics.java b/collections/ApplesAndOrangesWithoutGenerics.java
    index 775e25f9f..1832b85ac 100644
    --- a/collections/ApplesAndOrangesWithoutGenerics.java
    +++ b/collections/ApplesAndOrangesWithoutGenerics.java
    @@ -30,8 +30,9 @@ public static void main(String[] args) {
     }
     /* Output:
     ___[ Error Output ]___
    -Exception in thread "main" java.lang.ClassCastException:
    -Orange cannot be cast to Apple
    -        at ApplesAndOrangesWithoutGenerics.main(ApplesAndOr
    -angesWithoutGenerics.java:23)
    +Exception in thread "main"
    +java.lang.ClassCastException: Orange cannot be cast to
    +Apple
    +        at ApplesAndOrangesWithoutGenerics.main(ApplesA
    +ndOrangesWithoutGenerics.java:23)
     */
    diff --git a/collections/CollectionDifferences.java b/collections/CollectionDifferences.java
    index d5df0f5cd..f3100ad91 100644
    --- a/collections/CollectionDifferences.java
    +++ b/collections/CollectionDifferences.java
    @@ -20,23 +20,27 @@ public static void main(String[] args) {
     HashSet extends Set, adds: []
     Interfaces in HashSet: [Set, Cloneable, Serializable]
     LinkedHashSet extends HashSet, adds: []
    -Interfaces in LinkedHashSet: [Set, Cloneable, Serializable]
    -TreeSet extends Set, adds: [headSet, descendingIterator,
    -descendingSet, pollLast, subSet, floor, tailSet, ceiling,
    -last, lower, comparator, pollFirst, first, higher]
    +Interfaces in LinkedHashSet: [Set, Cloneable,
    +Serializable]
    +TreeSet extends Set, adds: [headSet,
    +descendingIterator, descendingSet, pollLast, subSet,
    +floor, tailSet, ceiling, last, lower, comparator,
    +pollFirst, first, higher]
     Interfaces in TreeSet: [NavigableSet, Cloneable,
     Serializable]
    -List extends Collection, adds: [replaceAll, get, indexOf,
    -subList, set, sort, lastIndexOf, listIterator]
    +List extends Collection, adds: [replaceAll, get,
    +indexOf, subList, set, sort, lastIndexOf, listIterator]
     Interfaces in List: [Collection]
    -ArrayList extends List, adds: [trimToSize, ensureCapacity]
    -Interfaces in ArrayList: [List, RandomAccess, Cloneable,
    -Serializable]
    -LinkedList extends List, adds: [offerFirst, poll, getLast,
    -offer, getFirst, removeFirst, element,
    -removeLastOccurrence, peekFirst, peekLast, push, pollFirst,
    -removeFirstOccurrence, descendingIterator, pollLast,
    -removeLast, pop, addLast, peek, offerLast, addFirst]
    +ArrayList extends List, adds: [trimToSize,
    +ensureCapacity]
    +Interfaces in ArrayList: [List, RandomAccess,
    +Cloneable, Serializable]
    +LinkedList extends List, adds: [offerFirst, poll,
    +getLast, offer, getFirst, removeFirst, element,
    +removeLastOccurrence, peekFirst, peekLast, push,
    +pollFirst, removeFirstOccurrence, descendingIterator,
    +pollLast, removeLast, pop, addLast, peek, offerLast,
    +addFirst]
     Interfaces in LinkedList: [List, Deque, Cloneable,
     Serializable]
     Queue extends Collection, adds: [poll, peek, offer,
    @@ -44,24 +48,24 @@ public static void main(String[] args) {
     Interfaces in Queue: [Collection]
     PriorityQueue extends Queue, adds: [comparator]
     Interfaces in PriorityQueue: [Serializable]
    -Map: [clear, compute, computeIfAbsent, computeIfPresent,
    -containsKey, containsValue, entrySet, equals, forEach, get,
    -getOrDefault, hashCode, isEmpty, keySet, merge, put,
    -putAll, putIfAbsent, remove, replace, replaceAll, size,
    -values]
    +Map: [clear, compute, computeIfAbsent,
    +computeIfPresent, containsKey, containsValue, entrySet,
    +equals, forEach, get, getOrDefault, hashCode, isEmpty,
    +keySet, merge, put, putAll, putIfAbsent, remove,
    +replace, replaceAll, size, values]
     HashMap extends Map, adds: []
     Interfaces in HashMap: [Map, Cloneable, Serializable]
     LinkedHashMap extends HashMap, adds: []
     Interfaces in LinkedHashMap: [Map]
    -SortedMap extends Map, adds: [lastKey, subMap, comparator,
    -firstKey, headMap, tailMap]
    +SortedMap extends Map, adds: [lastKey, subMap,
    +comparator, firstKey, headMap, tailMap]
     Interfaces in SortedMap: [Map]
     TreeMap extends Map, adds: [descendingKeySet,
    -navigableKeySet, higherEntry, higherKey, floorKey, subMap,
    -ceilingKey, pollLastEntry, firstKey, lowerKey, headMap,
    -tailMap, lowerEntry, ceilingEntry, descendingMap,
    -pollFirstEntry, lastKey, firstEntry, floorEntry,
    -comparator, lastEntry]
    +navigableKeySet, higherEntry, higherKey, floorKey,
    +subMap, ceilingKey, pollLastEntry, firstKey, lowerKey,
    +headMap, tailMap, lowerEntry, ceilingEntry,
    +descendingMap, pollFirstEntry, lastKey, firstEntry,
    +floorEntry, comparator, lastEntry]
     Interfaces in TreeMap: [NavigableMap, Cloneable,
     Serializable]
     */
    diff --git a/collections/CollectionSequence.java b/collections/CollectionSequence.java
    index 920017967..eafa63683 100644
    --- a/collections/CollectionSequence.java
    +++ b/collections/CollectionSequence.java
    @@ -33,6 +33,8 @@ public static void main(String[] args) {
       }
     }
     /* Output:
    -0:Rat 1:Manx 2:Cymric 3:Mutt 4:Pug 5:Cymric 6:Pug 7:Manx
    -0:Rat 1:Manx 2:Cymric 3:Mutt 4:Pug 5:Cymric 6:Pug 7:Manx
    +0:Rat 1:Manx 2:Cymric 3:Mutt 4:Pug 5:Cymric 6:Pug
    +7:Manx
    +0:Rat 1:Manx 2:Cymric 3:Mutt 4:Pug 5:Cymric 6:Pug
    +7:Manx
     */
    diff --git a/collections/CrossCollectionIteration.java b/collections/CrossCollectionIteration.java
    index 8966acd10..572fba6bb 100644
    --- a/collections/CrossCollectionIteration.java
    +++ b/collections/CrossCollectionIteration.java
    @@ -25,8 +25,12 @@ public static void main(String[] args) {
       }
     }
     /* Output:
    -0:Rat 1:Manx 2:Cymric 3:Mutt 4:Pug 5:Cymric 6:Pug 7:Manx
    -0:Rat 1:Manx 2:Cymric 3:Mutt 4:Pug 5:Cymric 6:Pug 7:Manx
    -0:Rat 1:Manx 2:Cymric 3:Mutt 4:Pug 5:Cymric 6:Pug 7:Manx
    -5:Cymric 2:Cymric 7:Manx 1:Manx 3:Mutt 6:Pug 4:Pug 0:Rat
    +0:Rat 1:Manx 2:Cymric 3:Mutt 4:Pug 5:Cymric 6:Pug
    +7:Manx
    +0:Rat 1:Manx 2:Cymric 3:Mutt 4:Pug 5:Cymric 6:Pug
    +7:Manx
    +0:Rat 1:Manx 2:Cymric 3:Mutt 4:Pug 5:Cymric 6:Pug
    +7:Manx
    +5:Cymric 2:Cymric 7:Manx 1:Manx 3:Mutt 6:Pug 4:Pug
    +0:Rat
     */
    diff --git a/collections/CrossCollectionIteration2.java b/collections/CrossCollectionIteration2.java
    index 51ca1788e..1e51ed3ac 100644
    --- a/collections/CrossCollectionIteration2.java
    +++ b/collections/CrossCollectionIteration2.java
    @@ -26,8 +26,12 @@ public static void main(String[] args) {
       }
     }
     /* Output:
    -0:Rat 1:Manx 2:Cymric 3:Mutt 4:Pug 5:Cymric 6:Pug 7:Manx
    -0:Rat 1:Manx 2:Cymric 3:Mutt 4:Pug 5:Cymric 6:Pug 7:Manx
    -0:Rat 1:Manx 2:Cymric 3:Mutt 4:Pug 5:Cymric 6:Pug 7:Manx
    -5:Cymric 2:Cymric 7:Manx 1:Manx 3:Mutt 6:Pug 4:Pug 0:Rat
    +0:Rat 1:Manx 2:Cymric 3:Mutt 4:Pug 5:Cymric 6:Pug
    +7:Manx
    +0:Rat 1:Manx 2:Cymric 3:Mutt 4:Pug 5:Cymric 6:Pug
    +7:Manx
    +0:Rat 1:Manx 2:Cymric 3:Mutt 4:Pug 5:Cymric 6:Pug
    +7:Manx
    +5:Cymric 2:Cymric 7:Manx 1:Manx 3:Mutt 6:Pug 4:Pug
    +0:Rat
     */
    diff --git a/collections/InterfaceVsIterator.java b/collections/InterfaceVsIterator.java
    index 8948aa80a..8404bfa43 100644
    --- a/collections/InterfaceVsIterator.java
    +++ b/collections/InterfaceVsIterator.java
    @@ -37,13 +37,19 @@ public static void main(String[] args) {
       }
     }
     /* Output:
    -0:Rat 1:Manx 2:Cymric 3:Mutt 4:Pug 5:Cymric 6:Pug 7:Manx
    -0:Rat 1:Manx 2:Cymric 3:Mutt 4:Pug 5:Cymric 6:Pug 7:Manx
    -0:Rat 1:Manx 2:Cymric 3:Mutt 4:Pug 5:Cymric 6:Pug 7:Manx
    -0:Rat 1:Manx 2:Cymric 3:Mutt 4:Pug 5:Cymric 6:Pug 7:Manx
    +0:Rat 1:Manx 2:Cymric 3:Mutt 4:Pug 5:Cymric 6:Pug
    +7:Manx
    +0:Rat 1:Manx 2:Cymric 3:Mutt 4:Pug 5:Cymric 6:Pug
    +7:Manx
    +0:Rat 1:Manx 2:Cymric 3:Mutt 4:Pug 5:Cymric 6:Pug
    +7:Manx
    +0:Rat 1:Manx 2:Cymric 3:Mutt 4:Pug 5:Cymric 6:Pug
    +7:Manx
     {Ralph=Rat, Eric=Manx, Robin=Cymric, Lacey=Mutt,
     Britney=Pug, Sam=Cymric, Spot=Pug, Fluffy=Manx}
     [Ralph, Eric, Robin, Lacey, Britney, Sam, Spot, Fluffy]
    -0:Rat 1:Manx 2:Cymric 3:Mutt 4:Pug 5:Cymric 6:Pug 7:Manx
    -0:Rat 1:Manx 2:Cymric 3:Mutt 4:Pug 5:Cymric 6:Pug 7:Manx
    +0:Rat 1:Manx 2:Cymric 3:Mutt 4:Pug 5:Cymric 6:Pug
    +7:Manx
    +0:Rat 1:Manx 2:Cymric 3:Mutt 4:Pug 5:Cymric 6:Pug
    +7:Manx
     */
    diff --git a/collections/IterableClass.java b/collections/IterableClass.java
    index c9eedf57c..8ef2b65ad 100644
    --- a/collections/IterableClass.java
    +++ b/collections/IterableClass.java
    @@ -7,7 +7,8 @@
     
     public class IterableClass implements Iterable {
       protected String[] words = ("And that is how " +
    -    "we know the Earth to be banana-shaped.").split(" ");
    +    "we know the Earth to be banana-shaped."
    +    ).split(" ");
       @Override
       public Iterator iterator() {
         return new Iterator() {
    diff --git a/collections/ListIteration.java b/collections/ListIteration.java
    index cf4c1558a..4daa54fd9 100644
    --- a/collections/ListIteration.java
    +++ b/collections/ListIteration.java
    @@ -10,7 +10,8 @@ public static void main(String[] args) {
         List pets = Pets.list(8);
         ListIterator it = pets.listIterator();
         while(it.hasNext())
    -      System.out.print(it.next() + ", " + it.nextIndex() +
    +      System.out.print(it.next() +
    +        ", " + it.nextIndex() +
             ", " + it.previousIndex() + "; ");
         System.out.println();
         // Backwards:
    @@ -27,8 +28,8 @@ public static void main(String[] args) {
       }
     }
     /* Output:
    -Rat, 1, 0; Manx, 2, 1; Cymric, 3, 2; Mutt, 4, 3; Pug, 5, 4;
    -Cymric, 6, 5; Pug, 7, 6; Manx, 8, 7;
    +Rat, 1, 0; Manx, 2, 1; Cymric, 3, 2; Mutt, 4, 3; Pug,
    +5, 4; Cymric, 6, 5; Pug, 7, 6; Manx, 8, 7;
     7 6 5 4 3 2 1 0
     [Rat, Manx, Cymric, Mutt, Pug, Cymric, Pug, Manx]
     [Rat, Manx, Cymric, Cymric, Rat, EgyptianMau, Hamster,
    diff --git a/collections/MapOfList.java b/collections/MapOfList.java
    index 9c5d706e1..224017f86 100644
    --- a/collections/MapOfList.java
    +++ b/collections/MapOfList.java
    @@ -24,7 +24,8 @@ public class MapOfList {
             new Cat("Stanford"),
             new Cat("Pinkola")));
         petPeople.put(new Person("Luke"),
    -      Arrays.asList(new Rat("Fuzzy"), new Rat("Fizzy")));
    +      Arrays.asList(
    +        new Rat("Fuzzy"), new Rat("Fizzy")));
         petPeople.put(new Person("Isaac"),
           Arrays.asList(new Rat("Freckly")));
       }
    diff --git a/collections/NonCollectionSequence.java b/collections/NonCollectionSequence.java
    index af13bc25e..8ed7a2de5 100644
    --- a/collections/NonCollectionSequence.java
    +++ b/collections/NonCollectionSequence.java
    @@ -32,5 +32,6 @@ public static void main(String[] args) {
       }
     }
     /* Output:
    -0:Rat 1:Manx 2:Cymric 3:Mutt 4:Pug 5:Cymric 6:Pug 7:Manx
    +0:Rat 1:Manx 2:Cymric 3:Mutt 4:Pug 5:Cymric 6:Pug
    +7:Manx
     */
    diff --git a/collections/PetMap.java b/collections/PetMap.java
    index 68029ba9d..8a9a90962 100644
    --- a/collections/PetMap.java
    +++ b/collections/PetMap.java
    @@ -19,8 +19,8 @@ public static void main(String[] args) {
       }
     }
     /* Output:
    -{My Dog=Dog Ginger, My Cat=Cat Molly, My Hamster=Hamster
    -Bosco}
    +{My Dog=Dog Ginger, My Cat=Cat Molly, My
    +Hamster=Hamster Bosco}
     Dog Ginger
     true
     true
    diff --git a/collections/PrintingCollections.java b/collections/PrintingCollections.java
    index 5ca4096e2..72e39b6df 100644
    --- a/collections/PrintingCollections.java
    +++ b/collections/PrintingCollections.java
    @@ -6,7 +6,8 @@
     import java.util.*;
     
     public class PrintingCollections {
    -  static Collection fill(Collection collection) {
    +  static Collection
    +  fill(Collection collection) {
         collection.add("rat");
         collection.add("cat");
         collection.add("dog");
    diff --git a/collections/PriorityQueueDemo.java b/collections/PriorityQueueDemo.java
    index 62136ddb4..024ec51f6 100644
    --- a/collections/PriorityQueueDemo.java
    +++ b/collections/PriorityQueueDemo.java
    @@ -23,7 +23,8 @@ public static void main(String[] args) {
         QueueDemo.printQ(priorityQueue);
     
         String fact = "EDUCATION SHOULD ESCHEW OBFUSCATION";
    -    List strings = Arrays.asList(fact.split(""));
    +    List strings =
    +      Arrays.asList(fact.split(""));
         PriorityQueue stringPQ =
           new PriorityQueue<>(strings);
         QueueDemo.printQ(stringPQ);
    @@ -44,9 +45,9 @@ public static void main(String[] args) {
     0 1 1 1 1 1 3 5 8 14
     1 1 2 3 3 9 9 14 14 18 18 20 21 22 23 25 25
     25 25 23 22 21 20 18 18 14 14 9 9 3 3 2 1 1
    -      A A B C C C D D E E E F H H I I L N N O O O O S S S T
    -T U U U W
    -W U U U T T S S S O O O O N N L I I H H F E E E D D C C C B
    -A A
    +      A A B C C C D D E E E F H H I I L N N O O O O S S
    +S T T U U U W
    +W U U U T T S S S O O O O N N L I I H H F E E E D D C C
    +C B A A
       A B C D E F H I L N O S T U W
     */
    diff --git a/collections/SetOfInteger.java b/collections/SetOfInteger.java
    index 0c332198f..68553c65b 100644
    --- a/collections/SetOfInteger.java
    +++ b/collections/SetOfInteger.java
    @@ -14,6 +14,6 @@ public static void main(String[] args) {
       }
     }
     /* Output:
    -[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, 26, 27, 28, 29]
    +[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, 26, 27, 28, 29]
     */
    diff --git a/collections/SetOperations.java b/collections/SetOperations.java
    index e85bbf705..492658773 100644
    --- a/collections/SetOperations.java
    +++ b/collections/SetOperations.java
    @@ -24,7 +24,8 @@ public static void main(String[] args) {
         System.out.println(
           "set2 removed from set1: " + set1);
         Collections.addAll(set1, "X Y Z".split(" "));
    -    System.out.println("'X Y Z' added to set1: " + set1);
    +    System.out.println(
    +      "'X Y Z' added to set1: " + set1);
       }
     }
     /* Output:
    @@ -34,5 +35,6 @@ public static void main(String[] args) {
     set1: [A, B, C, D, E, F, G, I, J, K, L, M]
     set2 in set1: false
     set2 removed from set1: [A, B, C, D, E, F, G, M]
    -'X Y Z' added to set1: [A, B, C, D, E, F, G, M, X, Y, Z]
    +'X Y Z' added to set1: [A, B, C, D, E, F, G, M, X, Y,
    +Z]
     */
    diff --git a/collections/SimpleIteration.java b/collections/SimpleIteration.java
    index 3c1149545..d47e4711f 100644
    --- a/collections/SimpleIteration.java
    +++ b/collections/SimpleIteration.java
    @@ -28,9 +28,9 @@ public static void main(String[] args) {
       }
     }
     /* Output:
    -0:Rat 1:Manx 2:Cymric 3:Mutt 4:Pug 5:Cymric 6:Pug 7:Manx
    -8:Cymric 9:Rat 10:EgyptianMau 11:Hamster
    -0:Rat 1:Manx 2:Cymric 3:Mutt 4:Pug 5:Cymric 6:Pug 7:Manx
    -8:Cymric 9:Rat 10:EgyptianMau 11:Hamster
    +0:Rat 1:Manx 2:Cymric 3:Mutt 4:Pug 5:Cymric 6:Pug
    +7:Manx 8:Cymric 9:Rat 10:EgyptianMau 11:Hamster
    +0:Rat 1:Manx 2:Cymric 3:Mutt 4:Pug 5:Cymric 6:Pug
    +7:Manx 8:Cymric 9:Rat 10:EgyptianMau 11:Hamster
     [Pug, Manx, Cymric, Rat, EgyptianMau, Hamster]
     */
    diff --git a/collections/Statistics.java b/collections/Statistics.java
    index f2a51aaca..38a42ef3c 100644
    --- a/collections/Statistics.java
    +++ b/collections/Statistics.java
    @@ -19,7 +19,7 @@ public static void main(String[] args) {
       }
     }
     /* Output:
    -{0=481, 1=502, 2=489, 3=508, 4=481, 5=503, 6=519, 7=471,
    -8=468, 9=549, 10=513, 11=531, 12=521, 13=506, 14=477,
    -15=497, 16=533, 17=509, 18=478, 19=464}
    +{0=481, 1=502, 2=489, 3=508, 4=481, 5=503, 6=519,
    +7=471, 8=468, 9=549, 10=513, 11=531, 12=521, 13=506,
    +14=477, 15=497, 16=533, 17=509, 18=478, 19=464}
     */
    diff --git a/collections/UniqueWords.java b/collections/UniqueWords.java
    index 229499773..355accc75 100644
    --- a/collections/UniqueWords.java
    +++ b/collections/UniqueWords.java
    @@ -8,8 +8,8 @@
     public class UniqueWords {
       public static void
       main(String[] args) throws Exception {
    -    List lines =
    -      Files.readAllLines(Paths.get("SetOperations.java"));
    +    List lines = Files.readAllLines(
    +      Paths.get("SetOperations.java"));
         Set words = new TreeSet<>();
         for(String line : lines)
           for(String word : line.split("\\W+"))
    @@ -19,10 +19,11 @@ public class UniqueWords {
       }
     }
     /* Output:
    -[A, B, C, Collections, D, E, F, G, H, HashSet, I, J, K, L,
    -M, N, Output, Set, SetOperations, String, System, X, Y, Z,
    -add, addAll, added, args, class, collections, contains,
    -containsAll, false, from, import, in, java, main, new, out,
    -println, public, remove, removeAll, removed, set1, set2,
    -split, static, to, true, util, void]
    +[A, B, C, Collections, D, E, F, G, H, HashSet, I, J, K,
    +L, M, N, Output, Set, SetOperations, String, System, X,
    +Y, Z, add, addAll, added, args, class, collections,
    +contains, containsAll, false, from, import, in, java,
    +main, new, out, println, public, remove, removeAll,
    +removed, set1, set2, split, static, to, true, util,
    +void]
     */
    diff --git a/collections/UniqueWordsAlphabetic.java b/collections/UniqueWordsAlphabetic.java
    index b6b1c1cc9..e0db4a163 100644
    --- a/collections/UniqueWordsAlphabetic.java
    +++ b/collections/UniqueWordsAlphabetic.java
    @@ -9,8 +9,8 @@
     public class UniqueWordsAlphabetic {
       public static void
       main(String[] args) throws Exception {
    -    List lines =
    -      Files.readAllLines(Paths.get("SetOperations.java"));
    +    List lines = Files.readAllLines(
    +      Paths.get("SetOperations.java"));
         Set words =
           new TreeSet<>(String.CASE_INSENSITIVE_ORDER);
         for(String line : lines)
    @@ -22,9 +22,9 @@ public class UniqueWordsAlphabetic {
     }
     /* Output:
     [A, add, addAll, added, args, B, C, class, collections,
    -contains, containsAll, D, E, F, false, from, G, H, HashSet,
    -I, import, in, J, java, K, L, M, main, N, new, out, Output,
    -println, public, remove, removeAll, removed, Set, set1,
    -set2, SetOperations, split, static, String, System, to,
    -true, util, void, X, Y, Z]
    +contains, containsAll, D, E, F, false, from, G, H,
    +HashSet, I, import, in, J, java, K, L, M, main, N, new,
    +out, Output, println, public, remove, removeAll,
    +removed, Set, set1, set2, SetOperations, split, static,
    +String, System, to, true, util, void, X, Y, Z]
     */
    diff --git a/collectiontopics/Bits.java b/collectiontopics/Bits.java
    index 8af818d17..f3c4d3904 100644
    --- a/collectiontopics/Bits.java
    +++ b/collectiontopics/Bits.java
    @@ -62,17 +62,17 @@ public static void main(String[] args) {
     /* Output:
     byte value: -107
     bits: {0, 2, 4, 7}
    -bit pattern: 1010100100000000000000000000000000000000000000
    -000000000000000000
    +bit pattern: 101010010000000000000000000000000000000000
    +0000000000000000000000
     short value: 1302
     bits: {1, 2, 4, 8, 10}
    -bit pattern: 0110100010100000000000000000000000000000000000
    -000000000000000000
    +bit pattern: 011010001010000000000000000000000000000000
    +0000000000000000000000
     int value: -2014573909
    -bits: {0, 1, 3, 5, 7, 9, 11, 18, 19, 21, 22, 23, 24, 25,
    -26, 31}
    -bit pattern: 1101010101010000001101111110000100000000000000
    -000000000000000000
    +bits: {0, 1, 3, 5, 7, 9, 11, 18, 19, 21, 22, 23, 24,
    +25, 26, 31}
    +bit pattern: 110101010101000000110111111000010000000000
    +0000000000000000000000
     set bit 127: {127}
     set bit 255: {255}
     set bit 1023: {1023, 1024}
    diff --git a/collectiontopics/Enumerations.java b/collectiontopics/Enumerations.java
    index 1d846645f..e66385932 100644
    --- a/collectiontopics/Enumerations.java
    +++ b/collectiontopics/Enumerations.java
    @@ -18,6 +18,7 @@ public static void main(String[] args) {
       }
     }
     /* Output:
    -ALGERIA, ANGOLA, BENIN, BOTSWANA, BURKINA FASO, BURUNDI,
    -CAMEROON, CAPE VERDE, CENTRAL AFRICAN REPUBLIC, CHAD,
    +ALGERIA, ANGOLA, BENIN, BOTSWANA, BURKINA FASO,
    +BURUNDI, CAMEROON, CAPE VERDE, CENTRAL AFRICAN
    +REPUBLIC, CHAD,
     */
    diff --git a/collectiontopics/FillMapTest.java b/collectiontopics/FillMapTest.java
    index e7f1d3c49..0259a2738 100644
    --- a/collectiontopics/FillMapTest.java
    +++ b/collectiontopics/FillMapTest.java
    @@ -23,7 +23,10 @@ public static void main(String[] args) {
       }
     }
     /* Output:
    -{npcc=1, ztdv=6, gvgm=3, btpe=0, einn=4, eelo=5, uxsz=2}
    -{npcc=1, ztdv=6, gvgm=3, btpe=0, einn=4, eelo=5, uxsz=2}
    -{btpe=0, npcc=1, uxsz=2, gvgm=3, einn=4, eelo=5, ztdv=6}
    +{npcc=1, ztdv=6, gvgm=3, btpe=0, einn=4, eelo=5,
    +uxsz=2}
    +{npcc=1, ztdv=6, gvgm=3, btpe=0, einn=4, eelo=5,
    +uxsz=2}
    +{btpe=0, npcc=1, uxsz=2, gvgm=3, einn=4, eelo=5,
    +ztdv=6}
     */
    diff --git a/collectiontopics/FillingLists.java b/collectiontopics/FillingLists.java
    index f014e2f3b..af158de1f 100644
    --- a/collectiontopics/FillingLists.java
    +++ b/collectiontopics/FillingLists.java
    @@ -27,8 +27,8 @@ public static void main(String[] args) {
     }
     /* Output:
     [StringAddress@15db9742 Hello, StringAddress@15db9742
    -Hello, StringAddress@15db9742 Hello, StringAddress@15db9742
    -Hello]
    +Hello, StringAddress@15db9742 Hello,
    +StringAddress@15db9742 Hello]
     [StringAddress@6d06d69c World!, StringAddress@6d06d69c
     World!, StringAddress@6d06d69c World!,
     StringAddress@6d06d69c World!]
    diff --git a/collectiontopics/ListOps.java b/collectiontopics/ListOps.java
    index cf9e27501..57ae02558 100644
    --- a/collectiontopics/ListOps.java
    +++ b/collectiontopics/ListOps.java
    @@ -123,44 +123,45 @@ public static void main(String[] args) {
       }
     }
     /* Output:
    -[AliceBlue, AntiqueWhite, Aquamarine, Azure, Beige, Bisque,
    -Black, BlanchedAlmond, Blue, BlueViolet]
    +[AliceBlue, AntiqueWhite, Aquamarine, Azure, Beige,
    +Bisque, Black, BlanchedAlmond, Blue, BlueViolet]
     b = [AliceBlue, AntiqueWhite, Aquamarine, Azure, Beige,
     Bisque, Black, BlanchedAlmond, Blue, BlueViolet]
    -[AliceBlue, AntiqueWhite, Aquamarine, Azure, Beige, Bisque,
    -Black, BlanchedAlmond, Blue, BlueViolet, AliceBlue,
    -AntiqueWhite, Aquamarine, Azure, Beige, Bisque, Black,
    -BlanchedAlmond, Blue, BlueViolet, AliceBlue, AntiqueWhite,
    -Aquamarine, Azure, Beige, Bisque, Black, BlanchedAlmond,
    -Blue, BlueViolet]
    -[AliceBlue, AntiqueWhite, Aquamarine, Azure, Beige, Bisque,
    -Black, BlanchedAlmond, Blue, BlueViolet, AliceBlue,
    -AntiqueWhite, Aquamarine, Azure, Beige, one, Bisque, Black,
    -BlanchedAlmond, Blue, BlueViolet, AliceBlue, AntiqueWhite,
    -Aquamarine, Azure, Beige, Bisque, Black, BlanchedAlmond,
    -Blue, BlueViolet]
    +[AliceBlue, AntiqueWhite, Aquamarine, Azure, Beige,
    +Bisque, Black, BlanchedAlmond, Blue, BlueViolet,
    +AliceBlue, AntiqueWhite, Aquamarine, Azure, Beige,
    +Bisque, Black, BlanchedAlmond, Blue, BlueViolet,
    +AliceBlue, AntiqueWhite, Aquamarine, Azure, Beige,
    +Bisque, Black, BlanchedAlmond, Blue, BlueViolet]
    +[AliceBlue, AntiqueWhite, Aquamarine, Azure, Beige,
    +Bisque, Black, BlanchedAlmond, Blue, BlueViolet,
    +AliceBlue, AntiqueWhite, Aquamarine, Azure, Beige, one,
    +Bisque, Black, BlanchedAlmond, Blue, BlueViolet,
    +AliceBlue, AntiqueWhite, Aquamarine, Azure, Beige,
    +Bisque, Black, BlanchedAlmond, Blue, BlueViolet]
     Bisque
     Black
    -[AliceBlue, AntiqueWhite, Aquamarine, Azure, Beige, Bisque,
    -Black, BlanchedAlmond, Blue, BlueViolet, AliceBlue,
    -AntiqueWhite, Aquamarine, Azure, Beige, one, 47,
    -BlanchedAlmond, Blue, BlueViolet, AliceBlue, AntiqueWhite,
    -Aquamarine, Azure, Beige, Bisque, Black, BlanchedAlmond,
    -Blue, BlueViolet]
    +[AliceBlue, AntiqueWhite, Aquamarine, Azure, Beige,
    +Bisque, Black, BlanchedAlmond, Blue, BlueViolet,
    +AliceBlue, AntiqueWhite, Aquamarine, Azure, Beige, one,
    +47, BlanchedAlmond, Blue, BlueViolet, AliceBlue,
    +AntiqueWhite, Aquamarine, Azure, Beige, Bisque, Black,
    +BlanchedAlmond, Blue, BlueViolet]
     BlueViolet Blue BlanchedAlmond Black Bisque Beige Azure
     Aquamarine AntiqueWhite AliceBlue BlueViolet Blue
    -BlanchedAlmond 47 one Beige Azure Aquamarine AntiqueWhite
    -AliceBlue BlueViolet Blue BlanchedAlmond Black Bisque Beige
    -Azure Aquamarine AntiqueWhite AliceBlue
    +BlanchedAlmond 47 one Beige Azure Aquamarine
    +AntiqueWhite AliceBlue BlueViolet Blue BlanchedAlmond
    +Black Bisque Beige Azure Aquamarine AntiqueWhite
    +AliceBlue
     testVisual finished
    -[AliceBlue, AntiqueWhite, Aquamarine, Azure, Beige, Bisque,
    -Black, BlanchedAlmond, Blue, BlueViolet]
    +[AliceBlue, AntiqueWhite, Aquamarine, Azure, Beige,
    +Bisque, Black, BlanchedAlmond, Blue, BlueViolet]
     [two, one, AliceBlue, AntiqueWhite, Aquamarine, Azure,
     Beige, Bisque, Black, BlanchedAlmond, Blue, BlueViolet]
     two
     two
     one
     BlueViolet
    -[AliceBlue, AntiqueWhite, Aquamarine, Azure, Beige, Bisque,
    -Black, BlanchedAlmond, Blue]
    +[AliceBlue, AntiqueWhite, Aquamarine, Azure, Beige,
    +Bisque, Black, BlanchedAlmond, Blue]
     */
    diff --git a/collectiontopics/ListSortSearch.java b/collectiontopics/ListSortSearch.java
    index 77400b176..d59bc6439 100644
    --- a/collectiontopics/ListSortSearch.java
    +++ b/collectiontopics/ListSortSearch.java
    @@ -2,7 +2,7 @@
     // (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
    -// Sorting and searching Lists with Collections utilities
    +// Sorting/searching Lists with Collections utilities
     import java.util.*;
     
     public class ListSortSearch {
    @@ -42,16 +42,16 @@ public static void main(String[] args) {
       }
     }
     /* Output:
    -[one, Two, three, Four, five, six, one, one, Two, three,
    -Four, five, six, one]
    +[one, Two, three, Four, five, six, one, one, Two,
    +three, Four, five, six, one]
     Shuffled: [Four, five, one, one, Two, six, six, three,
     three, five, Four, Two, one, one]
     Trimmed: [Four, five, one, one, Two, six, six, three,
     three, five]
    -Sorted: [Four, Two, five, five, one, one, six, six, three,
    -three]
    +Sorted: [Four, Two, five, five, one, one, six, six,
    +three, three]
     Location of six is 7, list.get(7) = six
    -Case-insensitive sorted: [five, five, Four, one, one, six,
    -six, three, three, Two]
    +Case-insensitive sorted: [five, five, Four, one, one,
    +six, six, three, three, Two]
     Location of three is 7, list.get(7) = three
     */
    diff --git a/collectiontopics/MapOps.java b/collectiontopics/MapOps.java
    index 9956f80f6..c49cb84a2 100644
    --- a/collectiontopics/MapOps.java
    +++ b/collectiontopics/MapOps.java
    @@ -8,7 +8,8 @@
     import onjava.*;
     
     public class MapOps {
    -  public static void printKeys(Map map) {
    +  public static
    +  void printKeys(Map map) {
         System.out.print("Size = " + map.size() + ", ");
         System.out.print("Keys: ");
         // Produce a Set of the keys:
    @@ -56,10 +57,10 @@ public static void main(String[] args) {
     }
     /* Output: (First 11 Lines)
     HashMap
    -Size = 25, Keys: [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]
    -Values: [A0, B0, C0, D0, E0, F0, G0, H0, I0, J0, K0, L0,
    -M0, N0, O0, P0, Q0, R0, S0, T0, U0, V0, W0, X0, Y0]
    +Size = 25, Keys: [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]
    +Values: [A0, B0, C0, D0, E0, F0, G0, H0, I0, J0, K0,
    +L0, M0, N0, O0, P0, Q0, R0, S0, T0, U0, V0, W0, X0, Y0]
     {0=A0, 1=B0, 2=C0, 3=D0, 4=E0, 5=F0, 6=G0, 7=H0, 8=I0,
     9=J0, 10=K0, 11=L0, 12=M0, 13=N0, 14=O0, 15=P0, 16=Q0,
     17=R0, 18=S0, 19=T0, 20=U0, 21=V0, 22=W0, 23=X0, 24=Y0}
    @@ -67,8 +68,8 @@ public static void main(String[] args) {
     map.get(11): L0
     map.containsValue("F0"): true
     First key in map: 0
    -Size = 24, Keys: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12,
    -13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24]
    +Size = 24, Keys: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11,
    +12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24]
     map.isEmpty(): true
     map.isEmpty(): true
                       ...
    diff --git a/collectiontopics/ReadOnly.java b/collectiontopics/ReadOnly.java
    index 8339bd52f..925cb8198 100644
    --- a/collectiontopics/ReadOnly.java
    +++ b/collectiontopics/ReadOnly.java
    @@ -45,9 +45,11 @@ public static void main(String[] args) {
       }
     }
     /* Output:
    -[ALGERIA, ANGOLA, BENIN, BOTSWANA, BURKINA FASO, BURUNDI]
    +[ALGERIA, ANGOLA, BENIN, BOTSWANA, BURKINA FASO,
    +BURUNDI]
     ALGERIA
    -[BENIN, BOTSWANA, ANGOLA, BURKINA FASO, ALGERIA, BURUNDI]
    +[BENIN, BOTSWANA, ANGOLA, BURKINA FASO, ALGERIA,
    +BURUNDI]
     {BENIN=Porto-Novo, BOTSWANA=Gaberone, ANGOLA=Luanda,
     BURKINA FASO=Ouagadougou, ALGERIA=Algiers,
     BURUNDI=Bujumbura}
    diff --git a/collectiontopics/SimpleDeques.java b/collectiontopics/SimpleDeques.java
    index c938ec001..119ecc5b7 100644
    --- a/collectiontopics/SimpleDeques.java
    +++ b/collectiontopics/SimpleDeques.java
    @@ -49,11 +49,13 @@ public static void main(String[] args) {
     }
     /* Output:
     LinkedList
    -[7, 6, 5, 4, 3, 2, 1, 0, 20, 21, 22, 23, 24, 25, 26, 27]
    +[7, 6, 5, 4, 3, 2, 1, 0, 20, 21, 22, 23, 24, 25, 26,
    +27]
     7 27 6 26 5 25 4 24 3 23 2 22 1 21 0 20
     7 27 6 26 5 25 4 24 3 23 2 22 1 21 0 20
     ArrayDeque
    -[7, 6, 5, 4, 3, 2, 1, 0, 20, 21, 22, 23, 24, 25, 26, 27]
    +[7, 6, 5, 4, 3, 2, 1, 0, 20, 21, 22, 23, 24, 25, 26,
    +27]
     7 27 6 26 5 25 4 24 3 23 2 22 1 21 0 20
     7 27 6 26 5 25 4 24 3 23 2 22 1 21 0 20
     LinkedBlockingDeque
    @@ -61,7 +63,8 @@ public static void main(String[] args) {
     4 24 3 23 2 22 1 21 0 20
     4 24 3 23 2 22 1 21 0 20
     ConcurrentLinkedDeque
    -[7, 6, 5, 4, 3, 2, 1, 0, 20, 21, 22, 23, 24, 25, 26, 27]
    +[7, 6, 5, 4, 3, 2, 1, 0, 20, 21, 22, 23, 24, 25, 26,
    +27]
     7 27 6 26 5 25 4 24 3 23 2 22 1 21 0 20
     7 27 6 26 5 25 4 24 3 23 2 22 1 21 0 20
     */
    diff --git a/collectiontopics/Stacks.java b/collectiontopics/Stacks.java
    index 053b5d3c1..da56e8b7f 100644
    --- a/collectiontopics/Stacks.java
    +++ b/collectiontopics/Stacks.java
    @@ -44,17 +44,18 @@ public static void main(String[] args) {
       }
     }
     /* Output:
    -stack = [JANUARY, FEBRUARY, MARCH, APRIL, MAY, JUNE, JULY,
    -AUGUST, SEPTEMBER, OCTOBER, NOVEMBER]
    +stack = [JANUARY, FEBRUARY, MARCH, APRIL, MAY, JUNE,
    +JULY, AUGUST, SEPTEMBER, OCTOBER, NOVEMBER]
     element 5 = JUNE
     popping elements:
    -The last line NOVEMBER OCTOBER SEPTEMBER AUGUST JULY JUNE
    -MAY APRIL MARCH FEBRUARY JANUARY lstack = [NOVEMBER,
    -OCTOBER, SEPTEMBER, AUGUST, JULY, JUNE, MAY, APRIL, MARCH,
    +The last line NOVEMBER OCTOBER SEPTEMBER AUGUST JULY
    +JUNE MAY APRIL MARCH FEBRUARY JANUARY lstack =
    +[NOVEMBER, OCTOBER, SEPTEMBER, AUGUST, JULY, JUNE, MAY,
    +APRIL, MARCH, FEBRUARY, JANUARY]
    +NOVEMBER OCTOBER SEPTEMBER AUGUST JULY JUNE MAY APRIL
    +MARCH FEBRUARY JANUARY stack2 = [NOVEMBER, OCTOBER,
    +SEPTEMBER, AUGUST, JULY, JUNE, MAY, APRIL, MARCH,
     FEBRUARY, JANUARY]
    -NOVEMBER OCTOBER SEPTEMBER AUGUST JULY JUNE MAY APRIL MARCH
    -FEBRUARY JANUARY stack2 = [NOVEMBER, OCTOBER, SEPTEMBER,
    -AUGUST, JULY, JUNE, MAY, APRIL, MARCH, FEBRUARY, JANUARY]
    -NOVEMBER OCTOBER SEPTEMBER AUGUST JULY JUNE MAY APRIL MARCH
    -FEBRUARY JANUARY
    +NOVEMBER OCTOBER SEPTEMBER AUGUST JULY JUNE MAY APRIL
    +MARCH FEBRUARY JANUARY
     */
    diff --git a/collectiontopics/StreamFillMaps.java b/collectiontopics/StreamFillMaps.java
    index 83295aa09..6e568e9fb 100644
    --- a/collectiontopics/StreamFillMaps.java
    +++ b/collectiontopics/StreamFillMaps.java
    @@ -46,7 +46,10 @@ public static void main(String[] args) {
       }
     }
     /* Output:
    -{1=A, 2=B, 3=C, 4=D, 5=E, 6=F, 7=G, 8=H, 9=I, 10=J, 11=K}
    -{b=btp, c=enp, d=ccu, e=xsz, f=gvg, g=mei, h=nne, i=elo}
    -{p=Val, q=Val, j=Val, k=Val, l=Val, m=Val, n=Val, o=Val}
    +{1=A, 2=B, 3=C, 4=D, 5=E, 6=F, 7=G, 8=H, 9=I, 10=J,
    +11=K}
    +{b=btp, c=enp, d=ccu, e=xsz, f=gvg, g=mei, h=nne,
    +i=elo}
    +{p=Val, q=Val, j=Val, k=Val, l=Val, m=Val, n=Val,
    +o=Val}
     */
    diff --git a/collectiontopics/SuppliersCollectionTest.java b/collectiontopics/SuppliersCollectionTest.java
    index 22b2661c2..f8b42a874 100644
    --- a/collectiontopics/SuppliersCollectionTest.java
    +++ b/collectiontopics/SuppliersCollectionTest.java
    @@ -50,18 +50,18 @@ public static void main(String[] args) {
       }
     }
     /* Output:
    -[strange, women, lying, in, ponds, distributing, swords,
    -is, no, basis, for, a, system, of, government]
    -[strange, women, lying, in, ponds, distributing, swords,
    -is, no, basis, for, a, system, of, government]
    -[strange, women, lying, in, ponds, distributing, swords,
    -is, no, basis, for, a, system, of, government]
    -[ponds, no, a, in, swords, for, is, basis, strange, system,
    -government, distributing, of, women, lying]
    -[strange, women, lying, in, ponds, distributing, swords,
    -is, no, basis, for, a, system, of, government]
    -[strange, women, lying, in, ponds, distributing, swords,
    -is, no, basis, for, a, system, of, government]
    -[strange, women, lying, in, ponds, distributing, swords,
    -is, no, basis, for, a, system, of, government]
    +[strange, women, lying, in, ponds, distributing,
    +swords, is, no, basis, for, a, system, of, government]
    +[strange, women, lying, in, ponds, distributing,
    +swords, is, no, basis, for, a, system, of, government]
    +[strange, women, lying, in, ponds, distributing,
    +swords, is, no, basis, for, a, system, of, government]
    +[ponds, no, a, in, swords, for, is, basis, strange,
    +system, government, distributing, of, women, lying]
    +[strange, women, lying, in, ponds, distributing,
    +swords, is, no, basis, for, a, system, of, government]
    +[strange, women, lying, in, ponds, distributing,
    +swords, is, no, basis, for, a, system, of, government]
    +[strange, women, lying, in, ponds, distributing,
    +swords, is, no, basis, for, a, system, of, government]
     */
    diff --git a/collectiontopics/TypesForSets.java b/collectiontopics/TypesForSets.java
    index 45651d709..b7840f64c 100644
    --- a/collectiontopics/TypesForSets.java
    +++ b/collectiontopics/TypesForSets.java
    @@ -80,14 +80,14 @@ public static void main(String[] args) {
     [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
     [10, 9, 8, 7, 6, 5, 0, 1, 2, 3, 4]
     [10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
    -[1, 6, 8, 6, 2, 7, 8, 9, 4, 10, 7, 5, 1, 3, 4, 9, 9, 10, 5,
    -3, 2, 0, 4, 1, 2, 0, 8, 3, 0, 10, 6, 5, 7]
    -[3, 1, 4, 8, 7, 6, 9, 5, 3, 0, 10, 5, 5, 10, 7, 8, 8, 9, 1,
    -4, 10, 2, 6, 9, 1, 6, 0, 3, 2, 0, 7, 2, 4]
    -[10, 9, 8, 7, 6, 5, 0, 1, 2, 3, 4, 10, 9, 8, 7, 6, 5, 0, 1,
    -2, 3, 4, 10, 9, 8, 7, 6, 5, 0, 1, 2, 3, 4]
    -[10, 9, 8, 7, 6, 5, 0, 1, 2, 3, 4, 10, 9, 8, 7, 6, 5, 0, 1,
    -2, 3, 4, 10, 9, 8, 7, 6, 5, 0, 1, 2, 3, 4]
    +[1, 6, 8, 6, 2, 7, 8, 9, 4, 10, 7, 5, 1, 3, 4, 9, 9,
    +10, 5, 3, 2, 0, 4, 1, 2, 0, 8, 3, 0, 10, 6, 5, 7]
    +[3, 1, 4, 8, 7, 6, 9, 5, 3, 0, 10, 5, 5, 10, 7, 8, 8,
    +9, 1, 4, 10, 2, 6, 9, 1, 6, 0, 3, 2, 0, 7, 2, 4]
    +[10, 9, 8, 7, 6, 5, 0, 1, 2, 3, 4, 10, 9, 8, 7, 6, 5,
    +0, 1, 2, 3, 4, 10, 9, 8, 7, 6, 5, 0, 1, 2, 3, 4]
    +[10, 9, 8, 7, 6, 5, 0, 1, 2, 3, 4, 10, 9, 8, 7, 6, 5,
    +0, 1, 2, 3, 4, 10, 9, 8, 7, 6, 5, 0, 1, 2, 3, 4]
     SetType cannot be cast to java.lang.Comparable
     HashType cannot be cast to java.lang.Comparable
     */
    diff --git a/collectiontopics/Unsupported.java b/collectiontopics/Unsupported.java
    index 0e718671b..fba5dafd1 100644
    --- a/collectiontopics/Unsupported.java
    +++ b/collectiontopics/Unsupported.java
    @@ -31,8 +31,8 @@ static void test(String msg, List list) {
         check("List.set", () -> list.set(0, "X"));
       }
       public static void main(String[] args) {
    -    List list =
    -      Arrays.asList("A B C D E F G H I J K L".split(" "));
    +    List list = Arrays.asList(
    +      "A B C D E F G H I J K L".split(" "));
         test("Modifiable Copy", new ArrayList<>(list));
         test("Arrays.asList()", list);
         test("unmodifiableList()",
    diff --git a/concurrent/CachedThreadPool.java b/concurrent/CachedThreadPool.java
    index 4e3a95b4f..15dac382f 100644
    --- a/concurrent/CachedThreadPool.java
    +++ b/concurrent/CachedThreadPool.java
    @@ -16,14 +16,14 @@ public static void main(String[] args) {
       }
     }
     /* Output:
    -NapTask[9] pool-1-thread-10
    -NapTask[1] pool-1-thread-2
    -NapTask[8] pool-1-thread-9
     NapTask[7] pool-1-thread-8
    -NapTask[5] pool-1-thread-6
    -NapTask[6] pool-1-thread-7
    -NapTask[3] pool-1-thread-4
     NapTask[4] pool-1-thread-5
    +NapTask[1] pool-1-thread-2
    +NapTask[3] pool-1-thread-4
     NapTask[0] pool-1-thread-1
    +NapTask[8] pool-1-thread-9
     NapTask[2] pool-1-thread-3
    +NapTask[9] pool-1-thread-10
    +NapTask[6] pool-1-thread-7
    +NapTask[5] pool-1-thread-6
     */
    diff --git a/concurrent/CachedThreadPool2.java b/concurrent/CachedThreadPool2.java
    index c9e1a7759..a5b29a52a 100644
    --- a/concurrent/CachedThreadPool2.java
    +++ b/concurrent/CachedThreadPool2.java
    @@ -16,14 +16,14 @@ public static void main(String[] args) {
       }
     }
     /* Output:
    -1 pool-1-thread-2 117
    -0 pool-1-thread-1 117
    -2 pool-1-thread-3 217
    -4 pool-1-thread-5 407
    -3 pool-1-thread-4 337
    -5 pool-1-thread-6 507
    -7 pool-1-thread-8 707
    -6 pool-1-thread-7 607
    -8 pool-1-thread-9 807
    -9 pool-1-thread-10 907
    +0 pool-1-thread-1 200
    +1 pool-1-thread-2 200
    +4 pool-1-thread-5 300
    +5 pool-1-thread-6 400
    +8 pool-1-thread-9 500
    +9 pool-1-thread-10 600
    +2 pool-1-thread-3 700
    +7 pool-1-thread-8 800
    +3 pool-1-thread-4 900
    +6 pool-1-thread-7 1000
     */
    diff --git a/concurrent/CachedThreadPool3.java b/concurrent/CachedThreadPool3.java
    index 96ebb8e04..550914e1a 100644
    --- a/concurrent/CachedThreadPool3.java
    +++ b/concurrent/CachedThreadPool3.java
    @@ -33,15 +33,15 @@ public static void main(String[] args)
       }
     }
     /* Output:
    -2 pool-1-thread-3 100
    -0 pool-1-thread-1 100
     1 pool-1-thread-2 100
    -3 pool-1-thread-4 100
    +0 pool-1-thread-1 100
     4 pool-1-thread-5 100
     5 pool-1-thread-6 100
    -6 pool-1-thread-7 100
    -7 pool-1-thread-8 100
     8 pool-1-thread-9 100
     9 pool-1-thread-10 100
    +2 pool-1-thread-3 100
    +3 pool-1-thread-4 100
    +6 pool-1-thread-7 100
    +7 pool-1-thread-8 100
     sum = 1000
     */
    diff --git a/concurrent/CompletableApplyAsync.java b/concurrent/CompletableApplyAsync.java
    index 3218fe348..2698595ad 100644
    --- a/concurrent/CompletableApplyAsync.java
    +++ b/concurrent/CompletableApplyAsync.java
    @@ -21,11 +21,11 @@ public static void main(String[] args) {
       }
     }
     /* Output:
    -45
    +116
     Machina0: ONE
     Machina0: TWO
     Machina0: THREE
     Machina0: complete
     Machina0: complete
    -463
    +552
     */
    diff --git a/concurrent/CompletableApplyChained.java b/concurrent/CompletableApplyChained.java
    index c3e71fb0a..acb6f8a7c 100644
    --- a/concurrent/CompletableApplyChained.java
    +++ b/concurrent/CompletableApplyChained.java
    @@ -23,5 +23,5 @@ public static void main(String[] args) {
     Machina0: TWO
     Machina0: THREE
     Machina0: complete
    -452
    +514
     */
    diff --git a/concurrent/CompletableOperations.java b/concurrent/CompletableOperations.java
    index 1e29b5746..745b2bb38 100644
    --- a/concurrent/CompletableOperations.java
    +++ b/concurrent/CompletableOperations.java
    @@ -66,8 +66,8 @@ public static void main(String[] args) {
     cancelled: true
     completed exceptionally: true
     done: true
    -java.util.concurrent.CompletableFuture@6d311334[Completed
    -exceptionally]
    +java.util.concurrent.CompletableFuture@6d311334[Complet
    +ed exceptionally]
     777
     dependents: 1
     dependents: 2
    diff --git a/concurrent/CompletablePizza.java b/concurrent/CompletablePizza.java
    index 9eb936de8..f81391d2b 100644
    --- a/concurrent/CompletablePizza.java
    +++ b/concurrent/CompletablePizza.java
    @@ -42,46 +42,46 @@ public static void main(String[] args) {
       }
     }
     /* Output:
    -69
    +169
     Pizza 0: ROLLED
     Pizza 1: ROLLED
     Pizza 2: ROLLED
    +Pizza 4: ROLLED
    +Pizza 3: ROLLED
     Pizza 1: SAUCED
     Pizza 0: SAUCED
     Pizza 2: SAUCED
    +Pizza 4: SAUCED
    +Pizza 3: SAUCED
     Pizza 0: CHEESED
    +Pizza 4: CHEESED
     Pizza 1: CHEESED
     Pizza 2: CHEESED
    -Pizza 4: ROLLED
    -Pizza 3: ROLLED
    +Pizza 3: CHEESED
     Pizza 0: TOPPED
    -Pizza 3: SAUCED
    +Pizza 4: TOPPED
     Pizza 1: TOPPED
    -Pizza 3: CHEESED
    -Pizza 4: SAUCED
     Pizza 2: TOPPED
     Pizza 3: TOPPED
     Pizza 0: BAKED
    +Pizza 4: BAKED
     Pizza 1: BAKED
    -Pizza 4: CHEESED
     Pizza 3: BAKED
    +Pizza 2: BAKED
     Pizza 0: SLICED
    -Pizza 3: SLICED
    -Pizza 3: BOXED
    +Pizza 4: SLICED
     Pizza 1: SLICED
    -Pizza 2: BAKED
    +Pizza 3: SLICED
    +Pizza 2: SLICED
    +Pizza 4: BOXED
     Pizza 0: BOXED
     Pizza0: complete
     Pizza 1: BOXED
     Pizza1: complete
    -Pizza 4: TOPPED
    -Pizza 2: SLICED
    +Pizza 3: BOXED
     Pizza 2: BOXED
     Pizza2: complete
     Pizza3: complete
    -Pizza 4: BAKED
    -Pizza 4: SLICED
    -Pizza 4: BOXED
     Pizza4: complete
    -3269
    +1797
     */
    diff --git a/concurrent/CountingStream.java b/concurrent/CountingStream.java
    index 73392a219..ca55bffe4 100644
    --- a/concurrent/CountingStream.java
    +++ b/concurrent/CountingStream.java
    @@ -17,15 +17,15 @@ public static void main(String[] args) {
       }
     }
     /* Output:
    -2 ForkJoinPool.commonPool-worker-1 100
    +1 ForkJoinPool.commonPool-worker-3 100
     8 ForkJoinPool.commonPool-worker-2 100
    -4 ForkJoinPool.commonPool-worker-1 100
    -3 ForkJoinPool.commonPool-worker-1 100
    -7 ForkJoinPool.commonPool-worker-1 100
    -0 ForkJoinPool.commonPool-worker-1 100
    -5 ForkJoinPool.commonPool-worker-1 100
    +0 ForkJoinPool.commonPool-worker-6 100
    +2 ForkJoinPool.commonPool-worker-1 100
    +4 ForkJoinPool.commonPool-worker-5 100
    +9 ForkJoinPool.commonPool-worker-7 100
     6 main 100
    -1 ForkJoinPool.commonPool-worker-3 100
    -9 ForkJoinPool.commonPool-worker-2 100
    +7 ForkJoinPool.commonPool-worker-4 100
    +5 ForkJoinPool.commonPool-worker-2 100
    +3 ForkJoinPool.commonPool-worker-3 100
     1000
     */
    diff --git a/concurrent/DualCompletableOperations.java b/concurrent/DualCompletableOperations.java
    index db092064e..71eb4dab2 100644
    --- a/concurrent/DualCompletableOperations.java
    +++ b/concurrent/DualCompletableOperations.java
    @@ -102,12 +102,14 @@ public static void main(String[] args) {
     *****************
     Workable[CW]
     anyOf
    +Workable[DW]
     Workable[BW]
     Workable[AW]
     *****************
    +Workable[CW]
     Workable[DW]
     Workable[BW]
    -Workable[CW]
     Workable[AW]
     *****************
    +allOf
     */
    diff --git a/concurrent/LambdasAndMethodReferences.java b/concurrent/LambdasAndMethodReferences.java
    index a9561e92d..08316a986 100644
    --- a/concurrent/LambdasAndMethodReferences.java
    +++ b/concurrent/LambdasAndMethodReferences.java
    @@ -34,7 +34,7 @@ public static void main(String[] args)
     }
     /* Output:
     Lambda1
    +NotCallable
     NotRunnable
     Lambda2
    -NotCallable
     */
    diff --git a/concurrent/MoreTasksAfterShutdown.java b/concurrent/MoreTasksAfterShutdown.java
    index ff22fa570..56b925ea6 100644
    --- a/concurrent/MoreTasksAfterShutdown.java
    +++ b/concurrent/MoreTasksAfterShutdown.java
    @@ -19,9 +19,9 @@ public static void main(String[] args) {
     }
     /* Output:
     java.util.concurrent.RejectedExecutionException: Task
    -NapTask[99] rejected from
    -java.util.concurrent.ThreadPoolExecutor@4e25154f[Shutting
    -down, pool size = 1, active threads = 1, queued tasks = 0,
    -completed tasks = 0]
    +NapTask[99] rejected from java.util.concurrent.ThreadPo
    +olExecutor@4e25154f[Shutting down, pool size = 1,
    +active threads = 1, queued tasks = 0, completed tasks =
    +0]
     NapTask[1] pool-1-thread-1
     */
    diff --git a/concurrent/OnePizza.java b/concurrent/OnePizza.java
    index 5f00ff9a0..265b2b419 100644
    --- a/concurrent/OnePizza.java
    +++ b/concurrent/OnePizza.java
    @@ -22,5 +22,5 @@ public static void main(String[] args) {
     Pizza 0: BAKED
     Pizza 0: SLICED
     Pizza 0: BOXED
    -1605
    +1622
     */
    diff --git a/concurrent/ParallelPrime.java b/concurrent/ParallelPrime.java
    index f8c3a0647..1359ebf58 100644
    --- a/concurrent/ParallelPrime.java
    +++ b/concurrent/ParallelPrime.java
    @@ -31,5 +31,5 @@ public static void main(String[] args)
       }
     }
     /* Output:
    -1197
    +1224
     */
    diff --git a/concurrent/ParallelStreamPuzzle.java b/concurrent/ParallelStreamPuzzle.java
    index a7fb49142..bf3a9dfa3 100644
    --- a/concurrent/ParallelStreamPuzzle.java
    +++ b/concurrent/ParallelStreamPuzzle.java
    @@ -24,5 +24,5 @@ public static void main(String[] args) {
       }
     }
     /* Output:
    -[1, 28, 30, 33, 36, 39, 42, 44, 46, 48]
    +[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
     */
    diff --git a/concurrent/ParallelStreamPuzzle2.java b/concurrent/ParallelStreamPuzzle2.java
    index de81c8517..b02baafaf 100644
    --- a/concurrent/ParallelStreamPuzzle2.java
    +++ b/concurrent/ParallelStreamPuzzle2.java
    @@ -34,5 +34,5 @@ public Integer get() {
       }
     }
     /* Output:
    -[3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
    +[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
     */
    diff --git a/concurrent/PizzaParallelSteps.java b/concurrent/PizzaParallelSteps.java
    index 394c6e3fd..a289da367 100644
    --- a/concurrent/PizzaParallelSteps.java
    +++ b/concurrent/PizzaParallelSteps.java
    @@ -25,45 +25,45 @@ public static void main(String[] args) {
       }
     }
     /* Output:
    +Pizza 2: ROLLED
     Pizza 0: ROLLED
    -Pizza 4: ROLLED
     Pizza 1: ROLLED
    -Pizza 2: ROLLED
    -Pizza 2: SAUCED
    -Pizza 0: SAUCED
    +Pizza 4: ROLLED
    +Pizza 3: ROLLED
     Pizza 1: SAUCED
    +Pizza 0: SAUCED
    +Pizza 2: SAUCED
    +Pizza 3: SAUCED
     Pizza 4: SAUCED
    +Pizza 1: CHEESED
     Pizza 0: CHEESED
    -Pizza 4: CHEESED
     Pizza 2: CHEESED
    -Pizza 1: CHEESED
    -Pizza 1: TOPPED
    +Pizza 3: CHEESED
    +Pizza 4: CHEESED
    +Pizza 0: TOPPED
     Pizza 2: TOPPED
    +Pizza 1: TOPPED
    +Pizza 3: TOPPED
     Pizza 4: TOPPED
    -Pizza 0: TOPPED
    +Pizza 1: BAKED
    +Pizza 2: BAKED
     Pizza 0: BAKED
     Pizza 4: BAKED
    -Pizza 2: BAKED
    -Pizza 1: BAKED
    +Pizza 3: BAKED
     Pizza 0: SLICED
     Pizza 2: SLICED
    -Pizza 4: SLICED
     Pizza 1: SLICED
    -Pizza 4: BOXED
    +Pizza 3: SLICED
    +Pizza 4: SLICED
    +Pizza 1: BOXED
    +Pizza1: complete
     Pizza 2: BOXED
    -Pizza2: complete
     Pizza 0: BOXED
    +Pizza2: complete
     Pizza0: complete
    -Pizza4: complete
    -Pizza 1: BOXED
    -Pizza1: complete
    -Pizza 3: ROLLED
    -Pizza 3: SAUCED
    -Pizza 3: CHEESED
    -Pizza 3: TOPPED
    -Pizza 3: BAKED
    -Pizza 3: SLICED
     Pizza 3: BOXED
    +Pizza 4: BOXED
    +Pizza4: complete
     Pizza3: complete
    -3279
    +1738
     */
    diff --git a/concurrent/PizzaStreams.java b/concurrent/PizzaStreams.java
    index e782d9ec7..6d3e5f29e 100644
    --- a/concurrent/PizzaStreams.java
    +++ b/concurrent/PizzaStreams.java
    @@ -21,40 +21,40 @@ public static void main(String[] args) {
       }
     }
     /* Output:
    -Pizza 1: ROLLED
    -Pizza 4: ROLLED
     Pizza 2: ROLLED
     Pizza 0: ROLLED
    +Pizza 1: ROLLED
    +Pizza 4: ROLLED
    +Pizza 3: ROLLED
     Pizza 2: SAUCED
    -Pizza 4: SAUCED
     Pizza 1: SAUCED
     Pizza 0: SAUCED
    +Pizza 4: SAUCED
    +Pizza 3: SAUCED
     Pizza 2: CHEESED
    -Pizza 4: CHEESED
    -Pizza 0: CHEESED
     Pizza 1: CHEESED
    +Pizza 0: CHEESED
    +Pizza 4: CHEESED
    +Pizza 3: CHEESED
     Pizza 2: TOPPED
    -Pizza 4: TOPPED
    -Pizza 0: TOPPED
     Pizza 1: TOPPED
    -Pizza 4: BAKED
    +Pizza 0: TOPPED
    +Pizza 4: TOPPED
    +Pizza 3: TOPPED
     Pizza 2: BAKED
     Pizza 1: BAKED
     Pizza 0: BAKED
    +Pizza 4: BAKED
    +Pizza 3: BAKED
     Pizza 2: SLICED
    -Pizza 4: SLICED
     Pizza 1: SLICED
     Pizza 0: SLICED
    +Pizza 4: SLICED
    +Pizza 3: SLICED
     Pizza 2: BOXED
    -Pizza 4: BOXED
    -Pizza 0: BOXED
     Pizza 1: BOXED
    -Pizza 3: ROLLED
    -Pizza 3: SAUCED
    -Pizza 3: CHEESED
    -Pizza 3: TOPPED
    -Pizza 3: BAKED
    -Pizza 3: SLICED
    +Pizza 0: BOXED
    +Pizza 4: BOXED
     Pizza 3: BOXED
    -3275
    +1739
     */
    diff --git a/concurrent/QuittingCompletable.java b/concurrent/QuittingCompletable.java
    index 0de45e2e9..e57ec0f31 100644
    --- a/concurrent/QuittingCompletable.java
    +++ b/concurrent/QuittingCompletable.java
    @@ -23,13 +23,13 @@ public static void main(String[] args) {
       }
     }
     /* Output:
    -1 3 4 5 6 2 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
    -24 25 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 52 53 54 55 56 57 58 59 60 61 62 63
    -64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83
    -84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102
    -103 104 105 106 107 108 109 110 111 112 113 114 115 116 117
    -118 119 120 121 122 123 124 7 126 127 128 129 130 131 132
    -133 134 135 136 137 138 139 140 141 142 143 144 145 146 147
    -148 149 125
    +7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
    +26 27 28 29 30 31 32 33 34 6 35 4 38 39 40 41 42 43 44
    +45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62
    +63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80
    +81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98
    +99 100 101 102 103 104 105 106 107 108 109 110 111 112
    +1 113 114 116 117 118 119 120 121 122 123 124 125 126
    +127 128 129 130 131 132 133 134 135 136 137 138 139 140
    +141 142 143 144 145 146 147 148 149 5 115 37 36 2 3
     */
    diff --git a/concurrent/QuittingTasks.java b/concurrent/QuittingTasks.java
    index 330f36690..dc863f426 100644
    --- a/concurrent/QuittingTasks.java
    +++ b/concurrent/QuittingTasks.java
    @@ -23,13 +23,13 @@ public static void main(String[] args) {
       }
     }
     /* Output:
    -2 33 32 28 31 30 26 29 27 22 1 25 4 23 24 6 5 7 3 8 10 9 12
    -11 21 17 13 14 15 16 18 19 20 39 34 36 37 35 38 40 52 57 53
    -54 95 88 89 91 84 90 87 85 92 86 77 94 80 81 78 59 55 71 74
    -60 58 76 79 62 83 63 82 61 64 68 65 72 69 67 66 47 75 73 49
    -45 70 42 44 51 41 43 50 46 48 56 123 126 119 120 127 121
    -114 117 99 116 115 129 96 145 142 143 148 93 140 125 139
    -124 147 101 141 128 133 100 135 137 130 144 134 146 131 149
    -138 113 132 110 109 111 105 118 97 122 107 98 102 104 103
    -106 112 108 136
    +24 27 31 8 11 7 19 12 16 4 23 3 28 32 15 20 63 60 68 67
    +64 39 47 52 51 55 40 43 48 59 44 56 36 35 71 72 83 103
    +96 92 88 99 100 87 91 79 75 84 76 115 108 112 104 107
    +111 95 80 147 120 127 119 123 144 143 116 132 124 128
    +136 131 135 139 148 140 2 126 6 5 1 18 129 17 14 13 21
    +22 9 10 30 33 58 37 125 26 34 133 145 78 137 141 138 62
    +74 142 86 65 73 146 70 42 149 121 110 134 105 82 117
    +106 113 122 45 114 118 38 50 29 90 101 89 57 53 94 41
    +61 66 130 69 77 81 85 93 25 102 54 109 98 49 46 97
     */
    diff --git a/concurrent/SharedConstructorArgument.java b/concurrent/SharedConstructorArgument.java
    index f59406c8c..df8ec4574 100644
    --- a/concurrent/SharedConstructorArgument.java
    +++ b/concurrent/SharedConstructorArgument.java
    @@ -39,6 +39,6 @@ public static void main(String[] args) {
       }
     }
     /* Output:
    -48627
    +24838
     0
     */
    diff --git a/concurrent/SingleThreadExecutor.java b/concurrent/SingleThreadExecutor.java
    index 9366283d5..58047d26a 100644
    --- a/concurrent/SingleThreadExecutor.java
    +++ b/concurrent/SingleThreadExecutor.java
    @@ -32,14 +32,14 @@ public static void main(String[] args) {
     NapTask[1] pool-1-thread-1
     main awaiting termination
     NapTask[2] pool-1-thread-1
    -NapTask[3] pool-1-thread-1
     main awaiting termination
    +NapTask[3] pool-1-thread-1
     main awaiting termination
     NapTask[4] pool-1-thread-1
     main awaiting termination
     NapTask[5] pool-1-thread-1
    -NapTask[6] pool-1-thread-1
     main awaiting termination
    +NapTask[6] pool-1-thread-1
     main awaiting termination
     NapTask[7] pool-1-thread-1
     main awaiting termination
    diff --git a/concurrent/Summing.java b/concurrent/Summing.java
    index aa500e184..8f44563e1 100644
    --- a/concurrent/Summing.java
    +++ b/concurrent/Summing.java
    @@ -41,7 +41,7 @@ public static void main(String[] args) {
     }
     /* Output:
     5000000050000000
    -Sum Stream: 62ms
    -Sum Stream Parallel: 42ms
    -Sum Iterated: 116ms
    +Sum Stream: 167ms
    +Sum Stream Parallel: 46ms
    +Sum Iterated: 284ms
     */
    diff --git a/concurrent/Summing4.java b/concurrent/Summing4.java
    index 2ecfbf1b5..d48e16acc 100644
    --- a/concurrent/Summing4.java
    +++ b/concurrent/Summing4.java
    @@ -12,7 +12,9 @@ public static void main(String[] args) {
         Arrays.parallelSetAll(aL, i -> (long)i);
         Summing.timeTest("Long Parallel",
           Summing3.CHECK, () ->
    -      Arrays.stream(aL).parallel().reduce(0L,Long::sum));
    +      Arrays.stream(aL)
    +        .parallel()
    +        .reduce(0L,Long::sum));
       }
     }
     /* Output:
    diff --git a/concurrent/TestStaticIDField.java b/concurrent/TestStaticIDField.java
    index c042ddec0..772958aad 100644
    --- a/concurrent/TestStaticIDField.java
    +++ b/concurrent/TestStaticIDField.java
    @@ -9,5 +9,5 @@ public static void main(String[] args) {
       }
     }
     /* Output:
    -47829
    +13287
     */
    diff --git a/control/LabeledFor.java b/control/LabeledFor.java
    index 337a9e199..7535b2163 100644
    --- a/control/LabeledFor.java
    +++ b/control/LabeledFor.java
    @@ -2,7 +2,7 @@
     // (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
    -// For loops with "labeled break" and "labeled continue."
    +// For loops with "labeled break"/"labeled continue."
     
     public class LabeledFor {
       public static void main(String[] args) {
    diff --git a/control/VowelsAndConsonants.java b/control/VowelsAndConsonants.java
    index f8a9b1968..79ea2bfc5 100644
    --- a/control/VowelsAndConsonants.java
    +++ b/control/VowelsAndConsonants.java
    @@ -19,7 +19,7 @@ public static void main(String[] args) {
             case 'u': System.out.println("vowel");
                       break;
             case 'y':
    -        case 'w': System.out.println("Sometimes a vowel");
    +        case 'w': System.out.println("Sometimes vowel");
                       break;
             default:  System.out.println("consonant");
           }
    @@ -27,18 +27,18 @@ public static void main(String[] args) {
       }
     }
     /* Output: (First 13 Lines)
    -y, 121: Sometimes a vowel
    +y, 121: Sometimes vowel
     n, 110: consonant
     z, 122: consonant
     b, 98: consonant
     r, 114: consonant
     n, 110: consonant
    -y, 121: Sometimes a vowel
    +y, 121: Sometimes vowel
     g, 103: consonant
     c, 99: consonant
     f, 102: consonant
     o, 111: vowel
    -w, 119: Sometimes a vowel
    +w, 119: Sometimes vowel
     z, 122: consonant
                       ...
     */
    diff --git a/enums/BigEnumSet.java b/enums/BigEnumSet.java
    index ee4abd6f5..1c0544640 100644
    --- a/enums/BigEnumSet.java
    +++ b/enums/BigEnumSet.java
    @@ -5,13 +5,14 @@
     import java.util.*;
     
     public class BigEnumSet {
    -  enum Big { A0, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10,
    -    A11, A12, A13, A14, A15, A16, A17, A18, A19, A20, A21,
    -    A22, A23, A24, A25, A26, A27, A28, A29, A30, A31, A32,
    -    A33, A34, A35, A36, A37, A38, A39, A40, A41, A42, A43,
    -    A44, A45, A46, A47, A48, A49, A50, A51, A52, A53, A54,
    -    A55, A56, A57, A58, A59, A60, A61, A62, A63, A64, A65,
    -    A66, A67, A68, A69, A70, A71, A72, A73, A74, A75 }
    +  enum Big { A0, A1, A2, A3, A4, A5, A6, A7, A8, A9,
    +    A10, A11, A12, A13, A14, A15, A16, A17, A18, A19,
    +    A20, A21, A22, A23, A24, A25, A26, A27, A28, A29,
    +    A30, A31, A32, A33, A34, A35, A36, A37, A38, A39,
    +    A40, A41, A42, A43, A44, A45, A46, A47, A48, A49,
    +    A50, A51, A52, A53, A54, A55, A56, A57, A58, A59,
    +    A60, A61, A62, A63, A64, A65, A66, A67, A68, A69,
    +    A70, A71, A72, A73, A74, A75 }
       public static void main(String[] args) {
         EnumSet bigEnumSet = EnumSet.allOf(Big.class);
         System.out.println(bigEnumSet);
    @@ -19,10 +20,10 @@ public static void main(String[] args) {
     }
     /* Output:
     [A0, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12,
    -A13, A14, A15, A16, A17, A18, A19, A20, A21, A22, A23, A24,
    -A25, A26, A27, A28, A29, A30, A31, A32, A33, A34, A35, A36,
    -A37, A38, A39, A40, A41, A42, A43, A44, A45, A46, A47, A48,
    -A49, A50, A51, A52, A53, A54, A55, A56, A57, A58, A59, A60,
    -A61, A62, A63, A64, A65, A66, A67, A68, A69, A70, A71, A72,
    -A73, A74, A75]
    +A13, A14, A15, A16, A17, A18, A19, A20, A21, A22, A23,
    +A24, A25, A26, A27, A28, A29, A30, A31, A32, A33, A34,
    +A35, A36, A37, A38, A39, A40, A41, A42, A43, A44, A45,
    +A46, A47, A48, A49, A50, A51, A52, A53, A54, A55, A56,
    +A57, A58, A59, A60, A61, A62, A63, A64, A65, A66, A67,
    +A68, A69, A70, A71, A72, A73, A74, A75]
     */
    diff --git a/enums/ConstantSpecificMethod.java b/enums/ConstantSpecificMethod.java
    index d1df6af14..c8f6ef0ff 100644
    --- a/enums/ConstantSpecificMethod.java
    +++ b/enums/ConstantSpecificMethod.java
    @@ -33,8 +33,9 @@ public static void main(String[] args) {
       }
     }
     /* Output:
    -May 2, 2017
    -C:\Users\bruce\Documents\Git\on-
    -java\ExtractedExamples\\gradle\wrapper\gradle-wrapper.jar
    -1.8.0_102
    +May 9, 2017
    +C:\Users\Bruce\Documents\GitHub\on-
    +java\ExtractedExamples\\gradle\wrapper\gradle-
    +wrapper.jar
    +1.8.0_112
     */
    diff --git a/enums/EnumClass.java b/enums/EnumClass.java
    index 96eebb9ee..1999c6f43 100644
    --- a/enums/EnumClass.java
    +++ b/enums/EnumClass.java
    @@ -9,7 +9,8 @@ enum Shrubbery { GROUND, CRAWLING, HANGING }
     public class EnumClass {
       public static void main(String[] args) {
         for(Shrubbery s : Shrubbery.values()) {
    -      System.out.println(s + " ordinal: " + s.ordinal());
    +      System.out.println(
    +        s + " ordinal: " + s.ordinal());
           System.out.print(
             s.compareTo(Shrubbery.CRAWLING) + " ");
           System.out.print(
    @@ -17,11 +18,13 @@ public static void main(String[] args) {
           System.out.println(s == Shrubbery.CRAWLING);
           System.out.println(s.getDeclaringClass());
           System.out.println(s.name());
    -      System.out.println("----------------------");
    +      System.out.println("********************");
         }
         // Produce an enum value from a String name:
    -    for(String s : "HANGING CRAWLING GROUND".split(" ")) {
    -      Shrubbery shrub = Enum.valueOf(Shrubbery.class, s);
    +    for(String s :
    +        "HANGING CRAWLING GROUND".split(" ")) {
    +      Shrubbery shrub =
    +        Enum.valueOf(Shrubbery.class, s);
           System.out.println(shrub);
         }
       }
    @@ -31,17 +34,17 @@ public static void main(String[] args) {
     -1 false false
     class Shrubbery
     GROUND
    -----------------------
    +********************
     CRAWLING ordinal: 1
     0 true true
     class Shrubbery
     CRAWLING
    -----------------------
    +********************
     HANGING ordinal: 2
     1 false false
     class Shrubbery
     HANGING
    -----------------------
    +********************
     HANGING
     CRAWLING
     GROUND
    diff --git a/enums/EnumMaps.java b/enums/EnumMaps.java
    index f2398e8ae..79b5e6c88 100644
    --- a/enums/EnumMaps.java
    +++ b/enums/EnumMaps.java
    @@ -18,7 +18,8 @@ public static void main(String[] args) {
           () -> System.out.println("Kitchen fire!"));
         em.put(BATHROOM,
           () -> System.out.println("Bathroom alert!"));
    -    for(Map.Entry e: em.entrySet()) {
    +    for(Map.Entry e:
    +        em.entrySet()) {
           System.out.print(e.getKey() + ": ");
           e.getValue().action();
         }
    diff --git a/enums/PostOffice.java b/enums/PostOffice.java
    index 465268044..2209d9ac7 100644
    --- a/enums/PostOffice.java
    +++ b/enums/PostOffice.java
    @@ -145,53 +145,53 @@ public static void main(String[] args) {
     }
     /* Output:
     Mail 0, General Delivery: NO2, Address Scanability:
    -UNSCANNABLE, Address Readability: YES3, Address Address:
    -OK1, Return address: OK1
    +UNSCANNABLE, Address Readability: YES3, Address
    +Address: OK1, Return address: OK1
     Delivering Mail 0 normally
     *****
    -Mail 1, General Delivery: NO5, Address Scanability: YES3,
    -Address Readability: ILLEGIBLE, Address Address: OK5,
    -Return address: OK1
    +Mail 1, General Delivery: NO5, Address Scanability:
    +YES3, Address Readability: ILLEGIBLE, Address Address:
    +OK5, Return address: OK1
     Delivering Mail 1 automatically
     *****
    -Mail 2, General Delivery: YES, Address Scanability: YES3,
    -Address Readability: YES1, Address Address: OK1, Return
    -address: OK5
    +Mail 2, General Delivery: YES, Address Scanability:
    +YES3, Address Readability: YES1, Address Address: OK1,
    +Return address: OK5
     Using general delivery for Mail 2
     *****
    -Mail 3, General Delivery: NO4, Address Scanability: YES3,
    -Address Readability: YES1, Address Address: INCORRECT,
    -Return address: OK4
    +Mail 3, General Delivery: NO4, Address Scanability:
    +YES3, Address Readability: YES1, Address Address:
    +INCORRECT, Return address: OK4
     Returning Mail 3 to sender
     *****
     Mail 4, General Delivery: NO4, Address Scanability:
    -UNSCANNABLE, Address Readability: YES1, Address Address:
    -INCORRECT, Return address: OK2
    +UNSCANNABLE, Address Readability: YES1, Address
    +Address: INCORRECT, Return address: OK2
     Returning Mail 4 to sender
     *****
    -Mail 5, General Delivery: NO3, Address Scanability: YES1,
    -Address Readability: ILLEGIBLE, Address Address: OK4,
    -Return address: OK2
    +Mail 5, General Delivery: NO3, Address Scanability:
    +YES1, Address Readability: ILLEGIBLE, Address Address:
    +OK4, Return address: OK2
     Delivering Mail 5 automatically
     *****
    -Mail 6, General Delivery: YES, Address Scanability: YES4,
    -Address Readability: ILLEGIBLE, Address Address: OK4,
    -Return address: OK4
    +Mail 6, General Delivery: YES, Address Scanability:
    +YES4, Address Readability: ILLEGIBLE, Address Address:
    +OK4, Return address: OK4
     Using general delivery for Mail 6
     *****
    -Mail 7, General Delivery: YES, Address Scanability: YES3,
    -Address Readability: YES4, Address Address: OK2, Return
    -address: MISSING
    +Mail 7, General Delivery: YES, Address Scanability:
    +YES3, Address Readability: YES4, Address Address: OK2,
    +Return address: MISSING
     Using general delivery for Mail 7
     *****
    -Mail 8, General Delivery: NO3, Address Scanability: YES1,
    -Address Readability: YES3, Address Address: INCORRECT,
    -Return address: MISSING
    +Mail 8, General Delivery: NO3, Address Scanability:
    +YES1, Address Readability: YES3, Address Address:
    +INCORRECT, Return address: MISSING
     Mail 8 is a dead letter
     *****
     Mail 9, General Delivery: NO1, Address Scanability:
    -UNSCANNABLE, Address Readability: YES2, Address Address:
    -OK1, Return address: OK4
    +UNSCANNABLE, Address Readability: YES2, Address
    +Address: OK1, Return address: OK4
     Delivering Mail 9 normally
     *****
     */
    diff --git a/enums/Reflection.java b/enums/Reflection.java
    index 479d23e75..92799a941 100644
    --- a/enums/Reflection.java
    +++ b/enums/Reflection.java
    @@ -10,9 +10,10 @@
     enum Explore { HERE, THERE }
     
     public class Reflection {
    -  public static Set analyze(Class enumClass) {
    +  public static
    +  Set analyze(Class enumClass) {
         System.out.println(
    -      "----- Analyzing " + enumClass + " -----");
    +      "_____ Analyzing " + enumClass + " _____");
         System.out.println("Interfaces:");
         for(Type t : enumClass.getGenericInterfaces())
           System.out.println(t);
    @@ -41,21 +42,22 @@ public static void main(String[] args) {
       }
     }
     /* Output:
    ------ Analyzing class Explore -----
    +_____ Analyzing class Explore _____
     Interfaces:
     Base: class java.lang.Enum
     Methods:
    -[compareTo, equals, getClass, getDeclaringClass, hashCode,
    -name, notify, notifyAll, ordinal, toString, valueOf,
    -values, wait]
    ------ Analyzing class java.lang.Enum -----
    +[compareTo, equals, getClass, getDeclaringClass,
    +hashCode, name, notify, notifyAll, ordinal, toString,
    +valueOf, values, wait]
    +_____ Analyzing class java.lang.Enum _____
     Interfaces:
     java.lang.Comparable
     interface java.io.Serializable
     Base: class java.lang.Object
     Methods:
    -[compareTo, equals, getClass, getDeclaringClass, hashCode,
    -name, notify, notifyAll, ordinal, toString, valueOf, wait]
    +[compareTo, equals, getClass, getDeclaringClass,
    +hashCode, name, notify, notifyAll, ordinal, toString,
    +valueOf, wait]
     Explore.containsAll(Enum)? true
     Explore.removeAll(Enum): [values]
     Compiled from "Reflection.java"
    diff --git a/enums/RoShamBo2.java b/enums/RoShamBo2.java
    index 45ae33626..db52d4589 100644
    --- a/enums/RoShamBo2.java
    +++ b/enums/RoShamBo2.java
    @@ -12,7 +12,8 @@ public enum RoShamBo2 implements Competitor {
       SCISSORS(WIN, DRAW, LOSE),
       ROCK(LOSE, WIN, DRAW);
       private Outcome vPAPER, vSCISSORS, vROCK;
    -  RoShamBo2(Outcome paper,Outcome scissors,Outcome rock) {
    +  RoShamBo2(Outcome paper,
    +    Outcome scissors, Outcome rock) {
         this.vPAPER = paper;
         this.vSCISSORS = scissors;
         this.vROCK = rock;
    diff --git a/enums/VendingMachine.java b/enums/VendingMachine.java
    index d1027e22f..fbc976df6 100644
    --- a/enums/VendingMachine.java
    +++ b/enums/VendingMachine.java
    @@ -101,7 +101,8 @@ void next(Input input) {
             "next(Input input) for non-transient states");
         }
         void next() {
    -      throw new RuntimeException("Only call next() for " +
    +      throw new RuntimeException(
    +        "Only call next() for " +
             "StateDuration.TRANSIENT states");
         }
         void output() { System.out.println(amount); }
    diff --git a/equalshashcode/ComposedEquality.java b/equalshashcode/ComposedEquality.java
    index f9faf9331..01fe792e3 100644
    --- a/equalshashcode/ComposedEquality.java
    +++ b/equalshashcode/ComposedEquality.java
    @@ -30,7 +30,8 @@ public ComposedEquality(int i, String s, double d) {
       public boolean equals(Object rval) {
         return rval instanceof ComposedEquality &&
           super.equals(rval) &&
    -      Objects.equals(part, ((ComposedEquality)rval).part);
    +      Objects.equals(part,
    +        ((ComposedEquality)rval).part);
       }
       public static void main(String[] args) {
         Equality.testAll( (i, s, d) ->
    diff --git a/equalshashcode/CountedString.java b/equalshashcode/CountedString.java
    index 3b0064d6b..f3c5823ec 100644
    --- a/equalshashcode/CountedString.java
    +++ b/equalshashcode/CountedString.java
    @@ -55,10 +55,10 @@ public static void main(String[] args) {
       }
     }
     /* Output:
    -{String: hi id: 4 hashCode(): 146450=3, String: hi id: 5
    -hashCode(): 146451=4, String: hi id: 2 hashCode():
    -146448=1, String: hi id: 3 hashCode(): 146449=2, String: hi
    -id: 1 hashCode(): 146447=0}
    +{String: hi id: 4 hashCode(): 146450=3, String: hi id:
    +5 hashCode(): 146451=4, String: hi id: 2 hashCode():
    +146448=1, String: hi id: 3 hashCode(): 146449=2,
    +String: hi id: 1 hashCode(): 146447=0}
     Looking up String: hi id: 1 hashCode(): 146447
     0
     Looking up String: hi id: 2 hashCode(): 146448
    diff --git a/equalshashcode/Equality.java b/equalshashcode/Equality.java
    index 07e37a41f..1565b33f8 100644
    --- a/equalshashcode/Equality.java
    +++ b/equalshashcode/Equality.java
    @@ -46,7 +46,8 @@ public static void testAll(EqualityFactory eqf) {
           neq = eqf.make(99, "Bob", 1.618);
         e.test("null", "false", null);
         e.test("same object", "true", e);
    -    e.test("different type", "false", Integer.valueOf(99));
    +    e.test("different type",
    +           "false", Integer.valueOf(99));
         e.test("same values", "true", eq);
         e.test("different values", "false", neq);
       }
    diff --git a/equalshashcode/SlowMap.java b/equalshashcode/SlowMap.java
    index 2add1e475..91c9967dd 100644
    --- a/equalshashcode/SlowMap.java
    +++ b/equalshashcode/SlowMap.java
    @@ -20,7 +20,7 @@ public V put(K key, V value) {
         return oldValue;
       }
       @Override
    -  public V get(Object key) { // key is type Object, not K
    +  public V get(Object key) { // key: type Object, not K
         if(!keys.contains(key))
           return null;
         return values.get(keys.indexOf(key));
    diff --git a/exceptions/Cleanup.java b/exceptions/Cleanup.java
    index 8854bc148..7eeebe32c 100644
    --- a/exceptions/Cleanup.java
    +++ b/exceptions/Cleanup.java
    @@ -20,7 +20,8 @@ public static void main(String[] args) {
             in.dispose();
           }
         } catch(Exception e) {
    -      System.out.println("InputFile construction failed");
    +      System.out.println(
    +        "InputFile construction failed");
         }
       }
     }
    diff --git a/exceptions/CleanupIdiom.java b/exceptions/CleanupIdiom.java
    index e4727258b..9b9e18668 100644
    --- a/exceptions/CleanupIdiom.java
    +++ b/exceptions/CleanupIdiom.java
    @@ -31,7 +31,8 @@ public static void main(String[] args) {
         }
     
         // [2]:
    -    // If construction cannot fail you can group objects:
    +    // If construction cannot fail,
    +    // you can group objects:
         NeedsCleanup nc2 = new NeedsCleanup();
         NeedsCleanup nc3 = new NeedsCleanup();
         try {
    diff --git a/exceptions/DynamicFields.java b/exceptions/DynamicFields.java
    index 297e8c0bd..dffc67166 100644
    --- a/exceptions/DynamicFields.java
    +++ b/exceptions/DynamicFields.java
    @@ -31,8 +31,8 @@ private int hasField(String id) {
             return i;
         return -1;
       }
    -  private int
    -  getFieldNumber(String id) throws NoSuchFieldException {
    +  private int getFieldNumber(String id)
    +  throws NoSuchFieldException {
         int fieldNum = hasField(id);
         if(fieldNum == -1)
           throw new NoSuchFieldException();
    @@ -61,9 +61,10 @@ private int makeField(String id) {
       public Object setField(String id, Object value)
       throws DynamicFieldsException {
         if(value == null) {
    -      // Most exceptions don't have a "cause" constructor.
    -      // In these cases you must use initCause(),
    -      // available in all Throwable subclasses.
    +      // Most exceptions don't have a "cause"
    +      // constructor. In these cases you must use
    +      // initCause(), available in all
    +      // Throwable subclasses.
           DynamicFieldsException dfe =
             new DynamicFieldsException();
           dfe.initCause(new NullPointerException());
    @@ -95,7 +96,8 @@ public static void main(String[] args) {
           System.out.println("df: " + df);
           System.out.println("df.getField(\"d\") : "
             + df.getField("d"));
    -      Object field = df.setField("d", null); // Exception
    +      Object field =
    +        df.setField("d", null); // Exception
         } catch(NoSuchFieldException |
                 DynamicFieldsException e) {
           e.printStackTrace(System.out);
    @@ -118,9 +120,11 @@ public static void main(String[] args) {
     
     df.getField("d") : A new value for d
     DynamicFieldsException
    -        at DynamicFields.setField(DynamicFields.java:64)
    -        at DynamicFields.main(DynamicFields.java:95)
    +        at
    +DynamicFields.setField(DynamicFields.java:65)
    +        at DynamicFields.main(DynamicFields.java:97)
     Caused by: java.lang.NullPointerException
    -        at DynamicFields.setField(DynamicFields.java:66)
    +        at
    +DynamicFields.setField(DynamicFields.java:67)
             ... 1 more
     */
    diff --git a/exceptions/ExceptionMethods.java b/exceptions/ExceptionMethods.java
    index a86d20cca..3220c1974 100644
    --- a/exceptions/ExceptionMethods.java
    +++ b/exceptions/ExceptionMethods.java
    @@ -27,5 +27,6 @@ public static void main(String[] args) {
     toString():java.lang.Exception: My Exception
     printStackTrace():
     java.lang.Exception: My Exception
    -        at ExceptionMethods.main(ExceptionMethods.java:7)
    +        at
    +ExceptionMethods.main(ExceptionMethods.java:7)
     */
    diff --git a/exceptions/ExtraFeatures.java b/exceptions/ExtraFeatures.java
    index 6cf69f427..57bb967b0 100644
    --- a/exceptions/ExtraFeatures.java
    +++ b/exceptions/ExtraFeatures.java
    @@ -22,15 +22,18 @@ public String getMessage() {
     
     public class ExtraFeatures {
       public static void f() throws MyException2 {
    -    System.out.println("Throwing MyException2 from f()");
    +    System.out.println(
    +      "Throwing MyException2 from f()");
         throw new MyException2();
       }
       public static void g() throws MyException2 {
    -    System.out.println("Throwing MyException2 from g()");
    +    System.out.println(
    +      "Throwing MyException2 from g()");
         throw new MyException2("Originated in g()");
       }
       public static void h() throws MyException2 {
    -    System.out.println("Throwing MyException2 from h()");
    +    System.out.println(
    +      "Throwing MyException2 from h()");
         throw new MyException2("Originated in h()", 47);
       }
       public static void main(String[] args) {
    @@ -55,15 +58,15 @@ public static void main(String[] args) {
     /* Output:
     Throwing MyException2 from f()
     MyException2: Detail Message: 0 null
    -        at ExtraFeatures.f(ExtraFeatures.java:23)
    -        at ExtraFeatures.main(ExtraFeatures.java:35)
    +        at ExtraFeatures.f(ExtraFeatures.java:24)
    +        at ExtraFeatures.main(ExtraFeatures.java:38)
     Throwing MyException2 from g()
     MyException2: Detail Message: 0 Originated in g()
    -        at ExtraFeatures.g(ExtraFeatures.java:27)
    -        at ExtraFeatures.main(ExtraFeatures.java:40)
    +        at ExtraFeatures.g(ExtraFeatures.java:29)
    +        at ExtraFeatures.main(ExtraFeatures.java:43)
     Throwing MyException2 from h()
     MyException2: Detail Message: 47 Originated in h()
    -        at ExtraFeatures.h(ExtraFeatures.java:31)
    -        at ExtraFeatures.main(ExtraFeatures.java:45)
    +        at ExtraFeatures.h(ExtraFeatures.java:34)
    +        at ExtraFeatures.main(ExtraFeatures.java:48)
     e.val() = 47
     */
    diff --git a/exceptions/FullConstructors.java b/exceptions/FullConstructors.java
    index 80c04657f..c67b4e2f5 100644
    --- a/exceptions/FullConstructors.java
    +++ b/exceptions/FullConstructors.java
    @@ -34,9 +34,11 @@ public static void main(String[] args) {
     Throwing MyException from f()
     MyException
             at FullConstructors.f(FullConstructors.java:11)
    -        at FullConstructors.main(FullConstructors.java:19)
    +        at
    +FullConstructors.main(FullConstructors.java:19)
     Throwing MyException from g()
     MyException: Originated in g()
             at FullConstructors.g(FullConstructors.java:15)
    -        at FullConstructors.main(FullConstructors.java:24)
    +        at
    +FullConstructors.main(FullConstructors.java:24)
     */
    diff --git a/exceptions/InheritingExceptions.java b/exceptions/InheritingExceptions.java
    index 72afe65ed..7a6a4dff2 100644
    --- a/exceptions/InheritingExceptions.java
    +++ b/exceptions/InheritingExceptions.java
    @@ -8,11 +8,13 @@ class SimpleException extends Exception {}
     
     public class InheritingExceptions {
       public void f() throws SimpleException {
    -    System.out.println("Throw SimpleException from f()");
    +    System.out.println(
    +      "Throw SimpleException from f()");
         throw new SimpleException();
       }
       public static void main(String[] args) {
    -    InheritingExceptions sed = new InheritingExceptions();
    +    InheritingExceptions sed =
    +      new InheritingExceptions();
         try {
           sed.f();
         } catch(SimpleException e) {
    diff --git a/exceptions/LoggingExceptions.java b/exceptions/LoggingExceptions.java
    index 0569c05bf..26e9be687 100644
    --- a/exceptions/LoggingExceptions.java
    +++ b/exceptions/LoggingExceptions.java
    @@ -33,13 +33,13 @@ public static void main(String[] args) {
     }
     /* Output:
     ___[ Error Output ]___
    -May 02, 2017 3:21:47 PM LoggingException 
    +May 09, 2017 6:07:17 AM LoggingException 
     SEVERE: LoggingException
             at
     LoggingExceptions.main(LoggingExceptions.java:20)
     
     Caught LoggingException
    -May 02, 2017 3:21:47 PM LoggingException 
    +May 09, 2017 6:07:17 AM LoggingException 
     SEVERE: LoggingException
             at
     LoggingExceptions.main(LoggingExceptions.java:25)
    diff --git a/exceptions/LoggingExceptions2.java b/exceptions/LoggingExceptions2.java
    index 11ebc7057..326c20089 100644
    --- a/exceptions/LoggingExceptions2.java
    +++ b/exceptions/LoggingExceptions2.java
    @@ -25,7 +25,7 @@ public static void main(String[] args) {
     }
     /* Output:
     ___[ Error Output ]___
    -May 02, 2017 3:21:47 PM LoggingExceptions2 logException
    +May 09, 2017 6:07:17 AM LoggingExceptions2 logException
     SEVERE: java.lang.NullPointerException
             at
     LoggingExceptions2.main(LoggingExceptions2.java:17)
    diff --git a/exceptions/NeverCaught.java b/exceptions/NeverCaught.java
    index 1999b4862..a584d0612 100644
    --- a/exceptions/NeverCaught.java
    +++ b/exceptions/NeverCaught.java
    @@ -18,8 +18,8 @@ public static void main(String[] args) {
     }
     /* Output:
     ___[ Error Output ]___
    -Exception in thread "main" java.lang.RuntimeException: From
    -f()
    +Exception in thread "main" java.lang.RuntimeException:
    +From f()
             at NeverCaught.f(NeverCaught.java:7)
             at NeverCaught.g(NeverCaught.java:10)
             at NeverCaught.main(NeverCaught.java:13)
    diff --git a/exceptions/TurnOffChecking.java b/exceptions/TurnOffChecking.java
    index 654ac285b..8412b5c8a 100644
    --- a/exceptions/TurnOffChecking.java
    +++ b/exceptions/TurnOffChecking.java
    @@ -11,7 +11,8 @@ void throwRuntimeException(int type) {
           switch(type) {
             case 0: throw new FileNotFoundException();
             case 1: throw new IOException();
    -        case 2: throw new RuntimeException("Where am I?");
    +        case 2: throw new
    +          RuntimeException("Where am I?");
             default: return;
           }
         } catch(IOException | RuntimeException e) {
    @@ -25,9 +26,11 @@ class SomeOtherException extends Exception {}
     
     public class TurnOffChecking {
       public static void main(String[] args) {
    -    WrapCheckedException wce = new WrapCheckedException();
    -    // You can call throwRuntimeException() without a try
    -    // block, and let RuntimeExceptions leave the method:
    +    WrapCheckedException wce =
    +      new WrapCheckedException();
    +    // You can call throwRuntimeException() without
    +    // a try block, and let RuntimeExceptions
    +    // leave the method:
         wce.throwRuntimeException(3);
         // Or you can choose to catch exceptions:
         for(int i = 0; i < 4; i++)
    @@ -37,7 +40,8 @@ public static void main(String[] args) {
             else
               throw new SomeOtherException();
           } catch(SomeOtherException e) {
    -          System.out.println("SomeOtherException: " + e);
    +          System.out.println(
    +            "SomeOtherException: " + e);
           } catch(RuntimeException re) {
             try {
               throw re.getCause();
    diff --git a/exceptions/WhoCalled.java b/exceptions/WhoCalled.java
    index f27a0bb6a..8e5f611c3 100644
    --- a/exceptions/WhoCalled.java
    +++ b/exceptions/WhoCalled.java
    @@ -18,20 +18,20 @@ static void f() {
       static void h() { g(); }
       public static void main(String[] args) {
         f();
    -    System.out.println("-------------------------------");
    +    System.out.println("*******");
         g();
    -    System.out.println("-------------------------------");
    +    System.out.println("*******");
         h();
       }
     }
     /* Output:
     f
     main
    --------------------------------
    +*******
     f
     g
     main
    --------------------------------
    +*******
     f
     g
     h
    diff --git a/files/AddAndSubtractPaths.java b/files/AddAndSubtractPaths.java
    index d913fada1..c13121bab 100644
    --- a/files/AddAndSubtractPaths.java
    +++ b/files/AddAndSubtractPaths.java
    @@ -53,35 +53,35 @@ public static void main(String[] args) {
     }
     /* Output:
     Windows 10
    -C:\Users\bruce\Documents\Git
    +C:\Users\Bruce\Documents\GitHub
     (1)r on-
     java\ExtractedExamples\files\AddAndSubtractPaths.java
    -RealPath: C:\Users\bruce\Documents\Git\on-
    +RealPath: C:\Users\Bruce\Documents\GitHub\on-
     java\ExtractedExamples\files\AddAndSubtractPaths.java
     (2)r on-java\ExtractedExamples\strings\..\files
    -RealPath: C:\Users\bruce\Documents\Git\on-
    +RealPath: C:\Users\Bruce\Documents\GitHub\on-
     java\ExtractedExamples\files
     (3)r on-java\ExtractedExamples\files
    -RealPath: C:\Users\bruce\Documents\Git\on-
    +RealPath: C:\Users\Bruce\Documents\GitHub\on-
     java\ExtractedExamples\files
     (4)  ..\..
    -RealPath: C:\Users\bruce\Documents\Git\on-java
    +RealPath: C:\Users\Bruce\Documents\GitHub\on-java
     (5)  ..\..
    -RealPath: C:\Users\bruce\Documents\Git\on-java
    +RealPath: C:\Users\Bruce\Documents\GitHub\on-java
     (6)r on-java
    -RealPath: C:\Users\bruce\Documents\Git\on-java
    +RealPath: C:\Users\Bruce\Documents\GitHub\on-java
     (7)r on-java\ExtractedExamples\files\.\..\..
    -RealPath: C:\Users\bruce\Documents\Git\on-java
    +RealPath: C:\Users\Bruce\Documents\GitHub\on-java
     (8)r on-java
    -RealPath: C:\Users\bruce\Documents\Git\on-java
    +RealPath: C:\Users\Bruce\Documents\GitHub\on-java
     (9)r on-java\ExtractedExamples\files
    -RealPath: C:\Users\bruce\Documents\Git\on-
    +RealPath: C:\Users\Bruce\Documents\GitHub\on-
     java\ExtractedExamples\files
     (10)r on-java\ExtractedExamples\strings
    -RealPath: C:\Users\bruce\Documents\Git\on-
    +RealPath: C:\Users\Bruce\Documents\GitHub\on-
     java\ExtractedExamples\strings
     (11)  nonexistent
     java.nio.file.NoSuchFileException:
    -C:\Users\bruce\Documents\Git\on-
    +C:\Users\Bruce\Documents\GitHub\on-
     java\ExtractedExamples\files\nonexistent
     */
    diff --git a/files/Directories.java b/files/Directories.java
    index b96d7365b..fe41a2321 100644
    --- a/files/Directories.java
    +++ b/files/Directories.java
    @@ -59,7 +59,7 @@ static void populateTestDir() throws Exception {
     test\bag
     test\bar
     test\baz
    -test\DIR_7205037124905635827
    +test\DIR_5142667942049986036
     test\foo
     test\Hello.txt
     *********
    @@ -68,27 +68,27 @@ static void populateTestDir() throws Exception {
     test\bag\foo
     test\bag\foo\bar
     test\bag\foo\bar\baz
    -test\bag\foo\bar\baz\4584994277735481362.tmp
    +test\bag\foo\bar\baz\8279660869874696036.tmp
     test\bag\foo\bar\baz\File.txt
     test\bar
     test\bar\baz
     test\bar\baz\bag
     test\bar\baz\bag\foo
    -test\bar\baz\bag\foo\4367937361263211140.tmp
    +test\bar\baz\bag\foo\1274043134240426261.tmp
     test\bar\baz\bag\foo\File.txt
     test\baz
     test\baz\bag
     test\baz\bag\foo
     test\baz\bag\foo\bar
    -test\baz\bag\foo\bar\7687116918707992631.tmp
    +test\baz\bag\foo\bar\6130572530014544105.tmp
     test\baz\bag\foo\bar\File.txt
    -test\DIR_7205037124905635827
    -test\DIR_7205037124905635827\pre9154379587817312624.non
    +test\DIR_5142667942049986036
    +test\DIR_5142667942049986036\pre7704286843227113253.non
     test\foo
     test\foo\bar
     test\foo\bar\baz
     test\foo\bar\baz\bag
    -test\foo\bar\baz\bag\7686121002327077993.tmp
    +test\foo\bar\baz\bag\5412864507741775436.tmp
     test\foo\bar\baz\bag\File.txt
     test\Hello.txt
     */
    diff --git a/files/FileSystemDemo.java b/files/FileSystemDemo.java
    index a1591b724..883c7537e 100644
    --- a/files/FileSystemDemo.java
    +++ b/files/FileSystemDemo.java
    @@ -27,8 +27,9 @@ public static void main(String[] args) {
     }
     /* Output:
     Windows 10
    -File Store: Teenyverse (C:)
    +File Store: SSD (C:)
     Root Directory: C:\
    +Root Directory: D:\
     Separator: \
     UserPrincipalLookupService:
     sun.nio.fs.WindowsFileSystem$LookupService$1@15db9742
    diff --git a/files/Find.java b/files/Find.java
    index fdc7e55e5..910b9443f 100644
    --- a/files/Find.java
    +++ b/files/Find.java
    @@ -36,24 +36,24 @@ public class Find {
       }
     }
     /* Output:
    -test\bag\foo\bar\baz\7676311745640921113.tmp
    +test\bag\foo\bar\baz\5208762845883213974.tmp
     test\bag\foo\bar\baz\File.txt
    -test\bar\baz\bag\foo\5150002287600428217.tmp
    +test\bar\baz\bag\foo\7918367201207778677.tmp
     test\bar\baz\bag\foo\File.txt
    -test\baz\bag\foo\bar\8782742629206515741.tmp
    +test\baz\bag\foo\bar\8016595521026696632.tmp
     test\baz\bag\foo\bar\File.txt
     test\dir.tmp
    -test\foo\bar\baz\bag\5650574120756265046.tmp
    +test\foo\bar\baz\bag\5832319279813617280.tmp
     test\foo\bar\baz\bag\File.txt
     ***************
    -7676311745640921113.tmp
    -5150002287600428217.tmp
    -8782742629206515741.tmp
    +5208762845883213974.tmp
    +7918367201207778677.tmp
    +8016595521026696632.tmp
     dir.tmp
    -5650574120756265046.tmp
    +5832319279813617280.tmp
     ***************
    -7676311745640921113.tmp
    -5150002287600428217.tmp
    -8782742629206515741.tmp
    -5650574120756265046.tmp
    +5208762845883213974.tmp
    +7918367201207778677.tmp
    +8016595521026696632.tmp
    +5832319279813617280.tmp
     */
    diff --git a/files/PartsOfPaths.java b/files/PartsOfPaths.java
    index 66be7823c..9f27e035c 100644
    --- a/files/PartsOfPaths.java
    +++ b/files/PartsOfPaths.java
    @@ -25,18 +25,18 @@ public static void main(String[] args) {
     /* Output:
     Windows 10
     Users
    -bruce
    +Bruce
     Documents
    -Git
    +GitHub
     on-java
     ExtractedExamples
     files
     PartsOfPaths.java
     ends with '.java': false
     Users: false : false
    -bruce: false : false
    +Bruce: false : false
     Documents: false : false
    -Git: false : false
    +GitHub: false : false
     on-java: false : false
     ExtractedExamples: false : false
     files: false : false
    diff --git a/files/PathAnalysis.java b/files/PathAnalysis.java
    index 163a89546..fc617639a 100644
    --- a/files/PathAnalysis.java
    +++ b/files/PathAnalysis.java
    @@ -47,10 +47,10 @@ static void say(String id, Object result) {
     Writable: true
     notExists: false
     Hidden: false
    -size: 1630
    -FileStore: Teenyverse (C:)
    -LastModified: : 2017-05-02T21:19:06.828604Z
    -Owner: TEENYVERSE\bruce (User)
    +size: 1631
    +FileStore: SSD (C:)
    +LastModified: : 2017-05-09T12:07:00.428366Z
    +Owner: MINDVIEWTOSHIBA\Bruce (User)
     ContentType: null
     SymbolicLink: false
     */
    diff --git a/files/PathInfo.java b/files/PathInfo.java
    index d2bf515fc..d963ee294 100644
    --- a/files/PathInfo.java
    +++ b/files/PathInfo.java
    @@ -20,7 +20,7 @@ static void info(Path p) {
         show("FileName", p.getFileName());
         show("Parent", p.getParent());
         show("Root", p.getRoot());
    -    System.out.println("----------------");
    +    System.out.println("******************");
       }
       public static void main(String[] args) {
         System.out.println(System.getProperty("os.name"));
    @@ -53,7 +53,7 @@ public static void main(String[] args) {
     FileName: NoFile.txt
     Parent: C:\path\to\nowhere
     Root: C:\
    -----------------
    +******************
     toString: PathInfo.java
     Exists: true
     RegularFile: true
    @@ -62,41 +62,41 @@ public static void main(String[] args) {
     FileName: PathInfo.java
     Parent: null
     Root: null
    -----------------
    -toString: C:\Users\bruce\Documents\Git\on-
    +******************
    +toString: C:\Users\Bruce\Documents\GitHub\on-
     java\ExtractedExamples\files\PathInfo.java
     Exists: true
     RegularFile: true
     Directory: false
     Absolute: true
     FileName: PathInfo.java
    -Parent: C:\Users\bruce\Documents\Git\on-
    +Parent: C:\Users\Bruce\Documents\GitHub\on-
     java\ExtractedExamples\files
     Root: C:\
    -----------------
    -toString: C:\Users\bruce\Documents\Git\on-
    +******************
    +toString: C:\Users\Bruce\Documents\GitHub\on-
     java\ExtractedExamples\files
     Exists: true
     RegularFile: false
     Directory: true
     Absolute: true
     FileName: files
    -Parent: C:\Users\bruce\Documents\Git\on-
    +Parent: C:\Users\Bruce\Documents\GitHub\on-
     java\ExtractedExamples
     Root: C:\
    -----------------
    -toString: C:\Users\bruce\Documents\Git\on-
    +******************
    +toString: C:\Users\Bruce\Documents\GitHub\on-
     java\ExtractedExamples\files\PathInfo.java
     Exists: true
     RegularFile: true
     Directory: false
     Absolute: true
     FileName: PathInfo.java
    -Parent: C:\Users\bruce\Documents\Git\on-
    +Parent: C:\Users\Bruce\Documents\GitHub\on-
     java\ExtractedExamples\files
     Root: C:\
    -----------------
    -URI: file:///C:/Users/bruce/Documents/Git/on-
    +******************
    +URI: file:///C:/Users/Bruce/Documents/GitHub/on-
     java/ExtractedExamples/files/PathInfo.java
     true
     */
    diff --git a/files/PathWatcher.java b/files/PathWatcher.java
    index c9ffdd8e1..3854ab72d 100644
    --- a/files/PathWatcher.java
    +++ b/files/PathWatcher.java
    @@ -2,6 +2,7 @@
     // (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
    +// {ValidateByHand}
     import java.io.IOException;
     import java.nio.file.*;
     import static java.nio.file.StandardWatchEventKinds.*;
    @@ -34,8 +35,10 @@ static void delTxtFiles() {
         WatchService watcher =
           FileSystems.getDefault().newWatchService();
         test.register(watcher, ENTRY_DELETE);
    -    Executors.newSingleThreadScheduledExecutor().schedule(
    -      PathWatcher::delTxtFiles,250,TimeUnit.MILLISECONDS);
    +    Executors.newSingleThreadScheduledExecutor()
    +      .schedule(
    +        PathWatcher::delTxtFiles,
    +        250, TimeUnit.MILLISECONDS);
         WatchKey key = watcher.take();
         for(WatchEvent evt : key.pollEvents()) {
           System.out.println(
    diff --git a/functional/CurryingAndPartials.java b/functional/CurryingAndPartials.java
    index ff53990a1..795a1afda 100644
    --- a/functional/CurryingAndPartials.java
    +++ b/functional/CurryingAndPartials.java
    @@ -21,7 +21,8 @@ public static void main(String[] args) {
           System.out.println(hi.apply("Ho"));
     
           // Partial application:
    -      Function sumHi = sum.apply("Hup ");
    +      Function sumHi =
    +        sum.apply("Hup ");
           System.out.println(sumHi.apply("Ho"));
           System.out.println(sumHi.apply("Hey"));
        }
    diff --git a/functional/FunctionalAnnotation.java b/functional/FunctionalAnnotation.java
    index c56812859..0116d87b6 100644
    --- a/functional/FunctionalAnnotation.java
    +++ b/functional/FunctionalAnnotation.java
    @@ -29,7 +29,8 @@ public String goodbye(String arg) {
         return "Goodbye, " + arg;
       }
       public static void main(String[] args) {
    -    FunctionalAnnotation fa = new FunctionalAnnotation();
    +    FunctionalAnnotation fa =
    +      new FunctionalAnnotation();
         Functional f = fa::goodbye;
         FunctionalNoAnn fna = fa::goodbye;
         // Functional fac = fa; // Incompatible
    diff --git a/generics/ApplyTest.java b/generics/ApplyTest.java
    index 9e5b161e4..ea50a98bd 100644
    --- a/generics/ApplyTest.java
    +++ b/generics/ApplyTest.java
    @@ -7,16 +7,19 @@
     import onjava.*;
     
     public class ApplyTest {
    -  public static void main(String[] args) throws Exception {
    +  public static
    +  void main(String[] args) throws Exception {
         List shapes =
           Suppliers.create(ArrayList::new, Shape::new, 3);
    -    Apply.apply(shapes, Shape.class.getMethod("rotate"));
    +    Apply.apply(shapes,
    +      Shape.class.getMethod("rotate"));
         Apply.apply(shapes,
           Shape.class.getMethod("resize", int.class), 7);
     
         List squares =
           Suppliers.create(ArrayList::new, Square::new, 3);
    -    Apply.apply(squares, Shape.class.getMethod("rotate"));
    +    Apply.apply(squares,
    +      Shape.class.getMethod("rotate"));
         Apply.apply(squares,
           Shape.class.getMethod("resize", int.class), 7);
     
    @@ -30,7 +33,8 @@ public static void main(String[] args) throws Exception {
           Shape::new, 3);
         Suppliers.fill(shapeQ, SimpleQueue::add,
           Square::new, 3);
    -    Apply.apply(shapeQ, Shape.class.getMethod("rotate"));
    +    Apply.apply(shapeQ,
    +      Shape.class.getMethod("rotate"));
       }
     }
     /* Output:
    diff --git a/generics/BasicBounds.java b/generics/BasicBounds.java
    index d55ac5b3c..321e571e0 100644
    --- a/generics/BasicBounds.java
    +++ b/generics/BasicBounds.java
    @@ -15,7 +15,7 @@ class WithColor {
     
     class Coord { public int x, y, z; }
     
    -// This won't work. Class must be first, then interfaces:
    +// This fails. Class must be first, then interfaces:
     // class WithColorCoord {
     
     // Multiple bounds:
    diff --git a/generics/CheckedList.java b/generics/CheckedList.java
    index bd1c22b7d..b18abf2ee 100644
    --- a/generics/CheckedList.java
    +++ b/generics/CheckedList.java
    @@ -29,7 +29,7 @@ public static void main(String[] args) {
       }
     }
     /* Output:
    -Expected: java.lang.ClassCastException: Attempt to insert
    -class typeinfo.pets.Cat element into collection with
    -element type class typeinfo.pets.Dog
    +Expected: java.lang.ClassCastException: Attempt to
    +insert class typeinfo.pets.Cat element into collection
    +with element type class typeinfo.pets.Dog
     */
    diff --git a/generics/DogsAndRobotMethodReferences.java b/generics/DogsAndRobotMethodReferences.java
    index cf779321f..81b2c078f 100644
    --- a/generics/DogsAndRobotMethodReferences.java
    +++ b/generics/DogsAndRobotMethodReferences.java
    @@ -33,7 +33,8 @@ public static void main(String[] args) {
         CommunicateA.perform(new RobotA(),
           RobotA::speak, RobotA::sit);
         CommunicateA.perform(new Mime(),
    -      Mime::walkAgainstTheWind, Mime::pushInvisibleWalls);
    +      Mime::walkAgainstTheWind,
    +      Mime::pushInvisibleWalls);
       }
     }
     /* Output:
    diff --git a/generics/DynamicProxyMixin.java b/generics/DynamicProxyMixin.java
    index 942b638d3..5aaf96b7d 100644
    --- a/generics/DynamicProxyMixin.java
    +++ b/generics/DynamicProxyMixin.java
    @@ -60,6 +60,6 @@ public static void main(String[] args) {
     }
     /* Output:
     Hello
    -1493760122461
    +1494331653339
     1
     */
    diff --git a/generics/EpicBattle.java b/generics/EpicBattle.java
    index 60bb4ca82..f1453c9e5 100644
    --- a/generics/EpicBattle.java
    +++ b/generics/EpicBattle.java
    @@ -31,14 +31,16 @@ class SuperSleuth
       void see() { power.seeThroughWalls(); }
     }
     
    -class CanineHero
    +class
    +CanineHero
     extends SuperHero {
       CanineHero(POWER power) { super(power); }
       void hear() { power.hearSubtleNoises(); }
       void smell() { power.trackBySmell(); }
     }
     
    -class SuperHearSmell implements SuperHearing, SuperSmell {
    +class SuperHearSmell
    +implements SuperHearing, SuperSmell {
       @Override
       public void hearSubtleNoises() {}
       @Override
    diff --git a/generics/FactoryConstraint.java b/generics/FactoryConstraint.java
    index 734eabecb..c2960da1d 100644
    --- a/generics/FactoryConstraint.java
    +++ b/generics/FactoryConstraint.java
    @@ -47,9 +47,12 @@ class Foo2 {
     
     public class FactoryConstraint {
       public static void main(String[] args) {
    -    System.out.println(new Foo2<>(new IntegerFactory()));
    -    System.out.println(new Foo2<>(new Widget.Factory()));
    -    System.out.println(new Foo2<>(Fudge::new));
    +    System.out.println(
    +      new Foo2<>(new IntegerFactory()));
    +    System.out.println(
    +      new Foo2<>(new Widget.Factory()));
    +    System.out.println(
    +      new Foo2<>(Fudge::new));
       }
     }
     /* Output:
    diff --git a/generics/Fibonacci.java b/generics/Fibonacci.java
    index 10d2e8b4a..25d123589 100644
    --- a/generics/Fibonacci.java
    +++ b/generics/Fibonacci.java
    @@ -22,5 +22,6 @@ public static void main(String[] args) {
       }
     }
     /* Output:
    -1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584
    +1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597
    +2584
     */
    diff --git a/generics/GenericArray.java b/generics/GenericArray.java
    index d91a68d52..c272afcf1 100644
    --- a/generics/GenericArray.java
    +++ b/generics/GenericArray.java
    @@ -27,5 +27,6 @@ public static void main(String[] args) {
       }
     }
     /* Output:
    -[Ljava.lang.Object; cannot be cast to [Ljava.lang.Integer;
    +[Ljava.lang.Object; cannot be cast to
    +[Ljava.lang.Integer;
     */
    diff --git a/generics/GenericArray2.java b/generics/GenericArray2.java
    index 9fa0910fb..50c9434d0 100644
    --- a/generics/GenericArray2.java
    +++ b/generics/GenericArray2.java
    @@ -34,6 +34,6 @@ public static void main(String[] args) {
     }
     /* Output:
     0 1 2 3 4 5 6 7 8 9
    -java.lang.ClassCastException: [Ljava.lang.Object; cannot be
    -cast to [Ljava.lang.Integer;
    +java.lang.ClassCastException: [Ljava.lang.Object;
    +cannot be cast to [Ljava.lang.Integer;
     */
    diff --git a/generics/GenericReading.java b/generics/GenericReading.java
    index c75cd91cc..2bb83cf83 100644
    --- a/generics/GenericReading.java
    +++ b/generics/GenericReading.java
    @@ -5,7 +5,8 @@
     import java.util.*;
     
     public class GenericReading {
    -  static List apples = Arrays.asList(new Apple());
    +  static List apples =
    +    Arrays.asList(new Apple());
       static List fruit = Arrays.asList(new Fruit());
       static  T readExact(List list) {
         return list.get(0);
    diff --git a/generics/GenericVarargs.java b/generics/GenericVarargs.java
    index 82a120378..94f679a90 100644
    --- a/generics/GenericVarargs.java
    +++ b/generics/GenericVarargs.java
    @@ -17,13 +17,14 @@ public static void main(String[] args) {
         System.out.println(ls);
         ls = makeList("A", "B", "C");
         System.out.println(ls);
    -    ls = makeList("ABCDEFFHIJKLMNOPQRSTUVWXYZ".split(""));
    +    ls = makeList(
    +      "ABCDEFFHIJKLMNOPQRSTUVWXYZ".split(""));
         System.out.println(ls);
       }
     }
     /* Output:
     [A]
     [A, B, C]
    -[A, B, C, D, E, F, F, 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, F, H, I, J, K, L, M, N, O, P, Q, R,
    +S, T, U, V, W, X, Y, Z]
     */
    diff --git a/generics/InheritBounds.java b/generics/InheritBounds.java
    index bb01d71ee..7f535f3b7 100644
    --- a/generics/InheritBounds.java
    +++ b/generics/InheritBounds.java
    @@ -9,7 +9,8 @@ class HoldItem {
       T getItem() { return item; }
     }
     
    -class WithColor2 extends HoldItem {
    +class WithColor2
    +extends HoldItem {
       WithColor2(T item) { super(item); }
       java.awt.Color color() { return item.getColor(); }
     }
    diff --git a/generics/IterableFibonacci.java b/generics/IterableFibonacci.java
    index 1494157c6..69708eb28 100644
    --- a/generics/IterableFibonacci.java
    +++ b/generics/IterableFibonacci.java
    @@ -31,5 +31,6 @@ public static void main(String[] args) {
       }
     }
     /* Output:
    -1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584
    +1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597
    +2584
     */
    diff --git a/generics/Mixins.java b/generics/Mixins.java
    index d018ee0cd..3c3b94482 100644
    --- a/generics/Mixins.java
    +++ b/generics/Mixins.java
    @@ -43,7 +43,9 @@ class Mixin extends BasicImp
       private SerialNumbered serialNumber =
         new SerialNumberedImp();
       @Override
    -  public long getStamp() { return timeStamp.getStamp(); }
    +  public long getStamp() {
    +    return timeStamp.getStamp();
    +  }
       @Override
       public long getSerialNumber() {
         return serialNumber.getSerialNumber();
    @@ -64,6 +66,6 @@ public static void main(String[] args) {
       }
     }
     /* Output:
    -test string 1 1493760126621 1
    -test string 2 1493760126621 2
    +test string 1 1494331663026 1
    +test string 2 1494331663027 2
     */
    diff --git a/generics/OrdinaryArguments.java b/generics/OrdinaryArguments.java
    index c2b3c5c40..351316bd0 100644
    --- a/generics/OrdinaryArguments.java
    +++ b/generics/OrdinaryArguments.java
    @@ -21,7 +21,8 @@ public static void main(String[] args) {
         Derived derived = new Derived();
         DerivedSetter ds = new DerivedSetter();
         ds.set(derived);
    -    ds.set(base); // Compiles: overloaded, not overridden!
    +    // Compiles--overloaded, not overridden!:
    +    ds.set(base);
       }
     }
     /* Output:
    diff --git a/generics/RandomList.java b/generics/RandomList.java
    index a16eef03e..c87aa1624 100644
    --- a/generics/RandomList.java
    +++ b/generics/RandomList.java
    @@ -21,5 +21,6 @@ public static void main(String[] args) {
       }
     }
     /* Output:
    -brown over fox quick quick dog brown The brown lazy brown
    +brown over fox quick quick dog brown The brown lazy
    +brown
     */
    diff --git a/generics/SelfBounding.java b/generics/SelfBounding.java
    index ccecc9182..0a5dfa7c0 100644
    --- a/generics/SelfBounding.java
    +++ b/generics/SelfBounding.java
    @@ -22,7 +22,8 @@ class C extends SelfBounded {
     class D {}
     // Can't do this:
     // class E extends SelfBounded {}
    -// Compile error: Type parameter D is not within its bound
    +// Compile error:
    +//   Type parameter D is not within its bound
     
     // Alas, you can do this, so you cannot force the idiom:
     class F extends SelfBounded {}
    diff --git a/generics/SelfBoundingAndCovariantArguments.java b/generics/SelfBoundingAndCovariantArguments.java
    index 55ffabac2..ac5b70721 100644
    --- a/generics/SelfBoundingAndCovariantArguments.java
    +++ b/generics/SelfBoundingAndCovariantArguments.java
    @@ -3,14 +3,16 @@
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
    -interface SelfBoundSetter> {
    +interface
    +SelfBoundSetter> {
       void set(T arg);
     }
     
     interface Setter extends SelfBoundSetter {}
     
     public class SelfBoundingAndCovariantArguments {
    -  void testA(Setter s1, Setter s2, SelfBoundSetter sbs) {
    +  void
    +  testA(Setter s1, Setter s2, SelfBoundSetter sbs) {
         s1.set(s2);
         //- s1.set(sbs);
         // error: method set in interface SelfBoundSetter
    diff --git a/generics/Store.java b/generics/Store.java
    index 659a6c354..45120db26 100644
    --- a/generics/Store.java
    +++ b/generics/Store.java
    @@ -19,7 +19,8 @@ class Product {
       }
       @Override
       public String toString() {
    -    return id + ": " + description + ", price: $" + price;
    +    return id + ": " + description +
    +      ", price: $" + price;
       }
       public void priceChange(double change) {
         price += change;
    @@ -30,7 +31,8 @@ public void priceChange(double change) {
           @Override
           public Product get() {
             return new Product(rand.nextInt(1000), "Test",
    -          Math.round(rand.nextDouble() * 1000.0) + 0.99);
    +          Math.round(
    +            rand.nextDouble() * 1000.0) + 0.99);
           }
         };
     }
    @@ -55,7 +57,8 @@ public class Store extends ArrayList {
       private ArrayList checkouts =
         new ArrayList<>();
       private Office office = new Office();
    -  public Store(int nAisles, int nShelves, int nProducts) {
    +  public Store(
    +    int nAisles, int nShelves, int nProducts) {
         for(int i = 0; i < nAisles; i++)
           add(new Aisle(nShelves, nProducts));
       }
    diff --git a/generics/ThrowGenericException.java b/generics/ThrowGenericException.java
    index 55a1c6512..5152c00b3 100644
    --- a/generics/ThrowGenericException.java
    +++ b/generics/ThrowGenericException.java
    @@ -20,11 +20,12 @@ List processAll() throws E {
     
     class Failure1 extends Exception {}
     
    -class Processor1 implements Processor {
    +class Processor1
    +implements Processor {
       static int count = 3;
       @Override
    -  public void
    -  process(List resultCollector) throws Failure1 {
    +  public void process(List resultCollector)
    +  throws Failure1 {
         if(count-- > 1)
           resultCollector.add("Hep!");
         else
    @@ -36,11 +37,12 @@ class Processor1 implements Processor {
     
     class Failure2 extends Exception {}
     
    -class Processor2 implements Processor {
    +class Processor2
    +implements Processor {
       static int count = 2;
       @Override
    -  public void
    -  process(List resultCollector) throws Failure2 {
    +  public void process(List resultCollector)
    +  throws Failure2 {
         if(count-- == 0)
           resultCollector.add(47);
         else {
    diff --git a/generics/TupleList.java b/generics/TupleList.java
    index 8a0d75e15..830b77421 100644
    --- a/generics/TupleList.java
    +++ b/generics/TupleList.java
    @@ -18,6 +18,6 @@ public static void main(String[] args) {
       }
     }
     /* Output:
    -(Vehicle@214c265e, Amphibian@448139f0, hi, 47)
     (Vehicle@7cca494b, Amphibian@7ba4f24f, hi, 47)
    +(Vehicle@3b9a45b3, Amphibian@7699a589, hi, 47)
     */
    diff --git a/generics/TupleTest.java b/generics/TupleTest.java
    index da7305b30..7b22af561 100644
    --- a/generics/TupleTest.java
    +++ b/generics/TupleTest.java
    @@ -19,7 +19,8 @@ Tuple4 h() {
             new Vehicle(), new Amphibian(), "hi", 47);
       }
       static
    -  Tuple5 k() {
    +  Tuple5 k() {
         return new
           Tuple5<>(
             new Vehicle(), new Amphibian(), "hi", 47, 11.1);
    @@ -35,7 +36,7 @@ public static void main(String[] args) {
     }
     /* Output:
     (hi, 47)
    -(Amphibian@4554617c, hi, 47)
    -(Vehicle@677327b6, Amphibian@14ae5a5, hi, 47)
    -(Vehicle@135fbaa4, Amphibian@45ee12a7, hi, 47, 11.1)
    +(Amphibian@1540e19d, hi, 47)
    +(Vehicle@7f31245a, Amphibian@6d6f6e28, hi, 47)
    +(Vehicle@330bedb4, Amphibian@2503dbd3, hi, 47, 11.1)
     */
    diff --git a/generics/TupleTest2.java b/generics/TupleTest2.java
    index f9f18216f..73e0e0ce4 100644
    --- a/generics/TupleTest2.java
    +++ b/generics/TupleTest2.java
    @@ -19,7 +19,8 @@ Tuple4 h() {
           new Vehicle(), new Amphibian(), "hi", 47);
       }
       static
    -  Tuple5 k() {
    +  Tuple5 k() {
         return tuple(new Vehicle(), new Amphibian(),
           "hi", 47, 11.1);
       }
    @@ -35,7 +36,7 @@ public static void main(String[] args) {
     /* Output:
     (hi, 47)
     (hi, 47)
    -(Amphibian@1540e19d, hi, 47)
    -(Vehicle@7f31245a, Amphibian@6d6f6e28, hi, 47)
    -(Vehicle@330bedb4, Amphibian@2503dbd3, hi, 47, 11.1)
    +(Amphibian@14ae5a5, hi, 47)
    +(Vehicle@135fbaa4, Amphibian@45ee12a7, hi, 47)
    +(Vehicle@4b67cf4d, Amphibian@7ea987ac, hi, 47, 11.1)
     */
    diff --git a/generics/WatercolorSets.java b/generics/WatercolorSets.java
    index 5f584e129..04c7adc6e 100644
    --- a/generics/WatercolorSets.java
    +++ b/generics/WatercolorSets.java
    @@ -33,21 +33,22 @@ public static void main(String[] args) {
     VIOLET, CERULEAN_BLUE_HUE, PHTHALO_BLUE, ULTRAMARINE,
     COBALT_BLUE_HUE, PERMANENT_GREEN, VIRIDIAN_HUE]
     set2: [CERULEAN_BLUE_HUE, PHTHALO_BLUE, ULTRAMARINE,
    -COBALT_BLUE_HUE, PERMANENT_GREEN, VIRIDIAN_HUE, SAP_GREEN,
    -YELLOW_OCHRE, BURNT_SIENNA, RAW_UMBER, BURNT_UMBER]
    -union(set1, set2): [BURNT_UMBER, MAGENTA, RAW_UMBER,
    -VIOLET, BURNT_SIENNA, ULTRAMARINE, CRIMSON,
    -PERMANENT_GREEN, YELLOW_OCHRE, BRILLIANT_RED, PHTHALO_BLUE,
    -CERULEAN_BLUE_HUE, SAP_GREEN, COBALT_BLUE_HUE, ROSE_MADDER,
    -VIRIDIAN_HUE]
    -intersection(set1, set2): [ULTRAMARINE, PERMANENT_GREEN,
    -PHTHALO_BLUE, COBALT_BLUE_HUE, CERULEAN_BLUE_HUE,
    -VIRIDIAN_HUE]
    -difference(set1, subset): [MAGENTA, VIOLET, CRIMSON,
    -BRILLIANT_RED, ROSE_MADDER]
    -difference(set2, subset): [SAP_GREEN, BURNT_UMBER,
    -RAW_UMBER, BURNT_SIENNA, YELLOW_OCHRE]
    -complement(set1, set2): [BURNT_UMBER, MAGENTA, RAW_UMBER,
    -VIOLET, BURNT_SIENNA, CRIMSON, YELLOW_OCHRE, BRILLIANT_RED,
    -SAP_GREEN, ROSE_MADDER]
    +COBALT_BLUE_HUE, PERMANENT_GREEN, VIRIDIAN_HUE,
    +SAP_GREEN, YELLOW_OCHRE, BURNT_SIENNA, RAW_UMBER,
    +BURNT_UMBER]
    +union(set1, set2): [BURNT_SIENNA, BRILLIANT_RED,
    +YELLOW_OCHRE, MAGENTA, SAP_GREEN, CERULEAN_BLUE_HUE,
    +ULTRAMARINE, VIRIDIAN_HUE, VIOLET, RAW_UMBER,
    +ROSE_MADDER, PERMANENT_GREEN, BURNT_UMBER,
    +PHTHALO_BLUE, CRIMSON, COBALT_BLUE_HUE]
    +intersection(set1, set2): [PERMANENT_GREEN,
    +CERULEAN_BLUE_HUE, ULTRAMARINE, VIRIDIAN_HUE,
    +PHTHALO_BLUE, COBALT_BLUE_HUE]
    +difference(set1, subset): [BRILLIANT_RED, MAGENTA,
    +VIOLET, CRIMSON, ROSE_MADDER]
    +difference(set2, subset): [BURNT_SIENNA, YELLOW_OCHRE,
    +BURNT_UMBER, SAP_GREEN, RAW_UMBER]
    +complement(set1, set2): [BURNT_SIENNA, BRILLIANT_RED,
    +YELLOW_OCHRE, MAGENTA, SAP_GREEN, VIOLET, RAW_UMBER,
    +ROSE_MADDER, BURNT_UMBER, CRIMSON]
     */
    diff --git a/generics/Wildcards.java b/generics/Wildcards.java
    index 02643eee8..aa1a9163a 100644
    --- a/generics/Wildcards.java
    +++ b/generics/Wildcards.java
    @@ -22,8 +22,9 @@ static void rawArgs(Holder holder, Object arg) {
         // OK, but type information is lost:
         Object obj = holder.get();
       }
    -  // Similar to rawArgs(), but errors instead of warnings:
    -  static void unboundedArg(Holder holder, Object arg) {
    +  // Like rawArgs(), but errors instead of warnings:
    +  static void
    +  unboundedArg(Holder holder, Object arg) {
         //- holder.set(arg);
         // error: method set in class Holder
         // cannot be applied to given types;
    @@ -68,7 +69,8 @@ T wildSubtype(Holder holder, T arg) {
         //     wildSubtype(Holder,T#1)
         //     T#2 extends Object declared in class Holder
         //   where CAP#1 is a fresh type-variable:
    -    //     CAP#1 extends T#1 from capture of ? extends T#1
    +    //     CAP#1 extends T#1 from
    +    //       capture of ? extends T#1
         // 1 error
     
         return holder.get();
    @@ -214,7 +216,7 @@ public static void main(String[] args) {
         //   found:    Holder
         //   where T is a type-variable:
         //     T extends Object declared in
    -    //       method wildSubtype(Holder,T)
    +    //     method wildSubtype(Holder,T)
         // 2 warnings
     
         Long r10 = wildSubtype(qualified, lng);
    diff --git a/generics/watercolors/Watercolors.java b/generics/watercolors/Watercolors.java
    index ea2957243..205ed6ee7 100644
    --- a/generics/watercolors/Watercolors.java
    +++ b/generics/watercolors/Watercolors.java
    @@ -5,10 +5,11 @@
     package generics.watercolors;
     
     public enum Watercolors {
    -  ZINC, LEMON_YELLOW, MEDIUM_YELLOW, DEEP_YELLOW, ORANGE,
    -  BRILLIANT_RED, CRIMSON, MAGENTA, ROSE_MADDER, VIOLET,
    -  CERULEAN_BLUE_HUE, PHTHALO_BLUE, ULTRAMARINE,
    -  COBALT_BLUE_HUE, PERMANENT_GREEN, VIRIDIAN_HUE,
    -  SAP_GREEN, YELLOW_OCHRE, BURNT_SIENNA, RAW_UMBER,
    +  ZINC, LEMON_YELLOW, MEDIUM_YELLOW, DEEP_YELLOW,
    +  ORANGE, BRILLIANT_RED, CRIMSON, MAGENTA,
    +  ROSE_MADDER, VIOLET, CERULEAN_BLUE_HUE,
    +  PHTHALO_BLUE, ULTRAMARINE, COBALT_BLUE_HUE,
    +  PERMANENT_GREEN, VIRIDIAN_HUE, SAP_GREEN,
    +  YELLOW_OCHRE, BURNT_SIENNA, RAW_UMBER,
       BURNT_UMBER, PAYNES_GRAY, IVORY_BLACK
     }
    diff --git a/hiding/FullQualification.java b/hiding/FullQualification.java
    index 65e75685f..39e7cc343 100644
    --- a/hiding/FullQualification.java
    +++ b/hiding/FullQualification.java
    @@ -5,6 +5,7 @@
     
     public class FullQualification {
       public static void main(String[] args) {
    -    java.util.ArrayList list = new java.util.ArrayList();
    +    java.util.ArrayList list =
    +      new java.util.ArrayList();
       }
     }
    diff --git a/housekeeping/ArrayClassObj.java b/housekeeping/ArrayClassObj.java
    index 6bb267e47..bd90c0f05 100644
    --- a/housekeeping/ArrayClassObj.java
    +++ b/housekeeping/ArrayClassObj.java
    @@ -17,6 +17,6 @@ public static void main(String[] args) {
     }
     /* Output:
     length of a = 18
    -[55, 193, 361, 461, 429, 368, 200, 22, 207, 288, 128, 51,
    -89, 309, 278, 498, 361, 20]
    +[55, 193, 361, 461, 429, 368, 200, 22, 207, 288, 128,
    +51, 89, 309, 278, 498, 361, 20]
     */
    diff --git a/housekeeping/Demotion.java b/housekeeping/Demotion.java
    index cabddb70c..e03ee8cca 100644
    --- a/housekeeping/Demotion.java
    +++ b/housekeeping/Demotion.java
    @@ -5,7 +5,9 @@
     // Demotion of primitives
     
     public class Demotion {
    -  void f1(double x) { System.out.println("f1(double)"); }
    +  void f1(double x) {
    +    System.out.println("f1(double)");
    +  }
       void f2(float x) { System.out.println("f2(float)"); }
       void f3(long x) { System.out.println("f3(long)"); }
       void f4(int x) { System.out.println("f4(int)"); }
    diff --git a/housekeeping/EnumOrder.java b/housekeeping/EnumOrder.java
    index acae8d51b..71e7855a0 100644
    --- a/housekeeping/EnumOrder.java
    +++ b/housekeeping/EnumOrder.java
    @@ -6,7 +6,8 @@
     public class EnumOrder {
       public static void main(String[] args) {
         for(Spiciness s : Spiciness.values())
    -      System.out.println(s + ", ordinal " + s.ordinal());
    +      System.out.println(
    +        s + ", ordinal " + s.ordinal());
       }
     }
     /* Output:
    diff --git a/housekeeping/ExplicitStatic.java b/housekeeping/ExplicitStatic.java
    index 1b46002a9..885886486 100644
    --- a/housekeeping/ExplicitStatic.java
    +++ b/housekeeping/ExplicitStatic.java
    @@ -2,7 +2,7 @@
     // (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
    -// Explicit static initialization with the "static" clause
    +// Explicit static initialization with "static" clause
     
     class Cup {
       Cup(int marker) {
    diff --git a/housekeeping/PrimitiveOverloading.java b/housekeeping/PrimitiveOverloading.java
    index 2e1261abc..c54df4395 100644
    --- a/housekeeping/PrimitiveOverloading.java
    +++ b/housekeeping/PrimitiveOverloading.java
    @@ -103,8 +103,8 @@ public static void main(String[] args) {
     /* Output:
     5: f1(int) f2(int) f3(int) f4(int) f5(long) f6(float)
     f7(double)
    -char: f1(char) f2(int) f3(int) f4(int) f5(long) f6(float)
    -f7(double)
    +char: f1(char) f2(int) f3(int) f4(int) f5(long)
    +f6(float) f7(double)
     byte: f1(byte) f2(byte) f3(short) f4(int) f5(long)
     f6(float) f7(double)
     short: f1(short) f2(short) f3(short) f4(int) f5(long)
    @@ -113,8 +113,8 @@ public static void main(String[] args) {
     f7(double)
     long: f1(long) f2(long) f3(long) f4(long) f5(long)
     f6(float) f7(double)
    -float: f1(float) f2(float) f3(float) f4(float) f5(float)
    -f6(float) f7(double)
    +float: f1(float) f2(float) f3(float) f4(float)
    +f5(float) f6(float) f7(double)
     double: f1(double) f2(double) f3(double) f4(double)
     f5(double) f6(double) f7(double)
     */
    diff --git a/housekeeping/StaticInitialization.java b/housekeeping/StaticInitialization.java
    index d067cf8f1..27952629e 100644
    --- a/housekeeping/StaticInitialization.java
    +++ b/housekeeping/StaticInitialization.java
    @@ -40,9 +40,9 @@ void f3(int marker) {
     
     public class StaticInitialization {
       public static void main(String[] args) {
    -    System.out.println("Creating new Cupboard() in main");
    +    System.out.println("main creating new Cupboard()");
         new Cupboard();
    -    System.out.println("Creating new Cupboard() in main");
    +    System.out.println("main creating new Cupboard()");
         new Cupboard();
         table.f2(1);
         cupboard.f3(1);
    @@ -60,11 +60,11 @@ public static void main(String[] args) {
     Bowl(3)
     Cupboard()
     f1(2)
    -Creating new Cupboard() in main
    +main creating new Cupboard()
     Bowl(3)
     Cupboard()
     f1(2)
    -Creating new Cupboard() in main
    +main creating new Cupboard()
     Bowl(3)
     Cupboard()
     f1(2)
    diff --git a/housekeeping/VarargType.java b/housekeeping/VarargType.java
    index 72d8bfdc3..311b0487d 100644
    --- a/housekeeping/VarargType.java
    +++ b/housekeeping/VarargType.java
    @@ -17,7 +17,8 @@ public static void main(String[] args) {
         f();
         g(1);
         g();
    -    System.out.println("int[]: " + new int[0].getClass());
    +    System.out.println("int[]: " +
    +      new int[0].getClass());
       }
     }
     /* Output:
    diff --git a/innerclasses/DotNew.java b/innerclasses/DotNew.java
    index 92d3f7944..e587e461e 100644
    --- a/innerclasses/DotNew.java
    +++ b/innerclasses/DotNew.java
    @@ -2,7 +2,7 @@
     // (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
    -// Creating an inner class directly using the .new syntax
    +// Creating an inner class directly using .new syntax
     
     public class DotNew {
       public class Inner {}
    diff --git a/innerclasses/Parcel3.java b/innerclasses/Parcel3.java
    index 48ae8aa18..6ee03313b 100644
    --- a/innerclasses/Parcel3.java
    +++ b/innerclasses/Parcel3.java
    @@ -19,6 +19,7 @@ public static void main(String[] args) {
         // Must use instance of outer class
         // to create an instance of the inner class:
         Parcel3.Contents c = p.new Contents();
    -    Parcel3.Destination d = p.new Destination("Tasmania");
    +    Parcel3.Destination d =
    +      p.new Destination("Tasmania");
       }
     }
    diff --git a/innerclasses/mui/MultiInterfaces.java b/innerclasses/mui/MultiInterfaces.java
    index c909d29ce..cdfc0cdab 100644
    --- a/innerclasses/mui/MultiInterfaces.java
    +++ b/innerclasses/mui/MultiInterfaces.java
    @@ -2,7 +2,7 @@
     // (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
    -// Two ways that a class can implement multiple interfaces
    +// Two ways a class can implement multiple interfaces
     // {java innerclasses.mui.MultiInterfaces}
     package innerclasses.mui;
     
    diff --git a/interfaces/AdaptedRandomDoubles.java b/interfaces/AdaptedRandomDoubles.java
    index 733820e68..dc80a5798 100644
    --- a/interfaces/AdaptedRandomDoubles.java
    +++ b/interfaces/AdaptedRandomDoubles.java
    @@ -21,13 +21,15 @@ public int read(CharBuffer cb) {
         return result.length();
       }
       public static void main(String[] args) {
    -    Scanner s = new Scanner(new AdaptedRandomDoubles(7));
    +    Scanner s =
    +      new Scanner(new AdaptedRandomDoubles(7));
         while(s.hasNextDouble())
           System.out.print(s.nextDouble() + " ");
       }
     }
     /* Output:
    -0.7271157860730044 0.5309454508634242 0.16020656493302599
    -0.18847866977771732 0.5166020801268457 0.2678662084200585
    +0.7271157860730044 0.5309454508634242
    +0.16020656493302599 0.18847866977771732
    +0.5166020801268457 0.2678662084200585
     0.2613610344283964
     */
    diff --git a/interfaces/Applicator.java b/interfaces/Applicator.java
    index c7ad4da0d..1c57d8a68 100644
    --- a/interfaces/Applicator.java
    +++ b/interfaces/Applicator.java
    @@ -30,7 +30,7 @@ public String process(Object input) {
     class Splitter extends Processor {
       @Override
       public String process(Object input) {
    -    // The split() argument divides a String into pieces:
    +    // split() divides a String into pieces:
         return Arrays.toString(((String)input).split(" "));
       }
     }
    @@ -41,7 +41,8 @@ public static void apply(Processor p, Object s) {
         System.out.println(p.process(s));
       }
       public static void main(String[] args) {
    -    String s = "We are such stuff as dreams are made on";
    +    String s =
    +      "We are such stuff as dreams are made on";
         apply(new Upcase(), s);
         apply(new Downcase(), s);
         apply(new Splitter(), s);
    diff --git a/interfaces/Jim.java b/interfaces/Jim.java
    index 3d3d5cf99..66c0ea7cf 100644
    --- a/interfaces/Jim.java
    +++ b/interfaces/Jim.java
    @@ -5,11 +5,15 @@
     import java.util.*;
     
     interface Jim1 {
    -  default void jim() { System.out.println("Jim1::jim"); }
    +  default void jim() {
    +    System.out.println("Jim1::jim");
    +  }
     }
     
     interface Jim2 {
    -  default void jim() { System.out.println("Jim2::jim"); }
    +  default void jim() {
    +    System.out.println("Jim2::jim");
    +  }
     }
     
     public class Jim implements Jim1, Jim2 {
    diff --git a/interfaces/MICollision.java b/interfaces/MICollision.java
    index 43af8fda7..fddfdbd9c 100644
    --- a/interfaces/MICollision.java
    +++ b/interfaces/MICollision.java
    @@ -5,11 +5,15 @@
     import java.util.*;
     
     interface Bob1 {
    -  default void bob() { System.out.println("Bob1::bob"); }
    +  default void bob() {
    +    System.out.println("Bob1::bob");
    +  }
     }
     
     interface Bob2 {
    -  default void bob() { System.out.println("Bob2::bob"); }
    +  default void bob() {
    +    System.out.println("Bob2::bob");
    +  }
     }
     
     // class Bob implements Bob1, Bob2 {}
    @@ -22,18 +26,24 @@ class Bob implements Bob1, Bob2 {}
     */
     
     interface Sam1 {
    -  default void sam() { System.out.println("Sam1::sam"); }
    +  default void sam() {
    +    System.out.println("Sam1::sam");
    +  }
     }
     
     interface Sam2 {
    -  default void sam(int i) { System.out.println(i * 2); }
    +  default void sam(int i) {
    +    System.out.println(i * 2);
    +  }
     }
     
     // This works because the argument lists are distinct:
     class Sam implements Sam1, Sam2 {}
     
     interface Max1 {
    -  default void max() { System.out.println("Max1::max"); }
    +  default void max() {
    +    System.out.println("Max1::max");
    +  }
     }
     
     interface Max2 {
    diff --git a/interfaces/MultipleInheritance.java b/interfaces/MultipleInheritance.java
    index ab5cd5144..0a7028e7c 100644
    --- a/interfaces/MultipleInheritance.java
    +++ b/interfaces/MultipleInheritance.java
    @@ -9,7 +9,9 @@ interface One {
     }
     
     interface Two {
    -  default void second() { System.out.println("second"); }
    +  default void second() {
    +    System.out.println("second");
    +  }
     }
     
     interface Three {
    diff --git a/interfaces/RandomDoubles.java b/interfaces/RandomDoubles.java
    index ced3f21cb..7898a023b 100644
    --- a/interfaces/RandomDoubles.java
    +++ b/interfaces/RandomDoubles.java
    @@ -14,7 +14,8 @@ static void main(String[] args) {
       }
     }
     /* Output:
    -0.7271157860730044 0.5309454508634242 0.16020656493302599
    -0.18847866977771732 0.5166020801268457 0.2678662084200585
    +0.7271157860730044 0.5309454508634242
    +0.16020656493302599 0.18847866977771732
    +0.5166020801268457 0.2678662084200585
     0.2613610344283964
     */
    diff --git a/interfaces/RandomStrings.java b/interfaces/RandomStrings.java
    index 8274acd5f..b9984011a 100644
    --- a/interfaces/RandomStrings.java
    +++ b/interfaces/RandomStrings.java
    @@ -15,7 +15,9 @@ public class RandomStrings implements Readable {
       private static final char[] VOWELS =
         "aeiou".toCharArray();
       private int count;
    -  public RandomStrings(int count) { this.count = count; }
    +  public RandomStrings(int count) {
    +    this.count = count;
    +  }
       @Override
       public int read(CharBuffer cb) {
         if(count-- == 0)
    diff --git a/interfaces/interfaceprocessor/StringProcessor.java b/interfaces/interfaceprocessor/StringProcessor.java
    index c5c229a40..553899f50 100644
    --- a/interfaces/interfaceprocessor/StringProcessor.java
    +++ b/interfaces/interfaceprocessor/StringProcessor.java
    @@ -10,7 +10,8 @@ interface StringProcessor extends Processor {
       @Override
       String process(Object input);  // [1]
       String S = // [2]
    -  "If she weighs the same as a duck, she's made of wood";
    +  "If she weighs the same as a duck, " +
    +  "she's made of wood";
       static void main(String[] args) { // [3]
         Applicator.apply(new Upcase(), S);
         Applicator.apply(new Downcase(), S);
    @@ -44,6 +45,6 @@ public String process(Object input) {
     Using Processor Downcase
     if she weighs the same as a duck, she's made of wood
     Using Processor Splitter
    -[If, she, weighs, the, same, as, a, duck,, she's, made, of,
    -wood]
    +[If, she, weighs, the, same, as, a, duck,, she's, made,
    +of, wood]
     */
    diff --git a/javadoc/HelloDateDoc.java b/javadoc/HelloDateDoc.java
    index a1c848b57..6c248966e 100644
    --- a/javadoc/HelloDateDoc.java
    +++ b/javadoc/HelloDateDoc.java
    @@ -22,5 +22,5 @@ public static void main(String[] args) {
     }
     /* Output:
     Hello, it's:
    -Tue May 02 15:22:28 MDT 2017
    +Tue May 09 06:07:27 MDT 2017
     */
    diff --git a/lowlevel/AtomicEvenProducer.java b/lowlevel/AtomicEvenProducer.java
    index a965e0011..806b4503c 100644
    --- a/lowlevel/AtomicEvenProducer.java
    +++ b/lowlevel/AtomicEvenProducer.java
    @@ -2,7 +2,7 @@
     // (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
    -// Atomic classes are occasionally useful in regular code
    +// Atomic classes: occasionally useful in regular code
     import java.util.concurrent.atomic.*;
     
     public class AtomicEvenProducer extends IntGenerator {
    diff --git a/lowlevel/DelayQueueDemo.java b/lowlevel/DelayQueueDemo.java
    index 01620f580..c0d85b020 100644
    --- a/lowlevel/DelayQueueDemo.java
    +++ b/lowlevel/DelayQueueDemo.java
    @@ -70,11 +70,12 @@ public class DelayQueueDemo {
       }
     }
     /* Output:
    -[128] Task 12 [429] Task 6 [551] Task 13 [555] Task 2 [693]
    -Task 3 [809] Task 15 [961] Task 5 [1258] Task 1 [1258] Task
    -20 [1520] Task 19 [1861] Task 4 [1998] Task 17 [2200] Task
    -8 [2207] Task 10 [2288] Task 11 [2522] Task 9 [2589] Task
    -14 [2861] Task 18 [2868] Task 7 [3278] Task 16 (0:4000)
    +[128] Task 12 [429] Task 6 [551] Task 13 [555] Task 2
    +[693] Task 3 [809] Task 15 [961] Task 5 [1258] Task 1
    +[1258] Task 20 [1520] Task 19 [1861] Task 4 [1998] Task
    +17 [2200] Task 8 [2207] Task 10 [2288] Task 11 [2522]
    +Task 9 [2589] Task 14 [2861] Task 18 [2868] Task 7
    +[3278] Task 16 (0:4000)
     (1:1258)
     (2:555)
     (3:693)
    diff --git a/lowlevel/EvenProducer.java b/lowlevel/EvenProducer.java
    index 5723685b2..e365b938e 100644
    --- a/lowlevel/EvenProducer.java
    +++ b/lowlevel/EvenProducer.java
    @@ -3,6 +3,7 @@
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // When threads collide
    +// {ValidateByHand}
     
     public class EvenProducer extends IntGenerator {
       private int currentEvenValue = 0;
    @@ -17,6 +18,9 @@ public static void main(String[] args) {
       }
     }
     /* Output:
    -303 not even!
    -301 not even!
    +419 not even!
    +425 not even!
    +423 not even!
    +421 not even!
    +417 not even!
     */
    diff --git a/lowlevel/ExceptionThread.java b/lowlevel/ExceptionThread.java
    index 6664c454c..859e86a32 100644
    --- a/lowlevel/ExceptionThread.java
    +++ b/lowlevel/ExceptionThread.java
    @@ -17,3 +17,14 @@ public static void main(String[] args) {
         es.shutdown();
       }
     }
    +/* Output:
    +___[ Error Output ]___
    +Exception in thread "pool-1-thread-1"
    +java.lang.RuntimeException
    +        at ExceptionThread.run(ExceptionThread.java:8)
    +        at java.util.concurrent.ThreadPoolExecutor.runW
    +orker(ThreadPoolExecutor.java:1142)
    +        at java.util.concurrent.ThreadPoolExecutor$Work
    +er.run(ThreadPoolExecutor.java:617)
    +        at java.lang.Thread.run(Thread.java:745)
    +*/
    diff --git a/lowlevel/NaiveExceptionHandling.java b/lowlevel/NaiveExceptionHandling.java
    index a765bcf91..14a76d850 100644
    --- a/lowlevel/NaiveExceptionHandling.java
    +++ b/lowlevel/NaiveExceptionHandling.java
    @@ -19,3 +19,14 @@ public static void main(String[] args) {
         }
       }
     }
    +/* Output:
    +___[ Error Output ]___
    +Exception in thread "pool-1-thread-1"
    +java.lang.RuntimeException
    +        at ExceptionThread.run(ExceptionThread.java:8)
    +        at java.util.concurrent.ThreadPoolExecutor.runW
    +orker(ThreadPoolExecutor.java:1142)
    +        at java.util.concurrent.ThreadPoolExecutor$Work
    +er.run(ThreadPoolExecutor.java:617)
    +        at java.lang.Thread.run(Thread.java:745)
    +*/
    diff --git a/lowlevel/NotAtomic.java b/lowlevel/NotAtomic.java
    index 4ac34dbc7..f77eb128f 100644
    --- a/lowlevel/NotAtomic.java
    +++ b/lowlevel/NotAtomic.java
    @@ -3,6 +3,7 @@
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // {javap -c NotAtomic}
    +// {VisuallyInspectOutput}
     
     public class NotAtomic {
       int i;
    @@ -17,7 +18,7 @@ public class NotAtomic {
       public NotAtomic();
         Code:
            0: aload_0
    -       1: invokespecial #1                  // Method
    +       1: invokespecial #1 // Method
     java/lang/Object."":()V
            4: return
     
    @@ -25,20 +26,24 @@ public class NotAtomic {
         Code:
            0: aload_0
            1: dup
    -       2: getfield      #2                  // Field i:I
    +       2: getfield      #2 // Field
    +i:I
            5: iconst_1
            6: iadd
    -       7: putfield      #2                  // Field i:I
    +       7: putfield      #2 // Field
    +i:I
           10: return
     
       void f2();
         Code:
            0: aload_0
            1: dup
    -       2: getfield      #2                  // Field i:I
    +       2: getfield      #2 // Field
    +i:I
            5: iconst_3
            6: iadd
    -       7: putfield      #2                  // Field i:I
    +       7: putfield      #2 // Field
    +i:I
           10: return
     }
     */
    diff --git a/lowlevel/NumberOfProcessors.java b/lowlevel/NumberOfProcessors.java
    index 6039f30f7..103d6c1d2 100644
    --- a/lowlevel/NumberOfProcessors.java
    +++ b/lowlevel/NumberOfProcessors.java
    @@ -10,5 +10,5 @@ public static void main(String[] args) {
       }
     }
     /* Output:
    -4
    +8
     */
    diff --git a/lowlevel/PriorityBlockingQueueDemo.java b/lowlevel/PriorityBlockingQueueDemo.java
    index f50b13d04..c62bf46f2 100644
    --- a/lowlevel/PriorityBlockingQueueDemo.java
    +++ b/lowlevel/PriorityBlockingQueueDemo.java
    @@ -98,38 +98,38 @@ public static void main(String[] args) {
       }
     }
     /* Output:
    -[17] Prioritized 2
    -[18] Prioritized 26
    +[15] Prioritized 2
    +[17] Prioritized 1
     [17] Prioritized 5
     [16] Prioritized 6
    -[16] Prioritized 29
    -[15] Prioritized 1
    -[15] Prioritized 23
     [14] Prioritized 9
    -[14] Prioritized 18
    -[13] Prioritized 13
    -[12] Prioritized 17
     [12] Prioritized 0
    -[12] Prioritized 16
    -[11] Prioritized 12
    -[11] Prioritized 24
     [11] Prioritized 4
    +[11] Prioritized 12
    +[13] Prioritized 13
    +[12] Prioritized 16
    +[14] Prioritized 18
    +[15] Prioritized 23
    +[18] Prioritized 26
    +[16] Prioritized 29
    +[12] Prioritized 17
     [11] Prioritized 30
    +[11] Prioritized 24
     [10] Prioritized 15
     [10] Prioritized 22
    +[8] Prioritized 25
     [8] Prioritized 11
     [8] Prioritized 10
    -[8] Prioritized 25
     [6] Prioritized 31
     [3] Prioritized 7
     [2] Prioritized 20
     [1] Prioritized 3
    -[0] Prioritized 14
     [0] Prioritized 19
     [0] Prioritized 8
    +[0] Prioritized 14
     [0] Prioritized 21
     [-1] Prioritized 28
    -(1:15)(0:12)(2:17)(3:1)(4:11)
    +(0:12)(2:15)(1:17)(3:1)(4:11)
     (5:17)(6:16)(7:3)(8:0)(9:14)
     (10:8)(11:8)(12:11)(13:13)(14:0)
     (15:10)(16:12)(17:12)(18:14)(19:0)
    diff --git a/lowlevel/SerialNumberTest.java b/lowlevel/SerialNumberTest.java
    index 9ab2b8286..7da47cd8d 100644
    --- a/lowlevel/SerialNumberTest.java
    +++ b/lowlevel/SerialNumberTest.java
    @@ -9,5 +9,5 @@ public static void main(String[] args) {
       }
     }
     /* Output:
    -Duplicate: 4687
    +Duplicate: 148044
     */
    diff --git a/lowlevel/SynchronizedComparison.java b/lowlevel/SynchronizedComparison.java
    index 42c7aecca..11afebd2d 100644
    --- a/lowlevel/SynchronizedComparison.java
    +++ b/lowlevel/SynchronizedComparison.java
    @@ -76,14 +76,14 @@ public static void main(String[] args) {
       }
     }
     /* Output:
    --> 152
    --> 152
    --> 152
    --> 150
    -CriticalSection: 606
    --> 72
    --> 24
    --> 70
    --> 164
    -SynchronizedMethod: 330
    +-> 243
    +-> 243
    +-> 243
    +-> 243
    +CriticalSection: 972
    +-> 69
    +-> 61
    +-> 83
    +-> 36
    +SynchronizedMethod: 249
     */
    diff --git a/lowlevel/ThreadSize.java b/lowlevel/ThreadSize.java
    index 522ff717e..36ff2bf53 100644
    --- a/lowlevel/ThreadSize.java
    +++ b/lowlevel/ThreadSize.java
    @@ -2,7 +2,7 @@
     // (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
    -// {ValidateByHand}
    +// {ValidateByHand} Takes a long time or hangs
     import java.util.concurrent.*;
     import onjava.Nap;
     
    diff --git a/lowlevel/UnsafeReturn.java b/lowlevel/UnsafeReturn.java
    index bdd6f8919..d8463f32f 100644
    --- a/lowlevel/UnsafeReturn.java
    +++ b/lowlevel/UnsafeReturn.java
    @@ -16,5 +16,5 @@ public static void main(String[] args) {
       }
     }
     /* Output:
    -failed with: 3
    +failed with: 79
     */
    diff --git a/lowlevel/WorkStealingPool.java b/lowlevel/WorkStealingPool.java
    index 43a034195..b488cf2b4 100644
    --- a/lowlevel/WorkStealingPool.java
    +++ b/lowlevel/WorkStealingPool.java
    @@ -27,15 +27,15 @@ public static void main(String[] args)
       }
     }
     /* Output:
    -4
    -ForkJoinPool-1-worker-1
    -ForkJoinPool-1-worker-3
    -ForkJoinPool-1-worker-2
    -ForkJoinPool-1-worker-2
    -ForkJoinPool-1-worker-2
    +8
     ForkJoinPool-1-worker-2
    +ForkJoinPool-1-worker-1
     ForkJoinPool-1-worker-2
    +ForkJoinPool-1-worker-3
     ForkJoinPool-1-worker-2
    +ForkJoinPool-1-worker-1
     ForkJoinPool-1-worker-3
     ForkJoinPool-1-worker-1
    +ForkJoinPool-1-worker-4
    +ForkJoinPool-1-worker-2
     */
    diff --git a/newio/AvailableCharSets.java b/newio/AvailableCharSets.java
    index ac3f4b79c..eb9e39ad4 100644
    --- a/newio/AvailableCharSets.java
    +++ b/newio/AvailableCharSets.java
    @@ -33,10 +33,12 @@ public static void main(String[] args) {
     EUC-JP: csEUCPkdFmtjapanese, x-euc-jp, eucjis,
     Extended_UNIX_Code_Packed_Format_for_Japanese, euc_jp,
     eucjp, x-eucjp
    -EUC-KR: ksc5601-1987, csEUCKR, ksc5601_1987, ksc5601, 5601,
    +EUC-KR: ksc5601-1987, csEUCKR, ksc5601_1987, ksc5601,
    +5601,
     euc_kr, ksc_5601, ks_c_5601-1987, euckr
     GB18030: gb18030-2000
    -GB2312: gb2312, euc-cn, x-EUC-CN, euccn, EUC_CN, gb2312-80,
    +GB2312: gb2312, euc-cn, x-EUC-CN, euccn, EUC_CN,
    +gb2312-80,
     gb2312-1980
                       ...
     */
    diff --git a/newio/LockingMappedFiles.java b/newio/LockingMappedFiles.java
    index 92a4df674..f8ebcb5e3 100644
    --- a/newio/LockingMappedFiles.java
    +++ b/newio/LockingMappedFiles.java
    @@ -53,8 +53,8 @@ public void run() {
       }
     }
     /* Output:
    -Locked: 0 to 50331647
     Locked: 75497471 to 113246206
    +Locked: 0 to 50331647
     Released: 75497471 to 113246206
     Released: 0 to 50331647
     */
    diff --git a/newio/MappedIO.java b/newio/MappedIO.java
    index 16cd23717..beeadf3c1 100644
    --- a/newio/MappedIO.java
    +++ b/newio/MappedIO.java
    @@ -135,10 +135,10 @@ public static void main(String[] args) {
       }
     }
     /* Output:
    -Stream Write: 0.285
    -Mapped Write: 0.022
    -Stream Read: 0.311
    -Mapped Read: 0.009
    -Stream Read/Write: 1.368
    -Mapped Read/Write: 0.005
    +Stream Write: 0.615
    +Mapped Write: 0.050
    +Stream Read: 0.577
    +Mapped Read: 0.015
    +Stream Read/Write: 4.069
    +Mapped Read/Write: 0.013
     */
    diff --git a/newio/ViewBuffers.java b/newio/ViewBuffers.java
    index 8ba4a478e..c199101e1 100644
    --- a/newio/ViewBuffers.java
    +++ b/newio/ViewBuffers.java
    @@ -58,8 +58,8 @@ public static void main(String[] args) {
       }
     }
     /* Output:
    -Byte Buffer 0 -> 0, 1 -> 0, 2 -> 0, 3 -> 0, 4 -> 0, 5 -> 0,
    -6 -> 0, 7 -> 97,
    +Byte Buffer 0 -> 0, 1 -> 0, 2 -> 0, 3 -> 0, 4 -> 0, 5
    +-> 0, 6 -> 0, 7 -> 97,
     Char Buffer 0 -> NUL, 1 -> NUL, 2 -> NUL, 3 -> a,
     Float Buffer 0 -> 0.0, 1 -> 1.36E-43,
     Int Buffer 0 -> 0, 1 -> 97,
    diff --git a/objects/ShowProperties.java b/objects/ShowProperties.java
    index 2f59ebdcc..dcf7c737b 100644
    --- a/objects/ShowProperties.java
    +++ b/objects/ShowProperties.java
    @@ -15,8 +15,8 @@ public static void main(String[] args) {
     -- listing properties --
     java.runtime.name=Java(TM) SE Runtime Environment
     sun.boot.library.path=C:\Program
    -Files\Java\jdk1.8.0_102\jr...
    -java.vm.version=25.102-b14
    +Files\Java\jdk1.8.0_112\jr...
    +java.vm.version=25.112-b15
     java.vm.vendor=Oracle Corporation
     java.vendor.url=http://java.oracle.com/
     path.separator=;
    @@ -28,11 +28,12 @@ public static void main(String[] args) {
     sun.os.patch.level=
     java.vm.specification.name=Java Virtual Machine
     Specification
    -user.dir=C:\Users\bruce\Documents\Git\on-java\...
    -java.runtime.version=1.8.0_102-b14
    +user.dir=C:\Users\Bruce\Documents\GitHub\on-ja...
    +java.runtime.version=1.8.0_112-b15
     java.awt.graphicsenv=sun.awt.Win32GraphicsEnvironment
    -java.endorsed.dirs=C:\Program Files\Java\jdk1.8.0_102\jr...
    +java.endorsed.dirs=C:\Program
    +Files\Java\jdk1.8.0_112\jr...
     os.arch=amd64
    -java.io.tmpdir=C:\Users\bruce\AppData\Local\Temp\
    +java.io.tmpdir=C:\Users\Bruce\AppData\Local\Temp\
                       ...
     */
    diff --git a/onjava/CollectionMethodDifferences.java b/onjava/CollectionMethodDifferences.java
    index 4cfca583a..d31a30f93 100644
    --- a/onjava/CollectionMethodDifferences.java
    +++ b/onjava/CollectionMethodDifferences.java
    @@ -27,10 +27,11 @@ static void interfaces(Class type) {
       static void
       difference(Class superset, Class subset) {
         System.out.print(superset.getSimpleName() +
    -      " extends " + subset.getSimpleName() + ", adds: ");
    +      " extends " + subset.getSimpleName() +
    +      ", adds: ");
         Set comp = Sets.difference(
           methodSet(superset), methodSet(subset));
    -    comp.removeAll(object); // Don't show 'Object' methods
    +    comp.removeAll(object); // Ignore 'Object' methods
         System.out.println(comp);
         interfaces(superset);
       }
    @@ -65,23 +66,27 @@ public static void main(String[] args) {
     HashSet extends Set, adds: []
     Interfaces in HashSet: [Set, Cloneable, Serializable]
     LinkedHashSet extends HashSet, adds: []
    -Interfaces in LinkedHashSet: [Set, Cloneable, Serializable]
    -TreeSet extends Set, adds: [headSet, descendingIterator,
    -descendingSet, pollLast, subSet, floor, tailSet, ceiling,
    -last, lower, comparator, pollFirst, first, higher]
    +Interfaces in LinkedHashSet: [Set, Cloneable,
    +Serializable]
    +TreeSet extends Set, adds: [headSet,
    +descendingIterator, descendingSet, pollLast, subSet,
    +floor, tailSet, ceiling, last, lower, comparator,
    +pollFirst, first, higher]
     Interfaces in TreeSet: [NavigableSet, Cloneable,
     Serializable]
    -List extends Collection, adds: [replaceAll, get, indexOf,
    -subList, set, sort, lastIndexOf, listIterator]
    +List extends Collection, adds: [replaceAll, get,
    +indexOf, subList, set, sort, lastIndexOf, listIterator]
     Interfaces in List: [Collection]
    -ArrayList extends List, adds: [trimToSize, ensureCapacity]
    -Interfaces in ArrayList: [List, RandomAccess, Cloneable,
    -Serializable]
    -LinkedList extends List, adds: [offerFirst, poll, getLast,
    -offer, getFirst, removeFirst, element,
    -removeLastOccurrence, peekFirst, peekLast, push, pollFirst,
    -removeFirstOccurrence, descendingIterator, pollLast,
    -removeLast, pop, addLast, peek, offerLast, addFirst]
    +ArrayList extends List, adds: [trimToSize,
    +ensureCapacity]
    +Interfaces in ArrayList: [List, RandomAccess,
    +Cloneable, Serializable]
    +LinkedList extends List, adds: [offerFirst, poll,
    +getLast, offer, getFirst, removeFirst, element,
    +removeLastOccurrence, peekFirst, peekLast, push,
    +pollFirst, removeFirstOccurrence, descendingIterator,
    +pollLast, removeLast, pop, addLast, peek, offerLast,
    +addFirst]
     Interfaces in LinkedList: [List, Deque, Cloneable,
     Serializable]
     Queue extends Collection, adds: [poll, peek, offer,
    @@ -89,24 +94,24 @@ public static void main(String[] args) {
     Interfaces in Queue: [Collection]
     PriorityQueue extends Queue, adds: [comparator]
     Interfaces in PriorityQueue: [Serializable]
    -Map: [clear, compute, computeIfAbsent, computeIfPresent,
    -containsKey, containsValue, entrySet, equals, forEach, get,
    -getOrDefault, hashCode, isEmpty, keySet, merge, put,
    -putAll, putIfAbsent, remove, replace, replaceAll, size,
    -values]
    +Map: [clear, compute, computeIfAbsent,
    +computeIfPresent, containsKey, containsValue, entrySet,
    +equals, forEach, get, getOrDefault, hashCode, isEmpty,
    +keySet, merge, put, putAll, putIfAbsent, remove,
    +replace, replaceAll, size, values]
     HashMap extends Map, adds: []
     Interfaces in HashMap: [Map, Cloneable, Serializable]
     LinkedHashMap extends HashMap, adds: []
     Interfaces in LinkedHashMap: [Map]
    -SortedMap extends Map, adds: [lastKey, subMap, comparator,
    -firstKey, headMap, tailMap]
    +SortedMap extends Map, adds: [lastKey, subMap,
    +comparator, firstKey, headMap, tailMap]
     Interfaces in SortedMap: [Map]
     TreeMap extends Map, adds: [descendingKeySet,
    -navigableKeySet, higherEntry, higherKey, floorKey, subMap,
    -ceilingKey, pollLastEntry, firstKey, lowerKey, headMap,
    -tailMap, lowerEntry, ceilingEntry, descendingMap,
    -pollFirstEntry, lastKey, firstEntry, floorEntry,
    -comparator, lastEntry]
    +navigableKeySet, higherEntry, higherKey, floorKey,
    +subMap, ceilingKey, pollLastEntry, firstKey, lowerKey,
    +headMap, tailMap, lowerEntry, ceilingEntry,
    +descendingMap, pollFirstEntry, lastKey, firstEntry,
    +floorEntry, comparator, lastEntry]
     Interfaces in TreeMap: [NavigableMap, Cloneable,
     Serializable]
     */
    diff --git a/onjava/CountingIntegerList.java b/onjava/CountingIntegerList.java
    index f55aa043c..20e11fa25 100644
    --- a/onjava/CountingIntegerList.java
    +++ b/onjava/CountingIntegerList.java
    @@ -28,7 +28,7 @@ public static void main(String[] args) {
       }
     }
     /* Output:
    -[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, 26, 27, 28, 29]
    +[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, 26, 27, 28, 29]
     500
     */
    diff --git a/onjava/Countries.java b/onjava/Countries.java
    index fc82676dc..aff022731 100644
    --- a/onjava/Countries.java
    +++ b/onjava/Countries.java
    @@ -230,7 +230,9 @@ public int hashCode() {
           @Override
           public String getKey() { return DATA[index][0]; }
           @Override
    -      public String getValue() { return DATA[index][1]; }
    +      public String getValue() {
    +        return DATA[index][1];
    +      }
           @Override
           public String setValue(String value) {
             throw new UnsupportedOperationException();
    @@ -311,7 +313,8 @@ public static void main(String[] args) {
         System.out.println(capitals(10));
         System.out.println(names(10));
         System.out.println(new HashMap<>(capitals(3)));
    -    System.out.println(new LinkedHashMap<>(capitals(3)));
    +    System.out.println(
    +      new LinkedHashMap<>(capitals(3)));
         System.out.println(new TreeMap<>(capitals(3)));
         System.out.println(new Hashtable<>(capitals(3)));
         System.out.println(new HashSet<>(names(6)));
    @@ -327,16 +330,22 @@ public static void main(String[] args) {
     BOTSWANA=Gaberone, BURKINA FASO=Ouagadougou,
     BURUNDI=Bujumbura, CAMEROON=Yaounde, CAPE VERDE=Praia,
     CENTRAL AFRICAN REPUBLIC=Bangui, CHAD=N'djamena}
    -[ALGERIA, ANGOLA, BENIN, BOTSWANA, BURKINA FASO, BURUNDI,
    -CAMEROON, CAPE VERDE, CENTRAL AFRICAN REPUBLIC, CHAD]
    +[ALGERIA, ANGOLA, BENIN, BOTSWANA, BURKINA FASO,
    +BURUNDI, CAMEROON, CAPE VERDE, CENTRAL AFRICAN
    +REPUBLIC, CHAD]
     {BENIN=Porto-Novo, ANGOLA=Luanda, ALGERIA=Algiers}
     {ALGERIA=Algiers, ANGOLA=Luanda, BENIN=Porto-Novo}
     {ALGERIA=Algiers, ANGOLA=Luanda, BENIN=Porto-Novo}
     {ALGERIA=Algiers, ANGOLA=Luanda, BENIN=Porto-Novo}
    -[BENIN, BOTSWANA, ANGOLA, BURKINA FASO, ALGERIA, BURUNDI]
    -[ALGERIA, ANGOLA, BENIN, BOTSWANA, BURKINA FASO, BURUNDI]
    -[ALGERIA, ANGOLA, BENIN, BOTSWANA, BURKINA FASO, BURUNDI]
    -[ALGERIA, ANGOLA, BENIN, BOTSWANA, BURKINA FASO, BURUNDI]
    -[ALGERIA, ANGOLA, BENIN, BOTSWANA, BURKINA FASO, BURUNDI]
    +[BENIN, BOTSWANA, ANGOLA, BURKINA FASO, ALGERIA,
    +BURUNDI]
    +[ALGERIA, ANGOLA, BENIN, BOTSWANA, BURKINA FASO,
    +BURUNDI]
    +[ALGERIA, ANGOLA, BENIN, BOTSWANA, BURKINA FASO,
    +BURUNDI]
    +[ALGERIA, ANGOLA, BENIN, BOTSWANA, BURKINA FASO,
    +BURUNDI]
    +[ALGERIA, ANGOLA, BENIN, BOTSWANA, BURKINA FASO,
    +BURUNDI]
     Brasilia
     */
    diff --git a/onjava/Range.java b/onjava/Range.java
    index dfece996c..05e27fd8d 100644
    --- a/onjava/Range.java
    +++ b/onjava/Range.java
    @@ -22,7 +22,7 @@ public static int[] range(int start, int end) {
           result[i] = start + i;
         return result;
       }
    -  // Produce a sequence [start..end) incrementing by step
    +  // Produce sequence [start..end) incrementing by step
       public static
       int[] range(int start, int end, int step) {
         int sz = (end - start)/step;
    diff --git a/onjava/RmDir.java b/onjava/RmDir.java
    index 45cae6d27..f080f8cc3 100644
    --- a/onjava/RmDir.java
    +++ b/onjava/RmDir.java
    @@ -8,8 +8,10 @@
     import java.io.IOException;
     
     public class RmDir {
    -  public static void rmdir(Path dir) throws IOException {
    -    Files.walkFileTree(dir,new SimpleFileVisitor() {
    +  public static void rmdir(Path dir)
    +  throws IOException {
    +    Files.walkFileTree(dir,
    +      new SimpleFileVisitor() {
           @Override
           public FileVisitResult
           visitFile(Path file, BasicFileAttributes attrs)
    diff --git a/onjava/Suppliers.java b/onjava/Suppliers.java
    index c48ece0f5..c746637a2 100644
    --- a/onjava/Suppliers.java
    +++ b/onjava/Suppliers.java
    @@ -10,8 +10,8 @@
     
     public class Suppliers {
       // Create a collection and fill it:
    -  public static >
    -  C create(Supplier factory, Supplier gen, int n) {
    +  public static > C
    +  create(Supplier factory, Supplier gen, int n) {
         return Stream.generate(gen)
           .limit(n)
           .collect(factory, C::add, C::addAll);
    diff --git a/onjava/atunit/AtUnit.java b/onjava/atunit/AtUnit.java
    index 19d29d146..fcd19aa45 100644
    --- a/onjava/atunit/AtUnit.java
    +++ b/onjava/atunit/AtUnit.java
    @@ -20,7 +20,7 @@ public class AtUnit implements ProcessFiles.Strategy {
       public static void
       main(String[] args) throws Exception {
         ClassLoader.getSystemClassLoader()
    -      .setDefaultAssertionStatus(true); // Enable asserts
    +      .setDefaultAssertionStatus(true); // Enable assert
         new ProcessFiles(new AtUnit(), "class").start(args);
         if(failures == 0)
           System.out.println("OK (" + testsRun + " tests)");
    @@ -61,7 +61,8 @@ public void process(File cFile) {
           if(creator == null)
             try {
               if(!Modifier.isPublic(testClass
    -             .getDeclaredConstructor().getModifiers())) {
    +             .getDeclaredConstructor()
    +             .getModifiers())) {
                 System.out.println("Error: " + testClass +
                   " no-arg constructor must be public");
                 System.exit(1);
    @@ -112,11 +113,12 @@ void addIfTestMethod(Method m) {
               m.getReturnType().equals(void.class)))
             throw new RuntimeException("@Test method" +
               " must return boolean or void");
    -      m.setAccessible(true); // In case it's private, etc.
    +      m.setAccessible(true); // If it's private, etc.
           add(m);
         }
       }
    -  private static Method checkForCreatorMethod(Method m) {
    +  private static
    +  Method checkForCreatorMethod(Method m) {
         if(m.getAnnotation(TestObjectCreate.class) == null)
           return null;
         if(!m.getReturnType().equals(testClass))
    @@ -129,7 +131,8 @@ private static Method checkForCreatorMethod(Method m) {
         m.setAccessible(true);
         return m;
       }
    -  private static Method checkForCleanupMethod(Method m) {
    +  private static
    +  Method checkForCleanupMethod(Method m) {
         if(m.getAnnotation(TestObjectCleanup.class) == null)
           return null;
         if(!m.getReturnType().equals(void.class))
    diff --git a/onjava/atunit/ClassNameFinder.java b/onjava/atunit/ClassNameFinder.java
    index 68ffac0ea..0b309829d 100644
    --- a/onjava/atunit/ClassNameFinder.java
    +++ b/onjava/atunit/ClassNameFinder.java
    @@ -12,7 +12,8 @@
     public class ClassNameFinder {
       public static String thisClass(byte[] classBytes) {
         Map offsetTable = new HashMap<>();
    -    Map classNameTable = new HashMap<>();
    +    Map classNameTable =
    +      new HashMap<>();
         try {
           DataInputStream data = new DataInputStream(
             new ByteArrayInputStream(classBytes));
    @@ -62,7 +63,8 @@ public static String thisClass(byte[] classBytes) {
                 data.readShort();
                 break;
               default:
    -            throw new RuntimeException("Bad tag " + tag);
    +            throw
    +              new RuntimeException("Bad tag " + tag);
             }
           }
           short accessFlags = data.readShort();
    diff --git a/operators/AutoInc.java b/operators/AutoInc.java
    index 385ca9731..71309a02d 100644
    --- a/operators/AutoInc.java
    +++ b/operators/AutoInc.java
    @@ -7,21 +7,21 @@
     public class AutoInc {
       public static void main(String[] args) {
         int i = 1;
    -    System.out.println("i : " + i);
    -    System.out.println("++i : " + ++i); // Pre-increment
    -    System.out.println("i++ : " + i++); // Post-increment
    -    System.out.println("i : " + i);
    -    System.out.println("--i : " + --i); // Pre-decrement
    -    System.out.println("i-- : " + i--); // Post-decrement
    -    System.out.println("i : " + i);
    +    System.out.println("i: " + i);
    +    System.out.println("++i: " + ++i); // Pre-increment
    +    System.out.println("i++: " + i++); // Post-increment
    +    System.out.println("i: " + i);
    +    System.out.println("--i: " + --i); // Pre-decrement
    +    System.out.println("i--: " + i--); // Post-decrement
    +    System.out.println("i: " + i);
       }
     }
     /* Output:
    -i : 1
    -++i : 2
    -i++ : 2
    -i : 3
    ---i : 2
    -i-- : 2
    -i : 1
    +i: 1
    +++i: 2
    +i++: 2
    +i: 3
    +--i: 2
    +i--: 2
    +i: 1
     */
    diff --git a/operators/Literals.java b/operators/Literals.java
    index 2f7804044..dbf19822d 100644
    --- a/operators/Literals.java
    +++ b/operators/Literals.java
    @@ -24,7 +24,7 @@ public static void main(String[] args) {
         System.out.println(
           "s: " + Integer.toBinaryString(s));
         long n1 = 200L; // long suffix
    -    long n2 = 200l; // long suffix (but can be confusing)
    +    long n2 = 200l; // long suffix (can be confusing)
         long n3 = 200;
         // Java 7 Binary Literals:
         byte blb = (byte)0b00110101;
    diff --git a/operators/URShift.java b/operators/URShift.java
    index 95350a57e..46bdbaa82 100644
    --- a/operators/URShift.java
    +++ b/operators/URShift.java
    @@ -30,8 +30,8 @@ public static void main(String[] args) {
     /* Output:
     11111111111111111111111111111111
     1111111111111111111111
    -11111111111111111111111111111111111111111111111111111111111
    -11111
    +1111111111111111111111111111111111111111111111111111111
    +111111111
     111111111111111111111111111111111111111111111111111111
     11111111111111111111111111111111
     11111111111111111111111111111111
    diff --git a/patterns/chain/ChainOfResponsibility.java b/patterns/chain/ChainOfResponsibility.java
    index 61fa8faa0..208d52e31 100644
    --- a/patterns/chain/ChainOfResponsibility.java
    +++ b/patterns/chain/ChainOfResponsibility.java
    @@ -52,14 +52,15 @@ public static Result bisection(List line) {
         else
           return new Fail();
       }
    -  static List, Result>> algorithms =
    -    Arrays.asList(
    +  static List, Result>>
    +    algorithms = Arrays.asList(
           FindMinima::leastSquares,
           FindMinima::perturbation,
           FindMinima::bisection
         );
       public static Result minima(List line) {
    -    for(Function, Result> alg : algorithms) {
    +    for(Function, Result> alg :
    +        algorithms) {
           Result result = alg.apply(line);
           if(result.success)
             return result;
    diff --git a/polymorphism/FieldAccess.java b/polymorphism/FieldAccess.java
    index 7c72d4817..2ab7e02cb 100644
    --- a/polymorphism/FieldAccess.java
    +++ b/polymorphism/FieldAccess.java
    @@ -31,5 +31,6 @@ public static void main(String[] args) {
     }
     /* Output:
     sup.field = 0, sup.getField() = 1
    -sub.field = 1, sub.getField() = 1, sub.getSuperField() = 0
    +sub.field = 1, sub.getField() = 1, sub.getSuperField()
    += 0
     */
    diff --git a/polymorphism/Frog.java b/polymorphism/Frog.java
    index f36de16cd..c9231de38 100644
    --- a/polymorphism/Frog.java
    +++ b/polymorphism/Frog.java
    @@ -76,7 +76,8 @@ protected void dispose() {
     }
     
     public class Frog extends Amphibian {
    -  private Characteristic p = new Characteristic("Croaks");
    +  private Characteristic p =
    +    new Characteristic("Croaks");
       private Description t = new Description("Eats Bugs");
       public Frog() { System.out.println("Frog()"); }
       @Override
    diff --git a/polymorphism/PrivateOverride.java b/polymorphism/PrivateOverride.java
    index cd6f895e6..a072095e1 100644
    --- a/polymorphism/PrivateOverride.java
    +++ b/polymorphism/PrivateOverride.java
    @@ -7,7 +7,9 @@
     package polymorphism;
     
     public class PrivateOverride {
    -  private void f() { System.out.println("private f()"); }
    +  private void f() {
    +    System.out.println("private f()");
    +  }
       public static void main(String[] args) {
         PrivateOverride po = new Derived();
         po.f();
    diff --git a/polymorphism/PrivateOverride2.java b/polymorphism/PrivateOverride2.java
    index fa4768669..1d0c07c81 100644
    --- a/polymorphism/PrivateOverride2.java
    +++ b/polymorphism/PrivateOverride2.java
    @@ -7,7 +7,9 @@
     package polymorphism;
     
     public class PrivateOverride2 {
    -  private void f() { System.out.println("private f()"); }
    +  private void f() {
    +    System.out.println("private f()");
    +  }
       public static void main(String[] args) {
         PrivateOverride2 po = new Derived2();
         po.f();
    diff --git a/polymorphism/RTTI.java b/polymorphism/RTTI.java
    index c7ed65f54..5ddfa82f5 100644
    --- a/polymorphism/RTTI.java
    +++ b/polymorphism/RTTI.java
    @@ -36,7 +36,8 @@ public static void main(String[] args) {
     }
     /* Output:
     ___[ Error Output ]___
    -Exception in thread "main" java.lang.ClassCastException:
    -Useful cannot be cast to MoreUseful
    +Exception in thread "main"
    +java.lang.ClassCastException: Useful cannot be cast to
    +MoreUseful
             at RTTI.main(RTTI.java:31)
     */
    diff --git a/preferences/PreferencesDemo.java b/preferences/PreferencesDemo.java
    deleted file mode 100644
    index 597ed06ff..000000000
    --- a/preferences/PreferencesDemo.java
    +++ /dev/null
    @@ -1,41 +0,0 @@
    -// preferences/PreferencesDemo.java
    -// (c)2017 MindView LLC: see Copyright.txt
    -// We make no guarantees that this code is fit for any purpose.
    -// Visit http://OnJava8.com for more book information.
    -import java.util.prefs.*;
    -
    -public class PreferencesDemo {
    -  public static void
    -  main(String[] args) throws Exception {
    -    Preferences prefs = Preferences
    -      .userNodeForPackage(PreferencesDemo.class);
    -    prefs.put("Location", "Oz");
    -    prefs.put("Footwear", "Ruby Slippers");
    -    prefs.putInt("Companions", 4);
    -    prefs.putBoolean("Are there witches?", true);
    -    int usageCount = prefs.getInt("UsageCount", 0);
    -    usageCount++;
    -    prefs.putInt("UsageCount", usageCount);
    -    for(String key : prefs.keys())
    -      System.out.println(key + ": "
    -        + prefs.get(key, null));
    -    // You must always provide a default value:
    -    System.out.println(
    -      "How many companions does Dorothy have? " +
    -      prefs.getInt("Companions", 0));
    -  }
    -}
    -/* Output:
    -Location: Oz
    -Footwear: Ruby Slippers
    -Companions: 4
    -Are there witches?: true
    -UsageCount: 58
    -How many companions does Dorothy have? 4
    -___[ Error Output ]___
    -May 02, 2017 3:23:40 PM java.util.prefs.WindowsPreferences
    -
    -WARNING: Could not open/create prefs root node
    -Software\JavaSoft\Prefs at root 0x80000002. Windows
    -RegCreateKeyEx(...) returned error code 5.
    -*/
    diff --git a/references/Compete.java b/references/Compete.java
    index 34bf4594b..3c825d387 100644
    --- a/references/Compete.java
    +++ b/references/Compete.java
    @@ -84,6 +84,6 @@ public class Compete {
       }
     }
     /* Output:
    -Duplication via serialization: 305 Milliseconds
    -Duplication via cloning: 13 Milliseconds
    +Duplication via serialization: 516 Milliseconds
    +Duplication via cloning: 71 Milliseconds
     */
    diff --git a/references/HorrorFlick.java b/references/HorrorFlick.java
    index 8c47f721f..ea310ca4f 100644
    --- a/references/HorrorFlick.java
    +++ b/references/HorrorFlick.java
    @@ -2,7 +2,7 @@
     // (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
    -// You can insert Cloneability at any level of inheritance
    +// Insert Cloneability at any level of inheritance
     
     class Person {}
     
    diff --git a/reuse/BlankFinal.java b/reuse/BlankFinal.java
    index dc73da65a..9a45fe6b3 100644
    --- a/reuse/BlankFinal.java
    +++ b/reuse/BlankFinal.java
    @@ -13,14 +13,14 @@ public class BlankFinal {
       private final int i = 0; // Initialized final
       private final int j; // Blank final
       private final Poppet p; // Blank final reference
    -  // Blank finals MUST be initialized in the constructor:
    +  // Blank finals MUST be initialized in constructor:
       public BlankFinal() {
         j = 1; // Initialize blank final
    -    p = new Poppet(1); // Initialize blank final reference
    +    p = new Poppet(1); // Init blank final reference
       }
       public BlankFinal(int x) {
         j = x; // Initialize blank final
    -    p = new Poppet(x); // Initialize blank final reference
    +    p = new Poppet(x); // Init blank final reference
       }
       public static void main(String[] args) {
         new BlankFinal();
    diff --git a/reuse/Detergent.java b/reuse/Detergent.java
    index c8edb4fe9..6f1c08520 100644
    --- a/reuse/Detergent.java
    +++ b/reuse/Detergent.java
    @@ -41,7 +41,8 @@ public static void main(String[] args) {
       }
     }
     /* Output:
    -Cleanser dilute() apply() Detergent.scrub() scrub() foam()
    +Cleanser dilute() apply() Detergent.scrub() scrub()
    +foam()
     Testing base class:
     Cleanser dilute() apply() scrub()
     */
    diff --git a/serialization/Logon.java b/serialization/Logon.java
    index 32d49576e..7d27e4d15 100644
    --- a/serialization/Logon.java
    +++ b/serialization/Logon.java
    @@ -52,11 +52,11 @@ public static void main(String[] args) {
     /* Output:
     logon a = logon info:
        username: Hulk
    -   date: Tue May 02 15:23:47 MDT 2017
    +   date: Tue May 09 06:07:47 MDT 2017
        password: myLittlePony
    -Recovering object at Tue May 02 15:23:48 MDT 2017
    +Recovering object at Tue May 09 06:07:49 MDT 2017
     logon a = logon info:
        username: Hulk
    -   date: Tue May 02 15:23:47 MDT 2017
    +   date: Tue May 09 06:07:47 MDT 2017
        password: null
     */
    diff --git a/serialization/MyWorld.java b/serialization/MyWorld.java
    index 1bff977a1..5cdf5778d 100644
    --- a/serialization/MyWorld.java
    +++ b/serialization/MyWorld.java
    @@ -77,19 +77,23 @@ public static void main(String[] args) {
       }
     }
     /* Output:
    -animals: [Bosco the dog[Animal@15db9742], House@6d06d69c
    +animals: [Bosco the dog[Animal@15db9742],
    +House@6d06d69c
     , Ralph the hamster[Animal@7852e922], House@6d06d69c
     , Molly the cat[Animal@4e25154f], House@6d06d69c
     ]
    -animals1: [Bosco the dog[Animal@7ba4f24f], House@3b9a45b3
    +animals1: [Bosco the dog[Animal@7ba4f24f],
    +House@3b9a45b3
     , Ralph the hamster[Animal@7699a589], House@3b9a45b3
     , Molly the cat[Animal@58372a00], House@3b9a45b3
     ]
    -animals2: [Bosco the dog[Animal@7ba4f24f], House@3b9a45b3
    +animals2: [Bosco the dog[Animal@7ba4f24f],
    +House@3b9a45b3
     , Ralph the hamster[Animal@7699a589], House@3b9a45b3
     , Molly the cat[Animal@58372a00], House@3b9a45b3
     ]
    -animals3: [Bosco the dog[Animal@4dd8dc3], House@6d03e736
    +animals3: [Bosco the dog[Animal@4dd8dc3],
    +House@6d03e736
     , Ralph the hamster[Animal@568db2f2], House@6d03e736
     , Molly the cat[Animal@378bf509], House@6d03e736
     ]
    diff --git a/streams/ArrayStreams.java b/streams/ArrayStreams.java
    index 48f8f8856..8bcdbb8af 100644
    --- a/streams/ArrayStreams.java
    +++ b/streams/ArrayStreams.java
    @@ -7,7 +7,8 @@
     
     public class ArrayStreams {
       public static void main(String[] args) {
    -    Arrays.stream(new double[] { 3.14159, 2.718, 1.618 })
    +    Arrays.stream(
    +      new double[] { 3.14159, 2.718, 1.618 })
           .forEach(n -> System.out.format("%f ", n));
         System.out.println();
         Arrays.stream(new int[] { 1, 3, 5 })
    diff --git a/streams/FileToWordsRegexp.java b/streams/FileToWordsRegexp.java
    index 55a2cb654..3132cd671 100644
    --- a/streams/FileToWordsRegexp.java
    +++ b/streams/FileToWordsRegexp.java
    @@ -16,7 +16,8 @@ public FileToWordsRegexp(String filePath)
           .collect(Collectors.joining(" "));
       }
       public Stream stream() {
    -    return Pattern.compile("[ .,?]+").splitAsStream(all);
    +    return Pattern
    +      .compile("[ .,?]+").splitAsStream(all);
       }
       public static void
       main(String[] args) throws Exception {
    diff --git a/streams/ForEach.java b/streams/ForEach.java
    index 807bab60f..37b537182 100644
    --- a/streams/ForEach.java
    +++ b/streams/ForEach.java
    @@ -23,6 +23,6 @@ public static void main(String[] args) {
     }
     /* Output:
     258 555 693 861 961 429 868 200 522 207 288 128 551 589
    -551 589 861 555 200 693 429 258 288 522 207 128 868 961
    +551 861 429 589 200 522 555 693 258 128 868 288 961 207
     258 555 693 861 961 429 868 200 522 207 288 128 551 589
     */
    diff --git a/streams/LastElement.java b/streams/LastElement.java
    index d482c1efb..e5fa30c1e 100644
    --- a/streams/LastElement.java
    +++ b/streams/LastElement.java
    @@ -14,7 +14,8 @@ public static void main(String[] args) {
         Optional lastobj =
           Stream.of("one", "two", "three")
             .reduce((n1, n2) -> n2);
    -    System.out.println(lastobj.orElse("Nothing there!"));
    +    System.out.println(
    +      lastobj.orElse("Nothing there!"));
       }
     }
     /* Output:
    diff --git a/streams/MapCollector.java b/streams/MapCollector.java
    index 3d4c97bf8..01f71d0ef 100644
    --- a/streams/MapCollector.java
    +++ b/streams/MapCollector.java
    @@ -43,5 +43,6 @@ public static void main(String[] args) {
       }
     }
     /* Output:
    -{688=W, 309=C, 293=B, 761=N, 858=N, 668=G, 622=F, 751=N}
    +{688=W, 309=C, 293=B, 761=N, 858=N, 668=G, 622=F,
    +751=N}
     */
    diff --git a/streams/OptionalFilter.java b/streams/OptionalFilter.java
    index 1636a9b2e..a15df5da1 100644
    --- a/streams/OptionalFilter.java
    +++ b/streams/OptionalFilter.java
    @@ -13,7 +13,8 @@ class OptionalFilter {
       static Stream testStream() {
         return Arrays.stream(elements);
       }
    -  static void test(String descr, Predicate pred) {
    +  static void
    +  test(String descr, Predicate pred) {
         System.out.println(" ---( " + descr + " )---");
         for(int i = 0; i <= elements.length; i++) {
           System.out.println(
    @@ -28,7 +29,8 @@ public static void main(String[] args) {
         test("false", str -> false);
         test("str != \"\"", str -> str != "");
         test("str.length() == 3", str -> str.length() == 3);
    -    test("startsWith(\"B\")", str -> str.startsWith("B"));
    +    test("startsWith(\"B\")",
    +         str -> str.startsWith("B"));
       }
     }
     /* Output:
    diff --git a/streams/OptionalFlatMap.java b/streams/OptionalFlatMap.java
    index 4e06156df..ce71c3f0b 100644
    --- a/streams/OptionalFlatMap.java
    +++ b/streams/OptionalFlatMap.java
    @@ -24,11 +24,13 @@ static void test(String descr,
       }
       public static void main(String[] args) {
     
    -    test("Add brackets", s -> Optional.of("[" + s + "]"));
    +    test("Add brackets",
    +         s -> Optional.of("[" + s + "]"));
     
         test("Increment", s -> {
           try {
    -        return Optional.of(Integer.parseInt(s) + 1 + "");
    +        return Optional.of(
    +          Integer.parseInt(s) + 1 + "");
           } catch(NumberFormatException e) {
             return Optional.of(s);
           }
    diff --git a/streams/OptionalMap.java b/streams/OptionalMap.java
    index d4e02cac1..06d1bf3c8 100644
    --- a/streams/OptionalMap.java
    +++ b/streams/OptionalMap.java
    @@ -25,7 +25,8 @@ static Stream testStream() {
       public static void main(String[] args) {
     
         // If Optional is not empty, map() first extracts
    -    // the contents which it then passes to the function:
    +    // the contents which it then passes
    +    // to the function:
     
         test("Add brackets", s -> "[" + s + "]");
     
    diff --git a/streams/Optionals.java b/streams/Optionals.java
    index 18163f218..19331d06f 100644
    --- a/streams/Optionals.java
    +++ b/streams/Optionals.java
    @@ -31,8 +31,8 @@ static void orElseThrow(Optional optString) {
           System.out.println("Caught " + e);
         }
       }
    -  static void
    -  test(String testName, Consumer> cos) {
    +  static void test(String testName,
    +    Consumer> cos) {
         System.out.println(" === " + testName + " === ");
         cos.accept(Stream.of("Epithets").findFirst());
         cos.accept(Stream.empty().findFirst());
    diff --git a/streams/Prime.java b/streams/Prime.java
    index 96ebf3825..6c72b5189 100644
    --- a/streams/Prime.java
    +++ b/streams/Prime.java
    @@ -11,7 +11,8 @@ public static boolean isPrime(long n) {
           .noneMatch(i -> n % i == 0);
       }
       public LongStream numbers() {
    -    return iterate(2, i -> i + 1).filter(Prime::isPrime);
    +    return iterate(2, i -> i + 1)
    +      .filter(Prime::isPrime);
       }
       public static void main(String[] args) {
         new Prime().numbers()
    diff --git a/streams/SelectElement.java b/streams/SelectElement.java
    index d4aff8c6a..83a9f5e61 100644
    --- a/streams/SelectElement.java
    +++ b/streams/SelectElement.java
    @@ -20,5 +20,5 @@ public static void main(String[] args) {
     258
     258
     258
    -8
    +242
     */
    diff --git a/streams/StreamOf.java b/streams/StreamOf.java
    index 3e897be2c..eb38bd8af 100644
    --- a/streams/StreamOf.java
    +++ b/streams/StreamOf.java
    @@ -6,7 +6,8 @@
     
     public class StreamOf {
       public static void main(String[] args) {
    -    Stream.of(new Bubble(1), new Bubble(2), new Bubble(3))
    +    Stream.of(
    +      new Bubble(1), new Bubble(2), new Bubble(3))
           .forEach(System.out::println);
         Stream.of("It's ", "a ", "wonderful ",
           "day ", "for ", "pie!")
    diff --git a/streams/StreamOfRandoms.java b/streams/StreamOfRandoms.java
    index 64b79198a..7f0f353de 100644
    --- a/streams/StreamOfRandoms.java
    +++ b/streams/StreamOfRandoms.java
    @@ -15,5 +15,6 @@ public static void main(String[] args) {
       }
     }
     /* Output:
    -58 -1 55 93 -1 61 61 29 -1 68 0 22 7 -1 88 28 51 89 9 -1
    +58 -1 55 93 -1 61 61 29 -1 68 0 22 7 -1 88 28 51 89 9
    +-1
     */
    diff --git a/streams/TreeSetOfWords.java b/streams/TreeSetOfWords.java
    index 05746f706..43cb63bd9 100644
    --- a/streams/TreeSetOfWords.java
    +++ b/streams/TreeSetOfWords.java
    @@ -21,10 +21,11 @@ public class TreeSetOfWords {
       }
     }
     /* Output:
    -[Arrays, Collectors, Exception, Files, Output, Paths, Set,
    -String, System, TreeSet, TreeSetOfWords, args, class,
    -collect, file, filter, flatMap, get, import, java, length,
    -limit, lines, main, map, matches, new, nio, numbers, out,
    -println, public, split, static, stream, streams, throws,
    -toCollection, trim, util, void, words2]
    +[Arrays, Collectors, Exception, Files, Output, Paths,
    +Set, String, System, TreeSet, TreeSetOfWords, args,
    +class, collect, file, filter, flatMap, get, import,
    +java, length, limit, lines, main, map, matches, new,
    +nio, numbers, out, println, public, split, static,
    +stream, streams, throws, toCollection, trim, util,
    +void, words2]
     */
    diff --git a/strings/ArrayListDisplay.java b/strings/ArrayListDisplay.java
    index db22ca530..cdbab7708 100644
    --- a/strings/ArrayListDisplay.java
    +++ b/strings/ArrayListDisplay.java
    @@ -16,6 +16,7 @@ public static void main(String[] args) {
       }
     }
     /* Output:
    -[Americano 0, Latte 1, Americano 2, Mocha 3, Mocha 4, Breve
    -5, Americano 6, Latte 7, Cappuccino 8, Cappuccino 9]
    +[Americano 0, Latte 1, Americano 2, Mocha 3, Mocha 4,
    +Breve 5, Americano 6, Latte 7, Cappuccino 8, Cappuccino
    +9]
     */
    diff --git a/strings/DatabaseException.java b/strings/DatabaseException.java
    index 73d6b665d..136e4188c 100644
    --- a/strings/DatabaseException.java
    +++ b/strings/DatabaseException.java
    @@ -4,8 +4,8 @@
     // Visit http://OnJava8.com for more book information.
     
     public class DatabaseException extends Exception {
    -  public DatabaseException(int transactionID, int queryID,
    -    String message) {
    +  public DatabaseException(int transactionID,
    +    int queryID, String message) {
         super(String.format("(t%d, q%d) %s", transactionID,
             queryID, message));
       }
    diff --git a/strings/Finding.java b/strings/Finding.java
    index 001e304d8..52dc5c99f 100644
    --- a/strings/Finding.java
    +++ b/strings/Finding.java
    @@ -21,7 +21,7 @@ public static void main(String[] args) {
     }
     /* Output:
     Evening is full of the linnet s wings
    -Evening vening ening ning ing ng g is is s full full ull ll
    -l of of f the the he e linnet linnet innet nnet net et t s
    -s wings wings ings ngs gs s
    +Evening vening ening ning ing ng g is is s full full
    +ull ll l of of f the the he e linnet linnet innet nnet
    +net et t s s wings wings ings ngs gs s
     */
    diff --git a/strings/Groups.java b/strings/Groups.java
    index e4f212306..22ff08678 100644
    --- a/strings/Groups.java
    +++ b/strings/Groups.java
    @@ -15,9 +15,9 @@ public class Groups {
         "Beware the Jubjub bird, and shun\n" +
         "The frumious Bandersnatch.";
       public static void main(String[] args) {
    -    Matcher m =
    -      Pattern.compile("(?m)(\\S+)\\s+((\\S+)\\s+(\\S+))$")
    -        .matcher(POEM);
    +    Matcher m = Pattern.compile(
    +      "(?m)(\\S+)\\s+((\\S+)\\s+(\\S+))$")
    +      .matcher(POEM);
         while(m.find()) {
           for(int j = 0; j <= m.groupCount(); j++)
             System.out.print("[" + m.group(j) + "]");
    diff --git a/strings/InfiniteRecursion.java b/strings/InfiniteRecursion.java
    index 857f4a67a..b5c81460d 100644
    --- a/strings/InfiniteRecursion.java
    +++ b/strings/InfiniteRecursion.java
    @@ -3,8 +3,7 @@
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Accidental recursion
    -// {ThrowsException}
    -// {ValidateByHand}
    +// {ValidateByHand} Throws exception
     import java.util.*;
     import java.util.stream.*;
     
    diff --git a/strings/JGrep.java b/strings/JGrep.java
    index 2cde029e3..3581edbcb 100644
    --- a/strings/JGrep.java
    +++ b/strings/JGrep.java
    @@ -13,7 +13,8 @@ public class JGrep {
       public static void
       main(String[] args) throws Exception {
         if(args.length < 2) {
    -      System.out.println("Usage: java JGrep file regex");
    +      System.out.println(
    +        "Usage: java JGrep file regex");
           System.exit(0);
         }
         Pattern p = Pattern.compile(args[1]);
    diff --git a/strings/ReceiptBuilder.java b/strings/ReceiptBuilder.java
    index bfca7a6b4..cc782fac8 100644
    --- a/strings/ReceiptBuilder.java
    +++ b/strings/ReceiptBuilder.java
    @@ -9,25 +9,30 @@ public class ReceiptBuilder {
       private Formatter f =
         new Formatter(new StringBuilder());
       public ReceiptBuilder() {
    -    f.format("%-15s %5s %10s%n", "Item", "Qty", "Price");
    -    f.format("%-15s %5s %10s%n", "----", "---", "-----");
    +    f.format(
    +      "%-15s %5s %10s%n", "Item", "Qty", "Price");
    +    f.format(
    +      "%-15s %5s %10s%n", "----", "---", "-----");
       }
       public void add(String name, int qty, double price) {
         f.format("%-15.15s %5d %10.2f%n", name, qty, price);
         total += price * qty;
       }
       public String build() {
    -    f.format("%-15s %5s %10.2f%n", "Tax", "", total*0.06);
    +    f.format("%-15s %5s %10.2f%n", "Tax", "",
    +      total * 0.06);
         f.format("%-15s %5s %10s%n", "", "", "-----");
         f.format("%-15s %5s %10.2f%n", "Total", "",
           total * 1.06);
         return f.toString();
       }
       public static void main(String[] args) {
    -    ReceiptBuilder receiptBuilder = new ReceiptBuilder();
    +    ReceiptBuilder receiptBuilder =
    +      new ReceiptBuilder();
         receiptBuilder.add("Jack's Magic Beans", 4, 4.25);
         receiptBuilder.add("Princess Peas", 3, 5.1);
    -    receiptBuilder.add("Three Bears Porridge", 1, 14.29);
    +    receiptBuilder.add(
    +      "Three Bears Porridge", 1, 14.29);
         System.out.println(receiptBuilder.build());
       }
     }
    diff --git a/strings/Replacing.java b/strings/Replacing.java
    index a098b90ba..b0e73c980 100644
    --- a/strings/Replacing.java
    +++ b/strings/Replacing.java
    @@ -14,7 +14,8 @@ public static void main(String[] args) {
     }
     /* Output:
     Then, when you have located the shrubbery, you must cut
    -down the mightiest tree in the forest... with... a herring!
    -Then, when you have found the banana, you must cut down the
    -mightiest banana in the forest... with... a banana!
    +down the mightiest tree in the forest...with... a
    +herring!
    +Then, when you have found the banana, you must cut down
    +the mightiest banana in the forest...with... a banana!
     */
    diff --git a/strings/ReplacingStringTokenizer.java b/strings/ReplacingStringTokenizer.java
    index 0722af334..c6a168db0 100644
    --- a/strings/ReplacingStringTokenizer.java
    +++ b/strings/ReplacingStringTokenizer.java
    @@ -6,12 +6,14 @@
     
     public class ReplacingStringTokenizer {
       public static void main(String[] args) {
    -    String input = "But I'm not dead yet! I feel happy!";
    +    String input =
    +      "But I'm not dead yet! I feel happy!";
         StringTokenizer stoke = new StringTokenizer(input);
         while(stoke.hasMoreElements())
           System.out.print(stoke.nextToken() + " ");
         System.out.println();
    -    System.out.println(Arrays.toString(input.split(" ")));
    +    System.out.println(
    +      Arrays.toString(input.split(" ")));
         Scanner scanner = new Scanner(input);
         while(scanner.hasNext())
           System.out.print(scanner.next() + " ");
    diff --git a/strings/SimpleRead.java b/strings/SimpleRead.java
    index da9320a63..ee3e277fb 100644
    --- a/strings/SimpleRead.java
    +++ b/strings/SimpleRead.java
    @@ -5,15 +5,16 @@
     import java.io.*;
     
     public class SimpleRead {
    -  public static BufferedReader input = new BufferedReader(
    -    new StringReader("Sir Robin of Camelot\n22 1.61803"));
    +  public static BufferedReader input =
    +    new BufferedReader(new StringReader(
    +    "Sir Robin of Camelot\n22 1.61803"));
       public static void main(String[] args) {
         try {
           System.out.println("What is your name?");
           String name = input.readLine();
           System.out.println(name);
    -      System.out.println(
    -        "How old are you? What is your favorite double?");
    +      System.out.println("How old are you? " +
    +        "What is your favorite double?");
           System.out.println("(input:  )");
           String numbers = input.readLine();
           System.out.println(numbers);
    diff --git a/strings/Splitting.java b/strings/Splitting.java
    index ab91ea6d8..e81bbc8c2 100644
    --- a/strings/Splitting.java
    +++ b/strings/Splitting.java
    @@ -6,9 +6,9 @@
     
     public class Splitting {
       public static String knights =
    -    "Then, when you have found the shrubbery, you must " +
    -    "cut down the mightiest tree in the forest... " +
    -    "with... a herring!";
    +    "Then, when you have found the shrubbery, " +
    +    "you must cut down the mightiest tree in the " +
    +    "forest...with... a herring!";
       public static void split(String regex) {
         System.out.println(
           Arrays.toString(knights.split(regex)));
    @@ -16,16 +16,17 @@ public static void split(String regex) {
       public static void main(String[] args) {
         split(" "); // Doesn't have to contain regex chars
         split("\\W+"); // Non-word characters
    -    split("n\\W+"); // 'n' followed by non-word characters
    +    split("n\\W+"); // 'n' followed by non-words
       }
     }
     /* Output:
    -[Then,, when, you, have, found, the, shrubbery,, you, must,
    -cut, down, the, mightiest, tree, in, the, forest...,
    -with..., a, herring!]
    -[Then, when, you, have, found, the, shrubbery, you, must,
    -cut, down, the, mightiest, tree, in, the, forest, with, a,
    -herring]
    -[The, whe, you have found the shrubbery, you must cut dow,
    -the mightiest tree i, the forest... with... a herring!]
    +[Then,, when, you, have, found, the, shrubbery,, you,
    +must, cut, down, the, mightiest, tree, in, the,
    +forest...with..., a, herring!]
    +[Then, when, you, have, found, the, shrubbery, you,
    +must, cut, down, the, mightiest, tree, in, the, forest,
    +with, a, herring]
    +[The, whe, you have found the shrubbery, you must cut
    +dow, the mightiest tree i, the forest...with... a
    +herring!]
     */
    diff --git a/strings/StartEnd.java b/strings/StartEnd.java
    index 371b7d3dd..ebf985ee4 100644
    --- a/strings/StartEnd.java
    +++ b/strings/StartEnd.java
    @@ -8,7 +8,8 @@ public class StartEnd {
       public static String input =
         "As long as there is injustice, whenever a\n" +
         "Targathian baby cries out, wherever a distress\n" +
    -    "signal sounds among the stars ... We'll be there.\n"+
    +    "signal sounds among the stars " +
    +    "... We'll be there.\n"+
         "This fine ship, and this fine crew ...\n" +
         "Never give up! Never surrender!";
       private static class Display {
    @@ -60,7 +61,8 @@ public static void main(String[] args) {
     T\w+
     find() 'Targathian' start = 0 end = 10
     lookingAt() start = 0 end = 10
    -input : signal sounds among the stars ... We'll be there.
    +input : signal sounds among the stars ... We'll be
    +there.
     \w*ere\w*
     find() 'there' start = 43 end = 48
     input : This fine ship, and this fine crew ...
    diff --git a/strings/TheReplacements.java b/strings/TheReplacements.java
    index 133967972..c3be94b65 100644
    --- a/strings/TheReplacements.java
    +++ b/strings/TheReplacements.java
    @@ -18,14 +18,14 @@ public class TheReplacements {
         String s = Files.lines(
           Paths.get("TheReplacements.java"))
           .collect(Collectors.joining("\n"));
    -    // Match the specially commented block of text above:
    +    // Match specially commented block of text above:
         Matcher mInput = Pattern.compile(
           "/\\*!(.*)!\\*/", Pattern.DOTALL).matcher(s);
         if(mInput.find())
           s = mInput.group(1); // Captured by parentheses
         // Replace two or more spaces with a single space:
         s = s.replaceAll(" {2,}", " ");
    -    // Replace one or more spaces at the beginning of each
    +    // Replace 1+ spaces at the beginning of each
         // line with no spaces. Must enable MULTILINE mode:
         s = s.replaceAll("(?m)^ +", "");
         System.out.println(s);
    @@ -36,7 +36,8 @@ public class TheReplacements {
         // Process the find information as you
         // perform the replacements:
         while(m.find())
    -      m.appendReplacement(sbuf, m.group().toUpperCase());
    +      m.appendReplacement(
    +        sbuf, m.group().toUpperCase());
         // Put in the remainder of the text:
         m.appendTail(sbuf);
         System.out.println(sbuf);
    diff --git a/strings/Turtle.java b/strings/Turtle.java
    index 3e80ce9ce..edbebfeb4 100644
    --- a/strings/Turtle.java
    +++ b/strings/Turtle.java
    @@ -13,7 +13,8 @@ public Turtle(String name, Formatter f) {
         this.f = f;
       }
       public void move(int x, int y) {
    -    f.format("%s The Turtle is at (%d,%d)%n", name, x, y);
    +    f.format("%s The Turtle is at (%d,%d)%n",
    +      name, x, y);
       }
       public static void main(String[] args) {
         PrintStream outAlias = System.out;
    diff --git a/strings/UsingStringBuilder.java b/strings/UsingStringBuilder.java
    index b7002a72e..342c6426f 100644
    --- a/strings/UsingStringBuilder.java
    +++ b/strings/UsingStringBuilder.java
    @@ -30,8 +30,8 @@ public static void main(String[] args) {
       }
     }
     /* Output:
    -[58, 55, 93, 61, 61, 29, 68, 0, 22, 7, 88, 28, 51, 89, 9,
    -78, 98, 61, 20, 58, 16, 40, 11, 22, 4]
    -[58, 55, 93, 61, 61, 29, 68, 0, 22, 7, 88, 28, 51, 89, 9,
    -78, 98, 61, 20, 58, 16, 40, 11, 22, 4]
    +[58, 55, 93, 61, 61, 29, 68, 0, 22, 7, 88, 28, 51, 89,
    +9, 78, 98, 61, 20, 58, 16, 40, 11, 22, 4]
    +[58, 55, 93, 61, 61, 29, 68, 0, 22, 7, 88, 28, 51, 89,
    +9, 78, 98, 61, 20, 58, 16, 40, 11, 22, 4]
     */
    diff --git a/typeinfo/HiddenImplementation.java b/typeinfo/HiddenImplementation.java
    index 385a93a3d..8b23d97d7 100644
    --- a/typeinfo/HiddenImplementation.java
    +++ b/typeinfo/HiddenImplementation.java
    @@ -28,7 +28,8 @@ public class HiddenImplementation {
       static void
       callHiddenMethod(Object a, String methodName)
       throws Exception {
    -    Method g = a.getClass().getDeclaredMethod(methodName);
    +    Method g =
    +      a.getClass().getDeclaredMethod(methodName);
         g.setAccessible(true);
         g.invoke(a);
       }
    diff --git a/typeinfo/NullRobot.java b/typeinfo/NullRobot.java
    index ae68d7b04..45380aa59 100644
    --- a/typeinfo/NullRobot.java
    +++ b/typeinfo/NullRobot.java
    @@ -8,7 +8,8 @@
     import java.util.stream.*;
     import onjava.*;
     
    -class NullRobotProxyHandler implements InvocationHandler {
    +class NullRobotProxyHandler
    +implements InvocationHandler {
       private String nullName;
       private Robot proxied = new NRobot();
       NullRobotProxyHandler(Class type) {
    diff --git a/typeinfo/PetCount.java b/typeinfo/PetCount.java
    index 860c620bb..1f43267f4 100644
    --- a/typeinfo/PetCount.java
    +++ b/typeinfo/PetCount.java
    @@ -58,8 +58,8 @@ public static void main(String[] args) {
     }
     /* Output:
     Rat Manx Cymric Mutt Pug Cymric Pug Manx Cymric Rat
    -EgyptianMau Hamster EgyptianMau Mutt Mutt Cymric Mouse Pug
    -Mouse Cymric
    +EgyptianMau Hamster EgyptianMau Mutt Mutt Cymric Mouse
    +Pug Mouse Cymric
     {EgyptianMau=2, Pug=3, Rat=2, Cymric=5, Mouse=2, Cat=9,
     Manx=7, Rodent=5, Mutt=3, Dog=6, Pet=20, Hamster=1}
     */
    diff --git a/typeinfo/PetCount2.java b/typeinfo/PetCount2.java
    index d24ebe982..1e5ef4d70 100644
    --- a/typeinfo/PetCount2.java
    +++ b/typeinfo/PetCount2.java
    @@ -11,8 +11,8 @@ public static void main(String[] args) {
     }
     /* Output:
     Rat Manx Cymric Mutt Pug Cymric Pug Manx Cymric Rat
    -EgyptianMau Hamster EgyptianMau Mutt Mutt Cymric Mouse Pug
    -Mouse Cymric
    +EgyptianMau Hamster EgyptianMau Mutt Mutt Cymric Mouse
    +Pug Mouse Cymric
     {EgyptianMau=2, Pug=3, Rat=2, Cymric=5, Mouse=2, Cat=9,
     Manx=7, Rodent=5, Mutt=3, Dog=6, Pet=20, Hamster=1}
     */
    diff --git a/typeinfo/PetCount3.java b/typeinfo/PetCount3.java
    index cbce8a242..87635bb08 100644
    --- a/typeinfo/PetCount3.java
    +++ b/typeinfo/PetCount3.java
    @@ -46,8 +46,8 @@ public static void main(String[] args) {
     }
     /* Output:
     Rat Manx Cymric Mutt Pug Cymric Pug Manx Cymric Rat
    -EgyptianMau Hamster EgyptianMau Mutt Mutt Cymric Mouse Pug
    -Mouse Cymric
    -{Hamster=1, Manx=7, EgyptianMau=2, Mutt=3, Rodent=5,
    -Mouse=2, Cymric=5, Pug=3, Dog=6, Rat=2, Pet=20, Cat=9}
    +EgyptianMau Hamster EgyptianMau Mutt Mutt Cymric Mouse
    +Pug Mouse Cymric
    +{Rat=2, Pug=3, Mutt=3, Mouse=2, Cat=9, Dog=6, Cymric=5,
    +EgyptianMau=2, Rodent=5, Hamster=1, Manx=7, Pet=20}
     */
    diff --git a/typeinfo/PetCount4.java b/typeinfo/PetCount4.java
    index d5c5aa4a0..ab18aee05 100644
    --- a/typeinfo/PetCount4.java
    +++ b/typeinfo/PetCount4.java
    @@ -18,8 +18,9 @@ public static void main(String[] args) {
     }
     /* Output:
     Rat Manx Cymric Mutt Pug Cymric Pug Manx Cymric Rat
    -EgyptianMau Hamster EgyptianMau Mutt Mutt Cymric Mouse Pug
    -Mouse Cymric
    -{EgyptianMau=2, Cymric=5, Mutt=3, Cat=9, Rat=2, Pet=20,
    -Manx=7, Hamster=1, Pug=3, Rodent=5, Dog=6, Mouse=2}
    +EgyptianMau Hamster EgyptianMau Mutt Mutt Cymric Mouse
    +Pug Mouse Cymric
    +{Dog=6, Manx=7, Cat=9, Rodent=5, Hamster=1, Rat=2,
    +Pug=3, Mutt=3, Cymric=5, EgyptianMau=2, Pet=20,
    +Mouse=2}
     */
    diff --git a/typeinfo/Shapes.java b/typeinfo/Shapes.java
    index e5f3243e6..9af68532d 100644
    --- a/typeinfo/Shapes.java
    +++ b/typeinfo/Shapes.java
    @@ -27,7 +27,8 @@ class Triangle extends Shape {
     
     public class Shapes {
       public static void main(String[] args) {
    -    Stream.of(new Circle(), new Square(), new Triangle())
    +    Stream.of(
    +      new Circle(), new Square(), new Triangle())
           .forEach(Shape::draw);
       }
     }
    diff --git a/typeinfo/ShowMethods.java b/typeinfo/ShowMethods.java
    index 4bc507f6c..91aef15a8 100644
    --- a/typeinfo/ShowMethods.java
    +++ b/typeinfo/ShowMethods.java
    @@ -29,7 +29,8 @@ public static void main(String[] args) {
           if(args.length == 1) {
             for(Method method : methods)
               System.out.println(
    -            p.matcher(method.toString()).replaceAll(""));
    +            p.matcher(
    +              method.toString()).replaceAll(""));
             for(Constructor ctor : ctors)
               System.out.println(
                 p.matcher(ctor.toString()).replaceAll(""));
    diff --git a/typeinfo/SimpleDynamicProxy.java b/typeinfo/SimpleDynamicProxy.java
    index 2b0ab4e13..041c13806 100644
    --- a/typeinfo/SimpleDynamicProxy.java
    +++ b/typeinfo/SimpleDynamicProxy.java
    @@ -13,7 +13,8 @@ class DynamicProxyHandler implements InvocationHandler {
       public Object
       invoke(Object proxy, Method method, Object[] args)
       throws Throwable {
    -    System.out.println("**** proxy: " + proxy.getClass() +
    +    System.out.println(
    +      "**** proxy: " + proxy.getClass() +
           ", method: " + method + ", args: " + args);
         if(args != null)
           for(Object arg : args)
    diff --git a/typeinfo/SnowRemovalRobot.java b/typeinfo/SnowRemovalRobot.java
    index f1518eaeb..0f3b4c0bf 100644
    --- a/typeinfo/SnowRemovalRobot.java
    +++ b/typeinfo/SnowRemovalRobot.java
    @@ -16,13 +16,15 @@ public SnowRemovalRobot(String name) {
       private List ops = Arrays.asList(
         new Operation(
           () -> name + " can shovel snow",
    -      () -> System.out.println(name + " shoveling snow")),
    +      () -> System.out.println(
    +        name + " shoveling snow")),
         new Operation(
           () -> name + " can chip ice",
           () -> System.out.println(name + " chipping ice")),
         new Operation(
           () -> name + " can clear the roof",
    -      () -> System.out.println(name + " clearing roof")));
    +      () -> System.out.println(
    +        name + " clearing roof")));
       public List operations() { return ops; }
       public static void main(String[] args) {
         Robot.test(new SnowRemovalRobot("Slusher"));
    diff --git a/typeinfo/Staff.java b/typeinfo/Staff.java
    index 3d07e2c78..4d864e1df 100644
    --- a/typeinfo/Staff.java
    +++ b/typeinfo/Staff.java
    @@ -43,19 +43,21 @@ public static void main(String[] args) {
           new Person("Janet", "Planner", "The Burbs"));
         if(staff.positionAvailable("Software Engineer"))
           staff.fillPosition("Software Engineer",
    -        new Person("Bob", "Coder", "Bright Light City"));
    +        new Person(
    +          "Bob", "Coder", "Bright Light City"));
         System.out.println(staff);
       }
     }
     /* Output:
    -[Position: President, Employee: Me Last The Top, Lonely At,
    -Position: CTO, Employee: , Position: Marketing
    -Manager, Employee: , Position: Product Manager,
    -Employee: , Position: Project Lead, Employee: Janet
    -Planner The Burbs, Position: Software Engineer, Employee:
    -Bob Coder Bright Light City, Position: Software Engineer,
    -Employee: , Position: Software Engineer, Employee:
    -, Position: Software Engineer, Employee: ,
    +[Position: President, Employee: Me Last The Top, Lonely
    +At, Position: CTO, Employee: , Position:
    +Marketing Manager, Employee: , Position: Product
    +Manager, Employee: , Position: Project Lead,
    +Employee: Janet Planner The Burbs, Position: Software
    +Engineer, Employee: Bob Coder Bright Light City,
    +Position: Software Engineer, Employee: ,
    +Position: Software Engineer, Employee: ,
    +Position: Software Engineer, Employee: ,
     Position: Test Engineer, Employee: , Position:
     Technical Writer, Employee: ]
     */
    diff --git a/typeinfo/pets/LiteralPetCreator.java b/typeinfo/pets/LiteralPetCreator.java
    index b0ac27bde..dd32d7ea3 100644
    --- a/typeinfo/pets/LiteralPetCreator.java
    +++ b/typeinfo/pets/LiteralPetCreator.java
    @@ -18,7 +18,8 @@ public class LiteralPetCreator extends PetCreator {
           Manx.class, Cymric.class, Rat.class,
           Mouse.class, Hamster.class));
       // Types for random creation:
    -  private static final List> TYPES =
    +  private static final
    +  List> TYPES =
         ALL_TYPES.subList(ALL_TYPES.indexOf(Mutt.class),
           ALL_TYPES.size());
       @Override
    @@ -30,8 +31,9 @@ public static void main(String[] args) {
       }
     }
     /* Output:
    -[class typeinfo.pets.Mutt, class typeinfo.pets.Pug, class
    -typeinfo.pets.EgyptianMau, class typeinfo.pets.Manx, class
    -typeinfo.pets.Cymric, class typeinfo.pets.Rat, class
    -typeinfo.pets.Mouse, class typeinfo.pets.Hamster]
    +[class typeinfo.pets.Mutt, class typeinfo.pets.Pug,
    +class typeinfo.pets.EgyptianMau, class
    +typeinfo.pets.Manx, class typeinfo.pets.Cymric, class
    +typeinfo.pets.Rat, class typeinfo.pets.Mouse, class
    +typeinfo.pets.Hamster]
     */
    diff --git a/typeinfo/toys/GenericToyTest.java b/typeinfo/toys/GenericToyTest.java
    index 7c4f73a99..c0ae10669 100644
    --- a/typeinfo/toys/GenericToyTest.java
    +++ b/typeinfo/toys/GenericToyTest.java
    @@ -12,7 +12,8 @@ public class GenericToyTest {
         Class ftClass = FancyToy.class;
         // Produces exact type:
         FancyToy fancyToy = ftClass.newInstance();
    -    Class up = ftClass.getSuperclass();
    +    Class up =
    +      ftClass.getSuperclass();
         // This won't compile:
         // Class up2 = ftClass.getSuperclass();
         // Only produces Object:
    diff --git a/typeinfo/toys/ToyTest.java b/typeinfo/toys/ToyTest.java
    index df7d6bda6..b1ff8ba90 100644
    --- a/typeinfo/toys/ToyTest.java
    +++ b/typeinfo/toys/ToyTest.java
    @@ -58,13 +58,16 @@ public static void main(String[] args) {
       }
     }
     /* Output:
    -Class name: typeinfo.toys.FancyToy is interface? [false]
    +Class name: typeinfo.toys.FancyToy is interface?
    +[false]
     Simple name: FancyToy
     Canonical name : typeinfo.toys.FancyToy
    -Class name: typeinfo.toys.HasBatteries is interface? [true]
    +Class name: typeinfo.toys.HasBatteries is interface?
    +[true]
     Simple name: HasBatteries
     Canonical name : typeinfo.toys.HasBatteries
    -Class name: typeinfo.toys.Waterproof is interface? [true]
    +Class name: typeinfo.toys.Waterproof is interface?
    +[true]
     Simple name: Waterproof
     Canonical name : typeinfo.toys.Waterproof
     Class name: typeinfo.toys.Shoots is interface? [true]
    diff --git a/validating/Assert2.java b/validating/Assert2.java
    index 42e6eb648..684f97b22 100644
    --- a/validating/Assert2.java
    +++ b/validating/Assert2.java
    @@ -8,12 +8,13 @@
     
     public class Assert2 {
       public static void main(String[] args) {
    -    assert false: "Here's a message saying what happened";
    +    assert false:
    +      "Here's a message saying what happened";
       }
     }
     /* Output:
     ___[ Error Output ]___
    -Exception in thread "main" java.lang.AssertionError: Here's
    -a message saying what happened
    +Exception in thread "main" java.lang.AssertionError:
    +Here's a message saying what happened
             at Assert2.main(Assert2.java:8)
     */
    diff --git a/validating/BadMicroBenchmark2.java b/validating/BadMicroBenchmark2.java
    index 74b712f47..fd840ddaf 100644
    --- a/validating/BadMicroBenchmark2.java
    +++ b/validating/BadMicroBenchmark2.java
    @@ -28,8 +28,8 @@ public static void main(String[] args) {
       }
     }
     /* Output:
    -parallelSetAll: 776
    -setAll: 120
    -parallelSetAll: 72
    -setAll: 15
    +parallelSetAll: 1147
    +setAll: 174
    +parallelSetAll: 86
    +setAll: 39
     */
    diff --git a/validating/GuavaAssertions.java b/validating/GuavaAssertions.java
    index 0fd8ff257..38fcb444d 100644
    --- a/validating/GuavaAssertions.java
    +++ b/validating/GuavaAssertions.java
    @@ -33,7 +33,8 @@ public static void main(String[] args) {
           System.out.println(e.getMessage());
         }
         try {
    -      verifyNotNull(s, "Shouldn't be null: %s", "arg s");
    +      verifyNotNull(
    +        s, "Shouldn't be null: %s", "arg s");
         } catch(VerifyException e) {
           System.out.println(e.getMessage());
         }
    diff --git a/validating/GuavaPreconditions.java b/validating/GuavaPreconditions.java
    index 622f3908b..752fe6af7 100644
    --- a/validating/GuavaPreconditions.java
    +++ b/validating/GuavaPreconditions.java
    @@ -93,18 +93,18 @@ public static void main(String[] args) {
     null
     NullPointerException
     Robert
    -IndexOutOfBoundsException: index (6) must be less than size
    -(6)
    +IndexOutOfBoundsException: index (6) must be less than
    +size (6)
     Bob
    -IndexOutOfBoundsException: index (6) must be less than size
    -(3)
    +IndexOutOfBoundsException: index (6) must be less than
    +size (3)
     null
     NullPointerException
     Robert
     Success
     Bob
    -IndexOutOfBoundsException: index (6) must not be greater
    -than size (3)
    +IndexOutOfBoundsException: index (6) must not be
    +greater than size (3)
     null
     NullPointerException
     Hieronymus
    @@ -118,8 +118,8 @@ greater than size (10)
     IndexOutOfBoundsException: start index (-1) must not be
     negative
     Hieronymus
    -IndexOutOfBoundsException: end index (6) must not be less
    -than start index (7)
    +IndexOutOfBoundsException: end index (6) must not be
    +less than start index (7)
     null
     NullPointerException
     */
    diff --git a/validating/LoaderAssertions.java b/validating/LoaderAssertions.java
    index 9b1bd607a..c15ac97e3 100644
    --- a/validating/LoaderAssertions.java
    +++ b/validating/LoaderAssertions.java
    @@ -23,5 +23,6 @@ public void go() {
     Exception in thread "main" java.lang.AssertionError:
     Loaded.go()
             at Loaded.go(LoaderAssertions.java:15)
    -        at LoaderAssertions.main(LoaderAssertions.java:9)
    +        at
    +LoaderAssertions.main(LoaderAssertions.java:9)
     */
    diff --git a/validating/SLF4JLevels.java b/validating/SLF4JLevels.java
    index 3e36c9619..8100bd6d6 100644
    --- a/validating/SLF4JLevels.java
    +++ b/validating/SLF4JLevels.java
    @@ -16,14 +16,14 @@ public static void main(String[] args) {
       }
     }
     /* Output:
    -2017-05-02T15:24:11.555
    +2017-05-09T06:07:52.846
     [main] TRACE SLF4JLevels - Hello
    -2017-05-02T15:24:11.555
    +2017-05-09T06:07:52.849
     [main] DEBUG SLF4JLevels - Logging
    -2017-05-02T15:24:11.555
    +2017-05-09T06:07:52.849
     [main] INFO  SLF4JLevels - Using
    -2017-05-02T15:24:11.555
    +2017-05-09T06:07:52.850
     [main] WARN  SLF4JLevels - the SLF4J
    -2017-05-02T15:24:11.555
    +2017-05-09T06:07:52.851
     [main] ERROR SLF4JLevels - Facade
     */
    diff --git a/validating/SLF4JLogging.java b/validating/SLF4JLogging.java
    index 18f285289..1c124a136 100644
    --- a/validating/SLF4JLogging.java
    +++ b/validating/SLF4JLogging.java
    @@ -12,6 +12,6 @@ public static void main(String[] args) {
       }
     }
     /* Output:
    -2017-05-02T15:24:11.861
    +2017-05-09T06:07:53.418
     [main] INFO  SLF4JLogging - hello logging
     */
    diff --git a/validating/SimpleDebugging.java b/validating/SimpleDebugging.java
    index 7dd9a1eb1..62766283f 100644
    --- a/validating/SimpleDebugging.java
    +++ b/validating/SimpleDebugging.java
    @@ -28,10 +28,13 @@ public static void main(String[] args) {
     In foo2
     In foo3
     ___[ Error Output ]___
    -Exception in thread "main" java.lang.ArithmeticException: /
    -by zero
    -        at SimpleDebugging.foo3(SimpleDebugging.java:17)
    -        at SimpleDebugging.foo2(SimpleDebugging.java:11)
    +Exception in thread "main"
    +java.lang.ArithmeticException: / by zero
    +        at
    +SimpleDebugging.foo3(SimpleDebugging.java:17)
    +        at
    +SimpleDebugging.foo2(SimpleDebugging.java:11)
             at SimpleDebugging.foo1(SimpleDebugging.java:7)
    -        at SimpleDebugging.main(SimpleDebugging.java:20)
    +        at
    +SimpleDebugging.main(SimpleDebugging.java:20)
     */
    diff --git a/verify_output.py b/verify_output.py
    deleted file mode 100644
    index 6ceb5422b..000000000
    --- a/verify_output.py
    +++ /dev/null
    @@ -1,189 +0,0 @@
    -#! py -3
    -# Requires Python 3.5
    -# Validates output from executable Java programs in "On Java 8."
    -# Use chain of responsibility to successively try strategies until one matches
    -'''
    -Intended to be copied into the ExtractedExamples directory,
    -thus it doesn't use config.py
    -'''
    -from pathlib import Path
    -import textwrap
    -import re
    -import sys
    -import os
    -import textwrap
    -from collections import defaultdict
    -WIDTH = 59 # Max line width
    -
    -#################### Phase 1: Basic formatting #####################
    -
    -def adjust_lines(text):
    -    text = text.replace("\0", "NUL")
    -    lines = text.splitlines()
    -    slug = lines[0]
    -    if "(First and Last " in slug:
    -        num_of_lines = int(slug.split()[5])
    -        adjusted = lines[:num_of_lines + 1] +\
    -            ["...________...________...________...________..."] +\
    -            lines[-num_of_lines:]
    -        return "\n".join(adjusted)
    -    elif "(First " in slug:
    -        num_of_lines = int(slug.split()[3])
    -        adjusted = lines[:num_of_lines + 1] +\
    -            ["                  ..."]
    -        return "\n".join(adjusted)
    -    else:
    -        return text
    -
    -def fill_to_width(text):
    -    result = ""
    -    for line in text.splitlines():
    -        result += textwrap.fill(line, width = WIDTH) + "\n"
    -    return result.strip()
    -
    -def phase1():
    -    """
    -    (0) Do first/last lines before formatting to width
    -    (1) Combine output and error (if present) files
    -    (2) Format all output to width limit
    -    (3) Add closing '*/'
    -    """
    -    for outfile in Path(".").rglob("*.out"):
    -        out_text = adjust_lines(outfile.read_text())
    -        phase_1 = outfile.with_suffix(".p1")
    -        with phase_1.open('w') as phs1:
    -            phs1.write(fill_to_width(out_text) + "\n")
    -            errfile = outfile.with_suffix(".err")
    -            if errfile.exists():
    -                phs1.write("___[ Error Output ]___\n")
    -                phs1.write(fill_to_width(errfile.read_text()) + "\n")
    -            phs1.write("*/\n")
    -
    -
    -########### Chain of Responsibility Match Finder #######################
    -
    -def exact_match(text): return text
    -
    -memlocation = re.compile("@[0-9a-z]{5,7}")
    -
    -def ignore_memory_addresses(text):
    -    return memlocation.sub("", text)
    -
    -datestamp1 = re.compile(
    -    "(?:[MTWFS][a-z]{2} ){0,1}[JFMASOND][a-z]{2} \d{1,2} \d{2}:\d{2}:\d{2} [A-Z]{3} \d{4}")
    -datestamp2 = re.compile(
    -    "[JFMASOND][a-z]{2} \d{1,2}, \d{4} \d{1,2}:\d{1,2}:\d{1,2} (:?AM|PM)")
    -
    -def ignore_dates(text):
    -    for pat in [ datestamp1, datestamp2 ]:
    -        text = pat.sub("", text)
    -    return text
    -
    -def ignore_digits(input_text):
    -    return re.sub("-?\d", "", input_text)
    -
    -def sort_lines(input_text):
    -    return "\n".join(sorted(input_text.splitlines())).strip()
    -
    -def sort_words(input_text):
    -    return "\n".join(sorted(input_text.split())).strip()
    -
    -def unique_lines(input_text):
    -    return "\n".join(sorted(list(set(input_text.splitlines()))))
    -
    -# Fairly extreme but will still reveal significant changes
    -def unique_words(input_text):
    -    return "\n".join(sorted(set(input_text.split())))
    -
    -# Fairly extreme but will still reveal significant changes
    -word_only = re.compile("[A-Za-z]+")
    -def words_only(input_text):
    -    return "\n".join(
    -        sorted([w for w in input_text.split()
    -                if word_only.fullmatch(w)]))
    -
    -def no_match(input_text): return True
    -
    -# Chain of responsibility:
    -strategies = [
    -    # Filter                  # Retain result
    -                              # for rest of chain
    -    (exact_match,               False),
    -    (ignore_dates,              True),
    -    (ignore_memory_addresses,   True),
    -    (sort_lines,                False),
    -    (ignore_digits,             False),
    -    (sort_words,                False),
    -    (unique_lines,              False),
    -    (unique_words,              False),
    -    (words_only,                False),
    -    (no_match,                  False),
    -]
    -
    -
    -class Validator(defaultdict): # Map of lists
    -    compare_output = Path(".") / "compare_output.bat"
    -
    -    def __init__(self):
    -        super().__init__(list)
    -        if Validator.compare_output.exists():
    -            Validator.compare_output.unlink()
    -        for strategy, retain in strategies:
    -            strat_batch = Path(strategy.__name__ + ".bat")
    -            if strat_batch.exists():
    -                strat_batch.unlink()
    -
    -    def find_output_match(self, javafile, embedded_output, generated_output):
    -        for strategy, retain in strategies:
    -            filtered_embedded_output = strategy(embedded_output)
    -            filtered_generated_output = strategy(generated_output)
    -            if filtered_embedded_output == filtered_generated_output:
    -                strat_name = strategy.__name__
    -                self[strat_name].append(str(javafile))
    -                if strat_name is "exact_match": return
    -                tfile = javafile.with_suffix("." + strat_name)
    -                with Path(strat_name + ".bat").open('a') as strat_batch:
    -                    strat_batch.write("subl " + str(tfile) + "\n")
    -                with Validator.compare_output.open('a') as batch:
    -                    batch.write("subl " + str(tfile) + "\n")
    -                with tfile.open('w') as trace_file:
    -                    trace_file.write(javafile.read_text() + "\n\n")
    -                    trace_file.write("// === Actual ===\n\n")
    -                    trace_file.write(str(generated_output))
    -                return
    -            if retain:
    -                embedded_output = filtered_embedded_output
    -                generated_output = filtered_generated_output
    -
    -    def display_results(self):
    -        log = open("verified_output.txt", 'w')
    -        for strategy, retain in strategies:
    -            key = strategy.__name__
    -            if key is "exact_match":
    -                for java in self[key]:
    -                    print(java)
    -            elif key in self:
    -                log.write("\n" + (" " + key + " ").center(45, "=") + "\n")
    -                for java in self[key]:
    -                    log.write(java + "\n")
    -        log.close()
    -
    -
    -if __name__ == '__main__':
    -    phase1() # Generates '.p1' files
    -    find_output = re.compile(r"/\* (Output:.*)\*/", re.DOTALL)
    -    validator = Validator()
    -    for outfile in Path(".").rglob("*.p1"):
    -        javafile = outfile.with_suffix(".java")
    -        if not javafile.exists():
    -            print(str(outfile) + " has no javafile")
    -            sys.exit(1)
    -        javatext = javafile.read_text()
    -        if "/* Output:" not in javatext:
    -            print(str(outfile) + " has no /* Output:")
    -            sys.exit(1)
    -        validator.find_output_match(javafile,
    -            find_output.search(javatext).group(0).strip(),
    -            outfile.read_text().strip())
    -    validator.display_results()
    -    os.system("more verified_output.txt")
    
    From 6d480448ebba1da94529fbdba16f1ce60056cfe1 Mon Sep 17 00:00:00 2001
    From: Bruce Eckel 
    Date: Fri, 12 May 2017 08:07:24 -0600
    Subject: [PATCH 252/320] Test on CI
    
    ---
     arrays/ParallelPrefix3.java | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/arrays/ParallelPrefix3.java b/arrays/ParallelPrefix3.java
    index 45297cb80..9b976e920 100644
    --- a/arrays/ParallelPrefix3.java
    +++ b/arrays/ParallelPrefix3.java
    @@ -2,7 +2,7 @@
     // (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
    -// {ValidateByHand} CI Systems have trouble
    +// !!!! CI Systems have trouble
     import java.util.*;
     
     public class ParallelPrefix3 {
    
    From bed69283e327858b7f25665b753d6ca5d2627c9b Mon Sep 17 00:00:00 2001
    From: Bruce Eckel 
    Date: Fri, 12 May 2017 08:07:40 -0600
    Subject: [PATCH 253/320] Remove command-line option
    
    ---
     innerclasses/GreenhouseController.java | 7 ++-----
     1 file changed, 2 insertions(+), 5 deletions(-)
    
    diff --git a/innerclasses/GreenhouseController.java b/innerclasses/GreenhouseController.java
    index 6e85f4830..cdec74565 100644
    --- a/innerclasses/GreenhouseController.java
    +++ b/innerclasses/GreenhouseController.java
    @@ -3,7 +3,6 @@
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Configure and execute the greenhouse system
    -// {java GreenhouseController 5000}
     import innerclasses.controller.*;
     
     public class GreenhouseController {
    @@ -21,10 +20,8 @@ gc.new WaterOff(800),
           gc.new ThermostatDay(1400)
         };
         gc.addEvent(gc.new Restart(2000, eventList));
    -    if(args.length == 1)
    -      gc.addEvent(
    -        new GreenhouseControls.Terminate(
    -          Integer.valueOf(args[0])));
    +    gc.addEvent(
    +      new GreenhouseControls.Terminate(5000));
         gc.run();
       }
     }
    
    From a3b792adf932417aea171a8ea11e49db8fa86fed Mon Sep 17 00:00:00 2001
    From: Bruce Eckel 
    Date: Fri, 12 May 2017 08:39:02 -0600
    Subject: [PATCH 254/320] CI Exclusion
    
    ---
     arrays/ParallelPrefix3.java                                | 2 +-
     .../groovy/com/mindviewinc/plugins/TaggingPlugin.groovy    | 7 ++++++-
     2 files changed, 7 insertions(+), 2 deletions(-)
    
    diff --git a/arrays/ParallelPrefix3.java b/arrays/ParallelPrefix3.java
    index 9b976e920..cf7c1551d 100644
    --- a/arrays/ParallelPrefix3.java
    +++ b/arrays/ParallelPrefix3.java
    @@ -2,7 +2,7 @@
     // (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
    -// !!!! CI Systems have trouble
    +// {ExcludeFromTravisCI}
     import java.util.*;
     
     public class ParallelPrefix3 {
    diff --git a/buildSrc/src/main/groovy/com/mindviewinc/plugins/TaggingPlugin.groovy b/buildSrc/src/main/groovy/com/mindviewinc/plugins/TaggingPlugin.groovy
    index e975ca065..2c1e5d4b4 100644
    --- a/buildSrc/src/main/groovy/com/mindviewinc/plugins/TaggingPlugin.groovy
    +++ b/buildSrc/src/main/groovy/com/mindviewinc/plugins/TaggingPlugin.groovy
    @@ -25,7 +25,12 @@ class TaggingPlugin implements Plugin {
                     if(debug && tags.hasTags()) println tags
     
                     // Exclude java sources that will not compile
    -                if (tags.willNotCompile || (tags.lowLevelAppendix && runningInAppveyor)) {
    +                if (tags.willNotCompile
    +                    || (tags.lowLevelAppendix && runningInAppveyor) // Exclude entire lowlevel appendix
    +                    || (tags.excludeFromAppveyorCI && runningInAppveyor)
    +                    || (tags.excludeFromTravisCI && runningInTravis)
    +                    || (tags.excludeFromCI && runningInCI)
    +                    ) {
                         project.sourceSets.main.java.excludes.add(file.name)
                     } else {
                         JavaExec javaTask = null
    
    From 497097055bf07130bcbb086958f79ed297561432 Mon Sep 17 00:00:00 2001
    From: Bruce Eckel 
    Date: Fri, 12 May 2017 08:59:18 -0600
    Subject: [PATCH 255/320] Checking on different CIs
    
    ---
     concurrent/Summing2.java | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/concurrent/Summing2.java b/concurrent/Summing2.java
    index 0a64d0b31..9a7d6ea78 100644
    --- a/concurrent/Summing2.java
    +++ b/concurrent/Summing2.java
    @@ -2,7 +2,7 @@
     // (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
    -// {ValidateByHand} CI has trouble
    +// !!!! CI has trouble
     import java.util.*;
     
     public class Summing2 {
    
    From a6598d4ae58461d35a11cab9b67d991179d5cb90 Mon Sep 17 00:00:00 2001
    From: Bruce Eckel 
    Date: Fri, 12 May 2017 12:53:36 -0600
    Subject: [PATCH 256/320] Try excluding from Travis build
    
    ---
     concurrent/Summing2.java | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/concurrent/Summing2.java b/concurrent/Summing2.java
    index 9a7d6ea78..f5d75be97 100644
    --- a/concurrent/Summing2.java
    +++ b/concurrent/Summing2.java
    @@ -2,7 +2,7 @@
     // (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
    -// !!!! CI has trouble
    +// {ExcludeFromTravisCI}
     import java.util.*;
     
     public class Summing2 {
    
    From 71fd749608565f486d8d95634f3f7fd60a8b6cdc Mon Sep 17 00:00:00 2001
    From: Bruce Eckel 
    Date: Sat, 13 May 2017 16:50:26 -0600
    Subject: [PATCH 257/320] Test CI problem
    
    ---
     concurrent/Summing3.java | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/concurrent/Summing3.java b/concurrent/Summing3.java
    index 77aa8a494..079946db6 100644
    --- a/concurrent/Summing3.java
    +++ b/concurrent/Summing3.java
    @@ -2,7 +2,7 @@
     // (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
    -// {ValidateByHand} CI has trouble
    +// !!!! CI has trouble
     import java.util.*;
     
     public class Summing3 {
    
    From aea95a449f3b12f7e024ba5f3df046c3b9ad077c Mon Sep 17 00:00:00 2001
    From: Bruce Eckel 
    Date: Sat, 13 May 2017 17:04:42 -0600
    Subject: [PATCH 258/320] Test CI 2
    
    ---
     concurrent/Summing3.java | 1 -
     concurrent/Summing4.java | 2 +-
     2 files changed, 1 insertion(+), 2 deletions(-)
    
    diff --git a/concurrent/Summing3.java b/concurrent/Summing3.java
    index 079946db6..2a739b8b9 100644
    --- a/concurrent/Summing3.java
    +++ b/concurrent/Summing3.java
    @@ -2,7 +2,6 @@
     // (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
    -// !!!! CI has trouble
     import java.util.*;
     
     public class Summing3 {
    diff --git a/concurrent/Summing4.java b/concurrent/Summing4.java
    index d48e16acc..0959d3e86 100644
    --- a/concurrent/Summing4.java
    +++ b/concurrent/Summing4.java
    @@ -2,7 +2,7 @@
     // (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
    -// {ValidateByHand} CI has trouble
    +// !!!!
     import java.util.*;
     
     public class Summing4 {
    
    From d1f9d9b62fe97269fa9f2fea10642165329166c3 Mon Sep 17 00:00:00 2001
    From: Bruce Eckel 
    Date: Sat, 13 May 2017 17:23:26 -0600
    Subject: [PATCH 259/320] Only exclude from Travics
    
    ---
     concurrent/Summing4.java | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/concurrent/Summing4.java b/concurrent/Summing4.java
    index 0959d3e86..4df903234 100644
    --- a/concurrent/Summing4.java
    +++ b/concurrent/Summing4.java
    @@ -2,7 +2,7 @@
     // (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
    -// !!!!
    +// {ExcludeFromTravisCI}
     import java.util.*;
     
     public class Summing4 {
    
    From 895e4abb8635ec9aa3a26ff60943e88e83437c06 Mon Sep 17 00:00:00 2001
    From: Bruce Eckel 
    Date: Sat, 13 May 2017 17:43:41 -0600
    Subject: [PATCH 260/320] retest BoxObserver on both CI servers
    
    ---
     patterns/BoxObserver.java | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/patterns/BoxObserver.java b/patterns/BoxObserver.java
    index 0bcf2bf91..eec4226be 100644
    --- a/patterns/BoxObserver.java
    +++ b/patterns/BoxObserver.java
    @@ -4,7 +4,7 @@
     // Visit http://OnJava8.com for more book information.
     // Demonstration of Observer pattern using
     // Java's built-in observer classes
    -// {ValidateByHand} CI servers have problems
    +// !!!! CI servers have problems
     import javax.swing.*;
     import java.awt.*;
     import java.awt.event.*;
    
    From 0213d3e6861bf96b916abfbec2c30b6d5ef131d3 Mon Sep 17 00:00:00 2001
    From: Bruce Eckel 
    Date: Sat, 13 May 2017 17:55:12 -0600
    Subject: [PATCH 261/320] Only exclude from Travis
    
    ---
     patterns/BoxObserver.java | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/patterns/BoxObserver.java b/patterns/BoxObserver.java
    index eec4226be..0076eac21 100644
    --- a/patterns/BoxObserver.java
    +++ b/patterns/BoxObserver.java
    @@ -4,7 +4,7 @@
     // Visit http://OnJava8.com for more book information.
     // Demonstration of Observer pattern using
     // Java's built-in observer classes
    -// !!!! CI servers have problems
    +// {ExcludeFromTravisCI}
     import javax.swing.*;
     import java.awt.*;
     import java.awt.event.*;
    
    From 3c96d6d41217baa8ef5afb13515b8d9d6cb15eef Mon Sep 17 00:00:00 2001
    From: Bruce Eckel 
    Date: Sat, 13 May 2017 18:57:28 -0600
    Subject: [PATCH 262/320] Retest AvailableCharSets on CI
    
    ---
     newio/AvailableCharSets.java | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/newio/AvailableCharSets.java b/newio/AvailableCharSets.java
    index eb9e39ad4..66b1b77c0 100644
    --- a/newio/AvailableCharSets.java
    +++ b/newio/AvailableCharSets.java
    @@ -3,7 +3,7 @@
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Displays Charsets and aliases
    -// {ValidateByHand} CI has trouble
    +// !!!! CI has trouble
     import java.nio.charset.*;
     import java.util.*;
     
    
    From 7ca318ddde2eadf0a317f09b8c590282e2f607ca Mon Sep 17 00:00:00 2001
    From: Bruce Eckel 
    Date: Sat, 13 May 2017 22:21:43 -0600
    Subject: [PATCH 263/320] Adjustments around validation and %n
    
    ---
     concurrent/CountingStream.java | 1 +
     newio/AvailableCharSets.java   | 1 -
     onjava/HTMLColors.java         | 2 +-
     operators/Underscores.java     | 2 +-
     4 files changed, 3 insertions(+), 3 deletions(-)
    
    diff --git a/concurrent/CountingStream.java b/concurrent/CountingStream.java
    index ca55bffe4..8ab2ba114 100644
    --- a/concurrent/CountingStream.java
    +++ b/concurrent/CountingStream.java
    @@ -2,6 +2,7 @@
     // (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
    +// {ValidateByHand}
     import java.util.*;
     import java.util.concurrent.*;
     import java.util.stream.*;
    diff --git a/newio/AvailableCharSets.java b/newio/AvailableCharSets.java
    index 66b1b77c0..b46b3dfb1 100644
    --- a/newio/AvailableCharSets.java
    +++ b/newio/AvailableCharSets.java
    @@ -3,7 +3,6 @@
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Displays Charsets and aliases
    -// !!!! CI has trouble
     import java.nio.charset.*;
     import java.util.*;
     
    diff --git a/onjava/HTMLColors.java b/onjava/HTMLColors.java
    index f960d23af..e84b9c90b 100644
    --- a/onjava/HTMLColors.java
    +++ b/onjava/HTMLColors.java
    @@ -224,7 +224,7 @@ void showInv(Map m, int count) {
           .limit(count)
           .forEach(e ->
             System.out.format(
    -          "%-20s  0x%06X\n", e.getKey(), e.getValue()));
    +          "%-20s  0x%06X%n", e.getKey(), e.getValue()));
       }
       public static void showInv(Map m) {
         showInv(m, m.size());
    diff --git a/operators/Underscores.java b/operators/Underscores.java
    index 2805f43e8..cd862fb88 100644
    --- a/operators/Underscores.java
    +++ b/operators/Underscores.java
    @@ -9,7 +9,7 @@ public static void main(String[] args) {
         System.out.println(d);
         int bin = 0b0010_1111_1010_1111_1010_1111_1010_1111;
         System.out.println(Integer.toBinaryString(bin));
    -    System.out.printf("%x%n", bin);
    +    System.out.printf("%x%n", bin);  // [1]
         long hex = 0x7f_e9_b7_aa;
         System.out.printf("%x%n", hex);
       }
    
    From 0c6fc300f73c872161a0e595fb2c8271e7a4aed0 Mon Sep 17 00:00:00 2001
    From: Bruce Eckel 
    Date: Sun, 14 May 2017 00:01:45 -0600
    Subject: [PATCH 264/320] Summing3 doesn't work with Travis CI
    
    ---
     concurrent/Summing3.java | 1 +
     1 file changed, 1 insertion(+)
    
    diff --git a/concurrent/Summing3.java b/concurrent/Summing3.java
    index 2a739b8b9..5477dc617 100644
    --- a/concurrent/Summing3.java
    +++ b/concurrent/Summing3.java
    @@ -2,6 +2,7 @@
     // (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
    +// {ExcludeFromTravisCI}
     import java.util.*;
     
     public class Summing3 {
    
    From bf96ac685152c6503e233d0168e8db05d0e3ec02 Mon Sep 17 00:00:00 2001
    From: Bruce Eckel 
    Date: Mon, 15 May 2017 16:15:22 -0600
    Subject: [PATCH 265/320] Comment spell corrections
    
    ---
     annotations/StackL.java                 | 2 +-
     arrays/ArrayOfGenericType.java          | 2 +-
     arrays/ArrayOfGenerics.java             | 2 +-
     collectiontopics/ListOps.java           | 2 +-
     onjava/ConvertTo.java                   | 2 +-
     onjava/atunit/ClassNameFinder.java      | 3 +--
     validating/tests/CircularQueueTest.java | 2 +-
     7 files changed, 7 insertions(+), 8 deletions(-)
    
    diff --git a/annotations/StackL.java b/annotations/StackL.java
    index 63c1229a7..02050132b 100644
    --- a/annotations/StackL.java
    +++ b/annotations/StackL.java
    @@ -2,7 +2,7 @@
     // (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
    -// A stack built on a linkedList
    +// A stack built on a LinkedList
     package annotations;
     import java.util.*;
     
    diff --git a/arrays/ArrayOfGenericType.java b/arrays/ArrayOfGenericType.java
    index fb8d0a40b..6466df1fd 100644
    --- a/arrays/ArrayOfGenericType.java
    +++ b/arrays/ArrayOfGenericType.java
    @@ -8,7 +8,7 @@ public class ArrayOfGenericType {
       @SuppressWarnings("unchecked")
       public ArrayOfGenericType(int size) {
         // error: generic array creation:
    -    // - array = new T[size];
    +    //- array = new T[size];
         array = (T[])new Object[size]; // unchecked cast
       }
       // error: generic array creation:
    diff --git a/arrays/ArrayOfGenerics.java b/arrays/ArrayOfGenerics.java
    index cc2a2600c..d41ce8658 100644
    --- a/arrays/ArrayOfGenerics.java
    +++ b/arrays/ArrayOfGenerics.java
    @@ -12,7 +12,7 @@ public static void main(String[] args) {
         ls = (List[])la; // Unchecked cast
         ls[0] = new ArrayList<>();
     
    -    // -ls[1] = new ArrayList();
    +    //- ls[1] = new ArrayList();
         // error: incompatible types: ArrayList
         // cannot be converted to List
         //     ls[1] = new ArrayList();
    diff --git a/collectiontopics/ListOps.java b/collectiontopics/ListOps.java
    index 57ae02558..760652b57 100644
    --- a/collectiontopics/ListOps.java
    +++ b/collectiontopics/ListOps.java
    @@ -32,7 +32,7 @@ public static void basicTest(List a) {
         b = a.isEmpty(); // Any elements inside?
         it = a.iterator(); // Ordinary Iterator
         lit = a.listIterator(); // ListIterator
    -    lit = a.listIterator(3); // Start at loc 3
    +    lit = a.listIterator(3); // Start at location 3
         i = a.lastIndexOf("1"); // Last match
         a.remove(1); // Remove location 1
         a.remove("3"); // Remove this object
    diff --git a/onjava/ConvertTo.java b/onjava/ConvertTo.java
    index c6d430166..e14697a5b 100644
    --- a/onjava/ConvertTo.java
    +++ b/onjava/ConvertTo.java
    @@ -57,7 +57,7 @@ static double[] primitive(Double[] in) {
       static Boolean[] boxed(boolean[] in) {
         Boolean[] result = new Boolean[in.length];
         for(int i = 0; i < in.length; i++)
    -      result[i] = in[i]; // Autboxing
    +      result[i] = in[i]; // Autoboxing
         return result;
       }
       static Character[] boxed(char[] in) {
    diff --git a/onjava/atunit/ClassNameFinder.java b/onjava/atunit/ClassNameFinder.java
    index 0b309829d..af7f2aef6 100644
    --- a/onjava/atunit/ClassNameFinder.java
    +++ b/onjava/atunit/ClassNameFinder.java
    @@ -53,7 +53,7 @@ public static String thisClass(byte[] classBytes) {
               case 11: // INTERFACE_METHOD_REF
               case 12: // NAME_AND_TYPE
               case 18: // Invoke Dynamic
    -            data.readInt(); // discard 4 bytes;
    +            data.readInt(); // discard 4 bytes
                 break;
               case 15: // Method Handle
                 data.readByte();
    @@ -86,7 +86,6 @@ public static String thisClass(byte[] classBytes) {
         // Walk the entire tree:
         Files.walk(Paths.get("."))
           .filter(matcher::matches)
    -      //.peek(System.out::println)
           .map(p -> {
               try {
                 return thisClass(Files.readAllBytes(p));
    diff --git a/validating/tests/CircularQueueTest.java b/validating/tests/CircularQueueTest.java
    index eb96d230c..37c45fa35 100644
    --- a/validating/tests/CircularQueueTest.java
    +++ b/validating/tests/CircularQueueTest.java
    @@ -11,7 +11,7 @@ public class CircularQueueTest {
       private int i = 0;
       @BeforeEach
       public void initialize() {
    -    while(i < 5) // Preload with some data
    +    while(i < 5) // Pre-load with some data
           queue.put(Integer.toString(i++));
       }
       // Support methods:
    
    From e8fc79ce4d3f71c7bb15e80a14128a525f038f05 Mon Sep 17 00:00:00 2001
    From: Bruce Eckel 
    Date: Mon, 15 May 2017 16:15:35 -0600
    Subject: [PATCH 266/320] Check BadMicroBenchmark against CI
    
    ---
     validating/BadMicroBenchmark.java | 1 -
     1 file changed, 1 deletion(-)
    
    diff --git a/validating/BadMicroBenchmark.java b/validating/BadMicroBenchmark.java
    index 6a4cf7259..e10555413 100644
    --- a/validating/BadMicroBenchmark.java
    +++ b/validating/BadMicroBenchmark.java
    @@ -2,7 +2,6 @@
     // (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
    -// {ValidateByHand}
     import java.util.*;
     import onjava.Timer;
     
    
    From 42258a266894ad2821cea6d390778f00122baa5c Mon Sep 17 00:00:00 2001
    From: Bruce Eckel 
    Date: Mon, 15 May 2017 16:38:12 -0600
    Subject: [PATCH 267/320] Travis CI doesn't work with BadMicroBenchmark
    
    ---
     validating/BadMicroBenchmark.java | 1 +
     1 file changed, 1 insertion(+)
    
    diff --git a/validating/BadMicroBenchmark.java b/validating/BadMicroBenchmark.java
    index e10555413..ecc774ada 100644
    --- a/validating/BadMicroBenchmark.java
    +++ b/validating/BadMicroBenchmark.java
    @@ -2,6 +2,7 @@
     // (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
    +// {ExcludeFromTravisCI}
     import java.util.*;
     import onjava.Timer;
     
    
    From 976aa61e907ef2539a7ff77636a4e4b702f041da Mon Sep 17 00:00:00 2001
    From: Bruce Eckel 
    Date: Mon, 15 May 2017 16:59:12 -0600
    Subject: [PATCH 268/320] Validate by hand changes
    
    ---
     onjava/ProcessFiles.java       | 24 +++++++++++++++++++++++-
     strings/InfiniteRecursion.java |  2 +-
     2 files changed, 24 insertions(+), 2 deletions(-)
    
    diff --git a/onjava/ProcessFiles.java b/onjava/ProcessFiles.java
    index 353062b35..5849dfc16 100644
    --- a/onjava/ProcessFiles.java
    +++ b/onjava/ProcessFiles.java
    @@ -2,7 +2,6 @@
     // (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
    -// {ValidateByHand}
     // {java onjava.ProcessFiles}
     package onjava;
     import java.io.*;
    @@ -53,3 +52,26 @@ public static void main(String[] args) {
           "java").start(args);
       }
     }
    +/* Output: (First and Last 10 Lines)
    +.\ArrayShow.java
    +.\atunit\AtUnit.java
    +.\atunit\ClassNameFinder.java
    +.\atunit\Test.java
    +.\atunit\TestObjectCleanup.java
    +.\atunit\TestObjectCreate.java
    +.\atunit\TestProperty.java
    +.\BasicSupplier.java
    +.\CollectionMethodDifferences.java
    +.\ConvertTo.java
    +...________...________...________...________...
    +.\Stack.java
    +.\Suppliers.java
    +.\TimedAbort.java
    +.\Timer.java
    +.\Tuple.java
    +.\Tuple2.java
    +.\Tuple3.java
    +.\Tuple4.java
    +.\Tuple5.java
    +.\TypeCounter.java
    +*/
    diff --git a/strings/InfiniteRecursion.java b/strings/InfiniteRecursion.java
    index b5c81460d..98f396a42 100644
    --- a/strings/InfiniteRecursion.java
    +++ b/strings/InfiniteRecursion.java
    @@ -3,7 +3,7 @@
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Accidental recursion
    -// {ValidateByHand} Throws exception
    +// {ValidateByHand} Throws very long exception
     import java.util.*;
     import java.util.stream.*;
     
    
    From 91ef314e2dd269cf885d293320a4facb18b05158 Mon Sep 17 00:00:00 2001
    From: Bruce Eckel 
    Date: Mon, 15 May 2017 17:21:57 -0600
    Subject: [PATCH 269/320] ProcessFiles doesn't work with Travis CI
    
    ---
     onjava/ProcessFiles.java | 1 +
     1 file changed, 1 insertion(+)
    
    diff --git a/onjava/ProcessFiles.java b/onjava/ProcessFiles.java
    index 5849dfc16..c7c1cf086 100644
    --- a/onjava/ProcessFiles.java
    +++ b/onjava/ProcessFiles.java
    @@ -2,6 +2,7 @@
     // (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
    +// {ExcludeFromTravisCI}
     // {java onjava.ProcessFiles}
     package onjava;
     import java.io.*;
    
    From 0f85a79f7ff27196602f684b0a60c455e1add56b Mon Sep 17 00:00:00 2001
    From: Bruce Eckel 
    Date: Mon, 15 May 2017 17:33:54 -0600
    Subject: [PATCH 270/320] ProcessFiles main() won't run on Travis CI
    
    But the compiled module is still required.
    ---
     onjava/ProcessFiles.java | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/onjava/ProcessFiles.java b/onjava/ProcessFiles.java
    index c7c1cf086..85275b8b0 100644
    --- a/onjava/ProcessFiles.java
    +++ b/onjava/ProcessFiles.java
    @@ -2,7 +2,7 @@
     // (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
    -// {ExcludeFromTravisCI}
    +// {ValidateByHand} // main() won't run on Travis CI
     // {java onjava.ProcessFiles}
     package onjava;
     import java.io.*;
    
    From e16b83434c92b5ce9342b7f62b587cd998812de5 Mon Sep 17 00:00:00 2001
    From: Bruce Eckel 
    Date: Tue, 16 May 2017 11:00:12 -0600
    Subject: [PATCH 271/320] Pulled main out of ProcessFiles.java so it runs on CI
    
    ---
     annotations/DemoProcessFiles.java | 43 +++++++++++++++++++++++++++++++
     onjava/ProcessFiles.java          | 30 ---------------------
     2 files changed, 43 insertions(+), 30 deletions(-)
     create mode 100644 annotations/DemoProcessFiles.java
    
    diff --git a/annotations/DemoProcessFiles.java b/annotations/DemoProcessFiles.java
    new file mode 100644
    index 000000000..8462c59e7
    --- /dev/null
    +++ b/annotations/DemoProcessFiles.java
    @@ -0,0 +1,43 @@
    +// annotations/DemoProcessFiles.java
    +// (c)2017 MindView LLC: see Copyright.txt
    +// We make no guarantees that this code is fit for any purpose.
    +// Visit http://OnJava8.com for more book information.
    +import onjava.ProcessFiles;
    +
    +public class DemoProcessFiles {
    +  public static void main(String[] args) {
    +    new ProcessFiles(file -> System.out.println(file),
    +      "java").start(args);
    +  }
    +}
    +/* Output:
    +.\AtUnitExample1.java
    +.\AtUnitExample2.java
    +.\AtUnitExample3.java
    +.\AtUnitExample4.java
    +.\AtUnitExample5.java
    +.\AUComposition.java
    +.\AUExternalTest.java
    +.\database\Constraints.java
    +.\database\DBTable.java
    +.\database\Member.java
    +.\database\SQLInteger.java
    +.\database\SQLString.java
    +.\database\TableCreator.java
    +.\database\Uniqueness.java
    +.\DemoProcessFiles.java
    +.\HashSetTest.java
    +.\ifx\ExtractInterface.java
    +.\ifx\IfaceExtractorProcessor.java
    +.\ifx\Multiplier.java
    +.\PasswordUtils.java
    +.\simplest\Simple.java
    +.\simplest\SimpleProcessor.java
    +.\simplest\SimpleTest.java
    +.\SimulatingNull.java
    +.\StackL.java
    +.\StackLStringTst.java
    +.\Testable.java
    +.\UseCase.java
    +.\UseCaseTracker.java
    +*/
    diff --git a/onjava/ProcessFiles.java b/onjava/ProcessFiles.java
    index 85275b8b0..4072d6fc3 100644
    --- a/onjava/ProcessFiles.java
    +++ b/onjava/ProcessFiles.java
    @@ -2,8 +2,6 @@
     // (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
    -// {ValidateByHand} // main() won't run on Travis CI
    -// {java onjava.ProcessFiles}
     package onjava;
     import java.io.*;
     import java.nio.file.*;
    @@ -47,32 +45,4 @@ public void start(String[] args) {
           .filter(matcher::matches)
           .forEach(p -> strategy.process(p.toFile()));
       }
    -  // Demonstration of how to use it:
    -  public static void main(String[] args) {
    -    new ProcessFiles(file -> System.out.println(file),
    -      "java").start(args);
    -  }
     }
    -/* Output: (First and Last 10 Lines)
    -.\ArrayShow.java
    -.\atunit\AtUnit.java
    -.\atunit\ClassNameFinder.java
    -.\atunit\Test.java
    -.\atunit\TestObjectCleanup.java
    -.\atunit\TestObjectCreate.java
    -.\atunit\TestProperty.java
    -.\BasicSupplier.java
    -.\CollectionMethodDifferences.java
    -.\ConvertTo.java
    -...________...________...________...________...
    -.\Stack.java
    -.\Suppliers.java
    -.\TimedAbort.java
    -.\Timer.java
    -.\Tuple.java
    -.\Tuple2.java
    -.\Tuple3.java
    -.\Tuple4.java
    -.\Tuple5.java
    -.\TypeCounter.java
    -*/
    
    From 27f9db2cb6a01b451e85f4cfda40a1c5e723caa6 Mon Sep 17 00:00:00 2001
    From: Bruce Eckel 
    Date: Wed, 17 May 2017 21:38:05 -0600
    Subject: [PATCH 272/320] Refactored tagging system
    
    ---
     .../groovy/com/mindviewinc/plugins/TaggingPlugin.groovy   | 4 ++--
     .../src/main/groovy/com/mindviewinc/plugins/Tags.groovy   | 8 ++++----
     collections/EnvironmentVariables.java                     | 2 +-
     compression/GZIPcompress.java                             | 2 +-
     compression/ZipCompress.java                              | 2 +-
     concurrent/CountingStream.java                            | 2 +-
     concurrent/DiningPhilosophers.java                        | 2 +-
     concurrent/ParallelStreamPuzzle3.java                     | 2 +-
     files/PathWatcher.java                                    | 2 +-
     files/TreeWatcher.java                                    | 2 +-
     iostreams/BasicFileOutput.java                            | 2 +-
     iostreams/BufferedInputFile.java                          | 2 +-
     iostreams/FileOutputShortcut.java                         | 2 +-
     iostreams/FormattedMemoryInput.java                       | 2 +-
     iostreams/MemoryInput.java                                | 2 +-
     iostreams/TestEOF.java                                    | 2 +-
     lowlevel/EvenProducer.java                                | 2 +-
     lowlevel/ThreadSize.java                                  | 2 +-
     strings/InfiniteRecursion.java                            | 6 ++++--
     19 files changed, 26 insertions(+), 24 deletions(-)
    
    diff --git a/buildSrc/src/main/groovy/com/mindviewinc/plugins/TaggingPlugin.groovy b/buildSrc/src/main/groovy/com/mindviewinc/plugins/TaggingPlugin.groovy
    index 2c1e5d4b4..a72daddee 100644
    --- a/buildSrc/src/main/groovy/com/mindviewinc/plugins/TaggingPlugin.groovy
    +++ b/buildSrc/src/main/groovy/com/mindviewinc/plugins/TaggingPlugin.groovy
    @@ -58,7 +58,7 @@ class TaggingPlugin implements Plugin {
                             File errFile = new File(file.parentFile, baseName + '.err')
     
                             javaTask.configure {
    -                            ignoreExitValue = tags.validateByHand || tags.throwsException
    +                            ignoreExitValue = tags.excludeFromGradle || tags.throwsException
                                 doFirst {
                                     if(outFile.exists())
                                         outFile.delete()
    @@ -77,7 +77,7 @@ class TaggingPlugin implements Plugin {
                                }
                             }
     
    -                        if (!tags.validateByHand) {
    +                        if (!tags.excludeFromGradle) {
                                 // Only add tasks that we know we can run successfully to the task list
                                 createdTasks.add(javaTask)
                             }
    diff --git a/buildSrc/src/main/groovy/com/mindviewinc/plugins/Tags.groovy b/buildSrc/src/main/groovy/com/mindviewinc/plugins/Tags.groovy
    index ed909a87c..9f343be93 100644
    --- a/buildSrc/src/main/groovy/com/mindviewinc/plugins/Tags.groovy
    +++ b/buildSrc/src/main/groovy/com/mindviewinc/plugins/Tags.groovy
    @@ -9,7 +9,7 @@ class Tags {
         Boolean lowLevelAppendix = false
         Boolean throwsException = false
         Boolean errorOutputExpected = false
    -    Boolean validateByHand = false
    +    Boolean excludeFromGradle = false
         Boolean ignoreOutput = false // This tag isn't used in the build...
         String fileRoot
         String mainClass
    @@ -44,7 +44,7 @@ class Tags {
             lowLevelAppendix = firstLine.contains("// lowlevel/")
             throwsException = hasTag('ThrowsException')
             errorOutputExpected = hasTag('ErrorOutputExpected')
    -        validateByHand = hasTag('ValidateByHand')
    +        excludeFromGradle = hasTag('ExcludeFromGradle')
             ignoreOutput = hasTag('IgnoreOutput')
             javap = extract('javap') // Includes only arguments to command
             runFirst = extract('RunFirst:')
    @@ -82,7 +82,7 @@ class Tags {
             excludeFromCI ||
             throwsException ||
             errorOutputExpected ||
    -        validateByHand ||
    +        excludeFromGradle ||
             ignoreOutput ||
             javaCmd ||
             args ||
    @@ -104,7 +104,7 @@ class Tags {
             excludeFromCI
             throwsException
             errorOutputExpected
    -        validateByHand
    +        excludeFromGradle
             ignoreOutput
             fileRoot
             mainClass
    diff --git a/collections/EnvironmentVariables.java b/collections/EnvironmentVariables.java
    index 4ae2ecaa8..2ee865f2c 100644
    --- a/collections/EnvironmentVariables.java
    +++ b/collections/EnvironmentVariables.java
    @@ -2,7 +2,7 @@
     // (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
    -// {ValidateByHand}
    +// {VisuallyInspectOutput}
     import java.util.*;
     
     public class EnvironmentVariables {
    diff --git a/compression/GZIPcompress.java b/compression/GZIPcompress.java
    index 77cf590d6..0a669a913 100644
    --- a/compression/GZIPcompress.java
    +++ b/compression/GZIPcompress.java
    @@ -3,7 +3,7 @@
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // {java GZIPcompress GZIPcompress.java}
    -// {ValidateByHand}
    +// {VisuallyInspectOutput}
     import java.util.zip.*;
     import java.io.*;
     
    diff --git a/compression/ZipCompress.java b/compression/ZipCompress.java
    index 7ac5dc985..a8168e7c4 100644
    --- a/compression/ZipCompress.java
    +++ b/compression/ZipCompress.java
    @@ -5,7 +5,7 @@
     // Uses Zip compression to compress any
     // number of files given on the command line
     // {java ZipCompress ZipCompress.java}
    -// {ValidateByHand}
    +// {VisuallyInspectOutput}
     import java.util.zip.*;
     import java.io.*;
     import java.util.*;
    diff --git a/concurrent/CountingStream.java b/concurrent/CountingStream.java
    index 8ab2ba114..1d0adc665 100644
    --- a/concurrent/CountingStream.java
    +++ b/concurrent/CountingStream.java
    @@ -2,7 +2,7 @@
     // (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
    -// {ValidateByHand}
    +// {VisuallyInspectOutput}
     import java.util.*;
     import java.util.concurrent.*;
     import java.util.stream.*;
    diff --git a/concurrent/DiningPhilosophers.java b/concurrent/DiningPhilosophers.java
    index 2fc2e7989..45801d831 100644
    --- a/concurrent/DiningPhilosophers.java
    +++ b/concurrent/DiningPhilosophers.java
    @@ -3,7 +3,7 @@
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Hidden deadlock
    -// {ValidateByHand} Gradle has trouble
    +// {ExcludeFromGradle} Gradle has trouble
     import java.util.*;
     import java.util.concurrent.*;
     import onjava.Nap;
    diff --git a/concurrent/ParallelStreamPuzzle3.java b/concurrent/ParallelStreamPuzzle3.java
    index f537e12ff..92d2c851d 100644
    --- a/concurrent/ParallelStreamPuzzle3.java
    +++ b/concurrent/ParallelStreamPuzzle3.java
    @@ -2,7 +2,7 @@
     // (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
    -// {ValidateByHand}
    +// {VisuallyInspectOutput}
     import java.util.*;
     import java.util.stream.*;
     
    diff --git a/files/PathWatcher.java b/files/PathWatcher.java
    index 3854ab72d..b4c5a34e7 100644
    --- a/files/PathWatcher.java
    +++ b/files/PathWatcher.java
    @@ -2,7 +2,7 @@
     // (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
    -// {ValidateByHand}
    +// {VisuallyInspectOutput}
     import java.io.IOException;
     import java.nio.file.*;
     import static java.nio.file.StandardWatchEventKinds.*;
    diff --git a/files/TreeWatcher.java b/files/TreeWatcher.java
    index bc8378d76..75f524c44 100644
    --- a/files/TreeWatcher.java
    +++ b/files/TreeWatcher.java
    @@ -2,7 +2,7 @@
     // (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
    -// {ValidateByHand}
    +// {VisuallyInspectOutput}
     import java.io.IOException;
     import java.nio.file.*;
     import static java.nio.file.StandardWatchEventKinds.*;
    diff --git a/iostreams/BasicFileOutput.java b/iostreams/BasicFileOutput.java
    index 810bdc5ff..8c1184de2 100644
    --- a/iostreams/BasicFileOutput.java
    +++ b/iostreams/BasicFileOutput.java
    @@ -2,7 +2,7 @@
     // (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
    -// {ValidateByHand}
    +// {VisuallyInspectOutput}
     import java.io.*;
     
     public class BasicFileOutput {
    diff --git a/iostreams/BufferedInputFile.java b/iostreams/BufferedInputFile.java
    index ff7c0caf1..76dc960fa 100644
    --- a/iostreams/BufferedInputFile.java
    +++ b/iostreams/BufferedInputFile.java
    @@ -2,7 +2,7 @@
     // (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
    -// {ValidateByHand}
    +// {VisuallyInspectOutput}
     import java.io.*;
     import java.util.stream.*;
     
    diff --git a/iostreams/FileOutputShortcut.java b/iostreams/FileOutputShortcut.java
    index f1d476557..7e949a4d0 100644
    --- a/iostreams/FileOutputShortcut.java
    +++ b/iostreams/FileOutputShortcut.java
    @@ -2,7 +2,7 @@
     // (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
    -// {ValidateByHand}
    +// {VisuallyInspectOutput}
     import java.io.*;
     
     public class FileOutputShortcut {
    diff --git a/iostreams/FormattedMemoryInput.java b/iostreams/FormattedMemoryInput.java
    index 4e38370c4..b6b7e3168 100644
    --- a/iostreams/FormattedMemoryInput.java
    +++ b/iostreams/FormattedMemoryInput.java
    @@ -2,7 +2,7 @@
     // (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
    -// {ValidateByHand}
    +// {VisuallyInspectOutput}
     import java.io.*;
     
     public class FormattedMemoryInput {
    diff --git a/iostreams/MemoryInput.java b/iostreams/MemoryInput.java
    index 2fc1cc8ab..4989d0778 100644
    --- a/iostreams/MemoryInput.java
    +++ b/iostreams/MemoryInput.java
    @@ -2,7 +2,7 @@
     // (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
    -// {ValidateByHand}
    +// {VisuallyInspectOutput}
     import java.io.*;
     
     public class MemoryInput {
    diff --git a/iostreams/TestEOF.java b/iostreams/TestEOF.java
    index 692ea4070..dee0ba18d 100644
    --- a/iostreams/TestEOF.java
    +++ b/iostreams/TestEOF.java
    @@ -3,7 +3,7 @@
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Testing for end of file
    -// {ValidateByHand}
    +// {VisuallyInspectOutput}
     import java.io.*;
     
     public class TestEOF {
    diff --git a/lowlevel/EvenProducer.java b/lowlevel/EvenProducer.java
    index e365b938e..adb7153d8 100644
    --- a/lowlevel/EvenProducer.java
    +++ b/lowlevel/EvenProducer.java
    @@ -3,7 +3,7 @@
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // When threads collide
    -// {ValidateByHand}
    +// {VisuallyInspectOutput}
     
     public class EvenProducer extends IntGenerator {
       private int currentEvenValue = 0;
    diff --git a/lowlevel/ThreadSize.java b/lowlevel/ThreadSize.java
    index 36ff2bf53..d518b2ac3 100644
    --- a/lowlevel/ThreadSize.java
    +++ b/lowlevel/ThreadSize.java
    @@ -2,7 +2,7 @@
     // (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
    -// {ValidateByHand} Takes a long time or hangs
    +// {ExcludeFromGradle} Takes a long time or hangs
     import java.util.concurrent.*;
     import onjava.Nap;
     
    diff --git a/strings/InfiniteRecursion.java b/strings/InfiniteRecursion.java
    index 98f396a42..0be8e3843 100644
    --- a/strings/InfiniteRecursion.java
    +++ b/strings/InfiniteRecursion.java
    @@ -3,14 +3,16 @@
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Accidental recursion
    -// {ValidateByHand} Throws very long exception
    +// {ThrowsException}
    +// {VisuallyInspectOutput} Throws very long exception
     import java.util.*;
     import java.util.stream.*;
     
     public class InfiniteRecursion {
       @Override
       public String toString() {
    -    return " InfiniteRecursion address: " + this + "\n";
    +    return
    +      " InfiniteRecursion address: " + this + "\n";
       }
       public static void main(String[] args) {
         Stream.generate(InfiniteRecursion::new)
    
    From 90971436160d9cb214e4b150c16cd5391c475c71 Mon Sep 17 00:00:00 2001
    From: Bruce Eckel 
    Date: Wed, 17 May 2017 22:06:45 -0600
    Subject: [PATCH 273/320] Exclude Find, PathWatch and TreeWatcher from Gradle
    
    ---
     files/Find.java        | 1 +
     files/PathWatcher.java | 2 +-
     files/TreeWatcher.java | 2 +-
     3 files changed, 3 insertions(+), 2 deletions(-)
    
    diff --git a/files/Find.java b/files/Find.java
    index 910b9443f..c9bafd0bc 100644
    --- a/files/Find.java
    +++ b/files/Find.java
    @@ -2,6 +2,7 @@
     // (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
    +// {ExcludeFromGradle}
     import java.nio.file.*;
     
     public class Find {
    diff --git a/files/PathWatcher.java b/files/PathWatcher.java
    index b4c5a34e7..d880219ae 100644
    --- a/files/PathWatcher.java
    +++ b/files/PathWatcher.java
    @@ -2,7 +2,7 @@
     // (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
    -// {VisuallyInspectOutput}
    +// {ExcludeFromGradle}
     import java.io.IOException;
     import java.nio.file.*;
     import static java.nio.file.StandardWatchEventKinds.*;
    diff --git a/files/TreeWatcher.java b/files/TreeWatcher.java
    index 75f524c44..ea36be3fb 100644
    --- a/files/TreeWatcher.java
    +++ b/files/TreeWatcher.java
    @@ -2,7 +2,7 @@
     // (c)2017 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
    -// {VisuallyInspectOutput}
    +// {ExcludeFromGradle}
     import java.io.IOException;
     import java.nio.file.*;
     import static java.nio.file.StandardWatchEventKinds.*;
    
    From 7df16392cfcedf8ade82b18bd246f34d7ae2154d Mon Sep 17 00:00:00 2001
    From: Bruce Eckel 
    Date: Fri, 16 Jun 2017 04:03:38 -0600
    Subject: [PATCH 274/320] From pull request #26
    
    ---
     housekeeping/Mugs.java | 3 ---
     1 file changed, 3 deletions(-)
    
    diff --git a/housekeeping/Mugs.java b/housekeeping/Mugs.java
    index 90ebbae9c..d9b928024 100644
    --- a/housekeeping/Mugs.java
    +++ b/housekeeping/Mugs.java
    @@ -8,9 +8,6 @@ class Mug {
       Mug(int marker) {
         System.out.println("Mug(" + marker + ")");
       }
    -  void f(int marker) {
    -    System.out.println("f(" + marker + ")");
    -  }
     }
     
     public class Mugs {
    
    From ad67514d8fd1ffca03a158f09fceef51e48fc5f7 Mon Sep 17 00:00:00 2001
    From: Gianluca Finocchiaro 
    Date: Mon, 21 Aug 2017 10:27:36 +0200
    Subject: [PATCH 275/320] Remove synchronized from nextSerialNumber
    
    Here I guess that the synchronized keyword is a typo.
    ---
     lowlevel/AtomicSerialNumbers.java | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/lowlevel/AtomicSerialNumbers.java b/lowlevel/AtomicSerialNumbers.java
    index 53547bccb..ed063c86e 100644
    --- a/lowlevel/AtomicSerialNumbers.java
    +++ b/lowlevel/AtomicSerialNumbers.java
    @@ -8,7 +8,7 @@
     AtomicSerialNumbers extends SerialNumbers {
       private AtomicInteger serialNumber =
         new AtomicInteger();
    -  public synchronized int nextSerialNumber() {
    +  public int nextSerialNumber() {
         return serialNumber.getAndIncrement();
       }
       public static void main(String[] args) {
    
    From bccbbf309c4aa0f3b3ed2898cf6f6a39014d1081 Mon Sep 17 00:00:00 2001
    From: Bruce Eckel 
    Date: Mon, 5 Oct 2020 12:43:41 -0600
    Subject: [PATCH 276/320] Update gradle-wrapper.properties
    
    ---
     gradle/wrapper/gradle-wrapper.properties | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
    index a2a607a91..5ea98a321 100644
    --- a/gradle/wrapper/gradle-wrapper.properties
    +++ b/gradle/wrapper/gradle-wrapper.properties
    @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME
     distributionPath=wrapper/dists
     zipStoreBase=GRADLE_USER_HOME
     zipStorePath=wrapper/dists
    -distributionUrl=https://services.gradle.org/distributions/gradle-3.5-bin.zip
    +distributionUrl=https://services.gradle.org/distributions/gradle-6.6.1-bin.zip
    
    From 0b9d0341fea1d855915be7c87372e844f264d86e Mon Sep 17 00:00:00 2001
    From: Bruce Eckel 
    Date: Mon, 5 Oct 2020 13:07:22 -0600
    Subject: [PATCH 277/320] Trying to upgrade build parts
    
    ---
     build.gradle                |  4 ++--
     gradle/junit-jupiter.gradle | 10 ++++++----
     2 files changed, 8 insertions(+), 6 deletions(-)
    
    diff --git a/build.gradle b/build.gradle
    index afd39a4a6..545eada12 100644
    --- a/build.gradle
    +++ b/build.gradle
    @@ -6,7 +6,7 @@ buildscript {
         }
         dependencies {
             classpath 'me.champeau.gradle:jmh-gradle-plugin:0.3.1'
    -        classpath 'org.junit.platform:junit-platform-gradle-plugin:1.0.0-M2'
    +        classpath 'org.junit.platform:junit-platform-gradle-plugin:1.0.3'
         }
     }
     
    @@ -21,4 +21,4 @@ subprojects {
         apply plugin: 'com.mindviewinc.tagging'
     }
     
    -apply from: 'gradle/subprojects.gradle'
    \ No newline at end of file
    +apply from: 'gradle/subprojects.gradle'
    diff --git a/gradle/junit-jupiter.gradle b/gradle/junit-jupiter.gradle
    index ccdd4ec02..08c1f2556 100644
    --- a/gradle/junit-jupiter.gradle
    +++ b/gradle/junit-jupiter.gradle
    @@ -3,16 +3,18 @@ import org.apache.tools.ant.util.TeeOutputStream
     apply plugin: 'org.junit.platform.gradle.plugin'
     
     ext {
    -    junitJupiterVersion  = '5.0.0-M2'
    +    junitJupiterVersion  = '5.3.1'
     }
     
     dependencies {
    -    testCompile "org.junit.jupiter:junit-jupiter-api:${junitJupiterVersion}"
    -    testRuntime "org.junit.jupiter:junit-jupiter-engine:${junitJupiterVersion}"
    +    // testCompile "org.junit.jupiter:junit-jupiter-api:${junitJupiterVersion}"
    +    // testRuntime "org.junit.jupiter:junit-jupiter-engine:${junitJupiterVersion}"
    +    testImplementation 'org.junit.jupiter:junit-jupiter-api:${junitJupiterVersion}'
    +    testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:${junitJupiterVersion}'
     }
     
     junitPlatform {
    -    platformVersion '1.0.0-M2'
    +    platformVersion '1.0.3'
         includeClassNamePattern '.*'
     }
     
    
    From 2ab352d970c6f5f3ecf8895f5ed211ab996d64f1 Mon Sep 17 00:00:00 2001
    From: Bruce Eckel 
    Date: Mon, 5 Oct 2020 13:08:25 -0600
    Subject: [PATCH 278/320] Revert "Trying to upgrade build parts"
    
    This reverts commit 0b9d0341fea1d855915be7c87372e844f264d86e.
    ---
     build.gradle                |  4 ++--
     gradle/junit-jupiter.gradle | 10 ++++------
     2 files changed, 6 insertions(+), 8 deletions(-)
    
    diff --git a/build.gradle b/build.gradle
    index 545eada12..afd39a4a6 100644
    --- a/build.gradle
    +++ b/build.gradle
    @@ -6,7 +6,7 @@ buildscript {
         }
         dependencies {
             classpath 'me.champeau.gradle:jmh-gradle-plugin:0.3.1'
    -        classpath 'org.junit.platform:junit-platform-gradle-plugin:1.0.3'
    +        classpath 'org.junit.platform:junit-platform-gradle-plugin:1.0.0-M2'
         }
     }
     
    @@ -21,4 +21,4 @@ subprojects {
         apply plugin: 'com.mindviewinc.tagging'
     }
     
    -apply from: 'gradle/subprojects.gradle'
    +apply from: 'gradle/subprojects.gradle'
    \ No newline at end of file
    diff --git a/gradle/junit-jupiter.gradle b/gradle/junit-jupiter.gradle
    index 08c1f2556..ccdd4ec02 100644
    --- a/gradle/junit-jupiter.gradle
    +++ b/gradle/junit-jupiter.gradle
    @@ -3,18 +3,16 @@ import org.apache.tools.ant.util.TeeOutputStream
     apply plugin: 'org.junit.platform.gradle.plugin'
     
     ext {
    -    junitJupiterVersion  = '5.3.1'
    +    junitJupiterVersion  = '5.0.0-M2'
     }
     
     dependencies {
    -    // testCompile "org.junit.jupiter:junit-jupiter-api:${junitJupiterVersion}"
    -    // testRuntime "org.junit.jupiter:junit-jupiter-engine:${junitJupiterVersion}"
    -    testImplementation 'org.junit.jupiter:junit-jupiter-api:${junitJupiterVersion}'
    -    testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:${junitJupiterVersion}'
    +    testCompile "org.junit.jupiter:junit-jupiter-api:${junitJupiterVersion}"
    +    testRuntime "org.junit.jupiter:junit-jupiter-engine:${junitJupiterVersion}"
     }
     
     junitPlatform {
    -    platformVersion '1.0.3'
    +    platformVersion '1.0.0-M2'
         includeClassNamePattern '.*'
     }
     
    
    From 37e6a2aabb816ea577442233e95cc921456025d3 Mon Sep 17 00:00:00 2001
    From: Bruce Eckel 
    Date: Mon, 5 Oct 2020 13:51:37 -0600
    Subject: [PATCH 279/320] Revert "Update gradle-wrapper.properties"
    
    This reverts commit bccbbf309c4aa0f3b3ed2898cf6f6a39014d1081.
    ---
     gradle/wrapper/gradle-wrapper.properties | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
    index 5ea98a321..a2a607a91 100644
    --- a/gradle/wrapper/gradle-wrapper.properties
    +++ b/gradle/wrapper/gradle-wrapper.properties
    @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME
     distributionPath=wrapper/dists
     zipStoreBase=GRADLE_USER_HOME
     zipStorePath=wrapper/dists
    -distributionUrl=https://services.gradle.org/distributions/gradle-6.6.1-bin.zip
    +distributionUrl=https://services.gradle.org/distributions/gradle-3.5-bin.zip
    
    From d4ff6fe1b2b1cf727406b79d1b58cbed519376c4 Mon Sep 17 00:00:00 2001
    From: Bruce Eckel 
    Date: Mon, 5 Oct 2020 14:09:12 -0600
    Subject: [PATCH 280/320] Update gradle-wrapper.properties
    
    ---
     gradle/wrapper/gradle-wrapper.properties | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
    index a2a607a91..5ea98a321 100644
    --- a/gradle/wrapper/gradle-wrapper.properties
    +++ b/gradle/wrapper/gradle-wrapper.properties
    @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME
     distributionPath=wrapper/dists
     zipStoreBase=GRADLE_USER_HOME
     zipStorePath=wrapper/dists
    -distributionUrl=https://services.gradle.org/distributions/gradle-3.5-bin.zip
    +distributionUrl=https://services.gradle.org/distributions/gradle-6.6.1-bin.zip
    
    From c26727d7a7fb1e3ab9485a8a5a55d9bab503b4c7 Mon Sep 17 00:00:00 2001
    From: James Ward 
    Date: Tue, 6 Oct 2020 12:05:43 -0600
    Subject: [PATCH 281/320] gradle updates
    
    ---
     build.gradle                |  7 +++----
     gradle/findbugs.gradle      |  4 +++-
     gradle/junit-jupiter.gradle | 36 +++++++++++++++++++++++-------------
     3 files changed, 29 insertions(+), 18 deletions(-)
    
    diff --git a/build.gradle b/build.gradle
    index afd39a4a6..09683e46a 100644
    --- a/build.gradle
    +++ b/build.gradle
    @@ -5,8 +5,7 @@ buildscript {
             }
         }
         dependencies {
    -        classpath 'me.champeau.gradle:jmh-gradle-plugin:0.3.1'
    -        classpath 'org.junit.platform:junit-platform-gradle-plugin:1.0.0-M2'
    +        classpath 'me.champeau.gradle:jmh-gradle-plugin:0.5.2'
         }
     }
     
    @@ -18,7 +17,7 @@ subprojects {
         apply from: "$rootProject.projectDir/gradle/jmh.gradle"
         apply from: "$rootProject.projectDir/gradle/checkstyle.gradle"
         apply from: "$rootProject.projectDir/gradle/findbugs.gradle"
    -    apply plugin: 'com.mindviewinc.tagging'
    +    //apply plugin: 'com.mindviewinc.tagging'
     }
     
    -apply from: 'gradle/subprojects.gradle'
    \ No newline at end of file
    +apply from: 'gradle/subprojects.gradle'
    diff --git a/gradle/findbugs.gradle b/gradle/findbugs.gradle
    index f7e6383ba..ac628cb29 100644
    --- a/gradle/findbugs.gradle
    +++ b/gradle/findbugs.gradle
    @@ -1,3 +1,4 @@
    +/*
     apply plugin: 'findbugs'
     
     findbugs {
    @@ -10,4 +11,5 @@ tasks.withType(FindBugs) {
             xml.enabled = false
             html.enabled = true
         }
    -}
    \ No newline at end of file
    +}
    +*/
    diff --git a/gradle/junit-jupiter.gradle b/gradle/junit-jupiter.gradle
    index ccdd4ec02..98a778434 100644
    --- a/gradle/junit-jupiter.gradle
    +++ b/gradle/junit-jupiter.gradle
    @@ -1,19 +1,15 @@
     import org.apache.tools.ant.util.TeeOutputStream
     
    -apply plugin: 'org.junit.platform.gradle.plugin'
    -
    -ext {
    -    junitJupiterVersion  = '5.0.0-M2'
    -}
    -
     dependencies {
    -    testCompile "org.junit.jupiter:junit-jupiter-api:${junitJupiterVersion}"
    -    testRuntime "org.junit.jupiter:junit-jupiter-engine:${junitJupiterVersion}"
    +    testImplementation(platform('org.junit:junit-bom:5.7.0'))
    +    testImplementation('org.junit.jupiter:junit-jupiter')
     }
     
    -junitPlatform {
    -    platformVersion '1.0.0-M2'
    -    includeClassNamePattern '.*'
    +test {
    +    useJUnitPlatform()
    +    testLogging {
    +        events "passed", "skipped", "failed"
    +    }
     }
     
     /* NEW: (REQUIRES CODE REWRITES IN BOOK AND TEST CODE)
    @@ -45,14 +41,28 @@ junitPlatform {
       JUnit 5's junitPlatformTest runs as a "javaExec" rather than a "test",
       so we can't hook into the before/after test behavior.
     */
    -tasks.findByPath(":$name:junitPlatformTest").configure {
    +tasks.findByPath(":$name:test").configure {
         File testDir = file("tests")
         if(testDir.exists()) {
             File outFile = new File(testDir, 'report.txt')
    +
    +        Writer taskOutput
    +
             doFirst {
    -            standardOutput = new TeeOutputStream(new FileOutputStream(outFile, true), System.out)
    +            taskOutput = project.file(outFile).newWriter()
             }
    +
    +        testLogging.showStandardStreams = true
    +
    +        onOutput { descriptor, event ->
    +            taskOutput.append(event.message)
    +        }
    +
             doLast {
    +            // WARNING: if the task fails, this won't be executed and the file remains open.
    +            // The memory cache version doesn't have this problem.
    +            taskOutput.close()
    +
                 if(outFile.size() == 0)
                     outFile.delete()
                 else if(outFile.text.contains("0 tests found"))
    
    From 7fb818dc241d024f44b89f50e1214cfa08f7b3ec Mon Sep 17 00:00:00 2001
    From: Bruce Eckel 
    Date: Tue, 6 Oct 2020 15:41:25 -0600
    Subject: [PATCH 282/320] Update build.gradle
    
    com.mindviewinc.tagging seems to work now so I've re-enabled it, and this eliminates almost all the errors under JDK8.
    ---
     build.gradle | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/build.gradle b/build.gradle
    index 09683e46a..5349c1480 100644
    --- a/build.gradle
    +++ b/build.gradle
    @@ -17,7 +17,7 @@ subprojects {
         apply from: "$rootProject.projectDir/gradle/jmh.gradle"
         apply from: "$rootProject.projectDir/gradle/checkstyle.gradle"
         apply from: "$rootProject.projectDir/gradle/findbugs.gradle"
    -    //apply plugin: 'com.mindviewinc.tagging'
    +    apply plugin: 'com.mindviewinc.tagging'
     }
     
     apply from: 'gradle/subprojects.gradle'
    
    From c7a29b9b47756a62720f86d9b71106d6e881dc97 Mon Sep 17 00:00:00 2001
    From: Bruce Eckel 
    Date: Tue, 6 Oct 2020 16:06:14 -0600
    Subject: [PATCH 283/320] Should work with JDK8 now
    
    ---
     Copyright.txt                             | 2 +-
     lowlevel/NotAtomic.java                   | 3 +--
     patterns/SingletonPattern.java            | 4 ++--
     staticchecking/NoBasePetSpeak.py          | 2 +-
     staticchecking/PetSpeak.py                | 2 +-
     validating/tests/StringInverterTests.java | 4 ++--
     6 files changed, 8 insertions(+), 9 deletions(-)
    
    diff --git a/Copyright.txt b/Copyright.txt
    index 8cc3bb56a..f0d35035f 100644
    --- a/Copyright.txt
    +++ b/Copyright.txt
    @@ -1,5 +1,5 @@
     // Copyright.txt
    -This computer source code is Copyright ©2017 MindView LLC.
    +This computer source code is Copyright ©2020 MindView LLC.
     All Rights Reserved.
     
     Permission to use, copy, modify, and distribute this
    diff --git a/lowlevel/NotAtomic.java b/lowlevel/NotAtomic.java
    index f77eb128f..e3fa47847 100644
    --- a/lowlevel/NotAtomic.java
    +++ b/lowlevel/NotAtomic.java
    @@ -18,8 +18,7 @@ public class NotAtomic {
       public NotAtomic();
         Code:
            0: aload_0
    -       1: invokespecial #1 // Method
    -java/lang/Object."":()V
    +       1: invokespecial #1 // Method java/lang/Object."":()V
            4: return
     
       void f1();
    diff --git a/patterns/SingletonPattern.java b/patterns/SingletonPattern.java
    index f2e46e301..0e466a766 100644
    --- a/patterns/SingletonPattern.java
    +++ b/patterns/SingletonPattern.java
    @@ -8,8 +8,8 @@ interface Resource {
       void setValue(int x);
     }
     
    -// Since this isn't inherited from a Cloneable
    -// base class and cloneability isn't added,
    +// This isn't inherited from a Cloneable
    +// base class and cloneability isn't added so
     // making it final prevents cloneability from
     // being added through inheritance. This also
     // implements thread-safe lazy initialization:
    diff --git a/staticchecking/NoBasePetSpeak.py b/staticchecking/NoBasePetSpeak.py
    index e148614d6..80c771c5f 100644
    --- a/staticchecking/NoBasePetSpeak.py
    +++ b/staticchecking/NoBasePetSpeak.py
    @@ -2,7 +2,7 @@
     # (c)2017 MindView LLC: see Copyright.txt
     # We make no guarantees that this code is fit for any purpose.
     # Visit http://OnJava8.com for more book information.
    -# Speaking pets without base classes
    +#- Speaking pets without base classes
     
     class Cat:
         def speak(self):
    diff --git a/staticchecking/PetSpeak.py b/staticchecking/PetSpeak.py
    index 57a05bd6b..998a678ee 100644
    --- a/staticchecking/PetSpeak.py
    +++ b/staticchecking/PetSpeak.py
    @@ -2,7 +2,7 @@
     # (c)2017 MindView LLC: see Copyright.txt
     # We make no guarantees that this code is fit for any purpose.
     # Visit http://OnJava8.com for more book information.
    -# Speaking pets in Python
    +#- Speaking pets in Python
     
     class Pet:
         def speak(self): pass
    diff --git a/validating/tests/StringInverterTests.java b/validating/tests/StringInverterTests.java
    index 142512177..817253731 100644
    --- a/validating/tests/StringInverterTests.java
    +++ b/validating/tests/StringInverterTests.java
    @@ -22,7 +22,7 @@ void basicInversion1() {
       }
       @Test
       void basicInversion2() {
    -    expectThrows(Error.class, () -> {
    +    assertThrows(Error.class, () -> {
           assertEquals(inverter.invert("X"), "X");
         });
       }
    @@ -52,7 +52,7 @@ void allowedCharacters() {
       void lengthNoGreaterThan30() {
         String str = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
         assertTrue(str.length() > 30);
    -    expectThrows(RuntimeException.class, () -> {
    +    assertThrows(RuntimeException.class, () -> {
           inverter.invert(str);
         });
       }
    
    From 3b5b23fb37897883a1e75ba952add999feeb598d Mon Sep 17 00:00:00 2001
    From: Bruce Eckel 
    Date: Tue, 6 Oct 2020 16:20:57 -0600
    Subject: [PATCH 284/320] After running 'gradle wrapper' to fix up gradlew
     files
    
    ---
     gradle/wrapper/gradle-wrapper.jar        | Bin 53636 -> 59203 bytes
     gradle/wrapper/gradle-wrapper.properties |   2 +-
     gradlew                                  | 111 ++++++++++++++---------
     gradlew.bat                              |  53 ++++++-----
     4 files changed, 95 insertions(+), 71 deletions(-)
    
    diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar
    index 941144813d241db74e1bf25b6804c679fbe7f0a3..e708b1c023ec8b20f512888fe07c5bd3ff77bb8f 100644
    GIT binary patch
    literal 59203
    zcma&O1CT9Y(k9%tZQHhO+qUh#ZQHhO+qmuS+qP|E@9xZO?0h@l{(r>DQ>P;GjjD{w
    zH}lENr;dU&FbEU?00aa80D$0M0RRB{U*7-#kbjS|qAG&4l5%47zyJ#WrfA#1$1Ctx
    zf&Z_d{GW=lf^w2#qRJ|CvSJUi(^E3iv~=^Z(zH}F)3Z%V3`@+rNB7gTVU{Bb~90p|f+0(v;nz01EG7yDMX9@S~__vVgv%rS$+?IH+oZ03D5zYrv|^
    zC1J)SruYHmCki$jLBlTaE5&dFG9-kq3!^i>^UQL`%gn6)jz54$WDmeYdsBE9;PqZ_
    zoGd=P4+|(-u4U1dbAVQrFWoNgNd;0nrghPFbQrJctO>nwDdI`Q^i0XJDUYm|T|RWc
    zZ3^Qgo_Qk$%Fvjj-G}1NB#ZJqIkh;kX%V{THPqOyiq)d)0+(r9o(qKlSp*hmK#iIY
    zA^)Vr$-Hz<#SF=0@tL@;dCQsm`V9s1vYNq}K1B)!XSK?=I1)tX+bUV52$YQu*0%fnWEukW>mxkz+%3-S!oguE8u#MGzST8_Dy^#U?fA@S#K$S@9msUiX!gd_ow>08w5)nX{-KxqMOo7d?k2&?Vf
    z&diGDtZr(0cwPe9z9FAUSD9KC)7(n^lMWuayCfxzy8EZsns%OEblHFSzP=cL6}?J|
    z0U$H!4S_TVjj<`6dy^2j`V`)mC;cB%*
    z8{>_%E1^FH!*{>4a7*C1v>~1*@TMcLK{7nEQ!_igZC}ikJ$*<$yHy>7)oy79A~#xE
    zWavoJOIOC$5b6*q*F_qN1>2#MY)AXVyr$6x4b=$x^*aqF*L?vmj>Mgv+|ITnw_BoW
    zO?jwHvNy^prH{9$rrik1#fhyU^MpFqF2fYEt(;4`Q&XWOGDH8k6M=%@fics4ajI;st#
    zCU^r1CK&|jzUhRMv;+W~6N;u<;#DI6cCw-otsc@IsN3MoSD^O`eNflIoR~l4*&-%RBYk@gb^|-JXs&~KuSEmMxB}xSb
    z@K76cXD=Y|=I&SNC2E+>Zg?R6E%DGCH5J1nU!A|@eX9oS(WPaMm==k2s_ueCqdZw|
    z&hqHp)47`c{BgwgvY2{xz%OIkY1xDwkw!<0veB#yF4ZKJyabhyyVS`gZepcFIk%e2
    zTcrmt2@-8`7i-@5Nz>oQWFuMC_KlroCl(PLSodswHqJ3fn<;gxg9=}~3x_L3P`9Sn
    zChIf}8vCHvTriz~T2~FamRi?rh?>3bX1j}%bLH+uFX+p&+^aXbOK7clZxdU~6Uxgy
    z8R=obwO4dL%pmVo*Ktf=lH6hnlz_5k3cG;m8lgaPp~?eD!Yn2kf)tU6PF{kLyn|oI@eQ`F
    z3IF7~Blqg8-uwUuWZScRKn%c2_}dXB6Dx_&xR*n9M9LXasJhtZdr$vBY!rP{c@=)&
    z#!?L$2UrkvClwQO>U*fSMs67oSj2mxiJ$t;E|>q%Kh_GzzWWO&3;ufU%2z%ucBU8H
    z3WIwr$n)cfCXR&>tyB7BcSInK>=ByZA%;cVEJhcg<#6N{aZC4>K41XF>ZgjG`z_u&
    zGY?;Ad?-sgiOnI`oppF1o1Gurqbi*;#x2>+SSV6|1^G@ooVy@fg?wyf@0Y!UZ4!}nGuLeC^l)6pwkh|oRY`s1Pm$>zZ3u-83T|9
    zGaKJIV3_x+u1>cRibsaJpJqhcm%?0-L;2
    zitBrdRxNmb0OO2J%Y&Ym(6*`_P3&&5Bw157{o7LFguvxC$4&zTy#U=W*l&(Q2MNO}
    zfaUwYm{XtILD$3864IA_nn34oVa_g^FRuHL5wdUd)+W-p-iWCKe8m_cMHk+=?
    zeKX)M?Dt(|{r5t7IenkAXo%&EXIb-i^w+0CX0D=xApC=|Xy(`xy+QG^UyFe
    z+#J6h_&T5i#sV)hj3D4WN%z;2+jJcZxcI3*CHXGmOF3^)JD5j&wfX)e?-|V0GPuA+
    zQFot%aEqGNJJHn$!_}#PaAvQ^{3-Ye7b}rWwrUmX53(|~i0v{}G_sI9uDch_brX&6
    zWl5Ndj-AYg(W9CGfQf<6!YmY>Ey)+uYd_JNXH=>|`OH-CDCmcH(0%iD_aLlNHKH
    z7bcW-^5+QV$jK?R*)wZ>r9t}loM@XN&M-Pw=F#xn(;u3!(3SXXY^@=aoj70;_=QE9
    zGghsG3ekq#N||u{4We_25U=y#T*S{4I{++Ku)>
    zQ!DZW;pVcn>b;&g2;YE#+V`v*Bl&Y-i@X6D*OpNA{G@JAXho&aOk(_j^weW{#3X5Y
    z%$q_wpb07EYPdmyH(1^09i$ca{O<}7)
    zRWncXdSPgBE%BM#by!E>tdnc$8RwUJg1*x($6$}ae$e9Knj8gvVZe#bLi!<+&BkFj
    zg@nOpDneyc+hU9P-;jmOSMN|*H#>^Ez#?;%C3hg_65leSUm;iz)UkW)jX#p)e&S&M
    z1|a?wDzV5NVnlhRBCd_;F87wp>6c<&nkgvC+!@KGiIqWY4l}=&1w7|r6{oBN8xyzh
    zG$b#2=RJp_iq6)#t5%yLkKx(0@D=C3w+oiXtSuaQ%I1WIb-eiE$d~!)b@|4XLy!CZ
    z9p=t=%3ad@Ep+<9003D2KZ5VyP~_n$=;~r&YUg5UZ0KVD&tR1DHy9x)qWtKJp#Kq#
    zP*8p#W(8JJ_*h_3W}FlvRam?<4Z+-H77^$Lvi+#vmhL9J
    zJ<1SV45xi;SrO2f=-OB(7#iNA5)x1uNC-yNxUw|!00vcW2PufRm>e~toH;M0Q85MQLWd?3O{i8H+5VkR@l9Dg-ma
    ze2fZ%>G(u5(k9EHj2L6!;(KZ8%8|*-1V|B#EagbF(rc+5iL_5;Eu)L4Z-V;0HfK4d
    z*{utLse_rvHZeQ>V5H=f78M3Ntg1BPxFCVD{HbNA6?9*^YIq;B-DJd{Ca2L#)qWP?
    zvX^NhFmX?CTWw&Ns}lgs;r3i+Bq@y}Ul+U%pzOS0Fcv9~aB(0!>GT0)NO?p=25LjN
    z2bh>6RhgqD7bQj#k-KOm@JLgMa6>%-ok1WpOe)FS^XOU{c?d5shG(lIn3GiVBxmg`u%-j=)^v&pX1JecJics3&jvPI)mDut52?
    z3jEA)DM%}BYbxxKrizVYwq?(P&19EXlwD9^-6J+4!}9{ywR9Gk42jjAURAF&EO|~N
    z)?s>$Da@ikI4|^z0e{r`J8zIs>SpM~Vn^{3fArRu;?+43>lD+^XtUcY1HidJwnR6+
    z!;oG2=B6Z_=M%*{z-RaHc(n|1RTKQdNjjV!Pn9lFt^4w|AeN06*j}ZyhqZ^!-=cyGP_ShV1rGxkx8t
    zB;8`h!S{LD%ot``700d0@Grql(DTt4Awgmi+Yr0@#jbe=2#UkK%rv=OLqF)9D7D1j
    z!~McAwMYkeaL$~kI~90)5vBhBzWYc3Cj1WI0RS`z000R8-@ET0dA~*r(gSiCJmQMN&4%1D
    zyVNf0?}sBH8zNbBLn>~(W{d3%@kL_eQ6jEcR{l>C|JK
    z(R-fA!z|TTRG40|zv}7E@PqCAXP3n`;%|SCQ|ZS%ym$I{`}t3KPL&^l5`3>yah4*6
    zifO#{VNz3)?ZL$be;NEaAk9b#{tV?V7
    zP|wf5YA*1;s<)9A4~l3BHzG&HH`1xNr#%){4xZ!jq%o=7nN*wMuXlFV{HaiQLJ`5G
    zBhDi#D(m`Q1pLh@Tq+L;OwuC52RdW7b8}~60WCOK5iYMUad9}7aWBuILb({5=z~YF
    zt?*Jr5NG+WadM{mDL>GyiByCuR)hd
    zA=HM?J6l1Xv0Dl+LW@w$OTcEoOda^nFCw*Sy^I@$sSuneMl{4ys)|RY#9&NxW4S)9
    zq|%83IpslTLoz~&vTo!Ga@?rj_kw{|k{nv+w&Ku?fyk4Ki4I?);M|5Axm)t+BaE)D
    zm(`AQ#k^DWrjbuXoJf2{Aj^KT
    zFb1zMSqxq|vceV+Mf-)$oPflsO$@*A0n0Z!R{&(xh8s}=;t(lIy
    zv$S8x>m;vQNHuRzoaOo?eiWFe{0;$s`Bc+Osz~}Van${u;g(su`3lJ^TEfo~nERfP
    z)?aFzpDgnLYiERsKPu|0tq4l2wT)Atr6Qb%m-AUn6HnCue*yWICp7TjW$@sO
    zm5rm4aTcPQ(rfi7a`xP7cKCFrJD}*&_~xgLyr^-bmsL}y;A5P|al8J3WUoBSjqu%v
    zxC;mK!g(7r6RRJ852Z~feoC&sD3(6}^5-uLK8o)9{8L_%%rItZK9C){UxB|;G>JbP
    zsRRtS4-3B*5c+K2kvmgZK8472%l>3cntWUOVHxB|{Ay~aOg5RN;{PJgeVD*H%ac+y!h#wi%o2bF2Ca8IyMyH{>4#{E_8u^@+l-+n=V}Sq?$O
    z{091@v%Bd*3pk0^2UtiF9Z+(a@wy6
    zUdw8J*ze$K#=$48IBi1U%;hmhO>lu!uU;+RS}p&6@rQila7WftH->*A4=5W|Fmtze
    z)7E}jh@cbmr9iup^i%*(uF%LG&!+Fyl@LFA-}Ca#bxRfDJAiR2dt6644TaYw1Ma79
    zt8&DYj31j^5WPNf5P&{)J?WlCe@<3u^78wnd(Ja4^a>{^Tw}W>|Cjt^If|7l^l)^Q
    zbz|7~CF(k_9~n|h;ysZ+jHzkXf(*O*@5m
    zLzUmbHp=x!Q|!9NVXyipZ3)^GuIG$k;D)EK!a5=8MFLI_lpf`HPKl=-Ww%z8H_0$j
    ztJ||IfFG1lE9nmQ0+jPQy
    zCBdKkjArH@K7jVcMNz);Q(Q^R{d5G?-kk;Uu_IXSyWB)~KGIizZL(^&qF;|1PI7!E
    zTP`%l)gpX|OFn&)M%txpQ2F!hdA~hX1Cm5)IrdljqzRg!f{mN%G~H1&oqe`5eJCIF
    zHdD7O;AX-{XEV(a`gBFJ9ews#CVS2y!&>Cm_dm3C8*n3MA*e67(WC?uP@8TXuMroq
    z{#w$%z@CBIkRM7?}Xib+>hRjy?%G!fiw8!
    z8(gB+8J~KOU}yO7UGm&1g_MDJ$IXS!`+*b*QW2x)9>K~Y*E&bYMnjl6h!{17_8d!%&9D`a7r&LKZjC<&XOvTRaKJ1
    zUY@hl5^R&kZl3lU3njk`3dPzxj$2foOL26r(9zsVF3n_F#v)s5vv3@dgs|lP#eylq62{<-vczqP!RpVBTgI>@O6&sU>W|do17+#OzQ7o5A$ICH
    z?GqwqnK^n2%LR;$^oZM;)+>$X3s2n}2jZ7CdWIW0lnGK-b#EG01)P@aU`pg}th&J-TrU`tIpb5t((0eu|!u
    zQz+3ZiOQ^?RxxK4;zs=l8q!-n7X{@jSwK(iqNFiRColuEOg}!7cyZi`iBX4g1pNBj
    zAPzL?P^Ljhn;1$r8?bc=#n|Ed7wB&oHcw()&*k#SS#h}jO?ZB246EGItsz*;^&tzp
    zu^YJ0=lwsi`eP_pU8}6JA7MS;9pfD;DsSsLo~ogzMNP70@@;Fm8f0^;>$Z>~}GWRw!W5J3tNX*^2+1f3hz{~rIzJo
    z6W%J(H!g-eI_J1>0juX$X4Cl6i+3wbc~k146UIX&G22}WE>0ga#WLsn9tY(&29zBvH1$`iWtTe
    zG2jYl@P!P)eb<5DsR72BdI7-zP&cZNI{7q3e@?N8IKc4DE#UVr->|-ryuJXk^u^>4
    z$3wE~=q390;XuOQP~TNoDR?#|NSPJ%sTMInA6*rJ%go|=YjGe!B>z6u$IhgQSwoV*
    zjy3F2#I>uK{42{&IqP59)Y(1*Z>>#W8rCf4_eVsH)`v!P#^;BgzKDR`ARGEZzkNX+
    zJUQu=*-ol=Xqqt5=`=pA@BIn@6a9G8C{c&`i^(i+BxQO9?YZ3iu%$$da&Kb?2kCCo
    zo7t$UpSFWqmydXf@l3bVJ=%K?SSw)|?srhJ-1ZdFu*5QhL$~-IQS!K1s@XzAtv6*Y
    zl8@(5BlWYLt1yAWy?rMD&bwze8bC3-GfNH=p
    zynNFCdxyX?K&G(ZZ)afguQ2|r;XoV^=^(;Cku#qYn4Lus`UeKt6rAlFo_rU`|Rq
    z&G?~iWMBio<78of-2X(ZYHx~=U0Vz4btyXkctMKdc9UM!vYr~B-(>)(Hc|D
    zMzkN4!PBg%tZoh+=Gba!0++d193gbMk2&krfDgcbx0jI92cq?FFESVg0D$>F+bil}
    zY~$)|>1HZsX=5sAZ2WgPB5P=8X#TI+NQ(M~GqyVB53c6IdX=k>Wu@A0Svf5#?uHaF
    zsYn|koIi3$(%GZ2+G+7Fv^lHTb#5b8sAHSTnL^qWZLM<(1|9|QFw9pnRU{svj}_Al
    zL)b9>fN{QiA($8peNEJyy`(a{&uh-T4_kdZFIVsKKVM(?05}76EEz?#W
    za^fiZOAd14IJ4zLX-n7Lq0qlQ^lW8Cvz4UKkV9~P}>sq0?xD3vg+$4vLm~C(+
    zM{-3Z#qnZ09bJ>}j?6ry^h+@PfaD7*jZxBEY4)UG&daWb??6)TP+|3#Z&?GL?1i+280CFsE|vIXQbm|
    zM}Pk!U`U5NsNbyKzkrul-DzwB{X?n3E6?TUHr{M&+R*2%yOiXdW-_2Yd6?38M9Vy^
    z*lE%gA{wwoSR~vN0=no}tP2Ul5Gk5M(Xq`$nw#ndFk`tcpd5A=Idue`XZ!FS>Q
    zG^0w#>P4pPG+*NC9gLP4x2m=cKP}YuS!l^?sHSFftZy{4CoQrb_
    z^20(NnG`wAhMI=eq)SsIE~&Gp9Ne0nD4%Xiu|0Fj1UFk?6avDqjdXz{O1nKao*46y
    zT8~iA%Exu=G#{x=KD;_C&M+Zx4+n`sHT>^>=-1YM;H<72k>$py1?F3#T1*ef9mLZw
    z5naLQr?n7K;2l+{_uIw*_1nsTn~I|kkCgrn;|G~##hM;9l7Jy$yJfmk+&}W@JeKcF
    zx@@Woiz8qdi|D%aH3XTx5*wDlbs?dC1_nrFpm^QbG@wM=i2?Zg;$VK!c^Dp8<}BTI
    zyRhAq@#%2pGV49*Y5_mV4+OICP|%I(dQ7x=6Ob}>EjnB_-_18*xrY?b%-yEDT(wrO
    z9RY2QT0`_OpGfMObKHV;QLVnrK%mc?$WAdIT`kJQT^n%GuzE7|9@k3ci5fYOh(287
    zuIbg!GB3xLg$YN=n)^pHGB0jH+_iIiC=nUcD;G6LuJsjn2VI1cyZx=a?ShCsF==QK
    z;q~*m&}L<-cb+mDDXzvvrRsybcgQ;Vg21P(uLv5I+eGc7o7tc6`;OA9{soHFOz
    zT~2?>Ts}gprIX$wRBb4yE>ot<8+*Bv`qbSDv*VtRi|cyWS>)Fjs>fkNOH-+PX&4(~
    z&)T8Zam2L6puQl?;5zg9h<}k4#|yH9czHw;1jw-pwBM*O2hUR6yvHATrI%^mvs9q_
    z&ccT0>f#eDG<^WG^q@oVqlJrhxH)dcq2cty@l3~|5#UDdExyXUmLQ}f4#;6fI{f^t
    zDCsgIJ~0`af%YR%Ma5VQq-p21k`vaBu6WE?66+5=XUd%Ay%D$irN>5LhluRWt7
    zov-=f>QbMk*G##&DTQyou$s7UqjjW@k6=!I@!k+S{pP8R(2=e@io;N8E`EOB;OGoI
    zw6Q+{X1_I{OO0HPpBz!X!@`5YQ2)t{+!?M_iH25X(d~-Zx~cXnS9z>u?+If|iNJbx
    zyFU2d1!ITX64D|lE0Z{dLRqL1Ajj=CCMfC4lD3&mYR_R_VZ>_7_~|<^o*%_&jevU+
    zQ4|qzci=0}Jydw|LXLCrOl1_P6Xf@c0$ieK2^7@A9UbF{@V_0p%lqW|L?5k>bVM8|p5v&2g;~r>B8uo<4N+`B
    zH{J)h;SYiIVx@#jI&p-v3dwL5QNV1oxPr8J%ooezTnLW>i*3Isb49%5i!&ac_dEXv
    zvXmVUck^QHmyrF8>CGXijC_R-y(Qr{3Zt~EmW)-nC!tiH`wlw5D*W7Pip;T?&j%kX
    z6DkZX4&}iw>hE(boLyjOoupf6JpvBG8}jIh!!VhnD0>}KSMMo{1#uU6kiFcA04~|7
    zVO8eI&x1`g4CZ<2cYUI(n#wz2MtVFHx47yE5eL~8bot~>EHbevSt}LLMQX?odD{Ux
    zJMnam{d)W4da{l7&y-JrgiU~qY3$~}_F#G7|MxT)e;G{U`In&?`j<5D->}cb{}{T(4DF0BOk-=1195KB-E*o@c?`>y#4=dMtYtSY=&L{!TAjFVcq0y@AH`vH!
    z$41+u!Ld&}F^COPgL(EE{0X7LY&%D7-(?!kjFF7=qw<;`V{nwWBq<)1QiGJgUc^Vz
    ztMUlq1bZqKn17|6x6iAHbWc~l1HcmAxr%$Puv!znW)!JiukwIrqQ00|H$Z)OmGG@=
    zv%A8*4cq}(?qn4rN6o`$Y))(MyXr8R<2S^J+v(wmFmtac!%VOfN?&(8Nr!T@kV`N;
    z*Q33V3t`^rN&aBiHet)18wy{*wi1=W!B%B-Q6}SCrUl$~Hl{@!95ydml@FK8P=u4s
    z4e*7gV2s=YxEvskw2Ju!2%{8h01rx-3`NCPc(O
    zH&J0VH5etNB2KY6k4R@2Wvl^Ck$MoR3=)|SEclT2ccJ!RI9Nuter7u9@;sWf-%um;GfI!=eEIQ2l2p_YWUd{|6EG
    ze{yO6;lMc>;2tPrsNdi@&1K6(1;|$xe8vLgiouj%QD%gYk`4p{Ktv9|j+!OF-P?@p
    z;}SV|oIK)iwlBs+`ROXkhd&NK
    zzo__r!B>tOXpBJMDcv!Mq54P+n4(@dijL^EpO1wdg~q+!DT3lB<>9AANSe!T1XgC=J^)IP0XEZ()_vpu!!3HQyJhwh?r`Ae%Yr~b%
    zO*NY9t9#qWa@GCPYOF9aron7thfWT`eujS4`t2uG6)~JRTI;f(ZuoRQwjZjp5Pg34
    z)rp$)Kr?R+KdJ;IO;pM{$6|2y=k_siqvp%)2||cHTe|b5Ht8&A{wazGNca
    zX$Ol?H)E_R@SDi~4{d-|8nGFhZPW;Cts1;08TwUvLLv&_2$O6Vt=M)X;g%HUr$&06
    zISZb(6)Q3%?;3r~*3~USIg=HcJhFtHhIV(siOwV&QkQe#J%H9&E21!C*d@ln3E@J*
    zVqRO^<)V^ky-R|%{(9`l-(JXq9J)1r$`uQ8a}$vr9E^nNiI*thK8=&UZ0dsFN_eSl
    z(q~lnD?EymWLsNa3|1{CRPW60>DSkY9YQ;$4o3W7Ms&@&lv9eH!tk~N&dhqX&>K@}
    zi1g~GqglxkZ5pEFkllJ)Ta1I^c&Bt6#r(QLQ02yHTaJB~-
    zCcE=5tmi`UA>@P=1LBfBiqk)HB4t8D?02;9eXj~kVPwv?m{5&!&TFYhu>3=_
    zsGmYZ^mo*-j69-42y&Jj0cBLLEulNRZ9vXE)8~mt9C#;tZs;=#M=1*hebkS;7(aGf
    zcs7zH(I8Eui9UU4L--))yy`&d&$In&VA2?DAEss4LAPCLd>-$i?lpXvn!gu^JJ$(DoUlc6wE98VLZ*z`QGQov5l4Fm_h?V-;mHLYDVOwKz7>e4+%AzeO>P6v}ndPW|
    zM>m#6Tnp7K?0mbK=>gV}=@k*0Mr_PVAgGMu$j+pWxzq4MAa&jpCDU&-5eH27Iz>m^
    zax1?*HhG%pJ((tkR(V(O(L%7v7L%!_X->IjS3H5kuXQT2!ow(;%FDE>16&3r){!ex
    zhf==oJ!}YU89C9@mfDq!P3S4yx$aGB?rbtVH?sHpg?J5C->!_FHM%Hl3#D4eplxzQ
    zRA+<@LD%LKSkTk2NyWCg7u=$%F#;SIL44~S_OGR}JqX}X+=bc@swpiClB`Zbz|f!4
    z7Ysah7OkR8liXfI`}IIwtEoL}(URrGe;IM8%{>b1SsqXh)~w}P>yiFRaE>}rEnNkT
    z!HXZUtxUp1NmFm)Dm@-{FI^aRQqpSkz}ZSyKR%Y}YHNzBk)ZIp}
    zMtS=aMvkgWKm9&oTcU0?S|L~CDqA+sHpOxwnswF-fEG)cXCzUR?ps@tZa$=O)=L+5
    zf%m58cq8g_o}3?Bhh+c!w4(7AjxwQ3>WnVi<{{38g7yFboo>q|+7qs<$8CPXUFAN<
    zG&}BHbbyQ5n|qqSr?U~GY{@GJ{(Jny{bMaOG{|IkUj7tj^9pa9|FB_<+KHLxSxR;@
    zHpS$4V)PP+tx}22fWx(Ku9y+}Ap;VZqD0AZW4gCDTPCG=zgJmF{|x;(rvdM|2|9a}cex6xrMkERnkE;}jvU-kmzd%_J50$M`lIPCKf+^*zL=@LW`1SaEc%=m
    zQ+lT06Gw+wVwvQ9fZ~#qd430v2HndFsBa9WjD0P}K(rZYdAt^5WQIvb%D^Q|pkVE^
    zte$&#~zmULFACGfS#g=2OLOnIf2Of-k!(BIHjs77nr!5Q1*I9
    z1%?=~#Oss!rV~?-6Gm~BWJiA4mJ5TY&iPm_$)H1_rTltuU1F3I(qTQ^U$S>%$l
    z)Wx1}R?ij0idp@8w-p!Oz{&*W;v*IA;JFHA9%nUvVDy7Q8woheC#|8QuDZb-L_5@R
    zOqHwrh|mVL9b=+$nJxM`3eE{O$sCt$UK^2@L$R(r^-_+z?lOo+me-VW=Zw
    z-Bn>$4ovfWd%SPY`ab-u9{INc*k2h+yH%toDHIyqQ
    zO68=u`N}RIIs7lsn1D){)~%>ByF<>i@qFb<-axvu(Z+6t7v<^z&gm9McRB~BIaDn$
    z#xSGT!rzgad8o>~kyj#h1?7g96tOcCJniQ+*#=b7wPio>|6a1Z?_(TS{)KrPe}(8j
    z!#&A=k(&Pj^F;r)CI=Z{LVu>uj!_W1q4b`N1}E(i%;BWjbEcnD=mv$FL$l?zS6bW!{$7j1GR5ocn94P2u{
    z70tAAcpqtQo<@cXw~@i-@6B23;317|l~S>CB?hR5qJ%J3EFgyBdJd^fHZu7AzHF(BQ!tyAz^L0`X
    z23S4Fe{2X$W0$zu9gm%rg~A>ijaE#GlYlrF9$ds^QtaszE#4M(OLVP2O-;XdT(XIC
    zatwzF*)1c+t~c{L=fMG8Z=k5lv>U0;C{caN1NItnuSMp)6G3mbahu>E#sj&oy94KC
    zpH}8oEw{G@N3pvHhp{^-YaZeH;K+T_1AUv;IKD<=mv^&Ueegrb!yf`4VlRl$M?wsl
    zZyFol(2|_QM`e_2lYSABpKR{{NlxlDSYQNkS;J66aT#MSiTx~;tUmvs-b*CrR4w=f
    z8+0;*th6kfZ3|5!Icx3RV11sp=?`0Jy3Fs0N4GZQMN=8HmT6%x9@{Dza)k}UwL6JT
    zHRDh;%!XwXr6yuuy`4;Xsn0zlR$k%r%9abS1;_v?`HX_hI|+EibVnlyE@3aL5vhQq
    zlIG?tN^w@0(v9M*&L+{_+RQZw=o|&BRPGB>e5=ys7H`nc8nx)|-g;s7mRc7hg{GJC
    zAe^vCIJhajmm7C6g!
    zL&!WAQ~5d_5)00?w_*|*H>3$loHrvFbitw#WvLB!JASO?#5Ig5$Ys10n>e4|3d;tS
    zELJ0|R4n3Az(Fl3-r^QiV_C;)lQ1_CW{5bKS15U|E9?ZgLec@%kXr84>5jV2a5v=w
    z?pB1GPdxD$IQL4)G||B_lI+A=08MUFFR4MxfGOu07vfIm+j=z9tp~5i_6jb`tR>qV
    z$#`=BQ*jpCjm$F0+F)L%xRlnS%#&gro6PiRfu^l!EVan|r3y}AHJQOORGx4~
    z&<)3=K-tx518DZyp%|!EqpU!+X3Et7n2AaC5(AtrkW>_57i}$eqs$rupubg0a1+WO
    zGHZKLN2L0D;ab%{_S1Plm|hx8R?O14*w*f&2&bB050n!R2by
    zw!@XOQx$SqZ5I<(Qu$V6g>o#A!JVwErWv#(Pjx=KeS0@hxr4?13zj#oWwPS(7Ro|v
    z>Mp@Kmxo79q|}!5qtX2-O@U&&@6s~!I&)1WQIl?lTnh6UdKT_1R640S4~f=_xoN3-
    zI+O)$R@RjV$F=>Ti7BlnG1-cFKCC(t|Qjm{SalS~V-tX#+2ekRhwmN
    zZr`8{QF6y~Z!D|{=1*2D-JUa<(1Z=;!Ei!KiRNH?o{p5o3crFF=_pX9O-YyJchr$~
    zRC`+G+8kx~fD2k*ZIiiIGR<8r&M@3H?%JVOfE>)})7ScOd&?OjgAGT@WVNSCZ8N(p
    zuQG~76GE3%(%h1*vUXg$vH{ua0b`sQ4f0*y=u~lgyb^!#CcPJa2mkSEHGLsnO^kb$
    zru5_l#nu=Y{rSMWiYx?nO{8I!gH+?wEj~UM?IrG}E|bRIBUM>UlY<`T1EHpRr36vv
    zBi&dG8oxS|J$!zoaq{+JpJy+O^W(nt*|#g32bd&K^w-t>!Vu9N!k9eA8r!Xc{utY>
    zg9aZ(D2E0gL#W0MdjwES-7~Wa8iubPrd?8-$C4BP?*wok&O8+ykOx{P=Izx+G~hM8
    z*9?BYz!T8~dzcZr#ux8kS7u7r@A#DogBH8km8Ry4slyie^n|GrTbO|cLhpqgMdsjX
    zJ_LdmM#I&4LqqsOUIXK8gW;V0B(7^$y#h3h>J0k^WJfAMeYek%Y-Dcb_+0zPJez!GM
    zAmJ1u;*rK=FNM0Nf}Y!!P9c4)HIkMnq^b;JFd!S3?_Qi2G#LIQ)TF|iHl~WKK6JmK
    zbv7rPE6VkYr_%_BT}CK8h=?%pk@3cz(UrZ{@h40%XgThP*-Oeo`T0eq9
    zA8BnWZKzCy5e&&_GEsU4*;_k}(8l_&al5K-V*BFM=O~;MgRkYsOs%9eOY6s6AtE*<7GQAR2ulC3RAJrG_P1iQK5Z~&B
    z&f8X<>yJV6)oDGIlS$Y*D^Rj(cszTy5c81a5IwBr`BtnC6_e`ArI8CaTX_%rx7;cn
    zR-0?J_LFg*?(#n~G8cXut(1nVF0Oka$A$1FGcERU<^ggx;p@CZc?3UB41RY+wLS`LWFNSs~YP
    zuw1@DNN3lTd|jDL7gjBsd9}wIw}4xT2+8dBQzI00m<@?c2L%>}QLfK5%r!a-iII`p
    zX@`VEUH)uj^$;7jVUYdADQ2k*!1O3WdfgF?OMtUXNpQ1}QINamBTKDuv19^{$`8A1
    zeq%q*O0mi@(%sZU>Xdb0Ru96CFqk9-L3pzLVsMQ`Xpa~N6CR{9Rm2)A|CI21L(%GW
    zh&)Y$BNHa=FD+=mBw3{qTgw)j0b!Eahs!rZnpu)z!!E$*eXE~##yaXz`KE5(nQM`s
    zD!$vW9XH)iMxu9R>r$VlLk9oIR%HxpUiW=BK@4U)|1WNQ=mz9a
    z^!KkO=>GaJ!GBXm{KJj^;kh-MkUlEQ%lza`-G&}C5y1>La1sR6hT=d*NeCnuK%_LV
    zOXt$}iP6(YJKc9j-Fxq~*ItVUqljQ8?oaysB-EYtFQp9oxZ|5m0^Hq(qV!S+hq#g(
    z?|i*H2MIr^Kxgz+3vIljQ*Feejy6S4v~jKEPTF~Qhq!(ms5>NGtRgO5vfPPc4Z^AM
    zTj!`5xEreIN)vaNxa|q6qWdg>+T`Ol0Uz)ckXBXEGvPNEL3R8hB3=C5`@=SYgAju1
    z!)UBr{2~=~xa{b8>x2@C7weRAEuatC)3pkRhT#pMPTpSbA|tan%U7NGMvzmF?c!V8
    z=pEWxbdXbTAGtWTyI?Fml%lEr-^AE}w#l(<7OIw;ctw}imYax&vR4UYNJZK6P7ZOd
    zP87XfhnUHxCUHhM@b*NbTi#(-8|wcv%3BGNs#zRCVV(W?1Qj6^PPQa<{yaBwZ`+<`w|;rqUY_C
    z&AeyKwwf*q#OW-F()lir=T^<^wjK65Lif$puuU5+tk$;e_EJ;Lu+pH>=-8=PDhkBg
    z8cWt%@$Sc#C6F$Vd+0507;{OOyT7Hs%nKS88q-W!$f~9*WGBpHGgNp}=C*7!RiZ5s
    zn1L_DbKF@B8kwhDiLKRB@lsXVVLK|ph=w%_`#owlf@s@V(pa`GY$8h%;-#h@TsO|Y8V=n@*!Rog7<7Cid%apR|x
    zOjhHCyfbIt%+*PCveTEcuiDi%Wx;O;+K=W?OFUV%)%~6;gl?<0%)?snDDqIvkHF{
    zyI02)+lI9ov42^hL>ZRrh*HhjF9B$A@=H94iaBESBF=eC_KT$8A@uB^6$~o?3Wm5t1OIaqF^~><2?4e3c&)@wKn9bD?
    zoeCs;H>b8DL^F&>Xw-xjZEUFFTv>JD^O#1E#)CMBaG4DX9bD(Wtc8Rzq}9soQ8`jf
    zeSnHOL}<+WVSKp4kkq&?SbETjq6yr@4%SAqOG=9E(3YeLG9dtV+8vmzq+6PFPk{L;
    z(&d++iu=^F%b+ea$i2UeTC{R*0Isk;vFK!no<;L+(`y`3&H-~VTdKROkdyowo1iqR
    zbVW(3`+(PQ2>TKY>N!jGmGo7oeoB8O|P_!Ic@
    zZ^;3dnuXo;WJ?S+)%P>{Hcg!Jz#2SI(s&dY4QAy_vRlmOh)QHvs_7c&zkJCmJGVvV
    zX;Mtb>QE+xp`KyciG$Cn*0?AK%-a|=o!+7x&&yzHQOS>8=B*R=niSnta^Pxp1`=md
    z#;$pS$4WCT?mbiCYU?FcHGZ#)kHVJTTBt^%XE(Q};aaO=Zik0UgLcc0I(tUpt(>|&
    zcxB_|fxCF7>&~5eJ=Dpn&5Aj{A^cV^^}(7w#p;HG&Q)EaN~~EqrE1qKrMAc&WXIE;>@<&)5;gD2?={Xf@Mvn@OJKw=8Mgn
    z!JUFMwD+s==JpjhroT&d{$kQAy%+d`a*XxDEVxy3`NHzmITrE`o!;5ClXNPb4t*8P
    zzAivdr{j_v!=9!^?T3y?gzmqDWX6mkzhIzJ-3S{T5bcCFMr&RPDryMcdwbBuZbsgN
    zGrp@^i?rcfN7v0NKGzDPGE#4yszxu=I_`MI%Z|10nFjU-UjQXXA?k8Pk|OE<(?ae)
    zE%vG#eZAlj*E7_3dx#Zz4kMLj>H^;}33UAankJiDy5ZvEhrjr`!9eMD8COp}U*hP+
    zF}KIYx@pkccIgyxFm#LNw~G&`;o&5)2`5aogs`1~7cMZQ7zj!%L4E`2yzlQN6REX20&O<9
    zKV6fyr)TScJPPzNTC2gL+0x#=u>(({{D7j)c-%tvqls3#Y?Z1m
    zV5WUE)zdJ{$p>yX;^P!UcXP?UD~YM;IRa#Rs5~l+*$&nO(;Ers`G=0D!twR(0GF@c
    zHl9E5DQI}Oz74n
    zfKP>&$q0($T4y$6w(p=ERAFh+>n%iaeRA%!T%<^+pg?M)@ucY<&59$x9M#n+V&>}=nO9wCV{O~lg&v#+jcUj(tQ
    z`0u1YH)-`U$15a{pBkGyPL0THv1P|4e@pf@3IBZS4dVJPo#H>pWq%Lr0YS-SeWash
    z8R7=jb28KPMI|_lo#GEO|5B?N_e``H*23{~a!AmUJ+fb4HX-%QI@lSEUxKlGV7z7Q
    zSKw@-TR>@1RL%w{x}dW#k1NgW+q4yt2Xf1J62Bx*O^WG8OJ|FqI4&@d3_o8Id@*)4
    zYrk=>@!wv~mh7YWv*bZhxqSmFh2Xq)o=m;%n$I?GSz49l1$xRpPu_^N(vZ>*>Z<04
    z2+rP70oM=NDysd!@fQdM2OcyT?3T^Eb@lIC-UG=Bw{BjQ&P`KCv$AcJ;?`vdZ4){d
    z&gkoUK{$!$$K`3*O-jyM1~p-7T*qb)Ys>Myt^;#1&a%O@x8A+E>!
    zY8=eD`ZG)LVagDLBeHg>=atOG?Kr%h4B%E6m@J^C+U|y)XX@f
    z8oyJDW|9g=<#f<{JRr{y#~euMnv)`7j=%cHWLc}ngjq~7k**6%4u>Px&W%4D94(r*
    z+akunK}O0DC2A%Xo9jyF;DobX?!1I(7%}@7F>i%&nk*LMO)bMGg2N+1iqtg+r(70q
    zF5{Msgsm5GS7DT`kBsjMvOrkx&|EU!{{~gL4d2MWrAT=KBQ-^zQCUq{5PD1orxlIL
    zq;CvlWx#f1NWvh`hg011I%?T_s!e38l*lWVt|~z-PO4~~1g)SrJ|>*tXh=QfXT)%(
    z+ex+inPvD&O4Ur;JGz>$sUOnWdpSLcm1X%aQDw4{dB!cnj`^muI$CJ2%p&-kULVCE
    z>$eMR36kN$wCPR+OFDM3-U(VOrp9k3)lI&YVFqd;Kpz~K)@Fa&FRw}L(SoD
    z9B4a+hQzZT-BnVltst&=kq6Y(f^S4hIGNKYBgMxGJ^;2yrO}P3;r)(-I-CZ)26Y6?
    z&rzHI_1GCvGkgy-t1E;r^3Le30|%$ebDRu2+gdLG)r=A~Qz`}~&L@aGJ{}vVs_GE*
    zVUjFnzHiXfKQbpv&bR&}l2bzIjAooB)=-XNcYmrGmBh(&iu@o!^hn0^#}m2yZZUK8
    zufVm7Gq0y`Mj;9b>`c?&PZkU0j4>IL=UL&-Lp3j&47B5pAW4JceG{!XCA)kT<%2nqCxj<)uy6XR_uws~>_MEKPOpAQ!H
    zkn>FKh)<9DwwS*|Y(q?$^N!6(51O0
    z^JM~Ax{AI1Oj$fs-S5d4T7Z_i1?{%0SsIuQ&r8#(JA=2iLcTN+?>wOL532%&dMYkT
    z*T5xepC+V6zxhS@vNbMoi|i)=rpli@R9~P!39tWbSSb904ekv7D#quKbgFEMTb48P
    zuq(VJ+&L8aWU(_FCD$3^uD!YM%O^K(dvy~Wm2hUuh6bD|#(I39Xt>N1Y{ZqXL`Fg6
    zKQ?T2htHN!(Bx;tV2bfTtIj7e)liN-29s1kew>v(D^@)#v;}C4-G=7x#;-dM4yRWm
    zyY`cS21ulzMK{PoaQ6xChEZ}o_#}X-o}<&0)$1#3we?+QeLt;aVCjeA)hn!}UaKt<
    zat1fHEx13y-rXNMvpUUmCVzocPmN~-Y4(YJvQ#db)4|%B!rBsgAe+*yor~}FrNH08
    z3V!97S}D7d$zbSD{$z;@IYMxM6aHdypIuS*pr_U6;#Y!_?0i|&yU*@16l
    z*dcMqDQgfNBf}?quiu4e>H)yTVfsp#f+Du0@=Kc41QockXkCkvu>FBd6Q+@FL!(Yx
    z2`YuX#eMEiLEDhp+9uFqME_E^faV&~9qjBHJkIp~%$x^bN=N)K@kvSVEMdDuzA0sn
    z88CBG?`RX1@#hQNd`o^V{37)!w|nA)QfiYBE^m=yQKv-fQF+UCMcuEe1d4BH7$?>b
    zJl-r9@0^Ie=)guO1vOd=i$_4sz>y3x^R7n4ED!5oXL3@5**h(xr%Hv)_gILarO46q+MaDOF%ChaymKoI6JU5Pg;7#2n9-18|S1;AK+
    zgsn6;k6-%!QD>D?cFy}8F;r@z8H9xN1jsOBw2vQONVqBVEbkiNUqgw~*!^##ht>w0
    zUOykwH=$LwX2j&nLy=@{hr)2O&-wm-NyjW7n~Zs9UlH;P7iP3
    zI}S(r0YFVYacnKH(+{*)Tbw)@;6>%=&Th=+Z6NHo_tR|JCI8TJiXv2N7ei7M^Q+RM
    z?9o`meH$5Yi;@9XaNR#jIK^&{N|DYNNbtdb)XW1Lv2k{E>;?F`#Pq|&_;gm~&~Zc9
    zf+6ZE%{x4|{YdtE?a^gKyzr}dA>OxQv+pq|@IXL%WS0CiX!V
    zm$fCePA%lU{%pTKD7|5NJHeXg=I0jL@$tOF@K*MI$)f?om)D63K*M|r`gb9edD1~Y
    zc|w7N)Y%do7=0{RC|AziW7#am$)9jciRJ?IWl9PE{G3U+$%FcyKs_0Cgq`=K3@ttV
    z9g;M!3z~f_?P%y3-ph%vBMeS@p7P&Ea8M@97+%XEj*(1E6vHj==d
    zjsoviB>j^$_^OI_DEPvFkVo(BGRo%cJeD){6Uckei=~1}>sp299|IRjhXe)%?uP0I
    zF5+>?0#Ye}T^Y$u_rc4=lPcq4K^D(TZG-w30-YiEM=dcK+4#o*>lJ8&JLi+3UcpZk
    z!^?95S^C0ja^jwP`|{<+3cBVog$(mRdQmadS+Vh~z
    zS@|P}=|z3P6uS+&@QsMp0no9Od&27O&14zHXGAOEy
    zh~OKpymK5C%;LLb467@KgIiVwYbYd6wFxI{0-~MOGfTq$nBTB!{SrWmL9Hs}C&l&l#m?s*{tA?BHS4mVKHAVMqm63H<|c5n0~k)-kbg
    zXidai&9ZUy0~WFYYKT;oe~rytRk?)r8bptITsWj(@HLI;@=v5|XUnSls7$uaxFRL+
    zRVMGuL3w}NbV1`^=Pw*0?>bm8+xfeY(1PikW*PB>>Tq(FR`91N0c2&>lL2sZo5=VD
    zQY{>7dh_TX98L2)n{2OV=T10~*YzX27i2Q7W86M4$?gZIXZaBq#sA*{PH8){|GUi;oM>e?ua7eF4WFuFYZSG|
    zze?srg|5Ti8Og{O
    zeFxuw9!U+zhyk?@w
    zjsA6(oKD=Ka;A>Ca)oPORxK+kxH#O@zhC!!XS4@=swnuMk>t+JmLmFiE^1aX3f<)D@`%K0FGK^gg1a1j>zi
    z2KhV>sjU7AX3F$SEqrXSC}fRx64GDoc%!u2Yag68Lw@w9v;xOONf@o)Lc|Uh3<21ctTYu-mFZuHk*+R{GjXHIGq3p)tFtQp%TYqD=j1&y)>@zxoxUJ!G@
    zgI0XKmP6MNzw>nRxK$-Gbzs}dyfFzt>#5;f6oR27ql!%+{tr+(`(>%51|k`ML}
    zY4eE)Lxq|JMas(;JibNQds1bUB&r}ydMQXBY4x(^&fY_&LlQC)3hylc$~8&~|06-D
    z#T+%66rYbHX%^KuqJED_wuGB+=h`nWA!>1n0)3wZrBG3%`b^Ozv6__dNa@%V14|!D
    zQ?o$z5u0^8`giv%qE!BzZ!3j;BlDlJDk)h@9{nSQeEk!z9RGW)
    z${RSF3phEM*ce*>Xdp}585vj$|40=&S{S-GTiE?Op*vY&Lvr9}BO$XWy80IF+6@%n
    z5*2ueT_g@ofP#u5pxb7n*fv^Xtt7&?SRc{*2Ka-*!BuOpf}neHGCiHy$@Ka1^Dint
    z;DkmIL$-e)rj4o2WQV%Gy;Xg(_Bh#qeOsTM2f@KEe~4kJ8kNLQ+;(!j^bgJMcNhvklP5Z6I+9Fq@c&D~8Fb-4rmDT!MB5QC{Dsb;BharP*O;SF4&
    zc$wj-7Oep7#$WZN!1nznc@Vb<_Dn%ga-O#J(l=OGB`dy=Sy&$(5-n3zzu%d7E#^8`T@}V+5B;PP8J14#4cCPw-SQTdGa2gWL0*zKM
    z#DfSXs_iWOMt)0*+Y>Lkd=LlyoHjublNLefhKBv@JoC>P7N1_#>
    zv=mLWe96%EY;!ZGSQDbZWb#;tzqAGgx~uk+-$+2_8U`!ypbwXl
    z^2E-FkM1?lY@yt8=J3%QK+xaZ6ok=-y%=KXCD^0r!5vUneW>95PzCkOPO*t}p$;->
    ze5j-BLT_;)cZQzR2CEsm@rU7GZfFtdp*a|g4wDr%8?2QkIGasRfDWT-Dvy*U{?IHT
    z*}wGnzdlSptl#ZF^sf)KT|BJs&kLG91^A6ls{CzFprZ6-Y!V0Xysh%9p%iMd7HLsS
    zN+^Un$tDV)T@i!v?3o0Fsx2qI(AX_$dDkBzQ@fRM%n
    zRXk6hb9Py#JXUs+7)w@eo;g%QQ95Yq!K_d=z{0dGS+pToEI6=Bo8+{k$7&Z
    zo4>PH(`ce8E-Ps&uv`NQ;U$%t;w~|@E3WVOCi~R4oj5wP?%<*1C%}Jq%a^q~T7u>K
    zML5AKfQDv6>PuT`{SrKHRAF+^&edg6+5R_#H?Lz3iGoWo#PCEd0DS;)2U({{X#zU^
    zw_xv{4x7|t!S)>44J;KfA|DC?;uQ($l+5Vp7oeqf7{GBF9356nx|&B~gs+@N^gSdd
    zvb*>&W)|u#F{Z_b`f#GVtQ`pYv3#||N{xj1NgB<#=Odt6{eB%#9RLt5v
    zIi|0u70`#ai}9fJjKv7dE!9ZrOIX!3{$z_K5FBd-Kp-&e4(J$LD-)NMTp^_pB`RT;
    zftVVlK2g@+1Ahv2$D){@Y#cL#dUj9*&%#6
    zd2m9{1NYp>)6=oAvqdCn5#cx{AJ%S8skUgMglu2*IAtd+z1>B&`MuEAS(D(<6X#Lj
    z?f4CFx$)M&$=7*>9v1ER4b6!SIz-m0e{o0BfkySREchp?WdVPpQCh!q$t>?rL!&Jg
    zd#heM;&~A}VEm8Dvy&P|J*eAV&w!&Nx6HFV&B8jJFVTmgLaswn!cx$&%JbTsloz!3
    zMEz1d`k==`Ueub_JAy_&`!ogbwx27^ZXgFNAbx=g_I~5nO^r)}&myw~+yY*cJl4$I
    znNJ32M&K=0(2Dj_>@39`3=FX!v3nZHno_@q^!y}%(yw0PqOo=);6Y@&ylVe>nMOZ~
    zd>j#QQSBn3oaWd;qy$&5(5H$Ayi)0haAYO6TH>FR?rhqHmNOO+(})NB
    zLI@B@v0)eq!ug`>G<@htRlp3n!EpU|n+G+AvXFrWSUsLMBfL*ZB`CRsIVHNTR&b?K
    zxBgsN0BjfB>UVcJ|x%=-zb%OV7lmZc&
    zxiupadZVF7)6QuhoY;;FK2b*qL0J-Rn-8!X4ZY$-ZSUXV5DFd7`T41c(#lAeLMoeT
    z4%g655v@7AqT!i@)Edt5JMbN(=Q-6{=L4iG8RA%}w;&pKmtWvI4?G9pVRp|RTw`g0
    zD5c12B&A2&P6Ng~8WM2eIW=wxd?r7A*N+&!Be7PX3s|7~z=APxm=A?5
    zt>xB4WG|*Td@VX{Rs)PV0|yK`oI3^xn(4c_j&vgxk_Y3o(-`_5o`V
    zRTghg6%l@(qodXN;dB#+OKJEEvhfcnc#BeO2|E(5df-!fKDZ!%9!^BJ_4)9P+9Dq5
    zK1=(v?KmIp34r?z{NEWnLB3Px{XYwy-akun4F7xTRr2^zeYW{gcK9)>aJDdU5;w5@
    zak=<+-PLH-|04pelTb%ULpuuuJC7DgyT@D|p{!V!0v3KpDnRjANN12q6SUR3mb9<-
    z>2r~IApQGhstZ!3*?5V
    z8#)hJ0TdZg0M-BK#nGFP>$i=qk82DO
    z7h;Ft!D5E15OgW)&%lej*?^1~2=*Z5$2VX>V{x8SC+{i10BbtUk9@I#Vi&hX)q
    Q!LwySI{Bnv%Sm)yh{^sSVJ8&h_D-BJ_YZe5eCaAWU9b$O2c z$T|{vWVRtOL!xC0DTc(Qbe`ItNtt5hr<)VijD0{U;T#bUEp381_y`%ZIav?kuYG{iyYdEBPW=*xNSc;Rlt6~F4M`5G+VtOjc z*0qGzCb@gME5udTjJA-9O<&TWd~}ysBd(eVT1-H82-doyH9RST)|+Pb{o*;$j9Tjs zhU!IlsPsj8=(x3bAKJTopW3^6AKROHR^7wZ185wJGVhA~hEc|LP;k7NEz-@4p5o}F z`AD6naG3(n=NF9HTH81=F+Q|JOz$7wm9I<+#BSmB@o_cLt2GkW9|?7mM;r!JZp89l zbo!Hp8=n!XH1{GwaDU+k)pGp`C|cXkCU5%vcH)+v@0eK>%7gWxmuMu9YLlChA|_D@ zi#5zovN_!a-0?~pUV-Rj*1P)KwdU-LguR>YM&*Nen+ln8Q$?WFCJg%DY%K}2!!1FE zDv-A%Cbwo^p(lzac&_TZ-l#9kq`mhLcY3h9ZTUVCM(Ad&=EriQY5{jJv<5K&g|*Lk zgV%ILnf1%8V2B0E&;Sp4sYbYOvvMebLwYwzkRQ#F8GpTQq#uv=J`uaSJ34OWITeSGo6+-8Xw znCk*n{kdDEi)Hi&u^)~cs@iyCkFWB2SWZU|Uc%^43ZIZQ-vWNExCCtDWjqHs;;tWf$v{}0{p0Rvxkq``)*>+Akq%|Na zA`@~-Vfe|+(AIlqru+7Ceh4nsVmO9p9jc8}HX^W&ViBDXT+uXbT#R#idPn&L>+#b6 zflC-4C5-X;kUnR~L>PSLh*gvL68}RBsu#2l`s_9KjUWRhiqF`j)`y`2`YU(>3bdBj z?>iyjEhe-~$^I5!nn%B6Wh+I`FvLNvauve~eX<+Ipl&04 zT}};W&1a3%W?dJ2=N#0t?e+aK+%t}5q%jSLvp3jZ%?&F}nOOWr>+{GFIa%wO_2`et z=JzoRR~}iKuuR+azPI8;Gf9)z3kyA4EIOSl!sRR$DlW}0>&?GbgPojmjmnln;cTqCt=ADbE zZ8GAnoM+S1(5$i8^O4t`ue;vO4i}z0wz-QEIVe5_u03;}-!G1NyY8;h^}y;tzY}i5 zqQr#Ur3Fy8sSa$Q0ys+f`!`+>9WbvU_I`Sj;$4{S>O3?#inLHCrtLy~!s#WXV=oVP zeE93*Nc`PBi4q@%Ao$x4lw9vLHM!6mn3-b_cebF|n-2vt-zYVF_&sDE--J-P;2WHo z+@n2areE0o$LjvjlV2X7ZU@j+`{*8zq`JR3gKF#EW|#+{nMyo-a>nFFTg&vhyT=b} zDa8+v0(Dgx0yRL@ZXOYIlVSZ0|MFizy0VPW8;AfA5|pe!#j zX}Py^8fl5SyS4g1WSKKtnyP+_PoOwMMwu`(i@Z)diJp~U54*-miOchy7Z35eL>^M z4p<-aIxH4VUZgS783@H%M7P9hX>t{|RU7$n4T(brCG#h9e9p! z+o`i;EGGq3&pF;~5V~eBD}lC)>if$w%Vf}AFxGqO88|ApfHf&Bvu+xdG)@vuF}Yvk z)o;~k-%+0K0g+L`Wala!$=ZV|z$e%>f0%XoLib%)!R^RoS+{!#X?h-6uu zF&&KxORdZU&EwQFITIRLo(7TA3W}y6X{?Y%y2j0It!ekU#<)$qghZtpcS>L3uh`Uj z7GY;6f$9qKynP#oS3$$a{p^{D+0oJQ71`1?OAn_m8)UGZmj3l*ZI)`V-a>MKGGFG< z&^jg#Ok%(hhm>hSrZ5;Qga4u(?^i>GiW_j9%_7M>j(^|Om$#{k+^*ULnEgzW_1gCICtAD^WpC`A z{9&DXkG#01Xo)U$OC(L5Y$DQ|Q4C6CjUKk1UkPj$nXH##J{c8e#K|&{mA*;b$r0E4 zUNo0jthwA(c&N1l=PEe8Rw_8cEl|-eya9z&H3#n`B$t#+aJ03RFMzrV@gowbe8v(c zIFM60^0&lCFO10NU4w@|61xiZ4CVXeaKjd;d?sv52XM*lS8XiVjgWpRB;&U_C0g+`6B5V&w|O6B*_q zsATxL!M}+$He)1eOWECce#eS@2n^xhlB4<_Nn?yCVEQWDs(r`|@2GqLe<#(|&P0U? z$7V5IgpWf09uIf_RazRwC?qEqRaHyL?iiS05UiGesJy%^>-C{{ypTBI&B0-iUYhk> zIk<5xpsuV@g|z(AZD+C-;A!fTG=df1=<%nxy(a(IS+U{ME4ZbDEBtcD_3V=icT6*_ z)>|J?>&6%nvHhZERBtjK+s4xnut*@>GAmA5m*OTp$!^CHTr}vM4n(X1Q*;{e-Rd2BCF-u@1ZGm z!S8hJ6L=Gl4T_SDa7Xx|-{4mxveJg=ctf`BJ*fy!yF6Dz&?w(Q_6B}WQVtNI!BVBC zKfX<>7vd6C96}XAQmF-Jd?1Q4eTfRB3q7hCh0f!(JkdWT5<{iAE#dKy*Jxq&3a1@~ z8C||Dn2mFNyrUV|<-)C^_y7@8c2Fz+2jrae9deBDu;U}tJ{^xAdxCD248(k;dCJ%o z`y3sADe>U%suxwwv~8A1+R$VB=Q?%U?4joI$um;aH+eCrBqpn- z%79D_7rb;R-;-9RTrwi9dPlg8&@tfWhhZ(Vx&1PQ+6(huX`;M9x~LrW~~#3{j0Bh2kDU$}@!fFQej4VGkJv?M4rU^x!RU zEwhu$!CA_iDjFjrJa`aocySDX16?~;+wgav;}Zut6Mg%C4>}8FL?8)Kgwc(Qlj{@#2Pt0?G`$h7P#M+qoXtlV@d}%c&OzO+QYKK`kyXaK{U(O^2DyIXCZlNQjt0^8~8JzNGrIxhj}}M z&~QZlbx%t;MJ(Vux;2tgNKGlAqphLq%pd}JG9uoVHUo?|hN{pLQ6Em%r*+7t^<);X zm~6=qChlNAVXNN*Sow->*4;}T;l;D1I-5T{Bif@4_}=>l`tK;qqDdt5zvisCKhMAH z#r}`)7VW?LZqfdmXQ%zo5bJ00{Xb9^YKrk0Nf|oIW*K@(=`o2Vndz}ZDyk{!u}PVx zzd--+_WC*U{~DH3{?GI64IB+@On&@9X>EUAo&L+G{L^dozaI4C3G#2wr~hseW@K&g zKWs{uHu-9Je!3;4pE>eBltKUXb^*hG8I&413)$J&{D4N%7PcloU6bn%jPxJyQL?g* z9g+YFFEDiE`8rW^laCNzQmi7CTnPfwyg3VDHRAl>h=In6jeaVOP@!-CP60j3+#vpL zEYmh_oP0{-gTe7Or`L6x)6w?77QVi~jD8lWN@3RHcm80iV%M1A!+Y6iHM)05iC64tb$X2lV_%Txk@0l^hZqi^%Z?#- zE;LE0uFx)R08_S-#(wC=dS&}vj6P4>5ZWjhthP=*Hht&TdLtKDR;rXEX4*z0h74FA zMCINqrh3Vq;s%3MC1YL`{WjIAPkVL#3rj^9Pj9Ss7>7duy!9H0vYF%>1jh)EPqvlr6h%R%CxDsk| z!BACz7E%j?bm=pH6Eaw{+suniuY7C9Ut~1cWfOX9KW9=H><&kQlinPV3h9R>3nJvK z4L9(DRM=x;R&d#a@oFY7mB|m8h4692U5eYfcw|QKwqRsshN(q^v$4$)HgPpAJDJ`I zkqjq(8Cd!K!+wCd=d@w%~e$=gdUgD&wj$LQ1r>-E=O@c ze+Z$x{>6(JA-fNVr)X;*)40Eym1TtUZI1Pwwx1hUi+G1Jlk~vCYeXMNYtr)1?qwyg zsX_e*$h?380O00ou?0R@7-Fc59o$UvyVs4cUbujHUA>sH!}L54>`e` zHUx#Q+Hn&Og#YVOuo*niy*GU3rH;%f``nk#NN5-xrZ34NeH$l`4@t);4(+0|Z#I>Y z)~Kzs#exIAaf--65L0UHT_SvV8O2WYeD>Mq^Y6L!Xu8%vnpofG@w!}R7M28?i1*T&zp3X4^OMCY6(Dg<-! zXmcGQrRgHXGYre7GfTJ)rhl|rs%abKT_Nt24_Q``XH{88NVPW+`x4ZdrMuO0iZ0g` z%p}y};~T5gbb9SeL8BSc`SO#ixC$@QhXxZ=B}L`tP}&k?1oSPS=4%{UOHe0<_XWln zwbl5cn(j-qK`)vGHY5B5C|QZd5)W7c@{bNVXqJ!!n$^ufc?N9C-BF2QK1(kv++h!>$QbAjq)_b$$PcJdV+F7hz0Hu@ zqj+}m0qn{t^tD3DfBb~0B36|Q`bs*xs|$i^G4uNUEBl4g;op-;Wl~iThgga?+dL7s zUP(8lMO?g{GcYpDS{NM!UA8Hco?#}eNEioRBHy4`mq!Pd-9@-97|k$hpEX>xoX+dY zDr$wfm^P&}Wu{!%?)U_(%Mn79$(ywvu*kJ9r4u|MyYLI_67U7%6Gd_vb##Nerf@>& z8W11z$$~xEZt$dPG}+*IZky+os5Ju2eRi;1=rUEeIn>t-AzC_IGM-IXWK3^6QNU+2pe=MBn4I*R@A%-iLDCOHTE-O^wo$sL_h{dcPl=^muAQb`_BRm};=cy{qSkui;`WSsj9%c^+bIDQ z0`_?KX0<-=o!t{u(Ln)v>%VGL z0pC=GB7*AQ?N7N{ut*a%MH-tdtNmNC+Yf$|KS)BW(gQJ*z$d{+{j?(e&hgTy^2|AR9vx1Xre2fagGv0YXWqtNkg*v%40v?BJBt|f9wX5 z{QTlCM}b-0{mV?IG>TW_BdviUKhtosrBqdfq&Frdz>cF~yK{P@(w{Vr7z2qKFwLhc zQuogKO@~YwyS9%+d-zD7mJG~@?EFJLSn!a&mhE5$_4xBl&6QHMzL?CdzEnC~C3$X@ zvY!{_GR06ep5;<#cKCSJ%srxX=+pn?ywDwtJ2{TV;0DKBO2t++B(tIO4)Wh`rD13P z4fE$#%zkd=UzOB74gi=-*CuID&Z3zI^-`4U^S?dHxK8fP*;fE|a(KYMgMUo`THIS1f!*6dOI2 zFjC3O=-AL`6=9pp;`CYPTdVX z8(*?V&%QoipuH0>WKlL8A*zTKckD!paN@~hh zmXzm~qZhMGVdQGd=AG8&20HW0RGV8X{$9LldFZYm zE?}`Q3i?xJRz43S?VFMmqRyvWaS#(~Lempg9nTM$EFDP(Gzx#$r)W&lpFKqcAoJh-AxEw$-bjW>`_+gEi z2w`99#UbFZGiQjS8kj~@PGqpsPX`T{YOj`CaEqTFag;$jY z8_{Wzz>HXx&G*Dx<5skhpETxIdhKH?DtY@b9l8$l?UkM#J-Snmts7bd7xayKTFJ(u zyAT&@6cAYcs{PBfpqZa%sxhJ5nSZBPji?Zlf&}#L?t)vC4X5VLp%~fz2Sx<*oN<7` z?ge=k<=X7r<~F7Tvp9#HB{!mA!QWBOf%EiSJ6KIF8QZNjg&x~-%e*tflL(ji_S^sO ztmib1rp09uon}RcsFi#k)oLs@$?vs(i>5k3YN%$T(5Or(TZ5JW9mA6mIMD08=749$ z!d+l*iu{Il7^Yu}H;lgw=En1sJpCKPSqTCHy4(f&NPelr31^*l%KHq^QE>z>Ks_bH zjbD?({~8Din7IvZeJ>8Ey=e;I?thpzD=zE5UHeO|neioJwG;IyLk?xOz(yO&0DTU~ z^#)xcs|s>Flgmp;SmYJ4g(|HMu3v7#;c*Aa8iF#UZo7CvDq4>8#qLJ|YdZ!AsH%^_7N1IQjCro

    K7UpUK$>l@ zw`1S}(D?mUXu_C{wupRS-jiX~w=Uqqhf|Vb3Cm9L=T+w91Cu^ z*&Ty%sN?x*h~mJc4g~k{xD4ZmF%FXZNC;oVDwLZ_WvrnzY|{v8hc1nmx4^}Z;yriXsAf+Lp+OFLbR!&Ox?xABwl zu8w&|5pCxmu#$?Cv2_-Vghl2LZ6m7}VLEfR5o2Ou$x02uA-%QB2$c(c1rH3R9hesc zfpn#oqpbKuVsdfV#cv@5pV4^f_!WS+F>SV6N0JQ9E!T90EX((_{bSSFv9ld%I0&}9 zH&Jd4MEX1e0iqDtq~h?DBrxQX1iI0lIs<|kB$Yrh&cpeK0-^K%=FBsCBT46@h#yi!AyDq1V(#V}^;{{V*@T4WJ&U-NTq43w=|K>z8%pr_nC>%C(Wa_l78Ufib$r8Od)IIN=u>417 z`Hl{9A$mI5A(;+-Q&$F&h-@;NR>Z<2U;Y21>>Z;s@0V@SbkMQQj%_;~+qTuQ?c|AV zcWm3XZQHhP&R%QWarS%mJ!9R^&!_)*s(v+VR@I#QrAT}`17Y+l<`b-nvmDNW`De%y zrwTZ9EJrj1AFA>B`1jYDow}~*dfPs}IZMO3=a{Fy#IOILc8F0;JS4x(k-NSpbN@qM z`@aE_e}5{!$v3+qVs7u?sOV(y@1Os*Fgu`fCW9=G@F_#VQ%xf$hj0~wnnP0$hFI+@ zkQj~v#V>xn)u??YutKsX>pxKCl^p!C-o?+9;!Nug^ z{rP!|+KsP5%uF;ZCa5F;O^9TGac=M|=V z_H(PfkV1rz4jl?gJ(ArXMyWT4y(86d3`$iI4^l9`vLdZkzpznSd5Ikfrs8qcSy&>z zTIZgWZGXw0n9ibQxYWE@gI0(3#KA-dAdPcsL_|hg2@~C!VZDM}5;v_Nykfq!*@*Zf zE_wVgx82GMDryKO{U{D>vSzSc%B~|cjDQrt5BN=Ugpsf8H8f1lR4SGo#hCuXPL;QQ z#~b?C4MoepT3X`qdW2dNn& zo8)K}%Lpu>0tQei+{>*VGErz|qjbK#9 zvtd8rcHplw%YyQCKR{kyo6fgg!)6tHUYT(L>B7er5)41iG`j$qe*kSh$fY!PehLcD zWeKZHn<492B34*JUQh=CY1R~jT9Jt=k=jCU2=SL&&y5QI2uAG2?L8qd2U(^AW#{(x zThSy=C#>k+QMo^7caQcpU?Qn}j-`s?1vXuzG#j8(A+RUAY})F@=r&F(8nI&HspAy4 z4>(M>hI9c7?DCW8rw6|23?qQMSq?*Vx?v30U%luBo)B-k2mkL)Ljk5xUha3pK>EEj z@(;tH|M@xkuN?gsz;*bygizwYR!6=(Xgcg^>WlGtRYCozY<rFX2E>kaZo)O<^J7a`MX8Pf`gBd4vrtD|qKn&B)C&wp0O-x*@-|m*0egT=-t@%dD zgP2D+#WPptnc;_ugD6%zN}Z+X4=c61XNLb7L1gWd8;NHrBXwJ7s0ce#lWnnFUMTR& z1_R9Fin4!d17d4jpKcfh?MKRxxQk$@)*hradH2$3)nyXep5Z;B z?yX+-Bd=TqO2!11?MDtG0n(*T^!CIiF@ZQymqq1wPM_X$Iu9-P=^}v7npvvPBu!d$ z7K?@CsA8H38+zjA@{;{kG)#AHME>Ix<711_iQ@WWMObXyVO)a&^qE1GqpP47Q|_AG zP`(AD&r!V^MXQ^e+*n5~Lp9!B+#y3#f8J^5!iC@3Y@P`;FoUH{G*pj*q7MVV)29+j z>BC`a|1@U_v%%o9VH_HsSnM`jZ-&CDvbiqDg)tQEnV>b%Ptm)T|1?TrpIl)Y$LnG_ zzKi5j2Fx^K^PG1=*?GhK;$(UCF-tM~^=Z*+Wp{FSuy7iHt9#4n(sUuHK??@v+6*|10Csdnyg9hAsC5_OrSL;jVkLlf zHXIPukLqbhs~-*oa^gqgvtpgTk_7GypwH><53riYYL*M=Q@F-yEPLqQ&1Sc zZB%w}T~RO|#jFjMWcKMZccxm-SL)s_ig?OC?y_~gLFj{n8D$J_Kw%{r0oB8?@dWzn zB528d-wUBQzrrSSLq?fR!K%59Zv9J4yCQhhDGwhptpA5O5U?Hjqt>8nOD zi{)0CI|&Gu%zunGI*XFZh(ix)q${jT8wnnzbBMPYVJc4HX*9d^mz|21$=R$J$(y7V zo0dxdbX3N#=F$zjstTf*t8vL)2*{XH!+<2IJ1VVFa67|{?LP&P41h$2i2;?N~RA30LV`BsUcj zfO9#Pg1$t}7zpv#&)8`mis3~o+P(DxOMgz-V*(?wWaxi?R=NhtW}<#^Z?(BhSwyar zG|A#Q7wh4OfK<|DAcl9THc-W4*>J4nTevsD%dkj`U~wSUCh15?_N@uMdF^Kw+{agk zJ`im^wDqj`Ev)W3k3stasP`88-M0ZBs7;B6{-tSm3>I@_e-QfT?7|n0D~0RRqDb^G zyHb=is;IwuQ&ITzL4KsP@Z`b$d%B0Wuhioo1CWttW8yhsER1ZUZzA{F*K=wmi-sb#Ju+j z-l@In^IKnb{bQG}Ps>+Vu_W#grNKNGto+yjA)?>0?~X`4I3T@5G1)RqGUZuP^NJCq&^HykuYtMDD8qq+l8RcZNJsvN(10{ zQ1$XcGt}QH-U^WU!-wRR1d--{B$%vY{JLWIV%P4-KQuxxDeJaF#{eu&&r!3Qu{w}0f--8^H|KwE>)ORrcR+2Qf zb})DRcH>k0zWK8@{RX}NYvTF;E~phK{+F;MkIP$)T$93Ba2R2TvKc>`D??#mv9wg$ zd~|-`Qx5LwwsZ2hb*Rt4S9dsF%Cny5<1fscy~)d;0m2r$f=83<->c~!GNyb!U)PA; zq^!`@@)UaG)Ew(9V?5ZBq#c%dCWZrplmuM`o~TyHjAIMh0*#1{B>K4po-dx$Tk-Cq z=WZDkP5x2W&Os`N8KiYHRH#UY*n|nvd(U>yO=MFI-2BEp?x@=N<~CbLJBf6P)}vLS?xJXYJ2^<3KJUdrwKnJnTp{ zjIi|R=L7rn9b*D#Xxr4*R<3T5AuOS+#U8hNlfo&^9JO{VbH!v9^JbK=TCGR-5EWR@ zN8T-_I|&@A}(hKeL4_*eb!1G8p~&_Im8|wc>Cdir+gg90n1dw?QaXcx6Op_W1r=axRw>4;rM*UOpT#Eb9xU1IiWo@h?|5uP zka>-XW0Ikp@dIe;MN8B01a7+5V@h3WN{J=HJ*pe0uwQ3S&MyWFni47X32Q7SyCTNQ z+sR!_9IZa5!>f&V$`q!%H8ci!a|RMx5}5MA_kr+bhtQy{-^)(hCVa@I!^TV4RBi zAFa!Nsi3y37I5EK;0cqu|9MRj<^r&h1lF}u0KpKQD^5Y+LvFEwM zLU@@v4_Na#Axy6tn3P%sD^5P#<7F;sd$f4a7LBMk zGU^RZHBcxSA%kCx*eH&wgA?Qwazm8>9SCSz_!;MqY-QX<1@p$*T8lc?@`ikEqJ>#w zcG``^CoFMAhdEXT9qt47g0IZkaU)4R7wkGs^Ax}usqJ5HfDYAV$!=6?>J6+Ha1I<5 z|6=9soU4>E))tW$<#>F ziZ$6>KJf0bPfbx_)7-}tMINlc=}|H+$uX)mhC6-Hz+XZxsKd^b?RFB6et}O#+>Wmw9Ec9) z{q}XFWp{3@qmyK*Jvzpyqv57LIR;hPXKsrh{G?&dRjF%Zt5&m20Ll?OyfUYC3WRn{cgQ?^V~UAv+5 z&_m#&nIwffgX1*Z2#5^Kl4DbE#NrD&Hi4|7SPqZ}(>_+JMz=s|k77aEL}<=0Zfb)a z%F(*L3zCA<=xO)2U3B|pcTqDbBoFp>QyAEU(jMu8(jLA61-H!ucI804+B!$E^cQQa z)_ERrW3g!B9iLb3nn3dlkvD7KsY?sRvls3QC0qPi>o<)GHx%4Xb$5a3GBTJ(k@`e@ z$RUa^%S15^1oLEmA=sayrP5;9qtf!Z1*?e$ORVPsXpL{jL<6E)0sj&swP3}NPmR%FM?O>SQgN5XfHE< zo(4#Cv11(%Nnw_{_Ro}r6=gKd{k?NebJ~<~Kv0r(r0qe4n3LFx$5%x(BKvrz$m?LG zjLIc;hbj0FMdb9aH9Lpsof#yG$(0sG2%RL;d(n>;#jb!R_+dad+K;Ccw!|RY?uS(a zj~?=&M!4C(5LnlH6k%aYvz@7?xRa^2gml%vn&eKl$R_lJ+e|xsNfXzr#xuh(>`}9g zLHSyiFwK^-p!;p$yt7$F|3*IfO3Mlu9e>Dpx8O`37?fA`cj`C0B-m9uRhJjs^mRp# zWB;Aj6|G^1V6`jg7#7V9UFvnB4((nIwG?k%c7h`?0tS8J3Bn0t#pb#SA}N-|45$-j z$R>%7cc2ebAClXc(&0UtHX<>pd)akR3Kx_cK+n<}FhzmTx!8e9^u2e4%x{>T6pQ`6 zO182bh$-W5A3^wos0SV_TgPmF4WUP-+D25KjbC{y_6W_9I2_vNKwU(^qSdn&>^=*t z&uvp*@c8#2*paD!ZMCi3;K{Na;I4Q35zw$YrW5U@Kk~)&rw;G?d7Q&c9|x<Hg|CNMsxovmfth*|E*GHezPTWa^Hd^F4!B3sF;)? z(NaPyAhocu1jUe(!5Cy|dh|W2=!@fNmuNOzxi^tE_jAtzNJ0JR-avc_H|ve#KO}#S z#a(8secu|^Tx553d4r@3#6^MHbH)vmiBpn0X^29xEv!Vuh1n(Sr5I0V&`jA2;WS|Y zbf0e}X|)wA-Pf5gBZ>r4YX3Mav1kKY(ulAJ0Q*jB)YhviHK)w!TJsi3^dMa$L@^{` z_De`fF4;M87vM3Ph9SzCoCi$#Fsd38u!^0#*sPful^p5oI(xGU?yeYjn;Hq1!wzFk zG&2w}W3`AX4bxoVm03y>ts{KaDf!}b&7$(P4KAMP=vK5?1In^-YYNtx1f#}+2QK@h zeSeAI@E6Z8a?)>sZ`fbq9_snl6LCu6g>o)rO;ijp3|$vig+4t} zylEo7$SEW<_U+qgVcaVhk+4k+C9THI5V10qV*dOV6pPtAI$)QN{!JRBKh-D zk2^{j@bZ}yqW?<#VVuI_27*cI-V~sJiqQv&m07+10XF+#ZnIJdr8t`9s_EE;T2V;B z4UnQUH9EdX%zwh-5&wflY#ve!IWt0UE-My3?L#^Bh%kcgP1q{&26eXLn zTkjJ*w+(|_>Pq0v8{%nX$QZbf)tbJaLY$03;MO=Ic-uqYUmUCuXD>J>o6BCRF=xa% z3R4SK9#t1!K4I_d>tZgE>&+kZ?Q}1qo4&h%U$GfY058s%*=!kac{0Z+4Hwm!)pFLR zJ+5*OpgWUrm0FPI2ib4NPJ+Sk07j(`diti^i#kh&f}i>P4~|d?RFb#!JN)~D@)beox}bw?4VCf^y*`2{4`-@%SFTry2h z>9VBc9#JxEs1+0i2^LR@B1J`B9Ac=#FW=(?2;5;#U$0E0UNag_!jY$&2diQk_n)bT zl5Me_SUvqUjwCqmVcyb`igygB_4YUB*m$h5oeKv3uIF0sk}~es!{D>4r%PC*F~FN3owq5e0|YeUTSG#Vq%&Gk7uwW z0lDo#_wvflqHeRm*}l?}o;EILszBt|EW*zNPmq#?4A+&i0xx^?9obLyY4xx=Y9&^G;xYXYPxG)DOpPg!i_Ccl#3L}6xAAZzNhPK1XaC_~ z!A|mlo?Be*8Nn=a+FhgpOj@G7yYs(Qk(8&|h@_>w8Y^r&5nCqe0V60rRz?b5%J;GYeBqSAjo|K692GxD4` zRZyM2FdI+-jK2}WAZTZ()w_)V{n5tEb@>+JYluDozCb$fA4H)$bzg(Ux{*hXurjO^ zwAxc+UXu=&JV*E59}h3kzQPG4M)X8E*}#_&}w*KEgtX)cU{vm9b$atHa;s>| z+L6&cn8xUL*OSjx4YGjf6{Eq+Q3{!ZyhrL&^6Vz@jGbI%cAM9GkmFlamTbcQGvOlL zmJ?(FI)c86=JEs|*;?h~o)88>12nXlpMR4@yh%qdwFNpct;vMlc=;{FSo*apJ;p}! zAX~t;3tb~VuP|ZW;z$=IHf->F@Ml)&-&Bnb{iQyE#;GZ@C$PzEf6~q}4D>9jic@mTO5x76ulDz@+XAcm35!VSu zT*Gs>;f0b2TNpjU_BjHZ&S6Sqk6V1370+!eppV2H+FY!q*n=GHQ!9Rn6MjY!Jc77A zG7Y!lFp8?TIHN!LXO?gCnsYM-gQxsm=Ek**VmZu7vnuufD7K~GIxfxbsQ@qv2T zPa`tvHB$fFCyZl>3oYg?_wW)C>^_iDOc^B7klnTOoytQH18WkOk)L2BSD0r%xgRSW zQS9elF^?O=_@|58zKLK;(f77l-Zzu}4{fXed2saq!5k#UZAoDBqYQS{sn@j@Vtp|$ zG%gnZ$U|9@u#w1@11Sjl8ze^Co=)7yS(}=;68a3~g;NDe_X^}yJj;~s8xq9ahQ5_r zxAlTMnep*)w1e(TG%tWsjo3RR;yVGPEO4V{Zp?=a_0R#=V^ioQu4YL=BO4r0$$XTX zZfnw#_$V}sDAIDrezGQ+h?q24St0QNug_?{s-pI(^jg`#JRxM1YBV;a@@JQvH8*>> zIJvku74E0NlXkYe_624>znU0J@L<-c=G#F3k4A_)*;ky!C(^uZfj%WB3-*{*B$?9+ zDm$WFp=0(xnt6`vDQV3Jl5f&R(Mp};;q8d3I%Kn>Kx=^;uSVCw0L=gw53%Bp==8Sw zxtx=cs!^-_+i{2OK`Q;913+AXc_&Z5$@z3<)So0CU3;JAv=H?@Zpi~riQ{z-zLtVL z!oF<}@IgJp)Iyz1zVJ42!SPHSkjYNS4%ulVVIXdRuiZ@5Mx8LJS}J#qD^Zi_xQ@>DKDr-_e#>5h3dtje*NcwH_h;i{Sx7}dkdpuW z(yUCjckQsagv*QGMSi9u1`Z|V^}Wjf7B@q%j2DQXyd0nOyqg%m{CK_lAoKlJ7#8M} z%IvR?Vh$6aDWK2W!=i?*<77q&B8O&3?zP(Cs@kapc)&p7En?J;t-TX9abGT#H?TW? ztO5(lPKRuC7fs}zwcUKbRh=7E8wzTsa#Z{a`WR}?UZ%!HohN}d&xJ=JQhpO1PI#>X zHkb>pW04pU%Bj_mf~U}1F1=wxdBZu1790>3Dm44bQ#F=T4V3&HlOLsGH)+AK$cHk6 zia$=$kog?)07HCL*PI6}DRhpM^*%I*kHM<#1Se+AQ!!xyhcy6j7`iDX7Z-2i73_n# zas*?7LkxS-XSqv;YBa zW_n*32D(HTYQ0$feV_Fru1ZxW0g&iwqixPX3=9t4o)o|kOo79V$?$uh?#8Q8e>4e)V6;_(x&ViUVxma+i25qea;d-oK7ouuDsB^ab{ zu1qjQ%`n56VtxBE#0qAzb7lph`Eb-}TYpXB!H-}3Ykqyp`otprp7{VEuW*^IR2n$Fb99*nAtqT&oOFIf z@w*6>YvOGw@Ja?Pp1=whZqydzx@9X4n^2!n83C5{C?G@|E?&$?p*g68)kNvUTJ)I6 z1Q|(#UuP6pj78GUxq11m-GSszc+)X{C2eo-?8ud9sB=3(D47v?`JAa{V(IF zPZQ_0AY*9M97>Jf<o%#O_%Wq}8>YM=q0|tGY+hlXcpE=Z4Od z`NT7Hu2hnvRoqOw@g1f=bv`+nba{GwA$Ak0INlqI1k<9!x_!sL()h?hEWoWrdU3w` zZ%%)VR+Bc@_v!C#koM1p-3v_^L6)_Ktj4HE>aUh%2XZE@JFMOn)J~c`_7VWNb9c-N z2b|SZMR4Z@E7j&q&9(6H3yjEu6HV7{2!1t0lgizD;mZ9$r(r7W5G$ky@w(T_dFnOD z*p#+z$@pKE+>o@%eT(2-p_C}wbQ5s(%Sn_{$HDN@MB+Ev?t@3dPy`%TZ!z}AThZSu zN<1i$siJhXFdjV zP*y|V<`V8t=h#XTRUR~5`c`Z9^-`*BZf?WAehGdg)E2Je)hqFa!k{V(u+(hTf^Yq& zoruUh2(^3pe)2{bvt4&4Y9CY3js)PUHtd4rVG57}uFJL)D(JfSIo^{P=7liFXG zq5yqgof0V8paQcP!gy+;^pp-DA5pj=gbMN0eW=-eY+N8~y+G>t+x}oa!5r>tW$xhI zPQSv=pi;~653Gvf6~*JcQ%t1xOrH2l3Zy@8AoJ+wz@daW@m7?%LXkr!bw9GY@ns3e zSfuWF_gkWnesv?s3I`@}NgE2xwgs&rj?kH-FEy82=O8`+szN ziHch`vvS`zNfap14!&#i9H@wF7}yIPm=UB%(o(}F{wsZ(wA0nJ2aD^@B41>>o-_U6 zUqD~vdo48S8~FTb^+%#zcbQiiYoDKYcj&$#^;Smmb+Ljp(L=1Kt_J!;0s%1|JK}Wi z;={~oL!foo5n8=}rs6MmUW~R&;SIJO3TL4Ky?kh+b2rT9B1Jl4>#Uh-Bec z`Hsp<==#UEW6pGPhNk8H!!DUQR~#F9jEMI6T*OWfN^Ze&X(4nV$wa8QUJ>oTkruH# zm~O<`J7Wxseo@FqaZMl#Y(mrFW9AHM9Kb|XBMqaZ2a)DvJgYipkDD_VUF_PKd~dT7 z#02}bBfPn9a!X!O#83=lbJSK#E}K&yx-HI#T6ua)6o0{|={*HFusCkHzs|Fn&|C3H zBck1cmfcWVUN&i>X$YU^Sn6k2H;r3zuXbJFz)r5~3$d$tUj(l1?o={MM){kjgqXRO zc5R*#{;V7AQh|G|)jLM@wGAK&rm2~@{Pewv#06pHbKn#wL0P6F1!^qw9g&cW3Z=9} zj)POhOlwsh@eF=>z?#sIs*C-Nl(yU!#DaiaxhEs#iJqQ8w%(?+6lU02MYSeDkr!B- zPjMv+on6OLXgGnAtl(ao>|X2Y8*Hb}GRW5}-IzXnoo-d0!m4Vy$GS!XOLy>3_+UGs z2D|YcQx@M#M|}TDOetGi{9lGo9m-=0-^+nKE^*?$^uHkxZh}I{#UTQd;X!L+W@jm( zDg@N4+lUqI92o_rNk{3P>1gxAL=&O;x)ZT=q1mk0kLlE$WeWuY_$0`0jY-Kkt zP*|m3AF}Ubd=`<>(Xg0har*_@x2YH}bn0Wk*OZz3*e5;Zc;2uBdnl8?&XjupbkOeNZsNh6pvsq_ydmJI+*z**{I{0K)-;p1~k8cpJXL$^t!-`E}=*4G^-E8>H!LjTPxSx zcF+cS`ommfKMhNSbas^@YbTpH1*RFrBuATUR zt{oFWSk^$xU&kbFQ;MCX22RAN5F6eq9UfR$ut`Jw--p2YX)A*J69m^!oYfj2y7NYcH6&r+0~_sH^c^nzeN1AU4Ga7=FlR{S|Mm~MpzY0$Z+p2W(a={b-pR9EO1Rs zB%KY|@wLcAA@)KXi!d2_BxrkhDn`DT1=Dec}V!okd{$+wK z4E{n8R*xKyci1(CnNdhf$Dp2(Jpof0-0%-38X=Dd9PQgT+w%Lshx9+loPS~MOm%ZT zt%2B2iL_KU_ita%N>xjB!#71_3=3c}o zgeW~^U_ZTJQ2!PqXulQd=3b=XOQhwATK$y(9$#1jOQ4}4?~l#&nek)H(04f(Sr=s| zWv7Lu1=%WGk4FSw^;;!8&YPM)pQDCY9DhU`hMty1@sq1=Tj7bFsOOBZOFlpR`W>-J$-(kezWJj;`?x-v>ev{*8V z8p|KXJPV$HyQr1A(9LVrM47u-XpcrIyO`yWvx1pVYc&?154aneRpLqgx)EMvRaa#|9?Wwqs2+W8n5~79G z(}iCiLk;?enn}ew`HzhG+tu+Ru@T+K5juvZN)wY;x6HjvqD!&!)$$;1VAh~7fg0K| zEha#aN=Yv|3^~YFH}cc38ovVb%L|g@9W6fo(JtT6$fa?zf@Ct88e}m?i)b*Jgc{fl zExfdvw-BYDmH6>(4QMt#p0;FUIQqkhD}aH?a7)_%JtA~soqj{ppP_82yi9kaxuK>~ ze_)Zt>1?q=ZH*kF{1iq9sr*tVuy=u>Zev}!gEZx@O6-fjyu9X00gpIl-fS_pzjpqJ z1yqBmf9NF!jaF<+YxgH6oXBdK)sH(>VZ)1siyA$P<#KDt;8NT*l_0{xit~5j1P)FN zI8hhYKhQ)i z37^aP13B~u65?sg+_@2Kr^iWHN=U;EDSZ@2W2!5ALhGNWXnFBY%7W?1 z=HI9JzQ-pLKZDYTv<0-lt|6c-RwhxZ)mU2Os{bsX_i^@*fKUj8*aDO5pks=qn3Dv6 zwggpKLuyRCTVPwmw1r}B#AS}?X7b837UlXwp~E2|PJw2SGVueL7){Y&z!jL!XN=0i zU^Eig`S2`{+gU$68aRdWx?BZ{sU_f=8sn~>s~M?GU~`fH5kCc; z8ICp+INM3(3{#k32RZdv6b9MQYdZXNuk7ed8;G?S2nT+NZBG=Tar^KFl2SvhW$bGW#kdWL-I)s_IqVnCDDM9fm8g;P;8 z7t4yZn3^*NQfx7SwmkzP$=fwdC}bafQSEF@pd&P8@H#`swGy_rz;Z?Ty5mkS%>m#% zp_!m9e<()sfKiY(nF<1zBz&&`ZlJf6QLvLhl`_``%RW&{+O>Xhp;lwSsyRqGf=RWd zpftiR`={2(siiPAS|p}@q=NhVc0ELprt%=fMXO3B)4ryC2LT(o=sLM7hJC!}T1@)E zA3^J$3&1*M6Xq>03FX`R&w*NkrZE?FwU+Muut;>qNhj@bX17ZJxnOlPSZ=Zeiz~T_ zOu#yc3t6ONHB;?|r4w+pI)~KGN;HOGC)txxiUN8#mexj+W(cz%9a4sx|IRG=}ia zuEBuba3AHsV2feqw-3MvuL`I+2|`Ud4~7ZkN=JZ;L20|Oxna5vx1qbIh#k2O4$RQF zo`tL()zxaqibg^GbB+BS5#U{@K;WWQj~GcB1zb}zJkPwH|5hZ9iH2308!>_;%msji zJHSL~s)YHBR=Koa1mLEOHos*`gp=s8KA-C zu0aE+W!#iJ*0xqKm3A`fUGy#O+X+5W36myS>Uh2!R*s$aCU^`K&KKLCCDkejX2p=5 z%o7-fl03x`gaSNyr?3_JLv?2RLS3F*8ub>Jd@^Cc17)v8vYEK4aqo?OS@W9mt%ITJ z9=S2%R8M){CugT@k~~0x`}Vl!svYqX=E)c_oU6o}#Hb^%G1l3BudxA{F*tbjG;W_>=xV73pKY53v%>I)@D36I_@&p$h|Aw zonQS`07z_F#@T-%@-Tb|)7;;anoD_WH>9ewFy(ZcEOM$#Y)8>qi7rCnsH9GO-_7zF zu*C87{Df1P4TEOsnzZ@H%&lvV(3V@;Q!%+OYRp`g05PjY^gL$^$-t0Y>H*CDDs?FZly*oZ&dxvsxaUWF!{em4{A>n@vpXg$dwvt@_rgmHF z-MER`ABa8R-t_H*kv>}CzOpz;!>p^^9ztHMsHL|SRnS<-y5Z*r(_}c4=fXF`l^-i}>e7v!qs_jv zqvWhX^F=2sDNWA9c@P0?lUlr6ecrTKM%pNQ^?*Lq?p-0~?_j50xV%^(+H>sMul#Tw zeciF*1=?a7cI(}352%>LO96pD+?9!fNyl^9v3^v&Y4L)mNGK0FN43&Xf8jUlxW1Bw zyiu2;qW-aGNhs=zbuoxnxiwZ3{PFZM#Kw)9H@(hgX23h(`Wm~m4&TvoZoYp{plb^> z_#?vXcxd>r7K+1HKJvhed>gtK`TAbJUazUWQY6T~t2af%#<+Veyr%7-#*A#@&*;@g58{i|E%6yC_InGXCOd{L0;$)z#?n7M`re zh!kO{6=>7I?*}czyF7_frt#)s1CFJ_XE&VrDA?Dp3XbvF{qsEJgb&OLSNz_5g?HpK z9)8rsr4JN!Af3G9!#Qn(6zaUDqLN(g2g8*M)Djap?WMK9NKlkC)E2|-g|#-rp%!Gz zAHd%`iq|81efi93m3yTBw3g0j#;Yb2X{mhRAI?&KDmbGqou(2xiRNb^sV}%%Wu0?< z?($L>(#BO*)^)rSgyNRni$i`R4v;GhlCZ8$@e^ROX(p=2_v6Y!%^As zu022)fHdv_-~Yu_H6WVPLpHQx!W%^6j)cBhS`O3QBW#x(eX54d&I22op(N59b*&$v zFiSRY6rOc^(dgSV1>a7-5C;(5S5MvKcM2Jm-LD9TGqDpP097%52V+0>Xqq!! zq4e3vj53SE6i8J`XcQB|MZPP8j;PAOnpGnllH6#Ku~vS42xP*Nz@~y%db7Xi8s09P z1)e%8ys6&M8D=Dt6&t`iKG_4X=!kgRQoh%Z`dc&mlOUqXk-k`jKv9@(a^2-Upw>?< zt5*^DV~6Zedbec4NVl($2T{&b)zA@b#dUyd>`2JC0=xa_fIm8{5um zr-!ApXZhC8@=vC2WyxO|!@0Km)h8ep*`^he92$@YwP>VcdoS5OC^s38e#7RPsg4j+ zbVGG}WRSET&ZfrcR(x~k8n1rTP%CnfUNKUonD$P?FtNFF#cn!wEIab-;jU=B1dHK@ z(;(yAQJ`O$sMn>h;pf^8{JISW%d+@v6@CnXh9n5TXGC}?FI9i-D0OMaIg&mAg=0Kn zNJ7oz5*ReJukD55fUsMuaP+H4tDN&V9zfqF@ zr=#ecUk9wu{0;!+gl;3Bw=Vn^)z$ahVhhw)io!na&9}LmWurLb0zubxK=UEnU*{5P z+SP}&*(iBKSO4{alBHaY^)5Q=mZ+2OwIooJ7*Q5XJ+2|q`9#f?6myq!&oz?klihLq z4C)$XP!BNS0G_Z1&TM>?Jk{S~{F3n83ioli=IO6f%wkvCl(RFFw~j0tb{GvXTx>*sB0McY0s&SNvj4+^h`9nJ_wM>F!Uc>X}9PifQekn0sKI2SAJP!a4h z5cyGTuCj3ZBM^&{dRelIlT^9zcfaAuL5Y~bl!ppSf`wZbK$z#6U~rdclk``e+!qhe z6Qspo*%<)eu6?C;Bp<^VuW6JI|Ncvyn+LlSl;Mp22Bl7ARQ0Xc24%29(ZrdsIPw&-=yHQ7_Vle|5h>AST0 zUGX2Zk34vp?U~IHT|;$U86T+UUHl_NE4m|}>E~6q``7hccCaT^#y+?wD##Q%HwPd8 zV3x4L4|qqu`B$4(LXqDJngNy-{&@aFBvVsywt@X^}iH7P%>bR?ciC$I^U-4Foa`YKI^qDyGK7k%E%c_P=yzAi`YnxGA%DeNd++j3*h^ z=rn>oBd0|~lZ<6YvmkKY*ZJlJ;Im0tqgWu&E92eqt;+NYdxx`eS(4Hw_Jb5|yVvBg z*tbdY^!AN;luEyN4VRhS@-_DC{({ziH{&Z}iGElSV~qvT>L-8G%+yEL zX#MFOhj{InyKG=mvW-<1B@c-}x$vA(nU?>S>0*eN#!SLzQ)Ex7fvQ)S4D<8|I#N$3 zT5Ei`Z?cxBODHX8(Xp73v`IsAYC@9b;t}z0wxVuQSY1J^GRwDPN@qbM-ZF48T$GZ< z8WU+;Pqo?{ghI-KZ-i*ydXu`Ep0Xw^McH_KE9J0S7G;x8Fe`DVG?j3Pv=0YzJ}yZR z%2=oqHiUjvuk0~Ca>Kol4CFi0_xQT~;_F?=u+!kIDl-9g`#ZNZ9HCy17Ga1v^Jv9# z{T4Kb1-AzUxq*MutfOWWZgD*HnFfyYg0&e9f(5tZ>krPF6{VikNeHoc{linPPt#Si z&*g>(c54V8rT_AX!J&bNm-!umPvOR}vDai#`CX___J#=zeB*{4<&2WpaDncZsOkp* zsg<%@@rbrMkR_ux9?LsQxzoBa1s%$BBn6vk#{&&zUwcfzeCBJUwFYSF$08qDsB;gWQN*g!p8pxjofWbqNSZOEKOaTx@+* zwdt5*Q47@EOZ~EZL9s?1o?A%9TJT=Ob_13yyugvPg*e&ZU(r6^k4=2+D-@n=Hv5vu zSXG|hM(>h9^zn=eQ=$6`JO&70&2|%V5Lsx>)(%#;pcOfu>*nk_3HB_BNaH$`jM<^S zcSftDU1?nL;jy)+sfonQN}(}gUW?d_ikr*3=^{G)=tjBtEPe>TO|0ddVB zTklrSHiW+!#26frPXQQ(YN8DG$PZo?(po(QUCCf_OJC`pw*uey00%gmH!`WJkrKXj2!#6?`T25mTu9OJp2L8z3! z=arrL$ZqxuE{%yV)14Kd>k}j7pxZ6#$Dz8$@WV5p8kTqN<-7W)Q7Gt2{KoOPK_tZ| zf2WG~O5@{qPI+W<4f_;reuFVdO^5`ADC1!JQE|N`s3cq@(0WB!n0uh@*c{=LAd;~} zyGK@hbF-Oo+!nN)@i*O(`@FA#u?o=~e{`4O#5}z&=UkU*50fOrzi11D^&FOqe>wii z?*k+2|EcUs;Gx{!@KBT~>PAwLrIDT7Th=Utu?~?np@t^gFs?zgX=D${RwOY^WGh-+ z+#4$066ISh8eYW#FXWp~S`<*%O^ZuItL1Tyqt8#tZ zY120E;^VG`!lZn&3sPd$RkdHpU#|w+bYV)pJC|SH9g%|5IkxVTQcBA4CL0}$&}ef@ zW^Vtj%M;;_1xxP9x#ex17&4N*{ksO*_4O}xYu(p*JkL#yr}@7b)t5X?%CY<+s5_MJ zuiqt+N_;A(_)%lumoyRFixWa-M7qK_9s6<1X?JDa9fP!+_6u~~M$5L=ipB=7(j#f< zZ34J%=bs549%~_mA(|={uZNs_0?o7;-LBP(ZRnkd{-^|2|=4vUTmtByHL8 zEph`(LSEzQj68a+`d$V<45J7cyv^#|^|%fD#si1Nx!4NW*`l*{->HEWNh6-|g>-=r zXmQ|-i}Ku$ndUeHQ^&ieT!Lf}vf6GaqW9$DJ2NWrqwPY%%4nip$@vK$nRp*_C-v<| zuKz~ZyN&<%!NS26&x?jhy+@awJipMQ-8(X4#Ae5??U<1QMt1l9R=w9fAnEF}NYu$2 z>6}Vkc zIb*A?G*z8^IvibmBKn_u^5&T_1oey0gZS2~obf(#xk=erZGTEdQnt3DMGM+0oPwss zj5zXD;(oWhB_T@~Ig#9@v)AKtXu3>Inmgf@A|-lD-1U>cNyl3h?ADD9)GG4}zUGPk zZzaXe!~Kf?<~@$G?Uql3t8jy9{2!doq4=J}j9ktTxss{p6!9UdjyDERlA*xZ!=Q)KDs5O)phz>Vq3BNGoM(H|=1*Q4$^2fTZw z(%nq1P|5Rt81}SYJpEEzMPl5VJsV5&4e)ZWKDyoZ>1EwpkHx-AQVQc8%JMz;{H~p{=FXV>jIxvm4X*qv52e?Y-f%DJ zxEA165GikEASQ^fH6K#d!Tpu2HP{sFs%E=e$gYd$aj$+xue6N+Wc(rAz~wUsk2`(b z8Kvmyz%bKQxpP}~baG-rwYcYCvkHOi zlkR<=>ZBTU*8RF_d#Bl@zZsRIhx<%~Z@Z=ik z>adw3!DK(8R|q$vy{FTxw%#xliD~6qXmY^7_9kthVPTF~Xy1CfBqbU~?1QmxmU=+k z(ggxvEuA;0e&+ci-zQR{-f7aO{O(Pz_OsEjLh_K>MbvoZ4nxtk5u{g@nPv)cgW_R} z9}EA4K4@z0?7ue}Z(o~R(X&FjejUI2g~08PH1E4w>9o{)S(?1>Z0XMvTb|;&EuyOE zGvWNpYX)Nv<8|a^;1>bh#&znEcl-r!T#pn= z4$?Yudha6F%4b>*8@=BdtXXY4N+`U4Dmx$}>HeVJk-QdTG@t!tVT#0(LeV0gvqyyw z2sEp^9eY0N`u10Tm4n8No&A=)IeEC|gnmEXoNSzu!1<4R<%-9kY_8~5Ej?zRegMn78wuMs#;i&eUA0Zk_RXQ3b&TT} z;SCI=7-FUB@*&;8|n>(_g^HGf3@QODE3LpmX~ELnymQm{Sx9xrKS zK29p~?v@R$0=v6Dr5aW>-!{+h@?Q58|Kz8{{W`%J+lDAdb&M5VHrX_mDY;1-JLnf)ezmPau$)1;=`-FU=-r-83tX=C`S#}GZufju zQ>sXNT0Ny=k@nc%cFnvA_i4SC)?_ORXHq8B4D%el1uPX`c~uG#S1M7C+*MMqLw78E zhY2dI8@+N^qrMI1+;TUda(vGqGSRyU{Fnm`aqrr7bz42c5xsOO-~oZpkzorD1g}Y<6rk&3>PsSGy}W?MtqFky@A(X# zIuNZK0cK?^=;PUAu>j0#HtjbHCV*6?jzA&OoE$*Jlga*}LF`SF?WLhv1O|zqC<>*> zYB;#lsYKx0&kH@BFpW8n*yDcc6?;_zaJs<-jPSkCsSX-!aV=P5kUgF@Nu<{a%#K*F z134Q{9|YX7X(v$62_cY3^G%t~rD>Q0z@)1|zs)vjJ6Jq9;7#Ki`w+eS**En?7;n&7 zu==V3T&eFboN3ZiMx3D8qYc;VjFUk_H-WWCau(VFXSQf~viH0L$gwD$UfFHqNcgN`x}M+YQ6RnN<+@t>JUp#)9YOkqst-Ga?{FsDpEeX0(5v{0J~SEbWiL zXC2}M4?UH@u&|;%0y`eb33ldo4~z-x8zY!oVmV=c+f$m?RfDC35mdQ2E>Pze7KWP- z>!Bh<&57I+O_^s}9Tg^k)h7{xx@0a0IA~GAOt2yy!X%Q$1rt~LbTB6@Du!_0%HV>N zlf)QI1&gvERKwso23mJ!Ou6ZS#zCS5W`gxE5T>C#E|{i<1D35C222I33?Njaz`On7 zi<+VWFP6D{e-{yiN#M|Jgk<44u1TiMI78S5W`Sdb5f+{zu34s{CfWN7a3Cf^@L%!& zN$?|!!9j2c)j$~+R6n#891w-z8(!oBpL2K=+%a$r2|~8-(vQj5_XT`<0Ksf;oP+tz z9CObS!0m)Tgg`K#xBM8B(|Z)Wb&DYL{WTYv`;A=q6~Nnx2+!lTIXtj8J7dZE!P_{z z#f8w6F}^!?^KE#+ZDv+xd5O&3EmomZzsv?>E-~ygGum45fk!SBN&|eo1rKw^?aZJ4 E2O(~oYXATM literal 53636 zcmafaW0a=B^559DjdyI@wr$%scWm3Xy<^+Pj_sKpY&N+!|K#4>Bz;ajPk*RBjZ;RV75EK-Uv!Ig%(BB5~-#>pF^k0$_Qx&35mhPeng zP5V`%P1S)(UiPcRczm!G=UnT-`Q91$f1A+!-&O|pcR~kei+@?vzw^NUlgGl@$kf*C z|H+E_udE)q?&-+Q}NKDTwWGi9|EhSaen+=P&UpS2Bbjf?dM==%4Q|xN(%II>dI89;ro*BL4Red4p@gCHx)jxu84C!g zjsX&OW)$y=#n_cmkmSKx8wB`wsWLl2JqjeaVk7bSmJ^1~lfVg!V?hu`#16r`(c%03 z+bNIihOMIg6#&P-M=bjP*`tb=i>sNPqO-%_!*aDUbNSoz^b&G&wKTJLwK6esb#VU2 zA(X1vIiLt3`C|Yg#ug4M4Qo?3SG`q_qZ}3taiC*=Kr_iz$;k@X8G%~Vd6+sRKGZ)& z+p*q5z7@wb3#JkQquvh9UhzIo^YV1R9-Xe;0!?~alf(u?!-9j_P;Ij}#>Jwst7xv? z;G^nv*pMKM4YURMz)fK4?^o)Dcc}21N-htU8ERJf1bHs;abY~r3A|7luMI)GB6dDK z`J>5Jv|%#U5I&KT%fFbdBP)B6kleNyTvxS0rL65!r@*aV5+OC6JOWULy|fU`rtGA4 zpTf41dqh+{7_Pwm$Fs8^Vb!tHbcC-}I`skBCK;FzaJce~-$4Pt?1@r%_$rO}`9UT7 zSX5*>iy%>Xc8mbiQl^ZEgLSr%8hHc?Cm_^TR2a;fB{(joOtfvO7b)Do$8Sl9;dvVr zgJnGKAUpQ0O~(W`21R%m@d)wFTZN=-_R3{~N+V)|9y!dZ2Gsh{a2TeDzb zE)?K2{8YP0s$G;TlctY`(Kd(lAuA83rJWo?G-jqM3oPEqBA0;lXmC;h`uW)Emx=o#*Gr)Fk2?4Mg z6Pv$Em4?wXI^;1nmKpw+G5PO$dwQkmQuSBbw*C^yf0jC_|EXI4kSVd)pMMn#F8t5* z`3V|w4~+h^@qJG<45*OelYTohyEM;*D}Od5;XnimPbxOlMEd9ZqwfwO5XPC$nKu-a ze-RBin*vnwImM~QYzkn*2s6xJl2yk-IkcISSaZi%DJ4_g0+DaZ$B(J8;x$yLAj=-SHG10>KEOA-l@d@Fj#6XX3mlhc4o2;4mNI%|JZb_ijD$~5ZbqR zqTcGWat)xh%~}UcXG8m1ZE1L_>W3;65wwD77<3(dx2cxxr$#TCwe{i{|C0n8-;grR zcu4m|=Zr_6%gOZgt$=_(h~{8bu+sE|XVE@Yo>U|il%c-3?%NL}@dl!U&fo-~UL-Sh2-bb+?VoQ!yPZyIoVjJ8mhHtUF5pECK-2P zY0R3=WAbJ&WqiC7jVzZMar2CPz=y1z5BtN`USauJJIpuBUK0xi@&Jrr?71-HF(tCu zw;VPR+cUTk7?^&XW<%6ibyT13jQjYR@ZqA9PSx5gY}6QQ{N3WcvwC*r#{{e$-IvRr zlTPwkZq|Mso5&Vev6P>5S#fQ4+Bu95+8fp$rN45@bWV(eh&Q8IsFKt~8HIHDy_%#V ze<2Hz^(Z&SphG;H!vhD%-Q6@+c!r>(zap7uoaKFpFSSr_n?dOp;;6b|G^-KP~%Si8yQ@p7;xW^eXO!dKDBgVOnA;#$UBS-1ApYUWL%5_RO>+q8f zx16bCq}~0|#0TUgn0FL`bu;F(JW9LsTge;$D>BL|34H|1YA|_6A^`1()6hUC0We`m!x;xjrbZY@#Y=`i$V$+fte|cB#5&}ce#UU~73>`*m{;U=Kk_;3W;~9w>1I|1oZnaGGO`7Vk+ioV(aE&8dV{C9O zmV15?rW!PQ8+%ojSa&s%khFBgY<5>3tL+MoimT95t97_JVVWX=90l%gGEY?Vv?w;J z8O84C;*hFTbqF`LHx`zt-Ez&Wj`T=~kB}TEnOVGUF%Pv_jdA3@NpG8Gn9!+QJj);v3m; z?>J}t7FrdV*}}mM^;@Vuh8v;RUcR-K8%sBTzVlldaa$Zv8{AYfGgg#4GZ*61T2|G` zCwlW)#S7PwY0Hl1lnpW-;)QaNw5laxpQ zV|O>G1oH|=V>1jSH8|ay;!|0BtGAk>8BPI=W3C%D=3>UNFhc?K;~4|d{yk(zW<4ZE zOVVQL`;DV!y2I7}x=Hsq`ss-SD*iphM{=@F1~>0FR5-@Ir%l9#%-3-)!+23pcn(fa zBxzNq;VZVLx(l|(v2dB{rgfd9H#uUqEX<;>PF20v!v16N9%eleuU~J1qY>jD_lYs_ zi57Y3RAHfIA6ZTaLx*`uiWul@^^=t^&|*&tR@O!E(GhbBiS}kG)6Wax#{}H@cMhgM zsJl{nRf|;xnQGh4lgO?#+eR?4Q1H3AlU8biLBFSiE4(RT+PEjf8RS9$^66!lSv1q- zfN@5YX3{=8_9V4%-^(hH>1aE-lAP1)AoSW)f(|dirJ*b2ld7JAYU<0&SOV0<6|v-M zv#Rj@EeO~${gxHfD86ZIJ^D4j<_ZmO+_QMZ^uCT1m-^R})FH!xw5n?9An{fDOh1TU zya=C~5^tcBNTcpoKzpLQyig=$6uGAfSnd+S#+Mw9cE9Wbna#FsaLS3<>^or;Om@^# z^qf*Wc&zp7wmR%3z~MEP?g*4g>Tt3eFdgLwV}Ip@k|NGAT@|D4cwW2}rUOr~fZh(= zP^HWba4^CP#0OESh6d}FDRRMgcK_I>Qq4^})Th$-hhLfDry_uY?2~|GXzd$iILK7x z|AL!gslc{`sm&bS?BKY{6$a=NlwEL3{JxnpqOM2u=~OJWeZXPY?c*W6Vx1{)F90KI zNz4nIpt6Mt^P(u4X*O)z-gd!vLpek@D%!rlBBL0iIM{JPs(T|L(AB5#WYOnRXn3Gt zdFLu~iq7l`+spMM^dH1O{cdkg=gRDl^sej9cm=qu56E&TH$g*Y+=uX%zH!tNe!M$e zAj2hc2ahF4u_=H5PB~&s{l)c83HU=srLTPPL;Yz7xs9$LsuY87YUils%%j4(=kJB08_wYtX379w zU2)Q8O&1GFDRoWW8=u3v)w%~=lE%EUy@g$|RU&~+%|vwG!TUn^ui#}GUSB-%FL-%} z_`iY|jeqz~A`bTERu*o~My^&4_WuMg$#x2;LP%qOwoX?=_=5wBib$@Ba|-rZpb^!W z)Zox1eMRaV(@2lww)NQVRjf#u?!yQN5Y2LWbqZ>>hB;W8SswGhu5~{?=H?85PVN8^ zG8q$w?9q5Ja5qi@V>7%Qubo~4Gr~C0R=lS3FLnZVSLz%MdJ#qqPL}@6@MADBwKLD< zaACW@qt12UN-N4uxb2Fi*vjc%ds#w2!wYv+9|v*_G;Q7Eu@()kjx15)i*}b;wi-jo z!#!KuW)d{rUMuq)*5jVre3qMfUd^jfcdu_UbM2Oz-?hk4e+FH%EaTLzv2W&e?ls2D z<$3wqdX38e($G6C-nsFnupr*{-GW)A@99yjop6}@a8_ybZj5M7D^*%pqAow8udBSO z&Wfn|^HL=)(Vb)=x`ABTZgD{Bzo#6hN+>TNF?-7=nrhim5h=2C?d`J)n|MM9I<#HE>M@V4cMf6O%;o zQjaBwl1hQHR6@$k<1XZqYVb)(LTOUXi;yK`g4WUrEpW;j!DrTg|4s5)Ykq>0Ag0{Q z+h4H%D%(na_*Tb%K{@tc#KZWX5zoK-yOKuse|~@NVGYcVd;9@B zdvFxaL~ojV-}Iik&AsQk%w6sM`FzI={Cd+GqK~QY6cIrcXU!R|h~i*-BY#YRKsR|{ zr1wCjrcldKzfTKSj{$QMuY;DFm3Ed7iK`@7BvL}B2s47C4tT=(N&K27Pr+b{4<1fMh=Ri3sn!$a()#pH26izHyN0pNZJ z!(JY$L!;Kf!tB1$VLmL&!)|OY+SBby+hI<@ZvV>?leISV5{k5%NVSy5`WVJuN|Y@u zsFh(#f-(X#iR3h^O-$<%y%FGYUxGa(Jz{CDO%=6Vb3m~)sO5gMa}}AQx&M_XIcmsR zDXgw(-w7qNKqYZX>hx+NY#hHQ;I?~ER3 zSBq2+M8z_JP4Cc(W9HmN7A5mo6-rnrj`Hf0<#YxwCzyKg{?_i)19>2kW0*QBm$(D zlrBEFZZhx;&3cAG_osC#(DF+^NH2;E0%r5}IUYTxX3l0^0;mK< zz2R0=#RHoRd;qh_X(p^o*DNfvRp+^Jr?<1=rsmN+@BXY42Jaus^eEK5=$Oebm6t|ahyzT+6 zbpmWV&9K;3-oqqh^+`D&cn;~Tr1#se{ND_xO29cBf!Q08FbEus2FW74b9?mT{S*La z{=}ODs!_Fri+KLfhi=MU8JxR}t;Tp&1}dUp`?^acF~nBO8s0!ep@(lx;iV@L)_Ae# zyDyM{xi9j!38)wbq1>|5eNhJkZ}8Nxj0 z2xT3pxJaWE7ZH)$^wO`$aReZXbI(ZLR_J0mIgh_|NvhV)?@)TEE0v^&_y^04|NY;SCx9C1L{*@H5a{eyG`^H<6S%kx8VOk{;SC>^L{CmnhPVQ5$?c55pD{NObBgG@ll(S zT__9x0=}D}^Ko%;ocOjWC_x-g#%7(K%hBBF@8v=t?gf4T5TZpcZKOsIl*ds++ej?{V6wPHR{+W?nl$ zo@|xEB-~gNPlP39<2+RP2vx&v_=!8^CyibCCc?8h4xe4P>0BN+jsWxUy7IRzf~YJG zHeOkxu(mKutWO8Sfe;R&l4NnDgfK70A@nhHF7wdnpHGM17P`eC?XxsLtm~p08Qxy` z<#hQ=V11;O!23~$)OQzQbhW`WB9K6!L3S}PjCx|`U@(5LsO*t6FsEXK(R~KkxD->8?RGHBXi9?^!!MJ zA(}30|mD~xL@?Xcx zL);hMD%~Z?Ym?Akmhq(PNneCpwB`<5WCN67FUo{*qxWv#9lrbl{#TKlb-s*3hXew$ zM*sq%_|GD#Xyj@s8{zJ~FL4uqSWjqM`VX9st5vA~Bfb2$_X(P%=w9~Ls0=^Cz zC4|O_GM>_Q%C!!2jd&x*n2;}7T>NB!#l12dVf5jVlP^eq%z=uNFHU~qh=o`e{>Z86 zw=dqkYfT6B#d_ijY<~Q=t@|g4#Y!_cG z9h%!c!@dRER)SjtwsSgM(G6bXmGG)ZYOk3M4NX^W?)-MCzj&*xTy`8niF+4@!v}0v zHw)oorFUE2y@j~X4j{!=&UMbCzjh7PL8{}Ity4ETxZBLKTLn>D0oU&giXSn@R;!rV zwo}GfZT(S`gu391=q6%6Juhlkd@!9>D}7r`F&S)TQOHl`(+TR1N^cH&r@D?T!TrVo zXK~d9LmJLcBT050HX94q0V)DL4JR->xOE5sMXaMjJM{<+%;!`h0pu~4pM#sfo7_|g z_1)Z-?icZxd#?b~;YlX5!IK|cmv9N$UD>&r)7L0XB`%}%_KBV<*`peo?%+;1_=aIU zR~|QcvD6WY%=WnED(=3|x!fa-;T+5PRN=MdHQpCC~!~^VMpO)X)Qd8lbm$ zN~E3B^BAHzmsMkeJ=+vH0@uSHHU)>cWfTzQcny;yt{s8OFJmmO22OKz7K z)un8gDCF`t>KTaxwukmqx5vVx`enp#qPtHvAu12yd!(Gfa^o?Zht1d0Ij#T%6>kw} zXCU8F_Ao57B!s*c3n)?E(xBF*36#zPNG5U_+I0Xuy?&0}ki4ZT~{TPn>V zN!b9>HM;CjmAfGBM1B0qW5+N4`}sds=Ke<$UhyX+CcM2q;vU!GOy|u0B5(6IsGnx)M{9Ey<4-28(D^pRXQ)5UNH81mZ1H|-xqIgOj?jU zk6mL_bha-CLzTLI{SVe)SBnO;R$}F&yXL|5S2asnM;BB6D3rF*XpU>{z|7G{pS#?X z4&CA{hhLs>HPjmLuU6Af)6z*r<$_melrl63gi?s)j0YpGjHxnY%Y9~DV`QE({aJ|R}*mAYe7WC?OY zR14{`2-@rBrKJ2ov3tFn2PCiZuP*6`k3q!Eghd|np_64Rq&WHdxq|As{6MW)n1IYX zKB9F$jjMTf!4pJfVom1GrFF-gqI;WV?t|K7`azXvX>4A`Btol~VsRgXDYu95o8Na` zWRJ)I9C*=Y8KbDx6a_Ke=|cEJFO=mnbM%E-d8LP}$1=}2R@~AnrIXQqh#`B^xIFg#jNlsiB&Ta#D1z^j55MqqN>YQ5z}(bO)kwUAxy*bt zndsYEZL_VX&4^%bNdhaPz)M%j%Wt?}HEfSF=uf(rJTr5O6q3*!{_tXbp%Gv5*|YkL z@T=$^pDB&!ZC48UzV9LHc`kBY{>HC&Qbg+newi|UiTX9o5U(7fxQj6SO=0d(Uq#>@ zo&fyYN6oQ_)K*`#$v^*=7v|h;+rj;tC%>Ws0wVg)7ps)Li>r~X?LVSDxmvKkXveJr zl-(N}v_mvVgOfI*Bwi65I7skP3F}A+cZ@_ArXEQ#SEM(yNussd(b6k@iaHDGHSxxD zYD!Y`fOTuXwwJ=z*47nu8;8s5-rm=j-K`Jm*8p>Oj%-t;Lx%n@^An$((?2=4z6SbV zA4?KHEQte<3ixN!M=4`TVhyr_L0EyUMkmT~3YZD%@4yi6v**A81E^-UNvz4By5lM( znK=6-c^Cye9hzC^Fp!|EsTSj(nJ{w?k5@o*Msf#BpsqM`@ORj}3f|HsTq+0ez*$2_ zpt_T0z*R@i?==Z!%2`!Tx-)Dr40n&hVVDy!Bfwd6G9>|(`RNlbosm9iF}e5!#&yq+ zFkW@E`!1epfpf=?AfDAKo^F9@A(*2VrB(@LN`M+(a8FnVwKtNmEz`v|pxV=GVC#cu^j+iv^@FX! z^tX5A_YT=C>ab^^R;TX4LLj?ScY%m6+qX`UU)Qwz^z35QQ(rwQdC15VRgScR_zh%P zZ=5$LG$m4i9JqOT`;^h7A5>u;RNJTp_L;b+`dagpQTo{X)o<4CJ=(kcbo`y#2R0eO z@Ub=*>>LhVErpeCOQU5g*&J-O4xO$dJ7ul1VKeEM-A`GO1eY~dttjR-F5pXVzddQK z&Y5hY38aJ`Y%+ZlJuS);4YL;T6kJzbDV`jME6%0Pc6P*z$~Fjwr2{y3QKN^S8JBF^ zf5^d~I~^?6>gc&mlpx#1LmhY8!?ORH{aLgWv#Us!%Ibk_Gaadf34=ZHi<_@(t7)Y} z$&&W~B;m1^)ugO7>O5&Ne&OhObQ9n z=kOe%uzC@X$8md#Rw@k8+en1sK}H#Q>nE?`NI@hqFe^q>E$j%{g3TsdmhNNRGH}}% zd#yCpHrbZjE;sq(<&f$D7tBya;0tYSUJq_SwKGD`UBM$Cey;V9e~(Pdc*@bSo+#N{@qDN_v6Gmi$N zP!1gLb*V%t8axFpEuzhuwP94Hou(`3T_|OoGuL)fzEdnW5fb_dcelwH&Xk72g_H$U z(_yUe$LEcGokZ}U-Xbc9v>&P*G5I{?`((kb_kgn)5B`gzg$e?ZluAuxg_W zll8KK*76oxT(lTU9ak+aBzBVUlBLk-Qbr}Iva4&*hr=nti(q4D(D}Tk9k#n6VSoU7 z_hRUwi>?XP8uGjNwDgmipV1b!j7>r^j+tl@8eZZIFbXF&$)(Hhu-2JHTy|3v#n3t` zt!B;$XA@d6o=bAKD#EHEU3@Hsf+#KKyj}FH zPJSS#Ya|=d( z&Z?A)O!z8Fp&A>8_EtCsL+S`--r!;5$x6@eh=^_)bUM0;yN7*?sU#g?b6Zo#iu@_U z;mT8wb!OS(<5RG7f1!sOx9k`7SB`(-A`xHlqT3U8YF(j?ns+FH+PQciLClz{<7ClX zRZF(L;<@+ln!#?hz90wHcZ%KOyVGAs=BW+`I%?m%dr{Z#!_qULHBx7OLdOgb=>=kS zNl<62t!`=+DrnzLlRoe4VD2}eIga4S-a-dkYJDO7MGqS9@~N-)dgJsrW+8(f)t_wN zU6ZeO{;9Xe4w5eUldsVzh!vkiUvRiT=MQ5mGt9(eZ3oS}u6%VU>DtxjPtwUwZ4NpT zmyMldM1-u*&1IKN{4&x8{BhIq)N9$wI1FZ@Z15$2Wi3SeaW9tBP0wCdi)S(o2l#y) zpQ*oR`wGInBuwrde#!F414OetP-qXepOU2t9)>>cQg4Ve&WHjejwKAyZ<=W6SWL_H z=ynS`C*})>gbtQujL93>2bSIBRd1KNp7g?3?Xj3<7K?Y9ENuA7R@C%Rnq{6uRhzq9 zVPgwtJm>~aZFYWeVrcu}(C$$7;5Dd~{#4H;h}g_puFc8}bwVj3#Y0Ua&&mt5JP(D4 zS-)DGYK;@+tvb(2l_Ve0mxouQi?Zq*DGP6^Qm2th8)nW_N{&(t&$+1?5jlUTTXjbp zw{&xlWw#bQmH>~9uk?*1)OdqV%|{y}Jn_F;70GO-Pn`cC^Q+<&6i|7G5-5FGdSHjj zU&s#rCD@HE16eq5ifubjS>+V|lU~LDG@`4>X_+|hSSG#dllB&wT0)I~bdKs%FSVc2 zkd^@7#wtp?+6dSv(^>wKpz5?G&a+58`OHWE08{mwUm)ejrcxN5%Dh>%`>3jaq5(>! ze%eW@5ym8jH+BD{kD^MX09l&;lq{}(L**xECi};c4SU(cZ%=BJHW5BA6!1nJhe#}M zWyi9KPEBJJd5Pgne0B(*rwsCij6uAg2HeK%9K^_gds8>K!iIV~+`4yik z{-7p&^5hi{*>L&&BLWiG7uw$yPsD$O58BnfOAC%PKIKOjiziuA1KlqX_iS*n26I3M@##{82yNyMLzcpYtGT&-2s~e9t~lOpusqx4eQpjvm6LnO35e1F1K>GL;>ianTWyT<1fP>q9OE^Yr*#q3v?g1Px}Iy^i1IJQ z3Lii~R6xA2|TgP5IG+*@V92>yoEn>{h3?1alaOzKOByMuzIXs@TY2^O!sX|R`i z4?%z|>vPlwbFj+PO_C+Z%e?X#a#Hubp7)bdvP!1e_2q1I)z)*zgJNiG#$&WdS&h%j z?=`OEZLG6j`cmg59Sc1`=TBiyj$N>al@K+E$W6O;nFd^JNpz2?<&$ts{3>I%(uYR% z-fvPG9q-z*&<#S%!4o1Ml9ykZHQM~~-SuM1o74pNqx>M-l#m+qZ6Sn?=b zR^I76oU7}YhD1X~yxz)Z{hqV$YFUFwg9XI$3DC!_-CkZeqI;Ou^GR zmDEGm&@94O9uED~wE93JW@%^cwP+=!u<%JP@#!}?UiS56L8^)HNrepgMEV8~?gRnu zVkz}fX1Qq+I(7~hFj=JzeI&`CKBdIlDP}#zN=$ zgO~?*d*e@Hj<~Lx%8AyW4bc^-2WC~cbd`amPE6MRh|JwWxvna zFbEa-a%cC+`UsH=%AB#UuZ6T8yYlQn&zK9&`MF}6&y;4ma_ss(vDLg7AFnk+oT^C> z+6x;1k#eBP3kd&o3vt!f83CHHyr+GX&l8<{vw4i}@%pebS7YqYH>ZEZ@Ve#tPMMruL?h z{1+n%2}CtP0VMH==%(0S2`HltG5I-h&0Vl~XrCD3P)+r~^Ooo1L1z@gqQ`!jE~tQT zd>QZ~oH&>@-Eo7Bzs!n?E5#7U5~P*Cj#1^S7PZZzY8wG@LH8k+I8CDTOL;`KID$`J z(FLzG=y)<{0nI!Gkqb(J958=(MV_}y;BL}N%LoL-mP7nc5--ipG=zntf>*E!Gt_dQ zJW+)@`G`t^+NI`(Ku5b8@5GBK8pw*WRUPsQ14m3c2qFx7I^B}>B8`?duZ6~rR=WPG z))~yFDC*Yt_$8E|OUk#%+U#h}E_UU*@ZoFooSeqgButT-ys$<25m>fB4-Rc60}=eG z5Jdj`=6SIdJ(KFqOx5P3d}gP3UZ|g^8x9IvPD$0vM0mddiQs}~SfTn)ZyV6Ph= zmP`b#bZQdmUVKvz(Ma&GiRx-8{S~X2PtQwHekJMg(tz93saDH)g+o!yLhjVxXVh5KkM7W)ZMB7T&m;q^lwVvLV9S|1qgYd@_(a=_w_elkJQ|!!ZDBL|y*SwTt*6s~uJzw4P9J%Yt zY4M}7x3h?GS>d1u60qkp@4|@d9mXDCJTS+U1<@i0X)PLJg%HN-kV-MH7h%mCSYr+co`9{iS3dFH%dtQ0_}Yp>tAIq<~q9La%k}z2d#WHlBu=Z-i>{k=vO~CkDTSUCx)_ssVeH zi(*8f6;SM#z#&3nABy%iqfdqX{a>p(^OQ(bnO9RV{m%iTinMMy=L_=lS zKc=TkHId1mPjdw~k?WCM1iYyaFt(Q8h04Pgs5wR~%Q;j}3|8SVUpAW*Frq0ltljN_ zZwBXkOT@|{<IOLGlbXs%I$qH z{9X=NaIZ5B;dod<^vKNQahaX&HTimWTTA zU@(#jhh)N@(mWXY^5)%7ig?ycMM`HRD@L|KSv9jYR2hVPmUQHZe`^?t7<+zG9F=&} z9He|!e0SCn$4o*|2JuzND%@BC;Vrxi2XY#fWde?6nlYs5oMvxcUAD_5`_9NzeTH9I zeCs1ZyVj$lA;M#+b!D}yq{Lxy&fivp-`&dCRq*_mvPB@T{t2WiXJiM&)bYqBYtDS9WTzbEBeIZ6wb_RPw&z#HDTNvG|%9Q@b zQr=B<>VgtdN6kAIy95aXY}u+M;mCYex{2#l^>6%+WIH67sE*1LvK`D-H-Q^ix>Ecn z!Xk=0y5)NEooG;83`hu~PzK5ix-X235QZzI_Zg1Zc9qx@$k8~T#ats`{2*}taT&EX z>Wa!UN(5N$^zdWLM->`c0)~I+RLnGtbv|sZ)h_N37Tn;F27K<0?cRAP9%Cq8Je&a4 zOJdoAyi@3d0Wq^R@ps)|qEDYF8D2uJ;Zm#S~4eVnd9Y z*64UsEy>!5c6(VSzQE)rt;%;p6alpYXMNHJqG~j@>aAlVBpRunV-!blQdixzwrr_| z2UTWsNAY1_D{T$U@qY7kUgiBKk4Qb#TESA+-8ZE0%1n8bVUTts`F5R?dG&?tn_BGA zq!_pLW|os7e<6==HEWE|-qawP=z(=&U|$rwa!5%sR9Bwv9Ig>ScSVMbq_^k+LO1Wb znPNwks+a|Pr7S{_V9UDn1sQppiH^C7NRu?44JuEp?%Wr2?d;Dg;`gKAK3(kSWlQuT z?fex!clcc}hTB>3!YLHbyh8CIjv-L}l59LGanoVM9}1oyCo_eKCd;)sgULt%5gB(e zCkHb_m;ym55?@R>6vL?Fz)bOLAVmffM~k5x`_Bdxm!qNO;Bxo8S(LuO`GP0`gDkQi zX)~Az+6d)i(5MBDxh=PYjCICvJ5Mw7B7{J_2-9Ae(!dl3VNAaS_sBkwgRh1}Viu!5 z@I*p8qFG-LApBB2Cp1v)59OM0XcFAr91`tw$VjAiDHxs<6vua%#GV#ruqYNi)aq|waI*gZ%m#( zoz#QeVPIiUOLhRrJwlgGlYHgeaz-Iw9>L?DPMH^fvnSkZvcLAoYa{pr>yG%ef8gzE zNvGwA-UaWuA8x-R{%ZnXa2C=hDHaeA;6LXX{#jxw=4oc)_Fr$zQZ>8`@zk*Y z$TdyavoD3(C$&*g(URLO&WKIzq>)Og;Eb=>E@l<2PTa6+tzU(1Y!E=f007iQcqC|| zVzuo;=Ma&BMHnNvw;%lXgP;y~uQRgj&0BWx0aw|ty|2BuZ+>GwAHQ4>1z-$&Q67%y z{I`(@bV2|>bN#o`MX?be3is``I>+MM!5!-f9S{%kJuQ&XI~XFR@t%(KgjA0V!MXP6 zhI~vp$%cH6pFT`I`x|_T0ud))MVcOrGX2N`vEO$Yh9p4WGJFXWu7{YXAQ)-(Ak91h zff2_%ltW`*o@9X%BT-|aU#LPkaSBnn@l#hS%pa~m`N)KEZ}*{hc!{|mrY~9o{FuWV zoLB?N4`04O22lIaz`j(043KxJKz-Cx3h(!=L|viRmk(dza0+UN*>7o*?`?#8&_$Sg z=;V8_haYc2881Ub{-K1B_o$z&f%#MwdyBaE*f-ZW_~-a|>wMhX?LL;CjujT3rm{j6 zx6F3+tBK3XsQ5}#vLzJkRGN!+C5vfkP41QxF?EJ!d4YAamhlq8-zSQvSLv%EGQt}O;XAM|=fx{FCehWNrz_;|n%gO|#fYO~da6=*b1GV&TxCgKXWxo7IN z_cya77r&_^Sd3hu=n!s}rqTTHr!|+bX(%Vf3tham6-HW}vKx8LOJ2w*&}uGOrhmji zt3*>i$N80sQ#6~DKVG+a{Y|8i$DkpuTrtVwxMmVGw~@)lg?kD99GQ7nN7L})<>UK! z)(ju47+kX(KG$?JASp#OEgN-n5sj1Kjm=2gF3f~3+z|_!X$>bXbgLUE1j(7?pj3vw z^aVdfZ*4_7H}Px`2@*DP%e&6|V)EM*8?%t3!0H_x;p(#8TrOu**-MgS;TdBgF_|qSUk`GMT{M>#swfz)61GyNvEFw|3AiVzDJpAMkod%a{HQ1Rn9Q zLDU5Y%2}nAW^lC{k;s0fMq3Tdh>&L4{8iP~wSWd-XHB^o1NY^utm&OMc76wf|T z2>Ac3P&iA&L=66!+C!^4zxXMvyjs7NfZ8pS&A``1j+VSkLr0QH+qGtfg>k)9_Q7^9 z$pTL9G+&;HDq2z&iGY*nC`xU~nI{b1dL;IXuvk1gYcR%fy$xICsWa)WGtsbTjh)bL zyUX~c%08cqvEWCFOH__dO-VDATe?ktg(B4%!wi*OnsVd2 z^`?>)Z*2ZU+OIfZeoc0N_*y@^lbBk6MGqmG4 zc2c2f1Cq~ z3wdz9>AU}oZ#jbfQDOfk$7K`qW=*_eXP)SYO?zs(>mwP+8cl(>?H+h`Ku>%7O^Ezy zz*~OkHH$W2*dBG-dQ*b+`TO11Nv9<$rh%Se`m|1#1Ur54#bWvwBaN0CT4`wJjuKFY zN{}=z-vj;a{7lRB0`sl4hq4L!l~kmm0Z*Y)sxmJNqPV|<#@(CKQq(PIbSyc3+$nu* zLtYWJGh3%PM{9UCOe~$Q3!NQ|O{M4eY;ddG^+BQ(Uv0!IdD6sP2Lbytl?elS89eC< z0fF=doDXNRyIivUq)n|Kyvmc+$f?F8Sg$jBJIwb~@AE~cF_!#DJvDIYU_F>xsWQwR zI^$-4y}LsJn9>&xYBz(|z8O%p{*i&m-dD6FDvZF&c=7}(qScs!A;{i6Yz4cQg;Pw^Ayas zyr^?8^W!gAE$xJd7a3`87Lirmr(DZZwM2LjG#MO}w$w3yBc>Q8W}TPft-6>IezJHN zl}4GC_2?M)QaYZ%Sh2l)@S7vF?~htABvHOLlMK}qRp`}Zg8O+I$$0NGh(#XWr->2| z?=uyt{&A6dF-d#(SrO;XErZ?Lm-IFMezl6gaHqV;L>xgb1z?)ff|!{?Q(6@2+%N|O zGm~b3LuOdOXd3RR<}8aKi)-9ej>@{pWkRNViYhvb$B*})fWrbXLcUWooMQRI(7)6BV`W#hQ2 zzF|YjWkbnhV`S_ujZvLDqLMozp6wLd+_tJ^)3la_SZGu{7fyOOut4It{9(TEu>R$0 z0)I2er+Es}__qe#J}~}rg%iJ(Gek)MmGXeLE++(Pmb?|YcU_c|eQ4OL1Nc-$oU&9m z(8r0m>8uTyH)MW0`nUrwU4=kM7)6CWrJ21ViZ2^Yf;QQUo4GfnAGH$ zL)M47{HwbUJkq*I;j@-4XK<+tXRcPaKZeEh;WW0ko4OGKywb6I*;!<*vYTiJb#D|i zm)IQh#_=zB={>wzbC6tA=v*0iEn7IdLnLTB_sU1xi%;GQko2wu5sX~41u^8Eui8R7 zGx-{BaYG<+D$ytGO@>Wl-x+Xo3>8>n+zU%GprXT}ovw_Om??L(0`%s?! zuB!P=o9##Zn|Ed|1J5_=xr3(d0~@E@XsIM|nRMt@?oCMc-<#SOnJ*!)n5KJd!w=eN zcW#{^Db5)T-AMXkPv}1Ge5A_8bNV4`54H*BdyOK+XyfVc?E74`YqUfB zg(CVl97VGs7rdnCqvo)?a4wZ1^D@y;uf@IXQFbs(aGN%*d0_2COX%W++oU? zIuvTv*U;Fk9+!Sc=XP$hFL;0&S20&y3yTE3c3F#R%(kT0^LGR!s>^5)b*ABO_D9^Y zkxgE0_6!6X8crtJy$g=xZU~lYDgf`3JE)FIqZ zN6`L2$gVF~sBl0P4kUuWEXGdzMb-5pY9JHFBIcU-TX$xnpWU9RZeA(uCmWQkhAoKK zC2;V{?xSXMkgtWyT%wZ8x_aD9opo`)nz}l3ZP5z;>_(Wn>U96;a=(F-<9oO*09uZS zqH5lwL&LdcYU|XdtC7EzL<2+C_EV$eI2ft;aEsdPQXRUmYaw`kx$^+Cl~*9E8^0BG zcdH3!-Kt+}(_C~BhIC(X%YiPhGu`nkh`%fliFJTGpE0nc=m07q zM0HVIGSn}gL8gLNakaT{n? zNkTGXGd&4agun(1mOI69E1K~;kMOz!py4!BH+xcF3WM{hsM3sv2PDOXtMjewlFl*G z1$}rj4yo)?L|5Uo9zjCwSddE=D=yI(xn~&0*N!dO$#bMEl+ju?n2#s(0>nSbxuJm3 zlN_Xi%K$e@?J#%cWY{6DLZ&(LzMY3fKz9O9Z?m@l1A@y_ZiMzjSyX@j#ZX%7HA?~u zL#2Hljalz|Je%lIV`OH9TfczaHHeA?rUY|RC}x$!KIU6$?|!6B*4<{4cMZXC|Ta2dsJ_6;ChB`LLIepcipHgW=(NE zW2j5_o?ik1KlbII|5WbLzfdPw91C8}ClqYGwE}wfZm_?|A{OHN@Ngw}R&eOo%D41z zpToYO$sVmWO3O#;kr>klwOc$`F==lMmVS;7iUSY!8ISwS4O?t7b#g7DS_u+{k!Y+$ zcYh{=>G-Q4?o}$yB_eRJa&)CyqR<3s^vaD(Af}utGEB$wjXLC!_+(H+1!X8AOK+7} z6@oU@MXU8&QCNY8*1ij(4aLhEwx!BNsR@UXNs6QqkF(Z^gQ6r+uWsr%6j^V)mR)ghP6mA5>fcsv0XMe;hWr%}1R~qJ=AGV?p zYpsrwvdbn?neu#q&b8M$B&=u~dqsrKEcY~G8~T9#D9s*~-v0K=vMso<^z1Nmrw5PD zyWs2;UB7t1M329eP!$%pn2OXwSEvc7$%Kj)6;p)Ltz>mKX5YbFyNA9kGwfb=iw4s$ za+x!v#%8R%tXAjUs=J2(8_F^Stxgv!7~St5Z!O|8r4K1hT%xMb&85Rg8LsZWr4TT7 z$AEC;?og_7@sveuKC2pxL6~q~=*T#dqiMLBI`ep~yTup5ID)4P(qShztWjm$g6EMl zRq@gCGgwufB?{@RA65!lh~k;)Y!9YA*?;KZo&bZxr*Z7Kp(B%*h8IDboP?1Byt*5k zHfHZyJ2B-^G^Efj);^s(7%d_XyGf@MND_|)PB}k77pyR-asN?8)R%Ue z%oY10`7Kabj|g)CYlNC7zm<@)$vOK( zQS(k(fNv_~_SJnxwYxu%fCMQlt=^brGOM5gByQv3-hw-DAe(*blV@u<)#{h>hhQf& zp2O8U!z*FIz~<-tEw-KOw8xf9+A&<2{czs3-UpDXK1lPoTcXgf9JX+GdIuQAz7K_E zje{?P<Kov(I^&O_B z^-UBvKJm5!w^z(PC#Pf#`W}(+E2+>uAwhD1x;W?a0r+5O6Tt{0fTPQYx63A8iilHN z$_yCVxXGRZFF0qO?QSlaxP^J~0#ufXxWtMRcx7}se$UbBJ}u4-$XWbYp?6P%)PjC$%@CiaH#vFf>3S2pq< zu7>-H)hC$I{bSe&Rg9W(RgNg$QmPX?ZmN3$ zENsR0=GZAkb>=hP6ldxE$9cn0+V;^*n!sA~s~!mDqzraNH%L}Enya(iVOJ<_%baRy z%TU_R%gHLTJKEP4^#M$Ny8YmgS3;z3XokyQ;6udu72&{>+@zi3%8(>R^D8=q%I83t}d*K2|7{!(=0BoH5tRJB#g^fM+#~S zYv}GF?E&46o|g?>ou|Afqu!*=vwibp)=%`cSz|j>H(O6NhBM%ADDPDH$D}mhRHO@& zq=&GJ9Z9@#ic@Oz7F!ssU77Wt88nKb;1XxWrEE*C>Lr`@!Q6=UsG+=(64VhJQt{pD z@Cv?P+g)v&me75yB2q{i?rfDh#V2KanB&IspUH>mQ)IX!= z|3zKPQnPf$Swh=d!PW@pk-+`-O(6u7fslGt5*F&atRM=vp8z9~?EbKf*6=)G40E=E z7zueELT+b2$t-YDsw)AanG}v@B}XA#j7wGZlFy}>514PRF+r5kMEyS5FHOGZZRV5g zh8xb`e2+7qUJm%ZqVL{V?e^+}uEJhwgU`Y|g#Dp;5Qa!bhM~k5{#Zh=hD>hq9& zP-8;h<}iH%Mhx7v_apbiD6%8>DbKPI?;0n4$wV7xL~pf0$w}OF^SsAvxvkkPR|{14 zWGC3rRE@|YDM_r`%(0#+8^dI#sop@6OYAhP4>b%)cO0@nvU%CZ7(X8Uy#q5FB`52v zA99oE-2tnVPR82wIn$n^(`*Z3yan<_~t}ibVLJ4RGW+ z_{IJSCqb&dn^Z0~@~39##<=M9_ z+=gx@L(XG)bBD>tCmch?5I50rhuK>iEVZQcO2u!`Z@C8y0oJGyWUMP+_sOTDv|B_? zX_P(dE9$x#ed`(2KICP?Hw~PrwDB>Se!FD_s- z_V5}EBVW7JH)|Q`Kd1g_op9VO;qn1sI9v6p;^EXPh}DE@*;Pc#tX3YdZB`c`(9fxP zQ{d4Xw)7`O1+A&nUuK@2y>RNz-NAH@d;Dq@bCRBDMW{J*!?QhgQySFD_r$rO2=asm zoLsyVmHGz%WY(-QaB7$3`5+5$b?yvN;@Td8Kzdglxw-YkBiKja`V+c<dj zaFL4i!}#(+Ji_Mhy<9s* zdnGT@BPTC{BRhjfel+cdl=ulUQLM`94Ms>%4nE_!=BU-(cDMmk9>seZAcxug$;A*N z3$)#4w!!iBBPk~`zBNR(!27}+_)KI|qU+NHCi@$EKIgJ*oUG_&<(<2Or8nSI!50Zr zvQ@(eB~w)Ji;`;o6L6arXds!?VU8#2b4^m+Z7a7UX_zD#tPwn>?6-we+V@cFMqj3z z#S~Q9P4(W5WsdIZfe1{tTZI`oH z2uqy$8(?m|KcP{_$L*F0aB6b_kFT@Uh|SJ#TM*~jxXvv{?*pPW z1T#V#-)FCTAkBVFwxz;p!qjR2KYr}kCVQy0=r~{>!NNoj5nmC}Q7*}@(#GqLS8CRwcr~fh@EU8O}CLP}$Fm7mlcVb}v zgH60nX_j||w~(qn|B2@KC!~EsotK!;)ZTcB!3XV!Qc+S|t_qeK#7+-U`*p)9WFEI& zvq>Sq1bqeeZb37+N>h*GT2eS)biiqottF=l`=;h~tw#4y%Zv4W zEhzzHP@=|QbOJ95>3Aa9_BFT!nTSuxKKa|cAH4)BJj{UkQbe!SG{@g`j;j+r7`{NA zLlvBpdR34Jax#yTxHI0Jj|yZj)~us3$~g=>r{Ouosv4a&$ge(|<^?MUx)LIXt83E|7^&!8N2wNiMYnr3M9e0R!}vW5TjfK}-rWx+els4suRtz;nGwx8ye%@qYv#!%H*TvJ zy_gn>{3DL+qeqb7qY3D9m6%^3^UVzBZ7{-7sFYHQJY}!7Pk-{v|^H*tte*qRg`%&t5mh#G2Ss2PcpVH zkyIz?U!$LYZy$K(oOqs0B>Cp}g7vz*D;XOG*Me})ZPH_F86QyCsT|r%59dRJji_Yy zf>7}VAw(RL7|aAx;rELfdr1$EsIVNMP^I5WpdlP68N4n)<12i*ZK^CeN_XyF0z(*g zq;ovj`Bx*TUK&Gcx2=&iR4?h_Q!gGs+cUx)0k)-Xz&px!w3*7aO48l5k(tQxO3>NL zw|HPXD!05~J8HKeU~*$GdEpB$agim)JR}Dr$bAOX;FUOV z#F9`IqQxV_PcnF6Bk)%RW?BtFddrd}aGGlzHfv}8ja4P}!@c=cC#Uv$n_9T>vxDxc z9FywDLEU=dkTC>HF=rqeTha)FI^2fEZM51=*2A@UE>8BA!;`I^-y?-<4h}ROS0vj_ zzQ2f7p>DB9nMxZH_b^zlLOiZjV#FpbHZZqmAw9&;-b|aOj>!DNy=g+9sw^tOe1?;l z$ebvAXs%=G+lIoSj5f}@w#kSnqp$h#R{uM#FQ z=CB#2S+l8JO3Jr04r+GbNpNRRaZU3O`kCwe!*S4U zWyOtjLYjm!;0XRF;G)X-BUPgcpNwP7OVu^%?1+N2GRkGCAWqV6{83>DfHfcuRb4|R zD=9^rR0O?2QzAYad!!5#a&^cPHB{A^#UfnpE|!cnOMhv$8etFDa=?oXV9eK7W^pyl z49jxe()N{=7Xqa}D8cptn37($!B^S*`E*rl^^zUNf}1%2!=ks~hzJ0XW-c&9L1EFG zbHuZgakzXG*=#KewQ6Ud)FNx5N06gB}n@nxf`A}(vMsq+5XL~?}Rs+JIU)F$KL1WvF z&)rO4GX0>H)Lw2D4r{O=V45vY>F(>uzo2N^1cFo_JW7)JmLxKaWJI(4Ia& z@5-55hANPh{^VpVP~{bc*86jEk`0Tflt5=&ri!1na@8tcnZ{xv&U<-X@ zI}C_Tj~$#7f4^fkM2oYh%Ay-W|IT}lgNBb$_s99KZ`W%P-c}SbT?J)+Yj{a zBuM@cPw^?&d*{~>AjBE;mF8n&_H)%o zb1@)si9@*|lk8|?8l6LIv%`to83@{r26fL%KzWXXgKv8wTzi33dZp0kkTBs9vEdP7 z$sq-zmp|Y!u2FOeu3w?>46JW~0szs9#Z=s4n%Kp@N5;=Q&&Np9-<0GCfx2aOATWm` z9);ZUjjMc9#X7DqPOVASd)lMr6N-+7$8&=sFsk&)zLJ?F9_vmA_1aBTrxDMsT}c!F zbZgB}?k3+Ha3S8DaG52zM$sYMq;J=A<9Bj+Nj5n$wvuC!uOQ04eI7*d7bnby6b-lw z!i_tCDq_zzgMX?cvfe+rjXoJKySc@kp1tdm767K@+4jJ9hCygc8o4|m5)Lm8_fLYy z-95)u>XYMjUf3S8(g!~7ilD5v1(5uxirl661a4#%E)`AP=0ne}OwlDk@8pmcq?L?_ znY{r@M|)cr=w15!4_!fy6+|Wfr6**+UVnk>|B1w>b^Rx+k@g>?db=+y4xQcqVYw?! zPsveENvMcR$V^O5(2Pya94Nw5%Bb8<&?_;ps4>*mGBGqWv8dX)z$q{=F|Zs_QH;+> z%Ft0Z%g{?ok4Y@aOphH>QB6^gP0BPK0soCApz+1~*0UR$o&NeD*k7{u>pT<4z}ei& zh}OZ_(AeD0>2IHcRZhTWfDp0sA&JTi!_bhR^-#5JoK&F(4G<+{)C+9&>(x2k$d;MA zftkD7$EAcdGSOK&ZuNzbj!(Xfj7AfvIkc4Dpa0jl-wYXox4#z76kMW|gb-8%66VLN zRi>YS^3lriJk1CB;dIw%ldxq7ugrw_j1NrqDdi?p99g8=ippzD=mxJ%n0FE*RYVF&SaaWrR!+NS2<+@b$I-&!mMfz4woK2LGB>U}$CjZ^H-vdVB2XV=~VdY)k12 zw#E40-!5SAS3=y-NyygP`U^`aZEj=y#o%=L0`vb@Ry;{r=ZnIR$_oM$LERi`U9~fd za8%&5!Ivf|4moEgSdKJ5IAV;oVy%|~D^%dyzmreTGB-%D8^g4%5i6hE_^5xf&FOj5 z=6Jll^~2Zq54c?@2?*5X=_)H?U-UP;nWSeycTPNaJTN>FfZNb7Z4Kkl|Jp$pju+yl5UBYW;E)VmT@;g-%_`CvTp~15w+_yF$t@ZGWdei zznQ|^h(Xu8&i!Y5H~Vbeh+V}QS2k%#K=q}bIa~fXgcAW()j@5z1!lXTbSaGJ0s(YJ zkBbUHgW50apGy+`z1Dz9=anR3sNWK)9OC=<@L1vOsfd8ZPBOq1sc`Vbr0`M@^QFC< zY=$6Q9@6_Emw=FqQ}CFyvD ziHpGq%|?|ZF$-3-4_e)Zyt`R|rZy6AhpJrgAt_bHJdvfMw9VSC?d_103(8k=^9xC= zn2v+uU?V@l9Qlzx{G<4V{LnIpXQ+YS1CU*pGNh{4@^{GAUrUkcr*Ta2*AhJadi_U6 z_pg=vw4O|1VoMI8xxRVHhHxW=)zfE=TR5mO?Y~sGuT!D1$DgwC2DPzwGFE z{6dhGwA=0Y9)1v*Y+ro10gobvKne*5om$y6?^;)-){e?-Na|c$PLZ4AZ8($M#DBG; zf>>%7=e=7?i9{wrMRiG~l{9D(f=l}+?ny}ep{|+@Q%O$IctmG$f)YAm2St1NB!!>i z66c&CUZ$sDJHU}%;Fz8{Z&B}Xzi89E{-aVU3PRzPer>zwF9VwAzi+$${#|9v9UaYW zOy%tUYRm;3Ouz1HI2r#dh>@ftx1fhQ@;SrSUUgxVOW4hXk=R9O80zOo7C_G^%hIP8 zpoUPH#=506kG@0Sc{hynL8vR9Pjc6fup7dZT|(=KBQ=~%cEu_8#Rgqz{09dwHwX=l z@la(@AvA%7bg6<0IW^f-gmOxl5od@Md}!SnPD+?@gyC^DA;)fG?g}oYgDdcfA972V zx$WQ-en5MzzGA3+in>^LlQC*PU8TZaff7gX`GYK)KbdkooCx+AeL%38fZry8sNO_{ zB1gcywOegt`KrWgqcCBwzG+}e#s)_b0iNU&C!X%46=+CuL z_k4=>nTd^H@)$JHd=eTURJ>=a5g3AkgTY*=4aLEp-s=RAMv4hkzW#X%)h|y$XP$i8 z<_AbWyD&)O8*=y*7y=wyh057)b(B){P3n2+BhQ-*YKmb}h_PnG<=C-CqLbdF_$+|1JcK;u_(T&A4Lf-Q?9Ha7dUIbaTqafy%|Ji>{bQ zg3T5Il^?=53wN`+K_4pmTJ2N7MF%i*T-cjQ0Z$8s%V80wefrzsfdrRvCEi%K%Hh*p z;jr0_0g;m?6(WvdFyQ;yfhY^2MsvbtG2p?gr|1eTyHqA|lP#tMQZY{o%q zhV+U;tq*#Sq1rDp&-^G%_4Kzy{$IPjvr>lXFX(gN*Mo=mf3pMrx%8F3+$kH=ul-@C z|3!iRuTd~r$}?XOXw*L@?Z*1ndG`f+O#zyD@S>u?z^$JK!*~;RfHtyD66{K}!n`r|pdAZugrF+wI4Z8TuU{)Vs-E#A7&2i@Ca7 z!#O_yX;Ug!vP!y@!bo_u3c#QCY*a6UC^_ec-t4%|mH}p&_=v|6PqpSYjzSY9lcv38 zKObVY@^6Y#u#kCE@tZ8rdFLk(Ij*RBPcLE~q*i<(gB5$48Y`Hc7RVM2`!2xRt?*X! zWIC-(KR!%Jb$SgQrogojkn%Hpo}{o`|f!{%~O~&iKu7=6EXSX_v=u6d(h@55EkIc zcmPR2DXjh%efbps`Y{1%OMCEYvEp#|#-qhDOqmVq){>0`o+P2a5wKicwPE0%`_E|O zJ*|#tTh4CS!?Gn_`~`2s@`D0UvRD&wos+3r`vLQI#Y$TA0XO<4O#G)FsC3K?2kbum z7l0YI$y-(*6R%*P=sr5H2AnpOREPe0nvuCC;?GvlPigoO$SM%3Q6=%X95WC*oCA4B zk$d5gA4H<|dL?#W_XfVTKOt#adEVV@wI}liGUjEGOlz$<9%U0%H+2hoPS7FIBYNa6 znS15@5$Y9VoE(WgI!HZ28GVpIeMMDuC;Q&GY=e!Yxc$9YFrK?r2%p@cVsw{oZh|<( z^U%Buk2pIjw5L!y(#j$47VnMtgN|YK{Ph>JwO)xvJcVq?RD5EFDg!I4!k$b$Pkh3! zWace!C+Oiaz36*J9{9V4R2XY~LnCHX0>N(uhrEOli-cQx-{fLn!Tw#7osz)ai+yQQ zsjv0^KZvZqRr{~X?ri-v=jdw+hVeg2{Xa{5Qrwgz2qS8++#7R2Q?sTu^?CnwqYA`I zQb1?`Lu+l(Zzt^HxHMrV=5xz7s@B_YUKETHQfRaR8k>jNo4>bE?*H7qf$zdjAw#b+ z>2HW^i3Ij?o&=Qe2E66@$`O=dC?I)!DBB~s!~j5pr8rGMRdQflGKNTs!JSaei;gG! zM1{&*$4(50vTlQR2UDmX1w}@X9s)u=Q<$R5FmXnMp&L@e9?v=T5GYgfrFMsDB+Sgp zdbAN6Q`~+R!;(qzrM)iOG3ILIOZ+NA11;*FRPL>AyW4o1SS|aOs1Rf*7@YeMqlR?p zGu1O8JZ{+BDh%WP0b_E+KM9Jbll99fd!b|DT3SH&@*_N&w1Um~2wwG98Dqu#TY3=( zg`o~JYz33))+v^ISI5=#9co)nE$>#Ntv*CUJ=kQ{z+_oCoTdGO%L?D$4D!D!&<_l= z&yg>vXUG?S?0;2(q-?&%aQ(9k{ZoPb?IFCSZs~@4gyz#@l%PQd0tg23S1n18HF8Aw z7BSmMlwSzo$B~X~T-SG%24`p9NLvHF9Fo+!+R~k6Q}wKaT=(#oL>BB^)UD0`wVW^a z`Q-k__esV>*3D+Oi+b56VgsC()&IA8=l|2 zRE9mgcq2WHtp>cAzHmABV=YEsAw>QD8^9g!@a9kdn*)f>clrL9mlqC#AA|>(_=&fM zSkATmFHpYZ?(P(kIrq={STVb%(!U>|-+`Z{UPvq4mHTVH+;aKKLQC~yKTDkB(4d5% zwUppI>l*WO7db&k+$|)ttA@+CWhAW#^2cTMezU8(;b9i$ZPU~@pD7oo4zdj25dO9r zf!*^jC;^YK4pN2~y561gU;}1Y(WE`AT8dqGt2YWbCef_o<}!^3o3pl5;Y)IocSw_c z73&dp*fQUM{h8H}AESYV%{W;fD@?TO+wUNg=tl78YXkf1(!Iq-oj=FjVA5R+3~(({ zyMo^K_r{`mttS!O9`4gtn5dAy)a~z=(WK{du(=C2AR2|B`i0*rQoL$+VPuU{cYj-u24POJ`>-N80I1=n1@~ zD{lcTDhc|=Gi%-YBN4t)M5q`T{@tBVgforI_ARNscoOT*#)tX733Od9_qB0vJtzYT zJrLFL=reZA%;SrDGffUN=%-w@KDgGnJaW+G$&mVu=B9#8)0fi~XqP;(K2<9D(2*%9F0~KUs^ujvXN%2wyro9%rKRgdl_})~ ztR2A*d%lBbJg&--(fXZT3AP(bFu4OP|E#Uz@)**s0xULXLC3{H>nI$1-s)}rH47`G zC0b-zYL37is#Y*|YBzKt=xGD-{>0wqe7YS=4tV3F98RaBTwi6h!G@`Y?@c>zgaE44 zK2E3x=xIaQK1Vmv{s(B?-Uw))k-pRQ49QmTB@5B^0@>5%ZlhQFy=UYgb2K4#oR`b0XZYJG@?suSZvFW7#qf)uou@3OuJr>uan6)s^#W3MDMoC^TUOqdfs z7GuzR`?v3RF`2O}uA9@ASYa-dF4)rFisD^rsXISfp}BdKLwDKI@Z@EXT$h$qr0Aw> zVgY6~dAj|$s{p!Lki4Q>VL_~M?lGrz$*`vE7_Y`C13e|ZeWV;DpLe?DAk>ZO(yp25 zPt$A`YrIm+NmxM8ZVr1z_qur4Fk|LtC6CR((e!^BkD|aLczcz*qwO)yHal6snW7EY zFe4k|-T?1;E{0^KXM9O$o3%)hh>vDR45m@&ab7gWL#4;Jn?m3j+osmuLOzQ2qx*NS zd&S{aZG2_|Mjx>z8M->hOr{12Vb7}3&rhVVr2d!#7F%*mn?xBmBY`c+(&uDFK8}5T zc5x={hTlH&(KzJ@T&kQJG?aQ#9kkgeomCQE)FPh^F0+`CP1>c)3pca}vp!Uz5&!VadS3ptc+!4pn(hshS6&?=cJSmlNrwGZ`(Btt%~&i7XAESK=Bq)sDKAjJ*6YroPp(7F3*67KEJ95&V(7{bm`?*LIl z?tslgLdp$WC85;ByFs0tAuP#J{m10=mK~ScFRJctz48b7A;)a4Aq>>gFTM!4Bo|Ln zuGx!Z_T(s~X{Q@y#E;Cq9#ZQ3wop7XOzx0WwM2TC0!(Tw-*7TY6dcb#d|wSL=yL;e z;~iIdLbxPH-oyu3@@cHGqvFU2Oaudp1v+W}bUUM4Ye2IVqBTB0$b?oOEdKudE}xCi z?~Do_3ZqVokY?qOl3C097tV3t1;q{~g|- zv97F*OIe2v#NI?8mEf-N`tFQLqih#(spU3TU0xr0Um%!rHV|6LE<{ZqHcD^t0s>I7 z$G~?^s=?X3hglsQ8ME+=Li7jc64Tfl%BF;#YCv6Xr^f%&oEtDAc>i}g>0b%~*Al&M z>Pxe2e0AyU|N9>0Kf9A86>GT#c~l>pl{p12Ok1T}Fkx66TVp>$Sfoq?bPR?xqB}#Z zDVj6Qd6&VQJ%qi8pS|J+FPAaI*&A$*wUT>6o-@2BoHK3DosGWLJ|E!nz0r{@$3~C$ zY6xEmyHUhC3PY#~WL-)1xVZh_sJasB2e-~pB2YNUy39`2n8|zAOy3<|y}|2@2+m=> z(FW#SGonDYUMulZ3$aR9S*JEva073IicY;*wE>gcb*8JTV>Y;!(Z_4>fr`yETa;<( z7w19h<*TwfRov@&WfiOo@=zPIl|uN(3CFGN%pgH_h3a9T`qw$T^lbJ;J-|k?z z#qP=5>4>hTT}qdSUK3aaT!7s+8!ZeJ`yT-p(HjR zII|5Ry-H3E4!(z_S#xbQ+&U4A33iIh&1mPFCTBBKl*FmwBKTG5nM)&bJ`_pB2f@Bz z1`k>`LhDbfJ5ASr%N0re-jBP6GWz?)eDdXj27i`Iz+GC2vOaMQqmej)I7;$Iy~3M7 znflP_&wuZ14h@#b_r7+B&6ke;Yi#dd({umkHvg@&`Il#>Vq^LLqoTW1CKSK=cwXMI z@A^#qkcfA|p%i0?kb8N=p~OW+DyW*l^?EDcl@3mg0O`_+KW~3(i=)L*Vfgrc?hdc? zN8zxy*LL!zK_dy0+V352UvE5Tc6(n>9e&)j+yEWgYYD&}Kyxw72~=bEBe_nrcaQYi=OX3z!F_!!;U4HzJtwZY_d66W?Qa<;|;-tr~~#2Ci&#*qH_r2z!uoL zM8J8yGwV17Jcmq|vHB-u)dRq9i3+coo^R)^ckNmA;O{&o{Q?V?CL&%vzx=4*fD!=&wsGgy1Q)K);ID}O6#Ul>K9{)YJOXoSk4UB zn!QQO|0px$MA?s`@|Yu^>14;ZRn4%zAhT^}uB294X5{6RNTXOkPWO%?0GBS z|DyvX_88NQ|MI`m;DG*fti*pf-v8`6|K<0pYB?^bBK}FloTw8)h8^6)C-gH!*+d6U zER=_A;TQKSln}}lsZ$YCj?>mSp8wtT0n_GU=zWco(_CbaG&rfRfS zFIAinHl4kcy=Cj#!+THQ`}v0BmvU!~%gsP)$Q8{d?X1VWecB6a68u=~Hc4s+@&L6t zNPFidHM{|}37|3*5ao-WJ}(Q1Wg+S!Da?1H8O|NC6QkIP>O(9iwO>X>kP?*`_Cz+S zI6O_(NSbjj~F0#7gV@1 zFqUA>I)fm^Uq`IPW?ghhBg?>cCc(02QkWfg*K+L>7YA%9Y0OGCC#waIRa#^$N`_vT zbl3A|t%|clwwq}s%~xL2NOEjKuGdGj-M~S-6`woqhOx z)0VGR8mY%(-KROf?9aw9tgOk4krI^iwrlPMnWc$A$D6EPQ(Yv|UCbO)0k#%L2%>1L zQCK0iGEkt+d1@umr@$kg?$tbZ;Bk_TwUiP2yqLp=lgZ>lGjBUPE(V^ zke-Q_pzVyZQ$a2ixYN9ARztyAZ4GOlH1e|fK*f=1D5IaM(zGI0dissp93jUgOn8pCruCSxt?;P=drityM$Kr zjp%#%nz}})VBB?5q8k2zUC>XVVxneL(AWFfk-wqw^`!fLzwisX8p;`YmF|*wO~Nm0 z$6OdUb1&s@KtJjC1jyZ%1%L>?!RACr>Y7mF*-CZ5xiq;RY9^oVnS{q%*1kXWe2v)!$U{l&KpI1fU#adt7SpA z4C2(z^FvOi-4V$4c(tPpG~JtvhR-l5vU}`3k%f;KH?cOoakk(%kI=@ZQsWPS?+?t& zyaJ8IaSha=60Ht)V0g&*1~|d3gAZY0lk}mm)%@lImj%9m-om!m;|?4V47{!jKT+Ff zBk+&wGt>cLM?6K0nw`QCu(W`<-J7%zp0wi(HM`W8P-rm*(AIfbT+(~PM6_y^Df=Ha zYLr>IDHf`n*FjTU->&K`V;v(X5`S;zs*qoF0;!ObEOr4BvJ)(|!5}#k(30FPPtaVK zKzK6kb$%&Nc~#c0q+zS(ojuoOI}CJAmq0p3V(Tx&t%VL+HzX#lqLmu0cB1 z_@gt-sZH*FY!}xfNDnq%;|?`s7vXZE4V*awM&G2=r|S|@&fKRf+k9G-O0{=M{Hp2f z(ogNe?ilGH+Z}@I9wh!d22MBwda+}p=DFzDXSIbu^Civt{KVnmFh1|_IBjzZeGKn5 zUh20r_C5bt+9*n);Iz#`8g?(qZ?|D@e6SMwH4bmhgfoz87CfD{yV`9BC-O~Cqj|@C zcQgqo^3K-gdkbU(6R-`6Rx1ef`p|yU=_*NRmJTgEgaLlv9|-Sq+z_vq@2qojCh@0L93ZdWb-&J3X=hd%OV2^>f?#8ec*C zICmV^fLA5O;;|^~R2w{RBG&QtW0}e`nN$zjFGCT{z;1cKUjDk*;f_0^JsLP|K@s$Y z67_UQzxLgsO46j4IF7=R()Y;Q+5sTI*16HuK>Jn@b0wqlpAeZS%{zYAp`u19%I*W) zRVc^QubIHXduDGc45+#~?N>bEba1cE*eRIf31a#bGQ@499{qHeDZz%O#A>|lU_nNV zCQrV7uM+-&Yl%kQpZ*A_C!(M)FOaQ`Y&3mXT`kX`gQy4Uk#xy>Hr;$TzJwp*B z{o*`Ps&&c9RVD9m76{|Ur&jvYzv9Sg5Pism^`HL3>eq6!Nlp9`!y`!l<0Jha|G3fL zWbwcJeYG`T95u8*q8p?0!gVSm(OYCH3mnPDoPh7MZeeZp4uYrtZ|;I(pLC=oBL_PJbIrdoPjBpV0?scRng+ zon*2;tYI~K_3A!4Kwd(_7xtZT{0QA?gBfm8r(RM#-L&|&V=vJ`S0-!AG6fDs?#sP^4qcN;bF<7SyEFyNM|HPeF`|;X8{Gm#}?71OKJ8& zNSdozN#V7GFNy3s7Bs<|O4dN0cHuO$^+iXW18ia>PA8WsGizC;cz@1|zDB2uzdTv}lt)gKQdw9Yj_NNggUJs}AaG(*y^A$gD}}tSaA~uUI2i6 zDKTFL&0Sa-tkh^aZZd2)yNxD$`RF$X3%O&1(jh-<)zsJx&esF_oxx{!OWkRUK*13N zf_$y<$z`K)UQejrCw8lVrH0lS=xXex*7r4G4D3fQ0;$pUF*|cJt19Z(EwkO~mKQuR_pM0164WKdsfq%%W7e3EtZKQm?QBWg zVTLPdfsWo&nBOA9bfc|bd>~b{&X5w+cl?T}LpDZoqD(aBIGb#R%z<{-raEQp^y2Gr zDfSx&b%(dfSS^UGDm=zakpl+TuXwd>BUGrt*^~(iPPIzs|k_sIFw|n&9s4?gaPX?jg7)xVyW%yK9i( z?i$>KySo#DLjwQJH<_0ik~eSaKUKHRy;Zl@YCGM1cJE%Bz&*mx{Gx=6*9yD7IBeeu zw1*JV93eFiwv}>!9>boJazt@!e#=FccEdS`L7Q6MT8aSSvx+H&m#|ngIvxU)pJu>k zqVk3P$9uxLAhy!)Ux-NWc*BW?y1iMv8T3zEV_U$eoN#iQG$7ab{dMDYkHNPc7-g#h zbT`3cznQ%zmEN1Hl<87R&x?-ztYV(k6rp@r3nvC{N!%9bMhYv|lAEb5Djuo(U`>0& zORQB@K7j4$Z{xT#)}egb>Xb3&&)Bv1g3{fQc^mI**_uF69N(xD)3zI9$OA)|R%I0q z{ibKDKdd&n#QRq^=`R+m{E{4T z>IxC!e&3!p@4%L|deYjQ>rnD}ekh}3&ua70jCbWBV`yIpmy>i~BoQsis0>ekyqnY` z-N7*(Ro2!hm6iMzI;c?uip9tc<_2l{1JJxP z!!fCj+$z|$#H*d1Lz#9k5D(BLg*l>?I(U<;!766_)=*=82S6iqmv};RiRXSOw0u() zM0%WG(RQhtJcd-81`p+zYryQea(#DtxuH;cbKi`{opo*U4VFyXQTr=eu75zJu@F}a zyYQZR;e}WC*wTKA)L9tE%rZUnHM;9l?AwaPS`-~0nF9HCehLg+3g(yZGK608QPr0k zw;}FaB;O=s+b4tM=1Q>D3m27><>F`Ki1^4wh^|oLUsZpAL==rNxYAsU?qrgBc%uc3 zwk7~3(l5XOv?9dP3VLd}ZXg=3wVGn=!NOR1YBdC{T=OGchH4zSrHk$DN?qC=OdB^5HbO zq?k8C+=+}9L9ifDPm(I+FTcKcq})O+W}Fw^qCGuG=UlsVEU-GGuK>EP(%?tOaWUVm zN)V$8I>B{>TtGpB_7D{Z98&g|R%lMITt+79zz5eVw^W;BA5)j&8tKrJ6uy`r+0Vp8 zj8uQ)QeT*SWVdu4u%i6MhkH>xi-ztto665Sz_Qj%A&^AR)ek5EeQHiH&_BYo z?5b0AI&dgl~zAvE4Sf=zh5?Cz-ROtFoWy* z=mj5P&Ec2f1fgEF#-YeybjpW~_4-n$U@R@gB0hZVgvT#)L=OZ7t=a5@j6ski%*z^R!c!y)^oz^N%BG*BPzoG6N}p1B|~nXA-G0*sfS z027SpuWkC5Cj7Bb7t*ma0E8nmu(UI=H*qxhy)RO}!XFN?%)YQ3R}^ey@K zx`Yvux`L#pf>Spyz|##EEF6;n;XA$7dy`Uc-??9lVV%+9NW*}m2qnAijWz9!@i<-Y zRamXPVEOzC1VoNW{D91dr!5{%(Z10%+j70g$0JZ*ij$f{H#mWY0`|O~J02ECYiGb| zO5&|+f3B4R>6!yX7cWxgD^o^u(Wu?|lW@GbxMtq& z>rjY1h*a%ttk9!<31mNB_Muz^2KaJ^+zbisFj_c*kVBQv^xM|@CNhVFa+_RtySUzP z+c{ZK5}0IBka!en6*KgR+>3YNJ!8@j=L^166-ciFNaaYnnHid}s+IRrkV>xWes22+)=>3^VSTP=y0WvVi zSzI>OXHYsh1xWrw?lkq4d`a#*50#=aWf6&B`O>m8U5gTr6<+hRldDyYB{wU#C08?z zgO2Nzlo4ro^6RawV;;APw%Ns_^Rqgq)vvcrD8ejZa=Vl8_g;5jMR*AY_bRZz(Iq{~ z5*%&kC~%#;n=A@Z+rrJTH__t4I-XtV)=rsaxi(2p>*v}#Q0xqpy?Z6N6~l#g{^8Zw zp6{!d+sxa{>RZGa@SiaWqGn89MNQ3DOp)TBZ87iMfZj=?hDva0b;o&V(vlbr8ij^S zU!AiU4^DZw*Y`2oLo(fr%s{uR>$|X5AG%=G&bEn=9d^!R#%O(b93Vt;32?o9JuAYG8pE*z7G#IeJHJ zjS0_;HUpu@7+h~;_TIu2+O5bULPOq-rNGADq!yc#4>O_{r=?!70-kvp7<{;NR(yI0 zd#;h$zL5D3&Wj?C9_ki zlGgdV57ef0YAq$oX*R}a+5;@qx->1N+=F_G*bZ$AP^rs(?=S!VK;Ntt54JkLdw&Sj2aqeV8IQY^<;Ce;`?JO@akCA8wtBhNLKhu z64Ud!MGsCKhG7Cf)%F<=CEZe?Jz=g8CX1BugVS0bBBSZOfKnOffF0*ojIp z<&B`(?*j+;(}nO3IR^A?JZ&*qNSNaTZ8H%|eP(BLP7PC2Ed&4orW5OOrlRTW7Xzml zw;Ekf$NS^9xNhpj5s~UYkXm?Xk)l?oCiG_rF1{#z#X;UPcpzSHdc?+nw5$+U6;D%b z(22%Kqcq^$;8<55D%S^xTq`{q+^9@N!1U?nMPS&FzMfQu6KP!c@^sq%SDj5IRX$lC<-tdrJV2$nTiCFzAe${O<&yhF9w3xiz0=)rNNc$&( zf>z=7B5Cs7P?1qsJ-Kf%G3_x{EXDA3n@G-))ZWfUk8yz_urJy!&kNRm9I~j~mFCOiC{wDzrDj z0DNr_B4Gce-`TDZkOeFK6q8g?kBLi2Rp@Aff%q^Bhm3OC@cRkz>Gkg1%lVILIIwl% z0F5RG1h2t$w>w_HGYp|uolclv3HkItce@X)(@*h$^L0g;y7#PCKsJ~|zz?zc5o}eE zgAk*1ka@OeY^>MG5BvJ17{b+f<21^KICPL_^}~7kc4RIa0Z(@?l_e@#kKvGC980Bt zl>4H9rBM_iI%>(u#NvtVgG9-;pL9v%7Zv&NT>ZCIf&_@f81 z&FMka!A5vz4ddea-YvM_!<`FcN_p!gFff&}CM^ssFOdmHA65jbr~H104>4JpD9B=c z3K43H79K~bLI8&;z1vYQb3wl$DuiCIAtdDZq}H-8F`;>#VkkO&NJ@vv=LS+7)58&K z4rF>Z4fRkG6Em4oI0~^;i&WL+@V+o7u&t9`W@e6YX-gYbhW@Is=Ty~-H3p(P6yT*N?h$Xp^61S)>30 z)U{2kb$00|t`ACTe6HhkUVhEHMmgw1JQY|d$Fb1HTkFl0_SPwU#30R`{Agd-S<3S+ z?epJ1u>_Rtv&`Q0MWvi{Q~C$COTv3#Waj6g!OsF;DKgj?K-3zV)1Oek<#0xAT(<1P zE?u#?%JyrXz*FWEO^WA2Tf4(Eyismy6WbbG(w7erQfm=drEs)Q$x%fYnA9RvWgIYl zYL#J0pBO#aTwYe4n^h&w4U<&nNZceL-Jhzj{HO!-G;*?Zo?)mjn2f2`HaCLXXU9KV z6NC=ipxUyd)fquohDcChy_#B1C`m>$#Y8dZuD;+B!c5~>wVc{k(0mE3h3k@4pdRPT zhcB_RB896&uwd9Le+B!YVhK%Q0GZ_?u+&?#nij4ZGg{h@7x7dNt`MN!Go9%Ej0F zDC-ahxq3oHL4LmBxD5pFL=B0vEygcORqa@k-A|6eqA$bo1Ho$?dvFH@}zFBuY3ua0|E-@ewY7jxV2Klg`Bu+P)F#vTCHDd@PO1- zzOyL3nB`f|rN~SN-jhv?$~V7ax_CEU`A3c>n#~)4IK*P)S<+`S#-@pGV>LdP)X3O| zq+0DSJY|^6VHJ^y##9k`b_cwduxaV1g%H80B@ig3Y;j@}vb0C}nw3*&u2g53P2;So zLo018o0#W7TY}=`>Vap#l_l??>@$%W`V35&St+J-(P9w)ZP~R6phZ~}g9p)?u zzG?{?i*YoK_;hxZ!x{8p{7lLcqj>xUR_4-r(HPwjTAUJ}@I@8P*I19y4-?F4hfs;G zp*zcg06(bh>0vQrD*HhR6?R51{{n>kB*cRugA43P_g6K!LAwy7nVQs@k#B(3B3L5X zCKP*|>9k}qCeYQTRH8$?mP}|I6qvPS=Ji&`^D1`~$ zKxE`HL}f!p<;!M@b2ldEYD(HUXOgnBA^Q#2whU0=J1p zn==&%Fn4DLykyG&H&NI>x+Fco6&m9UKx-N|ElIr+u(Zrok*t`S%AU&hYnu(q`1WGf z6}iLgj?)#K2O;5tyRwH-;tJP^31Pww^nPQuvqQuZPb^V(=dC;e4@BAx1*51uPgYDB zTTh$!Ba|zn50@PyF;+!F6H$RV5TyBfGma##B*;rTFinUIwQX2k8+z5{y-r<%*l%QM zU@bXKfmJfTIBm7r?X5YR!gWhZCsbchn+OCY(OnGZoIwVciw8eCV(gCJf5Y!NqX+h= z4KB**0!P8ti0O>&^=0tESGV1selP%GxL@ z0WY}KPZBOe_%1?N=Q8*87D#i{pFvW;Xnd=!Eow~~19P7RR!(Al0e0ki&>9$u+I~G@ zo1B|97Ig6PgN+KM*)&i$@-+ulo4-ISTN+HjD0HQ~cyM?J<>0n1gIdVQtoh5P$7RqY zhe;{^+LwfHPCUH}Zari%r^K$_Ir@_$NXucq@;H?5sHoiFDDy@AP^muOF6k0_qcaIT z_pbBg)76oOeTdY)5i#L*wsAa9n4>lnc>W6M0a@)-=qq2jnSK+CI*1J-sh4=IdCYbC z8LBx^vn4x{w<$hd!^`xq72<%6r<)^qYLRf%5yel9Q0m`+jxT9CH?>j8fxEE zJ|y?wNGwz!awY?o;wQ&|Iu?UY5^PxzU!Q@5K{3G*O+6J%l}ubgD3c|;d<1)OZRbDn z0GYH#S5O{jYDPLubaXD7#jq zSoMYCA*$iPJhA28nApIM&x1EU@wSCkv95pUBmEF(;6zjw%qNO`d#82} z#bP~S-VU+2Dr$Lr40c~6$t;n|X>7scl{k5^2c)DiOV40<;Y`xI#gmu+l72YkelN*5 z2SRIFPNg%&u+2^4&TN}bv!=Q1SAg*Z3xk z@0kg|38l(;`B?Dg4)0r05nF~e0Ps(+R^S_hVtpt z3(}4u^r5kfVLEY1-h?R|o6RlStw-`@ZW!IoTGW?McdN~3--^g@RKT6wW)gAf@g;hd zz!^&MHj?88cPi21Gr;bsnWb?Jp#17LtiqbVb;gu2F77bXhmDW~wYqB!zb8lyB@5gU zzGptG+v~V+O<$eYQDEwGKx6-++9wm(q<2NweQZ;orE`9}BEZh!qJmY>EPGjbK}~kY z=)OO5^pvBsS$11-;MkjwGeURtC`;&^(6V$*MBqa$dD%N6SpQUcOci^dJ-|yc3}k{J zpf@eK?Ifp80Z$ zO&A`>0{VP9U^C%g_4z-#`yYD}~p?09m$f*1j{KszeM$>gAX9U?e51C!!O+5&5pOsz@lx7{Ft95-pOO?5nvF&gkr zX|sm=OO|#iI-O=g^?R{3x-E{4Lkt?nJacJO7L25(+CmKabLJ|gXAO@2Pl;z7f{tGf zmlrnM>9#0SAe~OU1=e1}aT`#&?=*K+aK3^BJyAEyT&qpxwc_Y1=B`(|P^UX((+^`` zM(}^j5kc`Hr2z8nyui{%)|^Y&eK@+*H~#{`iY+te0ieJ+j7b;Xtm0IW<0)SjB@=Wk zXpE1Hu;;E?paMC~wfvve&tnfCpk=IFA3U{MYj?)`-Ka;Tf+KY>xok0Gc4H!GVRf~O zjGY02p=e-HR`RpXmSlx)xia4=^}|UsR)$6%B~N~i&#|RCgzW=(y>h$d;xmn;^D(;) zi*Q=LPs2Na7d#F6$j!ZMfO%xslz($MDY(QdDjDb(Z&Zs*^bIZUi7jx< z+?{)ah0v@@r&s7~I>MRZ4mCFuz08*01Yh6`JSq#Ag8Q9N=&0B_T&!4EPRdS`UJrcp zda7?)1_=f8I0N1&e|LDQ&!uIKcVkSK#qxoU=w@?@iBYml$t2?lwMI`~b1de{DUYTI zHoHkc%stHCcOaa}Hx=IjVv1tJ00D9TI;{Vx74vU4K>@mePS{GQkMOY4Oewp*IjrPm z60m5%aAox-bS#on)9(gFib70i9KE4ZPz|jOgN2{`&dPV(-X6hNXiBMMeZzZ%cgXS~ z)UV7}>)O=3UNAbd@_I=3xZSFF>jhyA#wX4Zv_zapmfnlES}NWcCP!9EJX)A_KEVTp zRVty{--pO{euvo3pU8d#@i`w9p&q=F$KS@imx8<1g>aK-?Mb|6j@TCVF|WYv8rhE> zcR?31F(P+}A$G#vp-p+PWY>f2Ex81t9%}rTL|s$&Rb=SvOhZP^Pnd>O+Dr+$Y7rPi z>aP+S%oV8S(+cF3WHc1Y4Bo$yza(aFG2e$ERU8HFR+ZpU=34%+n3}^J9z>GjvBMvd zgw}@oX|bRnN!+0;-&L#*t*jIstH8BX4NSpI4VM=4zFfID1(Xw&7pfj)u|QYdKMZA~ zf=e%OVeTlde!}*O`h=Wm5*06oP#_JuLW6#$+TWMvVv+xc)KT^NrjaXidII# zH5cEKYA3b%O+{+40cSLD+x(@mU5|ZG5eu1c6&!x}JZ#?~QUng3pQ43P3PF0@{+J^{ zdiUY^M$>Frs(rV;RAOUCf~$Z9G3q&-0eeY;eXnEn!xqlPLgCT?)yMK{xPgVHm^Bp` zN8(L%`Juxk7rT7!_a{4>URqt+D)cVJ*0|R-qNB7QoLDovjJ+^Ce3oJXp=~flApcS$^LHK@iA`uDH7h3p&rr-g{p(0zm@P!^!eZ9U8gFah>Uu8`MfJY9G>z zdUSlO*~+l$Oj|+vfKm;2JF5$KJEzNnhJ!i(IA;a~To(swAKJc$L>z_t(SAxD#fKSs zA}VGTQYo9^#IV&l8vW*x!sSLGE6lb74wj7&PbXOC+a!{HU{IktQPYR6RQ*sMn}xI3Lg)!MoTh&`40Am5-cg>*7oGq_R{JCB|(;wrP{@EZ4|eaG+UNBNlOLMJH;4)jMik zbb>1f{Zn5q8F_8)r}_RqaK&Y`qO}6%W^C}{kjv`Bpe-3f8N zCaM4>Mh@LjC`Rk+5>Q4Wlb$?qKPw?_wZQL_G98i^^e6K6+w2g@Xkib)mj0*Xm-(m? z?kO3Z4;g3fYn;p-Pwr1I-XYOY>A!w0FHPhth;Yx4mAexdnkGS;7ww(dM@LI;qv3h> zp^>KJX1h9Xvpp078rf~c+(t#9pnCW^dG(8bk&6Ej9nF3bbhobd@CLMDvuBcT%^L=!n-YCWvL5YHDC8yQy$H~1(eXB*U%qiZ^W16EYLVr%-fDH;#6 zrSs5Nf0Dsp2MnapR0TKaL~0QGK4!)muLhc2wxm3boIP3XD!G4db++-7NU%4HN<&jx zjX8Zo_qB7R+5_hk6YYSY0yVy=GidB9>@EqH@(CuM2^JS`dnolTz2;XdvaIpv!rcl~ z#@A1ME`bJmZb@?=f|AA}15bl#R>9gd3KIfp#Hv;~?+Fv^#Z2C5`9VJowwH8inX$Ba zNKd8>j{D{M48ELn@|Hz{C6;wF5^&wF#U)WnjZb1Yr4}w4iij94wNu;m7 z*F{=3$t=F6MT+mUZu^S_@lo(*k``zBsqoKBj_hNfHe;{iX*VDWxns9avNsaydqYWsbGaVt3-X}~LI0~> zQr{hX#6tZ?PJ)D|XVZ6mXQf>-;3+5uoM!!3dKZ5@1_Dkxwg!JV!2Ct;qD%>}R+UHO zX#lugJ656Pc&TQieiZZIKuvHM=yK(`l(hJ*My^%?U~t(26C)97BzOeobdXj|&9D1fpHOhSpdElN_?QCr%lm)+e(*3OOY1(*Q+oVP4q->RJ4f?f=S-3!p*&=z0$aY2j@s@K8FSF()PF> zLGK)}M0Y_ytay-rC|{Uzp+0)qdfbJpwH$(?Dbkcj|2Uk$bFg53^C2VC>=kZd_yo?I zLMJ28ZrffTd-az*BDt@PqXLbq_XcQ?h$Y!9q|f}Yj%kQRJqae{1n52_exXH(7$xjA zWE8A|-T4rBERy|=l$E&01?v5a3+Ov!H0FX1{=4ywFoANVsxXS#jgSqd^4FOg)P2C2 zJg~L$B3sP4!mRv>9zw@>Oc1Y~@+p|7UB2?Xfe=3iFTbvOUnBuuAIza~I7#PdALe5T zI=95S)yO|fxI^mkc8mszYZ$kj>I+SrP$nW&HP~jG2>QXT)!zqx3Q%!aEP&UZ(RX9S zuLJ*IJiMMc=|#xPNOkigdH{T|rz?snJ`uA(i&n@`iOZt`Lqn}L95kCtuvf3dKe8b_ z0(r$Z%H)8?31TE>xYV4r>Fn;^9N~2GjN#eir6Z@4D!`P(<*dOJnt%KnPqop3S-!xr zBLL-wC+DIITmg;56*cVdg`HB=wJxz>84W< zK+lqvw=DPOpo5WTFHW8s$p@5$4JlBz7z`tzmSZ|MZ?OcgoI550bp{qfNov)8Qt-q4}my znQqsQS7%oAKzTNA`_x7TWE5@dMyE80Jd|Qk*IcIF zoXj2(n>~!EJ#m_rSYM#w&@xWR>cK>b6PTm6P^?~I2AXz3igj`rEQ?J^z~2%)<$@k4 zFhx0EY_LbL&}?GuKE|*exuRNY99NMsxD0Xy!K$PbAzA!Rqgj5?UcI2T$my0G-gBlH z@__5>L<2M4tB`H@Ww6v;1Q~@ka7#{n(>Ut2a2rjwres(#pBJzQYm(G1HL~0XyKYP* zskO$2Sh;P-deJb3-P8)H!MM1mozgH(XzAU-zB;YLHbF!##8|z%EztGnVEswZq4PSy z&JrKi@!NHiZ^G^8oQ;#CB3=$UpMD?%!(bp+^%zFv>~2t}B3l{}Xgy`Da2SobKOK6>1OfWS-!Us6n#-%ZN_ z;yS(TGrj5FxbAW1c>JrGJ7*@7`OHwNLwF<~Gmo=5z)gf8|QL{hb8m&R9R z;?s6wbdK4|9oF6G84QdVlhECaQise&_Jb2r;V-xJ_S`gW+% z>lm%zVrOq)@o#Jj8L`8X-TbJ5pXN&}>gs1rXGE4+1yO{10x+V{G2YO>KJZM%pNb(x zA)gXll~nPCA?OT3rZ7P)66jG&XTJFKG@9Pj>ebr*qVt7$5+Onau{mmvn*S)UIa;;| zq1VtW@=s9ui}%s|^~3$**^5T_tI{h-p>ABZ@o&!T!nlN}RasZ|KLRoy75?5w5Vu^YUs1eH>zg}YT$bso$Oz3PZJ6b4hw1`+|z6U)Z!dEKvq z>a+Di(xTkhv%0L0fQ3`w#MHU0ZlV&dY|5_N7$7@iG@X)biOBJ_pS5U7EBmFW59)Mm zhg~HE=heFWFmT9N?q)T13N=cC-2**8V8;PUl6qIK3f=&X#?EhuhOr%b2K1EFx}g2C z)|;&(Cxzag4s4V*m%GRqaDSPr4qeP^cC7vc`u8TKLo@b;05oR{z*xleYm@$E+Wp~J z{mb$)L1E2m@-^zCEEOt@UFWhQ3ko|f1KXiHGo}n_YI3v%lp%s!3x9WWyoTKp-96vk zW*9l|EyOM0jmu&|-w)JeGLzsY{mgwYeQC|h^AXq@s9zL&iH&J~EZ1}k%aL}Pjs-GB zCG#?O&R?<3Mv#H~<2YHVBhLZ8cKAd2J>@;Go8-zn!mlVfuPo%!4efUW{Fkd<=ajg{ z1ka~D5$2b0wL=OeA!w}dN2JFf3#~bTx9{2eo~sVzlt*tX6;3Yscd5D`w3rv|?<;JB z#a3#cWrj&@+zLjfYv;Y;HSfs#y;DNsR#ne0{$;(RE0l@m zer}jy#?}S&)&@wvY8xFiAm3COE+L(voaSv+zlcV!etWTnLj!L9XjmIJG*Fc(2dr8S zOwKI82u@uk&A*s#V7zZgb%nP(r@@fMI3kK1+u5^-ed>d0jfbGS9z-ehHd1WvIJIi@ z%)*dcVT96$)_7o4VpA%yFRv_R`wME;C2JN-W;SvmPsCP(b&>%V6>pJFZ!PEhzz14_ z8eyUbjK6m)(R#=m9>8j22o2l1`kFpw&c`qcvdbo8BvgvBU zkSd+2lwQ7}R27+co700$2^9x^j^+-u24ZCYI>qMeUU<}|5XY$mG^$iu7sFOojho|* zyOC2(3unip`vW{-pa{}vFv}z|+JtYgc(nk1ptV$IrT3C1Gqqr6vNtzypNO-KoPY2G zFg~O>!*rU}v>@Toc*bOeCaKXti3?fmXh}?7dlivc36+upy8ioYOq*(a71o*7eukMN z^T&z+GHtr5Fo5Q?bL@R_*LWA$g$52y=((cyU|dhuWR0z-1e;tOj$i4hjc}Ev%oCSh_zKEfyyxALF1bRp;PF6vgU(-u4jOIn@+V3hQLc<%+9O z%YO|SE?OiRWNIAF+rr!+%}S6G$9^}>L7WXgMnx_pcMvUJQA(v|_heoq-U%F0Op?>a zXW5!Az@0djqMqhdUm&kSvv{Ten|X+)J=)4~^{8^#MIj)9@oh(ApQqEEmv=nauDf>+ zXY`0|QD$mYMiDxYw;K&Mz-i-A+zn&V#A27LKA7toR69`sVvtK*?3yDg%)56&pBSqf zt$9@Rn>V;~Fu8Bm`aQ7REzP0kt+apH$- zDr_gXjhlPk$DHa5Fts%Xpz}1t8QC5aKHN~6V(d*Hn{axXDEBFW8=)Ga-e00?Nh=tC z&3o5707Y{X+$&<& z;I27-3SG<>UZ%Z>6m3cSTA#(#VNvig3_}WDZNB~cQ`t|UK>Gdkj4q5-Djd$-(`yw0Uy-w|NL>~`Fwv{{7*6&0a*!A5e3DUGNOM)FnmS~nC*UC zh(O;2QUTw;%OU+!3czdAUsAOHNby5J>7Nn;BuoF2@Zj$We*|Foh1u9w-|#))uQPxT z$&cjUZ?!(Sfc4j3q?`T(_%kZhpGxb`bJV*UFpCP9=dA%H|K9w6UbQ~o8{?kpN!`0S9|yfcCA4-cMoY=Zt&Ds&>TynkB%8_)j{(z1GJOkcZzeO8i-dKVCAQ;UJ=L`}>M1oZR_?CfN8EOm_jjI{7P?;~*9qTdy??*R6^ zzvmqf5YqHF1S)?7<^Y&F3{8w20P@)YDf!>$UETxFWCu_sSb)4U{F!mUz1HUr@wd>= z+fy76EW-T1Wjx=7p;;M_aUekLd>=9XylQ=D(SM6BZDsUdYhldxC=?CgXJQE`^Y>#> ze_pjd9e@xZzo~`41-<)y@i|uOS8xE2*fC%fAp8>$aIf{j1pNFBCg4z@y^gv0@6lE| zr9*lEm6-q-nEu{QHh_Nd8#F;HEBo(ZH>_oJOe_I5*Pp>Qo_7K9*#^=nKpT+&iuyfd z!k<^Ik2fIX-*2FQbO8}(13icTsHZ{gaq7ceNu#ei~7ey@dNvN zrhi`%&m->s30>-`XC!pcG{~iM8Im-7`-yg~E*Y~h7e_Y?^ zF;kttmGZlU&GW?1gUI}u9MEBYP5h^uz+aZ@&y26n;hzTv`3X;||4ZKf0{i3TlJVEx z_`Tkqhv4{$ifHgJQ2!wy$MgI@4|VX93EB8xF#Xk02v9ofzXm>dPW4=A{wLL==|55Z z7v1^i@XsaFf5OL`{}cR=miQ+D_2*R2wO4;q)!Y9Isy{02e^u9W`O2Rp^G^SQbIj*jQ$I0}z5faGM}zzU{l|~LZ0 z)pMWPpO~jP{~Pl+9=6Xj{oH}^C&6akzaaSQDE0diJa-@aNzhyP3&EeW#J@58J}=30 zcaNV$o~6GK{nB0k>2Z6$h5i%Szv36VM3o&v)#8 z!p_zF6YP%x;~)0#o)_S`UH>N&PUA03&)*;ZQg{EOK+kQ>KWR>zexdmb?2iKdar=j{ z@43tAD1qOHv{2pC~5eN|=J*VCI{n!5k DXC5Z7 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 5ea98a321..6c9a22477 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-6.6-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https://services.gradle.org/distributions/gradle-6.6.1-bin.zip diff --git a/gradlew b/gradlew index 9d82f7891..4f906e0c8 100755 --- a/gradlew +++ b/gradlew @@ -1,4 +1,20 @@ -#!/usr/bin/env bash +#!/usr/bin/env sh + +# +# Copyright 2015 the original author or authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ############################################################################## ## @@ -6,20 +22,38 @@ ## ############################################################################## -# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS="" +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + 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" "-Xms64m"' + # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD="maximum" -warn ( ) { +warn () { echo "$*" } -die ( ) { +die () { echo echo "$*" echo @@ -30,6 +64,7 @@ die ( ) { cygwin=false msys=false darwin=false +nonstop=false case "`uname`" in CYGWIN* ) cygwin=true @@ -40,28 +75,14 @@ case "`uname`" in MINGW* ) msys=true ;; + NONSTOP* ) + nonstop=true + ;; esac -# Attempt to set APP_HOME -# Resolve links: $0 may be a link -PRG="$0" -# Need this for relative symlinks. -while [ -h "$PRG" ] ; do - ls=`ls -ld "$PRG"` - link=`expr "$ls" : '.*-> \(.*\)$'` - 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 - 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 @@ -85,7 +106,7 @@ location of your Java installation." fi # Increase the maximum file descriptors if we can. -if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then +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 @@ -105,10 +126,11 @@ 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 +# For Cygwin or MSYS, switch paths to Windows format before running java +if [ "$cygwin" = "true" -o "$msys" = "true" ] ; 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 @@ -134,27 +156,30 @@ if $cygwin ; then else eval `echo args$i`="\"$arg\"" fi - i=$((i+1)) + i=`expr $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" ;; + 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 -# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules -function splitJvmOpts() { - JVM_OPTS=("$@") +# Escape application args +save () { + for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done + echo " " } -eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS -JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME" +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" -exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" +exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat index 8a0b282aa..107acd32c 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -1,3 +1,19 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + @if "%DEBUG%" == "" @echo off @rem ########################################################################## @rem @@ -8,20 +24,23 @@ @rem Set local scope for the variables with windows NT shell if "%OS%"=="Windows_NT" setlocal -@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= - set DIRNAME=%~dp0 if "%DIRNAME%" == "" set DIRNAME=. set APP_BASE_NAME=%~n0 set APP_HOME=%DIRNAME% +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@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" "-Xms64m" + @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 +if "%ERRORLEVEL%" == "0" goto execute echo. echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. @@ -35,7 +54,7 @@ goto fail set JAVA_HOME=%JAVA_HOME:"=% set JAVA_EXE=%JAVA_HOME%/bin/java.exe -if exist "%JAVA_EXE%" goto init +if exist "%JAVA_EXE%" goto execute echo. echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% @@ -45,34 +64,14 @@ echo location of your Java installation. goto fail -:init -@rem Get command-line arguments, handling Windowz variants - -if not "%OS%" == "Windows_NT" goto win9xME_args -if "%@eval[2+2]" == "4" goto 4NT_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=%* -goto execute - -:4NT_args -@rem Get arguments from the 4NT Shell from JP Software -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% +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* :end @rem End local scope for the variables with windows NT shell From 1c7a101b47399f9bb49daf9125a70f506b7a5b84 Mon Sep 17 00:00:00 2001 From: Bruce Eckel Date: Wed, 7 Oct 2020 13:28:11 -0600 Subject: [PATCH 285/320] gradlew run now working with Java 8 and Gradle 6.6 Apparently gradle changed the paths at some point from build/classes/main/ to build/classes/java/main --- annotations/AUComposition.java | 2 +- annotations/AUExternalTest.java | 2 +- annotations/AtUnitExample1.java | 2 +- annotations/AtUnitExample2.java | 2 +- annotations/AtUnitExample3.java | 2 +- annotations/AtUnitExample4.java | 2 +- annotations/AtUnitExample5.java | 2 +- annotations/HashSetTest.java | 2 +- annotations/StackLStringTst.java | 2 +- enums/Reflection.java | 2 +- standardio/OSExecuteDemo.java | 2 +- strings/Hex.java | 2 +- 12 files changed, 12 insertions(+), 12 deletions(-) diff --git a/annotations/AUComposition.java b/annotations/AUComposition.java index 451af4cc6..88de7d7e6 100644 --- a/annotations/AUComposition.java +++ b/annotations/AUComposition.java @@ -4,7 +4,7 @@ // Visit http://OnJava8.com for more book information. // Creating non-embedded tests // {java onjava.atunit.AtUnit -// build/classes/main/annotations/AUComposition.class} +// build/classes/java/main/annotations/AUComposition.class} package annotations; import onjava.atunit.*; import onjava.*; diff --git a/annotations/AUExternalTest.java b/annotations/AUExternalTest.java index d2f4e5ca9..c18eb6b30 100644 --- a/annotations/AUExternalTest.java +++ b/annotations/AUExternalTest.java @@ -4,7 +4,7 @@ // Visit http://OnJava8.com for more book information. // Creating non-embedded tests // {java onjava.atunit.AtUnit -// build/classes/main/annotations/AUExternalTest.class} +// build/classes/java/main/annotations/AUExternalTest.class} package annotations; import onjava.atunit.*; import onjava.*; diff --git a/annotations/AtUnitExample1.java b/annotations/AtUnitExample1.java index 2c42aad4f..03e7e06bf 100644 --- a/annotations/AtUnitExample1.java +++ b/annotations/AtUnitExample1.java @@ -3,7 +3,7 @@ // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // {java onjava.atunit.AtUnit -// build/classes/main/annotations/AtUnitExample1.class} +// build/classes/java/main/annotations/AtUnitExample1.class} package annotations; import onjava.atunit.*; import onjava.*; diff --git a/annotations/AtUnitExample2.java b/annotations/AtUnitExample2.java index 79c04bfd6..3757ca928 100644 --- a/annotations/AtUnitExample2.java +++ b/annotations/AtUnitExample2.java @@ -4,7 +4,7 @@ // Visit http://OnJava8.com for more book information. // Assertions and exceptions can be used in @Tests // {java onjava.atunit.AtUnit -// build/classes/main/annotations/AtUnitExample2.class} +// build/classes/java/main/annotations/AtUnitExample2.class} package annotations; import java.io.*; import onjava.atunit.*; diff --git a/annotations/AtUnitExample3.java b/annotations/AtUnitExample3.java index b4d13d6ef..64c29dd7f 100644 --- a/annotations/AtUnitExample3.java +++ b/annotations/AtUnitExample3.java @@ -3,7 +3,7 @@ // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // {java onjava.atunit.AtUnit -// build/classes/main/annotations/AtUnitExample3.class} +// build/classes/java/main/annotations/AtUnitExample3.class} package annotations; import onjava.atunit.*; import onjava.*; diff --git a/annotations/AtUnitExample4.java b/annotations/AtUnitExample4.java index f2114c441..2ad04c5cb 100644 --- a/annotations/AtUnitExample4.java +++ b/annotations/AtUnitExample4.java @@ -3,7 +3,7 @@ // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // {java onjava.atunit.AtUnit -// build/classes/main/annotations/AtUnitExample4.class} +// build/classes/java/main/annotations/AtUnitExample4.class} // {VisuallyInspectOutput} package annotations; import java.util.*; diff --git a/annotations/AtUnitExample5.java b/annotations/AtUnitExample5.java index 20f608601..80a1588cf 100644 --- a/annotations/AtUnitExample5.java +++ b/annotations/AtUnitExample5.java @@ -3,7 +3,7 @@ // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // {java onjava.atunit.AtUnit -// build/classes/main/annotations/AtUnitExample5.class} +// build/classes/java/main/annotations/AtUnitExample5.class} package annotations; import java.io.*; import onjava.atunit.*; diff --git a/annotations/HashSetTest.java b/annotations/HashSetTest.java index 62fc7a162..dc2ed34cf 100644 --- a/annotations/HashSetTest.java +++ b/annotations/HashSetTest.java @@ -3,7 +3,7 @@ // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // {java onjava.atunit.AtUnit -// build/classes/main/annotations/HashSetTest.class} +// build/classes/java/main/annotations/HashSetTest.class} package annotations; import java.util.*; import onjava.atunit.*; diff --git a/annotations/StackLStringTst.java b/annotations/StackLStringTst.java index 98531711f..c60f3802a 100644 --- a/annotations/StackLStringTst.java +++ b/annotations/StackLStringTst.java @@ -4,7 +4,7 @@ // Visit http://OnJava8.com for more book information. // Applying @Unit to generics // {java onjava.atunit.AtUnit -// build/classes/main/annotations/StackLStringTst.class} +// build/classes/java/main/annotations/StackLStringTst.class} package annotations; import onjava.atunit.*; import onjava.*; diff --git a/enums/Reflection.java b/enums/Reflection.java index 92799a941..c78c4a7c9 100644 --- a/enums/Reflection.java +++ b/enums/Reflection.java @@ -38,7 +38,7 @@ public static void main(String[] args) { System.out.println(exploreMethods); // Decompile the code for the enum: OSExecute.command( - "javap -cp build/classes/main Explore"); + "javap -cp build/classes/java/main Explore"); } } /* Output: diff --git a/standardio/OSExecuteDemo.java b/standardio/OSExecuteDemo.java index 57ec2468a..83186478c 100644 --- a/standardio/OSExecuteDemo.java +++ b/standardio/OSExecuteDemo.java @@ -3,7 +3,7 @@ // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Demonstrates standard I/O redirection -// {javap -cp build/classes/main OSExecuteDemo} +// {javap -cp build/classes/java/main OSExecuteDemo} import onjava.*; public class OSExecuteDemo {} diff --git a/strings/Hex.java b/strings/Hex.java index 9257d87f5..c28f95086 100644 --- a/strings/Hex.java +++ b/strings/Hex.java @@ -27,7 +27,7 @@ public static String format(byte[] data) { // Test by displaying this class file: System.out.println(format( Files.readAllBytes(Paths.get( - "build/classes/main/onjava/Hex.class")))); + "build/classes/java/main/onjava/Hex.class")))); else System.out.println(format( Files.readAllBytes(Paths.get(args[0])))); From 6457a1dee58c38b8b4d3d66c54b7311f4e0e5908 Mon Sep 17 00:00:00 2001 From: Bruce Eckel Date: Wed, 7 Oct 2020 13:35:40 -0600 Subject: [PATCH 286/320] Update copyright date --- annotations/AUComposition.java | 2 +- annotations/AUExternalTest.java | 2 +- annotations/AtUnitExample1.java | 2 +- annotations/AtUnitExample2.java | 2 +- annotations/AtUnitExample3.java | 2 +- annotations/AtUnitExample4.java | 2 +- annotations/AtUnitExample5.java | 2 +- annotations/DemoProcessFiles.java | 2 +- annotations/HashSetTest.java | 2 +- annotations/PasswordUtils.java | 2 +- annotations/SimulatingNull.java | 2 +- annotations/StackL.java | 2 +- annotations/StackLStringTst.java | 2 +- annotations/Testable.java | 2 +- annotations/UseCase.java | 2 +- annotations/UseCaseTracker.java | 2 +- annotations/database/Constraints.java | 2 +- annotations/database/DBTable.java | 2 +- annotations/database/Member.java | 2 +- annotations/database/SQLInteger.java | 2 +- annotations/database/SQLString.java | 2 +- annotations/database/TableCreator.java | 2 +- annotations/database/Uniqueness.java | 2 +- annotations/ifx/ExtractInterface.java | 2 +- annotations/ifx/IfaceExtractorProcessor.java | 2 +- annotations/ifx/Multiplier.java | 2 +- annotations/simplest/Simple.java | 2 +- annotations/simplest/SimpleProcessor.java | 2 +- annotations/simplest/SimpleTest.java | 2 +- arrays/AlphabeticSearch.java | 2 +- arrays/ArrayCopying.java | 2 +- arrays/ArrayOfGenericType.java | 2 +- arrays/ArrayOfGenerics.java | 2 +- arrays/ArrayOptions.java | 2 +- arrays/ArraySearching.java | 2 +- arrays/AssemblingMultidimensionalArrays.java | 2 +- arrays/AutoboxingArrays.java | 2 +- arrays/CollectionComparison.java | 2 +- arrays/CompType.java | 2 +- arrays/ComparatorTest.java | 2 +- arrays/ComparingArrays.java | 2 +- arrays/CountUpward.java | 2 +- arrays/FillingArrays.java | 2 +- arrays/IceCreamFlavors.java | 2 +- arrays/ModifyExisting.java | 2 +- arrays/MultiDimWrapperArray.java | 2 +- arrays/MultidimensionalObjectArrays.java | 2 +- arrays/MultidimensionalPrimitiveArray.java | 2 +- arrays/ParallelPrefix1.java | 2 +- arrays/ParallelPrefix2.java | 2 +- arrays/ParallelPrefix3.java | 2 +- arrays/ParallelSetAll.java | 2 +- arrays/ParameterizedArrayType.java | 2 +- arrays/PythonLists.py | 2 +- arrays/RaggedArray.java | 2 +- arrays/Reverse.java | 2 +- arrays/SimpleSetAll.java | 2 +- arrays/StreamFromArray.java | 2 +- arrays/StringSorting.java | 2 +- arrays/TestConvertTo.java | 2 +- arrays/TestCount.java | 2 +- arrays/TestRand.java | 2 +- arrays/ThreeDWithNew.java | 2 +- arrays/jmh/ParallelSort.java | 2 +- collections/AdapterMethodIdiom.java | 2 +- collections/AddingGroups.java | 2 +- collections/ApplesAndOrangesWithGenerics.java | 2 +- collections/ApplesAndOrangesWithoutGenerics.java | 2 +- collections/ArrayIsNotIterable.java | 2 +- collections/AsListInference.java | 2 +- collections/CollectionDifferences.java | 2 +- collections/CollectionSequence.java | 2 +- collections/CrossCollectionIteration.java | 2 +- collections/CrossCollectionIteration2.java | 2 +- collections/EnvironmentVariables.java | 2 +- collections/ForInCollections.java | 2 +- collections/GenericsAndUpcasting.java | 2 +- collections/InterfaceVsIterator.java | 2 +- collections/IterableClass.java | 2 +- collections/LinkedListFeatures.java | 2 +- collections/ListFeatures.java | 2 +- collections/ListIteration.java | 2 +- collections/MapOfList.java | 2 +- collections/ModifyingArraysAsList.java | 2 +- collections/MultiIterableClass.java | 2 +- collections/NonCollectionSequence.java | 2 +- collections/PetMap.java | 2 +- collections/PrintingCollections.java | 2 +- collections/PriorityQueueDemo.java | 2 +- collections/QueueDemo.java | 2 +- collections/SetOfInteger.java | 2 +- collections/SetOfString.java | 2 +- collections/SetOperations.java | 2 +- collections/SimpleCollection.java | 2 +- collections/SimpleIteration.java | 2 +- collections/SortedSetOfString.java | 2 +- collections/StackCollision.java | 2 +- collections/StackTest.java | 2 +- collections/StackTest2.java | 2 +- collections/Statistics.java | 2 +- collections/UniqueWords.java | 2 +- collections/UniqueWordsAlphabetic.java | 2 +- collectiontopics/AssociativeArray.java | 2 +- collectiontopics/Bits.java | 2 +- collectiontopics/CanonicalMapping.java | 2 +- collectiontopics/CollectionMethods.java | 2 +- collectiontopics/Enumerations.java | 2 +- collectiontopics/FailFast.java | 2 +- collectiontopics/FillMapTest.java | 2 +- collectiontopics/FillingLists.java | 2 +- collectiontopics/FunctionalMap.java | 2 +- collectiontopics/HTMLColorTest.java | 2 +- collectiontopics/LinkedHashMapDemo.java | 2 +- collectiontopics/ListOps.java | 2 +- collectiontopics/ListSortSearch.java | 2 +- collectiontopics/MapOps.java | 2 +- collectiontopics/NavMap.java | 2 +- collectiontopics/QueueBehavior.java | 2 +- collectiontopics/ReadOnly.java | 2 +- collectiontopics/References.java | 2 +- collectiontopics/SetOrder.java | 2 +- collectiontopics/SimpleDeques.java | 2 +- collectiontopics/SortedMapDemo.java | 2 +- collectiontopics/SortedSetDemo.java | 2 +- collectiontopics/Stacks.java | 2 +- collectiontopics/StreamFillMaps.java | 2 +- collectiontopics/SuppliersCollectionTest.java | 2 +- collectiontopics/Synchronization.java | 2 +- collectiontopics/ToDoList.java | 2 +- collectiontopics/TypesForSets.java | 2 +- collectiontopics/Unsupported.java | 2 +- collectiontopics/Utilities.java | 2 +- com/mindviewinc/simple/List.java | 2 +- com/mindviewinc/simple/Vector.java | 2 +- compression/GZIPcompress.java | 2 +- compression/ZipCompress.java | 2 +- concurrent/Baked.java | 2 +- concurrent/Batter.java | 2 +- concurrent/Breakable.java | 2 +- concurrent/CachedThreadPool.java | 2 +- concurrent/CachedThreadPool2.java | 2 +- concurrent/CachedThreadPool3.java | 2 +- concurrent/CatchCompletableExceptions.java | 2 +- concurrent/CollectionIntoStream.java | 2 +- concurrent/CompletableApply.java | 2 +- concurrent/CompletableApplyAsync.java | 2 +- concurrent/CompletableApplyChained.java | 2 +- concurrent/CompletableExceptions.java | 2 +- concurrent/CompletableOperations.java | 2 +- concurrent/CompletablePizza.java | 2 +- concurrent/CompletableUtilities.java | 2 +- concurrent/CompletedMachina.java | 2 +- concurrent/CountingStream.java | 2 +- concurrent/CountingTask.java | 2 +- concurrent/DiningPhilosophers.java | 2 +- concurrent/DualCompletableOperations.java | 2 +- concurrent/FrostedCake.java | 2 +- concurrent/Futures.java | 2 +- concurrent/GuardedIDField.java | 2 +- concurrent/HasID.java | 2 +- concurrent/IDChecker.java | 2 +- concurrent/InterferingTask.java | 2 +- concurrent/LambdasAndMethodReferences.java | 2 +- concurrent/Machina.java | 2 +- concurrent/MoreTasksAfterShutdown.java | 2 +- concurrent/NapTask.java | 2 +- concurrent/OnePizza.java | 2 +- concurrent/ParallelPrime.java | 2 +- concurrent/ParallelStreamPuzzle.java | 2 +- concurrent/ParallelStreamPuzzle2.java | 2 +- concurrent/ParallelStreamPuzzle3.java | 2 +- concurrent/Philosopher.java | 2 +- concurrent/Pizza.java | 2 +- concurrent/PizzaParallelSteps.java | 2 +- concurrent/PizzaStreams.java | 2 +- concurrent/QuittableTask.java | 2 +- concurrent/QuittingCompletable.java | 2 +- concurrent/QuittingTasks.java | 2 +- concurrent/SharedConstructorArgument.java | 2 +- concurrent/SingleThreadExecutor.java | 2 +- concurrent/SingleThreadExecutor2.java | 2 +- concurrent/SingleThreadExecutor3.java | 2 +- concurrent/StaticIDField.java | 2 +- concurrent/StickHolder.java | 2 +- concurrent/StreamExceptions.java | 2 +- concurrent/Summing.java | 2 +- concurrent/Summing2.java | 2 +- concurrent/Summing3.java | 2 +- concurrent/Summing4.java | 2 +- concurrent/SynchronizedConstructor.java | 2 +- concurrent/SynchronizedFactory.java | 2 +- concurrent/TestStaticIDField.java | 2 +- concurrent/ThrowsChecked.java | 2 +- concurrent/Workable.java | 2 +- control/BreakAndContinue.java | 2 +- control/CommaOperator.java | 2 +- control/ForInFloat.java | 2 +- control/ForInInt.java | 2 +- control/ForInString.java | 2 +- control/IfElse.java | 2 +- control/LabeledFor.java | 2 +- control/LabeledWhile.java | 2 +- control/ListCharacters.java | 2 +- control/RandomBounds.java | 2 +- control/StringSwitch.java | 2 +- control/TestWithReturn.java | 2 +- control/TrueFalse.java | 2 +- control/VowelsAndConsonants.java | 2 +- control/WhileTest.java | 2 +- enums/AlarmPoints.java | 2 +- enums/BigEnumSet.java | 2 +- enums/Burrito2.java | 2 +- enums/CarWash.java | 2 +- enums/Competitor.java | 2 +- enums/ConstantSpecificMethod.java | 2 +- enums/EnumClass.java | 2 +- enums/EnumMaps.java | 2 +- enums/EnumSets.java | 2 +- enums/Input.java | 2 +- enums/NonEnum.java | 2 +- enums/NotClasses.java | 2 +- enums/Outcome.java | 2 +- enums/OverrideConstantSpecific.java | 2 +- enums/OzWitch.java | 2 +- enums/PostOffice.java | 2 +- enums/RandomTest.java | 2 +- enums/Reflection.java | 2 +- enums/RoShamBo.java | 2 +- enums/RoShamBo1.java | 2 +- enums/RoShamBo2.java | 2 +- enums/RoShamBo3.java | 2 +- enums/RoShamBo4.java | 2 +- enums/RoShamBo5.java | 2 +- enums/RoShamBo6.java | 2 +- enums/SecurityCategory.java | 2 +- enums/SpaceShip.java | 2 +- enums/SpicinessEnum.java | 2 +- enums/TrafficLight.java | 2 +- enums/UpcastEnum.java | 2 +- enums/VendingMachine.java | 2 +- enums/cartoons/EnumImplementation.java | 2 +- enums/menu/Course.java | 2 +- enums/menu/Food.java | 2 +- enums/menu/Meal.java | 2 +- enums/menu/Meal2.java | 2 +- enums/menu/TypeOfFood.java | 2 +- equalshashcode/ComposedEquality.java | 2 +- equalshashcode/CountedString.java | 2 +- equalshashcode/DefaultComparison.java | 2 +- equalshashcode/Equality.java | 2 +- equalshashcode/EqualityFactory.java | 2 +- equalshashcode/Groundhog.java | 2 +- equalshashcode/Groundhog2.java | 2 +- equalshashcode/IndividualTest.java | 2 +- equalshashcode/MapEntry.java | 2 +- equalshashcode/Prediction.java | 2 +- equalshashcode/SimpleHashMap.java | 2 +- equalshashcode/SlowMap.java | 2 +- equalshashcode/SpringDetector.java | 2 +- equalshashcode/SpringDetector2.java | 2 +- equalshashcode/StringHashCode.java | 2 +- equalshashcode/SubtypeEquality.java | 2 +- equalshashcode/SubtypeEquality2.java | 2 +- equalshashcode/SuccinctEquality.java | 2 +- exceptions/AlwaysFinally.java | 2 +- exceptions/AutoCloseableDetails.java | 2 +- exceptions/BodyException.java | 2 +- exceptions/Cleanup.java | 2 +- exceptions/CleanupIdiom.java | 2 +- exceptions/CloseExceptions.java | 2 +- exceptions/ConstructorException.java | 2 +- exceptions/DynamicFields.java | 2 +- exceptions/ExceptionMethods.java | 2 +- exceptions/ExceptionSilencer.java | 2 +- exceptions/ExtraFeatures.java | 2 +- exceptions/FinallyWorks.java | 2 +- exceptions/FullConstructors.java | 2 +- exceptions/Human.java | 2 +- exceptions/InheritingExceptions.java | 2 +- exceptions/InputFile.java | 2 +- exceptions/InputFile2.java | 2 +- exceptions/LoggingExceptions.java | 2 +- exceptions/LoggingExceptions2.java | 2 +- exceptions/LostMessage.java | 2 +- exceptions/MainException.java | 2 +- exceptions/MessyExceptions.java | 2 +- exceptions/MultiCatch.java | 2 +- exceptions/MultiCatch2.java | 2 +- exceptions/MultipleReturns.java | 2 +- exceptions/NeverCaught.java | 2 +- exceptions/OnOffException1.java | 2 +- exceptions/OnOffException2.java | 2 +- exceptions/OnOffSwitch.java | 2 +- exceptions/PreciseRethrow.java | 2 +- exceptions/RethrowNew.java | 2 +- exceptions/Rethrowing.java | 2 +- exceptions/SameHandler.java | 2 +- exceptions/StormyInning.java | 2 +- exceptions/StreamsAreAutoCloseable.java | 2 +- exceptions/Switch.java | 2 +- exceptions/TryAnything.java | 2 +- exceptions/TryWithResources.java | 2 +- exceptions/TurnOffChecking.java | 2 +- exceptions/WhoCalled.java | 2 +- exceptions/WithFinally.java | 2 +- files/AddAndSubtractPaths.java | 2 +- files/Directories.java | 2 +- files/FileSystemDemo.java | 2 +- files/Find.java | 2 +- files/ListOfLines.java | 2 +- files/PartsOfPaths.java | 2 +- files/PathAnalysis.java | 2 +- files/PathInfo.java | 2 +- files/PathWatcher.java | 2 +- files/ReadLineStream.java | 2 +- files/StreamInAndOut.java | 2 +- files/TreeWatcher.java | 2 +- files/Writing.java | 2 +- functional/AnonymousClosure.java | 2 +- functional/BiConsumerPermutations.java | 2 +- functional/ClassFunctionals.java | 2 +- functional/Closure1.java | 2 +- functional/Closure2.java | 2 +- functional/Closure3.java | 2 +- functional/Closure4.java | 2 +- functional/Closure5.java | 2 +- functional/Closure6.java | 2 +- functional/Closure7.java | 2 +- functional/Closure8.java | 2 +- functional/Closure9.java | 2 +- functional/ConsumeFunction.java | 2 +- functional/CtorReference.java | 2 +- functional/CurriedIntAdd.java | 2 +- functional/Curry3Args.java | 2 +- functional/CurryingAndPartials.java | 2 +- functional/FunctionComposition.java | 2 +- functional/FunctionVariants.java | 2 +- functional/FunctionWithWrapped.java | 2 +- functional/FunctionalAnnotation.java | 2 +- functional/IntCall.java | 2 +- functional/LambdaExpressions.java | 2 +- functional/MethodConversion.java | 2 +- functional/MethodReferences.java | 2 +- functional/MultiUnbound.java | 2 +- functional/PredicateComposition.java | 2 +- functional/ProduceFunction.java | 2 +- functional/RecursiveFactorial.java | 2 +- functional/RecursiveFibonacci.java | 2 +- functional/RunnableMethodReference.java | 2 +- functional/SharedStorage.java | 2 +- functional/Strategize.java | 2 +- functional/TransformFunction.java | 2 +- functional/TriFunction.java | 2 +- functional/TriFunctionTest.java | 2 +- functional/UnboundMethodReference.java | 2 +- generics/Amphibian.java | 2 +- generics/Apply.java | 2 +- generics/ApplyFunctional.java | 2 +- generics/ApplyTest.java | 2 +- generics/ArrayMaker.java | 2 +- generics/ArrayOfGeneric.java | 2 +- generics/ArrayOfGenericReference.java | 2 +- generics/BankTeller.java | 2 +- generics/BasicBounds.java | 2 +- generics/BasicHolder.java | 2 +- generics/BasicSupplierDemo.java | 2 +- generics/ByteSet.java | 2 +- generics/CRGWithBasicHolder.java | 2 +- generics/CaptureConversion.java | 2 +- generics/CheckedList.java | 2 +- generics/ClassCasting.java | 2 +- generics/ClassTypeCapture.java | 2 +- generics/ComparablePet.java | 2 +- generics/CompilerIntelligence.java | 2 +- generics/CountedObject.java | 2 +- generics/CovariantArrays.java | 2 +- generics/CovariantReturnTypes.java | 2 +- generics/CreatorGeneric.java | 2 +- generics/CuriouslyRecurringGeneric.java | 2 +- generics/Diamond.java | 2 +- generics/DogsAndRobotMethodReferences.java | 2 +- generics/DogsAndRobots.cpp | 2 +- generics/DogsAndRobots.java | 2 +- generics/DogsAndRobots.py | 2 +- generics/DynamicProxyMixin.java | 2 +- generics/EpicBattle.java | 2 +- generics/Erased.java | 2 +- generics/ErasedTypeEquivalence.java | 2 +- generics/ErasureAndInheritance.java | 2 +- generics/FactoryConstraint.java | 2 +- generics/Fibonacci.java | 2 +- generics/FilledList.java | 2 +- generics/GenericArray.java | 2 +- generics/GenericArray2.java | 2 +- generics/GenericArrayWithTypeToken.java | 2 +- generics/GenericCast.java | 2 +- generics/GenericHolder.java | 2 +- generics/GenericHolder2.java | 2 +- generics/GenericMethods.java | 2 +- generics/GenericReading.java | 2 +- generics/GenericVarargs.java | 2 +- generics/GenericsAndCovariance.java | 2 +- generics/GenericsAndReturnTypes.java | 2 +- generics/HasF.java | 2 +- generics/HijackedInterface.java | 2 +- generics/Holder.java | 2 +- generics/Holder1.java | 2 +- generics/InheritBounds.java | 2 +- generics/InstantiateGenericType.cpp | 2 +- generics/InstantiateGenericType.java | 2 +- generics/IterableFibonacci.java | 2 +- generics/LatentReflection.java | 2 +- generics/LinkedStack.java | 2 +- generics/ListMaker.java | 2 +- generics/ListOfGenerics.java | 2 +- generics/ListOfInt.java | 2 +- generics/LostInformation.java | 2 +- generics/Manipulation.java | 2 +- generics/Manipulator2.java | 2 +- generics/Manipulator3.java | 2 +- generics/Mixins.cpp | 2 +- generics/Mixins.java | 2 +- generics/MultipleInterfaceVariants.java | 2 +- generics/NeedCasting.java | 2 +- generics/NonCovariantGenerics.java | 2 +- generics/NotSelfBounded.java | 2 +- generics/ObjectHolder.java | 2 +- generics/OrdinaryArguments.java | 2 +- generics/Performs.java | 2 +- generics/PlainGenericInheritance.java | 2 +- generics/PrimitiveGenericTest.java | 2 +- generics/RandomList.java | 2 +- generics/RestrictedComparablePets.java | 2 +- generics/ReturnGenericType.java | 2 +- generics/SelfBounding.java | 2 +- generics/SelfBoundingAndCovariantArguments.java | 2 +- generics/SelfBoundingMethods.java | 2 +- generics/Shape.java | 2 +- generics/SimpleDogsAndRobots.java | 2 +- generics/SimpleHolder.java | 2 +- generics/SimpleQueue.java | 2 +- generics/Square.java | 2 +- generics/Store.java | 2 +- generics/SuperTypeWildcards.java | 2 +- generics/Templates.cpp | 2 +- generics/ThrowGenericException.java | 2 +- generics/TupleList.java | 2 +- generics/TupleTest.java | 2 +- generics/TupleTest2.java | 2 +- generics/UnboundedWildcards1.java | 2 +- generics/UnboundedWildcards2.java | 2 +- generics/Unconstrained.java | 2 +- generics/UseList.java | 2 +- generics/UseList2.java | 2 +- generics/Vehicle.java | 2 +- generics/WatercolorSets.java | 2 +- generics/Wildcards.java | 2 +- generics/coffee/Americano.java | 2 +- generics/coffee/Breve.java | 2 +- generics/coffee/Cappuccino.java | 2 +- generics/coffee/Coffee.java | 2 +- generics/coffee/CoffeeSupplier.java | 2 +- generics/coffee/Latte.java | 2 +- generics/coffee/Mocha.java | 2 +- generics/decorator/Decoration.java | 2 +- generics/dogsandrobots.go | 2 +- generics/watercolors/Watercolors.java | 2 +- hiding/Cake.java | 2 +- hiding/ChocolateChip.java | 2 +- hiding/ChocolateChip2.java | 2 +- hiding/CreatePackageAccessObject.java | 2 +- hiding/Dinner.java | 2 +- hiding/FullQualification.java | 2 +- hiding/IceCream.java | 2 +- hiding/ImportedMyClass.java | 2 +- hiding/LibTest.java | 2 +- hiding/Lunch.java | 2 +- hiding/OrganizedByAccess.java | 2 +- hiding/Pie.java | 2 +- hiding/QualifiedMyClass.java | 2 +- hiding/SingleImport.java | 2 +- hiding/cookie2/Cookie.java | 2 +- hiding/dessert/Cookie.java | 2 +- hiding/mypackage/MyClass.java | 2 +- hiding/packageaccess/PublicConstructor.java | 2 +- housekeeping/Apricot.java | 2 +- housekeeping/ArrayClassObj.java | 2 +- housekeeping/ArrayInit.java | 2 +- housekeeping/ArrayNew.java | 2 +- housekeeping/ArraysOfPrimitives.java | 2 +- housekeeping/AutoboxingVarargs.java | 2 +- housekeeping/BananaPeel.java | 2 +- housekeeping/Burrito.java | 2 +- housekeeping/Counter.java | 2 +- housekeeping/DefaultConstructor.java | 2 +- housekeeping/Demotion.java | 2 +- housekeeping/DynamicArray.java | 2 +- housekeeping/EnumOrder.java | 2 +- housekeeping/ExplicitStatic.java | 2 +- housekeeping/Flower.java | 2 +- housekeeping/InitialValues.java | 2 +- housekeeping/InitialValues2.java | 2 +- housekeeping/Leaf.java | 2 +- housekeeping/Measurement.java | 2 +- housekeeping/MethodInit.java | 2 +- housekeeping/MethodInit2.java | 2 +- housekeeping/MethodInit3.java | 2 +- housekeeping/Mugs.java | 2 +- housekeeping/NewVarArgs.java | 2 +- housekeeping/NoSynthesis.java | 2 +- housekeeping/OptionalTrailingArguments.java | 2 +- housekeeping/OrderOfInitialization.java | 2 +- housekeeping/Overloading.java | 2 +- housekeeping/OverloadingOrder.java | 2 +- housekeeping/OverloadingVarargs.java | 2 +- housekeeping/OverloadingVarargs2.java | 2 +- housekeeping/OverloadingVarargs3.java | 2 +- housekeeping/PassingThis.java | 2 +- housekeeping/PrimitiveOverloading.java | 2 +- housekeeping/SimpleConstructor.java | 2 +- housekeeping/SimpleConstructor2.java | 2 +- housekeeping/SimpleEnumUse.java | 2 +- housekeeping/Spiciness.java | 2 +- housekeeping/Spoon.java | 2 +- housekeeping/StaticInitialization.java | 2 +- housekeeping/TerminationCondition.java | 2 +- housekeeping/VarArgs.java | 2 +- housekeeping/VarargType.java | 2 +- innerclasses/AnonymousConstructor.java | 2 +- innerclasses/BigEgg.java | 2 +- innerclasses/BigEgg2.java | 2 +- innerclasses/Callbacks.java | 2 +- innerclasses/ClassInInterface.java | 2 +- innerclasses/Contents.java | 2 +- innerclasses/Destination.java | 2 +- innerclasses/DotNew.java | 2 +- innerclasses/DotThis.java | 2 +- innerclasses/GreenhouseController.java | 2 +- innerclasses/GreenhouseControls.java | 2 +- innerclasses/InheritInner.java | 2 +- innerclasses/LocalInnerClass.java | 2 +- innerclasses/MultiImplementation.java | 2 +- innerclasses/MultiNestingAccess.java | 2 +- innerclasses/Parcel1.java | 2 +- innerclasses/Parcel10.java | 2 +- innerclasses/Parcel11.java | 2 +- innerclasses/Parcel2.java | 2 +- innerclasses/Parcel3.java | 2 +- innerclasses/Parcel5.java | 2 +- innerclasses/Parcel6.java | 2 +- innerclasses/Parcel7.java | 2 +- innerclasses/Parcel7b.java | 2 +- innerclasses/Parcel8.java | 2 +- innerclasses/Parcel9.java | 2 +- innerclasses/Sequence.java | 2 +- innerclasses/TestBed.java | 2 +- innerclasses/TestParcel.java | 2 +- innerclasses/Wrapping.java | 2 +- innerclasses/controller/Controller.java | 2 +- innerclasses/controller/Event.java | 2 +- innerclasses/mui/MultiInterfaces.java | 2 +- interfaces/AbstractAccess.java | 2 +- interfaces/AbstractWithoutAbstracts.java | 2 +- interfaces/AdaptedRandomDoubles.java | 2 +- interfaces/Adventure.java | 2 +- interfaces/AnImplementation.java | 2 +- interfaces/AnInterface.java | 2 +- interfaces/Applicator.java | 2 +- interfaces/AttemptToUseBasic.java | 2 +- interfaces/Basic.java | 2 +- interfaces/Basic2.java | 2 +- interfaces/Factories.java | 2 +- interfaces/Games.java | 2 +- interfaces/HorrorShow.java | 2 +- interfaces/Implementation2.java | 2 +- interfaces/ImplementingAnInterface.java | 2 +- interfaces/Instantiable.java | 2 +- interfaces/InterfaceCollision.java | 2 +- interfaces/InterfaceWithDefault.java | 2 +- interfaces/Jim.java | 2 +- interfaces/MICollision.java | 2 +- interfaces/Machine.java | 2 +- interfaces/Months.java | 2 +- interfaces/MultipleInheritance.java | 2 +- interfaces/PureInterface.java | 2 +- interfaces/RandVals.java | 2 +- interfaces/RandomDoubles.java | 2 +- interfaces/RandomStrings.java | 2 +- interfaces/TestRandVals.java | 2 +- interfaces/filters/BandPass.java | 2 +- interfaces/filters/Filter.java | 2 +- interfaces/filters/HighPass.java | 2 +- interfaces/filters/LowPass.java | 2 +- interfaces/filters/Waveform.java | 2 +- interfaces/interfaceprocessor/Applicator.java | 2 +- interfaces/interfaceprocessor/FilterProcessor.java | 2 +- interfaces/interfaceprocessor/Processor.java | 2 +- interfaces/interfaceprocessor/StringProcessor.java | 2 +- interfaces/music4/Music4.java | 2 +- interfaces/music5/Music5.java | 2 +- interfaces/nesting/NestingInterfaces.java | 2 +- iostreams/BasicFileOutput.java | 2 +- iostreams/BufferedInputFile.java | 2 +- iostreams/FileOutputShortcut.java | 2 +- iostreams/FormattedMemoryInput.java | 2 +- iostreams/MemoryInput.java | 2 +- iostreams/StoringAndRecoveringData.java | 2 +- iostreams/TestEOF.java | 2 +- iostreams/UsingRandomAccessFile.java | 2 +- javadoc/Documentation1.java | 2 +- javadoc/Documentation2.java | 2 +- javadoc/Documentation3.java | 2 +- javadoc/HelloDateDoc.java | 2 +- lowlevel/AtomicEvenProducer.java | 2 +- lowlevel/AtomicIntegerTest.java | 2 +- lowlevel/AtomicSerialNumbers.java | 2 +- lowlevel/Atomicity.java | 2 +- lowlevel/AttemptLocking.java | 2 +- lowlevel/CaptureUncaughtException.java | 2 +- lowlevel/CircularSet.java | 2 +- lowlevel/DelayQueueDemo.java | 2 +- lowlevel/EvenChecker.java | 2 +- lowlevel/EvenProducer.java | 2 +- lowlevel/ExceptionThread.java | 2 +- lowlevel/IntGenerator.java | 2 +- lowlevel/IntTestable.java | 2 +- lowlevel/MutexEvenProducer.java | 2 +- lowlevel/NaiveExceptionHandling.java | 2 +- lowlevel/NotAtomic.java | 2 +- lowlevel/NumberOfProcessors.java | 2 +- lowlevel/PriorityBlockingQueueDemo.java | 2 +- lowlevel/ReOrdering.java | 2 +- lowlevel/SafeReturn.java | 2 +- lowlevel/SerialNumberChecker.java | 2 +- lowlevel/SerialNumberTest.java | 2 +- lowlevel/SerialNumbers.java | 2 +- lowlevel/SettingDefaultHandler.java | 2 +- lowlevel/SwallowedException.java | 2 +- lowlevel/SyncOnObject.java | 2 +- lowlevel/SynchronizedComparison.java | 2 +- lowlevel/SynchronizedEvenProducer.java | 2 +- lowlevel/SynchronizedSerialNumbers.java | 2 +- lowlevel/TestAbort.java | 2 +- lowlevel/ThreadSize.java | 2 +- lowlevel/UnsafeReturn.java | 2 +- lowlevel/WorkStealingPool.java | 2 +- newio/AvailableCharSets.java | 2 +- newio/BufferToText.java | 2 +- newio/ChannelCopy.java | 2 +- newio/Endians.java | 2 +- newio/FileLocking.java | 2 +- newio/GetChannel.java | 2 +- newio/GetData.java | 2 +- newio/IntBufferDemo.java | 2 +- newio/LargeMappedFiles.java | 2 +- newio/LockingMappedFiles.java | 2 +- newio/MappedIO.java | 2 +- newio/TransferTo.java | 2 +- newio/UsingBuffers.java | 2 +- newio/ViewBuffers.java | 2 +- objects/HelloDate.java | 2 +- objects/ShowProperties.java | 2 +- onjava/ArrayShow.java | 2 +- onjava/BasicSupplier.java | 2 +- onjava/CollectionMethodDifferences.java | 2 +- onjava/ConvertTo.java | 2 +- onjava/Count.java | 2 +- onjava/CountMap.java | 2 +- onjava/CountingIntegerList.java | 2 +- onjava/Countries.java | 2 +- onjava/Enums.java | 2 +- onjava/FillMap.java | 2 +- onjava/HTMLColors.java | 2 +- onjava/MouseClick.java | 2 +- onjava/Nap.java | 2 +- onjava/Null.java | 2 +- onjava/OSExecute.java | 2 +- onjava/OSExecuteException.java | 2 +- onjava/Operations.java | 2 +- onjava/Pair.java | 2 +- onjava/ProcessFiles.java | 2 +- onjava/Rand.java | 2 +- onjava/Range.java | 2 +- onjava/Repeat.java | 2 +- onjava/RmDir.java | 2 +- onjava/Sets.java | 2 +- onjava/Stack.java | 2 +- onjava/Suppliers.java | 2 +- onjava/TimedAbort.java | 2 +- onjava/Timer.java | 2 +- onjava/Tuple.java | 2 +- onjava/Tuple2.java | 2 +- onjava/Tuple3.java | 2 +- onjava/Tuple4.java | 2 +- onjava/Tuple5.java | 2 +- onjava/TypeCounter.java | 2 +- onjava/atunit/AtUnit.java | 2 +- onjava/atunit/ClassNameFinder.java | 2 +- onjava/atunit/Test.java | 2 +- onjava/atunit/TestObjectCleanup.java | 2 +- onjava/atunit/TestObjectCreate.java | 2 +- onjava/atunit/TestProperty.java | 2 +- operators/AllOps.java | 2 +- operators/Assignment.java | 2 +- operators/AutoInc.java | 2 +- operators/BitManipulation.java | 2 +- operators/Bool.java | 2 +- operators/Casting.java | 2 +- operators/CastingNumbers.java | 2 +- operators/EqualsMethod.java | 2 +- operators/EqualsMethod2.java | 2 +- operators/Equivalence.java | 2 +- operators/Exponents.java | 2 +- operators/Literals.java | 2 +- operators/MathOps.java | 2 +- operators/Overflow.java | 2 +- operators/PassObject.java | 2 +- operators/Precedence.java | 2 +- operators/RoundingNumbers.java | 2 +- operators/ShortCircuit.java | 2 +- operators/StringOperators.java | 2 +- operators/TernaryIfElse.java | 2 +- operators/URShift.java | 2 +- operators/Underscores.java | 2 +- patterns/BoxObserver.java | 2 +- patterns/CommandPattern.java | 2 +- patterns/Facade.java | 2 +- patterns/PaperScissorsRock.java | 2 +- patterns/ProxyDemo.java | 2 +- patterns/ShapeFactory1.java | 2 +- patterns/ShapeFactory2.java | 2 +- patterns/ShapeFactory3.java | 2 +- patterns/SingletonPattern.java | 2 +- patterns/StateDemo.java | 2 +- patterns/TemplateMethod.java | 2 +- patterns/abstractfactory/GameEnvironment.java | 2 +- patterns/adapt/Adapter.java | 2 +- patterns/chain/ChainOfResponsibility.java | 2 +- patterns/doubledispatch/Aluminum.java | 2 +- patterns/doubledispatch/Cardboard.java | 2 +- patterns/doubledispatch/DoubleDispatch.java | 2 +- patterns/doubledispatch/Glass.java | 2 +- patterns/doubledispatch/Paper.java | 2 +- patterns/doubledispatch/TypedBin.java | 2 +- patterns/doubledispatch/TypedBinMember.java | 2 +- patterns/dynatrash/DynaTrash.java | 2 +- patterns/observer/ObservedFlower.java | 2 +- patterns/recyclea/RecycleA.java | 2 +- patterns/recycleb/RecycleB.java | 2 +- patterns/recyclec/RecycleC.java | 2 +- patterns/shapes/BadShapeCreation.java | 2 +- patterns/shapes/Circle.java | 2 +- patterns/shapes/FactoryMethod.java | 2 +- patterns/shapes/FactoryTest.java | 2 +- patterns/shapes/Shape.java | 2 +- patterns/shapes/Square.java | 2 +- patterns/shapes/Triangle.java | 2 +- patterns/state/StateMachineDemo.java | 2 +- patterns/strategy/StrategyPattern.java | 2 +- patterns/strategy/StrategyPattern2.java | 2 +- patterns/trash/Aluminum.java | 2 +- patterns/trash/Cardboard.java | 2 +- patterns/trash/Fillable.java | 2 +- patterns/trash/FillableList.java | 2 +- patterns/trash/Glass.java | 2 +- patterns/trash/Paper.java | 2 +- patterns/trash/ParseTrash.java | 2 +- patterns/trash/Trash.java | 2 +- patterns/trashvisitor/Aluminum.java | 2 +- patterns/trashvisitor/Cardboard.java | 2 +- patterns/trashvisitor/Glass.java | 2 +- patterns/trashvisitor/Paper.java | 2 +- patterns/trashvisitor/TrashVisitor.java | 2 +- patterns/trashvisitor/Visitable.java | 2 +- patterns/trashvisitor/Visitor.java | 2 +- patterns/visitor/BeeAndFlowers.java | 2 +- polymorphism/CovariantReturn.java | 2 +- polymorphism/FieldAccess.java | 2 +- polymorphism/Frog.java | 2 +- polymorphism/PolyConstructors.java | 2 +- polymorphism/PrivateOverride.java | 2 +- polymorphism/PrivateOverride2.java | 2 +- polymorphism/RTTI.java | 2 +- polymorphism/ReferenceCounting.java | 2 +- polymorphism/Sandwich.java | 2 +- polymorphism/Shapes.java | 2 +- polymorphism/StaticPolymorphism.java | 2 +- polymorphism/Transmogrify.java | 2 +- polymorphism/music/Instrument.java | 2 +- polymorphism/music/Music.java | 2 +- polymorphism/music/Music2.java | 2 +- polymorphism/music/Note.java | 2 +- polymorphism/music/Wind.java | 2 +- polymorphism/music3/Music3.java | 2 +- polymorphism/shape/Circle.java | 2 +- polymorphism/shape/RandomShapes.java | 2 +- polymorphism/shape/Shape.java | 2 +- polymorphism/shape/Square.java | 2 +- polymorphism/shape/Triangle.java | 2 +- references/AddingClone.java | 2 +- references/Alias1.java | 2 +- references/Alias2.java | 2 +- references/CheckCloneable.java | 2 +- references/CloneArrayList.java | 2 +- references/Compete.java | 2 +- references/CopyConstructor.java | 2 +- references/DepthReading.java | 2 +- references/HorrorFlick.java | 2 +- references/Immutable1.java | 2 +- references/Immutable2.java | 2 +- references/ImmutableInteger.java | 2 +- references/ImmutableStrings.java | 2 +- references/LocalCopy.java | 2 +- references/MutableInteger.java | 2 +- references/OceanReading.java | 2 +- references/PassReferences.java | 2 +- references/SimplerMutableInteger.java | 2 +- references/Snake.java | 2 +- references/Stringer.java | 2 +- references/TemperatureReading.java | 2 +- references/tests/DeepCopyTest.java | 2 +- reuse/Bath.java | 2 +- reuse/Beetle.java | 2 +- reuse/BlankFinal.java | 2 +- reuse/CADSystem.java | 2 +- reuse/Car.java | 2 +- reuse/Cartoon.java | 2 +- reuse/Chess.java | 2 +- reuse/DerivedSpaceShip.java | 2 +- reuse/Detergent.java | 2 +- reuse/FinalArguments.java | 2 +- reuse/FinalData.java | 2 +- reuse/FinalOverridingIllusion.java | 2 +- reuse/Hide.java | 2 +- reuse/Jurassic.java | 2 +- reuse/Lisa.java | 2 +- reuse/Orc.java | 2 +- reuse/PlaceSetting.java | 2 +- reuse/SpaceShipControls.java | 2 +- reuse/SpaceShipDelegation.java | 2 +- reuse/SprinklerSystem.java | 2 +- reuse/Wind.java | 2 +- serialization/APerson.java | 2 +- serialization/AStoreCADState.java | 2 +- serialization/Alien.java | 2 +- serialization/Blip3.java | 2 +- serialization/Blips.java | 2 +- serialization/FreezeAlien.java | 2 +- serialization/Logon.java | 2 +- serialization/MyWorld.java | 2 +- serialization/People.java | 2 +- serialization/RecoverCADState.java | 2 +- serialization/SerialCtl.java | 2 +- serialization/Worm.java | 2 +- serialization/xfiles/ThawAlien.java | 2 +- standardio/ChangeSystemOut.java | 2 +- standardio/Echo.java | 2 +- standardio/OSExecuteDemo.java | 2 +- standardio/Redirecting.java | 2 +- staticchecking/DogsAndRobots.cpp | 2 +- staticchecking/DogsAndRobots.py | 2 +- staticchecking/NoBasePetSpeak.py | 2 +- staticchecking/PetSpeak.py | 2 +- staticchecking/dogsandrobots.go | 2 +- staticchecking/dr/DogsAndRobots.java | 2 +- staticchecking/drc/DogAndRobotCollections.java | 2 +- staticchecking/latent/Latent.java | 2 +- staticchecking/petspeak.go | 2 +- staticchecking/petspeak/PetSpeak.java | 2 +- streams/ArrayStreams.java | 2 +- streams/Bubble.java | 2 +- streams/Bubbles.java | 2 +- streams/CollectionToStream.java | 2 +- streams/CreatingOptionals.java | 2 +- streams/Duplicator.java | 2 +- streams/Fibonacci.java | 2 +- streams/FileToWords.java | 2 +- streams/FileToWordsBuilder.java | 2 +- streams/FileToWordsRegexp.java | 2 +- streams/FileToWordsTest.java | 2 +- streams/FlatMap.java | 2 +- streams/ForEach.java | 2 +- streams/FunctionMap.java | 2 +- streams/FunctionMap2.java | 2 +- streams/FunctionMap3.java | 2 +- streams/Generator.java | 2 +- streams/ImperativeRandoms.java | 2 +- streams/Informational.java | 2 +- streams/LastElement.java | 2 +- streams/Looping.java | 2 +- streams/Machine2.java | 2 +- streams/MapCollector.java | 2 +- streams/Matching.java | 2 +- streams/NumericStreamInfo.java | 2 +- streams/OptionalBasics.java | 2 +- streams/OptionalFilter.java | 2 +- streams/OptionalFlatMap.java | 2 +- streams/OptionalMap.java | 2 +- streams/Optionals.java | 2 +- streams/OptionalsFromEmptyStreams.java | 2 +- streams/Peeking.java | 2 +- streams/Prime.java | 2 +- streams/RandInts.java | 2 +- streams/RandomGenerators.java | 2 +- streams/RandomWords.java | 2 +- streams/Randoms.java | 2 +- streams/Ranges.java | 2 +- streams/Reduce.java | 2 +- streams/SelectElement.java | 2 +- streams/Signal.java | 2 +- streams/SortedComparator.java | 2 +- streams/SpecialCollector.java | 2 +- streams/StreamOf.java | 2 +- streams/StreamOfOptionals.java | 2 +- streams/StreamOfRandoms.java | 2 +- streams/StreamOfStreams.java | 2 +- streams/TreeSetOfWords.java | 2 +- strings/ArrayListDisplay.java | 2 +- strings/BetterRead.java | 2 +- strings/Concatenation.java | 2 +- strings/Conversion.java | 2 +- strings/DatabaseException.java | 2 +- strings/Finding.java | 2 +- strings/Groups.java | 2 +- strings/Hex.java | 2 +- strings/Immutable.java | 2 +- strings/InfiniteRecursion.java | 2 +- strings/IntegerMatch.java | 2 +- strings/JGrep.java | 2 +- strings/ReFlags.java | 2 +- strings/ReceiptBuilder.java | 2 +- strings/Replacing.java | 2 +- strings/ReplacingStringTokenizer.java | 2 +- strings/Resetting.java | 2 +- strings/Rudolph.java | 2 +- strings/ScannerDelimiter.java | 2 +- strings/SimpleFormat.java | 2 +- strings/SimpleRead.java | 2 +- strings/SplitDemo.java | 2 +- strings/Splitting.java | 2 +- strings/StartEnd.java | 2 +- strings/TestRegularExpression.java | 2 +- strings/TheReplacements.java | 2 +- strings/ThreatAnalyzer.java | 2 +- strings/Turtle.java | 2 +- strings/UsingStringBuilder.java | 2 +- strings/WhitherStringBuilder.java | 2 +- typeinfo/AnonymousImplementation.java | 2 +- typeinfo/BoundedClassReferences.java | 2 +- typeinfo/ClassCasts.java | 2 +- typeinfo/ClassInitialization.java | 2 +- typeinfo/DynamicSupplier.java | 2 +- typeinfo/FamilyVsExactType.java | 2 +- typeinfo/GenericClassReferences.java | 2 +- typeinfo/HiddenImplementation.java | 2 +- typeinfo/InnerImplementation.java | 2 +- typeinfo/InterfaceViolation.java | 2 +- typeinfo/ModifyingPrivateFields.java | 2 +- typeinfo/NullRobot.java | 2 +- typeinfo/Operation.java | 2 +- typeinfo/Person.java | 2 +- typeinfo/PetCount.java | 2 +- typeinfo/PetCount2.java | 2 +- typeinfo/PetCount3.java | 2 +- typeinfo/PetCount4.java | 2 +- typeinfo/Position.java | 2 +- typeinfo/RegisteredFactories.java | 2 +- typeinfo/Robot.java | 2 +- typeinfo/SelectingMethods.java | 2 +- typeinfo/Shapes.java | 2 +- typeinfo/ShowMethods.java | 2 +- typeinfo/SimpleDynamicProxy.java | 2 +- typeinfo/SimpleProxyDemo.java | 2 +- typeinfo/SnowRemovalRobot.java | 2 +- typeinfo/Staff.java | 2 +- typeinfo/SweetShop.java | 2 +- typeinfo/WildcardClassReferences.java | 2 +- typeinfo/interfacea/A.java | 2 +- typeinfo/packageaccess/HiddenC.java | 2 +- typeinfo/pets/Cat.java | 2 +- typeinfo/pets/Cymric.java | 2 +- typeinfo/pets/Dog.java | 2 +- typeinfo/pets/EgyptianMau.java | 2 +- typeinfo/pets/ForNameCreator.java | 2 +- typeinfo/pets/Hamster.java | 2 +- typeinfo/pets/Individual.java | 2 +- typeinfo/pets/LiteralPetCreator.java | 2 +- typeinfo/pets/Manx.java | 2 +- typeinfo/pets/Mouse.java | 2 +- typeinfo/pets/Mutt.java | 2 +- typeinfo/pets/Person.java | 2 +- typeinfo/pets/Pet.java | 2 +- typeinfo/pets/PetCreator.java | 2 +- typeinfo/pets/Pets.java | 2 +- typeinfo/pets/Pug.java | 2 +- typeinfo/pets/Rat.java | 2 +- typeinfo/pets/Rodent.java | 2 +- typeinfo/toys/GenericToyTest.java | 2 +- typeinfo/toys/ToyTest.java | 2 +- validating/Assert1.java | 2 +- validating/Assert2.java | 2 +- validating/BadMicroBenchmark.java | 2 +- validating/BadMicroBenchmark2.java | 2 +- validating/CircularQueue.java | 2 +- validating/CircularQueueException.java | 2 +- validating/CountedList.java | 2 +- validating/GuavaAssertions.java | 2 +- validating/GuavaPreconditions.java | 2 +- validating/Inverter1.java | 2 +- validating/Inverter2.java | 2 +- validating/Inverter3.java | 2 +- validating/Inverter4.java | 2 +- validating/LoaderAssertions.java | 2 +- validating/NonNullConstruction.java | 2 +- validating/SLF4JLevels.java | 2 +- validating/SLF4JLogging.java | 2 +- validating/SimpleDebugging.java | 2 +- validating/StringInverter.java | 2 +- validating/jmh/JMH1.java | 2 +- validating/jmh/JMH2.java | 2 +- validating/jmh/JMH3.java | 2 +- validating/tests/CircularQueueTest.java | 2 +- validating/tests/CountedListTest.java | 2 +- validating/tests/DynamicStringInverterTests.java | 2 +- validating/tests/StringInverterTests.java | 2 +- 1025 files changed, 1025 insertions(+), 1025 deletions(-) diff --git a/annotations/AUComposition.java b/annotations/AUComposition.java index 88de7d7e6..ee43e88d3 100644 --- a/annotations/AUComposition.java +++ b/annotations/AUComposition.java @@ -1,5 +1,5 @@ // annotations/AUComposition.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Creating non-embedded tests diff --git a/annotations/AUExternalTest.java b/annotations/AUExternalTest.java index c18eb6b30..cce5c4292 100644 --- a/annotations/AUExternalTest.java +++ b/annotations/AUExternalTest.java @@ -1,5 +1,5 @@ // annotations/AUExternalTest.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Creating non-embedded tests diff --git a/annotations/AtUnitExample1.java b/annotations/AtUnitExample1.java index 03e7e06bf..3b1f6fece 100644 --- a/annotations/AtUnitExample1.java +++ b/annotations/AtUnitExample1.java @@ -1,5 +1,5 @@ // annotations/AtUnitExample1.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // {java onjava.atunit.AtUnit diff --git a/annotations/AtUnitExample2.java b/annotations/AtUnitExample2.java index 3757ca928..bf3f1d5cb 100644 --- a/annotations/AtUnitExample2.java +++ b/annotations/AtUnitExample2.java @@ -1,5 +1,5 @@ // annotations/AtUnitExample2.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Assertions and exceptions can be used in @Tests diff --git a/annotations/AtUnitExample3.java b/annotations/AtUnitExample3.java index 64c29dd7f..02092591b 100644 --- a/annotations/AtUnitExample3.java +++ b/annotations/AtUnitExample3.java @@ -1,5 +1,5 @@ // annotations/AtUnitExample3.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // {java onjava.atunit.AtUnit diff --git a/annotations/AtUnitExample4.java b/annotations/AtUnitExample4.java index 2ad04c5cb..6b644b178 100644 --- a/annotations/AtUnitExample4.java +++ b/annotations/AtUnitExample4.java @@ -1,5 +1,5 @@ // annotations/AtUnitExample4.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // {java onjava.atunit.AtUnit diff --git a/annotations/AtUnitExample5.java b/annotations/AtUnitExample5.java index 80a1588cf..d7cf95dfc 100644 --- a/annotations/AtUnitExample5.java +++ b/annotations/AtUnitExample5.java @@ -1,5 +1,5 @@ // annotations/AtUnitExample5.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // {java onjava.atunit.AtUnit diff --git a/annotations/DemoProcessFiles.java b/annotations/DemoProcessFiles.java index 8462c59e7..6e2505373 100644 --- a/annotations/DemoProcessFiles.java +++ b/annotations/DemoProcessFiles.java @@ -1,5 +1,5 @@ // annotations/DemoProcessFiles.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import onjava.ProcessFiles; diff --git a/annotations/HashSetTest.java b/annotations/HashSetTest.java index dc2ed34cf..8dfa8a9c6 100644 --- a/annotations/HashSetTest.java +++ b/annotations/HashSetTest.java @@ -1,5 +1,5 @@ // annotations/HashSetTest.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // {java onjava.atunit.AtUnit diff --git a/annotations/PasswordUtils.java b/annotations/PasswordUtils.java index 20c83cf74..74a6df78e 100644 --- a/annotations/PasswordUtils.java +++ b/annotations/PasswordUtils.java @@ -1,5 +1,5 @@ // annotations/PasswordUtils.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.*; diff --git a/annotations/SimulatingNull.java b/annotations/SimulatingNull.java index d9fc66484..8166802bc 100644 --- a/annotations/SimulatingNull.java +++ b/annotations/SimulatingNull.java @@ -1,5 +1,5 @@ // annotations/SimulatingNull.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.lang.annotation.*; diff --git a/annotations/StackL.java b/annotations/StackL.java index 02050132b..6ff806aff 100644 --- a/annotations/StackL.java +++ b/annotations/StackL.java @@ -1,5 +1,5 @@ // annotations/StackL.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // A stack built on a LinkedList diff --git a/annotations/StackLStringTst.java b/annotations/StackLStringTst.java index c60f3802a..49aef9b76 100644 --- a/annotations/StackLStringTst.java +++ b/annotations/StackLStringTst.java @@ -1,5 +1,5 @@ // annotations/StackLStringTst.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Applying @Unit to generics diff --git a/annotations/Testable.java b/annotations/Testable.java index b0dd168d8..bc48f4161 100644 --- a/annotations/Testable.java +++ b/annotations/Testable.java @@ -1,5 +1,5 @@ // annotations/Testable.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. package annotations; diff --git a/annotations/UseCase.java b/annotations/UseCase.java index 21220d6a2..dfce31490 100644 --- a/annotations/UseCase.java +++ b/annotations/UseCase.java @@ -1,5 +1,5 @@ // annotations/UseCase.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.lang.annotation.*; diff --git a/annotations/UseCaseTracker.java b/annotations/UseCaseTracker.java index 2376d695a..5489b762b 100644 --- a/annotations/UseCaseTracker.java +++ b/annotations/UseCaseTracker.java @@ -1,5 +1,5 @@ // annotations/UseCaseTracker.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.*; diff --git a/annotations/database/Constraints.java b/annotations/database/Constraints.java index 48c270c51..4e4e40fc8 100644 --- a/annotations/database/Constraints.java +++ b/annotations/database/Constraints.java @@ -1,5 +1,5 @@ // annotations/database/Constraints.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. package annotations.database; diff --git a/annotations/database/DBTable.java b/annotations/database/DBTable.java index 0dc0ba500..9aa5562f4 100644 --- a/annotations/database/DBTable.java +++ b/annotations/database/DBTable.java @@ -1,5 +1,5 @@ // annotations/database/DBTable.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. package annotations.database; diff --git a/annotations/database/Member.java b/annotations/database/Member.java index be415758a..d722a3b10 100644 --- a/annotations/database/Member.java +++ b/annotations/database/Member.java @@ -1,5 +1,5 @@ // annotations/database/Member.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. package annotations.database; diff --git a/annotations/database/SQLInteger.java b/annotations/database/SQLInteger.java index 645adbc58..635a907cd 100644 --- a/annotations/database/SQLInteger.java +++ b/annotations/database/SQLInteger.java @@ -1,5 +1,5 @@ // annotations/database/SQLInteger.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. package annotations.database; diff --git a/annotations/database/SQLString.java b/annotations/database/SQLString.java index 627aa3c12..dac9919f5 100644 --- a/annotations/database/SQLString.java +++ b/annotations/database/SQLString.java @@ -1,5 +1,5 @@ // annotations/database/SQLString.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. package annotations.database; diff --git a/annotations/database/TableCreator.java b/annotations/database/TableCreator.java index a9b12066f..53322fc72 100644 --- a/annotations/database/TableCreator.java +++ b/annotations/database/TableCreator.java @@ -1,5 +1,5 @@ // annotations/database/TableCreator.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Reflection-based annotation processor diff --git a/annotations/database/Uniqueness.java b/annotations/database/Uniqueness.java index d0ab204c7..1aa1a36c9 100644 --- a/annotations/database/Uniqueness.java +++ b/annotations/database/Uniqueness.java @@ -1,5 +1,5 @@ // annotations/database/Uniqueness.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Sample of nested annotations diff --git a/annotations/ifx/ExtractInterface.java b/annotations/ifx/ExtractInterface.java index ed61be171..70a94bf58 100644 --- a/annotations/ifx/ExtractInterface.java +++ b/annotations/ifx/ExtractInterface.java @@ -1,5 +1,5 @@ // annotations/ifx/ExtractInterface.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // javac-based annotation processing diff --git a/annotations/ifx/IfaceExtractorProcessor.java b/annotations/ifx/IfaceExtractorProcessor.java index 4869d4945..d17156f88 100644 --- a/annotations/ifx/IfaceExtractorProcessor.java +++ b/annotations/ifx/IfaceExtractorProcessor.java @@ -1,5 +1,5 @@ // annotations/ifx/IfaceExtractorProcessor.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // javac-based annotation processing diff --git a/annotations/ifx/Multiplier.java b/annotations/ifx/Multiplier.java index ad0847976..b5b99a1b8 100644 --- a/annotations/ifx/Multiplier.java +++ b/annotations/ifx/Multiplier.java @@ -1,5 +1,5 @@ // annotations/ifx/Multiplier.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // javac-based annotation processing diff --git a/annotations/simplest/Simple.java b/annotations/simplest/Simple.java index 6e3a13ab2..0dc555ce5 100644 --- a/annotations/simplest/Simple.java +++ b/annotations/simplest/Simple.java @@ -1,5 +1,5 @@ // annotations/simplest/Simple.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // A bare-bones annotation diff --git a/annotations/simplest/SimpleProcessor.java b/annotations/simplest/SimpleProcessor.java index c62bcc767..a85d8987a 100644 --- a/annotations/simplest/SimpleProcessor.java +++ b/annotations/simplest/SimpleProcessor.java @@ -1,5 +1,5 @@ // annotations/simplest/SimpleProcessor.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // A bare-bones annotation processor diff --git a/annotations/simplest/SimpleTest.java b/annotations/simplest/SimpleTest.java index e281e42b7..689d12fdc 100644 --- a/annotations/simplest/SimpleTest.java +++ b/annotations/simplest/SimpleTest.java @@ -1,5 +1,5 @@ // annotations/simplest/SimpleTest.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Test the "Simple" annotation diff --git a/arrays/AlphabeticSearch.java b/arrays/AlphabeticSearch.java index 305b07db7..70adc8ff5 100644 --- a/arrays/AlphabeticSearch.java +++ b/arrays/AlphabeticSearch.java @@ -1,5 +1,5 @@ // arrays/AlphabeticSearch.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Searching with a Comparator import diff --git a/arrays/ArrayCopying.java b/arrays/ArrayCopying.java index 5669bf1d4..c68c2a0d6 100644 --- a/arrays/ArrayCopying.java +++ b/arrays/ArrayCopying.java @@ -1,5 +1,5 @@ // arrays/ArrayCopying.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Demonstrate Arrays.copy() and Arrays.copyOf() diff --git a/arrays/ArrayOfGenericType.java b/arrays/ArrayOfGenericType.java index 6466df1fd..68f9e8de1 100644 --- a/arrays/ArrayOfGenericType.java +++ b/arrays/ArrayOfGenericType.java @@ -1,5 +1,5 @@ // arrays/ArrayOfGenericType.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/arrays/ArrayOfGenerics.java b/arrays/ArrayOfGenerics.java index d41ce8658..79971d7ab 100644 --- a/arrays/ArrayOfGenerics.java +++ b/arrays/ArrayOfGenerics.java @@ -1,5 +1,5 @@ // arrays/ArrayOfGenerics.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.*; diff --git a/arrays/ArrayOptions.java b/arrays/ArrayOptions.java index 0aaa85d53..bb6cbfbb6 100644 --- a/arrays/ArrayOptions.java +++ b/arrays/ArrayOptions.java @@ -1,5 +1,5 @@ // arrays/ArrayOptions.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Initialization & re-assignment of arrays diff --git a/arrays/ArraySearching.java b/arrays/ArraySearching.java index e08a694a7..fb4085e9b 100644 --- a/arrays/ArraySearching.java +++ b/arrays/ArraySearching.java @@ -1,5 +1,5 @@ // arrays/ArraySearching.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Using Arrays.binarySearch() diff --git a/arrays/AssemblingMultidimensionalArrays.java b/arrays/AssemblingMultidimensionalArrays.java index 2a4c4b99e..e79302b30 100644 --- a/arrays/AssemblingMultidimensionalArrays.java +++ b/arrays/AssemblingMultidimensionalArrays.java @@ -1,5 +1,5 @@ // arrays/AssemblingMultidimensionalArrays.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Creating multidimensional arrays diff --git a/arrays/AutoboxingArrays.java b/arrays/AutoboxingArrays.java index 30589cc43..25b3a0e88 100644 --- a/arrays/AutoboxingArrays.java +++ b/arrays/AutoboxingArrays.java @@ -1,5 +1,5 @@ // arrays/AutoboxingArrays.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.*; diff --git a/arrays/CollectionComparison.java b/arrays/CollectionComparison.java index 66958372f..fc703c0a1 100644 --- a/arrays/CollectionComparison.java +++ b/arrays/CollectionComparison.java @@ -1,5 +1,5 @@ // arrays/CollectionComparison.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.*; diff --git a/arrays/CompType.java b/arrays/CompType.java index a93b6aee4..621b33d18 100644 --- a/arrays/CompType.java +++ b/arrays/CompType.java @@ -1,5 +1,5 @@ // arrays/CompType.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Implementing Comparable in a class diff --git a/arrays/ComparatorTest.java b/arrays/ComparatorTest.java index 79eb3c721..68f7e3805 100644 --- a/arrays/ComparatorTest.java +++ b/arrays/ComparatorTest.java @@ -1,5 +1,5 @@ // arrays/ComparatorTest.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Implementing a Comparator for a class diff --git a/arrays/ComparingArrays.java b/arrays/ComparingArrays.java index 9a2851f67..9ddad69d0 100644 --- a/arrays/ComparingArrays.java +++ b/arrays/ComparingArrays.java @@ -1,5 +1,5 @@ // arrays/ComparingArrays.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Using Arrays.equals() diff --git a/arrays/CountUpward.java b/arrays/CountUpward.java index e512104f0..bbeb02ba7 100644 --- a/arrays/CountUpward.java +++ b/arrays/CountUpward.java @@ -1,5 +1,5 @@ // arrays/CountUpward.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.*; diff --git a/arrays/FillingArrays.java b/arrays/FillingArrays.java index 6c416a0ff..df54e62f3 100644 --- a/arrays/FillingArrays.java +++ b/arrays/FillingArrays.java @@ -1,5 +1,5 @@ // arrays/FillingArrays.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Using Arrays.fill() diff --git a/arrays/IceCreamFlavors.java b/arrays/IceCreamFlavors.java index 73c0813af..5e9d2b610 100644 --- a/arrays/IceCreamFlavors.java +++ b/arrays/IceCreamFlavors.java @@ -1,5 +1,5 @@ // arrays/IceCreamFlavors.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Returning arrays from methods diff --git a/arrays/ModifyExisting.java b/arrays/ModifyExisting.java index b5a0e8bc7..d74df78e2 100644 --- a/arrays/ModifyExisting.java +++ b/arrays/ModifyExisting.java @@ -1,5 +1,5 @@ // arrays/ModifyExisting.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.*; diff --git a/arrays/MultiDimWrapperArray.java b/arrays/MultiDimWrapperArray.java index 4f173ddd5..1185d0f93 100644 --- a/arrays/MultiDimWrapperArray.java +++ b/arrays/MultiDimWrapperArray.java @@ -1,5 +1,5 @@ // arrays/MultiDimWrapperArray.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Multidimensional arrays of "wrapper" objects diff --git a/arrays/MultidimensionalObjectArrays.java b/arrays/MultidimensionalObjectArrays.java index ab147767b..998e7c991 100644 --- a/arrays/MultidimensionalObjectArrays.java +++ b/arrays/MultidimensionalObjectArrays.java @@ -1,5 +1,5 @@ // arrays/MultidimensionalObjectArrays.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.*; diff --git a/arrays/MultidimensionalPrimitiveArray.java b/arrays/MultidimensionalPrimitiveArray.java index 0294c8b02..8ed5884f9 100644 --- a/arrays/MultidimensionalPrimitiveArray.java +++ b/arrays/MultidimensionalPrimitiveArray.java @@ -1,5 +1,5 @@ // arrays/MultidimensionalPrimitiveArray.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.*; diff --git a/arrays/ParallelPrefix1.java b/arrays/ParallelPrefix1.java index 7a34d52ac..e180d019a 100644 --- a/arrays/ParallelPrefix1.java +++ b/arrays/ParallelPrefix1.java @@ -1,5 +1,5 @@ // arrays/ParallelPrefix1.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.*; diff --git a/arrays/ParallelPrefix2.java b/arrays/ParallelPrefix2.java index 08dc8f448..5288d3cea 100644 --- a/arrays/ParallelPrefix2.java +++ b/arrays/ParallelPrefix2.java @@ -1,5 +1,5 @@ // arrays/ParallelPrefix2.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.*; diff --git a/arrays/ParallelPrefix3.java b/arrays/ParallelPrefix3.java index cf7c1551d..ed2751dca 100644 --- a/arrays/ParallelPrefix3.java +++ b/arrays/ParallelPrefix3.java @@ -1,5 +1,5 @@ // arrays/ParallelPrefix3.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // {ExcludeFromTravisCI} diff --git a/arrays/ParallelSetAll.java b/arrays/ParallelSetAll.java index 6d8c0e974..f6c47ff5f 100644 --- a/arrays/ParallelSetAll.java +++ b/arrays/ParallelSetAll.java @@ -1,5 +1,5 @@ // arrays/ParallelSetAll.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.*; diff --git a/arrays/ParameterizedArrayType.java b/arrays/ParameterizedArrayType.java index cb84b1375..06c1021ce 100644 --- a/arrays/ParameterizedArrayType.java +++ b/arrays/ParameterizedArrayType.java @@ -1,5 +1,5 @@ // arrays/ParameterizedArrayType.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/arrays/PythonLists.py b/arrays/PythonLists.py index d22df21cd..910daf180 100644 --- a/arrays/PythonLists.py +++ b/arrays/PythonLists.py @@ -1,5 +1,5 @@ # arrays/PythonLists.py -# (c)2017 MindView LLC: see Copyright.txt +# (c)2020 MindView LLC: see Copyright.txt # We make no guarantees that this code is fit for any purpose. # Visit http://OnJava8.com for more book information. diff --git a/arrays/RaggedArray.java b/arrays/RaggedArray.java index 0877f954c..bd7d625bb 100644 --- a/arrays/RaggedArray.java +++ b/arrays/RaggedArray.java @@ -1,5 +1,5 @@ // arrays/RaggedArray.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.*; diff --git a/arrays/Reverse.java b/arrays/Reverse.java index a6553e7df..9a7de6785 100644 --- a/arrays/Reverse.java +++ b/arrays/Reverse.java @@ -1,5 +1,5 @@ // arrays/Reverse.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // The Collections.reverseOrder() Comparator diff --git a/arrays/SimpleSetAll.java b/arrays/SimpleSetAll.java index 1234eb592..70336e793 100644 --- a/arrays/SimpleSetAll.java +++ b/arrays/SimpleSetAll.java @@ -1,5 +1,5 @@ // arrays/SimpleSetAll.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.*; diff --git a/arrays/StreamFromArray.java b/arrays/StreamFromArray.java index b7022478b..69628703c 100644 --- a/arrays/StreamFromArray.java +++ b/arrays/StreamFromArray.java @@ -1,5 +1,5 @@ // arrays/StreamFromArray.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.*; diff --git a/arrays/StringSorting.java b/arrays/StringSorting.java index 7972c7cce..0da5c7337 100644 --- a/arrays/StringSorting.java +++ b/arrays/StringSorting.java @@ -1,5 +1,5 @@ // arrays/StringSorting.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Sorting an array of Strings diff --git a/arrays/TestConvertTo.java b/arrays/TestConvertTo.java index c7d8fa1b2..8ecb72a62 100644 --- a/arrays/TestConvertTo.java +++ b/arrays/TestConvertTo.java @@ -1,5 +1,5 @@ // arrays/TestConvertTo.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.*; diff --git a/arrays/TestCount.java b/arrays/TestCount.java index 9f1b137f2..a77e00f76 100644 --- a/arrays/TestCount.java +++ b/arrays/TestCount.java @@ -1,5 +1,5 @@ // arrays/TestCount.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Test counting generators diff --git a/arrays/TestRand.java b/arrays/TestRand.java index 26da84b45..17e0718f3 100644 --- a/arrays/TestRand.java +++ b/arrays/TestRand.java @@ -1,5 +1,5 @@ // arrays/TestRand.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Test random generators diff --git a/arrays/ThreeDWithNew.java b/arrays/ThreeDWithNew.java index 4d093f3ac..7aaef0694 100644 --- a/arrays/ThreeDWithNew.java +++ b/arrays/ThreeDWithNew.java @@ -1,5 +1,5 @@ // arrays/ThreeDWithNew.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.*; diff --git a/arrays/jmh/ParallelSort.java b/arrays/jmh/ParallelSort.java index 0475ae142..fe0b505b5 100644 --- a/arrays/jmh/ParallelSort.java +++ b/arrays/jmh/ParallelSort.java @@ -1,5 +1,5 @@ // arrays/jmh/ParallelSort.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. package arrays.jmh; diff --git a/collections/AdapterMethodIdiom.java b/collections/AdapterMethodIdiom.java index a7ebc6167..a97abb411 100644 --- a/collections/AdapterMethodIdiom.java +++ b/collections/AdapterMethodIdiom.java @@ -1,5 +1,5 @@ // collections/AdapterMethodIdiom.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // The "Adapter Method" idiom uses for-in diff --git a/collections/AddingGroups.java b/collections/AddingGroups.java index 3561f459d..ecfc8a5a1 100644 --- a/collections/AddingGroups.java +++ b/collections/AddingGroups.java @@ -1,5 +1,5 @@ // collections/AddingGroups.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Adding groups of elements to Collection objects diff --git a/collections/ApplesAndOrangesWithGenerics.java b/collections/ApplesAndOrangesWithGenerics.java index bd8cb646a..c251672ce 100644 --- a/collections/ApplesAndOrangesWithGenerics.java +++ b/collections/ApplesAndOrangesWithGenerics.java @@ -1,5 +1,5 @@ // collections/ApplesAndOrangesWithGenerics.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.*; diff --git a/collections/ApplesAndOrangesWithoutGenerics.java b/collections/ApplesAndOrangesWithoutGenerics.java index 1832b85ac..6afacd12b 100644 --- a/collections/ApplesAndOrangesWithoutGenerics.java +++ b/collections/ApplesAndOrangesWithoutGenerics.java @@ -1,5 +1,5 @@ // collections/ApplesAndOrangesWithoutGenerics.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Simple collection use (suppressing compiler warnings) diff --git a/collections/ArrayIsNotIterable.java b/collections/ArrayIsNotIterable.java index 1f1e68140..d496feb16 100644 --- a/collections/ArrayIsNotIterable.java +++ b/collections/ArrayIsNotIterable.java @@ -1,5 +1,5 @@ // collections/ArrayIsNotIterable.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.*; diff --git a/collections/AsListInference.java b/collections/AsListInference.java index 97f04a4e8..ef8137083 100644 --- a/collections/AsListInference.java +++ b/collections/AsListInference.java @@ -1,5 +1,5 @@ // collections/AsListInference.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.*; diff --git a/collections/CollectionDifferences.java b/collections/CollectionDifferences.java index f3100ad91..711f7bd79 100644 --- a/collections/CollectionDifferences.java +++ b/collections/CollectionDifferences.java @@ -1,5 +1,5 @@ // collections/CollectionDifferences.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import onjava.*; diff --git a/collections/CollectionSequence.java b/collections/CollectionSequence.java index eafa63683..6a12ed69f 100644 --- a/collections/CollectionSequence.java +++ b/collections/CollectionSequence.java @@ -1,5 +1,5 @@ // collections/CollectionSequence.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import typeinfo.pets.*; diff --git a/collections/CrossCollectionIteration.java b/collections/CrossCollectionIteration.java index 572fba6bb..99769fe24 100644 --- a/collections/CrossCollectionIteration.java +++ b/collections/CrossCollectionIteration.java @@ -1,5 +1,5 @@ // collections/CrossCollectionIteration.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import typeinfo.pets.*; diff --git a/collections/CrossCollectionIteration2.java b/collections/CrossCollectionIteration2.java index 1e51ed3ac..c7da143ff 100644 --- a/collections/CrossCollectionIteration2.java +++ b/collections/CrossCollectionIteration2.java @@ -1,5 +1,5 @@ // collections/CrossCollectionIteration2.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import typeinfo.pets.*; diff --git a/collections/EnvironmentVariables.java b/collections/EnvironmentVariables.java index 2ee865f2c..af89e5a28 100644 --- a/collections/EnvironmentVariables.java +++ b/collections/EnvironmentVariables.java @@ -1,5 +1,5 @@ // collections/EnvironmentVariables.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // {VisuallyInspectOutput} diff --git a/collections/ForInCollections.java b/collections/ForInCollections.java index 2dfbe1b6f..a8ddd7923 100644 --- a/collections/ForInCollections.java +++ b/collections/ForInCollections.java @@ -1,5 +1,5 @@ // collections/ForInCollections.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // All collections work with for-in diff --git a/collections/GenericsAndUpcasting.java b/collections/GenericsAndUpcasting.java index 0ba792c67..ed8d3f557 100644 --- a/collections/GenericsAndUpcasting.java +++ b/collections/GenericsAndUpcasting.java @@ -1,5 +1,5 @@ // collections/GenericsAndUpcasting.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.*; diff --git a/collections/InterfaceVsIterator.java b/collections/InterfaceVsIterator.java index 8404bfa43..b5a8663d8 100644 --- a/collections/InterfaceVsIterator.java +++ b/collections/InterfaceVsIterator.java @@ -1,5 +1,5 @@ // collections/InterfaceVsIterator.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import typeinfo.pets.*; diff --git a/collections/IterableClass.java b/collections/IterableClass.java index 8ef2b65ad..260edc7d4 100644 --- a/collections/IterableClass.java +++ b/collections/IterableClass.java @@ -1,5 +1,5 @@ // collections/IterableClass.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Anything Iterable works with for-in diff --git a/collections/LinkedListFeatures.java b/collections/LinkedListFeatures.java index 8a7b1b79f..3c10ff4ea 100644 --- a/collections/LinkedListFeatures.java +++ b/collections/LinkedListFeatures.java @@ -1,5 +1,5 @@ // collections/LinkedListFeatures.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import typeinfo.pets.*; diff --git a/collections/ListFeatures.java b/collections/ListFeatures.java index b002d9a8f..b4ee16ab4 100644 --- a/collections/ListFeatures.java +++ b/collections/ListFeatures.java @@ -1,5 +1,5 @@ // collections/ListFeatures.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import typeinfo.pets.*; diff --git a/collections/ListIteration.java b/collections/ListIteration.java index 4daa54fd9..95d2786cc 100644 --- a/collections/ListIteration.java +++ b/collections/ListIteration.java @@ -1,5 +1,5 @@ // collections/ListIteration.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import typeinfo.pets.*; diff --git a/collections/MapOfList.java b/collections/MapOfList.java index 224017f86..3a985dd9f 100644 --- a/collections/MapOfList.java +++ b/collections/MapOfList.java @@ -1,5 +1,5 @@ // collections/MapOfList.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // {java collections.MapOfList} diff --git a/collections/ModifyingArraysAsList.java b/collections/ModifyingArraysAsList.java index 15104eaaa..fea3da423 100644 --- a/collections/ModifyingArraysAsList.java +++ b/collections/ModifyingArraysAsList.java @@ -1,5 +1,5 @@ // collections/ModifyingArraysAsList.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.*; diff --git a/collections/MultiIterableClass.java b/collections/MultiIterableClass.java index f90e543d4..1d7376e5f 100644 --- a/collections/MultiIterableClass.java +++ b/collections/MultiIterableClass.java @@ -1,5 +1,5 @@ // collections/MultiIterableClass.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Adding several Adapter Methods diff --git a/collections/NonCollectionSequence.java b/collections/NonCollectionSequence.java index 8ed7a2de5..ed1ae6f63 100644 --- a/collections/NonCollectionSequence.java +++ b/collections/NonCollectionSequence.java @@ -1,5 +1,5 @@ // collections/NonCollectionSequence.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import typeinfo.pets.*; diff --git a/collections/PetMap.java b/collections/PetMap.java index 8a9a90962..18d02ef0b 100644 --- a/collections/PetMap.java +++ b/collections/PetMap.java @@ -1,5 +1,5 @@ // collections/PetMap.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import typeinfo.pets.*; diff --git a/collections/PrintingCollections.java b/collections/PrintingCollections.java index 72e39b6df..c5746fc3e 100644 --- a/collections/PrintingCollections.java +++ b/collections/PrintingCollections.java @@ -1,5 +1,5 @@ // collections/PrintingCollections.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Collections print themselves automatically diff --git a/collections/PriorityQueueDemo.java b/collections/PriorityQueueDemo.java index 024ec51f6..4f71ab0e8 100644 --- a/collections/PriorityQueueDemo.java +++ b/collections/PriorityQueueDemo.java @@ -1,5 +1,5 @@ // collections/PriorityQueueDemo.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.*; diff --git a/collections/QueueDemo.java b/collections/QueueDemo.java index 31a5a5e2a..f807e89a9 100644 --- a/collections/QueueDemo.java +++ b/collections/QueueDemo.java @@ -1,5 +1,5 @@ // collections/QueueDemo.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Upcasting to a Queue from a LinkedList diff --git a/collections/SetOfInteger.java b/collections/SetOfInteger.java index 68553c65b..78157d5cd 100644 --- a/collections/SetOfInteger.java +++ b/collections/SetOfInteger.java @@ -1,5 +1,5 @@ // collections/SetOfInteger.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.*; diff --git a/collections/SetOfString.java b/collections/SetOfString.java index d6f980e06..01d9455e6 100644 --- a/collections/SetOfString.java +++ b/collections/SetOfString.java @@ -1,5 +1,5 @@ // collections/SetOfString.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.*; diff --git a/collections/SetOperations.java b/collections/SetOperations.java index 492658773..f716f9651 100644 --- a/collections/SetOperations.java +++ b/collections/SetOperations.java @@ -1,5 +1,5 @@ // collections/SetOperations.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.*; diff --git a/collections/SimpleCollection.java b/collections/SimpleCollection.java index e0187dc86..8915e2591 100644 --- a/collections/SimpleCollection.java +++ b/collections/SimpleCollection.java @@ -1,5 +1,5 @@ // collections/SimpleCollection.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.*; diff --git a/collections/SimpleIteration.java b/collections/SimpleIteration.java index d47e4711f..a65a2a714 100644 --- a/collections/SimpleIteration.java +++ b/collections/SimpleIteration.java @@ -1,5 +1,5 @@ // collections/SimpleIteration.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import typeinfo.pets.*; diff --git a/collections/SortedSetOfString.java b/collections/SortedSetOfString.java index b2a0603bd..a043b7911 100644 --- a/collections/SortedSetOfString.java +++ b/collections/SortedSetOfString.java @@ -1,5 +1,5 @@ // collections/SortedSetOfString.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.*; diff --git a/collections/StackCollision.java b/collections/StackCollision.java index 11fd340e8..67ee4d907 100644 --- a/collections/StackCollision.java +++ b/collections/StackCollision.java @@ -1,5 +1,5 @@ // collections/StackCollision.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/collections/StackTest.java b/collections/StackTest.java index bc9e9305c..dc1663cc4 100644 --- a/collections/StackTest.java +++ b/collections/StackTest.java @@ -1,5 +1,5 @@ // collections/StackTest.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.*; diff --git a/collections/StackTest2.java b/collections/StackTest2.java index 303f856d6..2464d7a9c 100644 --- a/collections/StackTest2.java +++ b/collections/StackTest2.java @@ -1,5 +1,5 @@ // collections/StackTest2.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import onjava.*; diff --git a/collections/Statistics.java b/collections/Statistics.java index 38a42ef3c..f888db585 100644 --- a/collections/Statistics.java +++ b/collections/Statistics.java @@ -1,5 +1,5 @@ // collections/Statistics.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Simple demonstration of HashMap diff --git a/collections/UniqueWords.java b/collections/UniqueWords.java index 355accc75..c6c3681d4 100644 --- a/collections/UniqueWords.java +++ b/collections/UniqueWords.java @@ -1,5 +1,5 @@ // collections/UniqueWords.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.*; diff --git a/collections/UniqueWordsAlphabetic.java b/collections/UniqueWordsAlphabetic.java index e0db4a163..66a7fecfa 100644 --- a/collections/UniqueWordsAlphabetic.java +++ b/collections/UniqueWordsAlphabetic.java @@ -1,5 +1,5 @@ // collections/UniqueWordsAlphabetic.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Producing an alphabetic listing diff --git a/collectiontopics/AssociativeArray.java b/collectiontopics/AssociativeArray.java index 772f36d3e..e7488489c 100644 --- a/collectiontopics/AssociativeArray.java +++ b/collectiontopics/AssociativeArray.java @@ -1,5 +1,5 @@ // collectiontopics/AssociativeArray.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Associates keys with values diff --git a/collectiontopics/Bits.java b/collectiontopics/Bits.java index f3c4d3904..16afb3617 100644 --- a/collectiontopics/Bits.java +++ b/collectiontopics/Bits.java @@ -1,5 +1,5 @@ // collectiontopics/Bits.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Demonstration of BitSet diff --git a/collectiontopics/CanonicalMapping.java b/collectiontopics/CanonicalMapping.java index fecd6d3cb..7ad7eb29e 100644 --- a/collectiontopics/CanonicalMapping.java +++ b/collectiontopics/CanonicalMapping.java @@ -1,5 +1,5 @@ // collectiontopics/CanonicalMapping.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Demonstrates WeakHashMap diff --git a/collectiontopics/CollectionMethods.java b/collectiontopics/CollectionMethods.java index 1bf8691ea..e32e5982a 100644 --- a/collectiontopics/CollectionMethods.java +++ b/collectiontopics/CollectionMethods.java @@ -1,5 +1,5 @@ // collectiontopics/CollectionMethods.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Things you can do with all Collections diff --git a/collectiontopics/Enumerations.java b/collectiontopics/Enumerations.java index e66385932..22b83e52a 100644 --- a/collectiontopics/Enumerations.java +++ b/collectiontopics/Enumerations.java @@ -1,5 +1,5 @@ // collectiontopics/Enumerations.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Java 1.0/1.1 Vector and Enumeration diff --git a/collectiontopics/FailFast.java b/collectiontopics/FailFast.java index 8a93867c9..0b0ce253f 100644 --- a/collectiontopics/FailFast.java +++ b/collectiontopics/FailFast.java @@ -1,5 +1,5 @@ // collectiontopics/FailFast.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Demonstrates the "fail-fast" behavior diff --git a/collectiontopics/FillMapTest.java b/collectiontopics/FillMapTest.java index 0259a2738..5cfd612bc 100644 --- a/collectiontopics/FillMapTest.java +++ b/collectiontopics/FillMapTest.java @@ -1,5 +1,5 @@ // collectiontopics/FillMapTest.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.*; diff --git a/collectiontopics/FillingLists.java b/collectiontopics/FillingLists.java index af158de1f..32bdb8ef0 100644 --- a/collectiontopics/FillingLists.java +++ b/collectiontopics/FillingLists.java @@ -1,5 +1,5 @@ // collectiontopics/FillingLists.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Collections.fill() & Collections.nCopies() diff --git a/collectiontopics/FunctionalMap.java b/collectiontopics/FunctionalMap.java index 16abb45b0..404a1a641 100644 --- a/collectiontopics/FunctionalMap.java +++ b/collectiontopics/FunctionalMap.java @@ -1,5 +1,5 @@ // collectiontopics/FunctionalMap.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Functional operations on a Map diff --git a/collectiontopics/HTMLColorTest.java b/collectiontopics/HTMLColorTest.java index 517ee575c..99037ced9 100644 --- a/collectiontopics/HTMLColorTest.java +++ b/collectiontopics/HTMLColorTest.java @@ -1,5 +1,5 @@ // collectiontopics/HTMLColorTest.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import static onjava.HTMLColors.*; diff --git a/collectiontopics/LinkedHashMapDemo.java b/collectiontopics/LinkedHashMapDemo.java index 70e1db15c..d0b933932 100644 --- a/collectiontopics/LinkedHashMapDemo.java +++ b/collectiontopics/LinkedHashMapDemo.java @@ -1,5 +1,5 @@ // collectiontopics/LinkedHashMapDemo.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // What you can do with a LinkedHashMap diff --git a/collectiontopics/ListOps.java b/collectiontopics/ListOps.java index 760652b57..824ffba98 100644 --- a/collectiontopics/ListOps.java +++ b/collectiontopics/ListOps.java @@ -1,5 +1,5 @@ // collectiontopics/ListOps.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Things you can do with Lists diff --git a/collectiontopics/ListSortSearch.java b/collectiontopics/ListSortSearch.java index d59bc6439..4d1fbcf8c 100644 --- a/collectiontopics/ListSortSearch.java +++ b/collectiontopics/ListSortSearch.java @@ -1,5 +1,5 @@ // collectiontopics/ListSortSearch.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Sorting/searching Lists with Collections utilities diff --git a/collectiontopics/MapOps.java b/collectiontopics/MapOps.java index c49cb84a2..b214fa2d6 100644 --- a/collectiontopics/MapOps.java +++ b/collectiontopics/MapOps.java @@ -1,5 +1,5 @@ // collectiontopics/MapOps.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Things you can do with Maps diff --git a/collectiontopics/NavMap.java b/collectiontopics/NavMap.java index 0f682b8a3..076ae841e 100644 --- a/collectiontopics/NavMap.java +++ b/collectiontopics/NavMap.java @@ -1,5 +1,5 @@ // collectiontopics/NavMap.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // NavigableMap produces pieces of a Map diff --git a/collectiontopics/QueueBehavior.java b/collectiontopics/QueueBehavior.java index 923eab610..136fbaf8a 100644 --- a/collectiontopics/QueueBehavior.java +++ b/collectiontopics/QueueBehavior.java @@ -1,5 +1,5 @@ // collectiontopics/QueueBehavior.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Compares basic behavior diff --git a/collectiontopics/ReadOnly.java b/collectiontopics/ReadOnly.java index 925cb8198..93c336c4f 100644 --- a/collectiontopics/ReadOnly.java +++ b/collectiontopics/ReadOnly.java @@ -1,5 +1,5 @@ // collectiontopics/ReadOnly.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Using the Collections.unmodifiable methods diff --git a/collectiontopics/References.java b/collectiontopics/References.java index e95cce2d5..ca505606a 100644 --- a/collectiontopics/References.java +++ b/collectiontopics/References.java @@ -1,5 +1,5 @@ // collectiontopics/References.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Demonstrates Reference objects diff --git a/collectiontopics/SetOrder.java b/collectiontopics/SetOrder.java index fb4fcf4de..543db94c2 100644 --- a/collectiontopics/SetOrder.java +++ b/collectiontopics/SetOrder.java @@ -1,5 +1,5 @@ // collectiontopics/SetOrder.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.*; diff --git a/collectiontopics/SimpleDeques.java b/collectiontopics/SimpleDeques.java index 119ecc5b7..fbb4a5ff6 100644 --- a/collectiontopics/SimpleDeques.java +++ b/collectiontopics/SimpleDeques.java @@ -1,5 +1,5 @@ // collectiontopics/SimpleDeques.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Very basic test of Deques diff --git a/collectiontopics/SortedMapDemo.java b/collectiontopics/SortedMapDemo.java index 90e1e297e..4d57d34a7 100644 --- a/collectiontopics/SortedMapDemo.java +++ b/collectiontopics/SortedMapDemo.java @@ -1,5 +1,5 @@ // collectiontopics/SortedMapDemo.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // What you can do with a TreeMap diff --git a/collectiontopics/SortedSetDemo.java b/collectiontopics/SortedSetDemo.java index 837978d46..6ed81fb16 100644 --- a/collectiontopics/SortedSetDemo.java +++ b/collectiontopics/SortedSetDemo.java @@ -1,5 +1,5 @@ // collectiontopics/SortedSetDemo.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.*; diff --git a/collectiontopics/Stacks.java b/collectiontopics/Stacks.java index da56e8b7f..79a684cbb 100644 --- a/collectiontopics/Stacks.java +++ b/collectiontopics/Stacks.java @@ -1,5 +1,5 @@ // collectiontopics/Stacks.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Demonstration of Stack Class diff --git a/collectiontopics/StreamFillMaps.java b/collectiontopics/StreamFillMaps.java index 6e568e9fb..816a74b31 100644 --- a/collectiontopics/StreamFillMaps.java +++ b/collectiontopics/StreamFillMaps.java @@ -1,5 +1,5 @@ // collectiontopics/StreamFillMaps.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.*; diff --git a/collectiontopics/SuppliersCollectionTest.java b/collectiontopics/SuppliersCollectionTest.java index f8b42a874..b30f1490d 100644 --- a/collectiontopics/SuppliersCollectionTest.java +++ b/collectiontopics/SuppliersCollectionTest.java @@ -1,5 +1,5 @@ // collectiontopics/SuppliersCollectionTest.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.*; diff --git a/collectiontopics/Synchronization.java b/collectiontopics/Synchronization.java index 768f013df..c7d3b7323 100644 --- a/collectiontopics/Synchronization.java +++ b/collectiontopics/Synchronization.java @@ -1,5 +1,5 @@ // collectiontopics/Synchronization.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Using the Collections.synchronized methods diff --git a/collectiontopics/ToDoList.java b/collectiontopics/ToDoList.java index 1da979ba2..b288e8e1e 100644 --- a/collectiontopics/ToDoList.java +++ b/collectiontopics/ToDoList.java @@ -1,5 +1,5 @@ // collectiontopics/ToDoList.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // A more complex use of PriorityQueue diff --git a/collectiontopics/TypesForSets.java b/collectiontopics/TypesForSets.java index b7840f64c..9950b0032 100644 --- a/collectiontopics/TypesForSets.java +++ b/collectiontopics/TypesForSets.java @@ -1,5 +1,5 @@ // collectiontopics/TypesForSets.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Methods necessary to put your own type in a Set diff --git a/collectiontopics/Unsupported.java b/collectiontopics/Unsupported.java index fba5dafd1..a66b1cfdb 100644 --- a/collectiontopics/Unsupported.java +++ b/collectiontopics/Unsupported.java @@ -1,5 +1,5 @@ // collectiontopics/Unsupported.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Unsupported operations in Java collections diff --git a/collectiontopics/Utilities.java b/collectiontopics/Utilities.java index c2b94bac9..a2acc4278 100644 --- a/collectiontopics/Utilities.java +++ b/collectiontopics/Utilities.java @@ -1,5 +1,5 @@ // collectiontopics/Utilities.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Simple demonstrations of the Collections utilities diff --git a/com/mindviewinc/simple/List.java b/com/mindviewinc/simple/List.java index 065ff8437..84b30315b 100644 --- a/com/mindviewinc/simple/List.java +++ b/com/mindviewinc/simple/List.java @@ -1,5 +1,5 @@ // com/mindviewinc/simple/List.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Creating a package diff --git a/com/mindviewinc/simple/Vector.java b/com/mindviewinc/simple/Vector.java index db50ba121..19824ccec 100644 --- a/com/mindviewinc/simple/Vector.java +++ b/com/mindviewinc/simple/Vector.java @@ -1,5 +1,5 @@ // com/mindviewinc/simple/Vector.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Creating a package diff --git a/compression/GZIPcompress.java b/compression/GZIPcompress.java index 0a669a913..c9022e780 100644 --- a/compression/GZIPcompress.java +++ b/compression/GZIPcompress.java @@ -1,5 +1,5 @@ // compression/GZIPcompress.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // {java GZIPcompress GZIPcompress.java} diff --git a/compression/ZipCompress.java b/compression/ZipCompress.java index a8168e7c4..f9ce76705 100644 --- a/compression/ZipCompress.java +++ b/compression/ZipCompress.java @@ -1,5 +1,5 @@ // compression/ZipCompress.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Uses Zip compression to compress any diff --git a/concurrent/Baked.java b/concurrent/Baked.java index c4b1ed0da..d616d94b8 100644 --- a/concurrent/Baked.java +++ b/concurrent/Baked.java @@ -1,5 +1,5 @@ // concurrent/Baked.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.concurrent.*; diff --git a/concurrent/Batter.java b/concurrent/Batter.java index 8a814ae75..9fe14c4f5 100644 --- a/concurrent/Batter.java +++ b/concurrent/Batter.java @@ -1,5 +1,5 @@ // concurrent/Batter.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.concurrent.*; diff --git a/concurrent/Breakable.java b/concurrent/Breakable.java index a3b632d7f..facd70951 100644 --- a/concurrent/Breakable.java +++ b/concurrent/Breakable.java @@ -1,5 +1,5 @@ // concurrent/Breakable.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.concurrent.*; diff --git a/concurrent/CachedThreadPool.java b/concurrent/CachedThreadPool.java index 15dac382f..e0b825a25 100644 --- a/concurrent/CachedThreadPool.java +++ b/concurrent/CachedThreadPool.java @@ -1,5 +1,5 @@ // concurrent/CachedThreadPool.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.concurrent.*; diff --git a/concurrent/CachedThreadPool2.java b/concurrent/CachedThreadPool2.java index a5b29a52a..9d7636560 100644 --- a/concurrent/CachedThreadPool2.java +++ b/concurrent/CachedThreadPool2.java @@ -1,5 +1,5 @@ // concurrent/CachedThreadPool2.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.concurrent.*; diff --git a/concurrent/CachedThreadPool3.java b/concurrent/CachedThreadPool3.java index 550914e1a..4b6e6d2e0 100644 --- a/concurrent/CachedThreadPool3.java +++ b/concurrent/CachedThreadPool3.java @@ -1,5 +1,5 @@ // concurrent/CachedThreadPool3.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.*; diff --git a/concurrent/CatchCompletableExceptions.java b/concurrent/CatchCompletableExceptions.java index ed180ee8c..67451ed46 100644 --- a/concurrent/CatchCompletableExceptions.java +++ b/concurrent/CatchCompletableExceptions.java @@ -1,5 +1,5 @@ // concurrent/CatchCompletableExceptions.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.concurrent.*; diff --git a/concurrent/CollectionIntoStream.java b/concurrent/CollectionIntoStream.java index 2ddf4ed2d..2dc51a7e0 100644 --- a/concurrent/CollectionIntoStream.java +++ b/concurrent/CollectionIntoStream.java @@ -1,5 +1,5 @@ // concurrent/CollectionIntoStream.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import onjava.*; diff --git a/concurrent/CompletableApply.java b/concurrent/CompletableApply.java index 3173d0260..2f5bd9b48 100644 --- a/concurrent/CompletableApply.java +++ b/concurrent/CompletableApply.java @@ -1,5 +1,5 @@ // concurrent/CompletableApply.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.concurrent.*; diff --git a/concurrent/CompletableApplyAsync.java b/concurrent/CompletableApplyAsync.java index 2698595ad..fa7c92711 100644 --- a/concurrent/CompletableApplyAsync.java +++ b/concurrent/CompletableApplyAsync.java @@ -1,5 +1,5 @@ // concurrent/CompletableApplyAsync.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.concurrent.*; diff --git a/concurrent/CompletableApplyChained.java b/concurrent/CompletableApplyChained.java index acb6f8a7c..aa6828d56 100644 --- a/concurrent/CompletableApplyChained.java +++ b/concurrent/CompletableApplyChained.java @@ -1,5 +1,5 @@ // concurrent/CompletableApplyChained.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.concurrent.*; diff --git a/concurrent/CompletableExceptions.java b/concurrent/CompletableExceptions.java index e7bac94bc..624815d5f 100644 --- a/concurrent/CompletableExceptions.java +++ b/concurrent/CompletableExceptions.java @@ -1,5 +1,5 @@ // concurrent/CompletableExceptions.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.concurrent.*; diff --git a/concurrent/CompletableOperations.java b/concurrent/CompletableOperations.java index 745b2bb38..d03e8422a 100644 --- a/concurrent/CompletableOperations.java +++ b/concurrent/CompletableOperations.java @@ -1,5 +1,5 @@ // concurrent/CompletableOperations.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.concurrent.*; diff --git a/concurrent/CompletablePizza.java b/concurrent/CompletablePizza.java index f81391d2b..97b68545f 100644 --- a/concurrent/CompletablePizza.java +++ b/concurrent/CompletablePizza.java @@ -1,5 +1,5 @@ // concurrent/CompletablePizza.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.*; diff --git a/concurrent/CompletableUtilities.java b/concurrent/CompletableUtilities.java index 3ee2ab6dc..8f3a0e51a 100644 --- a/concurrent/CompletableUtilities.java +++ b/concurrent/CompletableUtilities.java @@ -1,5 +1,5 @@ // concurrent/CompletableUtilities.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. package onjava; diff --git a/concurrent/CompletedMachina.java b/concurrent/CompletedMachina.java index efba32c4e..06a787109 100644 --- a/concurrent/CompletedMachina.java +++ b/concurrent/CompletedMachina.java @@ -1,5 +1,5 @@ // concurrent/CompletedMachina.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.concurrent.*; diff --git a/concurrent/CountingStream.java b/concurrent/CountingStream.java index 1d0adc665..4cebb24e1 100644 --- a/concurrent/CountingStream.java +++ b/concurrent/CountingStream.java @@ -1,5 +1,5 @@ // concurrent/CountingStream.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // {VisuallyInspectOutput} diff --git a/concurrent/CountingTask.java b/concurrent/CountingTask.java index 1f3bbc2f1..b1fb7b89f 100644 --- a/concurrent/CountingTask.java +++ b/concurrent/CountingTask.java @@ -1,5 +1,5 @@ // concurrent/CountingTask.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.concurrent.*; diff --git a/concurrent/DiningPhilosophers.java b/concurrent/DiningPhilosophers.java index 45801d831..5c2b2f1b2 100644 --- a/concurrent/DiningPhilosophers.java +++ b/concurrent/DiningPhilosophers.java @@ -1,5 +1,5 @@ // concurrent/DiningPhilosophers.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Hidden deadlock diff --git a/concurrent/DualCompletableOperations.java b/concurrent/DualCompletableOperations.java index 71eb4dab2..420523121 100644 --- a/concurrent/DualCompletableOperations.java +++ b/concurrent/DualCompletableOperations.java @@ -1,5 +1,5 @@ // concurrent/DualCompletableOperations.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.concurrent.*; diff --git a/concurrent/FrostedCake.java b/concurrent/FrostedCake.java index 0d5a84b4d..1be8b661d 100644 --- a/concurrent/FrostedCake.java +++ b/concurrent/FrostedCake.java @@ -1,5 +1,5 @@ // concurrent/FrostedCake.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.concurrent.*; diff --git a/concurrent/Futures.java b/concurrent/Futures.java index 138614a33..888e7f0d9 100644 --- a/concurrent/Futures.java +++ b/concurrent/Futures.java @@ -1,5 +1,5 @@ // concurrent/Futures.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.*; diff --git a/concurrent/GuardedIDField.java b/concurrent/GuardedIDField.java index 88e5ad940..e570a5d32 100644 --- a/concurrent/GuardedIDField.java +++ b/concurrent/GuardedIDField.java @@ -1,5 +1,5 @@ // concurrent/GuardedIDField.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.concurrent.atomic.*; diff --git a/concurrent/HasID.java b/concurrent/HasID.java index 4e679a59f..e5e134388 100644 --- a/concurrent/HasID.java +++ b/concurrent/HasID.java @@ -1,5 +1,5 @@ // concurrent/HasID.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/concurrent/IDChecker.java b/concurrent/IDChecker.java index f21a63d3c..845c9e6a4 100644 --- a/concurrent/IDChecker.java +++ b/concurrent/IDChecker.java @@ -1,5 +1,5 @@ // concurrent/IDChecker.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.*; diff --git a/concurrent/InterferingTask.java b/concurrent/InterferingTask.java index 4c564acc7..da08f6539 100644 --- a/concurrent/InterferingTask.java +++ b/concurrent/InterferingTask.java @@ -1,5 +1,5 @@ // concurrent/InterferingTask.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/concurrent/LambdasAndMethodReferences.java b/concurrent/LambdasAndMethodReferences.java index 08316a986..10552499a 100644 --- a/concurrent/LambdasAndMethodReferences.java +++ b/concurrent/LambdasAndMethodReferences.java @@ -1,5 +1,5 @@ // concurrent/LambdasAndMethodReferences.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.concurrent.*; diff --git a/concurrent/Machina.java b/concurrent/Machina.java index 1275391fc..e70cd2b4c 100644 --- a/concurrent/Machina.java +++ b/concurrent/Machina.java @@ -1,5 +1,5 @@ // concurrent/Machina.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import onjava.Nap; diff --git a/concurrent/MoreTasksAfterShutdown.java b/concurrent/MoreTasksAfterShutdown.java index 56b925ea6..28b96af83 100644 --- a/concurrent/MoreTasksAfterShutdown.java +++ b/concurrent/MoreTasksAfterShutdown.java @@ -1,5 +1,5 @@ // concurrent/MoreTasksAfterShutdown.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.concurrent.*; diff --git a/concurrent/NapTask.java b/concurrent/NapTask.java index 26e17bf7a..92df6b602 100644 --- a/concurrent/NapTask.java +++ b/concurrent/NapTask.java @@ -1,5 +1,5 @@ // concurrent/NapTask.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import onjava.Nap; diff --git a/concurrent/OnePizza.java b/concurrent/OnePizza.java index 265b2b419..f4f27249f 100644 --- a/concurrent/OnePizza.java +++ b/concurrent/OnePizza.java @@ -1,5 +1,5 @@ // concurrent/OnePizza.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import onjava.Timer; diff --git a/concurrent/ParallelPrime.java b/concurrent/ParallelPrime.java index 1359ebf58..97c025756 100644 --- a/concurrent/ParallelPrime.java +++ b/concurrent/ParallelPrime.java @@ -1,5 +1,5 @@ // concurrent/ParallelPrime.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.*; diff --git a/concurrent/ParallelStreamPuzzle.java b/concurrent/ParallelStreamPuzzle.java index bf3a9dfa3..f57dec24a 100644 --- a/concurrent/ParallelStreamPuzzle.java +++ b/concurrent/ParallelStreamPuzzle.java @@ -1,5 +1,5 @@ // concurrent/ParallelStreamPuzzle.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.*; diff --git a/concurrent/ParallelStreamPuzzle2.java b/concurrent/ParallelStreamPuzzle2.java index b02baafaf..2fc11d482 100644 --- a/concurrent/ParallelStreamPuzzle2.java +++ b/concurrent/ParallelStreamPuzzle2.java @@ -1,5 +1,5 @@ // concurrent/ParallelStreamPuzzle2.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.*; diff --git a/concurrent/ParallelStreamPuzzle3.java b/concurrent/ParallelStreamPuzzle3.java index 92d2c851d..757bddd5b 100644 --- a/concurrent/ParallelStreamPuzzle3.java +++ b/concurrent/ParallelStreamPuzzle3.java @@ -1,5 +1,5 @@ // concurrent/ParallelStreamPuzzle3.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // {VisuallyInspectOutput} diff --git a/concurrent/Philosopher.java b/concurrent/Philosopher.java index 29552954b..48facb382 100644 --- a/concurrent/Philosopher.java +++ b/concurrent/Philosopher.java @@ -1,5 +1,5 @@ // concurrent/Philosopher.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/concurrent/Pizza.java b/concurrent/Pizza.java index a2dfad92e..8cd5ff30b 100644 --- a/concurrent/Pizza.java +++ b/concurrent/Pizza.java @@ -1,5 +1,5 @@ // concurrent/Pizza.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.function.*; diff --git a/concurrent/PizzaParallelSteps.java b/concurrent/PizzaParallelSteps.java index a289da367..605e99853 100644 --- a/concurrent/PizzaParallelSteps.java +++ b/concurrent/PizzaParallelSteps.java @@ -1,5 +1,5 @@ // concurrent/PizzaParallelSteps.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.*; diff --git a/concurrent/PizzaStreams.java b/concurrent/PizzaStreams.java index 6d3e5f29e..16be983a7 100644 --- a/concurrent/PizzaStreams.java +++ b/concurrent/PizzaStreams.java @@ -1,5 +1,5 @@ // concurrent/PizzaStreams.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.*; diff --git a/concurrent/QuittableTask.java b/concurrent/QuittableTask.java index 2e473f4ea..3cf2a62e4 100644 --- a/concurrent/QuittableTask.java +++ b/concurrent/QuittableTask.java @@ -1,5 +1,5 @@ // concurrent/QuittableTask.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.concurrent.atomic.AtomicBoolean; diff --git a/concurrent/QuittingCompletable.java b/concurrent/QuittingCompletable.java index e57ec0f31..e41e38999 100644 --- a/concurrent/QuittingCompletable.java +++ b/concurrent/QuittingCompletable.java @@ -1,5 +1,5 @@ // concurrent/QuittingCompletable.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.*; diff --git a/concurrent/QuittingTasks.java b/concurrent/QuittingTasks.java index dc863f426..326e24ce1 100644 --- a/concurrent/QuittingTasks.java +++ b/concurrent/QuittingTasks.java @@ -1,5 +1,5 @@ // concurrent/QuittingTasks.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.*; diff --git a/concurrent/SharedConstructorArgument.java b/concurrent/SharedConstructorArgument.java index df8ec4574..4b09cc26c 100644 --- a/concurrent/SharedConstructorArgument.java +++ b/concurrent/SharedConstructorArgument.java @@ -1,5 +1,5 @@ // concurrent/SharedConstructorArgument.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.concurrent.atomic.*; diff --git a/concurrent/SingleThreadExecutor.java b/concurrent/SingleThreadExecutor.java index 58047d26a..ef89e3a53 100644 --- a/concurrent/SingleThreadExecutor.java +++ b/concurrent/SingleThreadExecutor.java @@ -1,5 +1,5 @@ // concurrent/SingleThreadExecutor.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.concurrent.*; diff --git a/concurrent/SingleThreadExecutor2.java b/concurrent/SingleThreadExecutor2.java index 113fb6393..08467df5a 100644 --- a/concurrent/SingleThreadExecutor2.java +++ b/concurrent/SingleThreadExecutor2.java @@ -1,5 +1,5 @@ // concurrent/SingleThreadExecutor2.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.concurrent.*; diff --git a/concurrent/SingleThreadExecutor3.java b/concurrent/SingleThreadExecutor3.java index 46e384280..581494238 100644 --- a/concurrent/SingleThreadExecutor3.java +++ b/concurrent/SingleThreadExecutor3.java @@ -1,5 +1,5 @@ // concurrent/SingleThreadExecutor3.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.concurrent.*; diff --git a/concurrent/StaticIDField.java b/concurrent/StaticIDField.java index 9e563dfdb..22623faaf 100644 --- a/concurrent/StaticIDField.java +++ b/concurrent/StaticIDField.java @@ -1,5 +1,5 @@ // concurrent/StaticIDField.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/concurrent/StickHolder.java b/concurrent/StickHolder.java index 413e69dc8..719a1c635 100644 --- a/concurrent/StickHolder.java +++ b/concurrent/StickHolder.java @@ -1,5 +1,5 @@ // concurrent/StickHolder.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.concurrent.*; diff --git a/concurrent/StreamExceptions.java b/concurrent/StreamExceptions.java index facae761e..493daee1f 100644 --- a/concurrent/StreamExceptions.java +++ b/concurrent/StreamExceptions.java @@ -1,5 +1,5 @@ // concurrent/StreamExceptions.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.concurrent.*; diff --git a/concurrent/Summing.java b/concurrent/Summing.java index 8f44563e1..321dcb573 100644 --- a/concurrent/Summing.java +++ b/concurrent/Summing.java @@ -1,5 +1,5 @@ // concurrent/Summing.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.stream.*; diff --git a/concurrent/Summing2.java b/concurrent/Summing2.java index f5d75be97..c046721f0 100644 --- a/concurrent/Summing2.java +++ b/concurrent/Summing2.java @@ -1,5 +1,5 @@ // concurrent/Summing2.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // {ExcludeFromTravisCI} diff --git a/concurrent/Summing3.java b/concurrent/Summing3.java index 5477dc617..252e96f7e 100644 --- a/concurrent/Summing3.java +++ b/concurrent/Summing3.java @@ -1,5 +1,5 @@ // concurrent/Summing3.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // {ExcludeFromTravisCI} diff --git a/concurrent/Summing4.java b/concurrent/Summing4.java index 4df903234..bb4fe2ea2 100644 --- a/concurrent/Summing4.java +++ b/concurrent/Summing4.java @@ -1,5 +1,5 @@ // concurrent/Summing4.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // {ExcludeFromTravisCI} diff --git a/concurrent/SynchronizedConstructor.java b/concurrent/SynchronizedConstructor.java index 520829ee3..95aa6a542 100644 --- a/concurrent/SynchronizedConstructor.java +++ b/concurrent/SynchronizedConstructor.java @@ -1,5 +1,5 @@ // concurrent/SynchronizedConstructor.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.concurrent.atomic.*; diff --git a/concurrent/SynchronizedFactory.java b/concurrent/SynchronizedFactory.java index 4f682082b..669d4d76b 100644 --- a/concurrent/SynchronizedFactory.java +++ b/concurrent/SynchronizedFactory.java @@ -1,5 +1,5 @@ // concurrent/SynchronizedFactory.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.concurrent.atomic.*; diff --git a/concurrent/TestStaticIDField.java b/concurrent/TestStaticIDField.java index 772958aad..5df298b76 100644 --- a/concurrent/TestStaticIDField.java +++ b/concurrent/TestStaticIDField.java @@ -1,5 +1,5 @@ // concurrent/TestStaticIDField.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/concurrent/ThrowsChecked.java b/concurrent/ThrowsChecked.java index bbebadd18..59177b35a 100644 --- a/concurrent/ThrowsChecked.java +++ b/concurrent/ThrowsChecked.java @@ -1,5 +1,5 @@ // concurrent/ThrowsChecked.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.stream.*; diff --git a/concurrent/Workable.java b/concurrent/Workable.java index a04bc113c..fcdbbbf80 100644 --- a/concurrent/Workable.java +++ b/concurrent/Workable.java @@ -1,5 +1,5 @@ // concurrent/Workable.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.concurrent.*; diff --git a/control/BreakAndContinue.java b/control/BreakAndContinue.java index 83ad25e06..1faaaa034 100644 --- a/control/BreakAndContinue.java +++ b/control/BreakAndContinue.java @@ -1,5 +1,5 @@ // control/BreakAndContinue.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Break and continue keywords diff --git a/control/CommaOperator.java b/control/CommaOperator.java index d4337c036..eae2df824 100644 --- a/control/CommaOperator.java +++ b/control/CommaOperator.java @@ -1,5 +1,5 @@ // control/CommaOperator.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/control/ForInFloat.java b/control/ForInFloat.java index 4027b2f79..cee845b57 100644 --- a/control/ForInFloat.java +++ b/control/ForInFloat.java @@ -1,5 +1,5 @@ // control/ForInFloat.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.*; diff --git a/control/ForInInt.java b/control/ForInInt.java index 0abc762f6..f6b283a35 100644 --- a/control/ForInInt.java +++ b/control/ForInInt.java @@ -1,5 +1,5 @@ // control/ForInInt.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import static onjava.Range.*; diff --git a/control/ForInString.java b/control/ForInString.java index 320f17004..73e16538b 100644 --- a/control/ForInString.java +++ b/control/ForInString.java @@ -1,5 +1,5 @@ // control/ForInString.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/control/IfElse.java b/control/IfElse.java index 1347bcd1d..f40a07b7f 100644 --- a/control/IfElse.java +++ b/control/IfElse.java @@ -1,5 +1,5 @@ // control/IfElse.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/control/LabeledFor.java b/control/LabeledFor.java index 7535b2163..2df79bad3 100644 --- a/control/LabeledFor.java +++ b/control/LabeledFor.java @@ -1,5 +1,5 @@ // control/LabeledFor.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // For loops with "labeled break"/"labeled continue." diff --git a/control/LabeledWhile.java b/control/LabeledWhile.java index 8fded1940..961f5ff38 100644 --- a/control/LabeledWhile.java +++ b/control/LabeledWhile.java @@ -1,5 +1,5 @@ // control/LabeledWhile.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // "While" with "labeled break" and "labeled continue." diff --git a/control/ListCharacters.java b/control/ListCharacters.java index c846270d6..43efce9f5 100644 --- a/control/ListCharacters.java +++ b/control/ListCharacters.java @@ -1,5 +1,5 @@ // control/ListCharacters.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // List all the lowercase ASCII letters diff --git a/control/RandomBounds.java b/control/RandomBounds.java index 81a0dc13b..6befc6f45 100644 --- a/control/RandomBounds.java +++ b/control/RandomBounds.java @@ -1,5 +1,5 @@ // control/RandomBounds.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Does Math.random() produce 0.0 and 1.0? diff --git a/control/StringSwitch.java b/control/StringSwitch.java index 3ad7236d7..638cc4276 100644 --- a/control/StringSwitch.java +++ b/control/StringSwitch.java @@ -1,5 +1,5 @@ // control/StringSwitch.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/control/TestWithReturn.java b/control/TestWithReturn.java index 6df7a5df1..efe05c907 100644 --- a/control/TestWithReturn.java +++ b/control/TestWithReturn.java @@ -1,5 +1,5 @@ // control/TestWithReturn.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/control/TrueFalse.java b/control/TrueFalse.java index b4d25db06..e87dade4f 100644 --- a/control/TrueFalse.java +++ b/control/TrueFalse.java @@ -1,5 +1,5 @@ // control/TrueFalse.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/control/VowelsAndConsonants.java b/control/VowelsAndConsonants.java index 79ea2bfc5..d3a192d0d 100644 --- a/control/VowelsAndConsonants.java +++ b/control/VowelsAndConsonants.java @@ -1,5 +1,5 @@ // control/VowelsAndConsonants.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Demonstrates the switch statement diff --git a/control/WhileTest.java b/control/WhileTest.java index becb35682..075068cfe 100644 --- a/control/WhileTest.java +++ b/control/WhileTest.java @@ -1,5 +1,5 @@ // control/WhileTest.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Demonstrates the while loop diff --git a/enums/AlarmPoints.java b/enums/AlarmPoints.java index ddca40188..a87311373 100644 --- a/enums/AlarmPoints.java +++ b/enums/AlarmPoints.java @@ -1,5 +1,5 @@ // enums/AlarmPoints.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. package enums; diff --git a/enums/BigEnumSet.java b/enums/BigEnumSet.java index 1c0544640..52ac34458 100644 --- a/enums/BigEnumSet.java +++ b/enums/BigEnumSet.java @@ -1,5 +1,5 @@ // enums/BigEnumSet.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.*; diff --git a/enums/Burrito2.java b/enums/Burrito2.java index 5999ce0e4..8b92ab0da 100644 --- a/enums/Burrito2.java +++ b/enums/Burrito2.java @@ -1,5 +1,5 @@ // enums/Burrito2.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // {java enums.Burrito2} diff --git a/enums/CarWash.java b/enums/CarWash.java index 8111cb305..95800e8fb 100644 --- a/enums/CarWash.java +++ b/enums/CarWash.java @@ -1,5 +1,5 @@ // enums/CarWash.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.*; diff --git a/enums/Competitor.java b/enums/Competitor.java index 2f1514681..09bf71413 100644 --- a/enums/Competitor.java +++ b/enums/Competitor.java @@ -1,5 +1,5 @@ // enums/Competitor.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Switching one enum on another diff --git a/enums/ConstantSpecificMethod.java b/enums/ConstantSpecificMethod.java index c8f6ef0ff..913aa2919 100644 --- a/enums/ConstantSpecificMethod.java +++ b/enums/ConstantSpecificMethod.java @@ -1,5 +1,5 @@ // enums/ConstantSpecificMethod.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.*; diff --git a/enums/EnumClass.java b/enums/EnumClass.java index 1999c6f43..061f8abfa 100644 --- a/enums/EnumClass.java +++ b/enums/EnumClass.java @@ -1,5 +1,5 @@ // enums/EnumClass.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Capabilities of the Enum class diff --git a/enums/EnumMaps.java b/enums/EnumMaps.java index 79b5e6c88..f75c5cd46 100644 --- a/enums/EnumMaps.java +++ b/enums/EnumMaps.java @@ -1,5 +1,5 @@ // enums/EnumMaps.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Basics of EnumMaps diff --git a/enums/EnumSets.java b/enums/EnumSets.java index 838b26991..0e749cadc 100644 --- a/enums/EnumSets.java +++ b/enums/EnumSets.java @@ -1,5 +1,5 @@ // enums/EnumSets.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Operations on EnumSets diff --git a/enums/Input.java b/enums/Input.java index e9a178d82..3dc0ec440 100644 --- a/enums/Input.java +++ b/enums/Input.java @@ -1,5 +1,5 @@ // enums/Input.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.*; diff --git a/enums/NonEnum.java b/enums/NonEnum.java index a1ef0ac8b..344407307 100644 --- a/enums/NonEnum.java +++ b/enums/NonEnum.java @@ -1,5 +1,5 @@ // enums/NonEnum.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/enums/NotClasses.java b/enums/NotClasses.java index c58a16c47..8e0c941f8 100644 --- a/enums/NotClasses.java +++ b/enums/NotClasses.java @@ -1,5 +1,5 @@ // enums/NotClasses.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // {javap -c LikeClasses} diff --git a/enums/Outcome.java b/enums/Outcome.java index da1cf8401..0e2a25d60 100644 --- a/enums/Outcome.java +++ b/enums/Outcome.java @@ -1,5 +1,5 @@ // enums/Outcome.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. package enums; diff --git a/enums/OverrideConstantSpecific.java b/enums/OverrideConstantSpecific.java index 6ea818eea..28e3343be 100644 --- a/enums/OverrideConstantSpecific.java +++ b/enums/OverrideConstantSpecific.java @@ -1,5 +1,5 @@ // enums/OverrideConstantSpecific.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/enums/OzWitch.java b/enums/OzWitch.java index 67aea7f5e..c9eedb4fd 100644 --- a/enums/OzWitch.java +++ b/enums/OzWitch.java @@ -1,5 +1,5 @@ // enums/OzWitch.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // The witches in the land of Oz diff --git a/enums/PostOffice.java b/enums/PostOffice.java index 2209d9ac7..056348206 100644 --- a/enums/PostOffice.java +++ b/enums/PostOffice.java @@ -1,5 +1,5 @@ // enums/PostOffice.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Modeling a post office diff --git a/enums/RandomTest.java b/enums/RandomTest.java index 9d74531fa..92f2e481b 100644 --- a/enums/RandomTest.java +++ b/enums/RandomTest.java @@ -1,5 +1,5 @@ // enums/RandomTest.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import onjava.*; diff --git a/enums/Reflection.java b/enums/Reflection.java index c78c4a7c9..822a134e8 100644 --- a/enums/Reflection.java +++ b/enums/Reflection.java @@ -1,5 +1,5 @@ // enums/Reflection.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Analyzing enums using reflection diff --git a/enums/RoShamBo.java b/enums/RoShamBo.java index 09ef7fc03..76b3d76fe 100644 --- a/enums/RoShamBo.java +++ b/enums/RoShamBo.java @@ -1,5 +1,5 @@ // enums/RoShamBo.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Common tools for RoShamBo examples diff --git a/enums/RoShamBo1.java b/enums/RoShamBo1.java index 7fba68962..abf52c9c9 100644 --- a/enums/RoShamBo1.java +++ b/enums/RoShamBo1.java @@ -1,5 +1,5 @@ // enums/RoShamBo1.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Demonstration of multiple dispatching diff --git a/enums/RoShamBo2.java b/enums/RoShamBo2.java index db52d4589..ec8ab25b1 100644 --- a/enums/RoShamBo2.java +++ b/enums/RoShamBo2.java @@ -1,5 +1,5 @@ // enums/RoShamBo2.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Switching one enum on another diff --git a/enums/RoShamBo3.java b/enums/RoShamBo3.java index 046912dd4..ffcd2cf17 100644 --- a/enums/RoShamBo3.java +++ b/enums/RoShamBo3.java @@ -1,5 +1,5 @@ // enums/RoShamBo3.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Using constant-specific methods diff --git a/enums/RoShamBo4.java b/enums/RoShamBo4.java index b129e09da..f0b473aef 100644 --- a/enums/RoShamBo4.java +++ b/enums/RoShamBo4.java @@ -1,5 +1,5 @@ // enums/RoShamBo4.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // {java enums.RoShamBo4} diff --git a/enums/RoShamBo5.java b/enums/RoShamBo5.java index eabddd3de..69885c017 100644 --- a/enums/RoShamBo5.java +++ b/enums/RoShamBo5.java @@ -1,5 +1,5 @@ // enums/RoShamBo5.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Multiple dispatching using an EnumMap of EnumMaps diff --git a/enums/RoShamBo6.java b/enums/RoShamBo6.java index d1e2e0268..164911d52 100644 --- a/enums/RoShamBo6.java +++ b/enums/RoShamBo6.java @@ -1,5 +1,5 @@ // enums/RoShamBo6.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Enums using "tables" instead of multiple dispatch diff --git a/enums/SecurityCategory.java b/enums/SecurityCategory.java index 908ebe9cb..884cb56a2 100644 --- a/enums/SecurityCategory.java +++ b/enums/SecurityCategory.java @@ -1,5 +1,5 @@ // enums/SecurityCategory.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // More succinct subcategorization of enums diff --git a/enums/SpaceShip.java b/enums/SpaceShip.java index 95e23f4e5..3623389e0 100644 --- a/enums/SpaceShip.java +++ b/enums/SpaceShip.java @@ -1,5 +1,5 @@ // enums/SpaceShip.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.stream.*; diff --git a/enums/SpicinessEnum.java b/enums/SpicinessEnum.java index 78f4518a7..eef6f89a4 100644 --- a/enums/SpicinessEnum.java +++ b/enums/SpicinessEnum.java @@ -1,5 +1,5 @@ // enums/SpicinessEnum.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. package enums; diff --git a/enums/TrafficLight.java b/enums/TrafficLight.java index 9be9d3e8a..b018e02c7 100644 --- a/enums/TrafficLight.java +++ b/enums/TrafficLight.java @@ -1,5 +1,5 @@ // enums/TrafficLight.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Enums in switch statements diff --git a/enums/UpcastEnum.java b/enums/UpcastEnum.java index 31995bd64..a5df2a862 100644 --- a/enums/UpcastEnum.java +++ b/enums/UpcastEnum.java @@ -1,5 +1,5 @@ // enums/UpcastEnum.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // No values() method if you upcast an enum diff --git a/enums/VendingMachine.java b/enums/VendingMachine.java index fbc976df6..bc7d7c19e 100644 --- a/enums/VendingMachine.java +++ b/enums/VendingMachine.java @@ -1,5 +1,5 @@ // enums/VendingMachine.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // {java VendingMachine VendingMachineInput.txt} diff --git a/enums/cartoons/EnumImplementation.java b/enums/cartoons/EnumImplementation.java index cb3abaa0f..58902e3fc 100644 --- a/enums/cartoons/EnumImplementation.java +++ b/enums/cartoons/EnumImplementation.java @@ -1,5 +1,5 @@ // enums/cartoons/EnumImplementation.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // An enum can implement an interface diff --git a/enums/menu/Course.java b/enums/menu/Course.java index a11fdace9..96481f1eb 100644 --- a/enums/menu/Course.java +++ b/enums/menu/Course.java @@ -1,5 +1,5 @@ // enums/menu/Course.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. package enums.menu; diff --git a/enums/menu/Food.java b/enums/menu/Food.java index bfe8dd553..4b97f69ec 100644 --- a/enums/menu/Food.java +++ b/enums/menu/Food.java @@ -1,5 +1,5 @@ // enums/menu/Food.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Subcategorization of enums within interfaces diff --git a/enums/menu/Meal.java b/enums/menu/Meal.java index 3bd12ed21..64bc496d6 100644 --- a/enums/menu/Meal.java +++ b/enums/menu/Meal.java @@ -1,5 +1,5 @@ // enums/menu/Meal.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // {java enums.menu.Meal} diff --git a/enums/menu/Meal2.java b/enums/menu/Meal2.java index 17bbdf6e9..df1b90a58 100644 --- a/enums/menu/Meal2.java +++ b/enums/menu/Meal2.java @@ -1,5 +1,5 @@ // enums/menu/Meal2.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // {java enums.menu.Meal2} diff --git a/enums/menu/TypeOfFood.java b/enums/menu/TypeOfFood.java index 7909f1f4a..5e59e78bb 100644 --- a/enums/menu/TypeOfFood.java +++ b/enums/menu/TypeOfFood.java @@ -1,5 +1,5 @@ // enums/menu/TypeOfFood.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // {java enums.menu.TypeOfFood} diff --git a/equalshashcode/ComposedEquality.java b/equalshashcode/ComposedEquality.java index 01fe792e3..c224231ca 100644 --- a/equalshashcode/ComposedEquality.java +++ b/equalshashcode/ComposedEquality.java @@ -1,5 +1,5 @@ // equalshashcode/ComposedEquality.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.*; diff --git a/equalshashcode/CountedString.java b/equalshashcode/CountedString.java index f3c5823ec..5a6ec5fab 100644 --- a/equalshashcode/CountedString.java +++ b/equalshashcode/CountedString.java @@ -1,5 +1,5 @@ // equalshashcode/CountedString.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Creating a good hashCode() diff --git a/equalshashcode/DefaultComparison.java b/equalshashcode/DefaultComparison.java index 541e918ea..d855de369 100644 --- a/equalshashcode/DefaultComparison.java +++ b/equalshashcode/DefaultComparison.java @@ -1,5 +1,5 @@ // equalshashcode/DefaultComparison.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/equalshashcode/Equality.java b/equalshashcode/Equality.java index 1565b33f8..6ab13e5e9 100644 --- a/equalshashcode/Equality.java +++ b/equalshashcode/Equality.java @@ -1,5 +1,5 @@ // equalshashcode/Equality.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.*; diff --git a/equalshashcode/EqualityFactory.java b/equalshashcode/EqualityFactory.java index 0f391cbd8..378b56b0d 100644 --- a/equalshashcode/EqualityFactory.java +++ b/equalshashcode/EqualityFactory.java @@ -1,5 +1,5 @@ // equalshashcode/EqualityFactory.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.*; diff --git a/equalshashcode/Groundhog.java b/equalshashcode/Groundhog.java index 2f0513f43..55c775633 100644 --- a/equalshashcode/Groundhog.java +++ b/equalshashcode/Groundhog.java @@ -1,5 +1,5 @@ // equalshashcode/Groundhog.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Looks plausible, but doesn't work as a HashMap key diff --git a/equalshashcode/Groundhog2.java b/equalshashcode/Groundhog2.java index 70f253d81..5348d1e52 100644 --- a/equalshashcode/Groundhog2.java +++ b/equalshashcode/Groundhog2.java @@ -1,5 +1,5 @@ // equalshashcode/Groundhog2.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // A class that's used as a key in a HashMap diff --git a/equalshashcode/IndividualTest.java b/equalshashcode/IndividualTest.java index 9a6e8112e..d8f509743 100644 --- a/equalshashcode/IndividualTest.java +++ b/equalshashcode/IndividualTest.java @@ -1,5 +1,5 @@ // equalshashcode/IndividualTest.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import collections.MapOfList; diff --git a/equalshashcode/MapEntry.java b/equalshashcode/MapEntry.java index a6c106036..c6e28bf4e 100644 --- a/equalshashcode/MapEntry.java +++ b/equalshashcode/MapEntry.java @@ -1,5 +1,5 @@ // equalshashcode/MapEntry.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // A simple Map.Entry for sample Map implementations diff --git a/equalshashcode/Prediction.java b/equalshashcode/Prediction.java index 7706aec1f..c8ff97773 100644 --- a/equalshashcode/Prediction.java +++ b/equalshashcode/Prediction.java @@ -1,5 +1,5 @@ // equalshashcode/Prediction.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Predicting the weather diff --git a/equalshashcode/SimpleHashMap.java b/equalshashcode/SimpleHashMap.java index 4658ec53e..f82022a19 100644 --- a/equalshashcode/SimpleHashMap.java +++ b/equalshashcode/SimpleHashMap.java @@ -1,5 +1,5 @@ // equalshashcode/SimpleHashMap.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // A demonstration hashed Map diff --git a/equalshashcode/SlowMap.java b/equalshashcode/SlowMap.java index 91c9967dd..63f17092d 100644 --- a/equalshashcode/SlowMap.java +++ b/equalshashcode/SlowMap.java @@ -1,5 +1,5 @@ // equalshashcode/SlowMap.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // A Map implemented with ArrayLists diff --git a/equalshashcode/SpringDetector.java b/equalshashcode/SpringDetector.java index 713d032c1..9b41bd3e2 100644 --- a/equalshashcode/SpringDetector.java +++ b/equalshashcode/SpringDetector.java @@ -1,5 +1,5 @@ // equalshashcode/SpringDetector.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // What will the weather be? diff --git a/equalshashcode/SpringDetector2.java b/equalshashcode/SpringDetector2.java index ed9db7249..1e136e477 100644 --- a/equalshashcode/SpringDetector2.java +++ b/equalshashcode/SpringDetector2.java @@ -1,5 +1,5 @@ // equalshashcode/SpringDetector2.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // A working key diff --git a/equalshashcode/StringHashCode.java b/equalshashcode/StringHashCode.java index 69b3df468..222fa612a 100644 --- a/equalshashcode/StringHashCode.java +++ b/equalshashcode/StringHashCode.java @@ -1,5 +1,5 @@ // equalshashcode/StringHashCode.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/equalshashcode/SubtypeEquality.java b/equalshashcode/SubtypeEquality.java index 4dc1d060a..90320c88e 100644 --- a/equalshashcode/SubtypeEquality.java +++ b/equalshashcode/SubtypeEquality.java @@ -1,5 +1,5 @@ // equalshashcode/SubtypeEquality.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.*; diff --git a/equalshashcode/SubtypeEquality2.java b/equalshashcode/SubtypeEquality2.java index 881749293..c0ac50573 100644 --- a/equalshashcode/SubtypeEquality2.java +++ b/equalshashcode/SubtypeEquality2.java @@ -1,5 +1,5 @@ // equalshashcode/SubtypeEquality2.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.*; diff --git a/equalshashcode/SuccinctEquality.java b/equalshashcode/SuccinctEquality.java index a1734dadb..55a0d8de6 100644 --- a/equalshashcode/SuccinctEquality.java +++ b/equalshashcode/SuccinctEquality.java @@ -1,5 +1,5 @@ // equalshashcode/SuccinctEquality.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.*; diff --git a/exceptions/AlwaysFinally.java b/exceptions/AlwaysFinally.java index 38b15a12d..bb2270f77 100644 --- a/exceptions/AlwaysFinally.java +++ b/exceptions/AlwaysFinally.java @@ -1,5 +1,5 @@ // exceptions/AlwaysFinally.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Finally is always executed diff --git a/exceptions/AutoCloseableDetails.java b/exceptions/AutoCloseableDetails.java index e6f8f77d4..24a22e9d6 100644 --- a/exceptions/AutoCloseableDetails.java +++ b/exceptions/AutoCloseableDetails.java @@ -1,5 +1,5 @@ // exceptions/AutoCloseableDetails.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/exceptions/BodyException.java b/exceptions/BodyException.java index 6e5d47777..3e907f8ab 100644 --- a/exceptions/BodyException.java +++ b/exceptions/BodyException.java @@ -1,5 +1,5 @@ // exceptions/BodyException.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/exceptions/Cleanup.java b/exceptions/Cleanup.java index 7eeebe32c..3d072304f 100644 --- a/exceptions/Cleanup.java +++ b/exceptions/Cleanup.java @@ -1,5 +1,5 @@ // exceptions/Cleanup.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Guaranteeing proper cleanup of a resource diff --git a/exceptions/CleanupIdiom.java b/exceptions/CleanupIdiom.java index 9b9e18668..e8dd62c46 100644 --- a/exceptions/CleanupIdiom.java +++ b/exceptions/CleanupIdiom.java @@ -1,5 +1,5 @@ // exceptions/CleanupIdiom.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Disposable objects must be followed by a try-finally diff --git a/exceptions/CloseExceptions.java b/exceptions/CloseExceptions.java index 6a1a51b0d..4309a888f 100644 --- a/exceptions/CloseExceptions.java +++ b/exceptions/CloseExceptions.java @@ -1,5 +1,5 @@ // exceptions/CloseExceptions.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/exceptions/ConstructorException.java b/exceptions/ConstructorException.java index 3c48ecf77..54eaaba35 100644 --- a/exceptions/ConstructorException.java +++ b/exceptions/ConstructorException.java @@ -1,5 +1,5 @@ // exceptions/ConstructorException.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/exceptions/DynamicFields.java b/exceptions/DynamicFields.java index dffc67166..da3b9617f 100644 --- a/exceptions/DynamicFields.java +++ b/exceptions/DynamicFields.java @@ -1,5 +1,5 @@ // exceptions/DynamicFields.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // A Class that dynamically adds fields to itself to diff --git a/exceptions/ExceptionMethods.java b/exceptions/ExceptionMethods.java index 3220c1974..bd6e82598 100644 --- a/exceptions/ExceptionMethods.java +++ b/exceptions/ExceptionMethods.java @@ -1,5 +1,5 @@ // exceptions/ExceptionMethods.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Demonstrating the Exception Methods diff --git a/exceptions/ExceptionSilencer.java b/exceptions/ExceptionSilencer.java index bb57a939a..e418e9de8 100644 --- a/exceptions/ExceptionSilencer.java +++ b/exceptions/ExceptionSilencer.java @@ -1,5 +1,5 @@ // exceptions/ExceptionSilencer.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/exceptions/ExtraFeatures.java b/exceptions/ExtraFeatures.java index 57bb967b0..8aa922afd 100644 --- a/exceptions/ExtraFeatures.java +++ b/exceptions/ExtraFeatures.java @@ -1,5 +1,5 @@ // exceptions/ExtraFeatures.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Further embellishment of exception classes diff --git a/exceptions/FinallyWorks.java b/exceptions/FinallyWorks.java index c406400da..fc4fec0a4 100644 --- a/exceptions/FinallyWorks.java +++ b/exceptions/FinallyWorks.java @@ -1,5 +1,5 @@ // exceptions/FinallyWorks.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // The finally clause is always executed diff --git a/exceptions/FullConstructors.java b/exceptions/FullConstructors.java index c67b4e2f5..f5b4c9ff2 100644 --- a/exceptions/FullConstructors.java +++ b/exceptions/FullConstructors.java @@ -1,5 +1,5 @@ // exceptions/FullConstructors.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/exceptions/Human.java b/exceptions/Human.java index fa067a9e4..7ee7dcaae 100644 --- a/exceptions/Human.java +++ b/exceptions/Human.java @@ -1,5 +1,5 @@ // exceptions/Human.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Catching exception hierarchies diff --git a/exceptions/InheritingExceptions.java b/exceptions/InheritingExceptions.java index 7a6a4dff2..abb80c3b6 100644 --- a/exceptions/InheritingExceptions.java +++ b/exceptions/InheritingExceptions.java @@ -1,5 +1,5 @@ // exceptions/InheritingExceptions.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Creating your own exceptions diff --git a/exceptions/InputFile.java b/exceptions/InputFile.java index 0de1fbe9e..5c269851d 100644 --- a/exceptions/InputFile.java +++ b/exceptions/InputFile.java @@ -1,5 +1,5 @@ // exceptions/InputFile.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Paying attention to exceptions in constructors diff --git a/exceptions/InputFile2.java b/exceptions/InputFile2.java index 2cb71a4c1..74a68c3f1 100644 --- a/exceptions/InputFile2.java +++ b/exceptions/InputFile2.java @@ -1,5 +1,5 @@ // exceptions/InputFile2.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.io.*; diff --git a/exceptions/LoggingExceptions.java b/exceptions/LoggingExceptions.java index 26e9be687..0120ee17f 100644 --- a/exceptions/LoggingExceptions.java +++ b/exceptions/LoggingExceptions.java @@ -1,5 +1,5 @@ // exceptions/LoggingExceptions.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // An exception that reports through a Logger diff --git a/exceptions/LoggingExceptions2.java b/exceptions/LoggingExceptions2.java index 326c20089..21a921379 100644 --- a/exceptions/LoggingExceptions2.java +++ b/exceptions/LoggingExceptions2.java @@ -1,5 +1,5 @@ // exceptions/LoggingExceptions2.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Logging caught exceptions diff --git a/exceptions/LostMessage.java b/exceptions/LostMessage.java index b0f7c318f..1446d9033 100644 --- a/exceptions/LostMessage.java +++ b/exceptions/LostMessage.java @@ -1,5 +1,5 @@ // exceptions/LostMessage.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // How an exception can be lost diff --git a/exceptions/MainException.java b/exceptions/MainException.java index 4c6477ec2..7a7e26387 100644 --- a/exceptions/MainException.java +++ b/exceptions/MainException.java @@ -1,5 +1,5 @@ // exceptions/MainException.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.*; diff --git a/exceptions/MessyExceptions.java b/exceptions/MessyExceptions.java index e79f929d9..e8f7fc9df 100644 --- a/exceptions/MessyExceptions.java +++ b/exceptions/MessyExceptions.java @@ -1,5 +1,5 @@ // exceptions/MessyExceptions.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.io.*; diff --git a/exceptions/MultiCatch.java b/exceptions/MultiCatch.java index 64b954e24..f97bde133 100644 --- a/exceptions/MultiCatch.java +++ b/exceptions/MultiCatch.java @@ -1,5 +1,5 @@ // exceptions/MultiCatch.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/exceptions/MultiCatch2.java b/exceptions/MultiCatch2.java index 2ba042919..4629e93f8 100644 --- a/exceptions/MultiCatch2.java +++ b/exceptions/MultiCatch2.java @@ -1,5 +1,5 @@ // exceptions/MultiCatch2.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/exceptions/MultipleReturns.java b/exceptions/MultipleReturns.java index e6caf3c18..3f667b335 100644 --- a/exceptions/MultipleReturns.java +++ b/exceptions/MultipleReturns.java @@ -1,5 +1,5 @@ // exceptions/MultipleReturns.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/exceptions/NeverCaught.java b/exceptions/NeverCaught.java index a584d0612..c8bb0a2f7 100644 --- a/exceptions/NeverCaught.java +++ b/exceptions/NeverCaught.java @@ -1,5 +1,5 @@ // exceptions/NeverCaught.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Ignoring RuntimeExceptions diff --git a/exceptions/OnOffException1.java b/exceptions/OnOffException1.java index b15243285..3333d815d 100644 --- a/exceptions/OnOffException1.java +++ b/exceptions/OnOffException1.java @@ -1,5 +1,5 @@ // exceptions/OnOffException1.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. public class OnOffException1 extends Exception {} diff --git a/exceptions/OnOffException2.java b/exceptions/OnOffException2.java index 878ea833f..0bb5e1644 100644 --- a/exceptions/OnOffException2.java +++ b/exceptions/OnOffException2.java @@ -1,5 +1,5 @@ // exceptions/OnOffException2.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. public class OnOffException2 extends Exception {} diff --git a/exceptions/OnOffSwitch.java b/exceptions/OnOffSwitch.java index 7f4f35b50..fe05fa351 100644 --- a/exceptions/OnOffSwitch.java +++ b/exceptions/OnOffSwitch.java @@ -1,5 +1,5 @@ // exceptions/OnOffSwitch.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Why use finally? diff --git a/exceptions/PreciseRethrow.java b/exceptions/PreciseRethrow.java index 8e9749380..f8849a3d4 100644 --- a/exceptions/PreciseRethrow.java +++ b/exceptions/PreciseRethrow.java @@ -1,5 +1,5 @@ // exceptions/PreciseRethrow.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/exceptions/RethrowNew.java b/exceptions/RethrowNew.java index e03f75099..daa4ad418 100644 --- a/exceptions/RethrowNew.java +++ b/exceptions/RethrowNew.java @@ -1,5 +1,5 @@ // exceptions/RethrowNew.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Rethrow a different object from the one you caught diff --git a/exceptions/Rethrowing.java b/exceptions/Rethrowing.java index 2a82dafef..5bf1a6357 100644 --- a/exceptions/Rethrowing.java +++ b/exceptions/Rethrowing.java @@ -1,5 +1,5 @@ // exceptions/Rethrowing.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Demonstrating fillInStackTrace() diff --git a/exceptions/SameHandler.java b/exceptions/SameHandler.java index 5229dc66e..8c6805679 100644 --- a/exceptions/SameHandler.java +++ b/exceptions/SameHandler.java @@ -1,5 +1,5 @@ // exceptions/SameHandler.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/exceptions/StormyInning.java b/exceptions/StormyInning.java index 1656d062e..644c10ba8 100644 --- a/exceptions/StormyInning.java +++ b/exceptions/StormyInning.java @@ -1,5 +1,5 @@ // exceptions/StormyInning.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Overridden methods can throw only the exceptions diff --git a/exceptions/StreamsAreAutoCloseable.java b/exceptions/StreamsAreAutoCloseable.java index 40317d88c..c55bf417b 100644 --- a/exceptions/StreamsAreAutoCloseable.java +++ b/exceptions/StreamsAreAutoCloseable.java @@ -1,5 +1,5 @@ // exceptions/StreamsAreAutoCloseable.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.io.*; diff --git a/exceptions/Switch.java b/exceptions/Switch.java index ea1323ce4..7d491d004 100644 --- a/exceptions/Switch.java +++ b/exceptions/Switch.java @@ -1,5 +1,5 @@ // exceptions/Switch.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/exceptions/TryAnything.java b/exceptions/TryAnything.java index 88e78a898..9eeee07b1 100644 --- a/exceptions/TryAnything.java +++ b/exceptions/TryAnything.java @@ -1,5 +1,5 @@ // exceptions/TryAnything.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // {WillNotCompile} diff --git a/exceptions/TryWithResources.java b/exceptions/TryWithResources.java index daf97a55a..cdc83a5cf 100644 --- a/exceptions/TryWithResources.java +++ b/exceptions/TryWithResources.java @@ -1,5 +1,5 @@ // exceptions/TryWithResources.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.io.*; diff --git a/exceptions/TurnOffChecking.java b/exceptions/TurnOffChecking.java index 8412b5c8a..898431b64 100644 --- a/exceptions/TurnOffChecking.java +++ b/exceptions/TurnOffChecking.java @@ -1,5 +1,5 @@ // exceptions/TurnOffChecking.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // "Turning off" Checked exceptions diff --git a/exceptions/WhoCalled.java b/exceptions/WhoCalled.java index 8e5f611c3..4c4e01041 100644 --- a/exceptions/WhoCalled.java +++ b/exceptions/WhoCalled.java @@ -1,5 +1,5 @@ // exceptions/WhoCalled.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Programmatic access to stack trace information diff --git a/exceptions/WithFinally.java b/exceptions/WithFinally.java index fc893d6e7..9d3efc3a4 100644 --- a/exceptions/WithFinally.java +++ b/exceptions/WithFinally.java @@ -1,5 +1,5 @@ // exceptions/WithFinally.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Finally Guarantees cleanup diff --git a/files/AddAndSubtractPaths.java b/files/AddAndSubtractPaths.java index c13121bab..f3984d19c 100644 --- a/files/AddAndSubtractPaths.java +++ b/files/AddAndSubtractPaths.java @@ -1,5 +1,5 @@ // files/AddAndSubtractPaths.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.nio.file.*; diff --git a/files/Directories.java b/files/Directories.java index fe41a2321..10ad9beec 100644 --- a/files/Directories.java +++ b/files/Directories.java @@ -1,5 +1,5 @@ // files/Directories.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.*; diff --git a/files/FileSystemDemo.java b/files/FileSystemDemo.java index 883c7537e..3d9024ca8 100644 --- a/files/FileSystemDemo.java +++ b/files/FileSystemDemo.java @@ -1,5 +1,5 @@ // files/FileSystemDemo.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.nio.file.*; diff --git a/files/Find.java b/files/Find.java index c9bafd0bc..ac97ebdce 100644 --- a/files/Find.java +++ b/files/Find.java @@ -1,5 +1,5 @@ // files/Find.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // {ExcludeFromGradle} diff --git a/files/ListOfLines.java b/files/ListOfLines.java index 0e948545b..6f9ef467d 100644 --- a/files/ListOfLines.java +++ b/files/ListOfLines.java @@ -1,5 +1,5 @@ // files/ListOfLines.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.*; diff --git a/files/PartsOfPaths.java b/files/PartsOfPaths.java index 9f27e035c..1170fc688 100644 --- a/files/PartsOfPaths.java +++ b/files/PartsOfPaths.java @@ -1,5 +1,5 @@ // files/PartsOfPaths.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.nio.file.*; diff --git a/files/PathAnalysis.java b/files/PathAnalysis.java index fc617639a..117119cdd 100644 --- a/files/PathAnalysis.java +++ b/files/PathAnalysis.java @@ -1,5 +1,5 @@ // files/PathAnalysis.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.nio.file.*; diff --git a/files/PathInfo.java b/files/PathInfo.java index d963ee294..96af9d938 100644 --- a/files/PathInfo.java +++ b/files/PathInfo.java @@ -1,5 +1,5 @@ // files/PathInfo.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.nio.file.*; diff --git a/files/PathWatcher.java b/files/PathWatcher.java index d880219ae..162641d72 100644 --- a/files/PathWatcher.java +++ b/files/PathWatcher.java @@ -1,5 +1,5 @@ // files/PathWatcher.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // {ExcludeFromGradle} diff --git a/files/ReadLineStream.java b/files/ReadLineStream.java index 1409fbee1..64b0f562d 100644 --- a/files/ReadLineStream.java +++ b/files/ReadLineStream.java @@ -1,5 +1,5 @@ // files/ReadLineStream.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.nio.file.*; diff --git a/files/StreamInAndOut.java b/files/StreamInAndOut.java index 74a721e9b..ec17c7008 100644 --- a/files/StreamInAndOut.java +++ b/files/StreamInAndOut.java @@ -1,5 +1,5 @@ // files/StreamInAndOut.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.io.*; diff --git a/files/TreeWatcher.java b/files/TreeWatcher.java index ea36be3fb..f0660888d 100644 --- a/files/TreeWatcher.java +++ b/files/TreeWatcher.java @@ -1,5 +1,5 @@ // files/TreeWatcher.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // {ExcludeFromGradle} diff --git a/files/Writing.java b/files/Writing.java index a72816700..68a04fbcd 100644 --- a/files/Writing.java +++ b/files/Writing.java @@ -1,5 +1,5 @@ // files/Writing.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.*; diff --git a/functional/AnonymousClosure.java b/functional/AnonymousClosure.java index 92c232c74..497a1a526 100644 --- a/functional/AnonymousClosure.java +++ b/functional/AnonymousClosure.java @@ -1,5 +1,5 @@ // functional/AnonymousClosure.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.function.*; diff --git a/functional/BiConsumerPermutations.java b/functional/BiConsumerPermutations.java index 90e2f3dc4..75b7c32d5 100644 --- a/functional/BiConsumerPermutations.java +++ b/functional/BiConsumerPermutations.java @@ -1,5 +1,5 @@ // functional/BiConsumerPermutations.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.function.*; diff --git a/functional/ClassFunctionals.java b/functional/ClassFunctionals.java index 06d43a236..e5101df4f 100644 --- a/functional/ClassFunctionals.java +++ b/functional/ClassFunctionals.java @@ -1,5 +1,5 @@ // functional/ClassFunctionals.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.*; diff --git a/functional/Closure1.java b/functional/Closure1.java index f0dfdf060..2f504f42c 100644 --- a/functional/Closure1.java +++ b/functional/Closure1.java @@ -1,5 +1,5 @@ // functional/Closure1.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.function.*; diff --git a/functional/Closure2.java b/functional/Closure2.java index f42c77342..825cf4233 100644 --- a/functional/Closure2.java +++ b/functional/Closure2.java @@ -1,5 +1,5 @@ // functional/Closure2.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.function.*; diff --git a/functional/Closure3.java b/functional/Closure3.java index 4719f90cf..811179fb8 100644 --- a/functional/Closure3.java +++ b/functional/Closure3.java @@ -1,5 +1,5 @@ // functional/Closure3.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // {WillNotCompile} diff --git a/functional/Closure4.java b/functional/Closure4.java index 947417607..148aaf649 100644 --- a/functional/Closure4.java +++ b/functional/Closure4.java @@ -1,5 +1,5 @@ // functional/Closure4.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.function.*; diff --git a/functional/Closure5.java b/functional/Closure5.java index ad98bad24..fb9aad779 100644 --- a/functional/Closure5.java +++ b/functional/Closure5.java @@ -1,5 +1,5 @@ // functional/Closure5.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // {WillNotCompile} diff --git a/functional/Closure6.java b/functional/Closure6.java index 459dc6c8c..178f9b4a6 100644 --- a/functional/Closure6.java +++ b/functional/Closure6.java @@ -1,5 +1,5 @@ // functional/Closure6.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.function.*; diff --git a/functional/Closure7.java b/functional/Closure7.java index 5dc34986d..9facdc062 100644 --- a/functional/Closure7.java +++ b/functional/Closure7.java @@ -1,5 +1,5 @@ // functional/Closure7.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // {WillNotCompile} diff --git a/functional/Closure8.java b/functional/Closure8.java index 70ed1e248..7ec059b2a 100644 --- a/functional/Closure8.java +++ b/functional/Closure8.java @@ -1,5 +1,5 @@ // functional/Closure8.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.*; diff --git a/functional/Closure9.java b/functional/Closure9.java index af3cb8f4b..4eddb47a0 100644 --- a/functional/Closure9.java +++ b/functional/Closure9.java @@ -1,5 +1,5 @@ // functional/Closure9.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // {WillNotCompile} diff --git a/functional/ConsumeFunction.java b/functional/ConsumeFunction.java index bbab0aa0d..ea84a24a1 100644 --- a/functional/ConsumeFunction.java +++ b/functional/ConsumeFunction.java @@ -1,5 +1,5 @@ // functional/ConsumeFunction.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.function.*; diff --git a/functional/CtorReference.java b/functional/CtorReference.java index 0ea701774..4c22bdf1c 100644 --- a/functional/CtorReference.java +++ b/functional/CtorReference.java @@ -1,5 +1,5 @@ // functional/CtorReference.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/functional/CurriedIntAdd.java b/functional/CurriedIntAdd.java index 7b89d59cb..e89ac8e28 100644 --- a/functional/CurriedIntAdd.java +++ b/functional/CurriedIntAdd.java @@ -1,5 +1,5 @@ // functional/CurriedIntAdd.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.function.*; diff --git a/functional/Curry3Args.java b/functional/Curry3Args.java index e27fd0adb..0fd376bc2 100644 --- a/functional/Curry3Args.java +++ b/functional/Curry3Args.java @@ -1,5 +1,5 @@ // functional/Curry3Args.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.function.*; diff --git a/functional/CurryingAndPartials.java b/functional/CurryingAndPartials.java index 795a1afda..0addb8115 100644 --- a/functional/CurryingAndPartials.java +++ b/functional/CurryingAndPartials.java @@ -1,5 +1,5 @@ // functional/CurryingAndPartials.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.function.*; diff --git a/functional/FunctionComposition.java b/functional/FunctionComposition.java index 74a66ddd4..a183039d0 100644 --- a/functional/FunctionComposition.java +++ b/functional/FunctionComposition.java @@ -1,5 +1,5 @@ // functional/FunctionComposition.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.function.*; diff --git a/functional/FunctionVariants.java b/functional/FunctionVariants.java index d09476ca6..a62054620 100644 --- a/functional/FunctionVariants.java +++ b/functional/FunctionVariants.java @@ -1,5 +1,5 @@ // functional/FunctionVariants.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.function.*; diff --git a/functional/FunctionWithWrapped.java b/functional/FunctionWithWrapped.java index 99dd8743b..b654da654 100644 --- a/functional/FunctionWithWrapped.java +++ b/functional/FunctionWithWrapped.java @@ -1,5 +1,5 @@ // functional/FunctionWithWrapped.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.function.*; diff --git a/functional/FunctionalAnnotation.java b/functional/FunctionalAnnotation.java index 0116d87b6..84cec6498 100644 --- a/functional/FunctionalAnnotation.java +++ b/functional/FunctionalAnnotation.java @@ -1,5 +1,5 @@ // functional/FunctionalAnnotation.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/functional/IntCall.java b/functional/IntCall.java index 73b985803..a8256a00c 100644 --- a/functional/IntCall.java +++ b/functional/IntCall.java @@ -1,5 +1,5 @@ // functional/IntCall.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/functional/LambdaExpressions.java b/functional/LambdaExpressions.java index 3f2b3f734..fe7e3acb1 100644 --- a/functional/LambdaExpressions.java +++ b/functional/LambdaExpressions.java @@ -1,5 +1,5 @@ // functional/LambdaExpressions.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/functional/MethodConversion.java b/functional/MethodConversion.java index 184f01b38..008ecfc0c 100644 --- a/functional/MethodConversion.java +++ b/functional/MethodConversion.java @@ -1,5 +1,5 @@ // functional/MethodConversion.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.function.*; diff --git a/functional/MethodReferences.java b/functional/MethodReferences.java index dde6ba0e0..63bc365d8 100644 --- a/functional/MethodReferences.java +++ b/functional/MethodReferences.java @@ -1,5 +1,5 @@ // functional/MethodReferences.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.*; diff --git a/functional/MultiUnbound.java b/functional/MultiUnbound.java index ce50b2f4d..4209fb040 100644 --- a/functional/MultiUnbound.java +++ b/functional/MultiUnbound.java @@ -1,5 +1,5 @@ // functional/MultiUnbound.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Unbound methods with multiple arguments diff --git a/functional/PredicateComposition.java b/functional/PredicateComposition.java index 5ebe4e77d..f95bbcbdd 100644 --- a/functional/PredicateComposition.java +++ b/functional/PredicateComposition.java @@ -1,5 +1,5 @@ // functional/PredicateComposition.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.function.*; diff --git a/functional/ProduceFunction.java b/functional/ProduceFunction.java index 6682be9d9..034716011 100644 --- a/functional/ProduceFunction.java +++ b/functional/ProduceFunction.java @@ -1,5 +1,5 @@ // functional/ProduceFunction.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.function.*; diff --git a/functional/RecursiveFactorial.java b/functional/RecursiveFactorial.java index 0a32d3346..2d6104413 100644 --- a/functional/RecursiveFactorial.java +++ b/functional/RecursiveFactorial.java @@ -1,5 +1,5 @@ // functional/RecursiveFactorial.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/functional/RecursiveFibonacci.java b/functional/RecursiveFibonacci.java index 8cb2c7d24..9be43dc62 100644 --- a/functional/RecursiveFibonacci.java +++ b/functional/RecursiveFibonacci.java @@ -1,5 +1,5 @@ // functional/RecursiveFibonacci.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/functional/RunnableMethodReference.java b/functional/RunnableMethodReference.java index 92f2e2906..5fb8cd002 100644 --- a/functional/RunnableMethodReference.java +++ b/functional/RunnableMethodReference.java @@ -1,5 +1,5 @@ // functional/RunnableMethodReference.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Method references with interface Runnable diff --git a/functional/SharedStorage.java b/functional/SharedStorage.java index 20da6917b..c2a41f66a 100644 --- a/functional/SharedStorage.java +++ b/functional/SharedStorage.java @@ -1,5 +1,5 @@ // functional/SharedStorage.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.function.*; diff --git a/functional/Strategize.java b/functional/Strategize.java index c101fd1d3..e46c91434 100644 --- a/functional/Strategize.java +++ b/functional/Strategize.java @@ -1,5 +1,5 @@ // functional/Strategize.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/functional/TransformFunction.java b/functional/TransformFunction.java index 8a8c4928d..1a046eb12 100644 --- a/functional/TransformFunction.java +++ b/functional/TransformFunction.java @@ -1,5 +1,5 @@ // functional/TransformFunction.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.function.*; diff --git a/functional/TriFunction.java b/functional/TriFunction.java index 47895dc95..760496214 100644 --- a/functional/TriFunction.java +++ b/functional/TriFunction.java @@ -1,5 +1,5 @@ // functional/TriFunction.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/functional/TriFunctionTest.java b/functional/TriFunctionTest.java index f87b4421e..fccf8b9a2 100644 --- a/functional/TriFunctionTest.java +++ b/functional/TriFunctionTest.java @@ -1,5 +1,5 @@ // functional/TriFunctionTest.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/functional/UnboundMethodReference.java b/functional/UnboundMethodReference.java index 88c9d3d33..da2c78729 100644 --- a/functional/UnboundMethodReference.java +++ b/functional/UnboundMethodReference.java @@ -1,5 +1,5 @@ // functional/UnboundMethodReference.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Method reference without an object diff --git a/generics/Amphibian.java b/generics/Amphibian.java index fbff20b56..5e76d8b18 100644 --- a/generics/Amphibian.java +++ b/generics/Amphibian.java @@ -1,5 +1,5 @@ // generics/Amphibian.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. public class Amphibian {} diff --git a/generics/Apply.java b/generics/Apply.java index d1923a279..c93786113 100644 --- a/generics/Apply.java +++ b/generics/Apply.java @@ -1,5 +1,5 @@ // generics/Apply.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.lang.reflect.*; diff --git a/generics/ApplyFunctional.java b/generics/ApplyFunctional.java index 2dd8aa1c8..4cce156e8 100644 --- a/generics/ApplyFunctional.java +++ b/generics/ApplyFunctional.java @@ -1,5 +1,5 @@ // generics/ApplyFunctional.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.*; diff --git a/generics/ApplyTest.java b/generics/ApplyTest.java index ea50a98bd..62ef4eecf 100644 --- a/generics/ApplyTest.java +++ b/generics/ApplyTest.java @@ -1,5 +1,5 @@ // generics/ApplyTest.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.*; diff --git a/generics/ArrayMaker.java b/generics/ArrayMaker.java index 9b495d4e4..f1bb6b9a4 100644 --- a/generics/ArrayMaker.java +++ b/generics/ArrayMaker.java @@ -1,5 +1,5 @@ // generics/ArrayMaker.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.lang.reflect.*; diff --git a/generics/ArrayOfGeneric.java b/generics/ArrayOfGeneric.java index 210d01368..67e6cb97c 100644 --- a/generics/ArrayOfGeneric.java +++ b/generics/ArrayOfGeneric.java @@ -1,5 +1,5 @@ // generics/ArrayOfGeneric.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/generics/ArrayOfGenericReference.java b/generics/ArrayOfGenericReference.java index a1484e2f9..1cb2f3455 100644 --- a/generics/ArrayOfGenericReference.java +++ b/generics/ArrayOfGenericReference.java @@ -1,5 +1,5 @@ // generics/ArrayOfGenericReference.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/generics/BankTeller.java b/generics/BankTeller.java index c0116a6ae..68301996d 100644 --- a/generics/BankTeller.java +++ b/generics/BankTeller.java @@ -1,5 +1,5 @@ // generics/BankTeller.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // A very simple bank teller simulation diff --git a/generics/BasicBounds.java b/generics/BasicBounds.java index 321e571e0..434d0fd8f 100644 --- a/generics/BasicBounds.java +++ b/generics/BasicBounds.java @@ -1,5 +1,5 @@ // generics/BasicBounds.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/generics/BasicHolder.java b/generics/BasicHolder.java index 8d8838391..2b8b8a9b1 100644 --- a/generics/BasicHolder.java +++ b/generics/BasicHolder.java @@ -1,5 +1,5 @@ // generics/BasicHolder.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/generics/BasicSupplierDemo.java b/generics/BasicSupplierDemo.java index 1d34c2337..1ce95ca19 100644 --- a/generics/BasicSupplierDemo.java +++ b/generics/BasicSupplierDemo.java @@ -1,5 +1,5 @@ // generics/BasicSupplierDemo.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import onjava.*; diff --git a/generics/ByteSet.java b/generics/ByteSet.java index ae1a2573b..19b27091a 100644 --- a/generics/ByteSet.java +++ b/generics/ByteSet.java @@ -1,5 +1,5 @@ // generics/ByteSet.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.*; diff --git a/generics/CRGWithBasicHolder.java b/generics/CRGWithBasicHolder.java index 4db0784a3..eb85868a4 100644 --- a/generics/CRGWithBasicHolder.java +++ b/generics/CRGWithBasicHolder.java @@ -1,5 +1,5 @@ // generics/CRGWithBasicHolder.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/generics/CaptureConversion.java b/generics/CaptureConversion.java index 190140008..163484682 100644 --- a/generics/CaptureConversion.java +++ b/generics/CaptureConversion.java @@ -1,5 +1,5 @@ // generics/CaptureConversion.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/generics/CheckedList.java b/generics/CheckedList.java index b18abf2ee..6e330cf6b 100644 --- a/generics/CheckedList.java +++ b/generics/CheckedList.java @@ -1,5 +1,5 @@ // generics/CheckedList.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Using Collection.checkedList() diff --git a/generics/ClassCasting.java b/generics/ClassCasting.java index 714e9610b..c6da592a6 100644 --- a/generics/ClassCasting.java +++ b/generics/ClassCasting.java @@ -1,5 +1,5 @@ // generics/ClassCasting.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.io.*; diff --git a/generics/ClassTypeCapture.java b/generics/ClassTypeCapture.java index d98210c2c..ab193dfe6 100644 --- a/generics/ClassTypeCapture.java +++ b/generics/ClassTypeCapture.java @@ -1,5 +1,5 @@ // generics/ClassTypeCapture.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/generics/ComparablePet.java b/generics/ComparablePet.java index 356cc6472..3646e66aa 100644 --- a/generics/ComparablePet.java +++ b/generics/ComparablePet.java @@ -1,5 +1,5 @@ // generics/ComparablePet.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/generics/CompilerIntelligence.java b/generics/CompilerIntelligence.java index 437b44e14..6e4cd0e81 100644 --- a/generics/CompilerIntelligence.java +++ b/generics/CompilerIntelligence.java @@ -1,5 +1,5 @@ // generics/CompilerIntelligence.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.*; diff --git a/generics/CountedObject.java b/generics/CountedObject.java index 81777402d..ab4caecdb 100644 --- a/generics/CountedObject.java +++ b/generics/CountedObject.java @@ -1,5 +1,5 @@ // generics/CountedObject.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/generics/CovariantArrays.java b/generics/CovariantArrays.java index 3d30a4202..e202ca079 100644 --- a/generics/CovariantArrays.java +++ b/generics/CovariantArrays.java @@ -1,5 +1,5 @@ // generics/CovariantArrays.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/generics/CovariantReturnTypes.java b/generics/CovariantReturnTypes.java index 5a1c4797e..04178ad4b 100644 --- a/generics/CovariantReturnTypes.java +++ b/generics/CovariantReturnTypes.java @@ -1,5 +1,5 @@ // generics/CovariantReturnTypes.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/generics/CreatorGeneric.java b/generics/CreatorGeneric.java index 98bf7c161..7fd90df46 100644 --- a/generics/CreatorGeneric.java +++ b/generics/CreatorGeneric.java @@ -1,5 +1,5 @@ // generics/CreatorGeneric.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/generics/CuriouslyRecurringGeneric.java b/generics/CuriouslyRecurringGeneric.java index 1d3a69cd1..ee1f3a615 100644 --- a/generics/CuriouslyRecurringGeneric.java +++ b/generics/CuriouslyRecurringGeneric.java @@ -1,5 +1,5 @@ // generics/CuriouslyRecurringGeneric.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/generics/Diamond.java b/generics/Diamond.java index 3af10a18b..32c3ff1ae 100644 --- a/generics/Diamond.java +++ b/generics/Diamond.java @@ -1,5 +1,5 @@ // generics/Diamond.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/generics/DogsAndRobotMethodReferences.java b/generics/DogsAndRobotMethodReferences.java index 81b2c078f..7c3fa3575 100644 --- a/generics/DogsAndRobotMethodReferences.java +++ b/generics/DogsAndRobotMethodReferences.java @@ -1,5 +1,5 @@ // generics/DogsAndRobotMethodReferences.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // "Assisted Latent Typing" diff --git a/generics/DogsAndRobots.cpp b/generics/DogsAndRobots.cpp index 212893a6d..81ced5d99 100644 --- a/generics/DogsAndRobots.cpp +++ b/generics/DogsAndRobots.cpp @@ -1,5 +1,5 @@ // generics/DogsAndRobots.cpp -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. #include diff --git a/generics/DogsAndRobots.java b/generics/DogsAndRobots.java index 95ee18a30..b61511227 100644 --- a/generics/DogsAndRobots.java +++ b/generics/DogsAndRobots.java @@ -1,5 +1,5 @@ // generics/DogsAndRobots.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // No (direct) latent typing in Java diff --git a/generics/DogsAndRobots.py b/generics/DogsAndRobots.py index d09b24139..c9ca6fef9 100644 --- a/generics/DogsAndRobots.py +++ b/generics/DogsAndRobots.py @@ -1,5 +1,5 @@ # generics/DogsAndRobots.py -# (c)2017 MindView LLC: see Copyright.txt +# (c)2020 MindView LLC: see Copyright.txt # We make no guarantees that this code is fit for any purpose. # Visit http://OnJava8.com for more book information. diff --git a/generics/DynamicProxyMixin.java b/generics/DynamicProxyMixin.java index 5aaf96b7d..008efb12a 100644 --- a/generics/DynamicProxyMixin.java +++ b/generics/DynamicProxyMixin.java @@ -1,5 +1,5 @@ // generics/DynamicProxyMixin.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.lang.reflect.*; diff --git a/generics/EpicBattle.java b/generics/EpicBattle.java index f1453c9e5..908a33437 100644 --- a/generics/EpicBattle.java +++ b/generics/EpicBattle.java @@ -1,5 +1,5 @@ // generics/EpicBattle.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Bounds in Java generics diff --git a/generics/Erased.java b/generics/Erased.java index 0c60fbfd4..911839c39 100644 --- a/generics/Erased.java +++ b/generics/Erased.java @@ -1,5 +1,5 @@ // generics/Erased.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // {WillNotCompile} diff --git a/generics/ErasedTypeEquivalence.java b/generics/ErasedTypeEquivalence.java index 9b3827df3..6034b3048 100644 --- a/generics/ErasedTypeEquivalence.java +++ b/generics/ErasedTypeEquivalence.java @@ -1,5 +1,5 @@ // generics/ErasedTypeEquivalence.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.*; diff --git a/generics/ErasureAndInheritance.java b/generics/ErasureAndInheritance.java index 9a723c1b5..44a07b625 100644 --- a/generics/ErasureAndInheritance.java +++ b/generics/ErasureAndInheritance.java @@ -1,5 +1,5 @@ // generics/ErasureAndInheritance.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/generics/FactoryConstraint.java b/generics/FactoryConstraint.java index c2960da1d..f06510732 100644 --- a/generics/FactoryConstraint.java +++ b/generics/FactoryConstraint.java @@ -1,5 +1,5 @@ // generics/FactoryConstraint.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.*; diff --git a/generics/Fibonacci.java b/generics/Fibonacci.java index 25d123589..115400617 100644 --- a/generics/Fibonacci.java +++ b/generics/Fibonacci.java @@ -1,5 +1,5 @@ // generics/Fibonacci.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Generate a Fibonacci sequence diff --git a/generics/FilledList.java b/generics/FilledList.java index 064715f06..e24423cef 100644 --- a/generics/FilledList.java +++ b/generics/FilledList.java @@ -1,5 +1,5 @@ // generics/FilledList.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.*; diff --git a/generics/GenericArray.java b/generics/GenericArray.java index c272afcf1..f0ffba3d2 100644 --- a/generics/GenericArray.java +++ b/generics/GenericArray.java @@ -1,5 +1,5 @@ // generics/GenericArray.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/generics/GenericArray2.java b/generics/GenericArray2.java index 50c9434d0..7ef4179ec 100644 --- a/generics/GenericArray2.java +++ b/generics/GenericArray2.java @@ -1,5 +1,5 @@ // generics/GenericArray2.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/generics/GenericArrayWithTypeToken.java b/generics/GenericArrayWithTypeToken.java index 41fcd124e..6ea36a767 100644 --- a/generics/GenericArrayWithTypeToken.java +++ b/generics/GenericArrayWithTypeToken.java @@ -1,5 +1,5 @@ // generics/GenericArrayWithTypeToken.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.lang.reflect.*; diff --git a/generics/GenericCast.java b/generics/GenericCast.java index ddf5deae1..c3f82dac7 100644 --- a/generics/GenericCast.java +++ b/generics/GenericCast.java @@ -1,5 +1,5 @@ // generics/GenericCast.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.*; diff --git a/generics/GenericHolder.java b/generics/GenericHolder.java index 72cf4f2ce..6d998a1cb 100644 --- a/generics/GenericHolder.java +++ b/generics/GenericHolder.java @@ -1,5 +1,5 @@ // generics/GenericHolder.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/generics/GenericHolder2.java b/generics/GenericHolder2.java index b71543191..9747f49b9 100644 --- a/generics/GenericHolder2.java +++ b/generics/GenericHolder2.java @@ -1,5 +1,5 @@ // generics/GenericHolder2.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/generics/GenericMethods.java b/generics/GenericMethods.java index 50db2061b..66f40e72d 100644 --- a/generics/GenericMethods.java +++ b/generics/GenericMethods.java @@ -1,5 +1,5 @@ // generics/GenericMethods.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/generics/GenericReading.java b/generics/GenericReading.java index 2bb83cf83..5709c7a92 100644 --- a/generics/GenericReading.java +++ b/generics/GenericReading.java @@ -1,5 +1,5 @@ // generics/GenericReading.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.*; diff --git a/generics/GenericVarargs.java b/generics/GenericVarargs.java index 94f679a90..3a6e348ca 100644 --- a/generics/GenericVarargs.java +++ b/generics/GenericVarargs.java @@ -1,5 +1,5 @@ // generics/GenericVarargs.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.*; diff --git a/generics/GenericsAndCovariance.java b/generics/GenericsAndCovariance.java index 31cdc6605..f16b837be 100644 --- a/generics/GenericsAndCovariance.java +++ b/generics/GenericsAndCovariance.java @@ -1,5 +1,5 @@ // generics/GenericsAndCovariance.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.*; diff --git a/generics/GenericsAndReturnTypes.java b/generics/GenericsAndReturnTypes.java index c64d6a18b..de661864b 100644 --- a/generics/GenericsAndReturnTypes.java +++ b/generics/GenericsAndReturnTypes.java @@ -1,5 +1,5 @@ // generics/GenericsAndReturnTypes.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/generics/HasF.java b/generics/HasF.java index 70f8c0606..f967386e3 100644 --- a/generics/HasF.java +++ b/generics/HasF.java @@ -1,5 +1,5 @@ // generics/HasF.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/generics/HijackedInterface.java b/generics/HijackedInterface.java index c417ecab2..868e1d465 100644 --- a/generics/HijackedInterface.java +++ b/generics/HijackedInterface.java @@ -1,5 +1,5 @@ // generics/HijackedInterface.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // {WillNotCompile} diff --git a/generics/Holder.java b/generics/Holder.java index 0d8e85d00..e4301dc66 100644 --- a/generics/Holder.java +++ b/generics/Holder.java @@ -1,5 +1,5 @@ // generics/Holder.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.Objects; diff --git a/generics/Holder1.java b/generics/Holder1.java index dc9f7a115..0c222cb57 100644 --- a/generics/Holder1.java +++ b/generics/Holder1.java @@ -1,5 +1,5 @@ // generics/Holder1.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/generics/InheritBounds.java b/generics/InheritBounds.java index 7f535f3b7..fddd25431 100644 --- a/generics/InheritBounds.java +++ b/generics/InheritBounds.java @@ -1,5 +1,5 @@ // generics/InheritBounds.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/generics/InstantiateGenericType.cpp b/generics/InstantiateGenericType.cpp index 6197e5c31..1799d05ba 100644 --- a/generics/InstantiateGenericType.cpp +++ b/generics/InstantiateGenericType.cpp @@ -1,5 +1,5 @@ // generics/InstantiateGenericType.cpp -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // C++, not Java! diff --git a/generics/InstantiateGenericType.java b/generics/InstantiateGenericType.java index 4c46b04ba..5bd42e84f 100644 --- a/generics/InstantiateGenericType.java +++ b/generics/InstantiateGenericType.java @@ -1,5 +1,5 @@ // generics/InstantiateGenericType.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.function.*; diff --git a/generics/IterableFibonacci.java b/generics/IterableFibonacci.java index 69708eb28..b5ccf285a 100644 --- a/generics/IterableFibonacci.java +++ b/generics/IterableFibonacci.java @@ -1,5 +1,5 @@ // generics/IterableFibonacci.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Adapt the Fibonacci class to make it Iterable diff --git a/generics/LatentReflection.java b/generics/LatentReflection.java index 9ee02bf18..0e9511a34 100644 --- a/generics/LatentReflection.java +++ b/generics/LatentReflection.java @@ -1,5 +1,5 @@ // generics/LatentReflection.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Using reflection for latent typing diff --git a/generics/LinkedStack.java b/generics/LinkedStack.java index 31f7fd0fd..5142bcc73 100644 --- a/generics/LinkedStack.java +++ b/generics/LinkedStack.java @@ -1,5 +1,5 @@ // generics/LinkedStack.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // A stack implemented with an internal linked structure diff --git a/generics/ListMaker.java b/generics/ListMaker.java index 7de76a847..582cbaea8 100644 --- a/generics/ListMaker.java +++ b/generics/ListMaker.java @@ -1,5 +1,5 @@ // generics/ListMaker.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.*; diff --git a/generics/ListOfGenerics.java b/generics/ListOfGenerics.java index c0f5fae80..10a480318 100644 --- a/generics/ListOfGenerics.java +++ b/generics/ListOfGenerics.java @@ -1,5 +1,5 @@ // generics/ListOfGenerics.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.*; diff --git a/generics/ListOfInt.java b/generics/ListOfInt.java index 50491f8f2..f8ac8e11d 100644 --- a/generics/ListOfInt.java +++ b/generics/ListOfInt.java @@ -1,5 +1,5 @@ // generics/ListOfInt.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Autoboxing compensates for the inability diff --git a/generics/LostInformation.java b/generics/LostInformation.java index 031a166c1..e27430d2e 100644 --- a/generics/LostInformation.java +++ b/generics/LostInformation.java @@ -1,5 +1,5 @@ // generics/LostInformation.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.*; diff --git a/generics/Manipulation.java b/generics/Manipulation.java index ff9cb384d..f365cf199 100644 --- a/generics/Manipulation.java +++ b/generics/Manipulation.java @@ -1,5 +1,5 @@ // generics/Manipulation.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // {WillNotCompile} diff --git a/generics/Manipulator2.java b/generics/Manipulator2.java index 7d044ef87..7c7c648bb 100644 --- a/generics/Manipulator2.java +++ b/generics/Manipulator2.java @@ -1,5 +1,5 @@ // generics/Manipulator2.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/generics/Manipulator3.java b/generics/Manipulator3.java index 7b7b833fb..2201d474c 100644 --- a/generics/Manipulator3.java +++ b/generics/Manipulator3.java @@ -1,5 +1,5 @@ // generics/Manipulator3.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/generics/Mixins.cpp b/generics/Mixins.cpp index 3178f357c..89949d46b 100644 --- a/generics/Mixins.cpp +++ b/generics/Mixins.cpp @@ -1,5 +1,5 @@ // generics/Mixins.cpp -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. #include diff --git a/generics/Mixins.java b/generics/Mixins.java index 3c3b94482..af58b81e0 100644 --- a/generics/Mixins.java +++ b/generics/Mixins.java @@ -1,5 +1,5 @@ // generics/Mixins.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.*; diff --git a/generics/MultipleInterfaceVariants.java b/generics/MultipleInterfaceVariants.java index aca655945..70a535a23 100644 --- a/generics/MultipleInterfaceVariants.java +++ b/generics/MultipleInterfaceVariants.java @@ -1,5 +1,5 @@ // generics/MultipleInterfaceVariants.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // {WillNotCompile} diff --git a/generics/NeedCasting.java b/generics/NeedCasting.java index 910be732d..8801f5d8b 100644 --- a/generics/NeedCasting.java +++ b/generics/NeedCasting.java @@ -1,5 +1,5 @@ // generics/NeedCasting.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.io.*; diff --git a/generics/NonCovariantGenerics.java b/generics/NonCovariantGenerics.java index c532708ed..c219a0d3a 100644 --- a/generics/NonCovariantGenerics.java +++ b/generics/NonCovariantGenerics.java @@ -1,5 +1,5 @@ // generics/NonCovariantGenerics.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // {WillNotCompile} diff --git a/generics/NotSelfBounded.java b/generics/NotSelfBounded.java index b691a397d..76aa593cb 100644 --- a/generics/NotSelfBounded.java +++ b/generics/NotSelfBounded.java @@ -1,5 +1,5 @@ // generics/NotSelfBounded.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/generics/ObjectHolder.java b/generics/ObjectHolder.java index 02f81bd19..f1dafd308 100644 --- a/generics/ObjectHolder.java +++ b/generics/ObjectHolder.java @@ -1,5 +1,5 @@ // generics/ObjectHolder.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/generics/OrdinaryArguments.java b/generics/OrdinaryArguments.java index 351316bd0..6e50550d9 100644 --- a/generics/OrdinaryArguments.java +++ b/generics/OrdinaryArguments.java @@ -1,5 +1,5 @@ // generics/OrdinaryArguments.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/generics/Performs.java b/generics/Performs.java index 9a9f248e1..ace095235 100644 --- a/generics/Performs.java +++ b/generics/Performs.java @@ -1,5 +1,5 @@ // generics/Performs.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/generics/PlainGenericInheritance.java b/generics/PlainGenericInheritance.java index 4ef82c8d1..93eb61c68 100644 --- a/generics/PlainGenericInheritance.java +++ b/generics/PlainGenericInheritance.java @@ -1,5 +1,5 @@ // generics/PlainGenericInheritance.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/generics/PrimitiveGenericTest.java b/generics/PrimitiveGenericTest.java index 6072b7e82..793564379 100644 --- a/generics/PrimitiveGenericTest.java +++ b/generics/PrimitiveGenericTest.java @@ -1,5 +1,5 @@ // generics/PrimitiveGenericTest.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import onjava.*; diff --git a/generics/RandomList.java b/generics/RandomList.java index c87aa1624..d4f198bcf 100644 --- a/generics/RandomList.java +++ b/generics/RandomList.java @@ -1,5 +1,5 @@ // generics/RandomList.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.*; diff --git a/generics/RestrictedComparablePets.java b/generics/RestrictedComparablePets.java index a9e9ad742..16146d7b5 100644 --- a/generics/RestrictedComparablePets.java +++ b/generics/RestrictedComparablePets.java @@ -1,5 +1,5 @@ // generics/RestrictedComparablePets.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/generics/ReturnGenericType.java b/generics/ReturnGenericType.java index 3d159679d..bf46ae157 100644 --- a/generics/ReturnGenericType.java +++ b/generics/ReturnGenericType.java @@ -1,5 +1,5 @@ // generics/ReturnGenericType.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/generics/SelfBounding.java b/generics/SelfBounding.java index 0a5dfa7c0..c8ecf0ff4 100644 --- a/generics/SelfBounding.java +++ b/generics/SelfBounding.java @@ -1,5 +1,5 @@ // generics/SelfBounding.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/generics/SelfBoundingAndCovariantArguments.java b/generics/SelfBoundingAndCovariantArguments.java index ac5b70721..34262b0ed 100644 --- a/generics/SelfBoundingAndCovariantArguments.java +++ b/generics/SelfBoundingAndCovariantArguments.java @@ -1,5 +1,5 @@ // generics/SelfBoundingAndCovariantArguments.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/generics/SelfBoundingMethods.java b/generics/SelfBoundingMethods.java index 76f0fb775..e6cb79493 100644 --- a/generics/SelfBoundingMethods.java +++ b/generics/SelfBoundingMethods.java @@ -1,5 +1,5 @@ // generics/SelfBoundingMethods.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/generics/Shape.java b/generics/Shape.java index 68a67ea70..dd2458c2b 100644 --- a/generics/Shape.java +++ b/generics/Shape.java @@ -1,5 +1,5 @@ // generics/Shape.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/generics/SimpleDogsAndRobots.java b/generics/SimpleDogsAndRobots.java index c659a9988..b9cee77b9 100644 --- a/generics/SimpleDogsAndRobots.java +++ b/generics/SimpleDogsAndRobots.java @@ -1,5 +1,5 @@ // generics/SimpleDogsAndRobots.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Removing the generic; code still works diff --git a/generics/SimpleHolder.java b/generics/SimpleHolder.java index b8673b243..a73af0abe 100644 --- a/generics/SimpleHolder.java +++ b/generics/SimpleHolder.java @@ -1,5 +1,5 @@ // generics/SimpleHolder.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/generics/SimpleQueue.java b/generics/SimpleQueue.java index e74db48d3..76fb4f3e7 100644 --- a/generics/SimpleQueue.java +++ b/generics/SimpleQueue.java @@ -1,5 +1,5 @@ // generics/SimpleQueue.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // A different kind of Iterable collection diff --git a/generics/Square.java b/generics/Square.java index f12071f6c..e3bcad934 100644 --- a/generics/Square.java +++ b/generics/Square.java @@ -1,5 +1,5 @@ // generics/Square.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. public class Square extends Shape {} diff --git a/generics/Store.java b/generics/Store.java index 45120db26..c165926a3 100644 --- a/generics/Store.java +++ b/generics/Store.java @@ -1,5 +1,5 @@ // generics/Store.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Building a complex model using generic collections diff --git a/generics/SuperTypeWildcards.java b/generics/SuperTypeWildcards.java index c06a0d86f..f8672a4fc 100644 --- a/generics/SuperTypeWildcards.java +++ b/generics/SuperTypeWildcards.java @@ -1,5 +1,5 @@ // generics/SuperTypeWildcards.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.*; diff --git a/generics/Templates.cpp b/generics/Templates.cpp index 7434912a8..ab2a3b64a 100644 --- a/generics/Templates.cpp +++ b/generics/Templates.cpp @@ -1,5 +1,5 @@ // generics/Templates.cpp -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. #include diff --git a/generics/ThrowGenericException.java b/generics/ThrowGenericException.java index 5152c00b3..994c7f885 100644 --- a/generics/ThrowGenericException.java +++ b/generics/ThrowGenericException.java @@ -1,5 +1,5 @@ // generics/ThrowGenericException.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.*; diff --git a/generics/TupleList.java b/generics/TupleList.java index 830b77421..fe93330ba 100644 --- a/generics/TupleList.java +++ b/generics/TupleList.java @@ -1,5 +1,5 @@ // generics/TupleList.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Combining generic types to make complex generic types diff --git a/generics/TupleTest.java b/generics/TupleTest.java index 7b22af561..e207da405 100644 --- a/generics/TupleTest.java +++ b/generics/TupleTest.java @@ -1,5 +1,5 @@ // generics/TupleTest.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import onjava.*; diff --git a/generics/TupleTest2.java b/generics/TupleTest2.java index 73e0e0ce4..3a0c8d148 100644 --- a/generics/TupleTest2.java +++ b/generics/TupleTest2.java @@ -1,5 +1,5 @@ // generics/TupleTest2.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import onjava.*; diff --git a/generics/UnboundedWildcards1.java b/generics/UnboundedWildcards1.java index 2a8ce8ae3..6b163a4c2 100644 --- a/generics/UnboundedWildcards1.java +++ b/generics/UnboundedWildcards1.java @@ -1,5 +1,5 @@ // generics/UnboundedWildcards1.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.*; diff --git a/generics/UnboundedWildcards2.java b/generics/UnboundedWildcards2.java index 159bab7b0..ee80d5552 100644 --- a/generics/UnboundedWildcards2.java +++ b/generics/UnboundedWildcards2.java @@ -1,5 +1,5 @@ // generics/UnboundedWildcards2.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.*; diff --git a/generics/Unconstrained.java b/generics/Unconstrained.java index 223c5f8c1..f683d53f3 100644 --- a/generics/Unconstrained.java +++ b/generics/Unconstrained.java @@ -1,5 +1,5 @@ // generics/Unconstrained.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/generics/UseList.java b/generics/UseList.java index ff0262b03..924d3b560 100644 --- a/generics/UseList.java +++ b/generics/UseList.java @@ -1,5 +1,5 @@ // generics/UseList.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // {WillNotCompile} diff --git a/generics/UseList2.java b/generics/UseList2.java index 4e7dcf294..83d3b5d35 100644 --- a/generics/UseList2.java +++ b/generics/UseList2.java @@ -1,5 +1,5 @@ // generics/UseList2.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.*; diff --git a/generics/Vehicle.java b/generics/Vehicle.java index e45b5219c..301a84e4d 100644 --- a/generics/Vehicle.java +++ b/generics/Vehicle.java @@ -1,5 +1,5 @@ // generics/Vehicle.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. public class Vehicle {} diff --git a/generics/WatercolorSets.java b/generics/WatercolorSets.java index 04c7adc6e..7956778d9 100644 --- a/generics/WatercolorSets.java +++ b/generics/WatercolorSets.java @@ -1,5 +1,5 @@ // generics/WatercolorSets.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import generics.watercolors.*; diff --git a/generics/Wildcards.java b/generics/Wildcards.java index aa1a9163a..65348ecbb 100644 --- a/generics/Wildcards.java +++ b/generics/Wildcards.java @@ -1,5 +1,5 @@ // generics/Wildcards.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Exploring the meaning of wildcards diff --git a/generics/coffee/Americano.java b/generics/coffee/Americano.java index be25727ff..96cd4a1fd 100644 --- a/generics/coffee/Americano.java +++ b/generics/coffee/Americano.java @@ -1,5 +1,5 @@ // generics/coffee/Americano.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. package generics.coffee; diff --git a/generics/coffee/Breve.java b/generics/coffee/Breve.java index f5b521178..329c406b0 100644 --- a/generics/coffee/Breve.java +++ b/generics/coffee/Breve.java @@ -1,5 +1,5 @@ // generics/coffee/Breve.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. package generics.coffee; diff --git a/generics/coffee/Cappuccino.java b/generics/coffee/Cappuccino.java index 5804b7711..3ce89b50f 100644 --- a/generics/coffee/Cappuccino.java +++ b/generics/coffee/Cappuccino.java @@ -1,5 +1,5 @@ // generics/coffee/Cappuccino.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. package generics.coffee; diff --git a/generics/coffee/Coffee.java b/generics/coffee/Coffee.java index 760788d40..c90d88c19 100644 --- a/generics/coffee/Coffee.java +++ b/generics/coffee/Coffee.java @@ -1,5 +1,5 @@ // generics/coffee/Coffee.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. package generics.coffee; diff --git a/generics/coffee/CoffeeSupplier.java b/generics/coffee/CoffeeSupplier.java index f980c15d2..8973dfbc1 100644 --- a/generics/coffee/CoffeeSupplier.java +++ b/generics/coffee/CoffeeSupplier.java @@ -1,5 +1,5 @@ // generics/coffee/CoffeeSupplier.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // {java generics.coffee.CoffeeSupplier} diff --git a/generics/coffee/Latte.java b/generics/coffee/Latte.java index 99bbfa70a..d735cc876 100644 --- a/generics/coffee/Latte.java +++ b/generics/coffee/Latte.java @@ -1,5 +1,5 @@ // generics/coffee/Latte.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. package generics.coffee; diff --git a/generics/coffee/Mocha.java b/generics/coffee/Mocha.java index 87ef0f7ee..cc567be1e 100644 --- a/generics/coffee/Mocha.java +++ b/generics/coffee/Mocha.java @@ -1,5 +1,5 @@ // generics/coffee/Mocha.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. package generics.coffee; diff --git a/generics/decorator/Decoration.java b/generics/decorator/Decoration.java index d7f963253..96611a75a 100644 --- a/generics/decorator/Decoration.java +++ b/generics/decorator/Decoration.java @@ -1,5 +1,5 @@ // generics/decorator/Decoration.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // {java generics.decorator.Decoration} diff --git a/generics/dogsandrobots.go b/generics/dogsandrobots.go index 3b49bc52f..f65b9c18f 100644 --- a/generics/dogsandrobots.go +++ b/generics/dogsandrobots.go @@ -1,5 +1,5 @@ // generics/dogsandrobots.go -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. package main diff --git a/generics/watercolors/Watercolors.java b/generics/watercolors/Watercolors.java index 205ed6ee7..0625e5326 100644 --- a/generics/watercolors/Watercolors.java +++ b/generics/watercolors/Watercolors.java @@ -1,5 +1,5 @@ // generics/watercolors/Watercolors.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. package generics.watercolors; diff --git a/hiding/Cake.java b/hiding/Cake.java index ebb19720e..d20e2cbf1 100644 --- a/hiding/Cake.java +++ b/hiding/Cake.java @@ -1,5 +1,5 @@ // hiding/Cake.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Accesses a class in a separate compilation unit diff --git a/hiding/ChocolateChip.java b/hiding/ChocolateChip.java index 0ba2066a2..1467fff42 100644 --- a/hiding/ChocolateChip.java +++ b/hiding/ChocolateChip.java @@ -1,5 +1,5 @@ // hiding/ChocolateChip.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Can't use package-access member from another package diff --git a/hiding/ChocolateChip2.java b/hiding/ChocolateChip2.java index 7245a279f..03c9d1ab2 100644 --- a/hiding/ChocolateChip2.java +++ b/hiding/ChocolateChip2.java @@ -1,5 +1,5 @@ // hiding/ChocolateChip2.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import hiding.cookie2.*; diff --git a/hiding/CreatePackageAccessObject.java b/hiding/CreatePackageAccessObject.java index 3e057ea3f..8442b51f7 100644 --- a/hiding/CreatePackageAccessObject.java +++ b/hiding/CreatePackageAccessObject.java @@ -1,5 +1,5 @@ // hiding/CreatePackageAccessObject.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // {WillNotCompile} diff --git a/hiding/Dinner.java b/hiding/Dinner.java index 3c4d9e1a7..7a7b97d59 100644 --- a/hiding/Dinner.java +++ b/hiding/Dinner.java @@ -1,5 +1,5 @@ // hiding/Dinner.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Uses the library diff --git a/hiding/FullQualification.java b/hiding/FullQualification.java index 39e7cc343..2fadb28cd 100644 --- a/hiding/FullQualification.java +++ b/hiding/FullQualification.java @@ -1,5 +1,5 @@ // hiding/FullQualification.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/hiding/IceCream.java b/hiding/IceCream.java index b9381f018..d91619a26 100644 --- a/hiding/IceCream.java +++ b/hiding/IceCream.java @@ -1,5 +1,5 @@ // hiding/IceCream.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Demonstrates "private" keyword diff --git a/hiding/ImportedMyClass.java b/hiding/ImportedMyClass.java index 63cb2bd5c..a644f5d83 100644 --- a/hiding/ImportedMyClass.java +++ b/hiding/ImportedMyClass.java @@ -1,5 +1,5 @@ // hiding/ImportedMyClass.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import hiding.mypackage.*; diff --git a/hiding/LibTest.java b/hiding/LibTest.java index c75fa9379..c439352a5 100644 --- a/hiding/LibTest.java +++ b/hiding/LibTest.java @@ -1,5 +1,5 @@ // hiding/LibTest.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Uses the library diff --git a/hiding/Lunch.java b/hiding/Lunch.java index 1e4019205..eca4baf03 100644 --- a/hiding/Lunch.java +++ b/hiding/Lunch.java @@ -1,5 +1,5 @@ // hiding/Lunch.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Demonstrates class access specifiers. Make a class diff --git a/hiding/OrganizedByAccess.java b/hiding/OrganizedByAccess.java index 67437c8f5..46af158fc 100644 --- a/hiding/OrganizedByAccess.java +++ b/hiding/OrganizedByAccess.java @@ -1,5 +1,5 @@ // hiding/OrganizedByAccess.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/hiding/Pie.java b/hiding/Pie.java index ce5abfee1..1470fbc33 100644 --- a/hiding/Pie.java +++ b/hiding/Pie.java @@ -1,5 +1,5 @@ // hiding/Pie.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // The other class diff --git a/hiding/QualifiedMyClass.java b/hiding/QualifiedMyClass.java index 3b642f561..58a097ccd 100644 --- a/hiding/QualifiedMyClass.java +++ b/hiding/QualifiedMyClass.java @@ -1,5 +1,5 @@ // hiding/QualifiedMyClass.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/hiding/SingleImport.java b/hiding/SingleImport.java index 4959fb541..5168ebe88 100644 --- a/hiding/SingleImport.java +++ b/hiding/SingleImport.java @@ -1,5 +1,5 @@ // hiding/SingleImport.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.ArrayList; diff --git a/hiding/cookie2/Cookie.java b/hiding/cookie2/Cookie.java index a3753a2e6..aff5bb172 100644 --- a/hiding/cookie2/Cookie.java +++ b/hiding/cookie2/Cookie.java @@ -1,5 +1,5 @@ // hiding/cookie2/Cookie.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. package hiding.cookie2; diff --git a/hiding/dessert/Cookie.java b/hiding/dessert/Cookie.java index 58ac34bb7..803e504c2 100644 --- a/hiding/dessert/Cookie.java +++ b/hiding/dessert/Cookie.java @@ -1,5 +1,5 @@ // hiding/dessert/Cookie.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Creates a library diff --git a/hiding/mypackage/MyClass.java b/hiding/mypackage/MyClass.java index 5fd8c33a4..5245d4796 100644 --- a/hiding/mypackage/MyClass.java +++ b/hiding/mypackage/MyClass.java @@ -1,5 +1,5 @@ // hiding/mypackage/MyClass.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. package hiding.mypackage; diff --git a/hiding/packageaccess/PublicConstructor.java b/hiding/packageaccess/PublicConstructor.java index 2e7c050ff..533c28a0a 100644 --- a/hiding/packageaccess/PublicConstructor.java +++ b/hiding/packageaccess/PublicConstructor.java @@ -1,5 +1,5 @@ // hiding/packageaccess/PublicConstructor.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. package hiding.packageaccess; diff --git a/housekeeping/Apricot.java b/housekeeping/Apricot.java index da4c600f7..dae8f33de 100644 --- a/housekeeping/Apricot.java +++ b/housekeeping/Apricot.java @@ -1,5 +1,5 @@ // housekeeping/Apricot.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. public class Apricot { diff --git a/housekeeping/ArrayClassObj.java b/housekeeping/ArrayClassObj.java index bd90c0f05..44e31b59e 100644 --- a/housekeeping/ArrayClassObj.java +++ b/housekeeping/ArrayClassObj.java @@ -1,5 +1,5 @@ // housekeeping/ArrayClassObj.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Creating an array of nonprimitive objects diff --git a/housekeeping/ArrayInit.java b/housekeeping/ArrayInit.java index 5ccc56889..4186bd24e 100644 --- a/housekeeping/ArrayInit.java +++ b/housekeeping/ArrayInit.java @@ -1,5 +1,5 @@ // housekeeping/ArrayInit.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Array initialization diff --git a/housekeeping/ArrayNew.java b/housekeeping/ArrayNew.java index c37122b8e..022cec168 100644 --- a/housekeeping/ArrayNew.java +++ b/housekeeping/ArrayNew.java @@ -1,5 +1,5 @@ // housekeeping/ArrayNew.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Creating arrays with new diff --git a/housekeeping/ArraysOfPrimitives.java b/housekeeping/ArraysOfPrimitives.java index 0952aa7bf..165afe896 100644 --- a/housekeeping/ArraysOfPrimitives.java +++ b/housekeeping/ArraysOfPrimitives.java @@ -1,5 +1,5 @@ // housekeeping/ArraysOfPrimitives.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/housekeeping/AutoboxingVarargs.java b/housekeeping/AutoboxingVarargs.java index 61cf17740..c670fa670 100644 --- a/housekeeping/AutoboxingVarargs.java +++ b/housekeeping/AutoboxingVarargs.java @@ -1,5 +1,5 @@ // housekeeping/AutoboxingVarargs.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/housekeeping/BananaPeel.java b/housekeeping/BananaPeel.java index badf828a6..b3e01b273 100644 --- a/housekeeping/BananaPeel.java +++ b/housekeeping/BananaPeel.java @@ -1,5 +1,5 @@ // housekeeping/BananaPeel.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/housekeeping/Burrito.java b/housekeeping/Burrito.java index 316f3324a..e3fd028bd 100644 --- a/housekeeping/Burrito.java +++ b/housekeeping/Burrito.java @@ -1,5 +1,5 @@ // housekeeping/Burrito.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/housekeeping/Counter.java b/housekeeping/Counter.java index 3db917be2..d0a58ecc6 100644 --- a/housekeeping/Counter.java +++ b/housekeeping/Counter.java @@ -1,5 +1,5 @@ // housekeeping/Counter.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. public class Counter { diff --git a/housekeeping/DefaultConstructor.java b/housekeeping/DefaultConstructor.java index a64294ead..22e3787dd 100644 --- a/housekeeping/DefaultConstructor.java +++ b/housekeeping/DefaultConstructor.java @@ -1,5 +1,5 @@ // housekeeping/DefaultConstructor.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/housekeeping/Demotion.java b/housekeeping/Demotion.java index e03ee8cca..ad2c4e86b 100644 --- a/housekeeping/Demotion.java +++ b/housekeeping/Demotion.java @@ -1,5 +1,5 @@ // housekeeping/Demotion.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Demotion of primitives diff --git a/housekeeping/DynamicArray.java b/housekeeping/DynamicArray.java index 7c2cdf811..726ec034a 100644 --- a/housekeeping/DynamicArray.java +++ b/housekeeping/DynamicArray.java @@ -1,5 +1,5 @@ // housekeeping/DynamicArray.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Array initialization diff --git a/housekeeping/EnumOrder.java b/housekeeping/EnumOrder.java index 71e7855a0..a3c962847 100644 --- a/housekeeping/EnumOrder.java +++ b/housekeeping/EnumOrder.java @@ -1,5 +1,5 @@ // housekeeping/EnumOrder.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/housekeeping/ExplicitStatic.java b/housekeeping/ExplicitStatic.java index 885886486..7d9cb31ad 100644 --- a/housekeeping/ExplicitStatic.java +++ b/housekeeping/ExplicitStatic.java @@ -1,5 +1,5 @@ // housekeeping/ExplicitStatic.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Explicit static initialization with "static" clause diff --git a/housekeeping/Flower.java b/housekeeping/Flower.java index 5f2766d82..a62d7cbe5 100644 --- a/housekeeping/Flower.java +++ b/housekeeping/Flower.java @@ -1,5 +1,5 @@ // housekeeping/Flower.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Calling constructors with "this" diff --git a/housekeeping/InitialValues.java b/housekeeping/InitialValues.java index c91360431..dced4dd2e 100644 --- a/housekeeping/InitialValues.java +++ b/housekeeping/InitialValues.java @@ -1,5 +1,5 @@ // housekeeping/InitialValues.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Shows default initial values diff --git a/housekeeping/InitialValues2.java b/housekeeping/InitialValues2.java index ab0759534..1cb509744 100644 --- a/housekeeping/InitialValues2.java +++ b/housekeeping/InitialValues2.java @@ -1,5 +1,5 @@ // housekeeping/InitialValues2.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Providing explicit initial values diff --git a/housekeeping/Leaf.java b/housekeeping/Leaf.java index 761de2074..f9c560b24 100644 --- a/housekeeping/Leaf.java +++ b/housekeeping/Leaf.java @@ -1,5 +1,5 @@ // housekeeping/Leaf.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Simple use of the "this" keyword diff --git a/housekeeping/Measurement.java b/housekeeping/Measurement.java index a783e2c01..8a920779e 100644 --- a/housekeeping/Measurement.java +++ b/housekeeping/Measurement.java @@ -1,5 +1,5 @@ // housekeeping/Measurement.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. class Depth {} diff --git a/housekeeping/MethodInit.java b/housekeeping/MethodInit.java index 6b8261aa7..84e15fcef 100644 --- a/housekeeping/MethodInit.java +++ b/housekeeping/MethodInit.java @@ -1,5 +1,5 @@ // housekeeping/MethodInit.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. public class MethodInit { diff --git a/housekeeping/MethodInit2.java b/housekeeping/MethodInit2.java index a6024f01b..24750fb2d 100644 --- a/housekeeping/MethodInit2.java +++ b/housekeeping/MethodInit2.java @@ -1,5 +1,5 @@ // housekeeping/MethodInit2.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. public class MethodInit2 { diff --git a/housekeeping/MethodInit3.java b/housekeeping/MethodInit3.java index 4361b7c5b..2a6524aba 100644 --- a/housekeeping/MethodInit3.java +++ b/housekeeping/MethodInit3.java @@ -1,5 +1,5 @@ // housekeeping/MethodInit3.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. public class MethodInit3 { diff --git a/housekeeping/Mugs.java b/housekeeping/Mugs.java index d9b928024..e4ebba695 100644 --- a/housekeeping/Mugs.java +++ b/housekeeping/Mugs.java @@ -1,5 +1,5 @@ // housekeeping/Mugs.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Instance initialization diff --git a/housekeeping/NewVarArgs.java b/housekeeping/NewVarArgs.java index 28eb2a9c5..291dd1346 100644 --- a/housekeeping/NewVarArgs.java +++ b/housekeeping/NewVarArgs.java @@ -1,5 +1,5 @@ // housekeeping/NewVarArgs.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Using array syntax to create variable argument lists diff --git a/housekeeping/NoSynthesis.java b/housekeeping/NoSynthesis.java index 88219e006..217c20230 100644 --- a/housekeeping/NoSynthesis.java +++ b/housekeeping/NoSynthesis.java @@ -1,5 +1,5 @@ // housekeeping/NoSynthesis.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/housekeeping/OptionalTrailingArguments.java b/housekeeping/OptionalTrailingArguments.java index f385bdd34..d7ee9fbbf 100644 --- a/housekeeping/OptionalTrailingArguments.java +++ b/housekeeping/OptionalTrailingArguments.java @@ -1,5 +1,5 @@ // housekeeping/OptionalTrailingArguments.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/housekeeping/OrderOfInitialization.java b/housekeeping/OrderOfInitialization.java index 7048f6202..c715ed7c5 100644 --- a/housekeeping/OrderOfInitialization.java +++ b/housekeeping/OrderOfInitialization.java @@ -1,5 +1,5 @@ // housekeeping/OrderOfInitialization.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Demonstrates initialization order diff --git a/housekeeping/Overloading.java b/housekeeping/Overloading.java index 00f9e0477..99d21bf80 100644 --- a/housekeeping/Overloading.java +++ b/housekeeping/Overloading.java @@ -1,5 +1,5 @@ // housekeeping/Overloading.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Both constructor and ordinary method overloading diff --git a/housekeeping/OverloadingOrder.java b/housekeeping/OverloadingOrder.java index 694fff9a5..42f6466ec 100644 --- a/housekeeping/OverloadingOrder.java +++ b/housekeeping/OverloadingOrder.java @@ -1,5 +1,5 @@ // housekeeping/OverloadingOrder.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Overloading based on the order of the arguments diff --git a/housekeeping/OverloadingVarargs.java b/housekeeping/OverloadingVarargs.java index fb96bad10..c13b7406f 100644 --- a/housekeeping/OverloadingVarargs.java +++ b/housekeeping/OverloadingVarargs.java @@ -1,5 +1,5 @@ // housekeeping/OverloadingVarargs.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/housekeeping/OverloadingVarargs2.java b/housekeeping/OverloadingVarargs2.java index a9b779d8d..c3a098451 100644 --- a/housekeeping/OverloadingVarargs2.java +++ b/housekeeping/OverloadingVarargs2.java @@ -1,5 +1,5 @@ // housekeeping/OverloadingVarargs2.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // {WillNotCompile} diff --git a/housekeeping/OverloadingVarargs3.java b/housekeeping/OverloadingVarargs3.java index 6245ea742..23e757ec5 100644 --- a/housekeeping/OverloadingVarargs3.java +++ b/housekeeping/OverloadingVarargs3.java @@ -1,5 +1,5 @@ // housekeeping/OverloadingVarargs3.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/housekeeping/PassingThis.java b/housekeeping/PassingThis.java index c6769a53f..ce725eabf 100644 --- a/housekeeping/PassingThis.java +++ b/housekeeping/PassingThis.java @@ -1,5 +1,5 @@ // housekeeping/PassingThis.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/housekeeping/PrimitiveOverloading.java b/housekeeping/PrimitiveOverloading.java index c54df4395..1d8c1e2c6 100644 --- a/housekeeping/PrimitiveOverloading.java +++ b/housekeeping/PrimitiveOverloading.java @@ -1,5 +1,5 @@ // housekeeping/PrimitiveOverloading.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Promotion of primitives and overloading diff --git a/housekeeping/SimpleConstructor.java b/housekeeping/SimpleConstructor.java index e6da947c5..c6917c33d 100644 --- a/housekeeping/SimpleConstructor.java +++ b/housekeeping/SimpleConstructor.java @@ -1,5 +1,5 @@ // housekeeping/SimpleConstructor.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Demonstration of a simple constructor diff --git a/housekeeping/SimpleConstructor2.java b/housekeeping/SimpleConstructor2.java index e2449f500..4a191af78 100644 --- a/housekeeping/SimpleConstructor2.java +++ b/housekeeping/SimpleConstructor2.java @@ -1,5 +1,5 @@ // housekeeping/SimpleConstructor2.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Constructors can have arguments diff --git a/housekeeping/SimpleEnumUse.java b/housekeeping/SimpleEnumUse.java index c5e4b6a90..cc0de33b2 100644 --- a/housekeeping/SimpleEnumUse.java +++ b/housekeeping/SimpleEnumUse.java @@ -1,5 +1,5 @@ // housekeeping/SimpleEnumUse.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/housekeeping/Spiciness.java b/housekeeping/Spiciness.java index e4988d88e..a134a822d 100644 --- a/housekeeping/Spiciness.java +++ b/housekeeping/Spiciness.java @@ -1,5 +1,5 @@ // housekeeping/Spiciness.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/housekeeping/Spoon.java b/housekeeping/Spoon.java index b8ce57882..fd3448159 100644 --- a/housekeeping/Spoon.java +++ b/housekeeping/Spoon.java @@ -1,5 +1,5 @@ // housekeeping/Spoon.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. public class Spoon { diff --git a/housekeeping/StaticInitialization.java b/housekeeping/StaticInitialization.java index 27952629e..0cfe99aea 100644 --- a/housekeeping/StaticInitialization.java +++ b/housekeeping/StaticInitialization.java @@ -1,5 +1,5 @@ // housekeeping/StaticInitialization.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Specifying initial values in a class definition diff --git a/housekeeping/TerminationCondition.java b/housekeeping/TerminationCondition.java index 2ef78ecba..393540ac0 100644 --- a/housekeeping/TerminationCondition.java +++ b/housekeeping/TerminationCondition.java @@ -1,5 +1,5 @@ // housekeeping/TerminationCondition.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Using finalize() to detect an object that diff --git a/housekeeping/VarArgs.java b/housekeeping/VarArgs.java index 36dfb5a0a..73a94c392 100644 --- a/housekeeping/VarArgs.java +++ b/housekeeping/VarArgs.java @@ -1,5 +1,5 @@ // housekeeping/VarArgs.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Using array syntax to create variable argument lists diff --git a/housekeeping/VarargType.java b/housekeeping/VarargType.java index 311b0487d..5b25b0536 100644 --- a/housekeeping/VarargType.java +++ b/housekeeping/VarargType.java @@ -1,5 +1,5 @@ // housekeeping/VarargType.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/innerclasses/AnonymousConstructor.java b/innerclasses/AnonymousConstructor.java index 7395a3355..d8e08e7c9 100644 --- a/innerclasses/AnonymousConstructor.java +++ b/innerclasses/AnonymousConstructor.java @@ -1,5 +1,5 @@ // innerclasses/AnonymousConstructor.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Creating a constructor for an anonymous inner class diff --git a/innerclasses/BigEgg.java b/innerclasses/BigEgg.java index c1572c594..7b2c36246 100644 --- a/innerclasses/BigEgg.java +++ b/innerclasses/BigEgg.java @@ -1,5 +1,5 @@ // innerclasses/BigEgg.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // An inner class cannot be overridden like a method diff --git a/innerclasses/BigEgg2.java b/innerclasses/BigEgg2.java index 0eb0abce4..1631008d2 100644 --- a/innerclasses/BigEgg2.java +++ b/innerclasses/BigEgg2.java @@ -1,5 +1,5 @@ // innerclasses/BigEgg2.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Proper inheritance of an inner class diff --git a/innerclasses/Callbacks.java b/innerclasses/Callbacks.java index 214019c5f..d16593322 100644 --- a/innerclasses/Callbacks.java +++ b/innerclasses/Callbacks.java @@ -1,5 +1,5 @@ // innerclasses/Callbacks.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Using inner classes for callbacks diff --git a/innerclasses/ClassInInterface.java b/innerclasses/ClassInInterface.java index a2e34ccb4..c3cc0589b 100644 --- a/innerclasses/ClassInInterface.java +++ b/innerclasses/ClassInInterface.java @@ -1,5 +1,5 @@ // innerclasses/ClassInInterface.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // {java ClassInInterface$Test} diff --git a/innerclasses/Contents.java b/innerclasses/Contents.java index 98360c794..0cebe1a0d 100644 --- a/innerclasses/Contents.java +++ b/innerclasses/Contents.java @@ -1,5 +1,5 @@ // innerclasses/Contents.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. public interface Contents { diff --git a/innerclasses/Destination.java b/innerclasses/Destination.java index 4b5ded927..bf221526b 100644 --- a/innerclasses/Destination.java +++ b/innerclasses/Destination.java @@ -1,5 +1,5 @@ // innerclasses/Destination.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. public interface Destination { diff --git a/innerclasses/DotNew.java b/innerclasses/DotNew.java index e587e461e..317400e80 100644 --- a/innerclasses/DotNew.java +++ b/innerclasses/DotNew.java @@ -1,5 +1,5 @@ // innerclasses/DotNew.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Creating an inner class directly using .new syntax diff --git a/innerclasses/DotThis.java b/innerclasses/DotThis.java index 6ef93b930..b87cb1f4c 100644 --- a/innerclasses/DotThis.java +++ b/innerclasses/DotThis.java @@ -1,5 +1,5 @@ // innerclasses/DotThis.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Accessing the outer-class object diff --git a/innerclasses/GreenhouseController.java b/innerclasses/GreenhouseController.java index cdec74565..cf3ec6530 100644 --- a/innerclasses/GreenhouseController.java +++ b/innerclasses/GreenhouseController.java @@ -1,5 +1,5 @@ // innerclasses/GreenhouseController.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Configure and execute the greenhouse system diff --git a/innerclasses/GreenhouseControls.java b/innerclasses/GreenhouseControls.java index 534deb9ac..57458d66f 100644 --- a/innerclasses/GreenhouseControls.java +++ b/innerclasses/GreenhouseControls.java @@ -1,5 +1,5 @@ // innerclasses/GreenhouseControls.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // This produces a specific application of the diff --git a/innerclasses/InheritInner.java b/innerclasses/InheritInner.java index 410e2864a..ffc868946 100644 --- a/innerclasses/InheritInner.java +++ b/innerclasses/InheritInner.java @@ -1,5 +1,5 @@ // innerclasses/InheritInner.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Inheriting an inner class diff --git a/innerclasses/LocalInnerClass.java b/innerclasses/LocalInnerClass.java index 533a25d04..015108545 100644 --- a/innerclasses/LocalInnerClass.java +++ b/innerclasses/LocalInnerClass.java @@ -1,5 +1,5 @@ // innerclasses/LocalInnerClass.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Holds a sequence of Objects diff --git a/innerclasses/MultiImplementation.java b/innerclasses/MultiImplementation.java index 0b6db9e62..6eb6c494f 100644 --- a/innerclasses/MultiImplementation.java +++ b/innerclasses/MultiImplementation.java @@ -1,5 +1,5 @@ // innerclasses/MultiImplementation.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // For concrete or abstract classes, inner classes diff --git a/innerclasses/MultiNestingAccess.java b/innerclasses/MultiNestingAccess.java index a05eb0447..bf9e3cb02 100644 --- a/innerclasses/MultiNestingAccess.java +++ b/innerclasses/MultiNestingAccess.java @@ -1,5 +1,5 @@ // innerclasses/MultiNestingAccess.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Nested classes can access all members of all diff --git a/innerclasses/Parcel1.java b/innerclasses/Parcel1.java index 33467b1e8..94464cbcd 100644 --- a/innerclasses/Parcel1.java +++ b/innerclasses/Parcel1.java @@ -1,5 +1,5 @@ // innerclasses/Parcel1.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Creating inner classes diff --git a/innerclasses/Parcel10.java b/innerclasses/Parcel10.java index 77684e413..7150c1929 100644 --- a/innerclasses/Parcel10.java +++ b/innerclasses/Parcel10.java @@ -1,5 +1,5 @@ // innerclasses/Parcel10.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Using "instance initialization" to perform diff --git a/innerclasses/Parcel11.java b/innerclasses/Parcel11.java index 40d8da484..720981f0e 100644 --- a/innerclasses/Parcel11.java +++ b/innerclasses/Parcel11.java @@ -1,5 +1,5 @@ // innerclasses/Parcel11.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Nested classes (static inner classes) diff --git a/innerclasses/Parcel2.java b/innerclasses/Parcel2.java index 1f4f8274d..1eca5cba2 100644 --- a/innerclasses/Parcel2.java +++ b/innerclasses/Parcel2.java @@ -1,5 +1,5 @@ // innerclasses/Parcel2.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Returning a reference to an inner class diff --git a/innerclasses/Parcel3.java b/innerclasses/Parcel3.java index 6ee03313b..2e0733e05 100644 --- a/innerclasses/Parcel3.java +++ b/innerclasses/Parcel3.java @@ -1,5 +1,5 @@ // innerclasses/Parcel3.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Using .new to create instances of inner classes diff --git a/innerclasses/Parcel5.java b/innerclasses/Parcel5.java index 643322d1b..622b3fd08 100644 --- a/innerclasses/Parcel5.java +++ b/innerclasses/Parcel5.java @@ -1,5 +1,5 @@ // innerclasses/Parcel5.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Nesting a class within a method diff --git a/innerclasses/Parcel6.java b/innerclasses/Parcel6.java index 118ff6f51..7a2c866e7 100644 --- a/innerclasses/Parcel6.java +++ b/innerclasses/Parcel6.java @@ -1,5 +1,5 @@ // innerclasses/Parcel6.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Nesting a class within a scope diff --git a/innerclasses/Parcel7.java b/innerclasses/Parcel7.java index 7ed0ef514..3a4aefbb6 100644 --- a/innerclasses/Parcel7.java +++ b/innerclasses/Parcel7.java @@ -1,5 +1,5 @@ // innerclasses/Parcel7.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Returning an instance of an anonymous inner class diff --git a/innerclasses/Parcel7b.java b/innerclasses/Parcel7b.java index 6c4a40484..bee95727e 100644 --- a/innerclasses/Parcel7b.java +++ b/innerclasses/Parcel7b.java @@ -1,5 +1,5 @@ // innerclasses/Parcel7b.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Expanded version of Parcel7.java diff --git a/innerclasses/Parcel8.java b/innerclasses/Parcel8.java index ead289089..1e615ac5a 100644 --- a/innerclasses/Parcel8.java +++ b/innerclasses/Parcel8.java @@ -1,5 +1,5 @@ // innerclasses/Parcel8.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Calling the base-class constructor diff --git a/innerclasses/Parcel9.java b/innerclasses/Parcel9.java index 599599c9c..775390f13 100644 --- a/innerclasses/Parcel9.java +++ b/innerclasses/Parcel9.java @@ -1,5 +1,5 @@ // innerclasses/Parcel9.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/innerclasses/Sequence.java b/innerclasses/Sequence.java index ebcbdeea6..b5a870b98 100644 --- a/innerclasses/Sequence.java +++ b/innerclasses/Sequence.java @@ -1,5 +1,5 @@ // innerclasses/Sequence.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Holds a sequence of Objects diff --git a/innerclasses/TestBed.java b/innerclasses/TestBed.java index fb969a1fe..d4bc16dda 100644 --- a/innerclasses/TestBed.java +++ b/innerclasses/TestBed.java @@ -1,5 +1,5 @@ // innerclasses/TestBed.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Putting test code in a nested class diff --git a/innerclasses/TestParcel.java b/innerclasses/TestParcel.java index c1549a631..f1ec5d47f 100644 --- a/innerclasses/TestParcel.java +++ b/innerclasses/TestParcel.java @@ -1,5 +1,5 @@ // innerclasses/TestParcel.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/innerclasses/Wrapping.java b/innerclasses/Wrapping.java index 15b2e76f1..651c07488 100644 --- a/innerclasses/Wrapping.java +++ b/innerclasses/Wrapping.java @@ -1,5 +1,5 @@ // innerclasses/Wrapping.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. public class Wrapping { diff --git a/innerclasses/controller/Controller.java b/innerclasses/controller/Controller.java index 794dfaa37..9a3625b36 100644 --- a/innerclasses/controller/Controller.java +++ b/innerclasses/controller/Controller.java @@ -1,5 +1,5 @@ // innerclasses/controller/Controller.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // The reusable framework for control systems diff --git a/innerclasses/controller/Event.java b/innerclasses/controller/Event.java index ed46f48cb..5523168f4 100644 --- a/innerclasses/controller/Event.java +++ b/innerclasses/controller/Event.java @@ -1,5 +1,5 @@ // innerclasses/controller/Event.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // The common methods for any control event diff --git a/innerclasses/mui/MultiInterfaces.java b/innerclasses/mui/MultiInterfaces.java index cdfc0cdab..127a6c80b 100644 --- a/innerclasses/mui/MultiInterfaces.java +++ b/innerclasses/mui/MultiInterfaces.java @@ -1,5 +1,5 @@ // innerclasses/mui/MultiInterfaces.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Two ways a class can implement multiple interfaces diff --git a/interfaces/AbstractAccess.java b/interfaces/AbstractAccess.java index cb155163f..c2e43da3a 100644 --- a/interfaces/AbstractAccess.java +++ b/interfaces/AbstractAccess.java @@ -1,5 +1,5 @@ // interfaces/AbstractAccess.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/interfaces/AbstractWithoutAbstracts.java b/interfaces/AbstractWithoutAbstracts.java index 428590d1c..2e6b700c9 100644 --- a/interfaces/AbstractWithoutAbstracts.java +++ b/interfaces/AbstractWithoutAbstracts.java @@ -1,5 +1,5 @@ // interfaces/AbstractWithoutAbstracts.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/interfaces/AdaptedRandomDoubles.java b/interfaces/AdaptedRandomDoubles.java index dc80a5798..6c7866554 100644 --- a/interfaces/AdaptedRandomDoubles.java +++ b/interfaces/AdaptedRandomDoubles.java @@ -1,5 +1,5 @@ // interfaces/AdaptedRandomDoubles.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Creating an adapter with inheritance diff --git a/interfaces/Adventure.java b/interfaces/Adventure.java index 0691fd732..1a7135d13 100644 --- a/interfaces/Adventure.java +++ b/interfaces/Adventure.java @@ -1,5 +1,5 @@ // interfaces/Adventure.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Multiple interfaces diff --git a/interfaces/AnImplementation.java b/interfaces/AnImplementation.java index f22ae3610..3ff13a30c 100644 --- a/interfaces/AnImplementation.java +++ b/interfaces/AnImplementation.java @@ -1,5 +1,5 @@ // interfaces/AnImplementation.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/interfaces/AnInterface.java b/interfaces/AnInterface.java index 070af2ca8..30f82b3a0 100644 --- a/interfaces/AnInterface.java +++ b/interfaces/AnInterface.java @@ -1,5 +1,5 @@ // interfaces/AnInterface.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/interfaces/Applicator.java b/interfaces/Applicator.java index 1c57d8a68..a6aa172f9 100644 --- a/interfaces/Applicator.java +++ b/interfaces/Applicator.java @@ -1,5 +1,5 @@ // interfaces/Applicator.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.*; diff --git a/interfaces/AttemptToUseBasic.java b/interfaces/AttemptToUseBasic.java index 25901d865..0d2655279 100644 --- a/interfaces/AttemptToUseBasic.java +++ b/interfaces/AttemptToUseBasic.java @@ -1,5 +1,5 @@ // interfaces/AttemptToUseBasic.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // {WillNotCompile} diff --git a/interfaces/Basic.java b/interfaces/Basic.java index 9643027d0..19c1c75b2 100644 --- a/interfaces/Basic.java +++ b/interfaces/Basic.java @@ -1,5 +1,5 @@ // interfaces/Basic.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/interfaces/Basic2.java b/interfaces/Basic2.java index a0e8e9b26..4c8f0c93c 100644 --- a/interfaces/Basic2.java +++ b/interfaces/Basic2.java @@ -1,5 +1,5 @@ // interfaces/Basic2.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/interfaces/Factories.java b/interfaces/Factories.java index 508df208f..87e282513 100644 --- a/interfaces/Factories.java +++ b/interfaces/Factories.java @@ -1,5 +1,5 @@ // interfaces/Factories.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/interfaces/Games.java b/interfaces/Games.java index 9d0afbc45..867efe0cc 100644 --- a/interfaces/Games.java +++ b/interfaces/Games.java @@ -1,5 +1,5 @@ // interfaces/Games.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // A Game framework using Factory Methods diff --git a/interfaces/HorrorShow.java b/interfaces/HorrorShow.java index 90f84129d..b1c687dac 100644 --- a/interfaces/HorrorShow.java +++ b/interfaces/HorrorShow.java @@ -1,5 +1,5 @@ // interfaces/HorrorShow.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Extending an interface with inheritance diff --git a/interfaces/Implementation2.java b/interfaces/Implementation2.java index b94bc2cf1..61c6efa01 100644 --- a/interfaces/Implementation2.java +++ b/interfaces/Implementation2.java @@ -1,5 +1,5 @@ // interfaces/Implementation2.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/interfaces/ImplementingAnInterface.java b/interfaces/ImplementingAnInterface.java index bded0ac5d..6a13ebb63 100644 --- a/interfaces/ImplementingAnInterface.java +++ b/interfaces/ImplementingAnInterface.java @@ -1,5 +1,5 @@ // interfaces/ImplementingAnInterface.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/interfaces/Instantiable.java b/interfaces/Instantiable.java index b09dcd3e8..427b6ca39 100644 --- a/interfaces/Instantiable.java +++ b/interfaces/Instantiable.java @@ -1,5 +1,5 @@ // interfaces/Instantiable.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/interfaces/InterfaceCollision.java b/interfaces/InterfaceCollision.java index 5d85b6149..0f7de1ac6 100644 --- a/interfaces/InterfaceCollision.java +++ b/interfaces/InterfaceCollision.java @@ -1,5 +1,5 @@ // interfaces/InterfaceCollision.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/interfaces/InterfaceWithDefault.java b/interfaces/InterfaceWithDefault.java index 7d59408e1..a87f02db9 100644 --- a/interfaces/InterfaceWithDefault.java +++ b/interfaces/InterfaceWithDefault.java @@ -1,5 +1,5 @@ // interfaces/InterfaceWithDefault.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/interfaces/Jim.java b/interfaces/Jim.java index 66c0ea7cf..515db6e52 100644 --- a/interfaces/Jim.java +++ b/interfaces/Jim.java @@ -1,5 +1,5 @@ // interfaces/Jim.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.*; diff --git a/interfaces/MICollision.java b/interfaces/MICollision.java index fddfdbd9c..c96e5696b 100644 --- a/interfaces/MICollision.java +++ b/interfaces/MICollision.java @@ -1,5 +1,5 @@ // interfaces/MICollision.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.*; diff --git a/interfaces/Machine.java b/interfaces/Machine.java index 7e1733a9a..2b1144aef 100644 --- a/interfaces/Machine.java +++ b/interfaces/Machine.java @@ -1,5 +1,5 @@ // interfaces/Machine.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.*; diff --git a/interfaces/Months.java b/interfaces/Months.java index 75158ed6d..27317dd5d 100644 --- a/interfaces/Months.java +++ b/interfaces/Months.java @@ -1,5 +1,5 @@ // interfaces/Months.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Using interfaces to create groups of constants diff --git a/interfaces/MultipleInheritance.java b/interfaces/MultipleInheritance.java index 0a7028e7c..6ce9c91e0 100644 --- a/interfaces/MultipleInheritance.java +++ b/interfaces/MultipleInheritance.java @@ -1,5 +1,5 @@ // interfaces/MultipleInheritance.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.*; diff --git a/interfaces/PureInterface.java b/interfaces/PureInterface.java index b795fdccb..37bf9f0bd 100644 --- a/interfaces/PureInterface.java +++ b/interfaces/PureInterface.java @@ -1,5 +1,5 @@ // interfaces/PureInterface.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Interface only looked like this before Java 8 diff --git a/interfaces/RandVals.java b/interfaces/RandVals.java index fc2516f33..0221c851d 100644 --- a/interfaces/RandVals.java +++ b/interfaces/RandVals.java @@ -1,5 +1,5 @@ // interfaces/RandVals.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Initializing interface fields with diff --git a/interfaces/RandomDoubles.java b/interfaces/RandomDoubles.java index 7898a023b..99154d953 100644 --- a/interfaces/RandomDoubles.java +++ b/interfaces/RandomDoubles.java @@ -1,5 +1,5 @@ // interfaces/RandomDoubles.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.util.*; diff --git a/interfaces/RandomStrings.java b/interfaces/RandomStrings.java index b9984011a..82f982308 100644 --- a/interfaces/RandomStrings.java +++ b/interfaces/RandomStrings.java @@ -1,5 +1,5 @@ // interfaces/RandomStrings.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Implementing an interface to conform to a method diff --git a/interfaces/TestRandVals.java b/interfaces/TestRandVals.java index ff4f60d5c..df3490b26 100644 --- a/interfaces/TestRandVals.java +++ b/interfaces/TestRandVals.java @@ -1,5 +1,5 @@ // interfaces/TestRandVals.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/interfaces/filters/BandPass.java b/interfaces/filters/BandPass.java index 8e8367e98..7d09ed285 100644 --- a/interfaces/filters/BandPass.java +++ b/interfaces/filters/BandPass.java @@ -1,5 +1,5 @@ // interfaces/filters/BandPass.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. package interfaces.filters; diff --git a/interfaces/filters/Filter.java b/interfaces/filters/Filter.java index 5657a0de2..72e29a9e9 100644 --- a/interfaces/filters/Filter.java +++ b/interfaces/filters/Filter.java @@ -1,5 +1,5 @@ // interfaces/filters/Filter.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. package interfaces.filters; diff --git a/interfaces/filters/HighPass.java b/interfaces/filters/HighPass.java index 07a0e174b..7bf047df5 100644 --- a/interfaces/filters/HighPass.java +++ b/interfaces/filters/HighPass.java @@ -1,5 +1,5 @@ // interfaces/filters/HighPass.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. package interfaces.filters; diff --git a/interfaces/filters/LowPass.java b/interfaces/filters/LowPass.java index d85d7bd79..e9320a82a 100644 --- a/interfaces/filters/LowPass.java +++ b/interfaces/filters/LowPass.java @@ -1,5 +1,5 @@ // interfaces/filters/LowPass.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. package interfaces.filters; diff --git a/interfaces/filters/Waveform.java b/interfaces/filters/Waveform.java index 3d246c3c0..406446770 100644 --- a/interfaces/filters/Waveform.java +++ b/interfaces/filters/Waveform.java @@ -1,5 +1,5 @@ // interfaces/filters/Waveform.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. package interfaces.filters; diff --git a/interfaces/interfaceprocessor/Applicator.java b/interfaces/interfaceprocessor/Applicator.java index 15ca1f4af..77d7a9a66 100644 --- a/interfaces/interfaceprocessor/Applicator.java +++ b/interfaces/interfaceprocessor/Applicator.java @@ -1,5 +1,5 @@ // interfaces/interfaceprocessor/Applicator.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. package interfaces.interfaceprocessor; diff --git a/interfaces/interfaceprocessor/FilterProcessor.java b/interfaces/interfaceprocessor/FilterProcessor.java index 45b2ef754..33689ed46 100644 --- a/interfaces/interfaceprocessor/FilterProcessor.java +++ b/interfaces/interfaceprocessor/FilterProcessor.java @@ -1,5 +1,5 @@ // interfaces/interfaceprocessor/FilterProcessor.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // {java interfaces.interfaceprocessor.FilterProcessor} diff --git a/interfaces/interfaceprocessor/Processor.java b/interfaces/interfaceprocessor/Processor.java index d016f25c4..6315da300 100644 --- a/interfaces/interfaceprocessor/Processor.java +++ b/interfaces/interfaceprocessor/Processor.java @@ -1,5 +1,5 @@ // interfaces/interfaceprocessor/Processor.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. package interfaces.interfaceprocessor; diff --git a/interfaces/interfaceprocessor/StringProcessor.java b/interfaces/interfaceprocessor/StringProcessor.java index 553899f50..37cb49469 100644 --- a/interfaces/interfaceprocessor/StringProcessor.java +++ b/interfaces/interfaceprocessor/StringProcessor.java @@ -1,5 +1,5 @@ // interfaces/interfaceprocessor/StringProcessor.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // {java interfaces.interfaceprocessor.StringProcessor} diff --git a/interfaces/music4/Music4.java b/interfaces/music4/Music4.java index 22fcad72f..710341494 100644 --- a/interfaces/music4/Music4.java +++ b/interfaces/music4/Music4.java @@ -1,5 +1,5 @@ // interfaces/music4/Music4.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Abstract classes and methods diff --git a/interfaces/music5/Music5.java b/interfaces/music5/Music5.java index 14bfc9620..2326bdbc9 100644 --- a/interfaces/music5/Music5.java +++ b/interfaces/music5/Music5.java @@ -1,5 +1,5 @@ // interfaces/music5/Music5.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // {java interfaces.music5.Music5} diff --git a/interfaces/nesting/NestingInterfaces.java b/interfaces/nesting/NestingInterfaces.java index b728253b3..99b466bb0 100644 --- a/interfaces/nesting/NestingInterfaces.java +++ b/interfaces/nesting/NestingInterfaces.java @@ -1,5 +1,5 @@ // interfaces/nesting/NestingInterfaces.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // {java interfaces.nesting.NestingInterfaces} diff --git a/iostreams/BasicFileOutput.java b/iostreams/BasicFileOutput.java index 8c1184de2..1da5c6fdc 100644 --- a/iostreams/BasicFileOutput.java +++ b/iostreams/BasicFileOutput.java @@ -1,5 +1,5 @@ // iostreams/BasicFileOutput.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // {VisuallyInspectOutput} diff --git a/iostreams/BufferedInputFile.java b/iostreams/BufferedInputFile.java index 76dc960fa..bfe6396f1 100644 --- a/iostreams/BufferedInputFile.java +++ b/iostreams/BufferedInputFile.java @@ -1,5 +1,5 @@ // iostreams/BufferedInputFile.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // {VisuallyInspectOutput} diff --git a/iostreams/FileOutputShortcut.java b/iostreams/FileOutputShortcut.java index 7e949a4d0..5a160ec00 100644 --- a/iostreams/FileOutputShortcut.java +++ b/iostreams/FileOutputShortcut.java @@ -1,5 +1,5 @@ // iostreams/FileOutputShortcut.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // {VisuallyInspectOutput} diff --git a/iostreams/FormattedMemoryInput.java b/iostreams/FormattedMemoryInput.java index b6b7e3168..055dd8826 100644 --- a/iostreams/FormattedMemoryInput.java +++ b/iostreams/FormattedMemoryInput.java @@ -1,5 +1,5 @@ // iostreams/FormattedMemoryInput.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // {VisuallyInspectOutput} diff --git a/iostreams/MemoryInput.java b/iostreams/MemoryInput.java index 4989d0778..1326965c6 100644 --- a/iostreams/MemoryInput.java +++ b/iostreams/MemoryInput.java @@ -1,5 +1,5 @@ // iostreams/MemoryInput.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // {VisuallyInspectOutput} diff --git a/iostreams/StoringAndRecoveringData.java b/iostreams/StoringAndRecoveringData.java index 664eecc07..761f022eb 100644 --- a/iostreams/StoringAndRecoveringData.java +++ b/iostreams/StoringAndRecoveringData.java @@ -1,5 +1,5 @@ // iostreams/StoringAndRecoveringData.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.io.*; diff --git a/iostreams/TestEOF.java b/iostreams/TestEOF.java index dee0ba18d..956cb1a03 100644 --- a/iostreams/TestEOF.java +++ b/iostreams/TestEOF.java @@ -1,5 +1,5 @@ // iostreams/TestEOF.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Testing for end of file diff --git a/iostreams/UsingRandomAccessFile.java b/iostreams/UsingRandomAccessFile.java index 256db78c4..dde6d1ee8 100644 --- a/iostreams/UsingRandomAccessFile.java +++ b/iostreams/UsingRandomAccessFile.java @@ -1,5 +1,5 @@ // iostreams/UsingRandomAccessFile.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. import java.io.*; diff --git a/javadoc/Documentation1.java b/javadoc/Documentation1.java index 906df8dd7..7838fbd95 100644 --- a/javadoc/Documentation1.java +++ b/javadoc/Documentation1.java @@ -1,5 +1,5 @@ // javadoc/Documentation1.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. /** A class comment */ diff --git a/javadoc/Documentation2.java b/javadoc/Documentation2.java index a19594726..237755f4c 100644 --- a/javadoc/Documentation2.java +++ b/javadoc/Documentation2.java @@ -1,5 +1,5 @@ // javadoc/Documentation2.java -// (c)2017 MindView LLC: see Copyright.txt +// (c)2020 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. /**

    diff --git a/javadoc/Documentation3.java b/javadoc/Documentation3.java
    index 34f62ac3d..a3063c3d1 100644
    --- a/javadoc/Documentation3.java
    +++ b/javadoc/Documentation3.java
    @@ -1,5 +1,5 @@
     // javadoc/Documentation3.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     /** You can even insert a list:
    diff --git a/javadoc/HelloDateDoc.java b/javadoc/HelloDateDoc.java
    index 6c248966e..54b505a44 100644
    --- a/javadoc/HelloDateDoc.java
    +++ b/javadoc/HelloDateDoc.java
    @@ -1,5 +1,5 @@
     // javadoc/HelloDateDoc.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    diff --git a/lowlevel/AtomicEvenProducer.java b/lowlevel/AtomicEvenProducer.java
    index 806b4503c..8c45b61c9 100644
    --- a/lowlevel/AtomicEvenProducer.java
    +++ b/lowlevel/AtomicEvenProducer.java
    @@ -1,5 +1,5 @@
     // lowlevel/AtomicEvenProducer.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Atomic classes: occasionally useful in regular code
    diff --git a/lowlevel/AtomicIntegerTest.java b/lowlevel/AtomicIntegerTest.java
    index 31c6a106c..09db1ca83 100644
    --- a/lowlevel/AtomicIntegerTest.java
    +++ b/lowlevel/AtomicIntegerTest.java
    @@ -1,5 +1,5 @@
     // lowlevel/AtomicIntegerTest.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.concurrent.*;
    diff --git a/lowlevel/AtomicSerialNumbers.java b/lowlevel/AtomicSerialNumbers.java
    index ed063c86e..2e30e9c4a 100644
    --- a/lowlevel/AtomicSerialNumbers.java
    +++ b/lowlevel/AtomicSerialNumbers.java
    @@ -1,5 +1,5 @@
     // lowlevel/AtomicSerialNumbers.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.concurrent.atomic.*;
    diff --git a/lowlevel/Atomicity.java b/lowlevel/Atomicity.java
    index 380a5f1be..632631bf4 100644
    --- a/lowlevel/Atomicity.java
    +++ b/lowlevel/Atomicity.java
    @@ -1,5 +1,5 @@
     // lowlevel/Atomicity.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.concurrent.*;
    diff --git a/lowlevel/AttemptLocking.java b/lowlevel/AttemptLocking.java
    index 969143e6c..9dbe2b28e 100644
    --- a/lowlevel/AttemptLocking.java
    +++ b/lowlevel/AttemptLocking.java
    @@ -1,5 +1,5 @@
     // lowlevel/AttemptLocking.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Locks in the concurrent library allow you
    diff --git a/lowlevel/CaptureUncaughtException.java b/lowlevel/CaptureUncaughtException.java
    index b540e341f..33261667d 100644
    --- a/lowlevel/CaptureUncaughtException.java
    +++ b/lowlevel/CaptureUncaughtException.java
    @@ -1,5 +1,5 @@
     // lowlevel/CaptureUncaughtException.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.concurrent.*;
    diff --git a/lowlevel/CircularSet.java b/lowlevel/CircularSet.java
    index 8f76fd197..225eaeca4 100644
    --- a/lowlevel/CircularSet.java
    +++ b/lowlevel/CircularSet.java
    @@ -1,5 +1,5 @@
     // lowlevel/CircularSet.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Reuses storage so we don't run out of memory
    diff --git a/lowlevel/DelayQueueDemo.java b/lowlevel/DelayQueueDemo.java
    index c0d85b020..c5575c681 100644
    --- a/lowlevel/DelayQueueDemo.java
    +++ b/lowlevel/DelayQueueDemo.java
    @@ -1,5 +1,5 @@
     // lowlevel/DelayQueueDemo.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    diff --git a/lowlevel/EvenChecker.java b/lowlevel/EvenChecker.java
    index 75c89e0fb..5e27a39eb 100644
    --- a/lowlevel/EvenChecker.java
    +++ b/lowlevel/EvenChecker.java
    @@ -1,5 +1,5 @@
     // lowlevel/EvenChecker.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    diff --git a/lowlevel/EvenProducer.java b/lowlevel/EvenProducer.java
    index adb7153d8..301577557 100644
    --- a/lowlevel/EvenProducer.java
    +++ b/lowlevel/EvenProducer.java
    @@ -1,5 +1,5 @@
     // lowlevel/EvenProducer.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // When threads collide
    diff --git a/lowlevel/ExceptionThread.java b/lowlevel/ExceptionThread.java
    index 859e86a32..518b9f5f1 100644
    --- a/lowlevel/ExceptionThread.java
    +++ b/lowlevel/ExceptionThread.java
    @@ -1,5 +1,5 @@
     // lowlevel/ExceptionThread.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // {ThrowsException}
    diff --git a/lowlevel/IntGenerator.java b/lowlevel/IntGenerator.java
    index c9714d5d0..e1dd0f629 100644
    --- a/lowlevel/IntGenerator.java
    +++ b/lowlevel/IntGenerator.java
    @@ -1,5 +1,5 @@
     // lowlevel/IntGenerator.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.concurrent.atomic.AtomicBoolean;
    diff --git a/lowlevel/IntTestable.java b/lowlevel/IntTestable.java
    index a2a033fea..1989ff4db 100644
    --- a/lowlevel/IntTestable.java
    +++ b/lowlevel/IntTestable.java
    @@ -1,5 +1,5 @@
     // lowlevel/IntTestable.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.function.*;
    diff --git a/lowlevel/MutexEvenProducer.java b/lowlevel/MutexEvenProducer.java
    index c3f98866a..ae82df827 100644
    --- a/lowlevel/MutexEvenProducer.java
    +++ b/lowlevel/MutexEvenProducer.java
    @@ -1,5 +1,5 @@
     // lowlevel/MutexEvenProducer.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Preventing thread collisions with mutexes
    diff --git a/lowlevel/NaiveExceptionHandling.java b/lowlevel/NaiveExceptionHandling.java
    index 14a76d850..3681337ef 100644
    --- a/lowlevel/NaiveExceptionHandling.java
    +++ b/lowlevel/NaiveExceptionHandling.java
    @@ -1,5 +1,5 @@
     // lowlevel/NaiveExceptionHandling.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // {ThrowsException}
    diff --git a/lowlevel/NotAtomic.java b/lowlevel/NotAtomic.java
    index e3fa47847..e07954510 100644
    --- a/lowlevel/NotAtomic.java
    +++ b/lowlevel/NotAtomic.java
    @@ -1,5 +1,5 @@
     // lowlevel/NotAtomic.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // {javap -c NotAtomic}
    diff --git a/lowlevel/NumberOfProcessors.java b/lowlevel/NumberOfProcessors.java
    index 103d6c1d2..44abeb5dd 100644
    --- a/lowlevel/NumberOfProcessors.java
    +++ b/lowlevel/NumberOfProcessors.java
    @@ -1,5 +1,5 @@
     // lowlevel/NumberOfProcessors.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
    diff --git a/lowlevel/PriorityBlockingQueueDemo.java b/lowlevel/PriorityBlockingQueueDemo.java
    index c62bf46f2..099a53497 100644
    --- a/lowlevel/PriorityBlockingQueueDemo.java
    +++ b/lowlevel/PriorityBlockingQueueDemo.java
    @@ -1,5 +1,5 @@
     // lowlevel/PriorityBlockingQueueDemo.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    diff --git a/lowlevel/ReOrdering.java b/lowlevel/ReOrdering.java
    index 9de9c4b81..8209ac40f 100644
    --- a/lowlevel/ReOrdering.java
    +++ b/lowlevel/ReOrdering.java
    @@ -1,5 +1,5 @@
     // lowlevel/ReOrdering.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
    diff --git a/lowlevel/SafeReturn.java b/lowlevel/SafeReturn.java
    index 829a1f98e..751c96be9 100644
    --- a/lowlevel/SafeReturn.java
    +++ b/lowlevel/SafeReturn.java
    @@ -1,5 +1,5 @@
     // lowlevel/SafeReturn.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.function.*;
    diff --git a/lowlevel/SerialNumberChecker.java b/lowlevel/SerialNumberChecker.java
    index 72ab795f0..9c2b92ad2 100644
    --- a/lowlevel/SerialNumberChecker.java
    +++ b/lowlevel/SerialNumberChecker.java
    @@ -1,5 +1,5 @@
     // lowlevel/SerialNumberChecker.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Test SerialNumbers implementations for thread-safety
    diff --git a/lowlevel/SerialNumberTest.java b/lowlevel/SerialNumberTest.java
    index 7da47cd8d..cdeddcd95 100644
    --- a/lowlevel/SerialNumberTest.java
    +++ b/lowlevel/SerialNumberTest.java
    @@ -1,5 +1,5 @@
     // lowlevel/SerialNumberTest.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
    diff --git a/lowlevel/SerialNumbers.java b/lowlevel/SerialNumbers.java
    index bf046b7ae..3f6101c73 100644
    --- a/lowlevel/SerialNumbers.java
    +++ b/lowlevel/SerialNumbers.java
    @@ -1,5 +1,5 @@
     // lowlevel/SerialNumbers.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
    diff --git a/lowlevel/SettingDefaultHandler.java b/lowlevel/SettingDefaultHandler.java
    index 9b13362bf..56a046426 100644
    --- a/lowlevel/SettingDefaultHandler.java
    +++ b/lowlevel/SettingDefaultHandler.java
    @@ -1,5 +1,5 @@
     // lowlevel/SettingDefaultHandler.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.concurrent.*;
    diff --git a/lowlevel/SwallowedException.java b/lowlevel/SwallowedException.java
    index 33c824306..60edd0d6c 100644
    --- a/lowlevel/SwallowedException.java
    +++ b/lowlevel/SwallowedException.java
    @@ -1,5 +1,5 @@
     // lowlevel/SwallowedException.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.concurrent.*;
    diff --git a/lowlevel/SyncOnObject.java b/lowlevel/SyncOnObject.java
    index 0d0ff1526..846c5573a 100644
    --- a/lowlevel/SyncOnObject.java
    +++ b/lowlevel/SyncOnObject.java
    @@ -1,5 +1,5 @@
     // lowlevel/SyncOnObject.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Synchronizing on another object
    diff --git a/lowlevel/SynchronizedComparison.java b/lowlevel/SynchronizedComparison.java
    index 11afebd2d..6fbcd1f3d 100644
    --- a/lowlevel/SynchronizedComparison.java
    +++ b/lowlevel/SynchronizedComparison.java
    @@ -1,5 +1,5 @@
     // lowlevel/SynchronizedComparison.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Synchronizing blocks instead of entire methods
    diff --git a/lowlevel/SynchronizedEvenProducer.java b/lowlevel/SynchronizedEvenProducer.java
    index b6f4f4843..377aeecbb 100644
    --- a/lowlevel/SynchronizedEvenProducer.java
    +++ b/lowlevel/SynchronizedEvenProducer.java
    @@ -1,5 +1,5 @@
     // lowlevel/SynchronizedEvenProducer.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Simplifying mutexes with the synchronized keyword
    diff --git a/lowlevel/SynchronizedSerialNumbers.java b/lowlevel/SynchronizedSerialNumbers.java
    index fff565e23..1739d8401 100644
    --- a/lowlevel/SynchronizedSerialNumbers.java
    +++ b/lowlevel/SynchronizedSerialNumbers.java
    @@ -1,5 +1,5 @@
     // lowlevel/SynchronizedSerialNumbers.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
    diff --git a/lowlevel/TestAbort.java b/lowlevel/TestAbort.java
    index c5dc1069d..a9efe5285 100644
    --- a/lowlevel/TestAbort.java
    +++ b/lowlevel/TestAbort.java
    @@ -1,5 +1,5 @@
     // lowlevel/TestAbort.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import onjava.*;
    diff --git a/lowlevel/ThreadSize.java b/lowlevel/ThreadSize.java
    index d518b2ac3..0f00023d3 100644
    --- a/lowlevel/ThreadSize.java
    +++ b/lowlevel/ThreadSize.java
    @@ -1,5 +1,5 @@
     // lowlevel/ThreadSize.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // {ExcludeFromGradle} Takes a long time or hangs
    diff --git a/lowlevel/UnsafeReturn.java b/lowlevel/UnsafeReturn.java
    index d8463f32f..c2481fc0f 100644
    --- a/lowlevel/UnsafeReturn.java
    +++ b/lowlevel/UnsafeReturn.java
    @@ -1,5 +1,5 @@
     // lowlevel/UnsafeReturn.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.function.*;
    diff --git a/lowlevel/WorkStealingPool.java b/lowlevel/WorkStealingPool.java
    index b488cf2b4..984de7067 100644
    --- a/lowlevel/WorkStealingPool.java
    +++ b/lowlevel/WorkStealingPool.java
    @@ -1,5 +1,5 @@
     // lowlevel/WorkStealingPool.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.stream.*;
    diff --git a/newio/AvailableCharSets.java b/newio/AvailableCharSets.java
    index b46b3dfb1..eda3b93c2 100644
    --- a/newio/AvailableCharSets.java
    +++ b/newio/AvailableCharSets.java
    @@ -1,5 +1,5 @@
     // newio/AvailableCharSets.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Displays Charsets and aliases
    diff --git a/newio/BufferToText.java b/newio/BufferToText.java
    index 81d541a22..2f38c2c6a 100644
    --- a/newio/BufferToText.java
    +++ b/newio/BufferToText.java
    @@ -1,5 +1,5 @@
     // newio/BufferToText.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Converting text to and from ByteBuffers
    diff --git a/newio/ChannelCopy.java b/newio/ChannelCopy.java
    index 6aed504fe..846961310 100644
    --- a/newio/ChannelCopy.java
    +++ b/newio/ChannelCopy.java
    @@ -1,5 +1,5 @@
     // newio/ChannelCopy.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Copying a file using channels and buffers
    diff --git a/newio/Endians.java b/newio/Endians.java
    index 5ff8d7208..11d660760 100644
    --- a/newio/Endians.java
    +++ b/newio/Endians.java
    @@ -1,5 +1,5 @@
     // newio/Endians.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Endian differences and data storage
    diff --git a/newio/FileLocking.java b/newio/FileLocking.java
    index 8a8f776a8..e8c74d2a9 100644
    --- a/newio/FileLocking.java
    +++ b/newio/FileLocking.java
    @@ -1,5 +1,5 @@
     // newio/FileLocking.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.nio.channels.*;
    diff --git a/newio/GetChannel.java b/newio/GetChannel.java
    index 73bfe683d..16caa3400 100644
    --- a/newio/GetChannel.java
    +++ b/newio/GetChannel.java
    @@ -1,5 +1,5 @@
     // newio/GetChannel.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Getting channels from streams
    diff --git a/newio/GetData.java b/newio/GetData.java
    index b05073db0..b2518b101 100644
    --- a/newio/GetData.java
    +++ b/newio/GetData.java
    @@ -1,5 +1,5 @@
     // newio/GetData.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Getting different representations from a ByteBuffer
    diff --git a/newio/IntBufferDemo.java b/newio/IntBufferDemo.java
    index 4b3838856..31ffaa8f8 100644
    --- a/newio/IntBufferDemo.java
    +++ b/newio/IntBufferDemo.java
    @@ -1,5 +1,5 @@
     // newio/IntBufferDemo.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Manipulating ints in a ByteBuffer with an IntBuffer
    diff --git a/newio/LargeMappedFiles.java b/newio/LargeMappedFiles.java
    index 980896021..c4976e450 100644
    --- a/newio/LargeMappedFiles.java
    +++ b/newio/LargeMappedFiles.java
    @@ -1,5 +1,5 @@
     // newio/LargeMappedFiles.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Creating a very large file using mapping
    diff --git a/newio/LockingMappedFiles.java b/newio/LockingMappedFiles.java
    index f8ebcb5e3..6fe8fee52 100644
    --- a/newio/LockingMappedFiles.java
    +++ b/newio/LockingMappedFiles.java
    @@ -1,5 +1,5 @@
     // newio/LockingMappedFiles.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Locking portions of a mapped file
    diff --git a/newio/MappedIO.java b/newio/MappedIO.java
    index beeadf3c1..82f3cca7c 100644
    --- a/newio/MappedIO.java
    +++ b/newio/MappedIO.java
    @@ -1,5 +1,5 @@
     // newio/MappedIO.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    diff --git a/newio/TransferTo.java b/newio/TransferTo.java
    index d0cac844f..f3095b71e 100644
    --- a/newio/TransferTo.java
    +++ b/newio/TransferTo.java
    @@ -1,5 +1,5 @@
     // newio/TransferTo.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Using transferTo() between channels
    diff --git a/newio/UsingBuffers.java b/newio/UsingBuffers.java
    index e4c493992..3f3a6bd14 100644
    --- a/newio/UsingBuffers.java
    +++ b/newio/UsingBuffers.java
    @@ -1,5 +1,5 @@
     // newio/UsingBuffers.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.nio.*;
    diff --git a/newio/ViewBuffers.java b/newio/ViewBuffers.java
    index c199101e1..d7bb1adfb 100644
    --- a/newio/ViewBuffers.java
    +++ b/newio/ViewBuffers.java
    @@ -1,5 +1,5 @@
     // newio/ViewBuffers.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.nio.*;
    diff --git a/objects/HelloDate.java b/objects/HelloDate.java
    index fa5b3d2c4..1f613e8e1 100644
    --- a/objects/HelloDate.java
    +++ b/objects/HelloDate.java
    @@ -1,5 +1,5 @@
     // objects/HelloDate.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    diff --git a/objects/ShowProperties.java b/objects/ShowProperties.java
    index dcf7c737b..ac2bf41ee 100644
    --- a/objects/ShowProperties.java
    +++ b/objects/ShowProperties.java
    @@ -1,5 +1,5 @@
     // objects/ShowProperties.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
    diff --git a/onjava/ArrayShow.java b/onjava/ArrayShow.java
    index 4ccc5737d..6edd148fa 100644
    --- a/onjava/ArrayShow.java
    +++ b/onjava/ArrayShow.java
    @@ -1,5 +1,5 @@
     // onjava/ArrayShow.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package onjava;
    diff --git a/onjava/BasicSupplier.java b/onjava/BasicSupplier.java
    index 097375b61..377d74d18 100644
    --- a/onjava/BasicSupplier.java
    +++ b/onjava/BasicSupplier.java
    @@ -1,5 +1,5 @@
     // onjava/BasicSupplier.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Supplier from a class with a no-arg constructor
    diff --git a/onjava/CollectionMethodDifferences.java b/onjava/CollectionMethodDifferences.java
    index d31a30f93..375d4e419 100644
    --- a/onjava/CollectionMethodDifferences.java
    +++ b/onjava/CollectionMethodDifferences.java
    @@ -1,5 +1,5 @@
     // onjava/CollectionMethodDifferences.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // {java onjava.CollectionMethodDifferences}
    diff --git a/onjava/ConvertTo.java b/onjava/ConvertTo.java
    index e14697a5b..cc8febd70 100644
    --- a/onjava/ConvertTo.java
    +++ b/onjava/ConvertTo.java
    @@ -1,5 +1,5 @@
     // onjava/ConvertTo.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package onjava;
    diff --git a/onjava/Count.java b/onjava/Count.java
    index 1e2f90b5b..1f380f87c 100644
    --- a/onjava/Count.java
    +++ b/onjava/Count.java
    @@ -1,5 +1,5 @@
     // onjava/Count.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Generate incremental values of different types
    diff --git a/onjava/CountMap.java b/onjava/CountMap.java
    index c3208e71a..e3759053c 100644
    --- a/onjava/CountMap.java
    +++ b/onjava/CountMap.java
    @@ -1,5 +1,5 @@
     // onjava/CountMap.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Unlimited-length Map containing sample data
    diff --git a/onjava/CountingIntegerList.java b/onjava/CountingIntegerList.java
    index 20e11fa25..7d5d4f79b 100644
    --- a/onjava/CountingIntegerList.java
    +++ b/onjava/CountingIntegerList.java
    @@ -1,5 +1,5 @@
     // onjava/CountingIntegerList.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // List of any length, containing sample data
    diff --git a/onjava/Countries.java b/onjava/Countries.java
    index aff022731..ec42b5922 100644
    --- a/onjava/Countries.java
    +++ b/onjava/Countries.java
    @@ -1,5 +1,5 @@
     // onjava/Countries.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // "Flyweight" Maps and Lists of sample data
    diff --git a/onjava/Enums.java b/onjava/Enums.java
    index f7df73a2e..0440802f9 100644
    --- a/onjava/Enums.java
    +++ b/onjava/Enums.java
    @@ -1,5 +1,5 @@
     // onjava/Enums.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package onjava;
    diff --git a/onjava/FillMap.java b/onjava/FillMap.java
    index 9b87bc1f2..eadc5495e 100644
    --- a/onjava/FillMap.java
    +++ b/onjava/FillMap.java
    @@ -1,5 +1,5 @@
     // onjava/FillMap.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package onjava;
    diff --git a/onjava/HTMLColors.java b/onjava/HTMLColors.java
    index e84b9c90b..bdc3458f0 100644
    --- a/onjava/HTMLColors.java
    +++ b/onjava/HTMLColors.java
    @@ -1,5 +1,5 @@
     // onjava/HTMLColors.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Sample data for collection examples
    diff --git a/onjava/MouseClick.java b/onjava/MouseClick.java
    index 7d57022cd..70d982f76 100644
    --- a/onjava/MouseClick.java
    +++ b/onjava/MouseClick.java
    @@ -1,5 +1,5 @@
     // onjava/MouseClick.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Helper interface to allow lambda expressions
    diff --git a/onjava/Nap.java b/onjava/Nap.java
    index ba9df34a2..2b89745b1 100644
    --- a/onjava/Nap.java
    +++ b/onjava/Nap.java
    @@ -1,5 +1,5 @@
     // onjava/Nap.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package onjava;
    diff --git a/onjava/Null.java b/onjava/Null.java
    index 4f8659310..f3bb70d69 100644
    --- a/onjava/Null.java
    +++ b/onjava/Null.java
    @@ -1,5 +1,5 @@
     // onjava/Null.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package onjava;
    diff --git a/onjava/OSExecute.java b/onjava/OSExecute.java
    index 7dc19f616..25ac7f0ce 100644
    --- a/onjava/OSExecute.java
    +++ b/onjava/OSExecute.java
    @@ -1,5 +1,5 @@
     // onjava/OSExecute.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Run an operating system command
    diff --git a/onjava/OSExecuteException.java b/onjava/OSExecuteException.java
    index 6a7b13e56..17d803e15 100644
    --- a/onjava/OSExecuteException.java
    +++ b/onjava/OSExecuteException.java
    @@ -1,5 +1,5 @@
     // onjava/OSExecuteException.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package onjava;
    diff --git a/onjava/Operations.java b/onjava/Operations.java
    index 442dd1acc..33b644c65 100644
    --- a/onjava/Operations.java
    +++ b/onjava/Operations.java
    @@ -1,5 +1,5 @@
     // onjava/Operations.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package onjava;
    diff --git a/onjava/Pair.java b/onjava/Pair.java
    index 657aa56bb..784ef8ac4 100644
    --- a/onjava/Pair.java
    +++ b/onjava/Pair.java
    @@ -1,5 +1,5 @@
     // onjava/Pair.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package onjava;
    diff --git a/onjava/ProcessFiles.java b/onjava/ProcessFiles.java
    index 4072d6fc3..edcea73a0 100644
    --- a/onjava/ProcessFiles.java
    +++ b/onjava/ProcessFiles.java
    @@ -1,5 +1,5 @@
     // onjava/ProcessFiles.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package onjava;
    diff --git a/onjava/Rand.java b/onjava/Rand.java
    index 019bac408..d21c0e2b2 100644
    --- a/onjava/Rand.java
    +++ b/onjava/Rand.java
    @@ -1,5 +1,5 @@
     // onjava/Rand.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Generate random values of different types
    diff --git a/onjava/Range.java b/onjava/Range.java
    index 05e27fd8d..e075c9ba9 100644
    --- a/onjava/Range.java
    +++ b/onjava/Range.java
    @@ -1,5 +1,5 @@
     // onjava/Range.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Array creation methods that can be used without
    diff --git a/onjava/Repeat.java b/onjava/Repeat.java
    index 59aad0522..7ab61facf 100644
    --- a/onjava/Repeat.java
    +++ b/onjava/Repeat.java
    @@ -1,5 +1,5 @@
     // onjava/Repeat.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package onjava;
    diff --git a/onjava/RmDir.java b/onjava/RmDir.java
    index f080f8cc3..be7ea4940 100644
    --- a/onjava/RmDir.java
    +++ b/onjava/RmDir.java
    @@ -1,5 +1,5 @@
     // onjava/RmDir.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package onjava;
    diff --git a/onjava/Sets.java b/onjava/Sets.java
    index 71afe50f8..62258f155 100644
    --- a/onjava/Sets.java
    +++ b/onjava/Sets.java
    @@ -1,5 +1,5 @@
     // onjava/Sets.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package onjava;
    diff --git a/onjava/Stack.java b/onjava/Stack.java
    index 84b08a4e3..a51081768 100644
    --- a/onjava/Stack.java
    +++ b/onjava/Stack.java
    @@ -1,5 +1,5 @@
     // onjava/Stack.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // A Stack class built with an ArrayDeque
    diff --git a/onjava/Suppliers.java b/onjava/Suppliers.java
    index c746637a2..226a70cb5 100644
    --- a/onjava/Suppliers.java
    +++ b/onjava/Suppliers.java
    @@ -1,5 +1,5 @@
     // onjava/Suppliers.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // A utility to use with Suppliers
    diff --git a/onjava/TimedAbort.java b/onjava/TimedAbort.java
    index b378738d4..3715cf2ee 100644
    --- a/onjava/TimedAbort.java
    +++ b/onjava/TimedAbort.java
    @@ -1,5 +1,5 @@
     // onjava/TimedAbort.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Terminate a program after t seconds
    diff --git a/onjava/Timer.java b/onjava/Timer.java
    index e1c3fc9ba..a695f79fa 100644
    --- a/onjava/Timer.java
    +++ b/onjava/Timer.java
    @@ -1,5 +1,5 @@
     // onjava/Timer.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package onjava;
    diff --git a/onjava/Tuple.java b/onjava/Tuple.java
    index 05da09f25..73cfaa3ce 100644
    --- a/onjava/Tuple.java
    +++ b/onjava/Tuple.java
    @@ -1,5 +1,5 @@
     // onjava/Tuple.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Tuple library using type argument inference
    diff --git a/onjava/Tuple2.java b/onjava/Tuple2.java
    index 862affe74..7ca8d1994 100644
    --- a/onjava/Tuple2.java
    +++ b/onjava/Tuple2.java
    @@ -1,5 +1,5 @@
     // onjava/Tuple2.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package onjava;
    diff --git a/onjava/Tuple3.java b/onjava/Tuple3.java
    index c7b1007e8..26780642c 100644
    --- a/onjava/Tuple3.java
    +++ b/onjava/Tuple3.java
    @@ -1,5 +1,5 @@
     // onjava/Tuple3.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package onjava;
    diff --git a/onjava/Tuple4.java b/onjava/Tuple4.java
    index 0fdaf2be6..5ab51dc98 100644
    --- a/onjava/Tuple4.java
    +++ b/onjava/Tuple4.java
    @@ -1,5 +1,5 @@
     // onjava/Tuple4.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package onjava;
    diff --git a/onjava/Tuple5.java b/onjava/Tuple5.java
    index 58a80c03d..1df88bfdc 100644
    --- a/onjava/Tuple5.java
    +++ b/onjava/Tuple5.java
    @@ -1,5 +1,5 @@
     // onjava/Tuple5.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package onjava;
    diff --git a/onjava/TypeCounter.java b/onjava/TypeCounter.java
    index 9c0fae021..d8b262b72 100644
    --- a/onjava/TypeCounter.java
    +++ b/onjava/TypeCounter.java
    @@ -1,5 +1,5 @@
     // onjava/TypeCounter.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Counts instances of a type family
    diff --git a/onjava/atunit/AtUnit.java b/onjava/atunit/AtUnit.java
    index fcd19aa45..a6c621277 100644
    --- a/onjava/atunit/AtUnit.java
    +++ b/onjava/atunit/AtUnit.java
    @@ -1,5 +1,5 @@
     // onjava/atunit/AtUnit.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // An annotation-based unit-test framework
    diff --git a/onjava/atunit/ClassNameFinder.java b/onjava/atunit/ClassNameFinder.java
    index af7f2aef6..3fef7faff 100644
    --- a/onjava/atunit/ClassNameFinder.java
    +++ b/onjava/atunit/ClassNameFinder.java
    @@ -1,5 +1,5 @@
     // onjava/atunit/ClassNameFinder.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // {java onjava.atunit.ClassNameFinder}
    diff --git a/onjava/atunit/Test.java b/onjava/atunit/Test.java
    index fd4558f6c..314dce9b3 100644
    --- a/onjava/atunit/Test.java
    +++ b/onjava/atunit/Test.java
    @@ -1,5 +1,5 @@
     // onjava/atunit/Test.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // The @Test tag
    diff --git a/onjava/atunit/TestObjectCleanup.java b/onjava/atunit/TestObjectCleanup.java
    index 55937f9cd..522311778 100644
    --- a/onjava/atunit/TestObjectCleanup.java
    +++ b/onjava/atunit/TestObjectCleanup.java
    @@ -1,5 +1,5 @@
     // onjava/atunit/TestObjectCleanup.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // The @Unit @TestObjectCleanup tag
    diff --git a/onjava/atunit/TestObjectCreate.java b/onjava/atunit/TestObjectCreate.java
    index 55c7a73ac..f8b43a09d 100644
    --- a/onjava/atunit/TestObjectCreate.java
    +++ b/onjava/atunit/TestObjectCreate.java
    @@ -1,5 +1,5 @@
     // onjava/atunit/TestObjectCreate.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // The @Unit @TestObjectCreate tag
    diff --git a/onjava/atunit/TestProperty.java b/onjava/atunit/TestProperty.java
    index e8873fcc8..4e09cf95d 100644
    --- a/onjava/atunit/TestProperty.java
    +++ b/onjava/atunit/TestProperty.java
    @@ -1,5 +1,5 @@
     // onjava/atunit/TestProperty.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // The @Unit @TestProperty tag
    diff --git a/operators/AllOps.java b/operators/AllOps.java
    index 27a62f354..bb94e8709 100644
    --- a/operators/AllOps.java
    +++ b/operators/AllOps.java
    @@ -1,5 +1,5 @@
     // operators/AllOps.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Tests all operators on all primitive data types
    diff --git a/operators/Assignment.java b/operators/Assignment.java
    index a341f38ff..7a573a392 100644
    --- a/operators/Assignment.java
    +++ b/operators/Assignment.java
    @@ -1,5 +1,5 @@
     // operators/Assignment.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Assignment with objects is a bit tricky
    diff --git a/operators/AutoInc.java b/operators/AutoInc.java
    index 71309a02d..835875de6 100644
    --- a/operators/AutoInc.java
    +++ b/operators/AutoInc.java
    @@ -1,5 +1,5 @@
     // operators/AutoInc.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Demonstrates the ++ and -- operators
    diff --git a/operators/BitManipulation.java b/operators/BitManipulation.java
    index 2ec1b985c..dc30c4428 100644
    --- a/operators/BitManipulation.java
    +++ b/operators/BitManipulation.java
    @@ -1,5 +1,5 @@
     // operators/BitManipulation.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Using the bitwise operators
    diff --git a/operators/Bool.java b/operators/Bool.java
    index 79c3eac39..e9984adb7 100644
    --- a/operators/Bool.java
    +++ b/operators/Bool.java
    @@ -1,5 +1,5 @@
     // operators/Bool.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Relational and logical operators
    diff --git a/operators/Casting.java b/operators/Casting.java
    index 96ec6c7f8..337b24fd8 100644
    --- a/operators/Casting.java
    +++ b/operators/Casting.java
    @@ -1,5 +1,5 @@
     // operators/Casting.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
    diff --git a/operators/CastingNumbers.java b/operators/CastingNumbers.java
    index 2397496ad..a6c04c6ea 100644
    --- a/operators/CastingNumbers.java
    +++ b/operators/CastingNumbers.java
    @@ -1,5 +1,5 @@
     // operators/CastingNumbers.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // What happens when you cast a float
    diff --git a/operators/EqualsMethod.java b/operators/EqualsMethod.java
    index 50c5a8ff2..f55b1b579 100644
    --- a/operators/EqualsMethod.java
    +++ b/operators/EqualsMethod.java
    @@ -1,5 +1,5 @@
     // operators/EqualsMethod.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
    diff --git a/operators/EqualsMethod2.java b/operators/EqualsMethod2.java
    index 490d3f8cb..213930602 100644
    --- a/operators/EqualsMethod2.java
    +++ b/operators/EqualsMethod2.java
    @@ -1,5 +1,5 @@
     // operators/EqualsMethod2.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Default equals() does not compare contents
    diff --git a/operators/Equivalence.java b/operators/Equivalence.java
    index 268a75be8..cef07d646 100644
    --- a/operators/Equivalence.java
    +++ b/operators/Equivalence.java
    @@ -1,5 +1,5 @@
     // operators/Equivalence.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
    diff --git a/operators/Exponents.java b/operators/Exponents.java
    index 1f7269cb3..924340dfb 100644
    --- a/operators/Exponents.java
    +++ b/operators/Exponents.java
    @@ -1,5 +1,5 @@
     // operators/Exponents.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // "e" means "10 to the power."
    diff --git a/operators/Literals.java b/operators/Literals.java
    index dbf19822d..ad00e0b8f 100644
    --- a/operators/Literals.java
    +++ b/operators/Literals.java
    @@ -1,5 +1,5 @@
     // operators/Literals.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
    diff --git a/operators/MathOps.java b/operators/MathOps.java
    index 32587fd74..a9b089382 100644
    --- a/operators/MathOps.java
    +++ b/operators/MathOps.java
    @@ -1,5 +1,5 @@
     // operators/MathOps.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // The mathematical operators
    diff --git a/operators/Overflow.java b/operators/Overflow.java
    index 798d849e8..851c1456b 100644
    --- a/operators/Overflow.java
    +++ b/operators/Overflow.java
    @@ -1,5 +1,5 @@
     // operators/Overflow.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Surprise! Java lets you overflow
    diff --git a/operators/PassObject.java b/operators/PassObject.java
    index 153efd857..af53ab566 100644
    --- a/operators/PassObject.java
    +++ b/operators/PassObject.java
    @@ -1,5 +1,5 @@
     // operators/PassObject.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Passing objects to methods might not be
    diff --git a/operators/Precedence.java b/operators/Precedence.java
    index f16942c33..f0f8140cd 100644
    --- a/operators/Precedence.java
    +++ b/operators/Precedence.java
    @@ -1,5 +1,5 @@
     // operators/Precedence.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
    diff --git a/operators/RoundingNumbers.java b/operators/RoundingNumbers.java
    index 7ecc68299..e46a20561 100644
    --- a/operators/RoundingNumbers.java
    +++ b/operators/RoundingNumbers.java
    @@ -1,5 +1,5 @@
     // operators/RoundingNumbers.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Rounding floats and doubles
    diff --git a/operators/ShortCircuit.java b/operators/ShortCircuit.java
    index c60ef20fb..8fc96711e 100644
    --- a/operators/ShortCircuit.java
    +++ b/operators/ShortCircuit.java
    @@ -1,5 +1,5 @@
     // operators/ShortCircuit.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Short-circuiting behavior with logical operators
    diff --git a/operators/StringOperators.java b/operators/StringOperators.java
    index 1719fae58..b1eb211fb 100644
    --- a/operators/StringOperators.java
    +++ b/operators/StringOperators.java
    @@ -1,5 +1,5 @@
     // operators/StringOperators.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
    diff --git a/operators/TernaryIfElse.java b/operators/TernaryIfElse.java
    index 53361557a..d11d4e24c 100644
    --- a/operators/TernaryIfElse.java
    +++ b/operators/TernaryIfElse.java
    @@ -1,5 +1,5 @@
     // operators/TernaryIfElse.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
    diff --git a/operators/URShift.java b/operators/URShift.java
    index 46bdbaa82..8d24f94b5 100644
    --- a/operators/URShift.java
    +++ b/operators/URShift.java
    @@ -1,5 +1,5 @@
     // operators/URShift.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Test of unsigned right shift
    diff --git a/operators/Underscores.java b/operators/Underscores.java
    index cd862fb88..4d78cd503 100644
    --- a/operators/Underscores.java
    +++ b/operators/Underscores.java
    @@ -1,5 +1,5 @@
     // operators/Underscores.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
    diff --git a/patterns/BoxObserver.java b/patterns/BoxObserver.java
    index 0076eac21..355c4086e 100644
    --- a/patterns/BoxObserver.java
    +++ b/patterns/BoxObserver.java
    @@ -1,5 +1,5 @@
     // patterns/BoxObserver.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Demonstration of Observer pattern using
    diff --git a/patterns/CommandPattern.java b/patterns/CommandPattern.java
    index 277b1fb9f..f84533aa9 100644
    --- a/patterns/CommandPattern.java
    +++ b/patterns/CommandPattern.java
    @@ -1,5 +1,5 @@
     // patterns/CommandPattern.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    diff --git a/patterns/Facade.java b/patterns/Facade.java
    index 005acf13f..0c1accf27 100644
    --- a/patterns/Facade.java
    +++ b/patterns/Facade.java
    @@ -1,5 +1,5 @@
     // patterns/Facade.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
    diff --git a/patterns/PaperScissorsRock.java b/patterns/PaperScissorsRock.java
    index f5c5e6148..e7a7c44e8 100644
    --- a/patterns/PaperScissorsRock.java
    +++ b/patterns/PaperScissorsRock.java
    @@ -1,5 +1,5 @@
     // patterns/PaperScissorsRock.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Demonstration of multiple dispatching
    diff --git a/patterns/ProxyDemo.java b/patterns/ProxyDemo.java
    index 198117adb..58b0e3a8f 100644
    --- a/patterns/ProxyDemo.java
    +++ b/patterns/ProxyDemo.java
    @@ -1,5 +1,5 @@
     // patterns/ProxyDemo.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Simple demonstration of the Proxy pattern
    diff --git a/patterns/ShapeFactory1.java b/patterns/ShapeFactory1.java
    index 2a4108879..dc6f86907 100644
    --- a/patterns/ShapeFactory1.java
    +++ b/patterns/ShapeFactory1.java
    @@ -1,5 +1,5 @@
     // patterns/ShapeFactory1.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // A simple static factory method
    diff --git a/patterns/ShapeFactory2.java b/patterns/ShapeFactory2.java
    index 0253fc864..4f2134c4e 100644
    --- a/patterns/ShapeFactory2.java
    +++ b/patterns/ShapeFactory2.java
    @@ -1,5 +1,5 @@
     // patterns/ShapeFactory2.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    diff --git a/patterns/ShapeFactory3.java b/patterns/ShapeFactory3.java
    index 123d27fa4..b735a81d0 100644
    --- a/patterns/ShapeFactory3.java
    +++ b/patterns/ShapeFactory3.java
    @@ -1,5 +1,5 @@
     // patterns/ShapeFactory3.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Polymorphic factory methods
    diff --git a/patterns/SingletonPattern.java b/patterns/SingletonPattern.java
    index 0e466a766..c2ca1a5f5 100644
    --- a/patterns/SingletonPattern.java
    +++ b/patterns/SingletonPattern.java
    @@ -1,5 +1,5 @@
     // patterns/SingletonPattern.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
    diff --git a/patterns/StateDemo.java b/patterns/StateDemo.java
    index 041b4b98f..9efab5b4e 100644
    --- a/patterns/StateDemo.java
    +++ b/patterns/StateDemo.java
    @@ -1,5 +1,5 @@
     // patterns/StateDemo.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Simple demonstration of the State pattern
    diff --git a/patterns/TemplateMethod.java b/patterns/TemplateMethod.java
    index 0efbd71ce..eff6d2790 100644
    --- a/patterns/TemplateMethod.java
    +++ b/patterns/TemplateMethod.java
    @@ -1,5 +1,5 @@
     // patterns/TemplateMethod.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Simple demonstration of Template Method
    diff --git a/patterns/abstractfactory/GameEnvironment.java b/patterns/abstractfactory/GameEnvironment.java
    index 16acdc681..8c0abf7b3 100644
    --- a/patterns/abstractfactory/GameEnvironment.java
    +++ b/patterns/abstractfactory/GameEnvironment.java
    @@ -1,5 +1,5 @@
     // patterns/abstractfactory/GameEnvironment.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // An example of the Abstract Factory pattern
    diff --git a/patterns/adapt/Adapter.java b/patterns/adapt/Adapter.java
    index 956740e58..5bfcd6bf5 100644
    --- a/patterns/adapt/Adapter.java
    +++ b/patterns/adapt/Adapter.java
    @@ -1,5 +1,5 @@
     // patterns/adapt/Adapter.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Variations on the Adapter pattern
    diff --git a/patterns/chain/ChainOfResponsibility.java b/patterns/chain/ChainOfResponsibility.java
    index 208d52e31..b733e71cc 100644
    --- a/patterns/chain/ChainOfResponsibility.java
    +++ b/patterns/chain/ChainOfResponsibility.java
    @@ -1,5 +1,5 @@
     // patterns/chain/ChainOfResponsibility.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Using the Functional interface
    diff --git a/patterns/doubledispatch/Aluminum.java b/patterns/doubledispatch/Aluminum.java
    index b17f1d91f..5037fac56 100644
    --- a/patterns/doubledispatch/Aluminum.java
    +++ b/patterns/doubledispatch/Aluminum.java
    @@ -1,5 +1,5 @@
     // patterns/doubledispatch/Aluminum.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Aluminum for double dispatching
    diff --git a/patterns/doubledispatch/Cardboard.java b/patterns/doubledispatch/Cardboard.java
    index c5e9d382d..5046ddaa2 100644
    --- a/patterns/doubledispatch/Cardboard.java
    +++ b/patterns/doubledispatch/Cardboard.java
    @@ -1,5 +1,5 @@
     // patterns/doubledispatch/Cardboard.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Cardboard for double dispatching
    diff --git a/patterns/doubledispatch/DoubleDispatch.java b/patterns/doubledispatch/DoubleDispatch.java
    index 4b82310a2..91bee562e 100644
    --- a/patterns/doubledispatch/DoubleDispatch.java
    +++ b/patterns/doubledispatch/DoubleDispatch.java
    @@ -1,5 +1,5 @@
     // patterns/doubledispatch/DoubleDispatch.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Using multiple dispatching to handle more
    diff --git a/patterns/doubledispatch/Glass.java b/patterns/doubledispatch/Glass.java
    index 2f26540a0..79cf7fa26 100644
    --- a/patterns/doubledispatch/Glass.java
    +++ b/patterns/doubledispatch/Glass.java
    @@ -1,5 +1,5 @@
     // patterns/doubledispatch/Glass.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Glass for double dispatching
    diff --git a/patterns/doubledispatch/Paper.java b/patterns/doubledispatch/Paper.java
    index 47eea3171..b542dfd64 100644
    --- a/patterns/doubledispatch/Paper.java
    +++ b/patterns/doubledispatch/Paper.java
    @@ -1,5 +1,5 @@
     // patterns/doubledispatch/Paper.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Paper for double dispatching
    diff --git a/patterns/doubledispatch/TypedBin.java b/patterns/doubledispatch/TypedBin.java
    index 72c84e4c5..265874cc4 100644
    --- a/patterns/doubledispatch/TypedBin.java
    +++ b/patterns/doubledispatch/TypedBin.java
    @@ -1,5 +1,5 @@
     // patterns/doubledispatch/TypedBin.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // A List that can grab the right type
    diff --git a/patterns/doubledispatch/TypedBinMember.java b/patterns/doubledispatch/TypedBinMember.java
    index 456d02c01..c7ce960a9 100644
    --- a/patterns/doubledispatch/TypedBinMember.java
    +++ b/patterns/doubledispatch/TypedBinMember.java
    @@ -1,5 +1,5 @@
     // patterns/doubledispatch/TypedBinMember.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // An interface for adding the double dispatching
    diff --git a/patterns/dynatrash/DynaTrash.java b/patterns/dynatrash/DynaTrash.java
    index 59b366407..6ce33d8f0 100644
    --- a/patterns/dynatrash/DynaTrash.java
    +++ b/patterns/dynatrash/DynaTrash.java
    @@ -1,5 +1,5 @@
     // patterns/dynatrash/DynaTrash.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Using a Map of Lists and RTTI to automatically
    diff --git a/patterns/observer/ObservedFlower.java b/patterns/observer/ObservedFlower.java
    index a15e8e35c..f759a105d 100644
    --- a/patterns/observer/ObservedFlower.java
    +++ b/patterns/observer/ObservedFlower.java
    @@ -1,5 +1,5 @@
     // patterns/observer/ObservedFlower.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Demonstration of "Observer" pattern
    diff --git a/patterns/recyclea/RecycleA.java b/patterns/recyclea/RecycleA.java
    index 702fdb973..a73f39e7f 100644
    --- a/patterns/recyclea/RecycleA.java
    +++ b/patterns/recyclea/RecycleA.java
    @@ -1,5 +1,5 @@
     // patterns/recyclea/RecycleA.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Recycling with RTTI
    diff --git a/patterns/recycleb/RecycleB.java b/patterns/recycleb/RecycleB.java
    index 19e92f9d2..1ca38314d 100644
    --- a/patterns/recycleb/RecycleB.java
    +++ b/patterns/recycleb/RecycleB.java
    @@ -1,5 +1,5 @@
     // patterns/recycleb/RecycleB.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // {java patterns.recycleb.RecycleB}
    diff --git a/patterns/recyclec/RecycleC.java b/patterns/recyclec/RecycleC.java
    index abdc25d56..239e8e793 100644
    --- a/patterns/recyclec/RecycleC.java
    +++ b/patterns/recyclec/RecycleC.java
    @@ -1,5 +1,5 @@
     // patterns/recyclec/RecycleC.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Adding more objects to the recycling problem
    diff --git a/patterns/shapes/BadShapeCreation.java b/patterns/shapes/BadShapeCreation.java
    index daa3f7f57..2ebda8e52 100644
    --- a/patterns/shapes/BadShapeCreation.java
    +++ b/patterns/shapes/BadShapeCreation.java
    @@ -1,5 +1,5 @@
     // patterns/shapes/BadShapeCreation.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package patterns.shapes;
    diff --git a/patterns/shapes/Circle.java b/patterns/shapes/Circle.java
    index b50d5abfe..461d55e29 100644
    --- a/patterns/shapes/Circle.java
    +++ b/patterns/shapes/Circle.java
    @@ -1,5 +1,5 @@
     // patterns/shapes/Circle.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package patterns.shapes;
    diff --git a/patterns/shapes/FactoryMethod.java b/patterns/shapes/FactoryMethod.java
    index b03c8239c..c3b22b1ff 100644
    --- a/patterns/shapes/FactoryMethod.java
    +++ b/patterns/shapes/FactoryMethod.java
    @@ -1,5 +1,5 @@
     // patterns/shapes/FactoryMethod.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package patterns.shapes;
    diff --git a/patterns/shapes/FactoryTest.java b/patterns/shapes/FactoryTest.java
    index 2a9e671ee..301bb1abd 100644
    --- a/patterns/shapes/FactoryTest.java
    +++ b/patterns/shapes/FactoryTest.java
    @@ -1,5 +1,5 @@
     // patterns/shapes/FactoryTest.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package patterns.shapes;
    diff --git a/patterns/shapes/Shape.java b/patterns/shapes/Shape.java
    index dfff783cc..12fdf3e77 100644
    --- a/patterns/shapes/Shape.java
    +++ b/patterns/shapes/Shape.java
    @@ -1,5 +1,5 @@
     // patterns/shapes/Shape.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package patterns.shapes;
    diff --git a/patterns/shapes/Square.java b/patterns/shapes/Square.java
    index 602b3282c..610dd3e4c 100644
    --- a/patterns/shapes/Square.java
    +++ b/patterns/shapes/Square.java
    @@ -1,5 +1,5 @@
     // patterns/shapes/Square.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package patterns.shapes;
    diff --git a/patterns/shapes/Triangle.java b/patterns/shapes/Triangle.java
    index 11559f896..9fed3d93c 100644
    --- a/patterns/shapes/Triangle.java
    +++ b/patterns/shapes/Triangle.java
    @@ -1,5 +1,5 @@
     // patterns/shapes/Triangle.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package patterns.shapes;
    diff --git a/patterns/state/StateMachineDemo.java b/patterns/state/StateMachineDemo.java
    index 3911fe019..29f8a8761 100644
    --- a/patterns/state/StateMachineDemo.java
    +++ b/patterns/state/StateMachineDemo.java
    @@ -1,5 +1,5 @@
     // patterns/state/StateMachineDemo.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // The StateMachine pattern and Template method
    diff --git a/patterns/strategy/StrategyPattern.java b/patterns/strategy/StrategyPattern.java
    index fbc8daa49..52561b4b1 100644
    --- a/patterns/strategy/StrategyPattern.java
    +++ b/patterns/strategy/StrategyPattern.java
    @@ -1,5 +1,5 @@
     // patterns/strategy/StrategyPattern.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // {java patterns.strategy.StrategyPattern}
    diff --git a/patterns/strategy/StrategyPattern2.java b/patterns/strategy/StrategyPattern2.java
    index e8db61547..09465f3a5 100644
    --- a/patterns/strategy/StrategyPattern2.java
    +++ b/patterns/strategy/StrategyPattern2.java
    @@ -1,5 +1,5 @@
     // patterns/strategy/StrategyPattern2.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // {java patterns.strategy.StrategyPattern2}
    diff --git a/patterns/trash/Aluminum.java b/patterns/trash/Aluminum.java
    index 210e57014..0065e964a 100644
    --- a/patterns/trash/Aluminum.java
    +++ b/patterns/trash/Aluminum.java
    @@ -1,5 +1,5 @@
     // patterns/trash/Aluminum.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package patterns.trash;
    diff --git a/patterns/trash/Cardboard.java b/patterns/trash/Cardboard.java
    index bb7f84a86..0b54d135f 100644
    --- a/patterns/trash/Cardboard.java
    +++ b/patterns/trash/Cardboard.java
    @@ -1,5 +1,5 @@
     // patterns/trash/Cardboard.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package patterns.trash;
    diff --git a/patterns/trash/Fillable.java b/patterns/trash/Fillable.java
    index 9ac0da0de..a61cb1112 100644
    --- a/patterns/trash/Fillable.java
    +++ b/patterns/trash/Fillable.java
    @@ -1,5 +1,5 @@
     // patterns/trash/Fillable.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Any object that can be filled with Trash
    diff --git a/patterns/trash/FillableList.java b/patterns/trash/FillableList.java
    index d6e638c28..989a33ec5 100644
    --- a/patterns/trash/FillableList.java
    +++ b/patterns/trash/FillableList.java
    @@ -1,5 +1,5 @@
     // patterns/trash/FillableList.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Adapter that makes a List Fillable
    diff --git a/patterns/trash/Glass.java b/patterns/trash/Glass.java
    index 83c4b3f87..f7563dc42 100644
    --- a/patterns/trash/Glass.java
    +++ b/patterns/trash/Glass.java
    @@ -1,5 +1,5 @@
     // patterns/trash/Glass.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package patterns.trash;
    diff --git a/patterns/trash/Paper.java b/patterns/trash/Paper.java
    index 448383c72..2f0b36664 100644
    --- a/patterns/trash/Paper.java
    +++ b/patterns/trash/Paper.java
    @@ -1,5 +1,5 @@
     // patterns/trash/Paper.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package patterns.trash;
    diff --git a/patterns/trash/ParseTrash.java b/patterns/trash/ParseTrash.java
    index 709ad1a85..fc0c04168 100644
    --- a/patterns/trash/ParseTrash.java
    +++ b/patterns/trash/ParseTrash.java
    @@ -1,5 +1,5 @@
     // patterns/trash/ParseTrash.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Open a file and parse its contents into
    diff --git a/patterns/trash/Trash.java b/patterns/trash/Trash.java
    index e8d9d3517..40be944ab 100644
    --- a/patterns/trash/Trash.java
    +++ b/patterns/trash/Trash.java
    @@ -1,5 +1,5 @@
     // patterns/trash/Trash.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Base class for Trash recycling examples
    diff --git a/patterns/trashvisitor/Aluminum.java b/patterns/trashvisitor/Aluminum.java
    index c89592c33..85d5fa145 100644
    --- a/patterns/trashvisitor/Aluminum.java
    +++ b/patterns/trashvisitor/Aluminum.java
    @@ -1,5 +1,5 @@
     // patterns/trashvisitor/Aluminum.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Aluminum for the visitor pattern
    diff --git a/patterns/trashvisitor/Cardboard.java b/patterns/trashvisitor/Cardboard.java
    index 23fcb1a44..978202ef1 100644
    --- a/patterns/trashvisitor/Cardboard.java
    +++ b/patterns/trashvisitor/Cardboard.java
    @@ -1,5 +1,5 @@
     // patterns/trashvisitor/Cardboard.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Cardboard for the visitor pattern
    diff --git a/patterns/trashvisitor/Glass.java b/patterns/trashvisitor/Glass.java
    index 70e5d2105..fbcf4949f 100644
    --- a/patterns/trashvisitor/Glass.java
    +++ b/patterns/trashvisitor/Glass.java
    @@ -1,5 +1,5 @@
     // patterns/trashvisitor/Glass.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Glass for the visitor pattern
    diff --git a/patterns/trashvisitor/Paper.java b/patterns/trashvisitor/Paper.java
    index d42cb0610..6e9999f1d 100644
    --- a/patterns/trashvisitor/Paper.java
    +++ b/patterns/trashvisitor/Paper.java
    @@ -1,5 +1,5 @@
     // patterns/trashvisitor/Paper.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Paper for the visitor pattern
    diff --git a/patterns/trashvisitor/TrashVisitor.java b/patterns/trashvisitor/TrashVisitor.java
    index bb0eeec18..8f9566236 100644
    --- a/patterns/trashvisitor/TrashVisitor.java
    +++ b/patterns/trashvisitor/TrashVisitor.java
    @@ -1,5 +1,5 @@
     // patterns/trashvisitor/TrashVisitor.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // {java patterns.trashvisitor.TrashVisitor}
    diff --git a/patterns/trashvisitor/Visitable.java b/patterns/trashvisitor/Visitable.java
    index 7d736b3e9..f1f9f1da1 100644
    --- a/patterns/trashvisitor/Visitable.java
    +++ b/patterns/trashvisitor/Visitable.java
    @@ -1,5 +1,5 @@
     // patterns/trashvisitor/Visitable.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // An interface to add visitor functionality to the
    diff --git a/patterns/trashvisitor/Visitor.java b/patterns/trashvisitor/Visitor.java
    index 0a97e3a2d..07ef4622d 100644
    --- a/patterns/trashvisitor/Visitor.java
    +++ b/patterns/trashvisitor/Visitor.java
    @@ -1,5 +1,5 @@
     // patterns/trashvisitor/Visitor.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // The base interface for visitors
    diff --git a/patterns/visitor/BeeAndFlowers.java b/patterns/visitor/BeeAndFlowers.java
    index 3f05cd5e0..aa86ebfc5 100644
    --- a/patterns/visitor/BeeAndFlowers.java
    +++ b/patterns/visitor/BeeAndFlowers.java
    @@ -1,5 +1,5 @@
     // patterns/visitor/BeeAndFlowers.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Demonstration of "visitor" pattern
    diff --git a/polymorphism/CovariantReturn.java b/polymorphism/CovariantReturn.java
    index b30e0b640..e88fe5908 100644
    --- a/polymorphism/CovariantReturn.java
    +++ b/polymorphism/CovariantReturn.java
    @@ -1,5 +1,5 @@
     // polymorphism/CovariantReturn.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
    diff --git a/polymorphism/FieldAccess.java b/polymorphism/FieldAccess.java
    index 2ab7e02cb..95e47c5e2 100644
    --- a/polymorphism/FieldAccess.java
    +++ b/polymorphism/FieldAccess.java
    @@ -1,5 +1,5 @@
     // polymorphism/FieldAccess.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Direct field access is determined at compile time
    diff --git a/polymorphism/Frog.java b/polymorphism/Frog.java
    index c9231de38..9226910d5 100644
    --- a/polymorphism/Frog.java
    +++ b/polymorphism/Frog.java
    @@ -1,5 +1,5 @@
     // polymorphism/Frog.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Cleanup and inheritance
    diff --git a/polymorphism/PolyConstructors.java b/polymorphism/PolyConstructors.java
    index d217e4a08..3a99f08b2 100644
    --- a/polymorphism/PolyConstructors.java
    +++ b/polymorphism/PolyConstructors.java
    @@ -1,5 +1,5 @@
     // polymorphism/PolyConstructors.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Constructors and polymorphism
    diff --git a/polymorphism/PrivateOverride.java b/polymorphism/PrivateOverride.java
    index a072095e1..9873e03da 100644
    --- a/polymorphism/PrivateOverride.java
    +++ b/polymorphism/PrivateOverride.java
    @@ -1,5 +1,5 @@
     // polymorphism/PrivateOverride.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Trying to override a private method
    diff --git a/polymorphism/PrivateOverride2.java b/polymorphism/PrivateOverride2.java
    index 1d0c07c81..664672bc4 100644
    --- a/polymorphism/PrivateOverride2.java
    +++ b/polymorphism/PrivateOverride2.java
    @@ -1,5 +1,5 @@
     // polymorphism/PrivateOverride2.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Detecting a mistaken override using @Override
    diff --git a/polymorphism/RTTI.java b/polymorphism/RTTI.java
    index 5ddfa82f5..39c9029b9 100644
    --- a/polymorphism/RTTI.java
    +++ b/polymorphism/RTTI.java
    @@ -1,5 +1,5 @@
     // polymorphism/RTTI.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Downcasting & Runtime type information (RTTI)
    diff --git a/polymorphism/ReferenceCounting.java b/polymorphism/ReferenceCounting.java
    index a175fcade..b378117f1 100644
    --- a/polymorphism/ReferenceCounting.java
    +++ b/polymorphism/ReferenceCounting.java
    @@ -1,5 +1,5 @@
     // polymorphism/ReferenceCounting.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Cleaning up shared member objects
    diff --git a/polymorphism/Sandwich.java b/polymorphism/Sandwich.java
    index a13a61929..97f80d53e 100644
    --- a/polymorphism/Sandwich.java
    +++ b/polymorphism/Sandwich.java
    @@ -1,5 +1,5 @@
     // polymorphism/Sandwich.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Order of constructor calls
    diff --git a/polymorphism/Shapes.java b/polymorphism/Shapes.java
    index 42e13f112..4d051e707 100644
    --- a/polymorphism/Shapes.java
    +++ b/polymorphism/Shapes.java
    @@ -1,5 +1,5 @@
     // polymorphism/Shapes.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Polymorphism in Java
    diff --git a/polymorphism/StaticPolymorphism.java b/polymorphism/StaticPolymorphism.java
    index 40e4f794d..1ebe733b2 100644
    --- a/polymorphism/StaticPolymorphism.java
    +++ b/polymorphism/StaticPolymorphism.java
    @@ -1,5 +1,5 @@
     // polymorphism/StaticPolymorphism.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Static methods are not polymorphic
    diff --git a/polymorphism/Transmogrify.java b/polymorphism/Transmogrify.java
    index dd45b9bd4..09877d530 100644
    --- a/polymorphism/Transmogrify.java
    +++ b/polymorphism/Transmogrify.java
    @@ -1,5 +1,5 @@
     // polymorphism/Transmogrify.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Dynamically changing the behavior of an object
    diff --git a/polymorphism/music/Instrument.java b/polymorphism/music/Instrument.java
    index 959c2dd3d..fb6c77e37 100644
    --- a/polymorphism/music/Instrument.java
    +++ b/polymorphism/music/Instrument.java
    @@ -1,5 +1,5 @@
     // polymorphism/music/Instrument.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package polymorphism.music;
    diff --git a/polymorphism/music/Music.java b/polymorphism/music/Music.java
    index 2338543b2..8e903ec0a 100644
    --- a/polymorphism/music/Music.java
    +++ b/polymorphism/music/Music.java
    @@ -1,5 +1,5 @@
     // polymorphism/music/Music.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Inheritance & upcasting
    diff --git a/polymorphism/music/Music2.java b/polymorphism/music/Music2.java
    index e16eb1799..a5bff54be 100644
    --- a/polymorphism/music/Music2.java
    +++ b/polymorphism/music/Music2.java
    @@ -1,5 +1,5 @@
     // polymorphism/music/Music2.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Overloading instead of upcasting
    diff --git a/polymorphism/music/Note.java b/polymorphism/music/Note.java
    index 34f55bd8e..414367a96 100644
    --- a/polymorphism/music/Note.java
    +++ b/polymorphism/music/Note.java
    @@ -1,5 +1,5 @@
     // polymorphism/music/Note.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Notes to play on musical instruments
    diff --git a/polymorphism/music/Wind.java b/polymorphism/music/Wind.java
    index fcec34ae4..c38ac4970 100644
    --- a/polymorphism/music/Wind.java
    +++ b/polymorphism/music/Wind.java
    @@ -1,5 +1,5 @@
     // polymorphism/music/Wind.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package polymorphism.music;
    diff --git a/polymorphism/music3/Music3.java b/polymorphism/music3/Music3.java
    index 4c7c70f84..da3eb3647 100644
    --- a/polymorphism/music3/Music3.java
    +++ b/polymorphism/music3/Music3.java
    @@ -1,5 +1,5 @@
     // polymorphism/music3/Music3.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // An extensible program
    diff --git a/polymorphism/shape/Circle.java b/polymorphism/shape/Circle.java
    index 305d0411b..fc8579506 100644
    --- a/polymorphism/shape/Circle.java
    +++ b/polymorphism/shape/Circle.java
    @@ -1,5 +1,5 @@
     // polymorphism/shape/Circle.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package polymorphism.shape;
    diff --git a/polymorphism/shape/RandomShapes.java b/polymorphism/shape/RandomShapes.java
    index 3a5fa9063..c1419f4e1 100644
    --- a/polymorphism/shape/RandomShapes.java
    +++ b/polymorphism/shape/RandomShapes.java
    @@ -1,5 +1,5 @@
     // polymorphism/shape/RandomShapes.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // A "factory" that randomly creates shapes
    diff --git a/polymorphism/shape/Shape.java b/polymorphism/shape/Shape.java
    index 3d42f1218..4be93c866 100644
    --- a/polymorphism/shape/Shape.java
    +++ b/polymorphism/shape/Shape.java
    @@ -1,5 +1,5 @@
     // polymorphism/shape/Shape.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package polymorphism.shape;
    diff --git a/polymorphism/shape/Square.java b/polymorphism/shape/Square.java
    index c04d68320..4938335b3 100644
    --- a/polymorphism/shape/Square.java
    +++ b/polymorphism/shape/Square.java
    @@ -1,5 +1,5 @@
     // polymorphism/shape/Square.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package polymorphism.shape;
    diff --git a/polymorphism/shape/Triangle.java b/polymorphism/shape/Triangle.java
    index 7bc9a961a..db7394a3c 100644
    --- a/polymorphism/shape/Triangle.java
    +++ b/polymorphism/shape/Triangle.java
    @@ -1,5 +1,5 @@
     // polymorphism/shape/Triangle.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package polymorphism.shape;
    diff --git a/references/AddingClone.java b/references/AddingClone.java
    index d8b1106fb..4f03cf06d 100644
    --- a/references/AddingClone.java
    +++ b/references/AddingClone.java
    @@ -1,5 +1,5 @@
     // references/AddingClone.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // You must go through a few gyrations
    diff --git a/references/Alias1.java b/references/Alias1.java
    index a40966355..1af594ec4 100644
    --- a/references/Alias1.java
    +++ b/references/Alias1.java
    @@ -1,5 +1,5 @@
     // references/Alias1.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Aliasing two references to one object
    diff --git a/references/Alias2.java b/references/Alias2.java
    index 928d9c7bf..aa37e1a23 100644
    --- a/references/Alias2.java
    +++ b/references/Alias2.java
    @@ -1,5 +1,5 @@
     // references/Alias2.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Method calls implicitly alias their arguments
    diff --git a/references/CheckCloneable.java b/references/CheckCloneable.java
    index b9e7eb078..137937a94 100644
    --- a/references/CheckCloneable.java
    +++ b/references/CheckCloneable.java
    @@ -1,5 +1,5 @@
     // references/CheckCloneable.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Check to see if a reference can be cloned
    diff --git a/references/CloneArrayList.java b/references/CloneArrayList.java
    index 13bc77951..601673c2c 100644
    --- a/references/CloneArrayList.java
    +++ b/references/CloneArrayList.java
    @@ -1,5 +1,5 @@
     // references/CloneArrayList.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // The clone() operation works for only a few
    diff --git a/references/Compete.java b/references/Compete.java
    index 3c825d387..9e77f3a7f 100644
    --- a/references/Compete.java
    +++ b/references/Compete.java
    @@ -1,5 +1,5 @@
     // references/Compete.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.io.*;
    diff --git a/references/CopyConstructor.java b/references/CopyConstructor.java
    index 46e1ee212..2617f48b0 100644
    --- a/references/CopyConstructor.java
    +++ b/references/CopyConstructor.java
    @@ -1,5 +1,5 @@
     // references/CopyConstructor.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // A constructor to copy an object of the same
    diff --git a/references/DepthReading.java b/references/DepthReading.java
    index d9f3f1ae6..00d9dfda6 100644
    --- a/references/DepthReading.java
    +++ b/references/DepthReading.java
    @@ -1,5 +1,5 @@
     // references/DepthReading.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Cloning a composed object
    diff --git a/references/HorrorFlick.java b/references/HorrorFlick.java
    index ea310ca4f..709d15bf3 100644
    --- a/references/HorrorFlick.java
    +++ b/references/HorrorFlick.java
    @@ -1,5 +1,5 @@
     // references/HorrorFlick.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Insert Cloneability at any level of inheritance
    diff --git a/references/Immutable1.java b/references/Immutable1.java
    index c4f538916..55ac1f6aa 100644
    --- a/references/Immutable1.java
    +++ b/references/Immutable1.java
    @@ -1,5 +1,5 @@
     // references/Immutable1.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Immutable objects are immune to aliasing
    diff --git a/references/Immutable2.java b/references/Immutable2.java
    index 8f35edaa6..a565f86a6 100644
    --- a/references/Immutable2.java
    +++ b/references/Immutable2.java
    @@ -1,5 +1,5 @@
     // references/Immutable2.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // A companion class to modify immutable objects
    diff --git a/references/ImmutableInteger.java b/references/ImmutableInteger.java
    index 3dc86a28a..ed4594b90 100644
    --- a/references/ImmutableInteger.java
    +++ b/references/ImmutableInteger.java
    @@ -1,5 +1,5 @@
     // references/ImmutableInteger.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // The Integer class cannot be changed
    diff --git a/references/ImmutableStrings.java b/references/ImmutableStrings.java
    index 538ab6efc..ad954e3f3 100644
    --- a/references/ImmutableStrings.java
    +++ b/references/ImmutableStrings.java
    @@ -1,5 +1,5 @@
     // references/ImmutableStrings.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Demonstrating StringBuilder
    diff --git a/references/LocalCopy.java b/references/LocalCopy.java
    index d7462981a..9c01c09e8 100644
    --- a/references/LocalCopy.java
    +++ b/references/LocalCopy.java
    @@ -1,5 +1,5 @@
     // references/LocalCopy.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Creating local copies with clone()
    diff --git a/references/MutableInteger.java b/references/MutableInteger.java
    index 7f6e47d21..dfe0cc7b7 100644
    --- a/references/MutableInteger.java
    +++ b/references/MutableInteger.java
    @@ -1,5 +1,5 @@
     // references/MutableInteger.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // A changeable wrapper class
    diff --git a/references/OceanReading.java b/references/OceanReading.java
    index b8466fa04..b89f1b046 100644
    --- a/references/OceanReading.java
    +++ b/references/OceanReading.java
    @@ -1,5 +1,5 @@
     // references/OceanReading.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Cloning a composed object
    diff --git a/references/PassReferences.java b/references/PassReferences.java
    index effa9ca69..2a1630087 100644
    --- a/references/PassReferences.java
    +++ b/references/PassReferences.java
    @@ -1,5 +1,5 @@
     // references/PassReferences.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
    diff --git a/references/SimplerMutableInteger.java b/references/SimplerMutableInteger.java
    index c49ceb5eb..191068ca6 100644
    --- a/references/SimplerMutableInteger.java
    +++ b/references/SimplerMutableInteger.java
    @@ -1,5 +1,5 @@
     // references/SimplerMutableInteger.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // A trivial wrapper class
    diff --git a/references/Snake.java b/references/Snake.java
    index 624855490..004f7e765 100644
    --- a/references/Snake.java
    +++ b/references/Snake.java
    @@ -1,5 +1,5 @@
     // references/Snake.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Tests cloning to see if reference
    diff --git a/references/Stringer.java b/references/Stringer.java
    index 89ceff1e6..72663bb57 100644
    --- a/references/Stringer.java
    +++ b/references/Stringer.java
    @@ -1,5 +1,5 @@
     // references/Stringer.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
    diff --git a/references/TemperatureReading.java b/references/TemperatureReading.java
    index 8ca47e90f..9b77cfb24 100644
    --- a/references/TemperatureReading.java
    +++ b/references/TemperatureReading.java
    @@ -1,5 +1,5 @@
     // references/TemperatureReading.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Cloning a composed object
    diff --git a/references/tests/DeepCopyTest.java b/references/tests/DeepCopyTest.java
    index 977376520..b65a8d89d 100644
    --- a/references/tests/DeepCopyTest.java
    +++ b/references/tests/DeepCopyTest.java
    @@ -1,5 +1,5 @@
     // references/tests/DeepCopyTest.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package references;
    diff --git a/reuse/Bath.java b/reuse/Bath.java
    index 31a70e8b9..38e5e8195 100644
    --- a/reuse/Bath.java
    +++ b/reuse/Bath.java
    @@ -1,5 +1,5 @@
     // reuse/Bath.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Constructor initialization with composition
    diff --git a/reuse/Beetle.java b/reuse/Beetle.java
    index c73419540..0a41bc176 100644
    --- a/reuse/Beetle.java
    +++ b/reuse/Beetle.java
    @@ -1,5 +1,5 @@
     // reuse/Beetle.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // The full process of initialization
    diff --git a/reuse/BlankFinal.java b/reuse/BlankFinal.java
    index 9a45fe6b3..93818a06a 100644
    --- a/reuse/BlankFinal.java
    +++ b/reuse/BlankFinal.java
    @@ -1,5 +1,5 @@
     // reuse/BlankFinal.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // "Blank" final fields
    diff --git a/reuse/CADSystem.java b/reuse/CADSystem.java
    index 530e0de1d..55fbe0d85 100644
    --- a/reuse/CADSystem.java
    +++ b/reuse/CADSystem.java
    @@ -1,5 +1,5 @@
     // reuse/CADSystem.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Ensuring proper cleanup
    diff --git a/reuse/Car.java b/reuse/Car.java
    index 4e3fe86cc..1bc4377b5 100644
    --- a/reuse/Car.java
    +++ b/reuse/Car.java
    @@ -1,5 +1,5 @@
     // reuse/Car.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Composition with public objects
    diff --git a/reuse/Cartoon.java b/reuse/Cartoon.java
    index 51d6f4a5d..48741bafb 100644
    --- a/reuse/Cartoon.java
    +++ b/reuse/Cartoon.java
    @@ -1,5 +1,5 @@
     // reuse/Cartoon.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Constructor calls during inheritance
    diff --git a/reuse/Chess.java b/reuse/Chess.java
    index 55a1cc9c9..30f2685bc 100644
    --- a/reuse/Chess.java
    +++ b/reuse/Chess.java
    @@ -1,5 +1,5 @@
     // reuse/Chess.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Inheritance, constructors and arguments
    diff --git a/reuse/DerivedSpaceShip.java b/reuse/DerivedSpaceShip.java
    index 737e23e16..dfbe20ac3 100644
    --- a/reuse/DerivedSpaceShip.java
    +++ b/reuse/DerivedSpaceShip.java
    @@ -1,5 +1,5 @@
     // reuse/DerivedSpaceShip.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
    diff --git a/reuse/Detergent.java b/reuse/Detergent.java
    index 6f1c08520..99f4e7cc3 100644
    --- a/reuse/Detergent.java
    +++ b/reuse/Detergent.java
    @@ -1,5 +1,5 @@
     // reuse/Detergent.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Inheritance syntax & properties
    diff --git a/reuse/FinalArguments.java b/reuse/FinalArguments.java
    index 9942a2104..46efed7e1 100644
    --- a/reuse/FinalArguments.java
    +++ b/reuse/FinalArguments.java
    @@ -1,5 +1,5 @@
     // reuse/FinalArguments.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Using "final" with method arguments
    diff --git a/reuse/FinalData.java b/reuse/FinalData.java
    index b233c408b..4376f5c3f 100644
    --- a/reuse/FinalData.java
    +++ b/reuse/FinalData.java
    @@ -1,5 +1,5 @@
     // reuse/FinalData.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // The effect of final on fields
    diff --git a/reuse/FinalOverridingIllusion.java b/reuse/FinalOverridingIllusion.java
    index 1b475194a..e5c19ece5 100644
    --- a/reuse/FinalOverridingIllusion.java
    +++ b/reuse/FinalOverridingIllusion.java
    @@ -1,5 +1,5 @@
     // reuse/FinalOverridingIllusion.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // It only looks like you can override
    diff --git a/reuse/Hide.java b/reuse/Hide.java
    index 882da64d9..f718e4b08 100644
    --- a/reuse/Hide.java
    +++ b/reuse/Hide.java
    @@ -1,5 +1,5 @@
     // reuse/Hide.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Overloading a base-class method name in a derived
    diff --git a/reuse/Jurassic.java b/reuse/Jurassic.java
    index af63bea9a..04b7d61c5 100644
    --- a/reuse/Jurassic.java
    +++ b/reuse/Jurassic.java
    @@ -1,5 +1,5 @@
     // reuse/Jurassic.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Making an entire class final
    diff --git a/reuse/Lisa.java b/reuse/Lisa.java
    index 6d175fe5d..85ec5cc90 100644
    --- a/reuse/Lisa.java
    +++ b/reuse/Lisa.java
    @@ -1,5 +1,5 @@
     // reuse/Lisa.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // {WillNotCompile}
    diff --git a/reuse/Orc.java b/reuse/Orc.java
    index 9974c685b..c3ba40a8e 100644
    --- a/reuse/Orc.java
    +++ b/reuse/Orc.java
    @@ -1,5 +1,5 @@
     // reuse/Orc.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // The protected keyword
    diff --git a/reuse/PlaceSetting.java b/reuse/PlaceSetting.java
    index 5723a1100..b57d6383a 100644
    --- a/reuse/PlaceSetting.java
    +++ b/reuse/PlaceSetting.java
    @@ -1,5 +1,5 @@
     // reuse/PlaceSetting.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Combining composition & inheritance
    diff --git a/reuse/SpaceShipControls.java b/reuse/SpaceShipControls.java
    index 2272713d8..6fde70867 100644
    --- a/reuse/SpaceShipControls.java
    +++ b/reuse/SpaceShipControls.java
    @@ -1,5 +1,5 @@
     // reuse/SpaceShipControls.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
    diff --git a/reuse/SpaceShipDelegation.java b/reuse/SpaceShipDelegation.java
    index 9046a4a48..c31316b29 100644
    --- a/reuse/SpaceShipDelegation.java
    +++ b/reuse/SpaceShipDelegation.java
    @@ -1,5 +1,5 @@
     // reuse/SpaceShipDelegation.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
    diff --git a/reuse/SprinklerSystem.java b/reuse/SprinklerSystem.java
    index 77a175184..e0ccbe661 100644
    --- a/reuse/SprinklerSystem.java
    +++ b/reuse/SprinklerSystem.java
    @@ -1,5 +1,5 @@
     // reuse/SprinklerSystem.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Composition for code reuse
    diff --git a/reuse/Wind.java b/reuse/Wind.java
    index 46fc3e948..3e9a05f6b 100644
    --- a/reuse/Wind.java
    +++ b/reuse/Wind.java
    @@ -1,5 +1,5 @@
     // reuse/Wind.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Inheritance & upcasting
    diff --git a/serialization/APerson.java b/serialization/APerson.java
    index fa9f2b951..1f67eb1cb 100644
    --- a/serialization/APerson.java
    +++ b/serialization/APerson.java
    @@ -1,5 +1,5 @@
     // serialization/APerson.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Use the XOM library to write and read XML
    diff --git a/serialization/AStoreCADState.java b/serialization/AStoreCADState.java
    index 46fca27bc..0ce8858a0 100644
    --- a/serialization/AStoreCADState.java
    +++ b/serialization/AStoreCADState.java
    @@ -1,5 +1,5 @@
     // serialization/AStoreCADState.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Saving the state of a fictitious CAD system
    diff --git a/serialization/Alien.java b/serialization/Alien.java
    index b7db23f2e..d0b0f5bfb 100644
    --- a/serialization/Alien.java
    +++ b/serialization/Alien.java
    @@ -1,5 +1,5 @@
     // serialization/Alien.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // A serializable class
    diff --git a/serialization/Blip3.java b/serialization/Blip3.java
    index 4c141def2..6741298c0 100644
    --- a/serialization/Blip3.java
    +++ b/serialization/Blip3.java
    @@ -1,5 +1,5 @@
     // serialization/Blip3.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Reconstructing an externalizable object
    diff --git a/serialization/Blips.java b/serialization/Blips.java
    index 4a98f1237..88116d844 100644
    --- a/serialization/Blips.java
    +++ b/serialization/Blips.java
    @@ -1,5 +1,5 @@
     // serialization/Blips.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Simple use of Externalizable & a pitfall
    diff --git a/serialization/FreezeAlien.java b/serialization/FreezeAlien.java
    index ec046d8b8..0fe8e8314 100644
    --- a/serialization/FreezeAlien.java
    +++ b/serialization/FreezeAlien.java
    @@ -1,5 +1,5 @@
     // serialization/FreezeAlien.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Create a serialized output file
    diff --git a/serialization/Logon.java b/serialization/Logon.java
    index 7d27e4d15..3b9109681 100644
    --- a/serialization/Logon.java
    +++ b/serialization/Logon.java
    @@ -1,5 +1,5 @@
     // serialization/Logon.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Demonstrates the "transient" keyword
    diff --git a/serialization/MyWorld.java b/serialization/MyWorld.java
    index 5cdf5778d..99e39de34 100644
    --- a/serialization/MyWorld.java
    +++ b/serialization/MyWorld.java
    @@ -1,5 +1,5 @@
     // serialization/MyWorld.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.io.*;
    diff --git a/serialization/People.java b/serialization/People.java
    index 6205bfabd..0e588749a 100644
    --- a/serialization/People.java
    +++ b/serialization/People.java
    @@ -1,5 +1,5 @@
     // serialization/People.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // nu.xom.Node comes from http://www.xom.nu
    diff --git a/serialization/RecoverCADState.java b/serialization/RecoverCADState.java
    index 6f3b50670..612f501cf 100644
    --- a/serialization/RecoverCADState.java
    +++ b/serialization/RecoverCADState.java
    @@ -1,5 +1,5 @@
     // serialization/RecoverCADState.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Restoring the state of the fictitious CAD system
    diff --git a/serialization/SerialCtl.java b/serialization/SerialCtl.java
    index 56add3431..ed891633d 100644
    --- a/serialization/SerialCtl.java
    +++ b/serialization/SerialCtl.java
    @@ -1,5 +1,5 @@
     // serialization/SerialCtl.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Controlling serialization by adding your own
    diff --git a/serialization/Worm.java b/serialization/Worm.java
    index 261988863..666beb87b 100644
    --- a/serialization/Worm.java
    +++ b/serialization/Worm.java
    @@ -1,5 +1,5 @@
     // serialization/Worm.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Demonstrates object serialization
    diff --git a/serialization/xfiles/ThawAlien.java b/serialization/xfiles/ThawAlien.java
    index d60d6f375..1de6ce6af 100644
    --- a/serialization/xfiles/ThawAlien.java
    +++ b/serialization/xfiles/ThawAlien.java
    @@ -1,5 +1,5 @@
     // serialization/xfiles/ThawAlien.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Recover a serialized file
    diff --git a/standardio/ChangeSystemOut.java b/standardio/ChangeSystemOut.java
    index def290419..2b37acb86 100644
    --- a/standardio/ChangeSystemOut.java
    +++ b/standardio/ChangeSystemOut.java
    @@ -1,5 +1,5 @@
     // standardio/ChangeSystemOut.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Turn System.out into a PrintWriter
    diff --git a/standardio/Echo.java b/standardio/Echo.java
    index 3a222c93c..d1a6103e9 100644
    --- a/standardio/Echo.java
    +++ b/standardio/Echo.java
    @@ -1,5 +1,5 @@
     // standardio/Echo.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // How to read from standard input
    diff --git a/standardio/OSExecuteDemo.java b/standardio/OSExecuteDemo.java
    index 83186478c..9ce8c8ef2 100644
    --- a/standardio/OSExecuteDemo.java
    +++ b/standardio/OSExecuteDemo.java
    @@ -1,5 +1,5 @@
     // standardio/OSExecuteDemo.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Demonstrates standard I/O redirection
    diff --git a/standardio/Redirecting.java b/standardio/Redirecting.java
    index 72abc4ae2..c2986a2bd 100644
    --- a/standardio/Redirecting.java
    +++ b/standardio/Redirecting.java
    @@ -1,5 +1,5 @@
     // standardio/Redirecting.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Demonstrates standard I/O redirection
    diff --git a/staticchecking/DogsAndRobots.cpp b/staticchecking/DogsAndRobots.cpp
    index b4f2a1f12..03b69a969 100644
    --- a/staticchecking/DogsAndRobots.cpp
    +++ b/staticchecking/DogsAndRobots.cpp
    @@ -1,5 +1,5 @@
     // staticchecking/DogsAndRobots.cpp
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     #include 
    diff --git a/staticchecking/DogsAndRobots.py b/staticchecking/DogsAndRobots.py
    index 6327222cb..a6b239dab 100644
    --- a/staticchecking/DogsAndRobots.py
    +++ b/staticchecking/DogsAndRobots.py
    @@ -1,5 +1,5 @@
     # staticchecking/DogsAndRobots.py
    -# (c)2017 MindView LLC: see Copyright.txt
    +# (c)2020 MindView LLC: see Copyright.txt
     # We make no guarantees that this code is fit for any purpose.
     # Visit http://OnJava8.com for more book information.
     
    diff --git a/staticchecking/NoBasePetSpeak.py b/staticchecking/NoBasePetSpeak.py
    index 80c771c5f..cbe6c82b6 100644
    --- a/staticchecking/NoBasePetSpeak.py
    +++ b/staticchecking/NoBasePetSpeak.py
    @@ -1,5 +1,5 @@
     # staticchecking/NoBasePetSpeak.py
    -# (c)2017 MindView LLC: see Copyright.txt
    +# (c)2020 MindView LLC: see Copyright.txt
     # We make no guarantees that this code is fit for any purpose.
     # Visit http://OnJava8.com for more book information.
     #- Speaking pets without base classes
    diff --git a/staticchecking/PetSpeak.py b/staticchecking/PetSpeak.py
    index 998a678ee..e3734e2fc 100644
    --- a/staticchecking/PetSpeak.py
    +++ b/staticchecking/PetSpeak.py
    @@ -1,5 +1,5 @@
     # staticchecking/PetSpeak.py
    -# (c)2017 MindView LLC: see Copyright.txt
    +# (c)2020 MindView LLC: see Copyright.txt
     # We make no guarantees that this code is fit for any purpose.
     # Visit http://OnJava8.com for more book information.
     #- Speaking pets in Python
    diff --git a/staticchecking/dogsandrobots.go b/staticchecking/dogsandrobots.go
    index a352865e4..d3dd10cb6 100644
    --- a/staticchecking/dogsandrobots.go
    +++ b/staticchecking/dogsandrobots.go
    @@ -1,5 +1,5 @@
     // staticchecking/dogsandrobots.go
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package main
    diff --git a/staticchecking/dr/DogsAndRobots.java b/staticchecking/dr/DogsAndRobots.java
    index c5afa6f98..9bede8045 100644
    --- a/staticchecking/dr/DogsAndRobots.java
    +++ b/staticchecking/dr/DogsAndRobots.java
    @@ -1,5 +1,5 @@
     // staticchecking/dr/DogsAndRobots.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // {java staticchecking.dr.DogsAndRobots}
    diff --git a/staticchecking/drc/DogAndRobotCollections.java b/staticchecking/drc/DogAndRobotCollections.java
    index bf48ee023..16a82ed54 100644
    --- a/staticchecking/drc/DogAndRobotCollections.java
    +++ b/staticchecking/drc/DogAndRobotCollections.java
    @@ -1,5 +1,5 @@
     // staticchecking/drc/DogAndRobotCollections.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // {java staticchecking.drc.DogAndRobotCollections}
    diff --git a/staticchecking/latent/Latent.java b/staticchecking/latent/Latent.java
    index f8766f41b..29e53713e 100644
    --- a/staticchecking/latent/Latent.java
    +++ b/staticchecking/latent/Latent.java
    @@ -1,5 +1,5 @@
     // staticchecking/latent/Latent.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // {java staticchecking.latent.Latent}
    diff --git a/staticchecking/petspeak.go b/staticchecking/petspeak.go
    index 308e0c1f9..1d5c5e462 100644
    --- a/staticchecking/petspeak.go
    +++ b/staticchecking/petspeak.go
    @@ -1,5 +1,5 @@
     // staticchecking/petspeak.go
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package main
    diff --git a/staticchecking/petspeak/PetSpeak.java b/staticchecking/petspeak/PetSpeak.java
    index 6b1014976..0b850c3b4 100644
    --- a/staticchecking/petspeak/PetSpeak.java
    +++ b/staticchecking/petspeak/PetSpeak.java
    @@ -1,5 +1,5 @@
     // staticchecking/petspeak/PetSpeak.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Speaking pets in Java
    diff --git a/streams/ArrayStreams.java b/streams/ArrayStreams.java
    index 8bcdbb8af..dfed6e83b 100644
    --- a/streams/ArrayStreams.java
    +++ b/streams/ArrayStreams.java
    @@ -1,5 +1,5 @@
     // streams/ArrayStreams.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    diff --git a/streams/Bubble.java b/streams/Bubble.java
    index c07afa588..5650e5ae2 100644
    --- a/streams/Bubble.java
    +++ b/streams/Bubble.java
    @@ -1,5 +1,5 @@
     // streams/Bubble.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.function.*;
    diff --git a/streams/Bubbles.java b/streams/Bubbles.java
    index 66177f024..1b3bd2b9d 100644
    --- a/streams/Bubbles.java
    +++ b/streams/Bubbles.java
    @@ -1,5 +1,5 @@
     // streams/Bubbles.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.stream.*;
    diff --git a/streams/CollectionToStream.java b/streams/CollectionToStream.java
    index 12efabe39..93236ef1f 100644
    --- a/streams/CollectionToStream.java
    +++ b/streams/CollectionToStream.java
    @@ -1,5 +1,5 @@
     // streams/CollectionToStream.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    diff --git a/streams/CreatingOptionals.java b/streams/CreatingOptionals.java
    index fd3f64548..7e886ddc2 100644
    --- a/streams/CreatingOptionals.java
    +++ b/streams/CreatingOptionals.java
    @@ -1,5 +1,5 @@
     // streams/CreatingOptionals.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    diff --git a/streams/Duplicator.java b/streams/Duplicator.java
    index 78a83e2a7..267279c7b 100644
    --- a/streams/Duplicator.java
    +++ b/streams/Duplicator.java
    @@ -1,5 +1,5 @@
     // streams/Duplicator.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.stream.*;
    diff --git a/streams/Fibonacci.java b/streams/Fibonacci.java
    index 3c76ca68d..fa53c6879 100644
    --- a/streams/Fibonacci.java
    +++ b/streams/Fibonacci.java
    @@ -1,5 +1,5 @@
     // streams/Fibonacci.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.stream.*;
    diff --git a/streams/FileToWords.java b/streams/FileToWords.java
    index 3fc61ca5f..7f7174cbe 100644
    --- a/streams/FileToWords.java
    +++ b/streams/FileToWords.java
    @@ -1,5 +1,5 @@
     // streams/FileToWords.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.nio.file.*;
    diff --git a/streams/FileToWordsBuilder.java b/streams/FileToWordsBuilder.java
    index d51c86630..d5ac62be5 100644
    --- a/streams/FileToWordsBuilder.java
    +++ b/streams/FileToWordsBuilder.java
    @@ -1,5 +1,5 @@
     // streams/FileToWordsBuilder.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.io.*;
    diff --git a/streams/FileToWordsRegexp.java b/streams/FileToWordsRegexp.java
    index 3132cd671..dfff507e1 100644
    --- a/streams/FileToWordsRegexp.java
    +++ b/streams/FileToWordsRegexp.java
    @@ -1,5 +1,5 @@
     // streams/FileToWordsRegexp.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.io.*;
    diff --git a/streams/FileToWordsTest.java b/streams/FileToWordsTest.java
    index b94c39fd4..a81f72096 100644
    --- a/streams/FileToWordsTest.java
    +++ b/streams/FileToWordsTest.java
    @@ -1,5 +1,5 @@
     // streams/FileToWordsTest.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.stream.*;
    diff --git a/streams/FlatMap.java b/streams/FlatMap.java
    index 50ed7ed9a..e2b3137fa 100644
    --- a/streams/FlatMap.java
    +++ b/streams/FlatMap.java
    @@ -1,5 +1,5 @@
     // streams/FlatMap.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.stream.*;
    diff --git a/streams/ForEach.java b/streams/ForEach.java
    index 37b537182..f0abe2558 100644
    --- a/streams/ForEach.java
    +++ b/streams/ForEach.java
    @@ -1,5 +1,5 @@
     // streams/ForEach.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    diff --git a/streams/FunctionMap.java b/streams/FunctionMap.java
    index 7176b2e3b..3c7c90e79 100644
    --- a/streams/FunctionMap.java
    +++ b/streams/FunctionMap.java
    @@ -1,5 +1,5 @@
     // streams/FunctionMap.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    diff --git a/streams/FunctionMap2.java b/streams/FunctionMap2.java
    index 809cb4702..4d9f29726 100644
    --- a/streams/FunctionMap2.java
    +++ b/streams/FunctionMap2.java
    @@ -1,5 +1,5 @@
     // streams/FunctionMap2.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Different input and output types
    diff --git a/streams/FunctionMap3.java b/streams/FunctionMap3.java
    index ebb9e3b0e..74236af31 100644
    --- a/streams/FunctionMap3.java
    +++ b/streams/FunctionMap3.java
    @@ -1,5 +1,5 @@
     // streams/FunctionMap3.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Producing numeric output streams
    diff --git a/streams/Generator.java b/streams/Generator.java
    index dc3ac1762..c9aba7404 100644
    --- a/streams/Generator.java
    +++ b/streams/Generator.java
    @@ -1,5 +1,5 @@
     // streams/Generator.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    diff --git a/streams/ImperativeRandoms.java b/streams/ImperativeRandoms.java
    index 9dad499a4..f9baaca5b 100644
    --- a/streams/ImperativeRandoms.java
    +++ b/streams/ImperativeRandoms.java
    @@ -1,5 +1,5 @@
     // streams/ImperativeRandoms.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    diff --git a/streams/Informational.java b/streams/Informational.java
    index 421455120..dd80585c3 100644
    --- a/streams/Informational.java
    +++ b/streams/Informational.java
    @@ -1,5 +1,5 @@
     // streams/Informational.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.stream.*;
    diff --git a/streams/LastElement.java b/streams/LastElement.java
    index e5fa30c1e..398b0488d 100644
    --- a/streams/LastElement.java
    +++ b/streams/LastElement.java
    @@ -1,5 +1,5 @@
     // streams/LastElement.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    diff --git a/streams/Looping.java b/streams/Looping.java
    index 75a30ef70..715ad052e 100644
    --- a/streams/Looping.java
    +++ b/streams/Looping.java
    @@ -1,5 +1,5 @@
     // streams/Looping.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import static onjava.Repeat.*;
    diff --git a/streams/Machine2.java b/streams/Machine2.java
    index a72369660..3d407185c 100644
    --- a/streams/Machine2.java
    +++ b/streams/Machine2.java
    @@ -1,5 +1,5 @@
     // streams/Machine2.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    diff --git a/streams/MapCollector.java b/streams/MapCollector.java
    index 01f71d0ef..95811e4b1 100644
    --- a/streams/MapCollector.java
    +++ b/streams/MapCollector.java
    @@ -1,5 +1,5 @@
     // streams/MapCollector.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    diff --git a/streams/Matching.java b/streams/Matching.java
    index b5aff16b8..f5c01bc6d 100644
    --- a/streams/Matching.java
    +++ b/streams/Matching.java
    @@ -1,5 +1,5 @@
     // streams/Matching.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Demonstrates short-circuiting of *Match() operations
    diff --git a/streams/NumericStreamInfo.java b/streams/NumericStreamInfo.java
    index 592263b58..0d04b6ef3 100644
    --- a/streams/NumericStreamInfo.java
    +++ b/streams/NumericStreamInfo.java
    @@ -1,5 +1,5 @@
     // streams/NumericStreamInfo.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.stream.*;
    diff --git a/streams/OptionalBasics.java b/streams/OptionalBasics.java
    index 24aa0dcfd..625c450ab 100644
    --- a/streams/OptionalBasics.java
    +++ b/streams/OptionalBasics.java
    @@ -1,5 +1,5 @@
     // streams/OptionalBasics.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    diff --git a/streams/OptionalFilter.java b/streams/OptionalFilter.java
    index a15df5da1..a2095ec3b 100644
    --- a/streams/OptionalFilter.java
    +++ b/streams/OptionalFilter.java
    @@ -1,5 +1,5 @@
     // streams/OptionalFilter.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    diff --git a/streams/OptionalFlatMap.java b/streams/OptionalFlatMap.java
    index ce71c3f0b..52e8e81e8 100644
    --- a/streams/OptionalFlatMap.java
    +++ b/streams/OptionalFlatMap.java
    @@ -1,5 +1,5 @@
     // streams/OptionalFlatMap.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    diff --git a/streams/OptionalMap.java b/streams/OptionalMap.java
    index 06d1bf3c8..83ae4396b 100644
    --- a/streams/OptionalMap.java
    +++ b/streams/OptionalMap.java
    @@ -1,5 +1,5 @@
     // streams/OptionalMap.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    diff --git a/streams/Optionals.java b/streams/Optionals.java
    index 19331d06f..4d0d96cbd 100644
    --- a/streams/Optionals.java
    +++ b/streams/Optionals.java
    @@ -1,5 +1,5 @@
     // streams/Optionals.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    diff --git a/streams/OptionalsFromEmptyStreams.java b/streams/OptionalsFromEmptyStreams.java
    index 5a8240ac9..771a84c0b 100644
    --- a/streams/OptionalsFromEmptyStreams.java
    +++ b/streams/OptionalsFromEmptyStreams.java
    @@ -1,5 +1,5 @@
     // streams/OptionalsFromEmptyStreams.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    diff --git a/streams/Peeking.java b/streams/Peeking.java
    index d3eea20ff..d88005150 100644
    --- a/streams/Peeking.java
    +++ b/streams/Peeking.java
    @@ -1,5 +1,5 @@
     // streams/Peeking.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
    diff --git a/streams/Prime.java b/streams/Prime.java
    index 6c72b5189..e14459d1a 100644
    --- a/streams/Prime.java
    +++ b/streams/Prime.java
    @@ -1,5 +1,5 @@
     // streams/Prime.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.stream.*;
    diff --git a/streams/RandInts.java b/streams/RandInts.java
    index 12416ecc5..8adfc60e2 100644
    --- a/streams/RandInts.java
    +++ b/streams/RandInts.java
    @@ -1,5 +1,5 @@
     // streams/RandInts.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package streams;
    diff --git a/streams/RandomGenerators.java b/streams/RandomGenerators.java
    index e9d75fefa..904216ac6 100644
    --- a/streams/RandomGenerators.java
    +++ b/streams/RandomGenerators.java
    @@ -1,5 +1,5 @@
     // streams/RandomGenerators.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    diff --git a/streams/RandomWords.java b/streams/RandomWords.java
    index ee3f83633..3bf2e51bb 100644
    --- a/streams/RandomWords.java
    +++ b/streams/RandomWords.java
    @@ -1,5 +1,5 @@
     // streams/RandomWords.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    diff --git a/streams/Randoms.java b/streams/Randoms.java
    index bf91ae8d6..f2b5f6a8a 100644
    --- a/streams/Randoms.java
    +++ b/streams/Randoms.java
    @@ -1,5 +1,5 @@
     // streams/Randoms.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    diff --git a/streams/Ranges.java b/streams/Ranges.java
    index e0aec59c4..d8fc681ac 100644
    --- a/streams/Ranges.java
    +++ b/streams/Ranges.java
    @@ -1,5 +1,5 @@
     // streams/Ranges.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import static java.util.stream.IntStream.*;
    diff --git a/streams/Reduce.java b/streams/Reduce.java
    index 48ba59938..0e9f07ba9 100644
    --- a/streams/Reduce.java
    +++ b/streams/Reduce.java
    @@ -1,5 +1,5 @@
     // streams/Reduce.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    diff --git a/streams/SelectElement.java b/streams/SelectElement.java
    index 83a9f5e61..86846e404 100644
    --- a/streams/SelectElement.java
    +++ b/streams/SelectElement.java
    @@ -1,5 +1,5 @@
     // streams/SelectElement.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    diff --git a/streams/Signal.java b/streams/Signal.java
    index cde125371..9dc2a9f41 100644
    --- a/streams/Signal.java
    +++ b/streams/Signal.java
    @@ -1,5 +1,5 @@
     // streams/Signal.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    diff --git a/streams/SortedComparator.java b/streams/SortedComparator.java
    index f0fad0906..070d60a7c 100644
    --- a/streams/SortedComparator.java
    +++ b/streams/SortedComparator.java
    @@ -1,5 +1,5 @@
     // streams/SortedComparator.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    diff --git a/streams/SpecialCollector.java b/streams/SpecialCollector.java
    index 9261ba0c5..9526a73ea 100644
    --- a/streams/SpecialCollector.java
    +++ b/streams/SpecialCollector.java
    @@ -1,5 +1,5 @@
     // streams/SpecialCollector.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    diff --git a/streams/StreamOf.java b/streams/StreamOf.java
    index eb38bd8af..c143388a3 100644
    --- a/streams/StreamOf.java
    +++ b/streams/StreamOf.java
    @@ -1,5 +1,5 @@
     // streams/StreamOf.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.stream.*;
    diff --git a/streams/StreamOfOptionals.java b/streams/StreamOfOptionals.java
    index 643145aab..f725df578 100644
    --- a/streams/StreamOfOptionals.java
    +++ b/streams/StreamOfOptionals.java
    @@ -1,5 +1,5 @@
     // streams/StreamOfOptionals.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    diff --git a/streams/StreamOfRandoms.java b/streams/StreamOfRandoms.java
    index 7f0f353de..66bf2bc7d 100644
    --- a/streams/StreamOfRandoms.java
    +++ b/streams/StreamOfRandoms.java
    @@ -1,5 +1,5 @@
     // streams/StreamOfRandoms.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    diff --git a/streams/StreamOfStreams.java b/streams/StreamOfStreams.java
    index daa15806e..973d83a6b 100644
    --- a/streams/StreamOfStreams.java
    +++ b/streams/StreamOfStreams.java
    @@ -1,5 +1,5 @@
     // streams/StreamOfStreams.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.stream.*;
    diff --git a/streams/TreeSetOfWords.java b/streams/TreeSetOfWords.java
    index 43cb63bd9..feaa56a2a 100644
    --- a/streams/TreeSetOfWords.java
    +++ b/streams/TreeSetOfWords.java
    @@ -1,5 +1,5 @@
     // streams/TreeSetOfWords.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    diff --git a/strings/ArrayListDisplay.java b/strings/ArrayListDisplay.java
    index cdbab7708..7b83296f0 100644
    --- a/strings/ArrayListDisplay.java
    +++ b/strings/ArrayListDisplay.java
    @@ -1,5 +1,5 @@
     // strings/ArrayListDisplay.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    diff --git a/strings/BetterRead.java b/strings/BetterRead.java
    index a6a5b2c48..a3b7aaa2d 100644
    --- a/strings/BetterRead.java
    +++ b/strings/BetterRead.java
    @@ -1,5 +1,5 @@
     // strings/BetterRead.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    diff --git a/strings/Concatenation.java b/strings/Concatenation.java
    index b6c01386b..685f4dbb6 100644
    --- a/strings/Concatenation.java
    +++ b/strings/Concatenation.java
    @@ -1,5 +1,5 @@
     // strings/Concatenation.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
    diff --git a/strings/Conversion.java b/strings/Conversion.java
    index 3b4f723b8..f839e81a2 100644
    --- a/strings/Conversion.java
    +++ b/strings/Conversion.java
    @@ -1,5 +1,5 @@
     // strings/Conversion.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.math.*;
    diff --git a/strings/DatabaseException.java b/strings/DatabaseException.java
    index 136e4188c..e84412546 100644
    --- a/strings/DatabaseException.java
    +++ b/strings/DatabaseException.java
    @@ -1,5 +1,5 @@
     // strings/DatabaseException.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
    diff --git a/strings/Finding.java b/strings/Finding.java
    index 52dc5c99f..f8d7cbbce 100644
    --- a/strings/Finding.java
    +++ b/strings/Finding.java
    @@ -1,5 +1,5 @@
     // strings/Finding.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.regex.*;
    diff --git a/strings/Groups.java b/strings/Groups.java
    index 22ff08678..298caf627 100644
    --- a/strings/Groups.java
    +++ b/strings/Groups.java
    @@ -1,5 +1,5 @@
     // strings/Groups.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.regex.*;
    diff --git a/strings/Hex.java b/strings/Hex.java
    index c28f95086..0fbcea8e4 100644
    --- a/strings/Hex.java
    +++ b/strings/Hex.java
    @@ -1,5 +1,5 @@
     // strings/Hex.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // {java onjava.Hex}
    diff --git a/strings/Immutable.java b/strings/Immutable.java
    index 5a7d2a0a1..4c8b529e7 100644
    --- a/strings/Immutable.java
    +++ b/strings/Immutable.java
    @@ -1,5 +1,5 @@
     // strings/Immutable.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
    diff --git a/strings/InfiniteRecursion.java b/strings/InfiniteRecursion.java
    index 0be8e3843..6941490a5 100644
    --- a/strings/InfiniteRecursion.java
    +++ b/strings/InfiniteRecursion.java
    @@ -1,5 +1,5 @@
     // strings/InfiniteRecursion.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Accidental recursion
    diff --git a/strings/IntegerMatch.java b/strings/IntegerMatch.java
    index 635339ea6..5a3a38ac8 100644
    --- a/strings/IntegerMatch.java
    +++ b/strings/IntegerMatch.java
    @@ -1,5 +1,5 @@
     // strings/IntegerMatch.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
    diff --git a/strings/JGrep.java b/strings/JGrep.java
    index 3581edbcb..49cec9547 100644
    --- a/strings/JGrep.java
    +++ b/strings/JGrep.java
    @@ -1,5 +1,5 @@
     // strings/JGrep.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // A very simple version of the "grep" program
    diff --git a/strings/ReFlags.java b/strings/ReFlags.java
    index 7c7123caf..856806eee 100644
    --- a/strings/ReFlags.java
    +++ b/strings/ReFlags.java
    @@ -1,5 +1,5 @@
     // strings/ReFlags.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.regex.*;
    diff --git a/strings/ReceiptBuilder.java b/strings/ReceiptBuilder.java
    index cc782fac8..234ca1e67 100644
    --- a/strings/ReceiptBuilder.java
    +++ b/strings/ReceiptBuilder.java
    @@ -1,5 +1,5 @@
     // strings/ReceiptBuilder.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    diff --git a/strings/Replacing.java b/strings/Replacing.java
    index b0e73c980..dbc21afe2 100644
    --- a/strings/Replacing.java
    +++ b/strings/Replacing.java
    @@ -1,5 +1,5 @@
     // strings/Replacing.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
    diff --git a/strings/ReplacingStringTokenizer.java b/strings/ReplacingStringTokenizer.java
    index c6a168db0..60fad1848 100644
    --- a/strings/ReplacingStringTokenizer.java
    +++ b/strings/ReplacingStringTokenizer.java
    @@ -1,5 +1,5 @@
     // strings/ReplacingStringTokenizer.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    diff --git a/strings/Resetting.java b/strings/Resetting.java
    index fc79a0381..f15653903 100644
    --- a/strings/Resetting.java
    +++ b/strings/Resetting.java
    @@ -1,5 +1,5 @@
     // strings/Resetting.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.regex.*;
    diff --git a/strings/Rudolph.java b/strings/Rudolph.java
    index 22504fba8..7a338510a 100644
    --- a/strings/Rudolph.java
    +++ b/strings/Rudolph.java
    @@ -1,5 +1,5 @@
     // strings/Rudolph.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
    diff --git a/strings/ScannerDelimiter.java b/strings/ScannerDelimiter.java
    index 7ba644c79..a06ed990d 100644
    --- a/strings/ScannerDelimiter.java
    +++ b/strings/ScannerDelimiter.java
    @@ -1,5 +1,5 @@
     // strings/ScannerDelimiter.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    diff --git a/strings/SimpleFormat.java b/strings/SimpleFormat.java
    index 0a6bafdba..a3a6e52fe 100644
    --- a/strings/SimpleFormat.java
    +++ b/strings/SimpleFormat.java
    @@ -1,5 +1,5 @@
     // strings/SimpleFormat.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
    diff --git a/strings/SimpleRead.java b/strings/SimpleRead.java
    index ee3e277fb..e85a058a5 100644
    --- a/strings/SimpleRead.java
    +++ b/strings/SimpleRead.java
    @@ -1,5 +1,5 @@
     // strings/SimpleRead.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.io.*;
    diff --git a/strings/SplitDemo.java b/strings/SplitDemo.java
    index 3f6788ea8..657453922 100644
    --- a/strings/SplitDemo.java
    +++ b/strings/SplitDemo.java
    @@ -1,5 +1,5 @@
     // strings/SplitDemo.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.regex.*;
    diff --git a/strings/Splitting.java b/strings/Splitting.java
    index e81bbc8c2..0afe3a402 100644
    --- a/strings/Splitting.java
    +++ b/strings/Splitting.java
    @@ -1,5 +1,5 @@
     // strings/Splitting.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    diff --git a/strings/StartEnd.java b/strings/StartEnd.java
    index ebf985ee4..03caf520c 100644
    --- a/strings/StartEnd.java
    +++ b/strings/StartEnd.java
    @@ -1,5 +1,5 @@
     // strings/StartEnd.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.regex.*;
    diff --git a/strings/TestRegularExpression.java b/strings/TestRegularExpression.java
    index a7adafbc1..fe79ce8b2 100644
    --- a/strings/TestRegularExpression.java
    +++ b/strings/TestRegularExpression.java
    @@ -1,5 +1,5 @@
     // strings/TestRegularExpression.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Simple regular expression demonstration
    diff --git a/strings/TheReplacements.java b/strings/TheReplacements.java
    index c3be94b65..2319552fe 100644
    --- a/strings/TheReplacements.java
    +++ b/strings/TheReplacements.java
    @@ -1,5 +1,5 @@
     // strings/TheReplacements.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.regex.*;
    diff --git a/strings/ThreatAnalyzer.java b/strings/ThreatAnalyzer.java
    index 11712f5e4..fc145c86e 100644
    --- a/strings/ThreatAnalyzer.java
    +++ b/strings/ThreatAnalyzer.java
    @@ -1,5 +1,5 @@
     // strings/ThreatAnalyzer.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.regex.*;
    diff --git a/strings/Turtle.java b/strings/Turtle.java
    index edbebfeb4..68977bfc2 100644
    --- a/strings/Turtle.java
    +++ b/strings/Turtle.java
    @@ -1,5 +1,5 @@
     // strings/Turtle.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.io.*;
    diff --git a/strings/UsingStringBuilder.java b/strings/UsingStringBuilder.java
    index 342c6426f..0ff324102 100644
    --- a/strings/UsingStringBuilder.java
    +++ b/strings/UsingStringBuilder.java
    @@ -1,5 +1,5 @@
     // strings/UsingStringBuilder.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    diff --git a/strings/WhitherStringBuilder.java b/strings/WhitherStringBuilder.java
    index 59cf3952f..0c46cae3b 100644
    --- a/strings/WhitherStringBuilder.java
    +++ b/strings/WhitherStringBuilder.java
    @@ -1,5 +1,5 @@
     // strings/WhitherStringBuilder.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
    diff --git a/typeinfo/AnonymousImplementation.java b/typeinfo/AnonymousImplementation.java
    index 5c4a2518c..34fa7832c 100644
    --- a/typeinfo/AnonymousImplementation.java
    +++ b/typeinfo/AnonymousImplementation.java
    @@ -1,5 +1,5 @@
     // typeinfo/AnonymousImplementation.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Anonymous inner classes can't hide from reflection
    diff --git a/typeinfo/BoundedClassReferences.java b/typeinfo/BoundedClassReferences.java
    index ace4a4691..ed0945e60 100644
    --- a/typeinfo/BoundedClassReferences.java
    +++ b/typeinfo/BoundedClassReferences.java
    @@ -1,5 +1,5 @@
     // typeinfo/BoundedClassReferences.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
    diff --git a/typeinfo/ClassCasts.java b/typeinfo/ClassCasts.java
    index a44573d5e..fd0e17cf6 100644
    --- a/typeinfo/ClassCasts.java
    +++ b/typeinfo/ClassCasts.java
    @@ -1,5 +1,5 @@
     // typeinfo/ClassCasts.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
    diff --git a/typeinfo/ClassInitialization.java b/typeinfo/ClassInitialization.java
    index 262649372..ba1d50e81 100644
    --- a/typeinfo/ClassInitialization.java
    +++ b/typeinfo/ClassInitialization.java
    @@ -1,5 +1,5 @@
     // typeinfo/ClassInitialization.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    diff --git a/typeinfo/DynamicSupplier.java b/typeinfo/DynamicSupplier.java
    index 86e47ddf1..bdde8c133 100644
    --- a/typeinfo/DynamicSupplier.java
    +++ b/typeinfo/DynamicSupplier.java
    @@ -1,5 +1,5 @@
     // typeinfo/DynamicSupplier.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.function.*;
    diff --git a/typeinfo/FamilyVsExactType.java b/typeinfo/FamilyVsExactType.java
    index 9fdfd25e2..5981bbe63 100644
    --- a/typeinfo/FamilyVsExactType.java
    +++ b/typeinfo/FamilyVsExactType.java
    @@ -1,5 +1,5 @@
     // typeinfo/FamilyVsExactType.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // The difference between instanceof and class
    diff --git a/typeinfo/GenericClassReferences.java b/typeinfo/GenericClassReferences.java
    index b75f853f8..81ba7f7d0 100644
    --- a/typeinfo/GenericClassReferences.java
    +++ b/typeinfo/GenericClassReferences.java
    @@ -1,5 +1,5 @@
     // typeinfo/GenericClassReferences.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
    diff --git a/typeinfo/HiddenImplementation.java b/typeinfo/HiddenImplementation.java
    index 8b23d97d7..7b41f6575 100644
    --- a/typeinfo/HiddenImplementation.java
    +++ b/typeinfo/HiddenImplementation.java
    @@ -1,5 +1,5 @@
     // typeinfo/HiddenImplementation.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Sneaking around package hiding
    diff --git a/typeinfo/InnerImplementation.java b/typeinfo/InnerImplementation.java
    index d9b9202c2..2b6541fa5 100644
    --- a/typeinfo/InnerImplementation.java
    +++ b/typeinfo/InnerImplementation.java
    @@ -1,5 +1,5 @@
     // typeinfo/InnerImplementation.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Private inner classes can't hide from reflection
    diff --git a/typeinfo/InterfaceViolation.java b/typeinfo/InterfaceViolation.java
    index 0adfba652..06b13f65c 100644
    --- a/typeinfo/InterfaceViolation.java
    +++ b/typeinfo/InterfaceViolation.java
    @@ -1,5 +1,5 @@
     // typeinfo/InterfaceViolation.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Sneaking around an interface
    diff --git a/typeinfo/ModifyingPrivateFields.java b/typeinfo/ModifyingPrivateFields.java
    index 5f1baf11c..fa1a175d8 100644
    --- a/typeinfo/ModifyingPrivateFields.java
    +++ b/typeinfo/ModifyingPrivateFields.java
    @@ -1,5 +1,5 @@
     // typeinfo/ModifyingPrivateFields.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.lang.reflect.*;
    diff --git a/typeinfo/NullRobot.java b/typeinfo/NullRobot.java
    index 45380aa59..d174ca946 100644
    --- a/typeinfo/NullRobot.java
    +++ b/typeinfo/NullRobot.java
    @@ -1,5 +1,5 @@
     // typeinfo/NullRobot.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Using a dynamic proxy to create an Optional
    diff --git a/typeinfo/Operation.java b/typeinfo/Operation.java
    index 2393d2365..dc8722301 100644
    --- a/typeinfo/Operation.java
    +++ b/typeinfo/Operation.java
    @@ -1,5 +1,5 @@
     // typeinfo/Operation.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.function.*;
    diff --git a/typeinfo/Person.java b/typeinfo/Person.java
    index 9c6a9657b..7a9807c0c 100644
    --- a/typeinfo/Person.java
    +++ b/typeinfo/Person.java
    @@ -1,5 +1,5 @@
     // typeinfo/Person.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Using Optional with regular classes
    diff --git a/typeinfo/PetCount.java b/typeinfo/PetCount.java
    index 1f43267f4..53438d29a 100644
    --- a/typeinfo/PetCount.java
    +++ b/typeinfo/PetCount.java
    @@ -1,5 +1,5 @@
     // typeinfo/PetCount.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Using instanceof
    diff --git a/typeinfo/PetCount2.java b/typeinfo/PetCount2.java
    index 1e5ef4d70..c65e01388 100644
    --- a/typeinfo/PetCount2.java
    +++ b/typeinfo/PetCount2.java
    @@ -1,5 +1,5 @@
     // typeinfo/PetCount2.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import typeinfo.pets.*;
    diff --git a/typeinfo/PetCount3.java b/typeinfo/PetCount3.java
    index 87635bb08..5b08fb660 100644
    --- a/typeinfo/PetCount3.java
    +++ b/typeinfo/PetCount3.java
    @@ -1,5 +1,5 @@
     // typeinfo/PetCount3.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Using isInstance()
    diff --git a/typeinfo/PetCount4.java b/typeinfo/PetCount4.java
    index ab18aee05..1ea4873ac 100644
    --- a/typeinfo/PetCount4.java
    +++ b/typeinfo/PetCount4.java
    @@ -1,5 +1,5 @@
     // typeinfo/PetCount4.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import typeinfo.pets.*;
    diff --git a/typeinfo/Position.java b/typeinfo/Position.java
    index 1912bb956..ca81643b0 100644
    --- a/typeinfo/Position.java
    +++ b/typeinfo/Position.java
    @@ -1,5 +1,5 @@
     // typeinfo/Position.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    diff --git a/typeinfo/RegisteredFactories.java b/typeinfo/RegisteredFactories.java
    index 358bba1a7..7708cc4ee 100644
    --- a/typeinfo/RegisteredFactories.java
    +++ b/typeinfo/RegisteredFactories.java
    @@ -1,5 +1,5 @@
     // typeinfo/RegisteredFactories.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Registering Factories in the base class
    diff --git a/typeinfo/Robot.java b/typeinfo/Robot.java
    index f3c8d0534..803ee9fe2 100644
    --- a/typeinfo/Robot.java
    +++ b/typeinfo/Robot.java
    @@ -1,5 +1,5 @@
     // typeinfo/Robot.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import onjava.*;
    diff --git a/typeinfo/SelectingMethods.java b/typeinfo/SelectingMethods.java
    index 14c8058ab..d87e928bc 100644
    --- a/typeinfo/SelectingMethods.java
    +++ b/typeinfo/SelectingMethods.java
    @@ -1,5 +1,5 @@
     // typeinfo/SelectingMethods.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Looking for particular methods in a dynamic proxy
    diff --git a/typeinfo/Shapes.java b/typeinfo/Shapes.java
    index 9af68532d..34a2bc561 100644
    --- a/typeinfo/Shapes.java
    +++ b/typeinfo/Shapes.java
    @@ -1,5 +1,5 @@
     // typeinfo/Shapes.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.stream.*;
    diff --git a/typeinfo/ShowMethods.java b/typeinfo/ShowMethods.java
    index 91aef15a8..be1b635b0 100644
    --- a/typeinfo/ShowMethods.java
    +++ b/typeinfo/ShowMethods.java
    @@ -1,5 +1,5 @@
     // typeinfo/ShowMethods.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Using reflection to show all the methods of a class,
    diff --git a/typeinfo/SimpleDynamicProxy.java b/typeinfo/SimpleDynamicProxy.java
    index 041c13806..bece57f8a 100644
    --- a/typeinfo/SimpleDynamicProxy.java
    +++ b/typeinfo/SimpleDynamicProxy.java
    @@ -1,5 +1,5 @@
     // typeinfo/SimpleDynamicProxy.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.lang.reflect.*;
    diff --git a/typeinfo/SimpleProxyDemo.java b/typeinfo/SimpleProxyDemo.java
    index 4ea8fea3d..24c3c2c25 100644
    --- a/typeinfo/SimpleProxyDemo.java
    +++ b/typeinfo/SimpleProxyDemo.java
    @@ -1,5 +1,5 @@
     // typeinfo/SimpleProxyDemo.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
    diff --git a/typeinfo/SnowRemovalRobot.java b/typeinfo/SnowRemovalRobot.java
    index 0f3b4c0bf..af5b46cd9 100644
    --- a/typeinfo/SnowRemovalRobot.java
    +++ b/typeinfo/SnowRemovalRobot.java
    @@ -1,5 +1,5 @@
     // typeinfo/SnowRemovalRobot.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    diff --git a/typeinfo/Staff.java b/typeinfo/Staff.java
    index 4d864e1df..569e598f7 100644
    --- a/typeinfo/Staff.java
    +++ b/typeinfo/Staff.java
    @@ -1,5 +1,5 @@
     // typeinfo/Staff.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    diff --git a/typeinfo/SweetShop.java b/typeinfo/SweetShop.java
    index a1000ea3f..f85b8c3f9 100644
    --- a/typeinfo/SweetShop.java
    +++ b/typeinfo/SweetShop.java
    @@ -1,5 +1,5 @@
     // typeinfo/SweetShop.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Examination of the way the class loader works
    diff --git a/typeinfo/WildcardClassReferences.java b/typeinfo/WildcardClassReferences.java
    index 9a35b6e54..32d75e868 100644
    --- a/typeinfo/WildcardClassReferences.java
    +++ b/typeinfo/WildcardClassReferences.java
    @@ -1,5 +1,5 @@
     // typeinfo/WildcardClassReferences.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
    diff --git a/typeinfo/interfacea/A.java b/typeinfo/interfacea/A.java
    index 565a4a74d..2ebb99d32 100644
    --- a/typeinfo/interfacea/A.java
    +++ b/typeinfo/interfacea/A.java
    @@ -1,5 +1,5 @@
     // typeinfo/interfacea/A.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package typeinfo.interfacea;
    diff --git a/typeinfo/packageaccess/HiddenC.java b/typeinfo/packageaccess/HiddenC.java
    index 80938a066..9fb8ffde9 100644
    --- a/typeinfo/packageaccess/HiddenC.java
    +++ b/typeinfo/packageaccess/HiddenC.java
    @@ -1,5 +1,5 @@
     // typeinfo/packageaccess/HiddenC.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package typeinfo.packageaccess;
    diff --git a/typeinfo/pets/Cat.java b/typeinfo/pets/Cat.java
    index f1bfdc0ea..75781fd7f 100644
    --- a/typeinfo/pets/Cat.java
    +++ b/typeinfo/pets/Cat.java
    @@ -1,5 +1,5 @@
     // typeinfo/pets/Cat.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package typeinfo.pets;
    diff --git a/typeinfo/pets/Cymric.java b/typeinfo/pets/Cymric.java
    index c6f0a59ca..fd86fa953 100644
    --- a/typeinfo/pets/Cymric.java
    +++ b/typeinfo/pets/Cymric.java
    @@ -1,5 +1,5 @@
     // typeinfo/pets/Cymric.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package typeinfo.pets;
    diff --git a/typeinfo/pets/Dog.java b/typeinfo/pets/Dog.java
    index 0f1144a08..68f43a322 100644
    --- a/typeinfo/pets/Dog.java
    +++ b/typeinfo/pets/Dog.java
    @@ -1,5 +1,5 @@
     // typeinfo/pets/Dog.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package typeinfo.pets;
    diff --git a/typeinfo/pets/EgyptianMau.java b/typeinfo/pets/EgyptianMau.java
    index 243294678..adbdfbb18 100644
    --- a/typeinfo/pets/EgyptianMau.java
    +++ b/typeinfo/pets/EgyptianMau.java
    @@ -1,5 +1,5 @@
     // typeinfo/pets/EgyptianMau.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package typeinfo.pets;
    diff --git a/typeinfo/pets/ForNameCreator.java b/typeinfo/pets/ForNameCreator.java
    index e3bb51c77..29351efa0 100644
    --- a/typeinfo/pets/ForNameCreator.java
    +++ b/typeinfo/pets/ForNameCreator.java
    @@ -1,5 +1,5 @@
     // typeinfo/pets/ForNameCreator.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package typeinfo.pets;
    diff --git a/typeinfo/pets/Hamster.java b/typeinfo/pets/Hamster.java
    index f2cc83799..8408ef623 100644
    --- a/typeinfo/pets/Hamster.java
    +++ b/typeinfo/pets/Hamster.java
    @@ -1,5 +1,5 @@
     // typeinfo/pets/Hamster.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package typeinfo.pets;
    diff --git a/typeinfo/pets/Individual.java b/typeinfo/pets/Individual.java
    index f7e7d204b..e3c87dacb 100644
    --- a/typeinfo/pets/Individual.java
    +++ b/typeinfo/pets/Individual.java
    @@ -1,5 +1,5 @@
     // typeinfo/pets/Individual.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package typeinfo.pets;
    diff --git a/typeinfo/pets/LiteralPetCreator.java b/typeinfo/pets/LiteralPetCreator.java
    index dd32d7ea3..398baac8c 100644
    --- a/typeinfo/pets/LiteralPetCreator.java
    +++ b/typeinfo/pets/LiteralPetCreator.java
    @@ -1,5 +1,5 @@
     // typeinfo/pets/LiteralPetCreator.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Using class literals
    diff --git a/typeinfo/pets/Manx.java b/typeinfo/pets/Manx.java
    index b7771c7cc..6a5534b13 100644
    --- a/typeinfo/pets/Manx.java
    +++ b/typeinfo/pets/Manx.java
    @@ -1,5 +1,5 @@
     // typeinfo/pets/Manx.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package typeinfo.pets;
    diff --git a/typeinfo/pets/Mouse.java b/typeinfo/pets/Mouse.java
    index 6d267cdbb..bbb97cda0 100644
    --- a/typeinfo/pets/Mouse.java
    +++ b/typeinfo/pets/Mouse.java
    @@ -1,5 +1,5 @@
     // typeinfo/pets/Mouse.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package typeinfo.pets;
    diff --git a/typeinfo/pets/Mutt.java b/typeinfo/pets/Mutt.java
    index 7c41712bc..f51814b93 100644
    --- a/typeinfo/pets/Mutt.java
    +++ b/typeinfo/pets/Mutt.java
    @@ -1,5 +1,5 @@
     // typeinfo/pets/Mutt.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package typeinfo.pets;
    diff --git a/typeinfo/pets/Person.java b/typeinfo/pets/Person.java
    index 1a6532667..4dcfff2ce 100644
    --- a/typeinfo/pets/Person.java
    +++ b/typeinfo/pets/Person.java
    @@ -1,5 +1,5 @@
     // typeinfo/pets/Person.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package typeinfo.pets;
    diff --git a/typeinfo/pets/Pet.java b/typeinfo/pets/Pet.java
    index 282418f8c..dcbfd4ab7 100644
    --- a/typeinfo/pets/Pet.java
    +++ b/typeinfo/pets/Pet.java
    @@ -1,5 +1,5 @@
     // typeinfo/pets/Pet.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package typeinfo.pets;
    diff --git a/typeinfo/pets/PetCreator.java b/typeinfo/pets/PetCreator.java
    index 99431c3cd..5feb09405 100644
    --- a/typeinfo/pets/PetCreator.java
    +++ b/typeinfo/pets/PetCreator.java
    @@ -1,5 +1,5 @@
     // typeinfo/pets/PetCreator.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Creates random sequences of Pets
    diff --git a/typeinfo/pets/Pets.java b/typeinfo/pets/Pets.java
    index f99847b16..be3037a16 100644
    --- a/typeinfo/pets/Pets.java
    +++ b/typeinfo/pets/Pets.java
    @@ -1,5 +1,5 @@
     // typeinfo/pets/Pets.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Facade to produce a default PetCreator
    diff --git a/typeinfo/pets/Pug.java b/typeinfo/pets/Pug.java
    index 9be1d2e9a..9d8ab4670 100644
    --- a/typeinfo/pets/Pug.java
    +++ b/typeinfo/pets/Pug.java
    @@ -1,5 +1,5 @@
     // typeinfo/pets/Pug.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package typeinfo.pets;
    diff --git a/typeinfo/pets/Rat.java b/typeinfo/pets/Rat.java
    index 099127e01..2ce5534b8 100644
    --- a/typeinfo/pets/Rat.java
    +++ b/typeinfo/pets/Rat.java
    @@ -1,5 +1,5 @@
     // typeinfo/pets/Rat.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package typeinfo.pets;
    diff --git a/typeinfo/pets/Rodent.java b/typeinfo/pets/Rodent.java
    index 32483bc00..7b998d0aa 100644
    --- a/typeinfo/pets/Rodent.java
    +++ b/typeinfo/pets/Rodent.java
    @@ -1,5 +1,5 @@
     // typeinfo/pets/Rodent.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package typeinfo.pets;
    diff --git a/typeinfo/toys/GenericToyTest.java b/typeinfo/toys/GenericToyTest.java
    index c0ae10669..aece7958f 100644
    --- a/typeinfo/toys/GenericToyTest.java
    +++ b/typeinfo/toys/GenericToyTest.java
    @@ -1,5 +1,5 @@
     // typeinfo/toys/GenericToyTest.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Testing class Class
    diff --git a/typeinfo/toys/ToyTest.java b/typeinfo/toys/ToyTest.java
    index b1ff8ba90..39d637c79 100644
    --- a/typeinfo/toys/ToyTest.java
    +++ b/typeinfo/toys/ToyTest.java
    @@ -1,5 +1,5 @@
     // typeinfo/toys/ToyTest.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Testing class Class
    diff --git a/validating/Assert1.java b/validating/Assert1.java
    index 5527225e7..013a72f6f 100644
    --- a/validating/Assert1.java
    +++ b/validating/Assert1.java
    @@ -1,5 +1,5 @@
     // validating/Assert1.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Non-informative style of assert
    diff --git a/validating/Assert2.java b/validating/Assert2.java
    index 684f97b22..61b4827d7 100644
    --- a/validating/Assert2.java
    +++ b/validating/Assert2.java
    @@ -1,5 +1,5 @@
     // validating/Assert2.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Assert with an information-expression
    diff --git a/validating/BadMicroBenchmark.java b/validating/BadMicroBenchmark.java
    index ecc774ada..2634e67c9 100644
    --- a/validating/BadMicroBenchmark.java
    +++ b/validating/BadMicroBenchmark.java
    @@ -1,5 +1,5 @@
     // validating/BadMicroBenchmark.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // {ExcludeFromTravisCI}
    diff --git a/validating/BadMicroBenchmark2.java b/validating/BadMicroBenchmark2.java
    index fd840ddaf..123036a0c 100644
    --- a/validating/BadMicroBenchmark2.java
    +++ b/validating/BadMicroBenchmark2.java
    @@ -1,5 +1,5 @@
     // validating/BadMicroBenchmark2.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Relying on a common resource
    diff --git a/validating/CircularQueue.java b/validating/CircularQueue.java
    index bd5166ad1..405e44101 100644
    --- a/validating/CircularQueue.java
    +++ b/validating/CircularQueue.java
    @@ -1,5 +1,5 @@
     // validating/CircularQueue.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Demonstration of Design by Contract (DbC)
    diff --git a/validating/CircularQueueException.java b/validating/CircularQueueException.java
    index 056123442..142b8ece2 100644
    --- a/validating/CircularQueueException.java
    +++ b/validating/CircularQueueException.java
    @@ -1,5 +1,5 @@
     // validating/CircularQueueException.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package validating;
    diff --git a/validating/CountedList.java b/validating/CountedList.java
    index e33e13b03..6c780f216 100644
    --- a/validating/CountedList.java
    +++ b/validating/CountedList.java
    @@ -1,5 +1,5 @@
     // validating/CountedList.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Keeps track of how many of itself are created.
    diff --git a/validating/GuavaAssertions.java b/validating/GuavaAssertions.java
    index 38fcb444d..a499f079b 100644
    --- a/validating/GuavaAssertions.java
    +++ b/validating/GuavaAssertions.java
    @@ -1,5 +1,5 @@
     // validating/GuavaAssertions.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Assertions that are always enabled.
    diff --git a/validating/GuavaPreconditions.java b/validating/GuavaPreconditions.java
    index 752fe6af7..3cfc66ae9 100644
    --- a/validating/GuavaPreconditions.java
    +++ b/validating/GuavaPreconditions.java
    @@ -1,5 +1,5 @@
     // validating/GuavaPreconditions.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Demonstrating Guava Preconditions
    diff --git a/validating/Inverter1.java b/validating/Inverter1.java
    index 9c8a54630..8ef828d6e 100644
    --- a/validating/Inverter1.java
    +++ b/validating/Inverter1.java
    @@ -1,5 +1,5 @@
     // validating/Inverter1.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package validating;
    diff --git a/validating/Inverter2.java b/validating/Inverter2.java
    index b1ae74835..3fb862fd4 100644
    --- a/validating/Inverter2.java
    +++ b/validating/Inverter2.java
    @@ -1,5 +1,5 @@
     // validating/Inverter2.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package validating;
    diff --git a/validating/Inverter3.java b/validating/Inverter3.java
    index f7c4bd14e..4bd53c82a 100644
    --- a/validating/Inverter3.java
    +++ b/validating/Inverter3.java
    @@ -1,5 +1,5 @@
     // validating/Inverter3.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package validating;
    diff --git a/validating/Inverter4.java b/validating/Inverter4.java
    index ffd24b8f9..0b7870594 100644
    --- a/validating/Inverter4.java
    +++ b/validating/Inverter4.java
    @@ -1,5 +1,5 @@
     // validating/Inverter4.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package validating;
    diff --git a/validating/LoaderAssertions.java b/validating/LoaderAssertions.java
    index c15ac97e3..52cac3471 100644
    --- a/validating/LoaderAssertions.java
    +++ b/validating/LoaderAssertions.java
    @@ -1,5 +1,5 @@
     // validating/LoaderAssertions.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Using the class loader to enable assertions
    diff --git a/validating/NonNullConstruction.java b/validating/NonNullConstruction.java
    index b75ef2433..a95483dd4 100644
    --- a/validating/NonNullConstruction.java
    +++ b/validating/NonNullConstruction.java
    @@ -1,5 +1,5 @@
     // validating/NonNullConstruction.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import static com.google.common.base.Preconditions.*;
    diff --git a/validating/SLF4JLevels.java b/validating/SLF4JLevels.java
    index 8100bd6d6..c851e7c31 100644
    --- a/validating/SLF4JLevels.java
    +++ b/validating/SLF4JLevels.java
    @@ -1,5 +1,5 @@
     // validating/SLF4JLevels.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import org.slf4j.*;
    diff --git a/validating/SLF4JLogging.java b/validating/SLF4JLogging.java
    index 1c124a136..f2e94d6e5 100644
    --- a/validating/SLF4JLogging.java
    +++ b/validating/SLF4JLogging.java
    @@ -1,5 +1,5 @@
     // validating/SLF4JLogging.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import org.slf4j.*;
    diff --git a/validating/SimpleDebugging.java b/validating/SimpleDebugging.java
    index 62766283f..863e7de39 100644
    --- a/validating/SimpleDebugging.java
    +++ b/validating/SimpleDebugging.java
    @@ -1,5 +1,5 @@
     // validating/SimpleDebugging.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // {ThrowsException}
    diff --git a/validating/StringInverter.java b/validating/StringInverter.java
    index 3ef11e8ca..34c933a73 100644
    --- a/validating/StringInverter.java
    +++ b/validating/StringInverter.java
    @@ -1,5 +1,5 @@
     // validating/StringInverter.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package validating;
    diff --git a/validating/jmh/JMH1.java b/validating/jmh/JMH1.java
    index b1767a77b..79eb749ab 100644
    --- a/validating/jmh/JMH1.java
    +++ b/validating/jmh/JMH1.java
    @@ -1,5 +1,5 @@
     // validating/jmh/JMH1.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package validating.jmh;
    diff --git a/validating/jmh/JMH2.java b/validating/jmh/JMH2.java
    index e119f1b51..ae7b56f9d 100644
    --- a/validating/jmh/JMH2.java
    +++ b/validating/jmh/JMH2.java
    @@ -1,5 +1,5 @@
     // validating/jmh/JMH2.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package validating.jmh;
    diff --git a/validating/jmh/JMH3.java b/validating/jmh/JMH3.java
    index ffb46ffe0..8ce9bb0c1 100644
    --- a/validating/jmh/JMH3.java
    +++ b/validating/jmh/JMH3.java
    @@ -1,5 +1,5 @@
     // validating/jmh/JMH3.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package validating.jmh;
    diff --git a/validating/tests/CircularQueueTest.java b/validating/tests/CircularQueueTest.java
    index 37c45fa35..8da6dc276 100644
    --- a/validating/tests/CircularQueueTest.java
    +++ b/validating/tests/CircularQueueTest.java
    @@ -1,5 +1,5 @@
     // validating/tests/CircularQueueTest.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package validating;
    diff --git a/validating/tests/CountedListTest.java b/validating/tests/CountedListTest.java
    index d852485ca..a9dc0c717 100644
    --- a/validating/tests/CountedListTest.java
    +++ b/validating/tests/CountedListTest.java
    @@ -1,5 +1,5 @@
     // validating/tests/CountedListTest.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Simple use of JUnit to test CountedList.
    diff --git a/validating/tests/DynamicStringInverterTests.java b/validating/tests/DynamicStringInverterTests.java
    index 329ae6320..dc980971a 100644
    --- a/validating/tests/DynamicStringInverterTests.java
    +++ b/validating/tests/DynamicStringInverterTests.java
    @@ -1,5 +1,5 @@
     // validating/tests/DynamicStringInverterTests.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package validating;
    diff --git a/validating/tests/StringInverterTests.java b/validating/tests/StringInverterTests.java
    index 817253731..e32873b87 100644
    --- a/validating/tests/StringInverterTests.java
    +++ b/validating/tests/StringInverterTests.java
    @@ -1,5 +1,5 @@
     // validating/tests/StringInverterTests.java
    -// (c)2017 MindView LLC: see Copyright.txt
    +// (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package validating;
    
    From f07d93d8e5756faca91a6f7273d57e586873b245 Mon Sep 17 00:00:00 2001
    From: Bruce Eckel 
    Date: Wed, 7 Oct 2020 14:16:29 -0600
    Subject: [PATCH 287/320] Fixes so it runs OK under WSL2
    
    ---
     newio/MappedIO.java       | 1 +
     patterns/BoxObserver.java | 7 ++++---
     2 files changed, 5 insertions(+), 3 deletions(-)
    
    diff --git a/newio/MappedIO.java b/newio/MappedIO.java
    index 82f3cca7c..93b4ddf3a 100644
    --- a/newio/MappedIO.java
    +++ b/newio/MappedIO.java
    @@ -2,6 +2,7 @@
     // (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
    +// {ExcludeFromGradle} Runs too long under WSL2
     import java.util.*;
     import java.nio.*;
     import java.nio.channels.*;
    diff --git a/patterns/BoxObserver.java b/patterns/BoxObserver.java
    index 355c4086e..cb7e97d47 100644
    --- a/patterns/BoxObserver.java
    +++ b/patterns/BoxObserver.java
    @@ -3,8 +3,8 @@
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Demonstration of Observer pattern using
    -// Java's built-in observer classes
    -// {ExcludeFromTravisCI}
    +// Java's built-in observer classes.
    +// {ExcludeFromGradle} // Won't work under WSL2
     import javax.swing.*;
     import java.awt.*;
     import java.awt.event.*;
    @@ -33,7 +33,8 @@ public BoxObserver(int grid) {
             cp.add(new OCBox(x, y, notifier));
       }
       public static void main(String[] args) {
    -    new TimedAbort(4);
    +    // For automated test runs:
    +    // new TimedAbort(4);
         int grid = 8;
         if(args.length > 0)
           grid = Integer.parseInt(args[0]);
    
    From 8bfc28c687e7a9653ef96221ece54c94af8988ff Mon Sep 17 00:00:00 2001
    From: Bruce Eckel 
    Date: Wed, 7 Oct 2020 14:58:30 -0600
    Subject: [PATCH 288/320] Exclusions to make build work with Java 9
    
    ---
     enums/NotClasses.java         | 3 ++-
     lowlevel/NotAtomic.java       | 3 ++-
     standardio/OSExecuteDemo.java | 3 ++-
     3 files changed, 6 insertions(+), 3 deletions(-)
    
    diff --git a/enums/NotClasses.java b/enums/NotClasses.java
    index 8e0c941f8..681e807d3 100644
    --- a/enums/NotClasses.java
    +++ b/enums/NotClasses.java
    @@ -2,7 +2,8 @@
     // (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
    -// {javap -c LikeClasses}
    +// {ExcludeFromGradle}
    +// javap -c LikeClasses
     
     enum LikeClasses {
       WINKEN {
    diff --git a/lowlevel/NotAtomic.java b/lowlevel/NotAtomic.java
    index e07954510..c6c6c3211 100644
    --- a/lowlevel/NotAtomic.java
    +++ b/lowlevel/NotAtomic.java
    @@ -2,7 +2,8 @@
     // (c)2020 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
    -// {javap -c NotAtomic}
    +// javap -c NotAtomic
    +// {ExcludeFromGradle}
     // {VisuallyInspectOutput}
     
     public class NotAtomic {
    diff --git a/standardio/OSExecuteDemo.java b/standardio/OSExecuteDemo.java
    index 9ce8c8ef2..cc2fd4b04 100644
    --- a/standardio/OSExecuteDemo.java
    +++ b/standardio/OSExecuteDemo.java
    @@ -3,7 +3,8 @@
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Demonstrates standard I/O redirection
    -// {javap -cp build/classes/java/main OSExecuteDemo}
    +// javap -cp build/classes/java/main OSExecuteDemo
    +// {ExcludeFromGradle}
     import onjava.*;
     
     public class OSExecuteDemo {}
    
    From be5962bc227dda8db15465559ccd26733f095d5c Mon Sep 17 00:00:00 2001
    From: Bruce Eckel 
    Date: Wed, 7 Oct 2020 15:10:21 -0600
    Subject: [PATCH 289/320] Update build.gradle
    
    So 'gradlew build' works
    ---
     build.gradle | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/build.gradle b/build.gradle
    index 5349c1480..b4feb13d5 100644
    --- a/build.gradle
    +++ b/build.gradle
    @@ -15,7 +15,7 @@ subprojects {
         apply from: "$rootProject.projectDir/gradle/java.gradle"
         apply from: "$rootProject.projectDir/gradle/junit-jupiter.gradle"
         apply from: "$rootProject.projectDir/gradle/jmh.gradle"
    -    apply from: "$rootProject.projectDir/gradle/checkstyle.gradle"
    +    // apply from: "$rootProject.projectDir/gradle/checkstyle.gradle"
         apply from: "$rootProject.projectDir/gradle/findbugs.gradle"
         apply plugin: 'com.mindviewinc.tagging'
     }
    
    From 185255634d71344c6099cf482e789e8da99d6ac0 Mon Sep 17 00:00:00 2001
    From: Bruce Eckel 
    Date: Wed, 7 Oct 2020 17:06:42 -0600
    Subject: [PATCH 290/320] Builds and runs with JDK9
    
    ---
     collectiontopics/CanonicalMapping.java |  1 +
     collectiontopics/References.java       |  1 +
     collectiontopics/SetOrder.java         |  2 +-
     generics/DynamicProxyMixin.java        |  1 +
     generics/InstantiateGenericType.java   |  5 +++--
     generics/coffee/CoffeeSupplier.java    | 10 +++++++---
     housekeeping/TerminationCondition.java |  1 +
     onjava/BasicSupplier.java              |  5 ++++-
     onjava/atunit/AtUnit.java              |  5 ++++-
     patterns/BoxObserver.java              |  3 +++
     patterns/ShapeFactory2.java            |  4 +---
     patterns/observer/ObservedFlower.java  |  3 +++
     patterns/trash/Trash.java              |  3 ++-
     references/ImmutableInteger.java       |  1 +
     typeinfo/DynamicSupplier.java          |  5 ++---
     typeinfo/pets/PetCreator.java          |  6 +++++-
     typeinfo/toys/GenericToyTest.java      |  1 +
     typeinfo/toys/ToyTest.java             | 11 +++++------
     18 files changed, 46 insertions(+), 22 deletions(-)
    
    diff --git a/collectiontopics/CanonicalMapping.java b/collectiontopics/CanonicalMapping.java
    index 7ad7eb29e..c02f9132a 100644
    --- a/collectiontopics/CanonicalMapping.java
    +++ b/collectiontopics/CanonicalMapping.java
    @@ -19,6 +19,7 @@ public boolean equals(Object r) {
         return r instanceof Element &&
           Objects.equals(ident, ((Element)r).ident);
       }
    +  @SuppressWarnings("deprecation")
       @Override
       protected void finalize() {
         System.out.println("Finalizing " +
    diff --git a/collectiontopics/References.java b/collectiontopics/References.java
    index ca505606a..5fcca9404 100644
    --- a/collectiontopics/References.java
    +++ b/collectiontopics/References.java
    @@ -13,6 +13,7 @@ class VeryBig {
       VeryBig(String id) { ident = id; }
       @Override
       public String toString() { return ident; }
    +  @SuppressWarnings("deprecation")
       @Override
       protected void finalize() {
         System.out.println("Finalizing " + ident);
    diff --git a/collectiontopics/SetOrder.java b/collectiontopics/SetOrder.java
    index 543db94c2..1c25be238 100644
    --- a/collectiontopics/SetOrder.java
    +++ b/collectiontopics/SetOrder.java
    @@ -23,7 +23,7 @@ public class SetOrder {
         for(String type: sets) {
           System.out.format("[-> %s <-]%n",
             type.substring(type.lastIndexOf('.') + 1));
    -      @SuppressWarnings("unchecked")
    +      @SuppressWarnings({"unchecked", "deprecation"})
           Set set = (Set)
             Class.forName(type).newInstance();
           set.addAll(RLIST);
    diff --git a/generics/DynamicProxyMixin.java b/generics/DynamicProxyMixin.java
    index 008efb12a..38431e31d 100644
    --- a/generics/DynamicProxyMixin.java
    +++ b/generics/DynamicProxyMixin.java
    @@ -44,6 +44,7 @@ public static Object newInstance(Tuple2... pairs) {
     
     public class DynamicProxyMixin {
       public static void main(String[] args) {
    +    @SuppressWarnings("unchecked")
         Object mixin = MixinProxy.newInstance(
           tuple(new BasicImp(), Basic.class),
           tuple(new TimeStampedImp(), TimeStamped.class),
    diff --git a/generics/InstantiateGenericType.java b/generics/InstantiateGenericType.java
    index 5bd42e84f..9424c9a1d 100644
    --- a/generics/InstantiateGenericType.java
    +++ b/generics/InstantiateGenericType.java
    @@ -3,18 +3,19 @@
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.function.*;
    +import java.lang.reflect.InvocationTargetException;
     
     class ClassAsFactory implements Supplier {
       Class kind;
       ClassAsFactory(Class kind) {
         this.kind = kind;
       }
    +  @SuppressWarnings("deprecation")
       @Override
       public T get() {
         try {
           return kind.newInstance();
    -    } catch(InstantiationException |
    -            IllegalAccessException e) {
    +    } catch(Exception e) {
           throw new RuntimeException(e);
         }
       }
    diff --git a/generics/coffee/CoffeeSupplier.java b/generics/coffee/CoffeeSupplier.java
    index 8973dfbc1..fe5dced89 100644
    --- a/generics/coffee/CoffeeSupplier.java
    +++ b/generics/coffee/CoffeeSupplier.java
    @@ -7,6 +7,7 @@
     import java.util.*;
     import java.util.function.*;
     import java.util.stream.*;
    +import java.lang.reflect.InvocationTargetException;
     
     public class CoffeeSupplier
     implements Supplier, Iterable {
    @@ -21,10 +22,13 @@ public CoffeeSupplier() {}
       public Coffee get() {
         try {
           return (Coffee)
    -        types[rand.nextInt(types.length)].newInstance();
    +        types[rand.nextInt(types.length)]
    +        .getConstructor().newInstance();
           // Report programmer errors at run time:
    -    } catch(InstantiationException |
    -            IllegalAccessException e) {
    +      } catch(InstantiationException |
    +              NoSuchMethodException |
    +              InvocationTargetException |
    +              IllegalAccessException e) {
           throw new RuntimeException(e);
         }
       }
    diff --git a/housekeeping/TerminationCondition.java b/housekeeping/TerminationCondition.java
    index 393540ac0..dc8d347b8 100644
    --- a/housekeeping/TerminationCondition.java
    +++ b/housekeeping/TerminationCondition.java
    @@ -14,6 +14,7 @@ class Book {
       void checkIn() {
         checkedOut = false;
       }
    +  @SuppressWarnings("deprecation")
       @Override
       public void finalize() {
         if(checkedOut)
    diff --git a/onjava/BasicSupplier.java b/onjava/BasicSupplier.java
    index 377d74d18..d4bf3b3d8 100644
    --- a/onjava/BasicSupplier.java
    +++ b/onjava/BasicSupplier.java
    @@ -5,6 +5,7 @@
     // Supplier from a class with a no-arg constructor
     package onjava;
     import java.util.function.*;
    +import java.lang.reflect.InvocationTargetException;
     
     public class BasicSupplier implements Supplier {
       private Class type;
    @@ -15,8 +16,10 @@ public BasicSupplier(Class type) {
       public T get() {
         try {
           // Assumes type is a public class:
    -      return type.newInstance();
    +      return type.getConstructor().newInstance();
         } catch(InstantiationException |
    +            NoSuchMethodException |
    +            InvocationTargetException |
                 IllegalAccessException e) {
           throw new RuntimeException(e);
         }
    diff --git a/onjava/atunit/AtUnit.java b/onjava/atunit/AtUnit.java
    index a6c621277..b1688cbda 100644
    --- a/onjava/atunit/AtUnit.java
    +++ b/onjava/atunit/AtUnit.java
    @@ -162,8 +162,11 @@ Method checkForCleanupMethod(Method m) {
           }
         } else { // Use the no-arg constructor:
           try {
    -        return testClass.newInstance();
    +        return testClass
    +          .getConstructor().newInstance();
           } catch(InstantiationException |
    +              NoSuchMethodException |
    +              InvocationTargetException |
                   IllegalAccessException e) {
             throw new RuntimeException(
               "Couldn't create a test object. " +
    diff --git a/patterns/BoxObserver.java b/patterns/BoxObserver.java
    index cb7e97d47..c6f9ec65d 100644
    --- a/patterns/BoxObserver.java
    +++ b/patterns/BoxObserver.java
    @@ -13,6 +13,7 @@
     import onjava.MouseClick;
     
     // You must inherit a new type of Observable:
    +@SuppressWarnings("deprecation")
     class BoxObservable extends Observable {
       @Override
       public void notifyObservers(Object b) {
    @@ -22,6 +23,7 @@ public void notifyObservers(Object b) {
       }
     }
     
    +@SuppressWarnings("deprecation")
     public class BoxObserver extends JFrame {
       Observable notifier = new BoxObservable();
       public BoxObserver(int grid) {
    @@ -45,6 +47,7 @@ public static void main(String[] args) {
       }
     }
     
    +@SuppressWarnings("deprecation")
     class OCBox extends JPanel implements Observer {
       Observable notifier;
       int x, y; // Locations in grid
    diff --git a/patterns/ShapeFactory2.java b/patterns/ShapeFactory2.java
    index 4f2134c4e..238811052 100644
    --- a/patterns/ShapeFactory2.java
    +++ b/patterns/ShapeFactory2.java
    @@ -25,9 +25,7 @@ public Shape create(String id) {
           return (Shape)factories
             .computeIfAbsent(id, ShapeFactory2::load)
             .newInstance();
    -    } catch(InstantiationException |
    -            IllegalAccessException |
    -            InvocationTargetException e) {
    +    } catch(Exception e) {
           throw new BadShapeCreation(id);
         }
       }
    diff --git a/patterns/observer/ObservedFlower.java b/patterns/observer/ObservedFlower.java
    index f759a105d..009da63e3 100644
    --- a/patterns/observer/ObservedFlower.java
    +++ b/patterns/observer/ObservedFlower.java
    @@ -7,6 +7,7 @@
     package patterns.observer;
     import java.util.*;
     
    +@SuppressWarnings("deprecation")
     class Flower {
       private boolean isOpen;
       private boolean alreadyOpen;
    @@ -46,6 +47,7 @@ public void notifyObservers() {
       }
     }
     
    +@SuppressWarnings("deprecation")
     class Bee {
       private String name;
       Bee(String nm)  { name = nm; }
    @@ -61,6 +63,7 @@ public Observer closeObserver() {
       }
     }
     
    +@SuppressWarnings("deprecation")
     class Hummingbird {
       private String name;
       Hummingbird(String nm) { name = nm; }
    diff --git a/patterns/trash/Trash.java b/patterns/trash/Trash.java
    index 40be944ab..7d01de8c8 100644
    --- a/patterns/trash/Trash.java
    +++ b/patterns/trash/Trash.java
    @@ -70,7 +70,8 @@ public static  T factory(Info info) {
                 trashType.getConstructor(double.class);
               // Call the constructor to create a
               // new object:
    -          return (T)ctor.newInstance(info.data);
    +          return
    +            (T)ctor.newInstance(info.data);
             } catch(Exception e) {
               throw new CannotCreateTrashException(e);
             }
    diff --git a/references/ImmutableInteger.java b/references/ImmutableInteger.java
    index ed4594b90..906aa7ef0 100644
    --- a/references/ImmutableInteger.java
    +++ b/references/ImmutableInteger.java
    @@ -8,6 +8,7 @@
     
     public class ImmutableInteger {
       public static void main(String[] args) {
    +    @SuppressWarnings("deprecation")
         List v = IntStream.range(0, 10)
           .mapToObj(Integer::new)
           .collect(Collectors.toList());
    diff --git a/typeinfo/DynamicSupplier.java b/typeinfo/DynamicSupplier.java
    index bdde8c133..271af6399 100644
    --- a/typeinfo/DynamicSupplier.java
    +++ b/typeinfo/DynamicSupplier.java
    @@ -5,7 +5,6 @@
     import java.util.function.*;
     import java.util.stream.*;
     
    -
     class CountedInteger {
       private static long counter;
       private final long id = counter++;
    @@ -18,11 +17,11 @@ public class DynamicSupplier implements Supplier {
       public DynamicSupplier(Class type) {
         this.type = type;
       }
    +  @SuppressWarnings("deprecation")
       public T get() {
         try {
           return type.newInstance();
    -    } catch(InstantiationException |
    -            IllegalAccessException e) {
    +    } catch(Exception e) {
           throw new RuntimeException(e);
         }
       }
    diff --git a/typeinfo/pets/PetCreator.java b/typeinfo/pets/PetCreator.java
    index 5feb09405..76909aa9a 100644
    --- a/typeinfo/pets/PetCreator.java
    +++ b/typeinfo/pets/PetCreator.java
    @@ -6,6 +6,7 @@
     package typeinfo.pets;
     import java.util.*;
     import java.util.function.*;
    +import java.lang.reflect.InvocationTargetException;
     
     public abstract
     class PetCreator implements Supplier {
    @@ -15,8 +16,11 @@ class PetCreator implements Supplier {
       public Pet get() { // Create one random Pet
         int n = rand.nextInt(types().size());
         try {
    -      return types().get(n).newInstance();
    +      return types().get(n)
    +             .getConstructor().newInstance();
         } catch(InstantiationException |
    +            NoSuchMethodException |
    +            InvocationTargetException |
                 IllegalAccessException e) {
           throw new RuntimeException(e);
         }
    diff --git a/typeinfo/toys/GenericToyTest.java b/typeinfo/toys/GenericToyTest.java
    index aece7958f..7dc016cdc 100644
    --- a/typeinfo/toys/GenericToyTest.java
    +++ b/typeinfo/toys/GenericToyTest.java
    @@ -7,6 +7,7 @@
     package typeinfo.toys;
     
     public class GenericToyTest {
    +  @SuppressWarnings("deprecation")
       public static void
       main(String[] args) throws Exception {
         Class ftClass = FancyToy.class;
    diff --git a/typeinfo/toys/ToyTest.java b/typeinfo/toys/ToyTest.java
    index 39d637c79..e4e5e92db 100644
    --- a/typeinfo/toys/ToyTest.java
    +++ b/typeinfo/toys/ToyTest.java
    @@ -5,6 +5,7 @@
     // Testing class Class
     // {java typeinfo.toys.ToyTest}
     package typeinfo.toys;
    +import java.lang.reflect.InvocationTargetException;
     
     interface HasBatteries {}
     interface Waterproof {}
    @@ -31,6 +32,7 @@ static void printInfo(Class cc) {
         System.out.println(
           "Canonical name : " + cc.getCanonicalName());
       }
    +  @SuppressWarnings("deprecation")
       public static void main(String[] args) {
         Class c = null;
         try {
    @@ -47,12 +49,9 @@ public static void main(String[] args) {
         try {
           // Requires no-arg constructor:
           obj = up.newInstance();
    -    } catch(InstantiationException e) {
    -      System.out.println("Cannot instantiate");
    -      System.exit(1);
    -    } catch(IllegalAccessException e) {
    -      System.out.println("Cannot access");
    -      System.exit(1);
    +    } catch(Exception e) {
    +      throw new
    +        RuntimeException("Cannot instantiate");
         }
         printInfo(obj.getClass());
       }
    
    From 03925c71dbc2177346b4b2a43ffa627c2139620c Mon Sep 17 00:00:00 2001
    From: Bruce Eckel 
    Date: Wed, 7 Oct 2020 17:55:39 -0600
    Subject: [PATCH 291/320] Update .travis.yml
    
    ---
     .travis.yml | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/.travis.yml b/.travis.yml
    index a9e2a082d..aa2577d2d 100644
    --- a/.travis.yml
    +++ b/.travis.yml
    @@ -1,6 +1,6 @@
     language: java
     jdk:
    -  - oraclejdk8
    +  - oraclejdk12
     install: true
     script:
       - ./gradlew --no-daemon --stacktrace run
    
    From d56a8da627309e6db93e27fa0c72fb890b075a58 Mon Sep 17 00:00:00 2001
    From: Bruce Eckel 
    Date: Thu, 8 Oct 2020 15:02:36 -0600
    Subject: [PATCH 292/320] Runs with everything up through JDK 15
    
    JDK 16 has a Gradle fail
    ---
     .travis.yml | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/.travis.yml b/.travis.yml
    index aa2577d2d..54fee6592 100644
    --- a/.travis.yml
    +++ b/.travis.yml
    @@ -1,6 +1,6 @@
     language: java
     jdk:
    -  - oraclejdk12
    +  - oraclejdk11
     install: true
     script:
       - ./gradlew --no-daemon --stacktrace run
    
    From cc94cad71818816524c14f48ec075c3582804869 Mon Sep 17 00:00:00 2001
    From: Bruce Eckel 
    Date: Fri, 9 Oct 2020 04:53:27 -0600
    Subject: [PATCH 293/320] Appveyor broken
    
    They are giving an error message that using build_script formerly fixed.
    
    Commented out both CI results.
    ---
     README.md      | 6 +++---
     appveyor.yml   | 6 ------
     appveyorXX.yml | 4 ++++
     3 files changed, 7 insertions(+), 9 deletions(-)
     delete mode 100644 appveyor.yml
     create mode 100644 appveyorXX.yml
    
    diff --git a/README.md b/README.md
    index 84b3e7642..b1251088b 100644
    --- a/README.md
    +++ b/README.md
    @@ -1,8 +1,8 @@
    -[![](https://travis-ci.org/BruceEckel/OnJava8-Examples.svg?branch=master)](https://travis-ci.org/BruceEckel/OnJava8-Examples)
    +[comment]: <> [![](https://travis-ci.org/BruceEckel/OnJava8-Examples.svg?branch=master)](https://travis-ci.org/BruceEckel/OnJava8-Examples)
     
    -[![](https://ci.appveyor.com/api/projects/status/github/BruceEckel/OnJava8-Examples)](https://ci.appveyor.com/project/BruceEckel/onjava-examples)
    +[comment]: <> [![](https://ci.appveyor.com/api/projects/status/github/BruceEckel/OnJava8-Examples)](https://ci.appveyor.com/project/BruceEckel/onjava-examples)
     
    -To compile and run these programs, you only need JDK 8 installed. 
    +To compile and run these programs, you only need JDK 8 installed.
     Invoking `gradlew` will automatically download and install Gradle.
     Gradle will also install all additional libraries necessary to compile
     and run the Java examples in the book.
    diff --git a/appveyor.yml b/appveyor.yml
    deleted file mode 100644
    index 0d99cee33..000000000
    --- a/appveyor.yml
    +++ /dev/null
    @@ -1,6 +0,0 @@
    -build_script:
    -  - gradlew.bat --no-daemon --stacktrace run
    -#  - gradlew.bat --parallel --stacktrace run
    -#  - gradlew.bat --parallel --stacktrace :validating:jmh
    -
    -test: off
    diff --git a/appveyorXX.yml b/appveyorXX.yml
    new file mode 100644
    index 000000000..5e586b07e
    --- /dev/null
    +++ b/appveyorXX.yml
    @@ -0,0 +1,4 @@
    +build_script:
    +  - gradlew.bat --no-daemon --stacktrace run
    +
    +test: off
    
    From 4edac5281c2020e5bda5f081d622a7e47c3a884d Mon Sep 17 00:00:00 2001
    From: Bruce Eckel 
    Date: Fri, 9 Oct 2020 05:02:45 -0600
    Subject: [PATCH 294/320] Exclude breaking CI
    
    ---
     .travis.yml => .travisXX.yml | 0
     CI.txt                       | 5 +++++
     README.md                    | 4 ----
     3 files changed, 5 insertions(+), 4 deletions(-)
     rename .travis.yml => .travisXX.yml (100%)
     create mode 100644 CI.txt
    
    diff --git a/.travis.yml b/.travisXX.yml
    similarity index 100%
    rename from .travis.yml
    rename to .travisXX.yml
    diff --git a/CI.txt b/CI.txt
    new file mode 100644
    index 000000000..524ee206d
    --- /dev/null
    +++ b/CI.txt
    @@ -0,0 +1,5 @@
    +Links formerly in the README. Both of these mysteriously started breaking.
    +
    +[![](https://travis-ci.org/BruceEckel/OnJava8-Examples.svg?branch=master)](https://travis-ci.org/BruceEckel/OnJava8-Examples)
    +
    +[![](https://ci.appveyor.com/api/projects/status/github/BruceEckel/OnJava8-Examples)](https://ci.appveyor.com/project/BruceEckel/onjava-examples)
    diff --git a/README.md b/README.md
    index b1251088b..30b8f7c42 100644
    --- a/README.md
    +++ b/README.md
    @@ -1,7 +1,3 @@
    -[comment]: <> [![](https://travis-ci.org/BruceEckel/OnJava8-Examples.svg?branch=master)](https://travis-ci.org/BruceEckel/OnJava8-Examples)
    -
    -[comment]: <> [![](https://ci.appveyor.com/api/projects/status/github/BruceEckel/OnJava8-Examples)](https://ci.appveyor.com/project/BruceEckel/onjava-examples)
    -
     To compile and run these programs, you only need JDK 8 installed.
     Invoking `gradlew` will automatically download and install Gradle.
     Gradle will also install all additional libraries necessary to compile
    
    From e2d233c748ed27b28f072e69f51e6c1730024de6 Mon Sep 17 00:00:00 2001
    From: Bruce Eckel 
    Date: Fri, 9 Oct 2020 05:04:50 -0600
    Subject: [PATCH 295/320] Update README.md
    
    ---
     README.md | 2 ++
     1 file changed, 2 insertions(+)
    
    diff --git a/README.md b/README.md
    index 30b8f7c42..f66f0678b 100644
    --- a/README.md
    +++ b/README.md
    @@ -1,3 +1,5 @@
    +Download release from [here](https://github.com/BruceEckel/OnJava8-Examples/releases/tag/v1.0).
    +
     To compile and run these programs, you only need JDK 8 installed.
     Invoking `gradlew` will automatically download and install Gradle.
     Gradle will also install all additional libraries necessary to compile
    
    From 5e0e65958fdb3a91fa10dc1a6991e972f97428d0 Mon Sep 17 00:00:00 2001
    From: Bruce Eckel 
    Date: Fri, 9 Oct 2020 05:05:46 -0600
    Subject: [PATCH 296/320] Update README.md
    
    ---
     README.md | 2 ++
     1 file changed, 2 insertions(+)
    
    diff --git a/README.md b/README.md
    index f66f0678b..985dbbe42 100644
    --- a/README.md
    +++ b/README.md
    @@ -1,3 +1,5 @@
    +# Example Source Code for the Book "On Java 8" by Bruce Eckel
    +
     Download release from [here](https://github.com/BruceEckel/OnJava8-Examples/releases/tag/v1.0).
     
     To compile and run these programs, you only need JDK 8 installed.
    
    From bb5ed21c7e22968301ec21810960b59c0f340619 Mon Sep 17 00:00:00 2001
    From: Bruce Eckel 
    Date: Wed, 30 Dec 2020 09:47:13 -0700
    Subject: [PATCH 297/320] Upgraded to latest Gradle (6.7.1)
    
    ---
     gradle/wrapper/gradle-wrapper.properties | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
    index 6c9a22477..4d9ca1649 100644
    --- a/gradle/wrapper/gradle-wrapper.properties
    +++ b/gradle/wrapper/gradle-wrapper.properties
    @@ -1,5 +1,5 @@
     distributionBase=GRADLE_USER_HOME
     distributionPath=wrapper/dists
    -distributionUrl=https\://services.gradle.org/distributions/gradle-6.6-bin.zip
    +distributionUrl=https\://services.gradle.org/distributions/gradle-6.7.1-bin.zip
     zipStoreBase=GRADLE_USER_HOME
     zipStorePath=wrapper/dists
    
    From dfdbcf604f6ba4322b7463aff762736e313c47f0 Mon Sep 17 00:00:00 2001
    From: Bruce Eckel 
    Date: Thu, 31 Dec 2020 16:33:20 -0700
    Subject: [PATCH 298/320] Update gradle.properties
    
    Get rid of spurious warnings
    ---
     gradle.properties | 2 ++
     1 file changed, 2 insertions(+)
    
    diff --git a/gradle.properties b/gradle.properties
    index f97ebb7d3..1cb5556b7 100644
    --- a/gradle.properties
    +++ b/gradle.properties
    @@ -1 +1,3 @@
     org.gradle.parallel=true
    +org.gradle.caching=true
    +org.gradle.warning.mode=none
    
    From 55de56e524ab296987ba7fef03b76c6bb2edb6ac Mon Sep 17 00:00:00 2001
    From: Bruce Eckel 
    Date: Sun, 31 Jan 2021 15:42:31 -0700
    Subject: [PATCH 299/320] After rewriting Type Information Chapter, added
     missing @Override
    
    ---
     CI.txt                                        |      5 -
     Copyright.txt                                 |      2 +-
     annotations/AUComposition.java                |      4 +-
     annotations/AUExternalTest.java               |      2 +-
     annotations/AtUnitExample1.java               |     10 +-
     annotations/AtUnitExample2.java               |     12 +-
     annotations/AtUnitExample3.java               |      4 +-
     annotations/AtUnitExample4.java               |      2 +-
     annotations/AtUnitExample5.java               |      5 +-
     annotations/DemoProcessFiles.java             |      2 +-
     annotations/HashSetTest.java                  |      4 +-
     annotations/PasswordUtils.java                |      2 +-
     annotations/SimulatingNull.java               |      2 +-
     annotations/StackL.java                       |      2 +-
     annotations/StackLStringTst.java              |      4 +-
     annotations/Testable.java                     |      2 +-
     annotations/UseCase.java                      |      2 +-
     annotations/UseCaseTracker.java               |      6 +-
     annotations/database/Constraints.java         |      2 +-
     annotations/database/DBTable.java             |      2 +-
     annotations/database/Member.java              |      7 +-
     annotations/database/SQLInteger.java          |      2 +-
     annotations/database/SQLString.java           |      2 +-
     annotations/database/TableCreator.java        |      2 +-
     annotations/database/Uniqueness.java          |      2 +-
     annotations/ifx/ExtractInterface.java         |      2 +-
     annotations/ifx/IfaceExtractorProcessor.java  |      8 +-
     annotations/ifx/Multiplier.java               |      2 +-
     annotations/simplest/Simple.java              |      2 +-
     annotations/simplest/SimpleProcessor.java     |      5 +-
     annotations/simplest/SimpleTest.java          |      2 +-
     arrays/AlphabeticSearch.java                  |      2 +-
     arrays/ArrayCopying.java                      |     13 +-
     arrays/ArrayOfGenericType.java                |      2 +-
     arrays/ArrayOfGenerics.java                   |      2 +-
     arrays/ArrayOptions.java                      |      2 +-
     arrays/ArraySearching.java                    |      2 +-
     arrays/AssemblingMultidimensionalArrays.java  |      2 +-
     arrays/AutoboxingArrays.java                  |      2 +-
     arrays/CollectionComparison.java              |      5 +-
     arrays/CompType.java                          |      8 +-
     arrays/ComparatorTest.java                    |      2 +-
     arrays/ComparingArrays.java                   |      2 +-
     arrays/CountUpward.java                       |      2 +-
     arrays/FillingArrays.java                     |      2 +-
     arrays/IceCreamFlavors.java                   |      2 +-
     arrays/ModifyExisting.java                    |      4 +-
     arrays/MultiDimWrapperArray.java              |      2 +-
     arrays/MultidimensionalObjectArrays.java      |      2 +-
     arrays/MultidimensionalPrimitiveArray.java    |      2 +-
     arrays/ParallelPrefix1.java                   |      2 +-
     arrays/ParallelPrefix2.java                   |      2 +-
     arrays/ParallelPrefix3.java                   |      2 +-
     arrays/ParallelSetAll.java                    |      2 +-
     arrays/ParameterizedArrayType.java            |      2 +-
     arrays/PythonLists.py                         |      4 +-
     arrays/RaggedArray.java                       |      4 +-
     arrays/Reverse.java                           |      2 +-
     arrays/SimpleSetAll.java                      |     15 +-
     arrays/StreamFromArray.java                   |      2 +-
     arrays/StringSorting.java                     |      2 +-
     arrays/TestConvertTo.java                     |      2 +-
     arrays/TestCount.java                         |      2 +-
     arrays/TestRand.java                          |      2 +-
     arrays/ThreeDWithNew.java                     |      2 +-
     arrays/jmh/ParallelSort.java                  |      2 +-
     collections/AdapterMethodIdiom.java           |      6 +-
     collections/AddingGroups.java                 |      2 +-
     collections/ApplesAndOrangesWithGenerics.java |      2 +-
     .../ApplesAndOrangesWithoutGenerics.java      |      2 +-
     collections/ArrayIsNotIterable.java           |      2 +-
     collections/AsListInference.java              |      2 +-
     collections/CollectionDifferences.java        |      2 +-
     collections/CollectionSequence.java           |     12 +-
     collections/CrossCollectionIteration.java     |      4 +-
     collections/CrossCollectionIteration2.java    |      4 +-
     collections/EnvironmentVariables.java         |      2 +-
     collections/ForInCollections.java             |      2 +-
     collections/GenericsAndUpcasting.java         |     10 +-
     collections/InterfaceVsIterator.java          |      4 +-
     collections/IterableClass.java                |      8 +-
     collections/LinkedListFeatures.java           |     14 +-
     collections/ListFeatures.java                 |     10 +-
     collections/ListIteration.java                |      9 +-
     collections/MapOfList.java                    |      2 +-
     collections/ModifyingArraysAsList.java        |      2 +-
     collections/MultiIterableClass.java           |      7 +-
     collections/NonCollectionSequence.java        |      7 +-
     collections/PetMap.java                       |      2 +-
     collections/PrintingCollections.java          |      2 +-
     collections/PriorityQueueDemo.java            |      2 +-
     collections/QueueDemo.java                    |      2 +-
     collections/SetOfInteger.java                 |      2 +-
     collections/SetOfString.java                  |      2 +-
     collections/SetOperations.java                |      2 +-
     collections/SimpleCollection.java             |      2 +-
     collections/SimpleIteration.java              |      4 +-
     collections/SortedSetOfString.java            |      2 +-
     collections/StackCollision.java               |      2 +-
     collections/StackTest.java                    |      2 +-
     collections/StackTest2.java                   |      2 +-
     collections/Statistics.java                   |      4 +-
     collections/UniqueWords.java                  |      2 +-
     collections/UniqueWordsAlphabetic.java        |      2 +-
     collectiontopics/AssociativeArray.java        |      5 +-
     collectiontopics/Bits.java                    |      2 +-
     collectiontopics/CanonicalMapping.java        |     14 +-
     collectiontopics/CollectionMethods.java       |      2 +-
     collectiontopics/Enumerations.java            |      2 +-
     collectiontopics/FailFast.java                |      2 +-
     collectiontopics/FillMapTest.java             |      2 +-
     collectiontopics/FillingLists.java            |     17 +-
     collectiontopics/FunctionalMap.java           |      2 +-
     collectiontopics/HTMLColorTest.java           |      2 +-
     collectiontopics/LinkedHashMapDemo.java       |      2 +-
     collectiontopics/ListOps.java                 |      2 +-
     collectiontopics/ListSortSearch.java          |      2 +-
     collectiontopics/MapOps.java                  |      2 +-
     collectiontopics/NavMap.java                  |      2 +-
     collectiontopics/QueueBehavior.java           |      2 +-
     collectiontopics/ReadOnly.java                |      2 +-
     collectiontopics/References.java              |     38 +-
     collectiontopics/SetOrder.java                |      6 +-
     collectiontopics/SimpleDeques.java            |      5 +-
     collectiontopics/SortedMapDemo.java           |      2 +-
     collectiontopics/SortedSetDemo.java           |      2 +-
     collectiontopics/Stacks.java                  |      2 +-
     collectiontopics/StreamFillMaps.java          |      5 +-
     collectiontopics/SuppliersCollectionTest.java |      5 +-
     collectiontopics/Synchronization.java         |      2 +-
     collectiontopics/ToDoList.java                |      8 +-
     collectiontopics/TypesForSets.java            |     22 +-
     collectiontopics/Unsupported.java             |      2 +-
     collectiontopics/Utilities.java               |      2 +-
     com/mindviewinc/simple/List.java              |      2 +-
     com/mindviewinc/simple/Vector.java            |      2 +-
     compression/GZIPcompress.java                 |      2 +-
     compression/ZipCompress.java                  |      2 +-
     concurrent/Baked.java                         |      2 +-
     concurrent/Batter.java                        |      2 +-
     concurrent/Breakable.java                     |      5 +-
     concurrent/CachedThreadPool.java              |     14 +-
     concurrent/CachedThreadPool2.java             |     22 +-
     concurrent/CachedThreadPool3.java             |     12 +-
     concurrent/CatchCompletableExceptions.java    |      2 +-
     concurrent/CollectionIntoStream.java          |      2 +-
     concurrent/CompletableApply.java              |      2 +-
     concurrent/CompletableApplyAsync.java         |      6 +-
     concurrent/CompletableApplyChained.java       |      4 +-
     concurrent/CompletableExceptions.java         |      2 +-
     concurrent/CompletableOperations.java         |      6 +-
     concurrent/CompletablePizza.java              |     40 +-
     concurrent/CompletableUtilities.java          |      2 +-
     concurrent/CompletedMachina.java              |      2 +-
     concurrent/CountingStream.java                |      2 +-
     concurrent/CountingTask.java                  |      5 +-
     concurrent/DiningPhilosophers.java            |      2 +-
     concurrent/DualCompletableOperations.java     |      2 +-
     concurrent/FrostedCake.java                   |      7 +-
     concurrent/Futures.java                       |      4 +-
     concurrent/GuardedIDField.java                |      4 +-
     concurrent/HasID.java                         |      2 +-
     concurrent/IDChecker.java                     |      5 +-
     concurrent/InterferingTask.java               |      5 +-
     concurrent/LambdasAndMethodReferences.java    |      4 +-
     concurrent/Machina.java                       |      5 +-
     concurrent/MoreTasksAfterShutdown.java        |      7 +-
     concurrent/NapTask.java                       |      8 +-
     concurrent/OnePizza.java                      |      4 +-
     concurrent/PSP2.txt                           |     11 +
     concurrent/ParallelPrime.java                 |      6 +-
     concurrent/ParallelStreamPuzzle.java          |      6 +-
     concurrent/ParallelStreamPuzzle2.java         |      6 +-
     concurrent/ParallelStreamPuzzle3.java         |      2 +-
     concurrent/Philosopher.java                   |      8 +-
     concurrent/Pizza.java                         |      5 +-
     concurrent/PizzaParallelSteps.java            |     38 +-
     concurrent/PizzaStreams.java                  |     38 +-
     concurrent/QuittableTask.java                 |      9 +-
     concurrent/QuittingCompletable.java           |     20 +-
     concurrent/QuittingTasks.java                 |     20 +-
     concurrent/SharedConstructorArgument.java     |     11 +-
     concurrent/SingleThreadExecutor.java          |      6 +-
     concurrent/SingleThreadExecutor2.java         |      2 +-
     concurrent/SingleThreadExecutor3.java         |      2 +-
     concurrent/StaticIDField.java                 |      4 +-
     concurrent/StickHolder.java                   |      2 +-
     concurrent/StreamExceptions.java              |      2 +-
     concurrent/Summing.java                       |      8 +-
     concurrent/Summing2.java                      |     10 +-
     concurrent/Summing3.java                      |      8 +-
     concurrent/Summing4.java                      |      4 +-
     concurrent/SynchronizedConstructor.java       |      5 +-
     concurrent/SynchronizedFactory.java           |      5 +-
     concurrent/TestStaticIDField.java             |      4 +-
     concurrent/ThrowsChecked.java                 |      6 +-
     concurrent/Workable.java                      |      5 +-
     concurrent/primes.txt                         | 100000 +++++++++++++++
     control/BreakAndContinue.java                 |      8 +-
     control/CommaOperator.java                    |      2 +-
     control/ForInFloat.java                       |      2 +-
     control/ForInInt.java                         |      2 +-
     control/ForInString.java                      |      2 +-
     control/IfElse.java                           |      4 +-
     control/LabeledFor.java                       |      2 +-
     control/LabeledWhile.java                     |      2 +-
     control/ListCharacters.java                   |      2 +-
     control/RandomBounds.java                     |      2 +-
     control/StringSwitch.java                     |      2 +-
     control/TestWithReturn.java                   |      2 +-
     control/TrueFalse.java                        |      2 +-
     control/VowelsAndConsonants.java              |      2 +-
     control/WhileTest.java                        |      2 +-
     enums/AlarmPoints.java                        |      2 +-
     enums/BigEnumSet.java                         |      2 +-
     enums/Burrito2.java                           |      5 +-
     enums/CarWash.java                            |     26 +-
     enums/Competitor.java                         |      2 +-
     enums/ConstantSpecificMethod.java             |     20 +-
     enums/EnumClass.java                          |      2 +-
     enums/EnumMaps.java                           |      2 +-
     enums/EnumSets.java                           |      2 +-
     enums/Input.java                              |      8 +-
     enums/NonEnum.java                            |      2 +-
     enums/NotClasses.java                         |     11 +-
     enums/Outcome.java                            |      2 +-
     enums/OverrideConstantSpecific.java           |      5 +-
     enums/OzWitch.java                            |      2 +-
     enums/PostOffice.java                         |     28 +-
     enums/RandomTest.java                         |      2 +-
     enums/Reflection.java                         |      2 +-
     enums/RoShamBo.java                           |      2 +-
     enums/RoShamBo1.java                          |     26 +-
     enums/RoShamBo2.java                          |      5 +-
     enums/RoShamBo3.java                          |     11 +-
     enums/RoShamBo4.java                          |      2 +-
     enums/RoShamBo5.java                          |      5 +-
     enums/RoShamBo6.java                          |      5 +-
     enums/SecurityCategory.java                   |      2 +-
     enums/SpaceShip.java                          |      5 +-
     enums/SpicinessEnum.java                      |      2 +-
     enums/TrafficLight.java                       |      5 +-
     enums/UpcastEnum.java                         |      2 +-
     enums/VendingMachine.java                     |     20 +-
     enums/cartoons/EnumImplementation.java        |      5 +-
     enums/menu/Course.java                        |      2 +-
     enums/menu/Food.java                          |      2 +-
     enums/menu/Meal.java                          |      2 +-
     enums/menu/Meal2.java                         |      2 +-
     enums/menu/TypeOfFood.java                    |      2 +-
     equalshashcode/ComposedEquality.java          |      8 +-
     equalshashcode/CountedString.java             |     11 +-
     equalshashcode/DefaultComparison.java         |      2 +-
     equalshashcode/Equality.java                  |      5 +-
     equalshashcode/EqualityFactory.java           |      2 +-
     equalshashcode/Groundhog.java                 |      5 +-
     equalshashcode/Groundhog2.java                |      5 +-
     equalshashcode/IndividualTest.java            |      2 +-
     equalshashcode/MapEntry.java                  |     20 +-
     equalshashcode/Prediction.java                |      5 +-
     equalshashcode/SimpleHashMap.java             |     11 +-
     equalshashcode/SlowMap.java                   |      8 +-
     equalshashcode/SpringDetector.java            |     16 +-
     equalshashcode/SpringDetector2.java           |      2 +-
     equalshashcode/StringHashCode.java            |      2 +-
     equalshashcode/SubtypeEquality.java           |     15 +-
     equalshashcode/SubtypeEquality2.java          |     12 +-
     equalshashcode/SuccinctEquality.java          |      5 +-
     exceptions/AlwaysFinally.java                 |      2 +-
     exceptions/AutoCloseableDetails.java          |      4 +-
     exceptions/BodyException.java                 |      2 +-
     exceptions/Cleanup.java                       |      2 +-
     exceptions/CleanupIdiom.java                  |      2 +-
     exceptions/CloseExceptions.java               |      3 +-
     exceptions/ConstructorException.java          |      2 +-
     exceptions/DynamicFields.java                 |     11 +-
     exceptions/ExceptionMethods.java              |      2 +-
     exceptions/ExceptionSilencer.java             |      2 +-
     exceptions/ExtraFeatures.java                 |     17 +-
     exceptions/FinallyWorks.java                  |      2 +-
     exceptions/FullConstructors.java              |      2 +-
     exceptions/Human.java                         |      2 +-
     exceptions/InheritingExceptions.java          |      2 +-
     exceptions/InputFile.java                     |      2 +-
     exceptions/InputFile2.java                    |      2 +-
     exceptions/LoggingExceptions.java             |      6 +-
     exceptions/LoggingExceptions2.java            |      4 +-
     exceptions/LostMessage.java                   |      8 +-
     exceptions/MainException.java                 |      2 +-
     exceptions/MessyExceptions.java               |      2 +-
     exceptions/MultiCatch.java                    |      2 +-
     exceptions/MultiCatch2.java                   |      2 +-
     exceptions/MultipleReturns.java               |      2 +-
     exceptions/NeverCaught.java                   |      2 +-
     exceptions/OnOffException1.java               |      2 +-
     exceptions/OnOffException2.java               |      2 +-
     exceptions/OnOffSwitch.java                   |      2 +-
     exceptions/PreciseRethrow.java                |      2 +-
     exceptions/RethrowNew.java                    |      2 +-
     exceptions/Rethrowing.java                    |      2 +-
     exceptions/SameHandler.java                   |      2 +-
     exceptions/StormyInning.java                  |     11 +-
     exceptions/StreamsAreAutoCloseable.java       |      6 +-
     exceptions/Switch.java                        |      5 +-
     exceptions/TryAnything.java                   |      2 +-
     exceptions/TryWithResources.java              |      2 +-
     exceptions/TurnOffChecking.java               |      2 +-
     exceptions/WhoCalled.java                     |      2 +-
     exceptions/WithFinally.java                   |      2 +-
     files/AddAndSubtractPaths.java                |     53 +-
     files/Directories.java                        |     16 +-
     files/FileSystemDemo.java                     |     14 +-
     files/Find.java                               |      2 +-
     files/ListOfLines.java                        |      2 +-
     files/PartsOfPaths.java                       |     18 +-
     files/PathAnalysis.java                       |     12 +-
     files/PathInfo.java                           |     28 +-
     files/PathWatcher.java                        |      2 +-
     files/ReadLineStream.java                     |      2 +-
     files/StreamInAndOut.java                     |      2 +-
     files/TreeWatcher.java                        |      2 +-
     files/Writing.java                            |      2 +-
     functional/AnonymousClosure.java              |      2 +-
     functional/BiConsumerPermutations.java        |      2 +-
     functional/ClassFunctionals.java              |      2 +-
     functional/Closure1.java                      |      2 +-
     functional/Closure2.java                      |      2 +-
     functional/Closure3.java                      |      2 +-
     functional/Closure4.java                      |      2 +-
     functional/Closure5.java                      |      2 +-
     functional/Closure6.java                      |      2 +-
     functional/Closure7.java                      |      2 +-
     functional/Closure8.java                      |      2 +-
     functional/Closure9.java                      |      2 +-
     functional/ConsumeFunction.java               |      2 +-
     functional/CtorReference.java                 |      8 +-
     functional/CurriedIntAdd.java                 |      2 +-
     functional/Curry3Args.java                    |      2 +-
     functional/CurryingAndPartials.java           |      6 +-
     functional/FunctionComposition.java           |      2 +-
     functional/FunctionVariants.java              |      2 +-
     functional/FunctionWithWrapped.java           |      2 +-
     functional/FunctionalAnnotation.java          |      2 +-
     functional/IntCall.java                       |      2 +-
     functional/LambdaExpressions.java             |     10 +-
     functional/MethodConversion.java              |      2 +-
     functional/MethodReferences.java              |     22 +-
     functional/MultiUnbound.java                  |      2 +-
     functional/PredicateComposition.java          |      2 +-
     functional/ProduceFunction.java               |      6 +-
     functional/RecursiveFactorial.java            |      2 +-
     functional/RecursiveFibonacci.java            |      2 +-
     functional/RunnableMethodReference.java       |      2 +-
     functional/SharedStorage.java                 |      2 +-
     functional/Strategize.java                    |     15 +-
     functional/TransformFunction.java             |      8 +-
     functional/TriFunction.java                   |      2 +-
     functional/TriFunctionTest.java               |      2 +-
     functional/UnboundMethodReference.java        |      6 +-
     generics/Amphibian.java                       |      2 +-
     generics/Apply.java                           |      2 +-
     generics/ApplyFunctional.java                 |      2 +-
     generics/ApplyTest.java                       |      2 +-
     generics/ArrayMaker.java                      |      2 +-
     generics/ArrayOfGeneric.java                  |      2 +-
     generics/ArrayOfGenericReference.java         |      2 +-
     generics/BankTeller.java                      |      8 +-
     generics/BasicBounds.java                     |      5 +-
     generics/BasicHolder.java                     |      2 +-
     generics/BasicSupplierDemo.java               |      2 +-
     generics/ByteSet.java                         |      2 +-
     generics/CRGWithBasicHolder.java              |      2 +-
     generics/CaptureConversion.java               |      2 +-
     generics/CheckedList.java                     |      2 +-
     generics/ClassCasting.java                    |      2 +-
     generics/ClassTypeCapture.java                |      2 +-
     generics/ComparablePet.java                   |      2 +-
     generics/CompilerIntelligence.java            |      2 +-
     generics/CountedObject.java                   |      5 +-
     generics/CovariantArrays.java                 |      2 +-
     generics/CovariantReturnTypes.java            |      5 +-
     generics/CreatorGeneric.java                  |      5 +-
     generics/CuriouslyRecurringGeneric.java       |      2 +-
     generics/Diamond.java                         |      2 +-
     generics/DogsAndRobotMethodReferences.java    |      2 +-
     generics/DogsAndRobots.cpp                    |      2 +-
     generics/DogsAndRobots.java                   |      4 +-
     generics/DogsAndRobots.py                     |      2 +-
     generics/DynamicProxyMixin.java               |      4 +-
     generics/EpicBattle.java                      |      8 +-
     generics/Erased.java                          |      2 +-
     generics/ErasedTypeEquivalence.java           |      2 +-
     generics/ErasureAndInheritance.java           |      2 +-
     generics/FactoryConstraint.java               |     18 +-
     generics/Fibonacci.java                       |      2 +-
     generics/FilledList.java                      |      2 +-
     generics/GenericArray.java                    |      2 +-
     generics/GenericArray2.java                   |      2 +-
     generics/GenericArrayWithTypeToken.java       |      2 +-
     generics/GenericCast.java                     |      2 +-
     generics/GenericHolder.java                   |      2 +-
     generics/GenericHolder2.java                  |      2 +-
     generics/GenericMethods.java                  |      2 +-
     generics/GenericReading.java                  |      2 +-
     generics/GenericVarargs.java                  |      2 +-
     generics/GenericsAndCovariance.java           |      2 +-
     generics/GenericsAndReturnTypes.java          |      2 +-
     generics/HasF.java                            |      2 +-
     generics/HijackedInterface.java               |      2 +-
     generics/Holder.java                          |      8 +-
     generics/Holder1.java                         |      2 +-
     generics/InheritBounds.java                   |      2 +-
     generics/InstantiateGenericType.cpp           |      2 +-
     generics/InstantiateGenericType.java          |     17 +-
     generics/IterableFibonacci.java               |      8 +-
     generics/LatentReflection.java                |      5 +-
     generics/LinkedStack.java                     |      2 +-
     generics/ListMaker.java                       |      2 +-
     generics/ListOfGenerics.java                  |      2 +-
     generics/ListOfInt.java                       |      2 +-
     generics/LostInformation.java                 |      2 +-
     generics/Manipulation.java                    |      2 +-
     generics/Manipulator2.java                    |      2 +-
     generics/Manipulator3.java                    |      2 +-
     generics/Mixins.cpp                           |      2 +-
     generics/Mixins.java                          |     12 +-
     generics/MultipleInterfaceVariants.java       |      2 +-
     generics/NeedCasting.java                     |      2 +-
     generics/NonCovariantGenerics.java            |      2 +-
     generics/NotSelfBounded.java                  |      2 +-
     generics/ObjectHolder.java                    |      2 +-
     generics/OrdinaryArguments.java               |      2 +-
     generics/Performs.java                        |      2 +-
     generics/PlainGenericInheritance.java         |      2 +-
     generics/PrimitiveGenericTest.java            |      2 +-
     generics/RandomList.java                      |      2 +-
     generics/RestrictedComparablePets.java        |      3 +-
     generics/ReturnGenericType.java               |      2 +-
     generics/SelfBounding.java                    |      2 +-
     .../SelfBoundingAndCovariantArguments.java    |      2 +-
     generics/SelfBoundingMethods.java             |      2 +-
     generics/Shape.java                           |      5 +-
     generics/SimpleDogsAndRobots.java             |      2 +-
     generics/SimpleHolder.java                    |      2 +-
     generics/SimpleQueue.java                     |      5 +-
     generics/Square.java                          |      2 +-
     generics/Store.java                           |     11 +-
     generics/SuperTypeWildcards.java              |      2 +-
     generics/Templates.cpp                        |      2 +-
     generics/ThrowGenericException.java           |      2 +-
     generics/TupleList.java                       |      6 +-
     generics/TupleTest.java                       |      8 +-
     generics/TupleTest2.java                      |      8 +-
     generics/UnboundedWildcards1.java             |      2 +-
     generics/UnboundedWildcards2.java             |      2 +-
     generics/Unconstrained.java                   |      2 +-
     generics/UseList.java                         |      2 +-
     generics/UseList2.java                        |      2 +-
     generics/Vehicle.java                         |      2 +-
     generics/WatercolorSets.java                  |     32 +-
     generics/Wildcards.java                       |      2 +-
     generics/coffee/Americano.java                |      2 +-
     generics/coffee/Breve.java                    |      2 +-
     generics/coffee/Cappuccino.java               |      2 +-
     generics/coffee/Coffee.java                   |      5 +-
     generics/coffee/CoffeeSupplier.java           |     11 +-
     generics/coffee/Latte.java                    |      2 +-
     generics/coffee/Mocha.java                    |      2 +-
     generics/decorator/Decoration.java            |      2 +-
     generics/dogsandrobots.go                     |      2 +-
     generics/watercolors/Watercolors.java         |      2 +-
     gradle/wrapper/gradle-wrapper.properties      |      2 +-
     hiding/Cake.java                              |      2 +-
     hiding/ChocolateChip.java                     |      2 +-
     hiding/ChocolateChip2.java                    |      2 +-
     hiding/CreatePackageAccessObject.java         |      2 +-
     hiding/Dinner.java                            |      2 +-
     hiding/FullQualification.java                 |      2 +-
     hiding/IceCream.java                          |      2 +-
     hiding/ImportedMyClass.java                   |      2 +-
     hiding/LibTest.java                           |      2 +-
     hiding/Lunch.java                             |      6 +-
     hiding/OrganizedByAccess.java                 |      2 +-
     hiding/Pie.java                               |      2 +-
     hiding/QualifiedMyClass.java                  |      2 +-
     hiding/SingleImport.java                      |      2 +-
     hiding/cookie2/Cookie.java                    |      2 +-
     hiding/dessert/Cookie.java                    |      2 +-
     hiding/mypackage/MyClass.java                 |      2 +-
     hiding/packageaccess/PublicConstructor.java   |      2 +-
     housekeeping/Apricot.java                     |      3 +-
     housekeeping/ArrayClassObj.java               |      2 +-
     housekeeping/ArrayInit.java                   |      2 +-
     housekeeping/ArrayNew.java                    |      2 +-
     housekeeping/ArraysOfPrimitives.java          |      2 +-
     housekeeping/AutoboxingVarargs.java           |      2 +-
     housekeeping/BananaPeel.java                  |      2 +-
     housekeeping/Burrito.java                     |      2 +-
     housekeeping/Counter.java                     |      2 +-
     housekeeping/DefaultConstructor.java          |      2 +-
     housekeeping/Demotion.java                    |      2 +-
     housekeeping/DynamicArray.java                |      2 +-
     housekeeping/EnumOrder.java                   |      2 +-
     housekeeping/ExplicitStatic.java              |      4 +-
     housekeeping/Flower.java                      |      2 +-
     housekeeping/InitialValues.java               |      2 +-
     housekeeping/InitialValues2.java              |      2 +-
     housekeeping/Leaf.java                        |      2 +-
     housekeeping/Measurement.java                 |      2 +-
     housekeeping/MethodInit.java                  |      2 +-
     housekeeping/MethodInit2.java                 |      2 +-
     housekeeping/MethodInit3.java                 |      2 +-
     housekeeping/Mugs.java                        |      4 +-
     housekeeping/NewVarArgs.java                  |      4 +-
     housekeeping/NoSynthesis.java                 |      2 +-
     housekeeping/OptionalTrailingArguments.java   |      2 +-
     housekeeping/OrderOfInitialization.java       |      2 +-
     housekeeping/Overloading.java                 |      2 +-
     housekeeping/OverloadingOrder.java            |      2 +-
     housekeeping/OverloadingVarargs.java          |      2 +-
     housekeeping/OverloadingVarargs2.java         |      2 +-
     housekeeping/OverloadingVarargs3.java         |      2 +-
     housekeeping/PassingThis.java                 |      2 +-
     housekeeping/PrimitiveOverloading.java        |      2 +-
     housekeeping/SimpleConstructor.java           |      2 +-
     housekeeping/SimpleConstructor2.java          |      2 +-
     housekeeping/SimpleEnumUse.java               |      2 +-
     housekeeping/Spiciness.java                   |      2 +-
     housekeeping/Spoon.java                       |      2 +-
     housekeeping/StaticInitialization.java        |      2 +-
     housekeeping/TerminationCondition.java        |      5 +-
     housekeeping/VarArgs.java                     |      4 +-
     housekeeping/VarargType.java                  |      2 +-
     innerclasses/AnonymousConstructor.java        |      5 +-
     innerclasses/BigEgg.java                      |      2 +-
     innerclasses/BigEgg2.java                     |      5 +-
     innerclasses/Callbacks.java                   |     11 +-
     innerclasses/ClassInInterface.java            |      5 +-
     innerclasses/Contents.java                    |      2 +-
     innerclasses/Destination.java                 |      2 +-
     innerclasses/DotNew.java                      |      2 +-
     innerclasses/DotThis.java                     |      2 +-
     innerclasses/GreenhouseController.java        |      2 +-
     innerclasses/GreenhouseControls.java          |     53 +-
     innerclasses/InheritInner.java                |      2 +-
     innerclasses/LocalInnerClass.java             |      8 +-
     innerclasses/MultiImplementation.java         |      2 +-
     innerclasses/MultiNestingAccess.java          |      2 +-
     innerclasses/Parcel1.java                     |      2 +-
     innerclasses/Parcel10.java                    |      2 +-
     innerclasses/Parcel11.java                    |      5 +-
     innerclasses/Parcel2.java                     |      2 +-
     innerclasses/Parcel3.java                     |      2 +-
     innerclasses/Parcel5.java                     |      2 +-
     innerclasses/Parcel6.java                     |      2 +-
     innerclasses/Parcel7.java                     |      5 +-
     innerclasses/Parcel7b.java                    |      5 +-
     innerclasses/Parcel8.java                     |      9 +-
     innerclasses/Parcel9.java                     |      2 +-
     innerclasses/Sequence.java                    |      2 +-
     innerclasses/TestBed.java                     |      2 +-
     innerclasses/TestParcel.java                  |      5 +-
     innerclasses/Wrapping.java                    |      2 +-
     innerclasses/controller/Controller.java       |      2 +-
     innerclasses/controller/Event.java            |      2 +-
     innerclasses/mui/MultiInterfaces.java         |      2 +-
     interfaces/AbstractAccess.java                |      2 +-
     interfaces/AbstractWithoutAbstracts.java      |      2 +-
     interfaces/AdaptedRandomDoubles.java          |      5 +-
     interfaces/Adventure.java                     |      6 +-
     interfaces/AnImplementation.java              |      6 +-
     interfaces/AnInterface.java                   |      2 +-
     interfaces/Applicator.java                    |      2 +-
     interfaces/AttemptToUseBasic.java             |      2 +-
     interfaces/Basic.java                         |      2 +-
     interfaces/Basic2.java                        |      2 +-
     interfaces/Factories.java                     |     16 +-
     interfaces/Games.java                         |      8 +-
     interfaces/HorrorShow.java                    |     20 +-
     interfaces/Implementation2.java               |      6 +-
     interfaces/ImplementingAnInterface.java       |     10 +-
     interfaces/Instantiable.java                  |      8 +-
     interfaces/InterfaceCollision.java            |      5 +-
     interfaces/InterfaceWithDefault.java          |      2 +-
     interfaces/Jim.java                           |      7 +-
     interfaces/MICollision.java                   |      2 +-
     interfaces/Machine.java                       |      8 +-
     interfaces/Months.java                        |      2 +-
     interfaces/MultipleInheritance.java           |      2 +-
     interfaces/PureInterface.java                 |      2 +-
     interfaces/RandVals.java                      |      2 +-
     interfaces/RandomDoubles.java                 |      2 +-
     interfaces/RandomStrings.java                 |      5 +-
     interfaces/TestRandVals.java                  |      2 +-
     interfaces/filters/BandPass.java              |      2 +-
     interfaces/filters/Filter.java                |      2 +-
     interfaces/filters/HighPass.java              |      2 +-
     interfaces/filters/LowPass.java               |      2 +-
     interfaces/filters/Waveform.java              |      5 +-
     interfaces/interfaceprocessor/Applicator.java |      2 +-
     .../interfaceprocessor/FilterProcessor.java   |      2 +-
     interfaces/interfaceprocessor/Processor.java  |      2 +-
     .../interfaceprocessor/StringProcessor.java   |      8 +-
     interfaces/music4/Music4.java                 |     43 +-
     interfaces/music5/Music5.java                 |     27 +-
     interfaces/nesting/NestingInterfaces.java     |     38 +-
     iostreams/BasicFileOutput.java                |      2 +-
     iostreams/BufferedInputFile.java              |      2 +-
     iostreams/FileOutputShortcut.java             |      2 +-
     iostreams/FormattedMemoryInput.java           |      2 +-
     iostreams/MemoryInput.java                    |      2 +-
     iostreams/StoringAndRecoveringData.java       |      2 +-
     iostreams/TestEOF.java                        |      2 +-
     iostreams/UsingRandomAccessFile.java          |      2 +-
     javadoc/Documentation1.java                   |      2 +-
     javadoc/Documentation2.java                   |      2 +-
     javadoc/Documentation3.java                   |      2 +-
     javadoc/HelloDateDoc.java                     |      4 +-
     lowlevel/AtomicEvenProducer.java              |      5 +-
     lowlevel/AtomicIntegerTest.java               |      3 +-
     lowlevel/AtomicSerialNumbers.java             |      4 +-
     lowlevel/Atomicity.java                       |      2 +-
     lowlevel/AttemptLocking.java                  |      2 +-
     lowlevel/CaptureUncaughtException.java        |     14 +-
     lowlevel/CircularSet.java                     |      2 +-
     lowlevel/DelayQueueDemo.java                  |     19 +-
     lowlevel/EvenChecker.java                     |      5 +-
     lowlevel/EvenProducer.java                    |      7 +-
     lowlevel/ExceptionThread.java                 |      7 +-
     lowlevel/IntGenerator.java                    |      2 +-
     lowlevel/IntTestable.java                     |      5 +-
     lowlevel/MutexEvenProducer.java               |      5 +-
     lowlevel/NaiveExceptionHandling.java          |      4 +-
     lowlevel/NotAtomic.java                       |      2 +-
     lowlevel/NumberOfProcessors.java              |      2 +-
     lowlevel/PriorityBlockingQueueDemo.java       |     28 +-
     lowlevel/ReOrdering.java                      |      5 +-
     lowlevel/SafeReturn.java                      |      3 +-
     lowlevel/SerialNumberChecker.java             |      5 +-
     lowlevel/SerialNumberTest.java                |      7 +-
     lowlevel/SerialNumbers.java                   |      2 +-
     lowlevel/SettingDefaultHandler.java           |      2 +-
     lowlevel/SwallowedException.java              |      2 +-
     lowlevel/SyncOnObject.java                    |      2 +-
     lowlevel/SynchronizedComparison.java          |     32 +-
     lowlevel/SynchronizedEvenProducer.java        |      5 +-
     lowlevel/SynchronizedSerialNumbers.java       |      3 +-
     lowlevel/TestAbort.java                       |      2 +-
     lowlevel/ThreadSize.java                      |      5 +-
     lowlevel/UnsafeReturn.java                    |      5 +-
     lowlevel/WorkStealingPool.java                |     13 +-
     newio/AvailableCharSets.java                  |      8 +-
     newio/BufferToText.java                       |      2 +-
     newio/ChannelCopy.java                        |      2 +-
     newio/Endians.java                            |      2 +-
     newio/FileLocking.java                        |      2 +-
     newio/GetChannel.java                         |      2 +-
     newio/GetData.java                            |      2 +-
     newio/IntBufferDemo.java                      |      2 +-
     newio/LargeMappedFiles.java                   |      2 +-
     newio/LockingMappedFiles.java                 |      5 +-
     newio/MappedIO.java                           |     20 +-
     newio/TransferTo.java                         |      2 +-
     newio/UsingBuffers.java                       |      2 +-
     newio/ViewBuffers.java                        |      2 +-
     newio/data.txt                                |      1 +
     objects/HelloDate.java                        |      2 +-
     objects/ShowProperties.java                   |     22 +-
     onjava/ArrayShow.java                         |      2 +-
     onjava/BasicSupplier.java                     |      5 +-
     onjava/CollectionMethodDifferences.java       |      2 +-
     onjava/ConvertTo.java                         |      2 +-
     onjava/Count.java                             |     14 +-
     onjava/CountMap.java                          |     20 +-
     onjava/CountingIntegerList.java               |      8 +-
     onjava/Countries.java                         |     26 +-
     onjava/Enums.java                             |      2 +-
     onjava/FillMap.java                           |      2 +-
     onjava/HTMLColors.java                        |      2 +-
     onjava/MouseClick.java                        |      2 +-
     onjava/Nap.java                               |      2 +-
     onjava/Null.java                              |      2 +-
     onjava/OSExecute.java                         |      2 +-
     onjava/OSExecuteException.java                |      2 +-
     onjava/Operations.java                        |      2 +-
     onjava/Pair.java                              |      2 +-
     onjava/ProcessFiles.java                      |      2 +-
     onjava/Rand.java                              |     38 +-
     onjava/Range.java                             |      2 +-
     onjava/Repeat.java                            |      2 +-
     onjava/RmDir.java                             |      8 +-
     onjava/Sets.java                              |      2 +-
     onjava/Stack.java                             |      5 +-
     onjava/Suppliers.java                         |      2 +-
     onjava/TimedAbort.java                        |      2 +-
     onjava/Timer.java                             |      2 +-
     onjava/Tuple.java                             |      2 +-
     onjava/Tuple2.java                            |      5 +-
     onjava/Tuple3.java                            |      5 +-
     onjava/Tuple4.java                            |      5 +-
     onjava/Tuple5.java                            |      5 +-
     onjava/TypeCounter.java                       |      8 +-
     onjava/atunit/AtUnit.java                     |      5 +-
     onjava/atunit/ClassNameFinder.java            |      2 +-
     onjava/atunit/Test.java                       |      2 +-
     onjava/atunit/TestObjectCleanup.java          |      2 +-
     onjava/atunit/TestObjectCreate.java           |      2 +-
     onjava/atunit/TestProperty.java               |      2 +-
     operators/AllOps.java                         |      2 +-
     operators/Assignment.java                     |      2 +-
     operators/AutoInc.java                        |      2 +-
     operators/BitManipulation.java                |      2 +-
     operators/Bool.java                           |      2 +-
     operators/Casting.java                        |      2 +-
     operators/CastingNumbers.java                 |      2 +-
     operators/EqualsMethod.java                   |      2 +-
     operators/EqualsMethod2.java                  |      2 +-
     operators/Equivalence.java                    |      2 +-
     operators/Exponents.java                      |      2 +-
     operators/Literals.java                       |      2 +-
     operators/MathOps.java                        |      2 +-
     operators/Overflow.java                       |      2 +-
     operators/PassObject.java                     |      2 +-
     operators/Precedence.java                     |      2 +-
     operators/RoundingNumbers.java                |      2 +-
     operators/ShortCircuit.java                   |      2 +-
     operators/StringOperators.java                |      2 +-
     operators/TernaryIfElse.java                  |      2 +-
     operators/URShift.java                        |      2 +-
     operators/Underscores.java                    |      4 +-
     patterns/BoxObserver.java                     |      5 +-
     patterns/CommandPattern.java                  |      2 +-
     patterns/Facade.java                          |      2 +-
     patterns/PaperScissorsRock.java               |     53 +-
     patterns/ProxyDemo.java                       |      8 +-
     patterns/ShapeFactory1.java                   |      4 +-
     patterns/ShapeFactory2.java                   |      4 +-
     patterns/ShapeFactory3.java                   |      4 +-
     patterns/SingletonPattern.java                |      4 +-
     patterns/StateDemo.java                       |     20 +-
     patterns/TemplateMethod.java                  |      8 +-
     patterns/abstractfactory/GameEnvironment.java |      8 +-
     patterns/adapt/Adapter.java                   |     11 +-
     patterns/chain/ChainOfResponsibility.java     |      2 +-
     patterns/doubledispatch/Aluminum.java         |      2 +-
     patterns/doubledispatch/Cardboard.java        |      2 +-
     patterns/doubledispatch/DoubleDispatch.java   |     14 +-
     patterns/doubledispatch/Glass.java            |      2 +-
     patterns/doubledispatch/Paper.java            |      2 +-
     patterns/doubledispatch/TypedBin.java         |      2 +-
     patterns/doubledispatch/TypedBinMember.java   |      2 +-
     patterns/dynatrash/DynaTrash.java             |     12 +-
     patterns/observer/ObservedFlower.java         |      8 +-
     patterns/recyclea/RecycleA.java               |     11 +-
     patterns/recycleb/RecycleB.java               |      2 +-
     patterns/recyclec/RecycleC.java               |     10 +-
     patterns/shapes/BadShapeCreation.java         |      2 +-
     patterns/shapes/Circle.java                   |      2 +-
     patterns/shapes/FactoryMethod.java            |      2 +-
     patterns/shapes/FactoryTest.java              |      2 +-
     patterns/shapes/Shape.java                    |      5 +-
     patterns/shapes/Square.java                   |      2 +-
     patterns/shapes/Triangle.java                 |      2 +-
     patterns/state/StateMachineDemo.java          |     14 +-
     patterns/strategy/StrategyPattern.java        |      2 +-
     patterns/strategy/StrategyPattern2.java       |      2 +-
     patterns/trash/Aluminum.java                  |      5 +-
     patterns/trash/Cardboard.java                 |      5 +-
     patterns/trash/Fillable.java                  |      2 +-
     patterns/trash/FillableList.java              |      5 +-
     patterns/trash/Glass.java                     |      5 +-
     patterns/trash/Paper.java                     |      5 +-
     patterns/trash/ParseTrash.java                |      2 +-
     patterns/trash/Trash.java                     |      5 +-
     patterns/trashvisitor/Aluminum.java           |      5 +-
     patterns/trashvisitor/Cardboard.java          |      5 +-
     patterns/trashvisitor/Glass.java              |      5 +-
     patterns/trashvisitor/Paper.java              |      5 +-
     patterns/trashvisitor/TrashVisitor.java       |     32 +-
     patterns/trashvisitor/Visitable.java          |      2 +-
     patterns/trashvisitor/Visitor.java            |      2 +-
     patterns/visitor/BeeAndFlowers.java           |     23 +-
     polymorphism/CovariantReturn.java             |     17 +-
     polymorphism/FieldAccess.java                 |      5 +-
     polymorphism/Frog.java                        |     11 +-
     polymorphism/PolyConstructors.java            |      5 +-
     polymorphism/PrivateOverride.java             |      2 +-
     polymorphism/PrivateOverride2.java            |      7 +-
     polymorphism/RTTI.java                        |     10 +-
     polymorphism/ReferenceCounting.java           |      8 +-
     polymorphism/Sandwich.java                    |      2 +-
     polymorphism/Shapes.java                      |      2 +-
     polymorphism/StaticPolymorphism.java          |      5 +-
     polymorphism/Transmogrify.java                |      8 +-
     polymorphism/music/Instrument.java            |      2 +-
     polymorphism/music/Music.java                 |      2 +-
     polymorphism/music/Music2.java                |      8 +-
     polymorphism/music/Note.java                  |      2 +-
     polymorphism/music/Wind.java                  |      5 +-
     polymorphism/music3/Music3.java               |     41 +-
     polymorphism/shape/Circle.java                |      8 +-
     polymorphism/shape/RandomShapes.java          |      2 +-
     polymorphism/shape/Shape.java                 |      2 +-
     polymorphism/shape/Square.java                |      8 +-
     polymorphism/shape/Triangle.java              |      8 +-
     references/AddingClone.java                   |      8 +-
     references/Alias1.java                        |      6 +-
     references/Alias2.java                        |      2 +-
     references/CheckCloneable.java                |      5 +-
     references/CloneArrayList.java                |      5 +-
     references/Compete.java                       |     12 +-
     references/CopyConstructor.java               |      6 +-
     references/DepthReading.java                  |      8 +-
     references/HorrorFlick.java                   |      5 +-
     references/Immutable1.java                    |      2 +-
     references/Immutable2.java                    |      2 +-
     references/ImmutableInteger.java              |      2 +-
     references/ImmutableStrings.java              |      2 +-
     references/LocalCopy.java                     |     10 +-
     references/MutableInteger.java                |      5 +-
     references/OceanReading.java                  |      8 +-
     references/PassReferences.java                |      6 +-
     references/SimplerMutableInteger.java         |      2 +-
     references/Snake.java                         |      8 +-
     references/Stringer.java                      |      2 +-
     references/TemperatureReading.java            |      8 +-
     references/tests/DeepCopyTest.java            |      2 +-
     reuse/Bath.java                               |      8 +-
     reuse/Beetle.java                             |      2 +-
     reuse/BlankFinal.java                         |      2 +-
     reuse/CADSystem.java                          |     14 +-
     reuse/Car.java                                |      2 +-
     reuse/Cartoon.java                            |      2 +-
     reuse/Chess.java                              |      2 +-
     reuse/DerivedSpaceShip.java                   |      7 +-
     reuse/Detergent.java                          |      8 +-
     reuse/FinalArguments.java                     |      2 +-
     reuse/FinalData.java                          |      5 +-
     reuse/FinalOverridingIllusion.java            |      2 +-
     reuse/Hide.java                               |      2 +-
     reuse/Jurassic.java                           |      2 +-
     reuse/Lisa.java                               |      2 +-
     reuse/Orc.java                                |      8 +-
     reuse/PlaceSetting.java                       |      2 +-
     reuse/SpaceShipControls.java                  |      2 +-
     reuse/SpaceShipDelegation.java                |      2 +-
     reuse/SprinklerSystem.java                    |     10 +-
     reuse/Wind.java                               |      2 +-
     serialization/APerson.java                    |      5 +-
     serialization/AStoreCADState.java             |     16 +-
     serialization/Alien.java                      |      2 +-
     serialization/Blip3.java                      |     11 +-
     serialization/Blips.java                      |      2 +-
     serialization/FreezeAlien.java                |      2 +-
     serialization/Logon.java                      |     11 +-
     serialization/MyWorld.java                    |     33 +-
     serialization/People.java                     |      2 +-
     serialization/RecoverCADState.java            |      2 +-
     serialization/SerialCtl.java                  |      7 +-
     serialization/Worm.java                       |      8 +-
     serialization/xfiles/ThawAlien.java           |      2 +-
     standardio/ChangeSystemOut.java               |      2 +-
     standardio/Echo.java                          |      2 +-
     standardio/OSExecuteDemo.java                 |      2 +-
     standardio/Redirecting.java                   |      2 +-
     staticchecking/DogsAndRobots.cpp              |      2 +-
     staticchecking/DogsAndRobots.py               |      2 +-
     staticchecking/NoBasePetSpeak.py              |      2 +-
     staticchecking/PetSpeak.py                    |      2 +-
     staticchecking/dogsandrobots.go               |      2 +-
     staticchecking/dr/DogsAndRobots.java          |      6 +-
     .../drc/DogAndRobotCollections.java           |      2 +-
     staticchecking/latent/Latent.java             |      3 +-
     staticchecking/petspeak.go                    |      2 +-
     staticchecking/petspeak/PetSpeak.java         |      6 +-
     streams/ArrayStreams.java                     |      2 +-
     streams/Bubble.java                           |      5 +-
     streams/Bubbles.java                          |      2 +-
     streams/CollectionToStream.java               |      2 +-
     streams/CreatingOptionals.java                |      2 +-
     streams/Duplicator.java                       |      2 +-
     streams/Fibonacci.java                        |      2 +-
     streams/FileToWords.java                      |      2 +-
     streams/FileToWordsBuilder.java               |      2 +-
     streams/FileToWordsRegexp.java                |      2 +-
     streams/FileToWordsTest.java                  |      2 +-
     streams/FlatMap.java                          |      2 +-
     streams/ForEach.java                          |      4 +-
     streams/FunctionMap.java                      |      2 +-
     streams/FunctionMap2.java                     |      5 +-
     streams/FunctionMap3.java                     |      2 +-
     streams/Generator.java                        |      4 +-
     streams/ImperativeRandoms.java                |      2 +-
     streams/Informational.java                    |      2 +-
     streams/LastElement.java                      |      2 +-
     streams/Looping.java                          |      2 +-
     streams/Machine2.java                         |      2 +-
     streams/MapCollector.java                     |      5 +-
     streams/Matching.java                         |      2 +-
     streams/NumericStreamInfo.java                |      2 +-
     streams/OptionalBasics.java                   |      2 +-
     streams/OptionalFilter.java                   |      2 +-
     streams/OptionalFlatMap.java                  |      2 +-
     streams/OptionalMap.java                      |      2 +-
     streams/Optionals.java                        |      2 +-
     streams/OptionalsFromEmptyStreams.java        |      2 +-
     streams/Peeking.java                          |      2 +-
     streams/Prime.java                            |      2 +-
     streams/RandInts.java                         |      2 +-
     streams/RandomGenerators.java                 |      2 +-
     streams/RandomWords.java                      |      7 +-
     streams/Randoms.java                          |      2 +-
     streams/Ranges.java                           |      2 +-
     streams/Reduce.java                           |      5 +-
     streams/SelectElement.java                    |      2 +-
     streams/Signal.java                           |      5 +-
     streams/SortedComparator.java                 |      2 +-
     streams/SpecialCollector.java                 |      2 +-
     streams/StreamOf.java                         |      2 +-
     streams/StreamOfOptionals.java                |      2 +-
     streams/StreamOfRandoms.java                  |      2 +-
     streams/StreamOfStreams.java                  |      2 +-
     streams/TreeSetOfWords.java                   |      2 +-
     strings/ArrayListDisplay.java                 |      2 +-
     strings/BetterRead.java                       |      2 +-
     strings/Concatenation.java                    |      2 +-
     strings/Conversion.java                       |      6 +-
     strings/DatabaseException.java                |      2 +-
     strings/Finding.java                          |      2 +-
     strings/Groups.java                           |      2 +-
     strings/Hex.java                              |      2 +-
     strings/Immutable.java                        |      2 +-
     strings/InfiniteRecursion.java                |      5 +-
     strings/IntegerMatch.java                     |      2 +-
     strings/JGrep.java                            |      2 +-
     strings/ReFlags.java                          |      2 +-
     strings/ReceiptBuilder.java                   |      2 +-
     strings/Replacing.java                        |      2 +-
     strings/ReplacingStringTokenizer.java         |      2 +-
     strings/Resetting.java                        |      2 +-
     strings/Rudolph.java                          |      2 +-
     strings/ScannerDelimiter.java                 |      2 +-
     strings/SimpleFormat.java                     |      2 +-
     strings/SimpleRead.java                       |      2 +-
     strings/SplitDemo.java                        |      2 +-
     strings/Splitting.java                        |      2 +-
     strings/StartEnd.java                         |      2 +-
     strings/TestRegularExpression.java            |      2 +-
     strings/TheReplacements.java                  |      2 +-
     strings/ThreatAnalyzer.java                   |      2 +-
     strings/Turtle.java                           |      2 +-
     strings/UsingStringBuilder.java               |      2 +-
     strings/WhitherStringBuilder.java             |      2 +-
     typeinfo/AnonymousImplementation.java         |      4 +-
     typeinfo/BoundedClassReferences.java          |      2 +-
     typeinfo/ClassCasts.java                      |      2 +-
     typeinfo/ClassInitialization.java             |      6 +-
     typeinfo/DynamicSupplier.java                 |     19 +-
     typeinfo/FamilyVsExactType.java               |      2 +-
     typeinfo/GenericClassReferences.java          |      4 +-
     typeinfo/HiddenImplementation.java            |      2 +-
     typeinfo/ID2.java                             |     27 +
     typeinfo/InnerImplementation.java             |      4 +-
     typeinfo/InterfaceViolation.java              |      4 +-
     typeinfo/ModifyingPrivateFields.java          |      5 +-
     typeinfo/NullRobot.java                       |     16 +-
     typeinfo/Operation.java                       |      2 +-
     typeinfo/Person.java                          |      5 +-
     typeinfo/PetCount.java                        |     65 -
     typeinfo/PetCounter.java                      |     64 +
     typeinfo/{PetCount2.java => PetCounter2.java} |      8 +-
     typeinfo/{PetCount3.java => PetCounter3.java} |     22 +-
     typeinfo/{PetCount4.java => PetCounter4.java} |     14 +-
     typeinfo/Position.java                        |      5 +-
     typeinfo/RegisteredFactories.java             |     16 +-
     typeinfo/Robot.java                           |      2 +-
     typeinfo/SelectingMethods.java                |     17 +-
     typeinfo/Shapes.java                          |     24 +-
     typeinfo/ShowMethods.java                     |      4 +-
     typeinfo/SimpleDynamicProxy.java              |      7 +-
     typeinfo/SimpleProxyDemo.java                 |     14 +-
     .../{SnowRemovalRobot.java => SnowRobot.java} |     19 +-
     typeinfo/Staff.java                           |      2 +-
     typeinfo/SweetShop.java                       |      2 +-
     typeinfo/WildcardClassReferences.java         |      2 +-
     typeinfo/interfacea/A.java                    |      2 +-
     typeinfo/packageaccess/HiddenC.java           |      5 +-
     typeinfo/pets/Cat.java                        |      2 +-
     typeinfo/pets/Creator.java                    |     38 +
     typeinfo/pets/Cymric.java                     |      2 +-
     typeinfo/pets/Dog.java                        |      2 +-
     typeinfo/pets/EgyptianMau.java                |      2 +-
     ...ameCreator.java => ForNamePetCreator.java} |      9 +-
     typeinfo/pets/Hamster.java                    |      2 +-
     typeinfo/pets/Individual.java                 |     14 +-
     typeinfo/pets/LiteralPetCreator.java          |     39 -
     typeinfo/pets/Manx.java                       |      2 +-
     typeinfo/pets/Mouse.java                      |      2 +-
     typeinfo/pets/Mutt.java                       |      2 +-
     typeinfo/pets/Person.java                     |      2 +-
     typeinfo/pets/Pet.java                        |      2 +-
     typeinfo/pets/PetCreator.java                 |     54 +-
     typeinfo/pets/Pets.java                       |     30 -
     typeinfo/pets/Pug.java                        |      2 +-
     typeinfo/pets/Rat.java                        |      2 +-
     typeinfo/pets/Rodent.java                     |      2 +-
     typeinfo/toys/GenericToyTest.java             |     15 +-
     typeinfo/toys/ToyTest.java                    |     10 +-
     validating/Assert1.java                       |      2 +-
     validating/Assert2.java                       |      2 +-
     validating/BadMicroBenchmark.java             |      5 +-
     validating/BadMicroBenchmark2.java            |     10 +-
     validating/CircularQueue.java                 |      2 +-
     validating/CircularQueueException.java        |      2 +-
     validating/CountedList.java                   |      2 +-
     validating/GuavaAssertions.java               |      2 +-
     validating/GuavaPreconditions.java            |      2 +-
     validating/Inverter1.java                     |      3 +-
     validating/Inverter2.java                     |      4 +-
     validating/Inverter3.java                     |      4 +-
     validating/Inverter4.java                     |      4 +-
     validating/LoaderAssertions.java              |      2 +-
     validating/NonNullConstruction.java           |      2 +-
     validating/SLF4JLevels.java                   |     12 +-
     validating/SLF4JLogging.java                  |      4 +-
     validating/SimpleDebugging.java               |      2 +-
     validating/StringInverter.java                |      2 +-
     validating/jmh/JMH1.java                      |      2 +-
     validating/jmh/JMH2.java                      |      2 +-
     validating/jmh/JMH3.java                      |      2 +-
     validating/tests/CircularQueueTest.java       |      2 +-
     validating/tests/CountedListTest.java         |      2 +-
     .../tests/DynamicStringInverterTests.java     |      2 +-
     validating/tests/StringInverterTests.java     |      2 +-
     1034 files changed, 102355 insertions(+), 2768 deletions(-)
     delete mode 100644 CI.txt
     create mode 100644 concurrent/PSP2.txt
     create mode 100644 concurrent/primes.txt
     create mode 100644 newio/data.txt
     create mode 100644 typeinfo/ID2.java
     delete mode 100644 typeinfo/PetCount.java
     create mode 100644 typeinfo/PetCounter.java
     rename typeinfo/{PetCount2.java => PetCounter2.java} (75%)
     rename typeinfo/{PetCount3.java => PetCounter3.java} (75%)
     rename typeinfo/{PetCount4.java => PetCounter4.java} (70%)
     rename typeinfo/{SnowRemovalRobot.java => SnowRobot.java} (73%)
     create mode 100644 typeinfo/pets/Creator.java
     rename typeinfo/pets/{ForNameCreator.java => ForNamePetCreator.java} (82%)
     delete mode 100644 typeinfo/pets/LiteralPetCreator.java
     delete mode 100644 typeinfo/pets/Pets.java
    
    diff --git a/CI.txt b/CI.txt
    deleted file mode 100644
    index 524ee206d..000000000
    --- a/CI.txt
    +++ /dev/null
    @@ -1,5 +0,0 @@
    -Links formerly in the README. Both of these mysteriously started breaking.
    -
    -[![](https://travis-ci.org/BruceEckel/OnJava8-Examples.svg?branch=master)](https://travis-ci.org/BruceEckel/OnJava8-Examples)
    -
    -[![](https://ci.appveyor.com/api/projects/status/github/BruceEckel/OnJava8-Examples)](https://ci.appveyor.com/project/BruceEckel/onjava-examples)
    diff --git a/Copyright.txt b/Copyright.txt
    index f0d35035f..8eb3289e0 100644
    --- a/Copyright.txt
    +++ b/Copyright.txt
    @@ -1,5 +1,5 @@
     // Copyright.txt
    -This computer source code is Copyright ©2020 MindView LLC.
    +This computer source code is Copyright ©2021 MindView LLC.
     All Rights Reserved.
     
     Permission to use, copy, modify, and distribute this
    diff --git a/annotations/AUComposition.java b/annotations/AUComposition.java
    index ee43e88d3..94d51e607 100644
    --- a/annotations/AUComposition.java
    +++ b/annotations/AUComposition.java
    @@ -1,5 +1,5 @@
     // annotations/AUComposition.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Creating non-embedded tests
    @@ -23,8 +23,8 @@ boolean tMethodTwo() {
     }
     /* Output:
     annotations.AUComposition
    +  . tMethodOne
       . tMethodTwo This is methodTwo
     
    -  . tMethodOne
     OK (2 tests)
     */
    diff --git a/annotations/AUExternalTest.java b/annotations/AUExternalTest.java
    index cce5c4292..71c8f2f4b 100644
    --- a/annotations/AUExternalTest.java
    +++ b/annotations/AUExternalTest.java
    @@ -1,5 +1,5 @@
     // annotations/AUExternalTest.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Creating non-embedded tests
    diff --git a/annotations/AtUnitExample1.java b/annotations/AtUnitExample1.java
    index 3b1f6fece..de4cc6c64 100644
    --- a/annotations/AtUnitExample1.java
    +++ b/annotations/AtUnitExample1.java
    @@ -1,5 +1,5 @@
     // annotations/AtUnitExample1.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // {java onjava.atunit.AtUnit
    @@ -34,15 +34,15 @@ boolean anotherDisappointment() {
     }
     /* Output:
     annotations.AtUnitExample1
    -  . m3
    +  . anotherDisappointment (failed)
       . methodOneTest
    +  . failureTest (failed)
       . m2 This is methodTwo
     
    -  . failureTest (failed)
    -  . anotherDisappointment (failed)
    +  . m3
     (5 tests)
     
     >>> 2 FAILURES <<<
    -  annotations.AtUnitExample1: failureTest
       annotations.AtUnitExample1: anotherDisappointment
    +  annotations.AtUnitExample1: failureTest
     */
    diff --git a/annotations/AtUnitExample2.java b/annotations/AtUnitExample2.java
    index bf3f1d5cb..855c33133 100644
    --- a/annotations/AtUnitExample2.java
    +++ b/annotations/AtUnitExample2.java
    @@ -1,5 +1,5 @@
     // annotations/AtUnitExample2.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Assertions and exceptions can be used in @Tests
    @@ -40,18 +40,18 @@ boolean assertAndReturn() {
     }
     /* Output:
     annotations.AtUnitExample2
    +  . assertFailureExample java.lang.AssertionError: What
    +a surprise!
    +(failed)
    +  . assertExample
       . exceptionExample java.io.FileNotFoundException:
     nofile.txt (The system cannot find the file specified)
     (failed)
    -  . assertExample
       . assertAndReturn This is methodTwo
     
    -  . assertFailureExample java.lang.AssertionError: What
    -a surprise!
    -(failed)
     (4 tests)
     
     >>> 2 FAILURES <<<
    -  annotations.AtUnitExample2: exceptionExample
       annotations.AtUnitExample2: assertFailureExample
    +  annotations.AtUnitExample2: exceptionExample
     */
    diff --git a/annotations/AtUnitExample3.java b/annotations/AtUnitExample3.java
    index 02092591b..ed1a93911 100644
    --- a/annotations/AtUnitExample3.java
    +++ b/annotations/AtUnitExample3.java
    @@ -1,5 +1,5 @@
     // annotations/AtUnitExample3.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // {java onjava.atunit.AtUnit
    @@ -35,8 +35,8 @@ boolean methodOneTest() {
     /* Output:
     annotations.AtUnitExample3
       . initialization
    +  . methodOneTest
       . m2 This is methodTwo
     
    -  . methodOneTest
     OK (3 tests)
     */
    diff --git a/annotations/AtUnitExample4.java b/annotations/AtUnitExample4.java
    index 6b644b178..23bc21efb 100644
    --- a/annotations/AtUnitExample4.java
    +++ b/annotations/AtUnitExample4.java
    @@ -1,5 +1,5 @@
     // annotations/AtUnitExample4.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // {java onjava.atunit.AtUnit
    diff --git a/annotations/AtUnitExample5.java b/annotations/AtUnitExample5.java
    index d7cf95dfc..4e4ceb4f4 100644
    --- a/annotations/AtUnitExample5.java
    +++ b/annotations/AtUnitExample5.java
    @@ -1,5 +1,5 @@
     // annotations/AtUnitExample5.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // {java onjava.atunit.AtUnit
    @@ -14,8 +14,7 @@ public class AtUnitExample5 {
       public AtUnitExample5(String text) {
         this.text = text;
       }
    -  @Override
    -  public String toString() { return text; }
    +  @Override public String toString() { return text; }
       @TestProperty
       static PrintWriter output;
       @TestProperty
    diff --git a/annotations/DemoProcessFiles.java b/annotations/DemoProcessFiles.java
    index 6e2505373..13f12bbf5 100644
    --- a/annotations/DemoProcessFiles.java
    +++ b/annotations/DemoProcessFiles.java
    @@ -1,5 +1,5 @@
     // annotations/DemoProcessFiles.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import onjava.ProcessFiles;
    diff --git a/annotations/HashSetTest.java b/annotations/HashSetTest.java
    index 8dfa8a9c6..5b6e7541a 100644
    --- a/annotations/HashSetTest.java
    +++ b/annotations/HashSetTest.java
    @@ -1,5 +1,5 @@
     // annotations/HashSetTest.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // {java onjava.atunit.AtUnit
    @@ -29,8 +29,8 @@ void tRemove() {
     }
     /* Output:
     annotations.HashSetTest
    +  . tContains
       . initialization
       . tRemove
    -  . tContains
     OK (3 tests)
     */
    diff --git a/annotations/PasswordUtils.java b/annotations/PasswordUtils.java
    index 74a6df78e..549412696 100644
    --- a/annotations/PasswordUtils.java
    +++ b/annotations/PasswordUtils.java
    @@ -1,5 +1,5 @@
     // annotations/PasswordUtils.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    diff --git a/annotations/SimulatingNull.java b/annotations/SimulatingNull.java
    index 8166802bc..af1282f88 100644
    --- a/annotations/SimulatingNull.java
    +++ b/annotations/SimulatingNull.java
    @@ -1,5 +1,5 @@
     // annotations/SimulatingNull.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.lang.annotation.*;
    diff --git a/annotations/StackL.java b/annotations/StackL.java
    index 6ff806aff..246454c25 100644
    --- a/annotations/StackL.java
    +++ b/annotations/StackL.java
    @@ -1,5 +1,5 @@
     // annotations/StackL.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // A stack built on a LinkedList
    diff --git a/annotations/StackLStringTst.java b/annotations/StackLStringTst.java
    index 49aef9b76..b7d8250f7 100644
    --- a/annotations/StackLStringTst.java
    +++ b/annotations/StackLStringTst.java
    @@ -1,5 +1,5 @@
     // annotations/StackLStringTst.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Applying @Unit to generics
    @@ -35,8 +35,8 @@ void tTop() {
     }
     /* Output:
     annotations.StackLStringTst
    +  . tPop
       . tTop
       . tPush
    -  . tPop
     OK (3 tests)
     */
    diff --git a/annotations/Testable.java b/annotations/Testable.java
    index bc48f4161..b23d0e620 100644
    --- a/annotations/Testable.java
    +++ b/annotations/Testable.java
    @@ -1,5 +1,5 @@
     // annotations/Testable.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package annotations;
    diff --git a/annotations/UseCase.java b/annotations/UseCase.java
    index dfce31490..c65735185 100644
    --- a/annotations/UseCase.java
    +++ b/annotations/UseCase.java
    @@ -1,5 +1,5 @@
     // annotations/UseCase.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.lang.annotation.*;
    diff --git a/annotations/UseCaseTracker.java b/annotations/UseCaseTracker.java
    index 5489b762b..53cc92795 100644
    --- a/annotations/UseCaseTracker.java
    +++ b/annotations/UseCaseTracker.java
    @@ -1,5 +1,5 @@
     // annotations/UseCaseTracker.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    @@ -27,11 +27,11 @@ public static void main(String[] args) {
       }
     }
     /* Output:
    +Found Use Case 49
    +  New passwords can't equal previously used ones
     Found Use Case 48
       no description
     Found Use Case 47
       Passwords must contain at least one numeric
    -Found Use Case 49
    -  New passwords can't equal previously used ones
     Missing use case 50
     */
    diff --git a/annotations/database/Constraints.java b/annotations/database/Constraints.java
    index 4e4e40fc8..5631f52e9 100644
    --- a/annotations/database/Constraints.java
    +++ b/annotations/database/Constraints.java
    @@ -1,5 +1,5 @@
     // annotations/database/Constraints.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package annotations.database;
    diff --git a/annotations/database/DBTable.java b/annotations/database/DBTable.java
    index 9aa5562f4..3d345d990 100644
    --- a/annotations/database/DBTable.java
    +++ b/annotations/database/DBTable.java
    @@ -1,5 +1,5 @@
     // annotations/database/DBTable.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package annotations.database;
    diff --git a/annotations/database/Member.java b/annotations/database/Member.java
    index d722a3b10..ae5723ac8 100644
    --- a/annotations/database/Member.java
    +++ b/annotations/database/Member.java
    @@ -1,5 +1,5 @@
     // annotations/database/Member.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package annotations.database;
    @@ -16,7 +16,8 @@ public class Member {
       public String getReference() { return reference; }
       public String getFirstName() { return firstName; }
       public String getLastName() { return lastName; }
    -  @Override
    -  public String toString() { return reference; }
    +  @Override public String toString() {
    +    return reference;
    +  }
       public Integer getAge() { return age; }
     }
    diff --git a/annotations/database/SQLInteger.java b/annotations/database/SQLInteger.java
    index 635a907cd..4df1e7dd6 100644
    --- a/annotations/database/SQLInteger.java
    +++ b/annotations/database/SQLInteger.java
    @@ -1,5 +1,5 @@
     // annotations/database/SQLInteger.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package annotations.database;
    diff --git a/annotations/database/SQLString.java b/annotations/database/SQLString.java
    index dac9919f5..c452d1e95 100644
    --- a/annotations/database/SQLString.java
    +++ b/annotations/database/SQLString.java
    @@ -1,5 +1,5 @@
     // annotations/database/SQLString.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package annotations.database;
    diff --git a/annotations/database/TableCreator.java b/annotations/database/TableCreator.java
    index 53322fc72..d2be7c5e1 100644
    --- a/annotations/database/TableCreator.java
    +++ b/annotations/database/TableCreator.java
    @@ -1,5 +1,5 @@
     // annotations/database/TableCreator.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Reflection-based annotation processor
    diff --git a/annotations/database/Uniqueness.java b/annotations/database/Uniqueness.java
    index 1aa1a36c9..7959fe700 100644
    --- a/annotations/database/Uniqueness.java
    +++ b/annotations/database/Uniqueness.java
    @@ -1,5 +1,5 @@
     // annotations/database/Uniqueness.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Sample of nested annotations
    diff --git a/annotations/ifx/ExtractInterface.java b/annotations/ifx/ExtractInterface.java
    index 70a94bf58..c823fe9ca 100644
    --- a/annotations/ifx/ExtractInterface.java
    +++ b/annotations/ifx/ExtractInterface.java
    @@ -1,5 +1,5 @@
     // annotations/ifx/ExtractInterface.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // javac-based annotation processing
    diff --git a/annotations/ifx/IfaceExtractorProcessor.java b/annotations/ifx/IfaceExtractorProcessor.java
    index d17156f88..fae22607c 100644
    --- a/annotations/ifx/IfaceExtractorProcessor.java
    +++ b/annotations/ifx/IfaceExtractorProcessor.java
    @@ -1,5 +1,5 @@
     // annotations/ifx/IfaceExtractorProcessor.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // javac-based annotation processing
    @@ -21,14 +21,12 @@ public class IfaceExtractorProcessor
         interfaceMethods = new ArrayList<>();
       Elements elementUtils;
       private ProcessingEnvironment processingEnv;
    -  @Override
    -  public void init(
    +  @Override public void init(
         ProcessingEnvironment processingEnv) {
         this.processingEnv = processingEnv;
         elementUtils = processingEnv.getElementUtils();
       }
    -  @Override
    -  public boolean process(
    +  @Override public boolean process(
         Set annotations,
         RoundEnvironment env) {
         for(Element elem:env.getElementsAnnotatedWith(
    diff --git a/annotations/ifx/Multiplier.java b/annotations/ifx/Multiplier.java
    index b5b99a1b8..25678fd5a 100644
    --- a/annotations/ifx/Multiplier.java
    +++ b/annotations/ifx/Multiplier.java
    @@ -1,5 +1,5 @@
     // annotations/ifx/Multiplier.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // javac-based annotation processing
    diff --git a/annotations/simplest/Simple.java b/annotations/simplest/Simple.java
    index 0dc555ce5..101b7900a 100644
    --- a/annotations/simplest/Simple.java
    +++ b/annotations/simplest/Simple.java
    @@ -1,5 +1,5 @@
     // annotations/simplest/Simple.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // A bare-bones annotation
    diff --git a/annotations/simplest/SimpleProcessor.java b/annotations/simplest/SimpleProcessor.java
    index a85d8987a..1dda51955 100644
    --- a/annotations/simplest/SimpleProcessor.java
    +++ b/annotations/simplest/SimpleProcessor.java
    @@ -1,5 +1,5 @@
     // annotations/simplest/SimpleProcessor.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // A bare-bones annotation processor
    @@ -14,8 +14,7 @@
     @SupportedSourceVersion(SourceVersion.RELEASE_8)
     public class SimpleProcessor
     extends AbstractProcessor {
    -  @Override
    -  public boolean process(
    +  @Override public boolean process(
         Set annotations,
         RoundEnvironment env) {
         for(TypeElement t : annotations)
    diff --git a/annotations/simplest/SimpleTest.java b/annotations/simplest/SimpleTest.java
    index 689d12fdc..e97d5871e 100644
    --- a/annotations/simplest/SimpleTest.java
    +++ b/annotations/simplest/SimpleTest.java
    @@ -1,5 +1,5 @@
     // annotations/simplest/SimpleTest.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Test the "Simple" annotation
    diff --git a/arrays/AlphabeticSearch.java b/arrays/AlphabeticSearch.java
    index 70adc8ff5..a6dea2c2e 100644
    --- a/arrays/AlphabeticSearch.java
    +++ b/arrays/AlphabeticSearch.java
    @@ -1,5 +1,5 @@
     // arrays/AlphabeticSearch.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Searching with a Comparator import
    diff --git a/arrays/ArrayCopying.java b/arrays/ArrayCopying.java
    index c68c2a0d6..b5dc136f8 100644
    --- a/arrays/ArrayCopying.java
    +++ b/arrays/ArrayCopying.java
    @@ -1,5 +1,5 @@
     // arrays/ArrayCopying.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Demonstrate Arrays.copy() and Arrays.copyOf()
    @@ -10,8 +10,7 @@
     class Sup { // Superclass
       private int id;
       Sup(int n) { id = n; }
    -  @Override
    -  public String toString() {
    +  @Override public String toString() {
         return getClass().getSimpleName() + id;
       }
     }
    @@ -26,21 +25,21 @@ public static void main(String[] args) {
         int[] a1 = new int[SZ];
         Arrays.setAll(a1, new Count.Integer()::get);
         show("a1", a1);
    -    int[] a2 = Arrays.copyOf(a1, a1.length); // [1]
    +    int[] a2 = Arrays.copyOf(a1, a1.length);   // [1]
         // Prove they are distinct arrays:
         Arrays.fill(a1, 1);
         show("a1", a1);
         show("a2", a2);
     
         // Create a shorter result:
    -    a2 = Arrays.copyOf(a2, a2.length/2); // [2]
    +    a2 = Arrays.copyOf(a2, a2.length/2);       // [2]
         show("a2", a2);
         // Allocate more space:
         a2 = Arrays.copyOf(a2, a2.length + 5);
         show("a2", a2);
     
         // Also copies wrapped arrays:
    -    Integer[] a3 = new Integer[SZ]; // [3]
    +    Integer[] a3 = new Integer[SZ];            // [3]
         Arrays.setAll(a3, new Count.Integer()::get);
         Integer[] a4 = Arrays.copyOfRange(a3, 4, 12);
         show("a4", a4);
    @@ -62,7 +61,7 @@ public static void main(String[] args) {
         Arrays.setAll(b2, Sup::new);
         try {
           Sub[] d3 = Arrays.copyOf(
    -        b2, b2.length, Sub[].class); // [6]
    +        b2, b2.length, Sub[].class);           // [6]
         } catch(Exception e) {
           System.out.println(e);
         }
    diff --git a/arrays/ArrayOfGenericType.java b/arrays/ArrayOfGenericType.java
    index 68f9e8de1..6c2df8468 100644
    --- a/arrays/ArrayOfGenericType.java
    +++ b/arrays/ArrayOfGenericType.java
    @@ -1,5 +1,5 @@
     // arrays/ArrayOfGenericType.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
    diff --git a/arrays/ArrayOfGenerics.java b/arrays/ArrayOfGenerics.java
    index 79971d7ab..8040dfa1f 100644
    --- a/arrays/ArrayOfGenerics.java
    +++ b/arrays/ArrayOfGenerics.java
    @@ -1,5 +1,5 @@
     // arrays/ArrayOfGenerics.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    diff --git a/arrays/ArrayOptions.java b/arrays/ArrayOptions.java
    index bb6cbfbb6..c313d9a29 100644
    --- a/arrays/ArrayOptions.java
    +++ b/arrays/ArrayOptions.java
    @@ -1,5 +1,5 @@
     // arrays/ArrayOptions.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Initialization & re-assignment of arrays
    diff --git a/arrays/ArraySearching.java b/arrays/ArraySearching.java
    index fb4085e9b..deae72faf 100644
    --- a/arrays/ArraySearching.java
    +++ b/arrays/ArraySearching.java
    @@ -1,5 +1,5 @@
     // arrays/ArraySearching.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Using Arrays.binarySearch()
    diff --git a/arrays/AssemblingMultidimensionalArrays.java b/arrays/AssemblingMultidimensionalArrays.java
    index e79302b30..945c338e4 100644
    --- a/arrays/AssemblingMultidimensionalArrays.java
    +++ b/arrays/AssemblingMultidimensionalArrays.java
    @@ -1,5 +1,5 @@
     // arrays/AssemblingMultidimensionalArrays.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Creating multidimensional arrays
    diff --git a/arrays/AutoboxingArrays.java b/arrays/AutoboxingArrays.java
    index 25b3a0e88..d8601627c 100644
    --- a/arrays/AutoboxingArrays.java
    +++ b/arrays/AutoboxingArrays.java
    @@ -1,5 +1,5 @@
     // arrays/AutoboxingArrays.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    diff --git a/arrays/CollectionComparison.java b/arrays/CollectionComparison.java
    index fc703c0a1..b5f0b1132 100644
    --- a/arrays/CollectionComparison.java
    +++ b/arrays/CollectionComparison.java
    @@ -1,5 +1,5 @@
     // arrays/CollectionComparison.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    @@ -9,8 +9,7 @@
     class BerylliumSphere {
       private static long counter;
       private final long id = counter++;
    -  @Override
    -  public String toString() {
    +  @Override public String toString() {
         return "Sphere " + id;
       }
     }
    diff --git a/arrays/CompType.java b/arrays/CompType.java
    index 621b33d18..8d7e82a33 100644
    --- a/arrays/CompType.java
    +++ b/arrays/CompType.java
    @@ -1,5 +1,5 @@
     // arrays/CompType.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Implementing Comparable in a class
    @@ -16,15 +16,13 @@ public CompType(int n1, int n2) {
         i = n1;
         j = n2;
       }
    -  @Override
    -  public String toString() {
    +  @Override public String toString() {
         String result = "[i = " + i + ", j = " + j + "]";
         if(count++ % 3 == 0)
           result += "\n";
         return result;
       }
    -  @Override
    -  public int compareTo(CompType rv) {
    +  @Override public int compareTo(CompType rv) {
         return (i < rv.i ? -1 : (i == rv.i ? 0 : 1));
       }
       private static SplittableRandom r =
    diff --git a/arrays/ComparatorTest.java b/arrays/ComparatorTest.java
    index 68f7e3805..fbe385879 100644
    --- a/arrays/ComparatorTest.java
    +++ b/arrays/ComparatorTest.java
    @@ -1,5 +1,5 @@
     // arrays/ComparatorTest.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Implementing a Comparator for a class
    diff --git a/arrays/ComparingArrays.java b/arrays/ComparingArrays.java
    index 9ddad69d0..c97c22d04 100644
    --- a/arrays/ComparingArrays.java
    +++ b/arrays/ComparingArrays.java
    @@ -1,5 +1,5 @@
     // arrays/ComparingArrays.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Using Arrays.equals()
    diff --git a/arrays/CountUpward.java b/arrays/CountUpward.java
    index bbeb02ba7..3ac361c86 100644
    --- a/arrays/CountUpward.java
    +++ b/arrays/CountUpward.java
    @@ -1,5 +1,5 @@
     // arrays/CountUpward.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    diff --git a/arrays/FillingArrays.java b/arrays/FillingArrays.java
    index df54e62f3..b7445dfdb 100644
    --- a/arrays/FillingArrays.java
    +++ b/arrays/FillingArrays.java
    @@ -1,5 +1,5 @@
     // arrays/FillingArrays.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Using Arrays.fill()
    diff --git a/arrays/IceCreamFlavors.java b/arrays/IceCreamFlavors.java
    index 5e9d2b610..1be802edd 100644
    --- a/arrays/IceCreamFlavors.java
    +++ b/arrays/IceCreamFlavors.java
    @@ -1,5 +1,5 @@
     // arrays/IceCreamFlavors.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Returning arrays from methods
    diff --git a/arrays/ModifyExisting.java b/arrays/ModifyExisting.java
    index d74df78e2..0c33b8d19 100644
    --- a/arrays/ModifyExisting.java
    +++ b/arrays/ModifyExisting.java
    @@ -1,5 +1,5 @@
     // arrays/ModifyExisting.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    @@ -11,7 +11,7 @@ public static void main(String[] args) {
         double[] da = new double[7];
         Arrays.setAll(da, new Rand.Double()::get);
         show(da);
    -    Arrays.setAll(da, n -> da[n] / 100); // [1]
    +    Arrays.setAll(da, n -> da[n] / 100);       // [1]
         show(da);
       }
     }
    diff --git a/arrays/MultiDimWrapperArray.java b/arrays/MultiDimWrapperArray.java
    index 1185d0f93..5055a1cbf 100644
    --- a/arrays/MultiDimWrapperArray.java
    +++ b/arrays/MultiDimWrapperArray.java
    @@ -1,5 +1,5 @@
     // arrays/MultiDimWrapperArray.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Multidimensional arrays of "wrapper" objects
    diff --git a/arrays/MultidimensionalObjectArrays.java b/arrays/MultidimensionalObjectArrays.java
    index 998e7c991..8c91e7b5a 100644
    --- a/arrays/MultidimensionalObjectArrays.java
    +++ b/arrays/MultidimensionalObjectArrays.java
    @@ -1,5 +1,5 @@
     // arrays/MultidimensionalObjectArrays.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    diff --git a/arrays/MultidimensionalPrimitiveArray.java b/arrays/MultidimensionalPrimitiveArray.java
    index 8ed5884f9..ffebf2b6f 100644
    --- a/arrays/MultidimensionalPrimitiveArray.java
    +++ b/arrays/MultidimensionalPrimitiveArray.java
    @@ -1,5 +1,5 @@
     // arrays/MultidimensionalPrimitiveArray.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    diff --git a/arrays/ParallelPrefix1.java b/arrays/ParallelPrefix1.java
    index e180d019a..243753168 100644
    --- a/arrays/ParallelPrefix1.java
    +++ b/arrays/ParallelPrefix1.java
    @@ -1,5 +1,5 @@
     // arrays/ParallelPrefix1.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    diff --git a/arrays/ParallelPrefix2.java b/arrays/ParallelPrefix2.java
    index 5288d3cea..c7963fe83 100644
    --- a/arrays/ParallelPrefix2.java
    +++ b/arrays/ParallelPrefix2.java
    @@ -1,5 +1,5 @@
     // arrays/ParallelPrefix2.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    diff --git a/arrays/ParallelPrefix3.java b/arrays/ParallelPrefix3.java
    index ed2751dca..88d32916e 100644
    --- a/arrays/ParallelPrefix3.java
    +++ b/arrays/ParallelPrefix3.java
    @@ -1,5 +1,5 @@
     // arrays/ParallelPrefix3.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // {ExcludeFromTravisCI}
    diff --git a/arrays/ParallelSetAll.java b/arrays/ParallelSetAll.java
    index f6c47ff5f..787d2daf9 100644
    --- a/arrays/ParallelSetAll.java
    +++ b/arrays/ParallelSetAll.java
    @@ -1,5 +1,5 @@
     // arrays/ParallelSetAll.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    diff --git a/arrays/ParameterizedArrayType.java b/arrays/ParameterizedArrayType.java
    index 06c1021ce..7213afde5 100644
    --- a/arrays/ParameterizedArrayType.java
    +++ b/arrays/ParameterizedArrayType.java
    @@ -1,5 +1,5 @@
     // arrays/ParameterizedArrayType.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
    diff --git a/arrays/PythonLists.py b/arrays/PythonLists.py
    index 910daf180..3ed60ee91 100644
    --- a/arrays/PythonLists.py
    +++ b/arrays/PythonLists.py
    @@ -1,5 +1,5 @@
     # arrays/PythonLists.py
    -# (c)2020 MindView LLC: see Copyright.txt
    +# (c)2021 MindView LLC: see Copyright.txt
     # We make no guarantees that this code is fit for any purpose.
     # Visit http://OnJava8.com for more book information.
     
    @@ -20,7 +20,7 @@ def getReversed(self):
             reversed.reverse() # Built-in list method
             return reversed
     
    -# No 'new' necessary for object creation:
    +# No 'new' necessary for object creation: {#24-no-new-necessary-for-object-creation}
     list2 = MyList(aList)
     print(type(list2)) # 
     print(list2.getReversed()) # [8, 7, 6, 5, 4, 3, 2, 1]
    diff --git a/arrays/RaggedArray.java b/arrays/RaggedArray.java
    index bd7d625bb..dfae93d64 100644
    --- a/arrays/RaggedArray.java
    +++ b/arrays/RaggedArray.java
    @@ -1,5 +1,5 @@
     // arrays/RaggedArray.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    @@ -14,7 +14,7 @@ public static void main(String[] args) {
           a[i] = new int[rand.nextInt(5)][];
           for(int j = 0; j < a[i].length; j++) {
             a[i][j] = new int[rand.nextInt(5)];
    -        Arrays.setAll(a[i][j], n -> val++); // [1]
    +        Arrays.setAll(a[i][j], n -> val++);     // [1]
           }
         }
         System.out.println(Arrays.deepToString(a));
    diff --git a/arrays/Reverse.java b/arrays/Reverse.java
    index 9a7de6785..0f2719cec 100644
    --- a/arrays/Reverse.java
    +++ b/arrays/Reverse.java
    @@ -1,5 +1,5 @@
     // arrays/Reverse.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // The Collections.reverseOrder() Comparator
    diff --git a/arrays/SimpleSetAll.java b/arrays/SimpleSetAll.java
    index 70336e793..072975b00 100644
    --- a/arrays/SimpleSetAll.java
    +++ b/arrays/SimpleSetAll.java
    @@ -1,5 +1,5 @@
     // arrays/SimpleSetAll.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    @@ -8,8 +8,9 @@
     class Bob {
       final int id;
       Bob(int n) { id = n; }
    -  @Override
    -  public String toString() { return "Bob" + id; }
    +  @Override public String toString() {
    +    return "Bob" + id;
    +  }
     }
     
     public class SimpleSetAll {
    @@ -22,13 +23,13 @@ public static void main(String[] args) {
         int[] ia = new int[SZ];
         long[] la = new long[SZ];
         double[] da = new double[SZ];
    -    Arrays.setAll(ia, n -> n); // [1]
    +    Arrays.setAll(ia, n -> n);                 // [1]
         Arrays.setAll(la, n -> n);
         Arrays.setAll(da, n -> n);
         show(ia);
         show(la);
         show(da);
    -    Arrays.setAll(ia, n -> val++); // [2]
    +    Arrays.setAll(ia, n -> val++);             // [2]
         Arrays.setAll(la, n -> val++);
         Arrays.setAll(da, n -> val++);
         show(ia);
    @@ -36,11 +37,11 @@ public static void main(String[] args) {
         show(da);
     
         Bob[] ba = new Bob[SZ];
    -    Arrays.setAll(ba, Bob::new); // [3]
    +    Arrays.setAll(ba, Bob::new);               // [3]
         show(ba);
     
         Character[] ca = new Character[SZ];
    -    Arrays.setAll(ca, SimpleSetAll::getChar); // [4]
    +    Arrays.setAll(ca, SimpleSetAll::getChar);  // [4]
         show(ca);
       }
     }
    diff --git a/arrays/StreamFromArray.java b/arrays/StreamFromArray.java
    index 69628703c..b30ed6d44 100644
    --- a/arrays/StreamFromArray.java
    +++ b/arrays/StreamFromArray.java
    @@ -1,5 +1,5 @@
     // arrays/StreamFromArray.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    diff --git a/arrays/StringSorting.java b/arrays/StringSorting.java
    index 0da5c7337..aef57048d 100644
    --- a/arrays/StringSorting.java
    +++ b/arrays/StringSorting.java
    @@ -1,5 +1,5 @@
     // arrays/StringSorting.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Sorting an array of Strings
    diff --git a/arrays/TestConvertTo.java b/arrays/TestConvertTo.java
    index 8ecb72a62..8b8f849a5 100644
    --- a/arrays/TestConvertTo.java
    +++ b/arrays/TestConvertTo.java
    @@ -1,5 +1,5 @@
     // arrays/TestConvertTo.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    diff --git a/arrays/TestCount.java b/arrays/TestCount.java
    index a77e00f76..b6b3e7b8d 100644
    --- a/arrays/TestCount.java
    +++ b/arrays/TestCount.java
    @@ -1,5 +1,5 @@
     // arrays/TestCount.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Test counting generators
    diff --git a/arrays/TestRand.java b/arrays/TestRand.java
    index 17e0718f3..45d248ade 100644
    --- a/arrays/TestRand.java
    +++ b/arrays/TestRand.java
    @@ -1,5 +1,5 @@
     // arrays/TestRand.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Test random generators
    diff --git a/arrays/ThreeDWithNew.java b/arrays/ThreeDWithNew.java
    index 7aaef0694..f1ab3393a 100644
    --- a/arrays/ThreeDWithNew.java
    +++ b/arrays/ThreeDWithNew.java
    @@ -1,5 +1,5 @@
     // arrays/ThreeDWithNew.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    diff --git a/arrays/jmh/ParallelSort.java b/arrays/jmh/ParallelSort.java
    index fe0b505b5..64ff004d3 100644
    --- a/arrays/jmh/ParallelSort.java
    +++ b/arrays/jmh/ParallelSort.java
    @@ -1,5 +1,5 @@
     // arrays/jmh/ParallelSort.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package arrays.jmh;
    diff --git a/collections/AdapterMethodIdiom.java b/collections/AdapterMethodIdiom.java
    index a97abb411..47fe3e8be 100644
    --- a/collections/AdapterMethodIdiom.java
    +++ b/collections/AdapterMethodIdiom.java
    @@ -1,5 +1,5 @@
     // collections/AdapterMethodIdiom.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // The "Adapter Method" idiom uses for-in
    @@ -15,10 +15,12 @@ public Iterable reversed() {
           public Iterator iterator() {
             return new Iterator() {
               int current = size() - 1;
    -          public boolean hasNext() {
    +          @Override public boolean hasNext() {
                 return current > -1;
               }
    +          @Override
               public T next() { return get(current--); }
    +          @Override
               public void remove() { // Not implemented
                 throw new UnsupportedOperationException();
               }
    diff --git a/collections/AddingGroups.java b/collections/AddingGroups.java
    index ecfc8a5a1..13fcdcaf1 100644
    --- a/collections/AddingGroups.java
    +++ b/collections/AddingGroups.java
    @@ -1,5 +1,5 @@
     // collections/AddingGroups.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Adding groups of elements to Collection objects
    diff --git a/collections/ApplesAndOrangesWithGenerics.java b/collections/ApplesAndOrangesWithGenerics.java
    index c251672ce..674ee7b47 100644
    --- a/collections/ApplesAndOrangesWithGenerics.java
    +++ b/collections/ApplesAndOrangesWithGenerics.java
    @@ -1,5 +1,5 @@
     // collections/ApplesAndOrangesWithGenerics.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    diff --git a/collections/ApplesAndOrangesWithoutGenerics.java b/collections/ApplesAndOrangesWithoutGenerics.java
    index 6afacd12b..6ca4a6f4b 100644
    --- a/collections/ApplesAndOrangesWithoutGenerics.java
    +++ b/collections/ApplesAndOrangesWithoutGenerics.java
    @@ -1,5 +1,5 @@
     // collections/ApplesAndOrangesWithoutGenerics.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Simple collection use (suppressing compiler warnings)
    diff --git a/collections/ArrayIsNotIterable.java b/collections/ArrayIsNotIterable.java
    index d496feb16..a9660a67c 100644
    --- a/collections/ArrayIsNotIterable.java
    +++ b/collections/ArrayIsNotIterable.java
    @@ -1,5 +1,5 @@
     // collections/ArrayIsNotIterable.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    diff --git a/collections/AsListInference.java b/collections/AsListInference.java
    index ef8137083..e4b825447 100644
    --- a/collections/AsListInference.java
    +++ b/collections/AsListInference.java
    @@ -1,5 +1,5 @@
     // collections/AsListInference.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    diff --git a/collections/CollectionDifferences.java b/collections/CollectionDifferences.java
    index 711f7bd79..a8ea09d01 100644
    --- a/collections/CollectionDifferences.java
    +++ b/collections/CollectionDifferences.java
    @@ -1,5 +1,5 @@
     // collections/CollectionDifferences.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import onjava.*;
    diff --git a/collections/CollectionSequence.java b/collections/CollectionSequence.java
    index 6a12ed69f..65f93254e 100644
    --- a/collections/CollectionSequence.java
    +++ b/collections/CollectionSequence.java
    @@ -1,5 +1,5 @@
     // collections/CollectionSequence.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import typeinfo.pets.*;
    @@ -7,15 +7,13 @@
     
     public class CollectionSequence
     extends AbstractCollection {
    -  private Pet[] pets = Pets.array(8);
    +  private Pet[] pets = new PetCreator().array(8);
       @Override
       public int size() { return pets.length; }
    -  @Override
    -  public Iterator iterator() {
    -    return new Iterator() { // [1]
    +  @Override public Iterator iterator() {
    +    return new Iterator() {              // [1]
           private int index = 0;
    -      @Override
    -      public boolean hasNext() {
    +      @Override public boolean hasNext() {
             return index < pets.length;
           }
           @Override
    diff --git a/collections/CrossCollectionIteration.java b/collections/CrossCollectionIteration.java
    index 99769fe24..6be887668 100644
    --- a/collections/CrossCollectionIteration.java
    +++ b/collections/CrossCollectionIteration.java
    @@ -1,5 +1,5 @@
     // collections/CrossCollectionIteration.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import typeinfo.pets.*;
    @@ -14,7 +14,7 @@ public static void display(Iterator it) {
         System.out.println();
       }
       public static void main(String[] args) {
    -    List pets = Pets.list(8);
    +    List pets = new PetCreator().list(8);
         LinkedList petsLL = new LinkedList<>(pets);
         HashSet petsHS = new HashSet<>(pets);
         TreeSet petsTS = new TreeSet<>(pets);
    diff --git a/collections/CrossCollectionIteration2.java b/collections/CrossCollectionIteration2.java
    index c7da143ff..de7fe2809 100644
    --- a/collections/CrossCollectionIteration2.java
    +++ b/collections/CrossCollectionIteration2.java
    @@ -1,5 +1,5 @@
     // collections/CrossCollectionIteration2.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import typeinfo.pets.*;
    @@ -15,7 +15,7 @@ public static void display(Iterable ip) {
         System.out.println();
       }
       public static void main(String[] args) {
    -    List pets = Pets.list(8);
    +    List pets = new PetCreator().list(8);
         LinkedList petsLL = new LinkedList<>(pets);
         HashSet petsHS = new HashSet<>(pets);
         TreeSet petsTS = new TreeSet<>(pets);
    diff --git a/collections/EnvironmentVariables.java b/collections/EnvironmentVariables.java
    index af89e5a28..6098e4cfc 100644
    --- a/collections/EnvironmentVariables.java
    +++ b/collections/EnvironmentVariables.java
    @@ -1,5 +1,5 @@
     // collections/EnvironmentVariables.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // {VisuallyInspectOutput}
    diff --git a/collections/ForInCollections.java b/collections/ForInCollections.java
    index a8ddd7923..15ea9bb3a 100644
    --- a/collections/ForInCollections.java
    +++ b/collections/ForInCollections.java
    @@ -1,5 +1,5 @@
     // collections/ForInCollections.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // All collections work with for-in
    diff --git a/collections/GenericsAndUpcasting.java b/collections/GenericsAndUpcasting.java
    index ed8d3f557..3462e0b76 100644
    --- a/collections/GenericsAndUpcasting.java
    +++ b/collections/GenericsAndUpcasting.java
    @@ -1,5 +1,5 @@
     // collections/GenericsAndUpcasting.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    @@ -21,8 +21,8 @@ public static void main(String[] args) {
       }
     }
     /* Output:
    -GrannySmith@15db9742
    -Gala@6d06d69c
    -Fuji@7852e922
    -Braeburn@4e25154f
    +GrannySmith@19e0bfd
    +Gala@139a55
    +Fuji@1db9742
    +Braeburn@106d69c
     */
    diff --git a/collections/InterfaceVsIterator.java b/collections/InterfaceVsIterator.java
    index b5a8663d8..5e3c147be 100644
    --- a/collections/InterfaceVsIterator.java
    +++ b/collections/InterfaceVsIterator.java
    @@ -1,5 +1,5 @@
     // collections/InterfaceVsIterator.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import typeinfo.pets.*;
    @@ -19,7 +19,7 @@ public static void display(Collection pets) {
         System.out.println();
       }
       public static void main(String[] args) {
    -    List petList = Pets.list(8);
    +    List petList = new PetCreator().list(8);
         Set petSet = new HashSet<>(petList);
         Map petMap = new LinkedHashMap<>();
         String[] names = ("Ralph, Eric, Robin, Lacey, " +
    diff --git a/collections/IterableClass.java b/collections/IterableClass.java
    index 260edc7d4..1e64d783a 100644
    --- a/collections/IterableClass.java
    +++ b/collections/IterableClass.java
    @@ -1,5 +1,5 @@
     // collections/IterableClass.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Anything Iterable works with for-in
    @@ -9,12 +9,10 @@ public class IterableClass implements Iterable {
       protected String[] words = ("And that is how " +
         "we know the Earth to be banana-shaped."
         ).split(" ");
    -  @Override
    -  public Iterator iterator() {
    +  @Override public Iterator iterator() {
         return new Iterator() {
           private int index = 0;
    -      @Override
    -      public boolean hasNext() {
    +      @Override public boolean hasNext() {
             return index < words.length;
           }
           @Override
    diff --git a/collections/LinkedListFeatures.java b/collections/LinkedListFeatures.java
    index 3c10ff4ea..3552fa10e 100644
    --- a/collections/LinkedListFeatures.java
    +++ b/collections/LinkedListFeatures.java
    @@ -1,5 +1,5 @@
     // collections/LinkedListFeatures.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import typeinfo.pets.*;
    @@ -8,7 +8,7 @@
     public class LinkedListFeatures {
       public static void main(String[] args) {
         LinkedList pets =
    -      new LinkedList<>(Pets.list(5));
    +      new LinkedList<>(new PetCreator().list(5));
         System.out.println(pets);
         // Identical:
         System.out.println(
    @@ -27,9 +27,9 @@ public static void main(String[] args) {
         System.out.println(pets);
         pets.addFirst(new Rat());
         System.out.println("After addFirst(): " + pets);
    -    pets.offer(Pets.get());
    +    pets.offer(new PetCreator().get());
         System.out.println("After offer(): " + pets);
    -    pets.add(Pets.get());
    +    pets.add(new PetCreator().get());
         System.out.println("After add(): " + pets);
         pets.addLast(new Hamster());
         System.out.println("After addLast(): " + pets);
    @@ -47,8 +47,8 @@ public static void main(String[] args) {
     pets.poll(): Cymric
     [Mutt, Pug]
     After addFirst(): [Rat, Mutt, Pug]
    -After offer(): [Rat, Mutt, Pug, Cymric]
    -After add(): [Rat, Mutt, Pug, Cymric, Pug]
    -After addLast(): [Rat, Mutt, Pug, Cymric, Pug, Hamster]
    +After offer(): [Rat, Mutt, Pug, Rat]
    +After add(): [Rat, Mutt, Pug, Rat, Rat]
    +After addLast(): [Rat, Mutt, Pug, Rat, Rat, Hamster]
     pets.removeLast(): Hamster
     */
    diff --git a/collections/ListFeatures.java b/collections/ListFeatures.java
    index b4ee16ab4..cf1e7b01e 100644
    --- a/collections/ListFeatures.java
    +++ b/collections/ListFeatures.java
    @@ -1,5 +1,5 @@
     // collections/ListFeatures.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import typeinfo.pets.*;
    @@ -8,7 +8,7 @@
     public class ListFeatures {
       public static void main(String[] args) {
         Random rand = new Random(47);
    -    List pets = Pets.list(7);
    +    List pets = new PetCreator().list(7);
         System.out.println("1: " + pets);
         Hamster h = new Hamster();
         pets.add(h); // Automatically resizes
    @@ -54,7 +54,7 @@ public static void main(String[] args) {
         pets.clear(); // Remove all elements
         System.out.println("19: " + pets);
         System.out.println("20: " + pets.isEmpty());
    -    pets.addAll(Pets.list(4));
    +    pets.addAll(new PetCreator().list(4));
         System.out.println("21: " + pets);
         Object[] o = pets.toArray();
         System.out.println("22: " + o[3]);
    @@ -87,7 +87,7 @@ public static void main(String[] args) {
     18: false
     19: []
     20: true
    -21: [Manx, Cymric, Rat, EgyptianMau]
    -22: EgyptianMau
    +21: [Rat, Manx, Cymric, Mutt]
    +22: Mutt
     23: 14
     */
    diff --git a/collections/ListIteration.java b/collections/ListIteration.java
    index 95d2786cc..ce49b5295 100644
    --- a/collections/ListIteration.java
    +++ b/collections/ListIteration.java
    @@ -1,5 +1,5 @@
     // collections/ListIteration.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import typeinfo.pets.*;
    @@ -7,7 +7,7 @@
     
     public class ListIteration {
       public static void main(String[] args) {
    -    List pets = Pets.list(8);
    +    List pets = new PetCreator().list(8);
         ListIterator it = pets.listIterator();
         while(it.hasNext())
           System.out.print(it.next() +
    @@ -22,7 +22,7 @@ public static void main(String[] args) {
         it = pets.listIterator(3);
         while(it.hasNext()) {
           it.next();
    -      it.set(Pets.get());
    +      it.set(new PetCreator().get());
         }
         System.out.println(pets);
       }
    @@ -32,6 +32,5 @@ public static void main(String[] args) {
     5, 4; Cymric, 6, 5; Pug, 7, 6; Manx, 8, 7;
     7 6 5 4 3 2 1 0
     [Rat, Manx, Cymric, Mutt, Pug, Cymric, Pug, Manx]
    -[Rat, Manx, Cymric, Cymric, Rat, EgyptianMau, Hamster,
    -EgyptianMau]
    +[Rat, Manx, Cymric, Rat, Rat, Rat, Rat, Rat]
     */
    diff --git a/collections/MapOfList.java b/collections/MapOfList.java
    index 3a985dd9f..d3b385add 100644
    --- a/collections/MapOfList.java
    +++ b/collections/MapOfList.java
    @@ -1,5 +1,5 @@
     // collections/MapOfList.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // {java collections.MapOfList}
    diff --git a/collections/ModifyingArraysAsList.java b/collections/ModifyingArraysAsList.java
    index fea3da423..ef50e40ab 100644
    --- a/collections/ModifyingArraysAsList.java
    +++ b/collections/ModifyingArraysAsList.java
    @@ -1,5 +1,5 @@
     // collections/ModifyingArraysAsList.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    diff --git a/collections/MultiIterableClass.java b/collections/MultiIterableClass.java
    index 1d7376e5f..e55d811e3 100644
    --- a/collections/MultiIterableClass.java
    +++ b/collections/MultiIterableClass.java
    @@ -1,5 +1,5 @@
     // collections/MultiIterableClass.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Adding several Adapter Methods
    @@ -11,12 +11,13 @@ public Iterable reversed() {
           public Iterator iterator() {
             return new Iterator() {
               int current = words.length - 1;
    -          public boolean hasNext() {
    +          @Override public boolean hasNext() {
                 return current > -1;
               }
    -          public String next() {
    +          @Override public String next() {
                 return words[current--];
               }
    +          @Override
               public void remove() { // Not implemented
                 throw new UnsupportedOperationException();
               }
    diff --git a/collections/NonCollectionSequence.java b/collections/NonCollectionSequence.java
    index ed1ae6f63..8a6c8bb55 100644
    --- a/collections/NonCollectionSequence.java
    +++ b/collections/NonCollectionSequence.java
    @@ -1,20 +1,19 @@
     // collections/NonCollectionSequence.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import typeinfo.pets.*;
     import java.util.*;
     
     class PetSequence {
    -  protected Pet[] pets = Pets.array(8);
    +  protected Pet[] pets = new PetCreator().array(8);
     }
     
     public class NonCollectionSequence extends PetSequence {
       public Iterator iterator() {
         return new Iterator() {
           private int index = 0;
    -      @Override
    -      public boolean hasNext() {
    +      @Override public boolean hasNext() {
             return index < pets.length;
           }
           @Override
    diff --git a/collections/PetMap.java b/collections/PetMap.java
    index 18d02ef0b..44885c803 100644
    --- a/collections/PetMap.java
    +++ b/collections/PetMap.java
    @@ -1,5 +1,5 @@
     // collections/PetMap.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import typeinfo.pets.*;
    diff --git a/collections/PrintingCollections.java b/collections/PrintingCollections.java
    index c5746fc3e..c324722a9 100644
    --- a/collections/PrintingCollections.java
    +++ b/collections/PrintingCollections.java
    @@ -1,5 +1,5 @@
     // collections/PrintingCollections.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Collections print themselves automatically
    diff --git a/collections/PriorityQueueDemo.java b/collections/PriorityQueueDemo.java
    index 4f71ab0e8..0e0f553ef 100644
    --- a/collections/PriorityQueueDemo.java
    +++ b/collections/PriorityQueueDemo.java
    @@ -1,5 +1,5 @@
     // collections/PriorityQueueDemo.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    diff --git a/collections/QueueDemo.java b/collections/QueueDemo.java
    index f807e89a9..a7d30c1c4 100644
    --- a/collections/QueueDemo.java
    +++ b/collections/QueueDemo.java
    @@ -1,5 +1,5 @@
     // collections/QueueDemo.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Upcasting to a Queue from a LinkedList
    diff --git a/collections/SetOfInteger.java b/collections/SetOfInteger.java
    index 78157d5cd..92a403e6c 100644
    --- a/collections/SetOfInteger.java
    +++ b/collections/SetOfInteger.java
    @@ -1,5 +1,5 @@
     // collections/SetOfInteger.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    diff --git a/collections/SetOfString.java b/collections/SetOfString.java
    index 01d9455e6..50a06bc20 100644
    --- a/collections/SetOfString.java
    +++ b/collections/SetOfString.java
    @@ -1,5 +1,5 @@
     // collections/SetOfString.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    diff --git a/collections/SetOperations.java b/collections/SetOperations.java
    index f716f9651..485588b6c 100644
    --- a/collections/SetOperations.java
    +++ b/collections/SetOperations.java
    @@ -1,5 +1,5 @@
     // collections/SetOperations.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    diff --git a/collections/SimpleCollection.java b/collections/SimpleCollection.java
    index 8915e2591..6dcf73b24 100644
    --- a/collections/SimpleCollection.java
    +++ b/collections/SimpleCollection.java
    @@ -1,5 +1,5 @@
     // collections/SimpleCollection.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    diff --git a/collections/SimpleIteration.java b/collections/SimpleIteration.java
    index a65a2a714..234a716b1 100644
    --- a/collections/SimpleIteration.java
    +++ b/collections/SimpleIteration.java
    @@ -1,5 +1,5 @@
     // collections/SimpleIteration.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import typeinfo.pets.*;
    @@ -7,7 +7,7 @@
     
     public class SimpleIteration {
       public static void main(String[] args) {
    -    List pets = Pets.list(12);
    +    List pets = new PetCreator().list(12);
         Iterator it = pets.iterator();
         while(it.hasNext()) {
           Pet p = it.next();
    diff --git a/collections/SortedSetOfString.java b/collections/SortedSetOfString.java
    index a043b7911..af6222aac 100644
    --- a/collections/SortedSetOfString.java
    +++ b/collections/SortedSetOfString.java
    @@ -1,5 +1,5 @@
     // collections/SortedSetOfString.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    diff --git a/collections/StackCollision.java b/collections/StackCollision.java
    index 67ee4d907..7914e3496 100644
    --- a/collections/StackCollision.java
    +++ b/collections/StackCollision.java
    @@ -1,5 +1,5 @@
     // collections/StackCollision.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
    diff --git a/collections/StackTest.java b/collections/StackTest.java
    index dc1663cc4..54005700a 100644
    --- a/collections/StackTest.java
    +++ b/collections/StackTest.java
    @@ -1,5 +1,5 @@
     // collections/StackTest.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    diff --git a/collections/StackTest2.java b/collections/StackTest2.java
    index 2464d7a9c..148a834a8 100644
    --- a/collections/StackTest2.java
    +++ b/collections/StackTest2.java
    @@ -1,5 +1,5 @@
     // collections/StackTest2.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import onjava.*;
    diff --git a/collections/Statistics.java b/collections/Statistics.java
    index f888db585..a3ece359e 100644
    --- a/collections/Statistics.java
    +++ b/collections/Statistics.java
    @@ -1,5 +1,5 @@
     // collections/Statistics.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Simple demonstration of HashMap
    @@ -12,7 +12,7 @@ public static void main(String[] args) {
         for(int i = 0; i < 10000; i++) {
           // Produce a number between 0 and 20:
           int r = rand.nextInt(20);
    -      Integer freq = m.get(r); // [1]
    +      Integer freq = m.get(r);               // [1]
           m.put(r, freq == null ? 1 : freq + 1);
         }
         System.out.println(m);
    diff --git a/collections/UniqueWords.java b/collections/UniqueWords.java
    index c6c3681d4..e39a9b882 100644
    --- a/collections/UniqueWords.java
    +++ b/collections/UniqueWords.java
    @@ -1,5 +1,5 @@
     // collections/UniqueWords.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    diff --git a/collections/UniqueWordsAlphabetic.java b/collections/UniqueWordsAlphabetic.java
    index 66a7fecfa..780ddb3f1 100644
    --- a/collections/UniqueWordsAlphabetic.java
    +++ b/collections/UniqueWordsAlphabetic.java
    @@ -1,5 +1,5 @@
     // collections/UniqueWordsAlphabetic.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Producing an alphabetic listing
    diff --git a/collectiontopics/AssociativeArray.java b/collectiontopics/AssociativeArray.java
    index e7488489c..37c09da89 100644
    --- a/collectiontopics/AssociativeArray.java
    +++ b/collectiontopics/AssociativeArray.java
    @@ -1,5 +1,5 @@
     // collectiontopics/AssociativeArray.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Associates keys with values
    @@ -22,8 +22,7 @@ public V get(K key) {
             return (V)pairs[i][1];
         return null; // Did not find key
       }
    -  @Override
    -  public String toString() {
    +  @Override public String toString() {
         StringBuilder result = new StringBuilder();
         for(int i = 0; i < index; i++) {
           result.append(pairs[i][0].toString());
    diff --git a/collectiontopics/Bits.java b/collectiontopics/Bits.java
    index 16afb3617..f4f6d506a 100644
    --- a/collectiontopics/Bits.java
    +++ b/collectiontopics/Bits.java
    @@ -1,5 +1,5 @@
     // collectiontopics/Bits.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Demonstration of BitSet
    diff --git a/collectiontopics/CanonicalMapping.java b/collectiontopics/CanonicalMapping.java
    index c02f9132a..72735a3ba 100644
    --- a/collectiontopics/CanonicalMapping.java
    +++ b/collectiontopics/CanonicalMapping.java
    @@ -1,5 +1,5 @@
     // collectiontopics/CanonicalMapping.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Demonstrates WeakHashMap
    @@ -8,20 +8,16 @@
     class Element {
       private String ident;
       Element(String id) { ident = id; }
    -  @Override
    -  public String toString() { return ident; }
    -  @Override
    -  public int hashCode() {
    +  @Override public String toString() { return ident; }
    +  @Override public int hashCode() {
         return Objects.hashCode(ident);
       }
    -  @Override
    -  public boolean equals(Object r) {
    +  @Override public boolean equals(Object r) {
         return r instanceof Element &&
           Objects.equals(ident, ((Element)r).ident);
       }
       @SuppressWarnings("deprecation")
    -  @Override
    -  protected void finalize() {
    +  @Override protected void finalize() {
         System.out.println("Finalizing " +
           getClass().getSimpleName() + " " + ident);
       }
    diff --git a/collectiontopics/CollectionMethods.java b/collectiontopics/CollectionMethods.java
    index e32e5982a..21c12bb5a 100644
    --- a/collectiontopics/CollectionMethods.java
    +++ b/collectiontopics/CollectionMethods.java
    @@ -1,5 +1,5 @@
     // collectiontopics/CollectionMethods.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Things you can do with all Collections
    diff --git a/collectiontopics/Enumerations.java b/collectiontopics/Enumerations.java
    index 22b83e52a..63d740590 100644
    --- a/collectiontopics/Enumerations.java
    +++ b/collectiontopics/Enumerations.java
    @@ -1,5 +1,5 @@
     // collectiontopics/Enumerations.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Java 1.0/1.1 Vector and Enumeration
    diff --git a/collectiontopics/FailFast.java b/collectiontopics/FailFast.java
    index 0b0ce253f..9425de28d 100644
    --- a/collectiontopics/FailFast.java
    +++ b/collectiontopics/FailFast.java
    @@ -1,5 +1,5 @@
     // collectiontopics/FailFast.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Demonstrates the "fail-fast" behavior
    diff --git a/collectiontopics/FillMapTest.java b/collectiontopics/FillMapTest.java
    index 5cfd612bc..e96d0263b 100644
    --- a/collectiontopics/FillMapTest.java
    +++ b/collectiontopics/FillMapTest.java
    @@ -1,5 +1,5 @@
     // collectiontopics/FillMapTest.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    diff --git a/collectiontopics/FillingLists.java b/collectiontopics/FillingLists.java
    index 32bdb8ef0..29123d01f 100644
    --- a/collectiontopics/FillingLists.java
    +++ b/collectiontopics/FillingLists.java
    @@ -1,5 +1,5 @@
     // collectiontopics/FillingLists.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Collections.fill() & Collections.nCopies()
    @@ -8,8 +8,7 @@
     class StringAddress {
       private String s;
       StringAddress(String s) { this.s = s; }
    -  @Override
    -  public String toString() {
    +  @Override public String toString() {
         return super.toString() + " " + s;
       }
     }
    @@ -26,10 +25,10 @@ public static void main(String[] args) {
       }
     }
     /* Output:
    -[StringAddress@15db9742 Hello, StringAddress@15db9742
    -Hello, StringAddress@15db9742 Hello,
    -StringAddress@15db9742 Hello]
    -[StringAddress@6d06d69c World!, StringAddress@6d06d69c
    -World!, StringAddress@6d06d69c World!,
    -StringAddress@6d06d69c World!]
    +[StringAddress@19e0bfd Hello, StringAddress@19e0bfd
    +Hello, StringAddress@19e0bfd Hello,
    +StringAddress@19e0bfd Hello]
    +[StringAddress@139a55 World!, StringAddress@139a55
    +World!, StringAddress@139a55 World!,
    +StringAddress@139a55 World!]
     */
    diff --git a/collectiontopics/FunctionalMap.java b/collectiontopics/FunctionalMap.java
    index 404a1a641..ef9b48086 100644
    --- a/collectiontopics/FunctionalMap.java
    +++ b/collectiontopics/FunctionalMap.java
    @@ -1,5 +1,5 @@
     // collectiontopics/FunctionalMap.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Functional operations on a Map
    diff --git a/collectiontopics/HTMLColorTest.java b/collectiontopics/HTMLColorTest.java
    index 99037ced9..cdfeb5bed 100644
    --- a/collectiontopics/HTMLColorTest.java
    +++ b/collectiontopics/HTMLColorTest.java
    @@ -1,5 +1,5 @@
     // collectiontopics/HTMLColorTest.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import static onjava.HTMLColors.*;
    diff --git a/collectiontopics/LinkedHashMapDemo.java b/collectiontopics/LinkedHashMapDemo.java
    index d0b933932..7e9bc16a5 100644
    --- a/collectiontopics/LinkedHashMapDemo.java
    +++ b/collectiontopics/LinkedHashMapDemo.java
    @@ -1,5 +1,5 @@
     // collectiontopics/LinkedHashMapDemo.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // What you can do with a LinkedHashMap
    diff --git a/collectiontopics/ListOps.java b/collectiontopics/ListOps.java
    index 824ffba98..dee92d5e5 100644
    --- a/collectiontopics/ListOps.java
    +++ b/collectiontopics/ListOps.java
    @@ -1,5 +1,5 @@
     // collectiontopics/ListOps.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Things you can do with Lists
    diff --git a/collectiontopics/ListSortSearch.java b/collectiontopics/ListSortSearch.java
    index 4d1fbcf8c..13df7af28 100644
    --- a/collectiontopics/ListSortSearch.java
    +++ b/collectiontopics/ListSortSearch.java
    @@ -1,5 +1,5 @@
     // collectiontopics/ListSortSearch.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Sorting/searching Lists with Collections utilities
    diff --git a/collectiontopics/MapOps.java b/collectiontopics/MapOps.java
    index b214fa2d6..6b6458bb2 100644
    --- a/collectiontopics/MapOps.java
    +++ b/collectiontopics/MapOps.java
    @@ -1,5 +1,5 @@
     // collectiontopics/MapOps.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Things you can do with Maps
    diff --git a/collectiontopics/NavMap.java b/collectiontopics/NavMap.java
    index 076ae841e..2d898268b 100644
    --- a/collectiontopics/NavMap.java
    +++ b/collectiontopics/NavMap.java
    @@ -1,5 +1,5 @@
     // collectiontopics/NavMap.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // NavigableMap produces pieces of a Map
    diff --git a/collectiontopics/QueueBehavior.java b/collectiontopics/QueueBehavior.java
    index 136fbaf8a..1547e0d96 100644
    --- a/collectiontopics/QueueBehavior.java
    +++ b/collectiontopics/QueueBehavior.java
    @@ -1,5 +1,5 @@
     // collectiontopics/QueueBehavior.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Compares basic behavior
    diff --git a/collectiontopics/ReadOnly.java b/collectiontopics/ReadOnly.java
    index 93c336c4f..547c32a5f 100644
    --- a/collectiontopics/ReadOnly.java
    +++ b/collectiontopics/ReadOnly.java
    @@ -1,5 +1,5 @@
     // collectiontopics/ReadOnly.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Using the Collections.unmodifiable methods
    diff --git a/collectiontopics/References.java b/collectiontopics/References.java
    index 5fcca9404..798e8f31e 100644
    --- a/collectiontopics/References.java
    +++ b/collectiontopics/References.java
    @@ -1,5 +1,5 @@
     // collectiontopics/References.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Demonstrates Reference objects
    @@ -11,11 +11,9 @@ class VeryBig {
       private long[] la = new long[SIZE];
       private String ident;
       VeryBig(String id) { ident = id; }
    -  @Override
    -  public String toString() { return ident; }
    +  @Override public String toString() { return ident; }
       @SuppressWarnings("deprecation")
    -  @Override
    -  protected void finalize() {
    +  @Override protected void finalize() {
         System.out.println("Finalizing " + ident);
       }
     }
    @@ -68,25 +66,25 @@ public static void main(String[] args) {
       }
     }
     /* Output: (First and Last 10 Lines)
    -Just created: java.lang.ref.SoftReference@15db9742
    -Just created: java.lang.ref.SoftReference@6d06d69c
    -Just created: java.lang.ref.SoftReference@7852e922
    -Just created: java.lang.ref.SoftReference@4e25154f
    -Just created: java.lang.ref.SoftReference@70dea4e
    -Just created: java.lang.ref.SoftReference@5c647e05
    -Just created: java.lang.ref.SoftReference@33909752
    -Just created: java.lang.ref.SoftReference@55f96302
    -Just created: java.lang.ref.SoftReference@3d4eac69
    -Just created: java.lang.ref.SoftReference@42a57993
    +Just created: java.lang.ref.SoftReference@19e0bfd
    +Just created: java.lang.ref.SoftReference@139a55
    +Just created: java.lang.ref.SoftReference@1db9742
    +Just created: java.lang.ref.SoftReference@106d69c
    +Just created: java.lang.ref.SoftReference@52e922
    +Just created: java.lang.ref.SoftReference@25154f
    +Just created: java.lang.ref.SoftReference@10dea4e
    +Just created: java.lang.ref.SoftReference@647e05
    +Just created: java.lang.ref.SoftReference@1909752
    +Just created: java.lang.ref.SoftReference@1f96302
     ...________...________...________...________...
    -Just created: java.lang.ref.PhantomReference@45ee12a7
    +Just created: java.lang.ref.PhantomReference@16f6e28
     In queue: null
    -Just created: java.lang.ref.PhantomReference@330bedb4
    +Just created: java.lang.ref.PhantomReference@15fbaa4
     In queue: null
    -Just created: java.lang.ref.PhantomReference@2503dbd3
    +Just created: java.lang.ref.PhantomReference@1ee12a7
     In queue: null
    -Just created: java.lang.ref.PhantomReference@4b67cf4d
    +Just created: java.lang.ref.PhantomReference@10bedb4
     In queue: null
    -Just created: java.lang.ref.PhantomReference@7ea987ac
    +Just created: java.lang.ref.PhantomReference@103dbd3
     In queue: null
     */
    diff --git a/collectiontopics/SetOrder.java b/collectiontopics/SetOrder.java
    index 1c25be238..b167a7c72 100644
    --- a/collectiontopics/SetOrder.java
    +++ b/collectiontopics/SetOrder.java
    @@ -1,5 +1,5 @@
     // collectiontopics/SetOrder.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    @@ -23,9 +23,9 @@ public class SetOrder {
         for(String type: sets) {
           System.out.format("[-> %s <-]%n",
             type.substring(type.lastIndexOf('.') + 1));
    -      @SuppressWarnings({"unchecked", "deprecation"})
    +      @SuppressWarnings("unchecked")
           Set set = (Set)
    -        Class.forName(type).newInstance();
    +        Class.forName(type).getConstructor().newInstance();
           set.addAll(RLIST);
           set.stream()
             .limit(10)
    diff --git a/collectiontopics/SimpleDeques.java b/collectiontopics/SimpleDeques.java
    index fbb4a5ff6..811c43daa 100644
    --- a/collectiontopics/SimpleDeques.java
    +++ b/collectiontopics/SimpleDeques.java
    @@ -1,5 +1,5 @@
     // collectiontopics/SimpleDeques.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Very basic test of Deques
    @@ -11,8 +11,7 @@ class CountString implements Supplier {
       private int n = 0;
       CountString() {}
       CountString(int start) { n = start; }
    -  @Override
    -  public String get() {
    +  @Override public String get() {
         return Integer.toString(n++);
       }
     }
    diff --git a/collectiontopics/SortedMapDemo.java b/collectiontopics/SortedMapDemo.java
    index 4d57d34a7..5601aca04 100644
    --- a/collectiontopics/SortedMapDemo.java
    +++ b/collectiontopics/SortedMapDemo.java
    @@ -1,5 +1,5 @@
     // collectiontopics/SortedMapDemo.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // What you can do with a TreeMap
    diff --git a/collectiontopics/SortedSetDemo.java b/collectiontopics/SortedSetDemo.java
    index 6ed81fb16..91a9b3a54 100644
    --- a/collectiontopics/SortedSetDemo.java
    +++ b/collectiontopics/SortedSetDemo.java
    @@ -1,5 +1,5 @@
     // collectiontopics/SortedSetDemo.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    diff --git a/collectiontopics/Stacks.java b/collectiontopics/Stacks.java
    index 79a684cbb..a9d306ed3 100644
    --- a/collectiontopics/Stacks.java
    +++ b/collectiontopics/Stacks.java
    @@ -1,5 +1,5 @@
     // collectiontopics/Stacks.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Demonstration of Stack Class
    diff --git a/collectiontopics/StreamFillMaps.java b/collectiontopics/StreamFillMaps.java
    index 816a74b31..6df827332 100644
    --- a/collectiontopics/StreamFillMaps.java
    +++ b/collectiontopics/StreamFillMaps.java
    @@ -1,5 +1,5 @@
     // collectiontopics/StreamFillMaps.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    @@ -11,8 +11,7 @@ class Letters
     implements Supplier> {
       private int number = 1;
       private char letter = 'A';
    -  @Override
    -  public Pair get() {
    +  @Override public Pair get() {
         return new Pair<>(number++, "" + letter++);
       }
     }
    diff --git a/collectiontopics/SuppliersCollectionTest.java b/collectiontopics/SuppliersCollectionTest.java
    index b30f1490d..58f810bff 100644
    --- a/collectiontopics/SuppliersCollectionTest.java
    +++ b/collectiontopics/SuppliersCollectionTest.java
    @@ -1,5 +1,5 @@
     // collectiontopics/SuppliersCollectionTest.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    @@ -13,8 +13,7 @@ class Government implements Supplier {
         "distributing swords is no basis " +
         "for a system of government").split(" ");
       private int index;
    -  @Override
    -  public String get() {
    +  @Override public String get() {
         return foundation[index++];
       }
     }
    diff --git a/collectiontopics/Synchronization.java b/collectiontopics/Synchronization.java
    index c7d3b7323..86389da1c 100644
    --- a/collectiontopics/Synchronization.java
    +++ b/collectiontopics/Synchronization.java
    @@ -1,5 +1,5 @@
     // collectiontopics/Synchronization.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Using the Collections.synchronized methods
    diff --git a/collectiontopics/ToDoList.java b/collectiontopics/ToDoList.java
    index b288e8e1e..2be266eeb 100644
    --- a/collectiontopics/ToDoList.java
    +++ b/collectiontopics/ToDoList.java
    @@ -1,5 +1,5 @@
     // collectiontopics/ToDoList.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // A more complex use of PriorityQueue
    @@ -14,8 +14,7 @@ class ToDoItem implements Comparable {
         secondary = sec;
         item = td;
       }
    -  @Override
    -  public int compareTo(ToDoItem arg) {
    +  @Override public int compareTo(ToDoItem arg) {
         if(primary > arg.primary)
           return +1;
         if(primary == arg.primary)
    @@ -25,8 +24,7 @@ else if(secondary == arg.secondary)
             return 0;
         return -1;
       }
    -  @Override
    -  public String toString() {
    +  @Override public String toString() {
         return Character.toString(primary) +
           secondary + ": " + item;
       }
    diff --git a/collectiontopics/TypesForSets.java b/collectiontopics/TypesForSets.java
    index 9950b0032..e4c745879 100644
    --- a/collectiontopics/TypesForSets.java
    +++ b/collectiontopics/TypesForSets.java
    @@ -1,5 +1,5 @@
     // collectiontopics/TypesForSets.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Methods necessary to put your own type in a Set
    @@ -10,21 +10,18 @@
     class SetType {
       protected int i;
       SetType(int n) { i = n; }
    -  @Override
    -  public boolean equals(Object o) {
    +  @Override public boolean equals(Object o) {
         return o instanceof SetType &&
           Objects.equals(i, ((SetType)o).i);
       }
    -  @Override
    -  public String toString() {
    +  @Override public String toString() {
         return Integer.toString(i);
       }
     }
     
     class HashType extends SetType {
       HashType(int n) { super(n); }
    -  @Override
    -  public int hashCode() {
    +  @Override public int hashCode() {
         return Objects.hashCode(i);
       }
     }
    @@ -32,8 +29,7 @@ public int hashCode() {
     class TreeType extends SetType
     implements Comparable {
       TreeType(int n) { super(n); }
    -  @Override
    -  public int compareTo(TreeType arg) {
    +  @Override public int compareTo(TreeType arg) {
         return Integer.compare(arg.i, i);
         // Equivalent to:
         // return arg.i < i ? -1 : (arg.i == i ? 0 : 1);
    @@ -80,10 +76,10 @@ public static void main(String[] args) {
     [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
     [10, 9, 8, 7, 6, 5, 0, 1, 2, 3, 4]
     [10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
    -[1, 6, 8, 6, 2, 7, 8, 9, 4, 10, 7, 5, 1, 3, 4, 9, 9,
    -10, 5, 3, 2, 0, 4, 1, 2, 0, 8, 3, 0, 10, 6, 5, 7]
    -[3, 1, 4, 8, 7, 6, 9, 5, 3, 0, 10, 5, 5, 10, 7, 8, 8,
    -9, 1, 4, 10, 2, 6, 9, 1, 6, 0, 3, 2, 0, 7, 2, 4]
    +[4, 1, 5, 1, 0, 5, 6, 8, 7, 0, 2, 8, 4, 9, 6, 10, 6, 7,
    +2, 9, 10, 3, 8, 4, 10, 3, 9, 5, 3, 7, 1, 2, 0]
    +[9, 8, 4, 8, 5, 0, 1, 6, 2, 9, 3, 7, 2, 2, 7, 0, 9, 5,
    +5, 6, 4, 7, 10, 1, 6, 4, 1, 10, 3, 3, 0, 10, 8]
     [10, 9, 8, 7, 6, 5, 0, 1, 2, 3, 4, 10, 9, 8, 7, 6, 5,
     0, 1, 2, 3, 4, 10, 9, 8, 7, 6, 5, 0, 1, 2, 3, 4]
     [10, 9, 8, 7, 6, 5, 0, 1, 2, 3, 4, 10, 9, 8, 7, 6, 5,
    diff --git a/collectiontopics/Unsupported.java b/collectiontopics/Unsupported.java
    index a66b1cfdb..132b760c4 100644
    --- a/collectiontopics/Unsupported.java
    +++ b/collectiontopics/Unsupported.java
    @@ -1,5 +1,5 @@
     // collectiontopics/Unsupported.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Unsupported operations in Java collections
    diff --git a/collectiontopics/Utilities.java b/collectiontopics/Utilities.java
    index a2acc4278..0b7b0f9a0 100644
    --- a/collectiontopics/Utilities.java
    +++ b/collectiontopics/Utilities.java
    @@ -1,5 +1,5 @@
     // collectiontopics/Utilities.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Simple demonstrations of the Collections utilities
    diff --git a/com/mindviewinc/simple/List.java b/com/mindviewinc/simple/List.java
    index 84b30315b..2b1131a03 100644
    --- a/com/mindviewinc/simple/List.java
    +++ b/com/mindviewinc/simple/List.java
    @@ -1,5 +1,5 @@
     // com/mindviewinc/simple/List.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Creating a package
    diff --git a/com/mindviewinc/simple/Vector.java b/com/mindviewinc/simple/Vector.java
    index 19824ccec..af63e03c7 100644
    --- a/com/mindviewinc/simple/Vector.java
    +++ b/com/mindviewinc/simple/Vector.java
    @@ -1,5 +1,5 @@
     // com/mindviewinc/simple/Vector.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Creating a package
    diff --git a/compression/GZIPcompress.java b/compression/GZIPcompress.java
    index c9022e780..1b847c57b 100644
    --- a/compression/GZIPcompress.java
    +++ b/compression/GZIPcompress.java
    @@ -1,5 +1,5 @@
     // compression/GZIPcompress.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // {java GZIPcompress GZIPcompress.java}
    diff --git a/compression/ZipCompress.java b/compression/ZipCompress.java
    index f9ce76705..532316029 100644
    --- a/compression/ZipCompress.java
    +++ b/compression/ZipCompress.java
    @@ -1,5 +1,5 @@
     // compression/ZipCompress.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Uses Zip compression to compress any
    diff --git a/concurrent/Baked.java b/concurrent/Baked.java
    index d616d94b8..105a887d5 100644
    --- a/concurrent/Baked.java
    +++ b/concurrent/Baked.java
    @@ -1,5 +1,5 @@
     // concurrent/Baked.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.concurrent.*;
    diff --git a/concurrent/Batter.java b/concurrent/Batter.java
    index 9fe14c4f5..80a9022a3 100644
    --- a/concurrent/Batter.java
    +++ b/concurrent/Batter.java
    @@ -1,5 +1,5 @@
     // concurrent/Batter.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.concurrent.*;
    diff --git a/concurrent/Breakable.java b/concurrent/Breakable.java
    index facd70951..0fcacb383 100644
    --- a/concurrent/Breakable.java
    +++ b/concurrent/Breakable.java
    @@ -1,5 +1,5 @@
     // concurrent/Breakable.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.concurrent.*;
    @@ -11,8 +11,7 @@ public Breakable(String id, int failcount) {
         this.id = id;
         this.failcount = failcount;
       }
    -  @Override
    -  public String toString() {
    +  @Override public String toString() {
         return "Breakable_" + id +
           " [" + failcount + "]";
       }
    diff --git a/concurrent/CachedThreadPool.java b/concurrent/CachedThreadPool.java
    index e0b825a25..11b6bad3a 100644
    --- a/concurrent/CachedThreadPool.java
    +++ b/concurrent/CachedThreadPool.java
    @@ -1,5 +1,5 @@
     // concurrent/CachedThreadPool.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.concurrent.*;
    @@ -16,14 +16,14 @@ public static void main(String[] args) {
       }
     }
     /* Output:
    -NapTask[7] pool-1-thread-8
    -NapTask[4] pool-1-thread-5
     NapTask[1] pool-1-thread-2
    -NapTask[3] pool-1-thread-4
    -NapTask[0] pool-1-thread-1
    +NapTask[5] pool-1-thread-6
    +NapTask[4] pool-1-thread-5
     NapTask[8] pool-1-thread-9
    -NapTask[2] pool-1-thread-3
    +NapTask[0] pool-1-thread-1
     NapTask[9] pool-1-thread-10
    +NapTask[2] pool-1-thread-3
    +NapTask[3] pool-1-thread-4
     NapTask[6] pool-1-thread-7
    -NapTask[5] pool-1-thread-6
    +NapTask[7] pool-1-thread-8
     */
    diff --git a/concurrent/CachedThreadPool2.java b/concurrent/CachedThreadPool2.java
    index 9d7636560..091241e57 100644
    --- a/concurrent/CachedThreadPool2.java
    +++ b/concurrent/CachedThreadPool2.java
    @@ -1,5 +1,5 @@
     // concurrent/CachedThreadPool2.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.concurrent.*;
    @@ -16,14 +16,14 @@ public static void main(String[] args) {
       }
     }
     /* Output:
    -0 pool-1-thread-1 200
    -1 pool-1-thread-2 200
    -4 pool-1-thread-5 300
    -5 pool-1-thread-6 400
    -8 pool-1-thread-9 500
    -9 pool-1-thread-10 600
    -2 pool-1-thread-3 700
    -7 pool-1-thread-8 800
    -3 pool-1-thread-4 900
    -6 pool-1-thread-7 1000
    +3 pool-1-thread-4 100
    +2 pool-1-thread-3 200
    +6 pool-1-thread-7 300
    +7 pool-1-thread-8 400
    +0 pool-1-thread-1 514
    +1 pool-1-thread-2 527
    +4 pool-1-thread-5 627
    +5 pool-1-thread-6 727
    +9 pool-1-thread-10 827
    +8 pool-1-thread-9 927
     */
    diff --git a/concurrent/CachedThreadPool3.java b/concurrent/CachedThreadPool3.java
    index 4b6e6d2e0..919c3c130 100644
    --- a/concurrent/CachedThreadPool3.java
    +++ b/concurrent/CachedThreadPool3.java
    @@ -1,5 +1,5 @@
     // concurrent/CachedThreadPool3.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    @@ -33,15 +33,15 @@ public static void main(String[] args)
       }
     }
     /* Output:
    -1 pool-1-thread-2 100
     0 pool-1-thread-1 100
    -4 pool-1-thread-5 100
    -5 pool-1-thread-6 100
    -8 pool-1-thread-9 100
    -9 pool-1-thread-10 100
    +9 pool-1-thread-1 100
    +1 pool-1-thread-2 100
     2 pool-1-thread-3 100
     3 pool-1-thread-4 100
     6 pool-1-thread-7 100
     7 pool-1-thread-8 100
    +4 pool-1-thread-5 100
    +5 pool-1-thread-6 100
    +8 pool-1-thread-9 100
     sum = 1000
     */
    diff --git a/concurrent/CatchCompletableExceptions.java b/concurrent/CatchCompletableExceptions.java
    index 67451ed46..5c9bcd610 100644
    --- a/concurrent/CatchCompletableExceptions.java
    +++ b/concurrent/CatchCompletableExceptions.java
    @@ -1,5 +1,5 @@
     // concurrent/CatchCompletableExceptions.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.concurrent.*;
    diff --git a/concurrent/CollectionIntoStream.java b/concurrent/CollectionIntoStream.java
    index 2dc51a7e0..4e2f5b3c8 100644
    --- a/concurrent/CollectionIntoStream.java
    +++ b/concurrent/CollectionIntoStream.java
    @@ -1,5 +1,5 @@
     // concurrent/CollectionIntoStream.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import onjava.*;
    diff --git a/concurrent/CompletableApply.java b/concurrent/CompletableApply.java
    index 2f5bd9b48..aeac0e25e 100644
    --- a/concurrent/CompletableApply.java
    +++ b/concurrent/CompletableApply.java
    @@ -1,5 +1,5 @@
     // concurrent/CompletableApply.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.concurrent.*;
    diff --git a/concurrent/CompletableApplyAsync.java b/concurrent/CompletableApplyAsync.java
    index fa7c92711..974d99ffe 100644
    --- a/concurrent/CompletableApplyAsync.java
    +++ b/concurrent/CompletableApplyAsync.java
    @@ -1,5 +1,5 @@
     // concurrent/CompletableApplyAsync.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.concurrent.*;
    @@ -21,11 +21,11 @@ public static void main(String[] args) {
       }
     }
     /* Output:
    -116
    +103
     Machina0: ONE
     Machina0: TWO
     Machina0: THREE
     Machina0: complete
     Machina0: complete
    -552
    +545
     */
    diff --git a/concurrent/CompletableApplyChained.java b/concurrent/CompletableApplyChained.java
    index aa6828d56..6194bc5d8 100644
    --- a/concurrent/CompletableApplyChained.java
    +++ b/concurrent/CompletableApplyChained.java
    @@ -1,5 +1,5 @@
     // concurrent/CompletableApplyChained.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.concurrent.*;
    @@ -23,5 +23,5 @@ public static void main(String[] args) {
     Machina0: TWO
     Machina0: THREE
     Machina0: complete
    -514
    +521
     */
    diff --git a/concurrent/CompletableExceptions.java b/concurrent/CompletableExceptions.java
    index 624815d5f..341a0afc6 100644
    --- a/concurrent/CompletableExceptions.java
    +++ b/concurrent/CompletableExceptions.java
    @@ -1,5 +1,5 @@
     // concurrent/CompletableExceptions.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.concurrent.*;
    diff --git a/concurrent/CompletableOperations.java b/concurrent/CompletableOperations.java
    index d03e8422a..6def117f4 100644
    --- a/concurrent/CompletableOperations.java
    +++ b/concurrent/CompletableOperations.java
    @@ -1,5 +1,5 @@
     // concurrent/CompletableOperations.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.concurrent.*;
    @@ -66,8 +66,8 @@ public static void main(String[] args) {
     cancelled: true
     completed exceptionally: true
     done: true
    -java.util.concurrent.CompletableFuture@6d311334[Complet
    -ed exceptionally]
    +java.util.concurrent.CompletableFuture@1629346[Complete
    +d exceptionally]
     777
     dependents: 1
     dependents: 2
    diff --git a/concurrent/CompletablePizza.java b/concurrent/CompletablePizza.java
    index 97b68545f..7003f7d29 100644
    --- a/concurrent/CompletablePizza.java
    +++ b/concurrent/CompletablePizza.java
    @@ -1,5 +1,5 @@
     // concurrent/CompletablePizza.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    @@ -42,46 +42,46 @@ public static void main(String[] args) {
       }
     }
     /* Output:
    -169
    -Pizza 0: ROLLED
    +98
     Pizza 1: ROLLED
    -Pizza 2: ROLLED
    -Pizza 4: ROLLED
     Pizza 3: ROLLED
    +Pizza 4: ROLLED
    +Pizza 2: ROLLED
    +Pizza 0: ROLLED
     Pizza 1: SAUCED
    -Pizza 0: SAUCED
     Pizza 2: SAUCED
    -Pizza 4: SAUCED
     Pizza 3: SAUCED
    -Pizza 0: CHEESED
    -Pizza 4: CHEESED
    -Pizza 1: CHEESED
    +Pizza 0: SAUCED
    +Pizza 4: SAUCED
     Pizza 2: CHEESED
    +Pizza 0: CHEESED
     Pizza 3: CHEESED
    -Pizza 0: TOPPED
    +Pizza 1: CHEESED
    +Pizza 4: CHEESED
    +Pizza 2: TOPPED
     Pizza 4: TOPPED
     Pizza 1: TOPPED
    -Pizza 2: TOPPED
     Pizza 3: TOPPED
    +Pizza 0: TOPPED
     Pizza 0: BAKED
     Pizza 4: BAKED
     Pizza 1: BAKED
     Pizza 3: BAKED
     Pizza 2: BAKED
    -Pizza 0: SLICED
    -Pizza 4: SLICED
    -Pizza 1: SLICED
     Pizza 3: SLICED
    +Pizza 1: SLICED
     Pizza 2: SLICED
    -Pizza 4: BOXED
    +Pizza 4: SLICED
    +Pizza 0: SLICED
     Pizza 0: BOXED
    -Pizza0: complete
    +Pizza 2: BOXED
    +Pizza 4: BOXED
     Pizza 1: BOXED
    +Pizza0: complete
     Pizza1: complete
    -Pizza 3: BOXED
    -Pizza 2: BOXED
     Pizza2: complete
    +Pizza 3: BOXED
     Pizza3: complete
     Pizza4: complete
    -1797
    +1762
     */
    diff --git a/concurrent/CompletableUtilities.java b/concurrent/CompletableUtilities.java
    index 8f3a0e51a..e1099d6b8 100644
    --- a/concurrent/CompletableUtilities.java
    +++ b/concurrent/CompletableUtilities.java
    @@ -1,5 +1,5 @@
     // concurrent/CompletableUtilities.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package onjava;
    diff --git a/concurrent/CompletedMachina.java b/concurrent/CompletedMachina.java
    index 06a787109..d6684e962 100644
    --- a/concurrent/CompletedMachina.java
    +++ b/concurrent/CompletedMachina.java
    @@ -1,5 +1,5 @@
     // concurrent/CompletedMachina.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.concurrent.*;
    diff --git a/concurrent/CountingStream.java b/concurrent/CountingStream.java
    index 4cebb24e1..47a1a77fb 100644
    --- a/concurrent/CountingStream.java
    +++ b/concurrent/CountingStream.java
    @@ -1,5 +1,5 @@
     // concurrent/CountingStream.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // {VisuallyInspectOutput}
    diff --git a/concurrent/CountingTask.java b/concurrent/CountingTask.java
    index b1fb7b89f..140adfed9 100644
    --- a/concurrent/CountingTask.java
    +++ b/concurrent/CountingTask.java
    @@ -1,5 +1,5 @@
     // concurrent/CountingTask.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.concurrent.*;
    @@ -7,8 +7,7 @@
     public class CountingTask implements Callable {
       final int id;
       public CountingTask(int id) { this.id = id; }
    -  @Override
    -  public Integer call() {
    +  @Override public Integer call() {
         Integer val = 0;
         for(int i = 0; i < 100; i++)
           val++;
    diff --git a/concurrent/DiningPhilosophers.java b/concurrent/DiningPhilosophers.java
    index 5c2b2f1b2..8b54820a1 100644
    --- a/concurrent/DiningPhilosophers.java
    +++ b/concurrent/DiningPhilosophers.java
    @@ -1,5 +1,5 @@
     // concurrent/DiningPhilosophers.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Hidden deadlock
    diff --git a/concurrent/DualCompletableOperations.java b/concurrent/DualCompletableOperations.java
    index 420523121..dd7048d91 100644
    --- a/concurrent/DualCompletableOperations.java
    +++ b/concurrent/DualCompletableOperations.java
    @@ -1,5 +1,5 @@
     // concurrent/DualCompletableOperations.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.concurrent.*;
    diff --git a/concurrent/FrostedCake.java b/concurrent/FrostedCake.java
    index 1be8b661d..77a15fcfe 100644
    --- a/concurrent/FrostedCake.java
    +++ b/concurrent/FrostedCake.java
    @@ -1,5 +1,5 @@
     // concurrent/FrostedCake.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.concurrent.*;
    @@ -19,8 +19,9 @@ public class FrostedCake {
       public FrostedCake(Baked baked, Frosting frosting) {
         new Nap(0.1);
       }
    -  @Override
    -  public String toString() { return "FrostedCake"; }
    +  @Override public String toString() {
    +    return "FrostedCake";
    +  }
       public static void main(String[] args) {
         Baked.batch().forEach(baked -> baked
           .thenCombineAsync(Frosting.make(),
    diff --git a/concurrent/Futures.java b/concurrent/Futures.java
    index 888e7f0d9..55bb483cb 100644
    --- a/concurrent/Futures.java
    +++ b/concurrent/Futures.java
    @@ -1,5 +1,5 @@
     // concurrent/Futures.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    @@ -13,7 +13,7 @@ public static void main(String[] args)
           Executors.newSingleThreadExecutor();
         Future f =
           exec.submit(new CountingTask(99));
    -    System.out.println(f.get()); // [1]
    +    System.out.println(f.get());               // [1]
         exec.shutdown();
       }
     }
    diff --git a/concurrent/GuardedIDField.java b/concurrent/GuardedIDField.java
    index e570a5d32..8dd2ddd29 100644
    --- a/concurrent/GuardedIDField.java
    +++ b/concurrent/GuardedIDField.java
    @@ -1,5 +1,5 @@
     // concurrent/GuardedIDField.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.concurrent.atomic.*;
    @@ -8,7 +8,7 @@ public class GuardedIDField implements HasID {
       private static AtomicInteger counter =
         new AtomicInteger();
       private int id = counter.getAndIncrement();
    -  public int getID() { return id; }
    +  @Override public int getID() { return id; }
       public static void main(String[] args) {
         IDChecker.test(GuardedIDField::new);
       }
    diff --git a/concurrent/HasID.java b/concurrent/HasID.java
    index e5e134388..a9734e39f 100644
    --- a/concurrent/HasID.java
    +++ b/concurrent/HasID.java
    @@ -1,5 +1,5 @@
     // concurrent/HasID.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
    diff --git a/concurrent/IDChecker.java b/concurrent/IDChecker.java
    index 845c9e6a4..31c45ef66 100644
    --- a/concurrent/IDChecker.java
    +++ b/concurrent/IDChecker.java
    @@ -1,5 +1,5 @@
     // concurrent/IDChecker.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    @@ -16,8 +16,7 @@ static class MakeObjects
         MakeObjects(Supplier gen) {
           this.gen = gen;
         }
    -    @Override
    -    public List get() {
    +    @Override public List get() {
           return
             Stream.generate(gen)
               .limit(SIZE)
    diff --git a/concurrent/InterferingTask.java b/concurrent/InterferingTask.java
    index da08f6539..8715741b8 100644
    --- a/concurrent/InterferingTask.java
    +++ b/concurrent/InterferingTask.java
    @@ -1,5 +1,5 @@
     // concurrent/InterferingTask.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
    @@ -7,8 +7,7 @@ public class InterferingTask implements Runnable {
       final int id;
       private static Integer val = 0;
       public InterferingTask(int id) { this.id = id; }
    -  @Override
    -  public void run() {
    +  @Override public void run() {
         for(int i = 0; i < 100; i++)
           val++;
         System.out.println(id + " " +
    diff --git a/concurrent/LambdasAndMethodReferences.java b/concurrent/LambdasAndMethodReferences.java
    index 10552499a..cb124b6b7 100644
    --- a/concurrent/LambdasAndMethodReferences.java
    +++ b/concurrent/LambdasAndMethodReferences.java
    @@ -1,5 +1,5 @@
     // concurrent/LambdasAndMethodReferences.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.concurrent.*;
    @@ -34,7 +34,7 @@ public static void main(String[] args)
     }
     /* Output:
     Lambda1
    -NotCallable
     NotRunnable
     Lambda2
    +NotCallable
     */
    diff --git a/concurrent/Machina.java b/concurrent/Machina.java
    index e70cd2b4c..57175c267 100644
    --- a/concurrent/Machina.java
    +++ b/concurrent/Machina.java
    @@ -1,5 +1,5 @@
     // concurrent/Machina.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import onjava.Nap;
    @@ -23,8 +23,7 @@ public static Machina work(Machina m) {
         System.out.println(m);
         return m;
       }
    -  @Override
    -  public String toString() {
    +  @Override public String toString() {
         return "Machina" + id + ": " +
           (state.equals(State.END)? "complete" : state);
       }
    diff --git a/concurrent/MoreTasksAfterShutdown.java b/concurrent/MoreTasksAfterShutdown.java
    index 28b96af83..31a142e16 100644
    --- a/concurrent/MoreTasksAfterShutdown.java
    +++ b/concurrent/MoreTasksAfterShutdown.java
    @@ -1,5 +1,5 @@
     // concurrent/MoreTasksAfterShutdown.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.concurrent.*;
    @@ -20,8 +20,7 @@ public static void main(String[] args) {
     /* Output:
     java.util.concurrent.RejectedExecutionException: Task
     NapTask[99] rejected from java.util.concurrent.ThreadPo
    -olExecutor@4e25154f[Shutting down, pool size = 1,
    -active threads = 1, queued tasks = 0, completed tasks =
    -0]
    +olExecutor@106d69c[Shutting down, pool size = 1, active
    +threads = 1, queued tasks = 0, completed tasks = 0]
     NapTask[1] pool-1-thread-1
     */
    diff --git a/concurrent/NapTask.java b/concurrent/NapTask.java
    index 92df6b602..9206eb4e8 100644
    --- a/concurrent/NapTask.java
    +++ b/concurrent/NapTask.java
    @@ -1,5 +1,5 @@
     // concurrent/NapTask.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import onjava.Nap;
    @@ -7,14 +7,12 @@
     public class NapTask implements Runnable {
       final int id;
       public NapTask(int id) { this.id = id; }
    -  @Override
    -  public void run() {
    +  @Override public void run() {
         new Nap(0.1); // Seconds
         System.out.println(this + " " +
           Thread.currentThread().getName());
       }
    -  @Override
    -  public String toString() {
    +  @Override public String toString() {
         return "NapTask[" + id + "]";
       }
     }
    diff --git a/concurrent/OnePizza.java b/concurrent/OnePizza.java
    index f4f27249f..b8298ebbc 100644
    --- a/concurrent/OnePizza.java
    +++ b/concurrent/OnePizza.java
    @@ -1,5 +1,5 @@
     // concurrent/OnePizza.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import onjava.Timer;
    @@ -22,5 +22,5 @@ public static void main(String[] args) {
     Pizza 0: BAKED
     Pizza 0: SLICED
     Pizza 0: BOXED
    -1622
    +1665
     */
    diff --git a/concurrent/PSP2.txt b/concurrent/PSP2.txt
    new file mode 100644
    index 000000000..4b372a616
    --- /dev/null
    +++ b/concurrent/PSP2.txt
    @@ -0,0 +1,11 @@
    +0: main
    +1: main
    +2: main
    +3: main
    +4: main
    +5: main
    +6: main
    +7: main
    +8: main
    +9: main
    +10: ForkJoinPool.commonPool-worker-5
    diff --git a/concurrent/ParallelPrime.java b/concurrent/ParallelPrime.java
    index 97c025756..84ed969db 100644
    --- a/concurrent/ParallelPrime.java
    +++ b/concurrent/ParallelPrime.java
    @@ -1,5 +1,5 @@
     // concurrent/ParallelPrime.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    @@ -20,7 +20,7 @@ public static void main(String[] args)
         Timer timer = new Timer();
         List primes =
           iterate(2, i -> i + 1)
    -        .parallel()              // [1]
    +        .parallel()                       // [1]
             .filter(ParallelPrime::isPrime)
             .limit(COUNT)
             .mapToObj(Long::toString)
    @@ -31,5 +31,5 @@ public static void main(String[] args)
       }
     }
     /* Output:
    -1224
    +1635
     */
    diff --git a/concurrent/ParallelStreamPuzzle.java b/concurrent/ParallelStreamPuzzle.java
    index f57dec24a..0993d7b91 100644
    --- a/concurrent/ParallelStreamPuzzle.java
    +++ b/concurrent/ParallelStreamPuzzle.java
    @@ -1,5 +1,5 @@
     // concurrent/ParallelStreamPuzzle.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    @@ -10,7 +10,7 @@ public class ParallelStreamPuzzle {
       static class IntGenerator
       implements Supplier {
         private int current = 0;
    -    public Integer get() {
    +    @Override public Integer get() {
           return current++;
         }
       }
    @@ -18,7 +18,7 @@ public static void main(String[] args) {
         List x =
           Stream.generate(new IntGenerator())
             .limit(10)
    -        .parallel()  // [1]
    +        .parallel()                     // [1]
             .collect(Collectors.toList());
         System.out.println(x);
       }
    diff --git a/concurrent/ParallelStreamPuzzle2.java b/concurrent/ParallelStreamPuzzle2.java
    index 2fc11d482..ff8b5ed15 100644
    --- a/concurrent/ParallelStreamPuzzle2.java
    +++ b/concurrent/ParallelStreamPuzzle2.java
    @@ -1,5 +1,5 @@
     // concurrent/ParallelStreamPuzzle2.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    @@ -16,7 +16,7 @@ public class ParallelStreamPuzzle2 {
       IntGenerator implements Supplier {
         private AtomicInteger current =
           new AtomicInteger();
    -    public Integer get() {
    +    @Override public Integer get() {
           trace.add(current.get() + ": " +
             Thread.currentThread().getName());
           return current.getAndIncrement();
    @@ -34,5 +34,5 @@ public Integer get() {
       }
     }
     /* Output:
    -[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    +[1, 5, 7, 8, 9, 11, 13, 15, 18, 21]
     */
    diff --git a/concurrent/ParallelStreamPuzzle3.java b/concurrent/ParallelStreamPuzzle3.java
    index 757bddd5b..69a35618f 100644
    --- a/concurrent/ParallelStreamPuzzle3.java
    +++ b/concurrent/ParallelStreamPuzzle3.java
    @@ -1,5 +1,5 @@
     // concurrent/ParallelStreamPuzzle3.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // {VisuallyInspectOutput}
    diff --git a/concurrent/Philosopher.java b/concurrent/Philosopher.java
    index 48facb382..7fa356846 100644
    --- a/concurrent/Philosopher.java
    +++ b/concurrent/Philosopher.java
    @@ -1,5 +1,5 @@
     // concurrent/Philosopher.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
    @@ -12,12 +12,10 @@ public Philosopher(int seat,
         this.left = left;
         this.right = right;
       }
    -  @Override
    -  public String toString() {
    +  @Override public String toString() {
         return "P" + seat;
       }
    -  @Override
    -  public void run() {
    +  @Override public void run() {
         while(true) {
           // System.out.println("Thinking");   // [1]
           right.pickUp();
    diff --git a/concurrent/Pizza.java b/concurrent/Pizza.java
    index 8cd5ff30b..6325b930f 100644
    --- a/concurrent/Pizza.java
    +++ b/concurrent/Pizza.java
    @@ -1,5 +1,5 @@
     // concurrent/Pizza.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.function.*;
    @@ -41,8 +41,7 @@ public Pizza next(Step previousStep) {
       public boolean complete() {
         return step.equals(Step.BOXED);
       }
    -  @Override
    -  public String toString() {
    +  @Override public String toString() {
         return "Pizza" + id + ": " +
           (step.equals(Step.BOXED)? "complete" : step);
       }
    diff --git a/concurrent/PizzaParallelSteps.java b/concurrent/PizzaParallelSteps.java
    index 605e99853..a6ccb3e23 100644
    --- a/concurrent/PizzaParallelSteps.java
    +++ b/concurrent/PizzaParallelSteps.java
    @@ -1,5 +1,5 @@
     // concurrent/PizzaParallelSteps.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    @@ -25,45 +25,45 @@ public static void main(String[] args) {
       }
     }
     /* Output:
    +Pizza 1: ROLLED
     Pizza 2: ROLLED
     Pizza 0: ROLLED
    -Pizza 1: ROLLED
    -Pizza 4: ROLLED
     Pizza 3: ROLLED
    -Pizza 1: SAUCED
    -Pizza 0: SAUCED
    +Pizza 4: ROLLED
    +Pizza 4: SAUCED
     Pizza 2: SAUCED
    +Pizza 0: SAUCED
    +Pizza 1: SAUCED
     Pizza 3: SAUCED
    -Pizza 4: SAUCED
     Pizza 1: CHEESED
    -Pizza 0: CHEESED
    -Pizza 2: CHEESED
     Pizza 3: CHEESED
     Pizza 4: CHEESED
    +Pizza 2: CHEESED
    +Pizza 0: CHEESED
    +Pizza 3: TOPPED
    +Pizza 1: TOPPED
     Pizza 0: TOPPED
     Pizza 2: TOPPED
    -Pizza 1: TOPPED
    -Pizza 3: TOPPED
     Pizza 4: TOPPED
    -Pizza 1: BAKED
     Pizza 2: BAKED
    +Pizza 3: BAKED
    +Pizza 1: BAKED
     Pizza 0: BAKED
     Pizza 4: BAKED
    -Pizza 3: BAKED
    -Pizza 0: SLICED
    -Pizza 2: SLICED
    -Pizza 1: SLICED
     Pizza 3: SLICED
    +Pizza 1: SLICED
    +Pizza 2: SLICED
    +Pizza 0: SLICED
     Pizza 4: SLICED
    +Pizza 3: BOXED
    +Pizza3: complete
     Pizza 1: BOXED
     Pizza1: complete
     Pizza 2: BOXED
     Pizza 0: BOXED
    -Pizza2: complete
     Pizza0: complete
    -Pizza 3: BOXED
    +Pizza2: complete
     Pizza 4: BOXED
     Pizza4: complete
    -Pizza3: complete
    -1738
    +1766
     */
    diff --git a/concurrent/PizzaStreams.java b/concurrent/PizzaStreams.java
    index 16be983a7..8ec339bee 100644
    --- a/concurrent/PizzaStreams.java
    +++ b/concurrent/PizzaStreams.java
    @@ -1,5 +1,5 @@
     // concurrent/PizzaStreams.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    @@ -12,7 +12,7 @@ public static void main(String[] args) {
         Timer timer = new Timer();
         IntStream.range(0, QUANTITY)
           .mapToObj(Pizza::new)
    -      .parallel()             // [1]
    +      .parallel()                   // [1]
           .forEach(za -> {
             while(!za.complete())
               za.next();
    @@ -21,40 +21,40 @@ public static void main(String[] args) {
       }
     }
     /* Output:
    -Pizza 2: ROLLED
     Pizza 0: ROLLED
     Pizza 1: ROLLED
    -Pizza 4: ROLLED
    +Pizza 2: ROLLED
     Pizza 3: ROLLED
    -Pizza 2: SAUCED
    +Pizza 4: ROLLED
     Pizza 1: SAUCED
     Pizza 0: SAUCED
     Pizza 4: SAUCED
    +Pizza 2: SAUCED
     Pizza 3: SAUCED
    +Pizza 3: CHEESED
     Pizza 2: CHEESED
    -Pizza 1: CHEESED
    -Pizza 0: CHEESED
     Pizza 4: CHEESED
    -Pizza 3: CHEESED
    +Pizza 0: CHEESED
    +Pizza 1: CHEESED
    +Pizza 3: TOPPED
     Pizza 2: TOPPED
    +Pizza 4: TOPPED
     Pizza 1: TOPPED
     Pizza 0: TOPPED
    -Pizza 4: TOPPED
    -Pizza 3: TOPPED
    -Pizza 2: BAKED
    -Pizza 1: BAKED
    -Pizza 0: BAKED
     Pizza 4: BAKED
    +Pizza 2: BAKED
     Pizza 3: BAKED
    -Pizza 2: SLICED
    -Pizza 1: SLICED
    -Pizza 0: SLICED
    +Pizza 0: BAKED
    +Pizza 1: BAKED
     Pizza 4: SLICED
     Pizza 3: SLICED
    +Pizza 2: SLICED
    +Pizza 0: SLICED
    +Pizza 1: SLICED
     Pizza 2: BOXED
    -Pizza 1: BOXED
    -Pizza 0: BOXED
     Pizza 4: BOXED
     Pizza 3: BOXED
    -1739
    +Pizza 1: BOXED
    +Pizza 0: BOXED
    +1797
     */
    diff --git a/concurrent/QuittableTask.java b/concurrent/QuittableTask.java
    index 3cf2a62e4..e2a1bab23 100644
    --- a/concurrent/QuittableTask.java
    +++ b/concurrent/QuittableTask.java
    @@ -1,5 +1,5 @@
     // concurrent/QuittableTask.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.concurrent.atomic.AtomicBoolean;
    @@ -11,10 +11,9 @@ public class QuittableTask implements Runnable {
       private AtomicBoolean running =
         new AtomicBoolean(true);
       public void quit() { running.set(false); }
    -  @Override
    -  public void run() {
    -    while(running.get())         // [1]
    +  @Override public void run() {
    +    while(running.get())                  // [1]
           new Nap(0.1);
    -    System.out.print(id + " ");  // [2]
    +    System.out.print(id + " ");           // [2]
       }
     }
    diff --git a/concurrent/QuittingCompletable.java b/concurrent/QuittingCompletable.java
    index e41e38999..7fb9c0fca 100644
    --- a/concurrent/QuittingCompletable.java
    +++ b/concurrent/QuittingCompletable.java
    @@ -1,5 +1,5 @@
     // concurrent/QuittingCompletable.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    @@ -23,13 +23,13 @@ public static void main(String[] args) {
       }
     }
     /* Output:
    -7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
    -26 27 28 29 30 31 32 33 34 6 35 4 38 39 40 41 42 43 44
    -45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62
    -63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80
    -81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98
    -99 100 101 102 103 104 105 106 107 108 109 110 111 112
    -1 113 114 116 117 118 119 120 121 122 123 124 125 126
    -127 128 129 130 131 132 133 134 135 136 137 138 139 140
    -141 142 143 144 145 146 147 148 149 5 115 37 36 2 3
    +6 7 5 9 11 12 13 14 15 16 17 18 19 20 21 22 23 10 24 26
    +27 28 29 30 31 32 25 33 8 36 37 38 39 40 41 42 43 44 45
    +46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
    +64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81
    +82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99
    +100 101 102 103 104 105 106 107 108 34 110 111 112 113
    +114 115 116 117 118 119 120 121 109 123 124 125 126 127
    +128 129 130 131 35 132 122 134 133 136 135 138 140 141
    +142 143 144 145 146 147 148 149 137 139 3 1 2 4
     */
    diff --git a/concurrent/QuittingTasks.java b/concurrent/QuittingTasks.java
    index 326e24ce1..58618e531 100644
    --- a/concurrent/QuittingTasks.java
    +++ b/concurrent/QuittingTasks.java
    @@ -1,5 +1,5 @@
     // concurrent/QuittingTasks.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    @@ -23,13 +23,13 @@ public static void main(String[] args) {
       }
     }
     /* Output:
    -24 27 31 8 11 7 19 12 16 4 23 3 28 32 15 20 63 60 68 67
    -64 39 47 52 51 55 40 43 48 59 44 56 36 35 71 72 83 103
    -96 92 88 99 100 87 91 79 75 84 76 115 108 112 104 107
    -111 95 80 147 120 127 119 123 144 143 116 132 124 128
    -136 131 135 139 148 140 2 126 6 5 1 18 129 17 14 13 21
    -22 9 10 30 33 58 37 125 26 34 133 145 78 137 141 138 62
    -74 142 86 65 73 146 70 42 149 121 110 134 105 82 117
    -106 113 122 45 114 118 38 50 29 90 101 89 57 53 94 41
    -61 66 130 69 77 81 85 93 25 102 54 109 98 49 46 97
    +11 23 20 12 24 16 19 15 35 147 32 27 7 4 28 31 8 83 3 1
    +13 9 5 2 6 18 14 17 21 25 22 26 29 30 33 34 37 41 38 46
    +45 49 50 53 57 58 54 69 104 112 40 73 74 115 116 70 119
    +77 81 56 85 78 82 111 86 90 48 89 36 108 107 44 55 52
    +43 60 63 59 64 71 68 67 75 76 72 79 80 84 87 88 66 91
    +10 95 65 96 94 92 62 100 61 93 47 39 51 99 103 128 123
    +127 124 140 120 139 136 135 143 148 144 105 102 131 101
    +132 98 97 149 137 134 42 106 110 109 114 133 113 117
    +118 130 129 126 121 125 122 138 141 145 142 146
     */
    diff --git a/concurrent/SharedConstructorArgument.java b/concurrent/SharedConstructorArgument.java
    index 4b09cc26c..9746ff761 100644
    --- a/concurrent/SharedConstructorArgument.java
    +++ b/concurrent/SharedConstructorArgument.java
    @@ -1,5 +1,5 @@
     // concurrent/SharedConstructorArgument.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.concurrent.atomic.*;
    @@ -10,13 +10,13 @@ interface SharedArg {
     
     class Unsafe implements SharedArg {
       private int i = 0;
    -  public int get() { return i++; }
    +  @Override public int get() { return i++; }
     }
     
     class Safe implements SharedArg {
       private static AtomicInteger counter =
         new AtomicInteger();
    -  public int get() {
    +  @Override public int get() {
         return counter.getAndIncrement();
       }
     }
    @@ -26,8 +26,7 @@ class SharedUser implements HasID {
       SharedUser(SharedArg sa) {
         id = sa.get();
       }
    -  @Override
    -  public int getID() { return id; }
    +  @Override public int getID() { return id; }
     }
     
     public class SharedConstructorArgument {
    @@ -39,6 +38,6 @@ public static void main(String[] args) {
       }
     }
     /* Output:
    -24838
    +16537
     0
     */
    diff --git a/concurrent/SingleThreadExecutor.java b/concurrent/SingleThreadExecutor.java
    index ef89e3a53..12629d433 100644
    --- a/concurrent/SingleThreadExecutor.java
    +++ b/concurrent/SingleThreadExecutor.java
    @@ -1,5 +1,5 @@
     // concurrent/SingleThreadExecutor.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.concurrent.*;
    @@ -30,17 +30,17 @@ public static void main(String[] args) {
     NapTask[0] pool-1-thread-1
     main awaiting termination
     NapTask[1] pool-1-thread-1
    -main awaiting termination
     NapTask[2] pool-1-thread-1
     main awaiting termination
     NapTask[3] pool-1-thread-1
     main awaiting termination
    -NapTask[4] pool-1-thread-1
     main awaiting termination
    +NapTask[4] pool-1-thread-1
     NapTask[5] pool-1-thread-1
     main awaiting termination
     NapTask[6] pool-1-thread-1
     main awaiting termination
    +main awaiting termination
     NapTask[7] pool-1-thread-1
     main awaiting termination
     NapTask[8] pool-1-thread-1
    diff --git a/concurrent/SingleThreadExecutor2.java b/concurrent/SingleThreadExecutor2.java
    index 08467df5a..81657338f 100644
    --- a/concurrent/SingleThreadExecutor2.java
    +++ b/concurrent/SingleThreadExecutor2.java
    @@ -1,5 +1,5 @@
     // concurrent/SingleThreadExecutor2.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.concurrent.*;
    diff --git a/concurrent/SingleThreadExecutor3.java b/concurrent/SingleThreadExecutor3.java
    index 581494238..d32c667f1 100644
    --- a/concurrent/SingleThreadExecutor3.java
    +++ b/concurrent/SingleThreadExecutor3.java
    @@ -1,5 +1,5 @@
     // concurrent/SingleThreadExecutor3.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.concurrent.*;
    diff --git a/concurrent/StaticIDField.java b/concurrent/StaticIDField.java
    index 22623faaf..deefbb62e 100644
    --- a/concurrent/StaticIDField.java
    +++ b/concurrent/StaticIDField.java
    @@ -1,10 +1,10 @@
     // concurrent/StaticIDField.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
     public class StaticIDField implements HasID {
       private static int counter = 0;
       private int id = counter++;
    -  public int getID() { return id; }
    +  @Override public int getID() { return id; }
     }
    diff --git a/concurrent/StickHolder.java b/concurrent/StickHolder.java
    index 719a1c635..f4f9279ca 100644
    --- a/concurrent/StickHolder.java
    +++ b/concurrent/StickHolder.java
    @@ -1,5 +1,5 @@
     // concurrent/StickHolder.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.concurrent.*;
    diff --git a/concurrent/StreamExceptions.java b/concurrent/StreamExceptions.java
    index 493daee1f..e02b42743 100644
    --- a/concurrent/StreamExceptions.java
    +++ b/concurrent/StreamExceptions.java
    @@ -1,5 +1,5 @@
     // concurrent/StreamExceptions.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.concurrent.*;
    diff --git a/concurrent/Summing.java b/concurrent/Summing.java
    index 321dcb573..ae97efca2 100644
    --- a/concurrent/Summing.java
    +++ b/concurrent/Summing.java
    @@ -1,5 +1,5 @@
     // concurrent/Summing.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.stream.*;
    @@ -41,7 +41,7 @@ public static void main(String[] args) {
     }
     /* Output:
     5000000050000000
    -Sum Stream: 167ms
    -Sum Stream Parallel: 46ms
    -Sum Iterated: 284ms
    +Sum Stream: 841ms
    +Sum Stream Parallel: 179ms
    +Sum Iterated: 4051ms
     */
    diff --git a/concurrent/Summing2.java b/concurrent/Summing2.java
    index c046721f0..257a53138 100644
    --- a/concurrent/Summing2.java
    +++ b/concurrent/Summing2.java
    @@ -1,5 +1,5 @@
     // concurrent/Summing2.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // {ExcludeFromTravisCI}
    @@ -37,8 +37,8 @@ public static void main(String[] args) {
     }
     /* Output:
     200000010000000
    -Array Stream Sum: 104ms
    -Parallel: 81ms
    -Basic Sum: 106ms
    -parallelPrefix: 265ms
    +Array Stream Sum: 166ms
    +Parallel: 30ms
    +Basic Sum: 45ms
    +parallelPrefix: 53ms
     */
    diff --git a/concurrent/Summing3.java b/concurrent/Summing3.java
    index 252e96f7e..3af34db21 100644
    --- a/concurrent/Summing3.java
    +++ b/concurrent/Summing3.java
    @@ -1,5 +1,5 @@
     // concurrent/Summing3.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // {ExcludeFromTravisCI}
    @@ -36,7 +36,7 @@ public static void main(String[] args) {
     }
     /* Output:
     50000005000000
    -Long Array Stream Reduce: 1038ms
    -Long Basic Sum: 21ms
    -Long parallelPrefix: 3616ms
    +Long Array Stream Reduce: 1510ms
    +Long Basic Sum: 35ms
    +Long parallelPrefix: 4306ms
     */
    diff --git a/concurrent/Summing4.java b/concurrent/Summing4.java
    index bb4fe2ea2..03dc04ba0 100644
    --- a/concurrent/Summing4.java
    +++ b/concurrent/Summing4.java
    @@ -1,5 +1,5 @@
     // concurrent/Summing4.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // {ExcludeFromTravisCI}
    @@ -19,5 +19,5 @@ public static void main(String[] args) {
     }
     /* Output:
     50000005000000
    -Long Parallel: 1014ms
    +Long Parallel: 1147ms
     */
    diff --git a/concurrent/SynchronizedConstructor.java b/concurrent/SynchronizedConstructor.java
    index 95aa6a542..092c9733b 100644
    --- a/concurrent/SynchronizedConstructor.java
    +++ b/concurrent/SynchronizedConstructor.java
    @@ -1,5 +1,5 @@
     // concurrent/SynchronizedConstructor.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.concurrent.atomic.*;
    @@ -13,8 +13,7 @@ class SyncConstructor implements HasID {
           id = sa.get();
         }
       }
    -  @Override
    -  public int getID() { return id; }
    +  @Override public int getID() { return id; }
     }
     
     public class SynchronizedConstructor {
    diff --git a/concurrent/SynchronizedFactory.java b/concurrent/SynchronizedFactory.java
    index 669d4d76b..11e5f184b 100644
    --- a/concurrent/SynchronizedFactory.java
    +++ b/concurrent/SynchronizedFactory.java
    @@ -1,5 +1,5 @@
     // concurrent/SynchronizedFactory.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.concurrent.atomic.*;
    @@ -9,8 +9,7 @@ final class SyncFactory implements HasID {
       private SyncFactory(SharedArg sa) {
         id = sa.get();
       }
    -  @Override
    -  public int getID() { return id; }
    +  @Override public int getID() { return id; }
       public static synchronized
       SyncFactory factory(SharedArg sa) {
         return new SyncFactory(sa);
    diff --git a/concurrent/TestStaticIDField.java b/concurrent/TestStaticIDField.java
    index 5df298b76..6f10da7cf 100644
    --- a/concurrent/TestStaticIDField.java
    +++ b/concurrent/TestStaticIDField.java
    @@ -1,5 +1,5 @@
     // concurrent/TestStaticIDField.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
    @@ -9,5 +9,5 @@ public static void main(String[] args) {
       }
     }
     /* Output:
    -13287
    +21397
     */
    diff --git a/concurrent/ThrowsChecked.java b/concurrent/ThrowsChecked.java
    index 59177b35a..f198cc6c0 100644
    --- a/concurrent/ThrowsChecked.java
    +++ b/concurrent/ThrowsChecked.java
    @@ -1,5 +1,5 @@
     // concurrent/ThrowsChecked.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.stream.*;
    @@ -17,7 +17,7 @@ static ThrowsChecked nochecked(ThrowsChecked tc) {
       static void testStream() {
         Stream.of(new ThrowsChecked())
           .map(ThrowsChecked::nochecked)
    -      // .map(ThrowsChecked::withchecked); // [1]
    +      // .map(ThrowsChecked::withchecked);        // [1]
           .map(tc -> {
             try {
               return withchecked(tc);
    @@ -30,7 +30,7 @@ static void testCompletableFuture() {
         CompletableFuture
           .completedFuture(new ThrowsChecked())
           .thenApply(ThrowsChecked::nochecked)
    -      // .thenApply(ThrowsChecked::withchecked); // [2]
    +      // .thenApply(ThrowsChecked::withchecked);  // [2]
           .thenApply(tc -> {
             try {
               return withchecked(tc);
    diff --git a/concurrent/Workable.java b/concurrent/Workable.java
    index fcdbbbf80..ada83c2f6 100644
    --- a/concurrent/Workable.java
    +++ b/concurrent/Workable.java
    @@ -1,5 +1,5 @@
     // concurrent/Workable.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.concurrent.*;
    @@ -12,8 +12,7 @@ public Workable(String id, double duration) {
         this.id = id;
         this.duration = duration;
       }
    -  @Override
    -  public String toString() {
    +  @Override public String toString() {
         return "Workable[" + id + "]";
       }
       public static Workable work(Workable tt) {
    diff --git a/concurrent/primes.txt b/concurrent/primes.txt
    new file mode 100644
    index 000000000..6dc8a58ab
    --- /dev/null
    +++ b/concurrent/primes.txt
    @@ -0,0 +1,100000 @@
    +2
    +3
    +5
    +7
    +11
    +13
    +17
    +19
    +23
    +29
    +31
    +37
    +41
    +43
    +47
    +53
    +59
    +61
    +67
    +71
    +73
    +79
    +83
    +89
    +97
    +101
    +103
    +107
    +109
    +113
    +127
    +131
    +137
    +139
    +149
    +151
    +157
    +163
    +167
    +173
    +179
    +181
    +191
    +193
    +197
    +199
    +211
    +223
    +227
    +229
    +233
    +239
    +241
    +251
    +257
    +263
    +269
    +271
    +277
    +281
    +283
    +293
    +307
    +311
    +313
    +317
    +331
    +337
    +347
    +349
    +353
    +359
    +367
    +373
    +379
    +383
    +389
    +397
    +401
    +409
    +419
    +421
    +431
    +433
    +439
    +443
    +449
    +457
    +461
    +463
    +467
    +479
    +487
    +491
    +499
    +503
    +509
    +521
    +523
    +541
    +547
    +557
    +563
    +569
    +571
    +577
    +587
    +593
    +599
    +601
    +607
    +613
    +617
    +619
    +631
    +641
    +643
    +647
    +653
    +659
    +661
    +673
    +677
    +683
    +691
    +701
    +709
    +719
    +727
    +733
    +739
    +743
    +751
    +757
    +761
    +769
    +773
    +787
    +797
    +809
    +811
    +821
    +823
    +827
    +829
    +839
    +853
    +857
    +859
    +863
    +877
    +881
    +883
    +887
    +907
    +911
    +919
    +929
    +937
    +941
    +947
    +953
    +967
    +971
    +977
    +983
    +991
    +997
    +1009
    +1013
    +1019
    +1021
    +1031
    +1033
    +1039
    +1049
    +1051
    +1061
    +1063
    +1069
    +1087
    +1091
    +1093
    +1097
    +1103
    +1109
    +1117
    +1123
    +1129
    +1151
    +1153
    +1163
    +1171
    +1181
    +1187
    +1193
    +1201
    +1213
    +1217
    +1223
    +1229
    +1231
    +1237
    +1249
    +1259
    +1277
    +1279
    +1283
    +1289
    +1291
    +1297
    +1301
    +1303
    +1307
    +1319
    +1321
    +1327
    +1361
    +1367
    +1373
    +1381
    +1399
    +1409
    +1423
    +1427
    +1429
    +1433
    +1439
    +1447
    +1451
    +1453
    +1459
    +1471
    +1481
    +1483
    +1487
    +1489
    +1493
    +1499
    +1511
    +1523
    +1531
    +1543
    +1549
    +1553
    +1559
    +1567
    +1571
    +1579
    +1583
    +1597
    +1601
    +1607
    +1609
    +1613
    +1619
    +1621
    +1627
    +1637
    +1657
    +1663
    +1667
    +1669
    +1693
    +1697
    +1699
    +1709
    +1721
    +1723
    +1733
    +1741
    +1747
    +1753
    +1759
    +1777
    +1783
    +1787
    +1789
    +1801
    +1811
    +1823
    +1831
    +1847
    +1861
    +1867
    +1871
    +1873
    +1877
    +1879
    +1889
    +1901
    +1907
    +1913
    +1931
    +1933
    +1949
    +1951
    +1973
    +1979
    +1987
    +1993
    +1997
    +1999
    +2003
    +2011
    +2017
    +2027
    +2029
    +2039
    +2053
    +2063
    +2069
    +2081
    +2083
    +2087
    +2089
    +2099
    +2111
    +2113
    +2129
    +2131
    +2137
    +2141
    +2143
    +2153
    +2161
    +2179
    +2203
    +2207
    +2213
    +2221
    +2237
    +2239
    +2243
    +2251
    +2267
    +2269
    +2273
    +2281
    +2287
    +2293
    +2297
    +2309
    +2311
    +2333
    +2339
    +2341
    +2347
    +2351
    +2357
    +2371
    +2377
    +2381
    +2383
    +2389
    +2393
    +2399
    +2411
    +2417
    +2423
    +2437
    +2441
    +2447
    +2459
    +2467
    +2473
    +2477
    +2503
    +2521
    +2531
    +2539
    +2543
    +2549
    +2551
    +2557
    +2579
    +2591
    +2593
    +2609
    +2617
    +2621
    +2633
    +2647
    +2657
    +2659
    +2663
    +2671
    +2677
    +2683
    +2687
    +2689
    +2693
    +2699
    +2707
    +2711
    +2713
    +2719
    +2729
    +2731
    +2741
    +2749
    +2753
    +2767
    +2777
    +2789
    +2791
    +2797
    +2801
    +2803
    +2819
    +2833
    +2837
    +2843
    +2851
    +2857
    +2861
    +2879
    +2887
    +2897
    +2903
    +2909
    +2917
    +2927
    +2939
    +2953
    +2957
    +2963
    +2969
    +2971
    +2999
    +3001
    +3011
    +3019
    +3023
    +3037
    +3041
    +3049
    +3061
    +3067
    +3079
    +3083
    +3089
    +3109
    +3119
    +3121
    +3137
    +3163
    +3167
    +3169
    +3181
    +3187
    +3191
    +3203
    +3209
    +3217
    +3221
    +3229
    +3251
    +3253
    +3257
    +3259
    +3271
    +3299
    +3301
    +3307
    +3313
    +3319
    +3323
    +3329
    +3331
    +3343
    +3347
    +3359
    +3361
    +3371
    +3373
    +3389
    +3391
    +3407
    +3413
    +3433
    +3449
    +3457
    +3461
    +3463
    +3467
    +3469
    +3491
    +3499
    +3511
    +3517
    +3527
    +3529
    +3533
    +3539
    +3541
    +3547
    +3557
    +3559
    +3571
    +3581
    +3583
    +3593
    +3607
    +3613
    +3617
    +3623
    +3631
    +3637
    +3643
    +3659
    +3671
    +3673
    +3677
    +3691
    +3697
    +3701
    +3709
    +3719
    +3727
    +3733
    +3739
    +3761
    +3767
    +3769
    +3779
    +3793
    +3797
    +3803
    +3821
    +3823
    +3833
    +3847
    +3851
    +3853
    +3863
    +3877
    +3881
    +3889
    +3907
    +3911
    +3917
    +3919
    +3923
    +3929
    +3931
    +3943
    +3947
    +3967
    +3989
    +4001
    +4003
    +4007
    +4013
    +4019
    +4021
    +4027
    +4049
    +4051
    +4057
    +4073
    +4079
    +4091
    +4093
    +4099
    +4111
    +4127
    +4129
    +4133
    +4139
    +4153
    +4157
    +4159
    +4177
    +4201
    +4211
    +4217
    +4219
    +4229
    +4231
    +4241
    +4243
    +4253
    +4259
    +4261
    +4271
    +4273
    +4283
    +4289
    +4297
    +4327
    +4337
    +4339
    +4349
    +4357
    +4363
    +4373
    +4391
    +4397
    +4409
    +4421
    +4423
    +4441
    +4447
    +4451
    +4457
    +4463
    +4481
    +4483
    +4493
    +4507
    +4513
    +4517
    +4519
    +4523
    +4547
    +4549
    +4561
    +4567
    +4583
    +4591
    +4597
    +4603
    +4621
    +4637
    +4639
    +4643
    +4649
    +4651
    +4657
    +4663
    +4673
    +4679
    +4691
    +4703
    +4721
    +4723
    +4729
    +4733
    +4751
    +4759
    +4783
    +4787
    +4789
    +4793
    +4799
    +4801
    +4813
    +4817
    +4831
    +4861
    +4871
    +4877
    +4889
    +4903
    +4909
    +4919
    +4931
    +4933
    +4937
    +4943
    +4951
    +4957
    +4967
    +4969
    +4973
    +4987
    +4993
    +4999
    +5003
    +5009
    +5011
    +5021
    +5023
    +5039
    +5051
    +5059
    +5077
    +5081
    +5087
    +5099
    +5101
    +5107
    +5113
    +5119
    +5147
    +5153
    +5167
    +5171
    +5179
    +5189
    +5197
    +5209
    +5227
    +5231
    +5233
    +5237
    +5261
    +5273
    +5279
    +5281
    +5297
    +5303
    +5309
    +5323
    +5333
    +5347
    +5351
    +5381
    +5387
    +5393
    +5399
    +5407
    +5413
    +5417
    +5419
    +5431
    +5437
    +5441
    +5443
    +5449
    +5471
    +5477
    +5479
    +5483
    +5501
    +5503
    +5507
    +5519
    +5521
    +5527
    +5531
    +5557
    +5563
    +5569
    +5573
    +5581
    +5591
    +5623
    +5639
    +5641
    +5647
    +5651
    +5653
    +5657
    +5659
    +5669
    +5683
    +5689
    +5693
    +5701
    +5711
    +5717
    +5737
    +5741
    +5743
    +5749
    +5779
    +5783
    +5791
    +5801
    +5807
    +5813
    +5821
    +5827
    +5839
    +5843
    +5849
    +5851
    +5857
    +5861
    +5867
    +5869
    +5879
    +5881
    +5897
    +5903
    +5923
    +5927
    +5939
    +5953
    +5981
    +5987
    +6007
    +6011
    +6029
    +6037
    +6043
    +6047
    +6053
    +6067
    +6073
    +6079
    +6089
    +6091
    +6101
    +6113
    +6121
    +6131
    +6133
    +6143
    +6151
    +6163
    +6173
    +6197
    +6199
    +6203
    +6211
    +6217
    +6221
    +6229
    +6247
    +6257
    +6263
    +6269
    +6271
    +6277
    +6287
    +6299
    +6301
    +6311
    +6317
    +6323
    +6329
    +6337
    +6343
    +6353
    +6359
    +6361
    +6367
    +6373
    +6379
    +6389
    +6397
    +6421
    +6427
    +6449
    +6451
    +6469
    +6473
    +6481
    +6491
    +6521
    +6529
    +6547
    +6551
    +6553
    +6563
    +6569
    +6571
    +6577
    +6581
    +6599
    +6607
    +6619
    +6637
    +6653
    +6659
    +6661
    +6673
    +6679
    +6689
    +6691
    +6701
    +6703
    +6709
    +6719
    +6733
    +6737
    +6761
    +6763
    +6779
    +6781
    +6791
    +6793
    +6803
    +6823
    +6827
    +6829
    +6833
    +6841
    +6857
    +6863
    +6869
    +6871
    +6883
    +6899
    +6907
    +6911
    +6917
    +6947
    +6949
    +6959
    +6961
    +6967
    +6971
    +6977
    +6983
    +6991
    +6997
    +7001
    +7013
    +7019
    +7027
    +7039
    +7043
    +7057
    +7069
    +7079
    +7103
    +7109
    +7121
    +7127
    +7129
    +7151
    +7159
    +7177
    +7187
    +7193
    +7207
    +7211
    +7213
    +7219
    +7229
    +7237
    +7243
    +7247
    +7253
    +7283
    +7297
    +7307
    +7309
    +7321
    +7331
    +7333
    +7349
    +7351
    +7369
    +7393
    +7411
    +7417
    +7433
    +7451
    +7457
    +7459
    +7477
    +7481
    +7487
    +7489
    +7499
    +7507
    +7517
    +7523
    +7529
    +7537
    +7541
    +7547
    +7549
    +7559
    +7561
    +7573
    +7577
    +7583
    +7589
    +7591
    +7603
    +7607
    +7621
    +7639
    +7643
    +7649
    +7669
    +7673
    +7681
    +7687
    +7691
    +7699
    +7703
    +7717
    +7723
    +7727
    +7741
    +7753
    +7757
    +7759
    +7789
    +7793
    +7817
    +7823
    +7829
    +7841
    +7853
    +7867
    +7873
    +7877
    +7879
    +7883
    +7901
    +7907
    +7919
    +7927
    +7933
    +7937
    +7949
    +7951
    +7963
    +7993
    +8009
    +8011
    +8017
    +8039
    +8053
    +8059
    +8069
    +8081
    +8087
    +8089
    +8093
    +8101
    +8111
    +8117
    +8123
    +8147
    +8161
    +8167
    +8171
    +8179
    +8191
    +8209
    +8219
    +8221
    +8231
    +8233
    +8237
    +8243
    +8263
    +8269
    +8273
    +8287
    +8291
    +8293
    +8297
    +8311
    +8317
    +8329
    +8353
    +8363
    +8369
    +8377
    +8387
    +8389
    +8419
    +8423
    +8429
    +8431
    +8443
    +8447
    +8461
    +8467
    +8501
    +8513
    +8521
    +8527
    +8537
    +8539
    +8543
    +8563
    +8573
    +8581
    +8597
    +8599
    +8609
    +8623
    +8627
    +8629
    +8641
    +8647
    +8663
    +8669
    +8677
    +8681
    +8689
    +8693
    +8699
    +8707
    +8713
    +8719
    +8731
    +8737
    +8741
    +8747
    +8753
    +8761
    +8779
    +8783
    +8803
    +8807
    +8819
    +8821
    +8831
    +8837
    +8839
    +8849
    +8861
    +8863
    +8867
    +8887
    +8893
    +8923
    +8929
    +8933
    +8941
    +8951
    +8963
    +8969
    +8971
    +8999
    +9001
    +9007
    +9011
    +9013
    +9029
    +9041
    +9043
    +9049
    +9059
    +9067
    +9091
    +9103
    +9109
    +9127
    +9133
    +9137
    +9151
    +9157
    +9161
    +9173
    +9181
    +9187
    +9199
    +9203
    +9209
    +9221
    +9227
    +9239
    +9241
    +9257
    +9277
    +9281
    +9283
    +9293
    +9311
    +9319
    +9323
    +9337
    +9341
    +9343
    +9349
    +9371
    +9377
    +9391
    +9397
    +9403
    +9413
    +9419
    +9421
    +9431
    +9433
    +9437
    +9439
    +9461
    +9463
    +9467
    +9473
    +9479
    +9491
    +9497
    +9511
    +9521
    +9533
    +9539
    +9547
    +9551
    +9587
    +9601
    +9613
    +9619
    +9623
    +9629
    +9631
    +9643
    +9649
    +9661
    +9677
    +9679
    +9689
    +9697
    +9719
    +9721
    +9733
    +9739
    +9743
    +9749
    +9767
    +9769
    +9781
    +9787
    +9791
    +9803
    +9811
    +9817
    +9829
    +9833
    +9839
    +9851
    +9857
    +9859
    +9871
    +9883
    +9887
    +9901
    +9907
    +9923
    +9929
    +9931
    +9941
    +9949
    +9967
    +9973
    +10007
    +10009
    +10037
    +10039
    +10061
    +10067
    +10069
    +10079
    +10091
    +10093
    +10099
    +10103
    +10111
    +10133
    +10139
    +10141
    +10151
    +10159
    +10163
    +10169
    +10177
    +10181
    +10193
    +10211
    +10223
    +10243
    +10247
    +10253
    +10259
    +10267
    +10271
    +10273
    +10289
    +10301
    +10303
    +10313
    +10321
    +10331
    +10333
    +10337
    +10343
    +10357
    +10369
    +10391
    +10399
    +10427
    +10429
    +10433
    +10453
    +10457
    +10459
    +10463
    +10477
    +10487
    +10499
    +10501
    +10513
    +10529
    +10531
    +10559
    +10567
    +10589
    +10597
    +10601
    +10607
    +10613
    +10627
    +10631
    +10639
    +10651
    +10657
    +10663
    +10667
    +10687
    +10691
    +10709
    +10711
    +10723
    +10729
    +10733
    +10739
    +10753
    +10771
    +10781
    +10789
    +10799
    +10831
    +10837
    +10847
    +10853
    +10859
    +10861
    +10867
    +10883
    +10889
    +10891
    +10903
    +10909
    +10937
    +10939
    +10949
    +10957
    +10973
    +10979
    +10987
    +10993
    +11003
    +11027
    +11047
    +11057
    +11059
    +11069
    +11071
    +11083
    +11087
    +11093
    +11113
    +11117
    +11119
    +11131
    +11149
    +11159
    +11161
    +11171
    +11173
    +11177
    +11197
    +11213
    +11239
    +11243
    +11251
    +11257
    +11261
    +11273
    +11279
    +11287
    +11299
    +11311
    +11317
    +11321
    +11329
    +11351
    +11353
    +11369
    +11383
    +11393
    +11399
    +11411
    +11423
    +11437
    +11443
    +11447
    +11467
    +11471
    +11483
    +11489
    +11491
    +11497
    +11503
    +11519
    +11527
    +11549
    +11551
    +11579
    +11587
    +11593
    +11597
    +11617
    +11621
    +11633
    +11657
    +11677
    +11681
    +11689
    +11699
    +11701
    +11717
    +11719
    +11731
    +11743
    +11777
    +11779
    +11783
    +11789
    +11801
    +11807
    +11813
    +11821
    +11827
    +11831
    +11833
    +11839
    +11863
    +11867
    +11887
    +11897
    +11903
    +11909
    +11923
    +11927
    +11933
    +11939
    +11941
    +11953
    +11959
    +11969
    +11971
    +11981
    +11987
    +12007
    +12011
    +12037
    +12041
    +12043
    +12049
    +12071
    +12073
    +12097
    +12101
    +12107
    +12109
    +12113
    +12119
    +12143
    +12149
    +12157
    +12161
    +12163
    +12197
    +12203
    +12211
    +12227
    +12239
    +12241
    +12251
    +12253
    +12263
    +12269
    +12277
    +12281
    +12289
    +12301
    +12323
    +12329
    +12343
    +12347
    +12373
    +12377
    +12379
    +12391
    +12401
    +12409
    +12413
    +12421
    +12433
    +12437
    +12451
    +12457
    +12473
    +12479
    +12487
    +12491
    +12497
    +12503
    +12511
    +12517
    +12527
    +12539
    +12541
    +12547
    +12553
    +12569
    +12577
    +12583
    +12589
    +12601
    +12611
    +12613
    +12619
    +12637
    +12641
    +12647
    +12653
    +12659
    +12671
    +12689
    +12697
    +12703
    +12713
    +12721
    +12739
    +12743
    +12757
    +12763
    +12781
    +12791
    +12799
    +12809
    +12821
    +12823
    +12829
    +12841
    +12853
    +12889
    +12893
    +12899
    +12907
    +12911
    +12917
    +12919
    +12923
    +12941
    +12953
    +12959
    +12967
    +12973
    +12979
    +12983
    +13001
    +13003
    +13007
    +13009
    +13033
    +13037
    +13043
    +13049
    +13063
    +13093
    +13099
    +13103
    +13109
    +13121
    +13127
    +13147
    +13151
    +13159
    +13163
    +13171
    +13177
    +13183
    +13187
    +13217
    +13219
    +13229
    +13241
    +13249
    +13259
    +13267
    +13291
    +13297
    +13309
    +13313
    +13327
    +13331
    +13337
    +13339
    +13367
    +13381
    +13397
    +13399
    +13411
    +13417
    +13421
    +13441
    +13451
    +13457
    +13463
    +13469
    +13477
    +13487
    +13499
    +13513
    +13523
    +13537
    +13553
    +13567
    +13577
    +13591
    +13597
    +13613
    +13619
    +13627
    +13633
    +13649
    +13669
    +13679
    +13681
    +13687
    +13691
    +13693
    +13697
    +13709
    +13711
    +13721
    +13723
    +13729
    +13751
    +13757
    +13759
    +13763
    +13781
    +13789
    +13799
    +13807
    +13829
    +13831
    +13841
    +13859
    +13873
    +13877
    +13879
    +13883
    +13901
    +13903
    +13907
    +13913
    +13921
    +13931
    +13933
    +13963
    +13967
    +13997
    +13999
    +14009
    +14011
    +14029
    +14033
    +14051
    +14057
    +14071
    +14081
    +14083
    +14087
    +14107
    +14143
    +14149
    +14153
    +14159
    +14173
    +14177
    +14197
    +14207
    +14221
    +14243
    +14249
    +14251
    +14281
    +14293
    +14303
    +14321
    +14323
    +14327
    +14341
    +14347
    +14369
    +14387
    +14389
    +14401
    +14407
    +14411
    +14419
    +14423
    +14431
    +14437
    +14447
    +14449
    +14461
    +14479
    +14489
    +14503
    +14519
    +14533
    +14537
    +14543
    +14549
    +14551
    +14557
    +14561
    +14563
    +14591
    +14593
    +14621
    +14627
    +14629
    +14633
    +14639
    +14653
    +14657
    +14669
    +14683
    +14699
    +14713
    +14717
    +14723
    +14731
    +14737
    +14741
    +14747
    +14753
    +14759
    +14767
    +14771
    +14779
    +14783
    +14797
    +14813
    +14821
    +14827
    +14831
    +14843
    +14851
    +14867
    +14869
    +14879
    +14887
    +14891
    +14897
    +14923
    +14929
    +14939
    +14947
    +14951
    +14957
    +14969
    +14983
    +15013
    +15017
    +15031
    +15053
    +15061
    +15073
    +15077
    +15083
    +15091
    +15101
    +15107
    +15121
    +15131
    +15137
    +15139
    +15149
    +15161
    +15173
    +15187
    +15193
    +15199
    +15217
    +15227
    +15233
    +15241
    +15259
    +15263
    +15269
    +15271
    +15277
    +15287
    +15289
    +15299
    +15307
    +15313
    +15319
    +15329
    +15331
    +15349
    +15359
    +15361
    +15373
    +15377
    +15383
    +15391
    +15401
    +15413
    +15427
    +15439
    +15443
    +15451
    +15461
    +15467
    +15473
    +15493
    +15497
    +15511
    +15527
    +15541
    +15551
    +15559
    +15569
    +15581
    +15583
    +15601
    +15607
    +15619
    +15629
    +15641
    +15643
    +15647
    +15649
    +15661
    +15667
    +15671
    +15679
    +15683
    +15727
    +15731
    +15733
    +15737
    +15739
    +15749
    +15761
    +15767
    +15773
    +15787
    +15791
    +15797
    +15803
    +15809
    +15817
    +15823
    +15859
    +15877
    +15881
    +15887
    +15889
    +15901
    +15907
    +15913
    +15919
    +15923
    +15937
    +15959
    +15971
    +15973
    +15991
    +16001
    +16007
    +16033
    +16057
    +16061
    +16063
    +16067
    +16069
    +16073
    +16087
    +16091
    +16097
    +16103
    +16111
    +16127
    +16139
    +16141
    +16183
    +16187
    +16189
    +16193
    +16217
    +16223
    +16229
    +16231
    +16249
    +16253
    +16267
    +16273
    +16301
    +16319
    +16333
    +16339
    +16349
    +16361
    +16363
    +16369
    +16381
    +16411
    +16417
    +16421
    +16427
    +16433
    +16447
    +16451
    +16453
    +16477
    +16481
    +16487
    +16493
    +16519
    +16529
    +16547
    +16553
    +16561
    +16567
    +16573
    +16603
    +16607
    +16619
    +16631
    +16633
    +16649
    +16651
    +16657
    +16661
    +16673
    +16691
    +16693
    +16699
    +16703
    +16729
    +16741
    +16747
    +16759
    +16763
    +16787
    +16811
    +16823
    +16829
    +16831
    +16843
    +16871
    +16879
    +16883
    +16889
    +16901
    +16903
    +16921
    +16927
    +16931
    +16937
    +16943
    +16963
    +16979
    +16981
    +16987
    +16993
    +17011
    +17021
    +17027
    +17029
    +17033
    +17041
    +17047
    +17053
    +17077
    +17093
    +17099
    +17107
    +17117
    +17123
    +17137
    +17159
    +17167
    +17183
    +17189
    +17191
    +17203
    +17207
    +17209
    +17231
    +17239
    +17257
    +17291
    +17293
    +17299
    +17317
    +17321
    +17327
    +17333
    +17341
    +17351
    +17359
    +17377
    +17383
    +17387
    +17389
    +17393
    +17401
    +17417
    +17419
    +17431
    +17443
    +17449
    +17467
    +17471
    +17477
    +17483
    +17489
    +17491
    +17497
    +17509
    +17519
    +17539
    +17551
    +17569
    +17573
    +17579
    +17581
    +17597
    +17599
    +17609
    +17623
    +17627
    +17657
    +17659
    +17669
    +17681
    +17683
    +17707
    +17713
    +17729
    +17737
    +17747
    +17749
    +17761
    +17783
    +17789
    +17791
    +17807
    +17827
    +17837
    +17839
    +17851
    +17863
    +17881
    +17891
    +17903
    +17909
    +17911
    +17921
    +17923
    +17929
    +17939
    +17957
    +17959
    +17971
    +17977
    +17981
    +17987
    +17989
    +18013
    +18041
    +18043
    +18047
    +18049
    +18059
    +18061
    +18077
    +18089
    +18097
    +18119
    +18121
    +18127
    +18131
    +18133
    +18143
    +18149
    +18169
    +18181
    +18191
    +18199
    +18211
    +18217
    +18223
    +18229
    +18233
    +18251
    +18253
    +18257
    +18269
    +18287
    +18289
    +18301
    +18307
    +18311
    +18313
    +18329
    +18341
    +18353
    +18367
    +18371
    +18379
    +18397
    +18401
    +18413
    +18427
    +18433
    +18439
    +18443
    +18451
    +18457
    +18461
    +18481
    +18493
    +18503
    +18517
    +18521
    +18523
    +18539
    +18541
    +18553
    +18583
    +18587
    +18593
    +18617
    +18637
    +18661
    +18671
    +18679
    +18691
    +18701
    +18713
    +18719
    +18731
    +18743
    +18749
    +18757
    +18773
    +18787
    +18793
    +18797
    +18803
    +18839
    +18859
    +18869
    +18899
    +18911
    +18913
    +18917
    +18919
    +18947
    +18959
    +18973
    +18979
    +19001
    +19009
    +19013
    +19031
    +19037
    +19051
    +19069
    +19073
    +19079
    +19081
    +19087
    +19121
    +19139
    +19141
    +19157
    +19163
    +19181
    +19183
    +19207
    +19211
    +19213
    +19219
    +19231
    +19237
    +19249
    +19259
    +19267
    +19273
    +19289
    +19301
    +19309
    +19319
    +19333
    +19373
    +19379
    +19381
    +19387
    +19391
    +19403
    +19417
    +19421
    +19423
    +19427
    +19429
    +19433
    +19441
    +19447
    +19457
    +19463
    +19469
    +19471
    +19477
    +19483
    +19489
    +19501
    +19507
    +19531
    +19541
    +19543
    +19553
    +19559
    +19571
    +19577
    +19583
    +19597
    +19603
    +19609
    +19661
    +19681
    +19687
    +19697
    +19699
    +19709
    +19717
    +19727
    +19739
    +19751
    +19753
    +19759
    +19763
    +19777
    +19793
    +19801
    +19813
    +19819
    +19841
    +19843
    +19853
    +19861
    +19867
    +19889
    +19891
    +19913
    +19919
    +19927
    +19937
    +19949
    +19961
    +19963
    +19973
    +19979
    +19991
    +19993
    +19997
    +20011
    +20021
    +20023
    +20029
    +20047
    +20051
    +20063
    +20071
    +20089
    +20101
    +20107
    +20113
    +20117
    +20123
    +20129
    +20143
    +20147
    +20149
    +20161
    +20173
    +20177
    +20183
    +20201
    +20219
    +20231
    +20233
    +20249
    +20261
    +20269
    +20287
    +20297
    +20323
    +20327
    +20333
    +20341
    +20347
    +20353
    +20357
    +20359
    +20369
    +20389
    +20393
    +20399
    +20407
    +20411
    +20431
    +20441
    +20443
    +20477
    +20479
    +20483
    +20507
    +20509
    +20521
    +20533
    +20543
    +20549
    +20551
    +20563
    +20593
    +20599
    +20611
    +20627
    +20639
    +20641
    +20663
    +20681
    +20693
    +20707
    +20717
    +20719
    +20731
    +20743
    +20747
    +20749
    +20753
    +20759
    +20771
    +20773
    +20789
    +20807
    +20809
    +20849
    +20857
    +20873
    +20879
    +20887
    +20897
    +20899
    +20903
    +20921
    +20929
    +20939
    +20947
    +20959
    +20963
    +20981
    +20983
    +21001
    +21011
    +21013
    +21017
    +21019
    +21023
    +21031
    +21059
    +21061
    +21067
    +21089
    +21101
    +21107
    +21121
    +21139
    +21143
    +21149
    +21157
    +21163
    +21169
    +21179
    +21187
    +21191
    +21193
    +21211
    +21221
    +21227
    +21247
    +21269
    +21277
    +21283
    +21313
    +21317
    +21319
    +21323
    +21341
    +21347
    +21377
    +21379
    +21383
    +21391
    +21397
    +21401
    +21407
    +21419
    +21433
    +21467
    +21481
    +21487
    +21491
    +21493
    +21499
    +21503
    +21517
    +21521
    +21523
    +21529
    +21557
    +21559
    +21563
    +21569
    +21577
    +21587
    +21589
    +21599
    +21601
    +21611
    +21613
    +21617
    +21647
    +21649
    +21661
    +21673
    +21683
    +21701
    +21713
    +21727
    +21737
    +21739
    +21751
    +21757
    +21767
    +21773
    +21787
    +21799
    +21803
    +21817
    +21821
    +21839
    +21841
    +21851
    +21859
    +21863
    +21871
    +21881
    +21893
    +21911
    +21929
    +21937
    +21943
    +21961
    +21977
    +21991
    +21997
    +22003
    +22013
    +22027
    +22031
    +22037
    +22039
    +22051
    +22063
    +22067
    +22073
    +22079
    +22091
    +22093
    +22109
    +22111
    +22123
    +22129
    +22133
    +22147
    +22153
    +22157
    +22159
    +22171
    +22189
    +22193
    +22229
    +22247
    +22259
    +22271
    +22273
    +22277
    +22279
    +22283
    +22291
    +22303
    +22307
    +22343
    +22349
    +22367
    +22369
    +22381
    +22391
    +22397
    +22409
    +22433
    +22441
    +22447
    +22453
    +22469
    +22481
    +22483
    +22501
    +22511
    +22531
    +22541
    +22543
    +22549
    +22567
    +22571
    +22573
    +22613
    +22619
    +22621
    +22637
    +22639
    +22643
    +22651
    +22669
    +22679
    +22691
    +22697
    +22699
    +22709
    +22717
    +22721
    +22727
    +22739
    +22741
    +22751
    +22769
    +22777
    +22783
    +22787
    +22807
    +22811
    +22817
    +22853
    +22859
    +22861
    +22871
    +22877
    +22901
    +22907
    +22921
    +22937
    +22943
    +22961
    +22963
    +22973
    +22993
    +23003
    +23011
    +23017
    +23021
    +23027
    +23029
    +23039
    +23041
    +23053
    +23057
    +23059
    +23063
    +23071
    +23081
    +23087
    +23099
    +23117
    +23131
    +23143
    +23159
    +23167
    +23173
    +23189
    +23197
    +23201
    +23203
    +23209
    +23227
    +23251
    +23269
    +23279
    +23291
    +23293
    +23297
    +23311
    +23321
    +23327
    +23333
    +23339
    +23357
    +23369
    +23371
    +23399
    +23417
    +23431
    +23447
    +23459
    +23473
    +23497
    +23509
    +23531
    +23537
    +23539
    +23549
    +23557
    +23561
    +23563
    +23567
    +23581
    +23593
    +23599
    +23603
    +23609
    +23623
    +23627
    +23629
    +23633
    +23663
    +23669
    +23671
    +23677
    +23687
    +23689
    +23719
    +23741
    +23743
    +23747
    +23753
    +23761
    +23767
    +23773
    +23789
    +23801
    +23813
    +23819
    +23827
    +23831
    +23833
    +23857
    +23869
    +23873
    +23879
    +23887
    +23893
    +23899
    +23909
    +23911
    +23917
    +23929
    +23957
    +23971
    +23977
    +23981
    +23993
    +24001
    +24007
    +24019
    +24023
    +24029
    +24043
    +24049
    +24061
    +24071
    +24077
    +24083
    +24091
    +24097
    +24103
    +24107
    +24109
    +24113
    +24121
    +24133
    +24137
    +24151
    +24169
    +24179
    +24181
    +24197
    +24203
    +24223
    +24229
    +24239
    +24247
    +24251
    +24281
    +24317
    +24329
    +24337
    +24359
    +24371
    +24373
    +24379
    +24391
    +24407
    +24413
    +24419
    +24421
    +24439
    +24443
    +24469
    +24473
    +24481
    +24499
    +24509
    +24517
    +24527
    +24533
    +24547
    +24551
    +24571
    +24593
    +24611
    +24623
    +24631
    +24659
    +24671
    +24677
    +24683
    +24691
    +24697
    +24709
    +24733
    +24749
    +24763
    +24767
    +24781
    +24793
    +24799
    +24809
    +24821
    +24841
    +24847
    +24851
    +24859
    +24877
    +24889
    +24907
    +24917
    +24919
    +24923
    +24943
    +24953
    +24967
    +24971
    +24977
    +24979
    +24989
    +25013
    +25031
    +25033
    +25037
    +25057
    +25073
    +25087
    +25097
    +25111
    +25117
    +25121
    +25127
    +25147
    +25153
    +25163
    +25169
    +25171
    +25183
    +25189
    +25219
    +25229
    +25237
    +25243
    +25247
    +25253
    +25261
    +25301
    +25303
    +25307
    +25309
    +25321
    +25339
    +25343
    +25349
    +25357
    +25367
    +25373
    +25391
    +25409
    +25411
    +25423
    +25439
    +25447
    +25453
    +25457
    +25463
    +25469
    +25471
    +25523
    +25537
    +25541
    +25561
    +25577
    +25579
    +25583
    +25589
    +25601
    +25603
    +25609
    +25621
    +25633
    +25639
    +25643
    +25657
    +25667
    +25673
    +25679
    +25693
    +25703
    +25717
    +25733
    +25741
    +25747
    +25759
    +25763
    +25771
    +25793
    +25799
    +25801
    +25819
    +25841
    +25847
    +25849
    +25867
    +25873
    +25889
    +25903
    +25913
    +25919
    +25931
    +25933
    +25939
    +25943
    +25951
    +25969
    +25981
    +25997
    +25999
    +26003
    +26017
    +26021
    +26029
    +26041
    +26053
    +26083
    +26099
    +26107
    +26111
    +26113
    +26119
    +26141
    +26153
    +26161
    +26171
    +26177
    +26183
    +26189
    +26203
    +26209
    +26227
    +26237
    +26249
    +26251
    +26261
    +26263
    +26267
    +26293
    +26297
    +26309
    +26317
    +26321
    +26339
    +26347
    +26357
    +26371
    +26387
    +26393
    +26399
    +26407
    +26417
    +26423
    +26431
    +26437
    +26449
    +26459
    +26479
    +26489
    +26497
    +26501
    +26513
    +26539
    +26557
    +26561
    +26573
    +26591
    +26597
    +26627
    +26633
    +26641
    +26647
    +26669
    +26681
    +26683
    +26687
    +26693
    +26699
    +26701
    +26711
    +26713
    +26717
    +26723
    +26729
    +26731
    +26737
    +26759
    +26777
    +26783
    +26801
    +26813
    +26821
    +26833
    +26839
    +26849
    +26861
    +26863
    +26879
    +26881
    +26891
    +26893
    +26903
    +26921
    +26927
    +26947
    +26951
    +26953
    +26959
    +26981
    +26987
    +26993
    +27011
    +27017
    +27031
    +27043
    +27059
    +27061
    +27067
    +27073
    +27077
    +27091
    +27103
    +27107
    +27109
    +27127
    +27143
    +27179
    +27191
    +27197
    +27211
    +27239
    +27241
    +27253
    +27259
    +27271
    +27277
    +27281
    +27283
    +27299
    +27329
    +27337
    +27361
    +27367
    +27397
    +27407
    +27409
    +27427
    +27431
    +27437
    +27449
    +27457
    +27479
    +27481
    +27487
    +27509
    +27527
    +27529
    +27539
    +27541
    +27551
    +27581
    +27583
    +27611
    +27617
    +27631
    +27647
    +27653
    +27673
    +27689
    +27691
    +27697
    +27701
    +27733
    +27737
    +27739
    +27743
    +27749
    +27751
    +27763
    +27767
    +27773
    +27779
    +27791
    +27793
    +27799
    +27803
    +27809
    +27817
    +27823
    +27827
    +27847
    +27851
    +27883
    +27893
    +27901
    +27917
    +27919
    +27941
    +27943
    +27947
    +27953
    +27961
    +27967
    +27983
    +27997
    +28001
    +28019
    +28027
    +28031
    +28051
    +28057
    +28069
    +28081
    +28087
    +28097
    +28099
    +28109
    +28111
    +28123
    +28151
    +28163
    +28181
    +28183
    +28201
    +28211
    +28219
    +28229
    +28277
    +28279
    +28283
    +28289
    +28297
    +28307
    +28309
    +28319
    +28349
    +28351
    +28387
    +28393
    +28403
    +28409
    +28411
    +28429
    +28433
    +28439
    +28447
    +28463
    +28477
    +28493
    +28499
    +28513
    +28517
    +28537
    +28541
    +28547
    +28549
    +28559
    +28571
    +28573
    +28579
    +28591
    +28597
    +28603
    +28607
    +28619
    +28621
    +28627
    +28631
    +28643
    +28649
    +28657
    +28661
    +28663
    +28669
    +28687
    +28697
    +28703
    +28711
    +28723
    +28729
    +28751
    +28753
    +28759
    +28771
    +28789
    +28793
    +28807
    +28813
    +28817
    +28837
    +28843
    +28859
    +28867
    +28871
    +28879
    +28901
    +28909
    +28921
    +28927
    +28933
    +28949
    +28961
    +28979
    +29009
    +29017
    +29021
    +29023
    +29027
    +29033
    +29059
    +29063
    +29077
    +29101
    +29123
    +29129
    +29131
    +29137
    +29147
    +29153
    +29167
    +29173
    +29179
    +29191
    +29201
    +29207
    +29209
    +29221
    +29231
    +29243
    +29251
    +29269
    +29287
    +29297
    +29303
    +29311
    +29327
    +29333
    +29339
    +29347
    +29363
    +29383
    +29387
    +29389
    +29399
    +29401
    +29411
    +29423
    +29429
    +29437
    +29443
    +29453
    +29473
    +29483
    +29501
    +29527
    +29531
    +29537
    +29567
    +29569
    +29573
    +29581
    +29587
    +29599
    +29611
    +29629
    +29633
    +29641
    +29663
    +29669
    +29671
    +29683
    +29717
    +29723
    +29741
    +29753
    +29759
    +29761
    +29789
    +29803
    +29819
    +29833
    +29837
    +29851
    +29863
    +29867
    +29873
    +29879
    +29881
    +29917
    +29921
    +29927
    +29947
    +29959
    +29983
    +29989
    +30011
    +30013
    +30029
    +30047
    +30059
    +30071
    +30089
    +30091
    +30097
    +30103
    +30109
    +30113
    +30119
    +30133
    +30137
    +30139
    +30161
    +30169
    +30181
    +30187
    +30197
    +30203
    +30211
    +30223
    +30241
    +30253
    +30259
    +30269
    +30271
    +30293
    +30307
    +30313
    +30319
    +30323
    +30341
    +30347
    +30367
    +30389
    +30391
    +30403
    +30427
    +30431
    +30449
    +30467
    +30469
    +30491
    +30493
    +30497
    +30509
    +30517
    +30529
    +30539
    +30553
    +30557
    +30559
    +30577
    +30593
    +30631
    +30637
    +30643
    +30649
    +30661
    +30671
    +30677
    +30689
    +30697
    +30703
    +30707
    +30713
    +30727
    +30757
    +30763
    +30773
    +30781
    +30803
    +30809
    +30817
    +30829
    +30839
    +30841
    +30851
    +30853
    +30859
    +30869
    +30871
    +30881
    +30893
    +30911
    +30931
    +30937
    +30941
    +30949
    +30971
    +30977
    +30983
    +31013
    +31019
    +31033
    +31039
    +31051
    +31063
    +31069
    +31079
    +31081
    +31091
    +31121
    +31123
    +31139
    +31147
    +31151
    +31153
    +31159
    +31177
    +31181
    +31183
    +31189
    +31193
    +31219
    +31223
    +31231
    +31237
    +31247
    +31249
    +31253
    +31259
    +31267
    +31271
    +31277
    +31307
    +31319
    +31321
    +31327
    +31333
    +31337
    +31357
    +31379
    +31387
    +31391
    +31393
    +31397
    +31469
    +31477
    +31481
    +31489
    +31511
    +31513
    +31517
    +31531
    +31541
    +31543
    +31547
    +31567
    +31573
    +31583
    +31601
    +31607
    +31627
    +31643
    +31649
    +31657
    +31663
    +31667
    +31687
    +31699
    +31721
    +31723
    +31727
    +31729
    +31741
    +31751
    +31769
    +31771
    +31793
    +31799
    +31817
    +31847
    +31849
    +31859
    +31873
    +31883
    +31891
    +31907
    +31957
    +31963
    +31973
    +31981
    +31991
    +32003
    +32009
    +32027
    +32029
    +32051
    +32057
    +32059
    +32063
    +32069
    +32077
    +32083
    +32089
    +32099
    +32117
    +32119
    +32141
    +32143
    +32159
    +32173
    +32183
    +32189
    +32191
    +32203
    +32213
    +32233
    +32237
    +32251
    +32257
    +32261
    +32297
    +32299
    +32303
    +32309
    +32321
    +32323
    +32327
    +32341
    +32353
    +32359
    +32363
    +32369
    +32371
    +32377
    +32381
    +32401
    +32411
    +32413
    +32423
    +32429
    +32441
    +32443
    +32467
    +32479
    +32491
    +32497
    +32503
    +32507
    +32531
    +32533
    +32537
    +32561
    +32563
    +32569
    +32573
    +32579
    +32587
    +32603
    +32609
    +32611
    +32621
    +32633
    +32647
    +32653
    +32687
    +32693
    +32707
    +32713
    +32717
    +32719
    +32749
    +32771
    +32779
    +32783
    +32789
    +32797
    +32801
    +32803
    +32831
    +32833
    +32839
    +32843
    +32869
    +32887
    +32909
    +32911
    +32917
    +32933
    +32939
    +32941
    +32957
    +32969
    +32971
    +32983
    +32987
    +32993
    +32999
    +33013
    +33023
    +33029
    +33037
    +33049
    +33053
    +33071
    +33073
    +33083
    +33091
    +33107
    +33113
    +33119
    +33149
    +33151
    +33161
    +33179
    +33181
    +33191
    +33199
    +33203
    +33211
    +33223
    +33247
    +33287
    +33289
    +33301
    +33311
    +33317
    +33329
    +33331
    +33343
    +33347
    +33349
    +33353
    +33359
    +33377
    +33391
    +33403
    +33409
    +33413
    +33427
    +33457
    +33461
    +33469
    +33479
    +33487
    +33493
    +33503
    +33521
    +33529
    +33533
    +33547
    +33563
    +33569
    +33577
    +33581
    +33587
    +33589
    +33599
    +33601
    +33613
    +33617
    +33619
    +33623
    +33629
    +33637
    +33641
    +33647
    +33679
    +33703
    +33713
    +33721
    +33739
    +33749
    +33751
    +33757
    +33767
    +33769
    +33773
    +33791
    +33797
    +33809
    +33811
    +33827
    +33829
    +33851
    +33857
    +33863
    +33871
    +33889
    +33893
    +33911
    +33923
    +33931
    +33937
    +33941
    +33961
    +33967
    +33997
    +34019
    +34031
    +34033
    +34039
    +34057
    +34061
    +34123
    +34127
    +34129
    +34141
    +34147
    +34157
    +34159
    +34171
    +34183
    +34211
    +34213
    +34217
    +34231
    +34253
    +34259
    +34261
    +34267
    +34273
    +34283
    +34297
    +34301
    +34303
    +34313
    +34319
    +34327
    +34337
    +34351
    +34361
    +34367
    +34369
    +34381
    +34403
    +34421
    +34429
    +34439
    +34457
    +34469
    +34471
    +34483
    +34487
    +34499
    +34501
    +34511
    +34513
    +34519
    +34537
    +34543
    +34549
    +34583
    +34589
    +34591
    +34603
    +34607
    +34613
    +34631
    +34649
    +34651
    +34667
    +34673
    +34679
    +34687
    +34693
    +34703
    +34721
    +34729
    +34739
    +34747
    +34757
    +34759
    +34763
    +34781
    +34807
    +34819
    +34841
    +34843
    +34847
    +34849
    +34871
    +34877
    +34883
    +34897
    +34913
    +34919
    +34939
    +34949
    +34961
    +34963
    +34981
    +35023
    +35027
    +35051
    +35053
    +35059
    +35069
    +35081
    +35083
    +35089
    +35099
    +35107
    +35111
    +35117
    +35129
    +35141
    +35149
    +35153
    +35159
    +35171
    +35201
    +35221
    +35227
    +35251
    +35257
    +35267
    +35279
    +35281
    +35291
    +35311
    +35317
    +35323
    +35327
    +35339
    +35353
    +35363
    +35381
    +35393
    +35401
    +35407
    +35419
    +35423
    +35437
    +35447
    +35449
    +35461
    +35491
    +35507
    +35509
    +35521
    +35527
    +35531
    +35533
    +35537
    +35543
    +35569
    +35573
    +35591
    +35593
    +35597
    +35603
    +35617
    +35671
    +35677
    +35729
    +35731
    +35747
    +35753
    +35759
    +35771
    +35797
    +35801
    +35803
    +35809
    +35831
    +35837
    +35839
    +35851
    +35863
    +35869
    +35879
    +35897
    +35899
    +35911
    +35923
    +35933
    +35951
    +35963
    +35969
    +35977
    +35983
    +35993
    +35999
    +36007
    +36011
    +36013
    +36017
    +36037
    +36061
    +36067
    +36073
    +36083
    +36097
    +36107
    +36109
    +36131
    +36137
    +36151
    +36161
    +36187
    +36191
    +36209
    +36217
    +36229
    +36241
    +36251
    +36263
    +36269
    +36277
    +36293
    +36299
    +36307
    +36313
    +36319
    +36341
    +36343
    +36353
    +36373
    +36383
    +36389
    +36433
    +36451
    +36457
    +36467
    +36469
    +36473
    +36479
    +36493
    +36497
    +36523
    +36527
    +36529
    +36541
    +36551
    +36559
    +36563
    +36571
    +36583
    +36587
    +36599
    +36607
    +36629
    +36637
    +36643
    +36653
    +36671
    +36677
    +36683
    +36691
    +36697
    +36709
    +36713
    +36721
    +36739
    +36749
    +36761
    +36767
    +36779
    +36781
    +36787
    +36791
    +36793
    +36809
    +36821
    +36833
    +36847
    +36857
    +36871
    +36877
    +36887
    +36899
    +36901
    +36913
    +36919
    +36923
    +36929
    +36931
    +36943
    +36947
    +36973
    +36979
    +36997
    +37003
    +37013
    +37019
    +37021
    +37039
    +37049
    +37057
    +37061
    +37087
    +37097
    +37117
    +37123
    +37139
    +37159
    +37171
    +37181
    +37189
    +37199
    +37201
    +37217
    +37223
    +37243
    +37253
    +37273
    +37277
    +37307
    +37309
    +37313
    +37321
    +37337
    +37339
    +37357
    +37361
    +37363
    +37369
    +37379
    +37397
    +37409
    +37423
    +37441
    +37447
    +37463
    +37483
    +37489
    +37493
    +37501
    +37507
    +37511
    +37517
    +37529
    +37537
    +37547
    +37549
    +37561
    +37567
    +37571
    +37573
    +37579
    +37589
    +37591
    +37607
    +37619
    +37633
    +37643
    +37649
    +37657
    +37663
    +37691
    +37693
    +37699
    +37717
    +37747
    +37781
    +37783
    +37799
    +37811
    +37813
    +37831
    +37847
    +37853
    +37861
    +37871
    +37879
    +37889
    +37897
    +37907
    +37951
    +37957
    +37963
    +37967
    +37987
    +37991
    +37993
    +37997
    +38011
    +38039
    +38047
    +38053
    +38069
    +38083
    +38113
    +38119
    +38149
    +38153
    +38167
    +38177
    +38183
    +38189
    +38197
    +38201
    +38219
    +38231
    +38237
    +38239
    +38261
    +38273
    +38281
    +38287
    +38299
    +38303
    +38317
    +38321
    +38327
    +38329
    +38333
    +38351
    +38371
    +38377
    +38393
    +38431
    +38447
    +38449
    +38453
    +38459
    +38461
    +38501
    +38543
    +38557
    +38561
    +38567
    +38569
    +38593
    +38603
    +38609
    +38611
    +38629
    +38639
    +38651
    +38653
    +38669
    +38671
    +38677
    +38693
    +38699
    +38707
    +38711
    +38713
    +38723
    +38729
    +38737
    +38747
    +38749
    +38767
    +38783
    +38791
    +38803
    +38821
    +38833
    +38839
    +38851
    +38861
    +38867
    +38873
    +38891
    +38903
    +38917
    +38921
    +38923
    +38933
    +38953
    +38959
    +38971
    +38977
    +38993
    +39019
    +39023
    +39041
    +39043
    +39047
    +39079
    +39089
    +39097
    +39103
    +39107
    +39113
    +39119
    +39133
    +39139
    +39157
    +39161
    +39163
    +39181
    +39191
    +39199
    +39209
    +39217
    +39227
    +39229
    +39233
    +39239
    +39241
    +39251
    +39293
    +39301
    +39313
    +39317
    +39323
    +39341
    +39343
    +39359
    +39367
    +39371
    +39373
    +39383
    +39397
    +39409
    +39419
    +39439
    +39443
    +39451
    +39461
    +39499
    +39503
    +39509
    +39511
    +39521
    +39541
    +39551
    +39563
    +39569
    +39581
    +39607
    +39619
    +39623
    +39631
    +39659
    +39667
    +39671
    +39679
    +39703
    +39709
    +39719
    +39727
    +39733
    +39749
    +39761
    +39769
    +39779
    +39791
    +39799
    +39821
    +39827
    +39829
    +39839
    +39841
    +39847
    +39857
    +39863
    +39869
    +39877
    +39883
    +39887
    +39901
    +39929
    +39937
    +39953
    +39971
    +39979
    +39983
    +39989
    +40009
    +40013
    +40031
    +40037
    +40039
    +40063
    +40087
    +40093
    +40099
    +40111
    +40123
    +40127
    +40129
    +40151
    +40153
    +40163
    +40169
    +40177
    +40189
    +40193
    +40213
    +40231
    +40237
    +40241
    +40253
    +40277
    +40283
    +40289
    +40343
    +40351
    +40357
    +40361
    +40387
    +40423
    +40427
    +40429
    +40433
    +40459
    +40471
    +40483
    +40487
    +40493
    +40499
    +40507
    +40519
    +40529
    +40531
    +40543
    +40559
    +40577
    +40583
    +40591
    +40597
    +40609
    +40627
    +40637
    +40639
    +40693
    +40697
    +40699
    +40709
    +40739
    +40751
    +40759
    +40763
    +40771
    +40787
    +40801
    +40813
    +40819
    +40823
    +40829
    +40841
    +40847
    +40849
    +40853
    +40867
    +40879
    +40883
    +40897
    +40903
    +40927
    +40933
    +40939
    +40949
    +40961
    +40973
    +40993
    +41011
    +41017
    +41023
    +41039
    +41047
    +41051
    +41057
    +41077
    +41081
    +41113
    +41117
    +41131
    +41141
    +41143
    +41149
    +41161
    +41177
    +41179
    +41183
    +41189
    +41201
    +41203
    +41213
    +41221
    +41227
    +41231
    +41233
    +41243
    +41257
    +41263
    +41269
    +41281
    +41299
    +41333
    +41341
    +41351
    +41357
    +41381
    +41387
    +41389
    +41399
    +41411
    +41413
    +41443
    +41453
    +41467
    +41479
    +41491
    +41507
    +41513
    +41519
    +41521
    +41539
    +41543
    +41549
    +41579
    +41593
    +41597
    +41603
    +41609
    +41611
    +41617
    +41621
    +41627
    +41641
    +41647
    +41651
    +41659
    +41669
    +41681
    +41687
    +41719
    +41729
    +41737
    +41759
    +41761
    +41771
    +41777
    +41801
    +41809
    +41813
    +41843
    +41849
    +41851
    +41863
    +41879
    +41887
    +41893
    +41897
    +41903
    +41911
    +41927
    +41941
    +41947
    +41953
    +41957
    +41959
    +41969
    +41981
    +41983
    +41999
    +42013
    +42017
    +42019
    +42023
    +42043
    +42061
    +42071
    +42073
    +42083
    +42089
    +42101
    +42131
    +42139
    +42157
    +42169
    +42179
    +42181
    +42187
    +42193
    +42197
    +42209
    +42221
    +42223
    +42227
    +42239
    +42257
    +42281
    +42283
    +42293
    +42299
    +42307
    +42323
    +42331
    +42337
    +42349
    +42359
    +42373
    +42379
    +42391
    +42397
    +42403
    +42407
    +42409
    +42433
    +42437
    +42443
    +42451
    +42457
    +42461
    +42463
    +42467
    +42473
    +42487
    +42491
    +42499
    +42509
    +42533
    +42557
    +42569
    +42571
    +42577
    +42589
    +42611
    +42641
    +42643
    +42649
    +42667
    +42677
    +42683
    +42689
    +42697
    +42701
    +42703
    +42709
    +42719
    +42727
    +42737
    +42743
    +42751
    +42767
    +42773
    +42787
    +42793
    +42797
    +42821
    +42829
    +42839
    +42841
    +42853
    +42859
    +42863
    +42899
    +42901
    +42923
    +42929
    +42937
    +42943
    +42953
    +42961
    +42967
    +42979
    +42989
    +43003
    +43013
    +43019
    +43037
    +43049
    +43051
    +43063
    +43067
    +43093
    +43103
    +43117
    +43133
    +43151
    +43159
    +43177
    +43189
    +43201
    +43207
    +43223
    +43237
    +43261
    +43271
    +43283
    +43291
    +43313
    +43319
    +43321
    +43331
    +43391
    +43397
    +43399
    +43403
    +43411
    +43427
    +43441
    +43451
    +43457
    +43481
    +43487
    +43499
    +43517
    +43541
    +43543
    +43573
    +43577
    +43579
    +43591
    +43597
    +43607
    +43609
    +43613
    +43627
    +43633
    +43649
    +43651
    +43661
    +43669
    +43691
    +43711
    +43717
    +43721
    +43753
    +43759
    +43777
    +43781
    +43783
    +43787
    +43789
    +43793
    +43801
    +43853
    +43867
    +43889
    +43891
    +43913
    +43933
    +43943
    +43951
    +43961
    +43963
    +43969
    +43973
    +43987
    +43991
    +43997
    +44017
    +44021
    +44027
    +44029
    +44041
    +44053
    +44059
    +44071
    +44087
    +44089
    +44101
    +44111
    +44119
    +44123
    +44129
    +44131
    +44159
    +44171
    +44179
    +44189
    +44201
    +44203
    +44207
    +44221
    +44249
    +44257
    +44263
    +44267
    +44269
    +44273
    +44279
    +44281
    +44293
    +44351
    +44357
    +44371
    +44381
    +44383
    +44389
    +44417
    +44449
    +44453
    +44483
    +44491
    +44497
    +44501
    +44507
    +44519
    +44531
    +44533
    +44537
    +44543
    +44549
    +44563
    +44579
    +44587
    +44617
    +44621
    +44623
    +44633
    +44641
    +44647
    +44651
    +44657
    +44683
    +44687
    +44699
    +44701
    +44711
    +44729
    +44741
    +44753
    +44771
    +44773
    +44777
    +44789
    +44797
    +44809
    +44819
    +44839
    +44843
    +44851
    +44867
    +44879
    +44887
    +44893
    +44909
    +44917
    +44927
    +44939
    +44953
    +44959
    +44963
    +44971
    +44983
    +44987
    +45007
    +45013
    +45053
    +45061
    +45077
    +45083
    +45119
    +45121
    +45127
    +45131
    +45137
    +45139
    +45161
    +45179
    +45181
    +45191
    +45197
    +45233
    +45247
    +45259
    +45263
    +45281
    +45289
    +45293
    +45307
    +45317
    +45319
    +45329
    +45337
    +45341
    +45343
    +45361
    +45377
    +45389
    +45403
    +45413
    +45427
    +45433
    +45439
    +45481
    +45491
    +45497
    +45503
    +45523
    +45533
    +45541
    +45553
    +45557
    +45569
    +45587
    +45589
    +45599
    +45613
    +45631
    +45641
    +45659
    +45667
    +45673
    +45677
    +45691
    +45697
    +45707
    +45737
    +45751
    +45757
    +45763
    +45767
    +45779
    +45817
    +45821
    +45823
    +45827
    +45833
    +45841
    +45853
    +45863
    +45869
    +45887
    +45893
    +45943
    +45949
    +45953
    +45959
    +45971
    +45979
    +45989
    +46021
    +46027
    +46049
    +46051
    +46061
    +46073
    +46091
    +46093
    +46099
    +46103
    +46133
    +46141
    +46147
    +46153
    +46171
    +46181
    +46183
    +46187
    +46199
    +46219
    +46229
    +46237
    +46261
    +46271
    +46273
    +46279
    +46301
    +46307
    +46309
    +46327
    +46337
    +46349
    +46351
    +46381
    +46399
    +46411
    +46439
    +46441
    +46447
    +46451
    +46457
    +46471
    +46477
    +46489
    +46499
    +46507
    +46511
    +46523
    +46549
    +46559
    +46567
    +46573
    +46589
    +46591
    +46601
    +46619
    +46633
    +46639
    +46643
    +46649
    +46663
    +46679
    +46681
    +46687
    +46691
    +46703
    +46723
    +46727
    +46747
    +46751
    +46757
    +46769
    +46771
    +46807
    +46811
    +46817
    +46819
    +46829
    +46831
    +46853
    +46861
    +46867
    +46877
    +46889
    +46901
    +46919
    +46933
    +46957
    +46993
    +46997
    +47017
    +47041
    +47051
    +47057
    +47059
    +47087
    +47093
    +47111
    +47119
    +47123
    +47129
    +47137
    +47143
    +47147
    +47149
    +47161
    +47189
    +47207
    +47221
    +47237
    +47251
    +47269
    +47279
    +47287
    +47293
    +47297
    +47303
    +47309
    +47317
    +47339
    +47351
    +47353
    +47363
    +47381
    +47387
    +47389
    +47407
    +47417
    +47419
    +47431
    +47441
    +47459
    +47491
    +47497
    +47501
    +47507
    +47513
    +47521
    +47527
    +47533
    +47543
    +47563
    +47569
    +47581
    +47591
    +47599
    +47609
    +47623
    +47629
    +47639
    +47653
    +47657
    +47659
    +47681
    +47699
    +47701
    +47711
    +47713
    +47717
    +47737
    +47741
    +47743
    +47777
    +47779
    +47791
    +47797
    +47807
    +47809
    +47819
    +47837
    +47843
    +47857
    +47869
    +47881
    +47903
    +47911
    +47917
    +47933
    +47939
    +47947
    +47951
    +47963
    +47969
    +47977
    +47981
    +48017
    +48023
    +48029
    +48049
    +48073
    +48079
    +48091
    +48109
    +48119
    +48121
    +48131
    +48157
    +48163
    +48179
    +48187
    +48193
    +48197
    +48221
    +48239
    +48247
    +48259
    +48271
    +48281
    +48299
    +48311
    +48313
    +48337
    +48341
    +48353
    +48371
    +48383
    +48397
    +48407
    +48409
    +48413
    +48437
    +48449
    +48463
    +48473
    +48479
    +48481
    +48487
    +48491
    +48497
    +48523
    +48527
    +48533
    +48539
    +48541
    +48563
    +48571
    +48589
    +48593
    +48611
    +48619
    +48623
    +48647
    +48649
    +48661
    +48673
    +48677
    +48679
    +48731
    +48733
    +48751
    +48757
    +48761
    +48767
    +48779
    +48781
    +48787
    +48799
    +48809
    +48817
    +48821
    +48823
    +48847
    +48857
    +48859
    +48869
    +48871
    +48883
    +48889
    +48907
    +48947
    +48953
    +48973
    +48989
    +48991
    +49003
    +49009
    +49019
    +49031
    +49033
    +49037
    +49043
    +49057
    +49069
    +49081
    +49103
    +49109
    +49117
    +49121
    +49123
    +49139
    +49157
    +49169
    +49171
    +49177
    +49193
    +49199
    +49201
    +49207
    +49211
    +49223
    +49253
    +49261
    +49277
    +49279
    +49297
    +49307
    +49331
    +49333
    +49339
    +49363
    +49367
    +49369
    +49391
    +49393
    +49409
    +49411
    +49417
    +49429
    +49433
    +49451
    +49459
    +49463
    +49477
    +49481
    +49499
    +49523
    +49529
    +49531
    +49537
    +49547
    +49549
    +49559
    +49597
    +49603
    +49613
    +49627
    +49633
    +49639
    +49663
    +49667
    +49669
    +49681
    +49697
    +49711
    +49727
    +49739
    +49741
    +49747
    +49757
    +49783
    +49787
    +49789
    +49801
    +49807
    +49811
    +49823
    +49831
    +49843
    +49853
    +49871
    +49877
    +49891
    +49919
    +49921
    +49927
    +49937
    +49939
    +49943
    +49957
    +49991
    +49993
    +49999
    +50021
    +50023
    +50033
    +50047
    +50051
    +50053
    +50069
    +50077
    +50087
    +50093
    +50101
    +50111
    +50119
    +50123
    +50129
    +50131
    +50147
    +50153
    +50159
    +50177
    +50207
    +50221
    +50227
    +50231
    +50261
    +50263
    +50273
    +50287
    +50291
    +50311
    +50321
    +50329
    +50333
    +50341
    +50359
    +50363
    +50377
    +50383
    +50387
    +50411
    +50417
    +50423
    +50441
    +50459
    +50461
    +50497
    +50503
    +50513
    +50527
    +50539
    +50543
    +50549
    +50551
    +50581
    +50587
    +50591
    +50593
    +50599
    +50627
    +50647
    +50651
    +50671
    +50683
    +50707
    +50723
    +50741
    +50753
    +50767
    +50773
    +50777
    +50789
    +50821
    +50833
    +50839
    +50849
    +50857
    +50867
    +50873
    +50891
    +50893
    +50909
    +50923
    +50929
    +50951
    +50957
    +50969
    +50971
    +50989
    +50993
    +51001
    +51031
    +51043
    +51047
    +51059
    +51061
    +51071
    +51109
    +51131
    +51133
    +51137
    +51151
    +51157
    +51169
    +51193
    +51197
    +51199
    +51203
    +51217
    +51229
    +51239
    +51241
    +51257
    +51263
    +51283
    +51287
    +51307
    +51329
    +51341
    +51343
    +51347
    +51349
    +51361
    +51383
    +51407
    +51413
    +51419
    +51421
    +51427
    +51431
    +51437
    +51439
    +51449
    +51461
    +51473
    +51479
    +51481
    +51487
    +51503
    +51511
    +51517
    +51521
    +51539
    +51551
    +51563
    +51577
    +51581
    +51593
    +51599
    +51607
    +51613
    +51631
    +51637
    +51647
    +51659
    +51673
    +51679
    +51683
    +51691
    +51713
    +51719
    +51721
    +51749
    +51767
    +51769
    +51787
    +51797
    +51803
    +51817
    +51827
    +51829
    +51839
    +51853
    +51859
    +51869
    +51871
    +51893
    +51899
    +51907
    +51913
    +51929
    +51941
    +51949
    +51971
    +51973
    +51977
    +51991
    +52009
    +52021
    +52027
    +52051
    +52057
    +52067
    +52069
    +52081
    +52103
    +52121
    +52127
    +52147
    +52153
    +52163
    +52177
    +52181
    +52183
    +52189
    +52201
    +52223
    +52237
    +52249
    +52253
    +52259
    +52267
    +52289
    +52291
    +52301
    +52313
    +52321
    +52361
    +52363
    +52369
    +52379
    +52387
    +52391
    +52433
    +52453
    +52457
    +52489
    +52501
    +52511
    +52517
    +52529
    +52541
    +52543
    +52553
    +52561
    +52567
    +52571
    +52579
    +52583
    +52609
    +52627
    +52631
    +52639
    +52667
    +52673
    +52691
    +52697
    +52709
    +52711
    +52721
    +52727
    +52733
    +52747
    +52757
    +52769
    +52783
    +52807
    +52813
    +52817
    +52837
    +52859
    +52861
    +52879
    +52883
    +52889
    +52901
    +52903
    +52919
    +52937
    +52951
    +52957
    +52963
    +52967
    +52973
    +52981
    +52999
    +53003
    +53017
    +53047
    +53051
    +53069
    +53077
    +53087
    +53089
    +53093
    +53101
    +53113
    +53117
    +53129
    +53147
    +53149
    +53161
    +53171
    +53173
    +53189
    +53197
    +53201
    +53231
    +53233
    +53239
    +53267
    +53269
    +53279
    +53281
    +53299
    +53309
    +53323
    +53327
    +53353
    +53359
    +53377
    +53381
    +53401
    +53407
    +53411
    +53419
    +53437
    +53441
    +53453
    +53479
    +53503
    +53507
    +53527
    +53549
    +53551
    +53569
    +53591
    +53593
    +53597
    +53609
    +53611
    +53617
    +53623
    +53629
    +53633
    +53639
    +53653
    +53657
    +53681
    +53693
    +53699
    +53717
    +53719
    +53731
    +53759
    +53773
    +53777
    +53783
    +53791
    +53813
    +53819
    +53831
    +53849
    +53857
    +53861
    +53881
    +53887
    +53891
    +53897
    +53899
    +53917
    +53923
    +53927
    +53939
    +53951
    +53959
    +53987
    +53993
    +54001
    +54011
    +54013
    +54037
    +54049
    +54059
    +54083
    +54091
    +54101
    +54121
    +54133
    +54139
    +54151
    +54163
    +54167
    +54181
    +54193
    +54217
    +54251
    +54269
    +54277
    +54287
    +54293
    +54311
    +54319
    +54323
    +54331
    +54347
    +54361
    +54367
    +54371
    +54377
    +54401
    +54403
    +54409
    +54413
    +54419
    +54421
    +54437
    +54443
    +54449
    +54469
    +54493
    +54497
    +54499
    +54503
    +54517
    +54521
    +54539
    +54541
    +54547
    +54559
    +54563
    +54577
    +54581
    +54583
    +54601
    +54617
    +54623
    +54629
    +54631
    +54647
    +54667
    +54673
    +54679
    +54709
    +54713
    +54721
    +54727
    +54751
    +54767
    +54773
    +54779
    +54787
    +54799
    +54829
    +54833
    +54851
    +54869
    +54877
    +54881
    +54907
    +54917
    +54919
    +54941
    +54949
    +54959
    +54973
    +54979
    +54983
    +55001
    +55009
    +55021
    +55049
    +55051
    +55057
    +55061
    +55073
    +55079
    +55103
    +55109
    +55117
    +55127
    +55147
    +55163
    +55171
    +55201
    +55207
    +55213
    +55217
    +55219
    +55229
    +55243
    +55249
    +55259
    +55291
    +55313
    +55331
    +55333
    +55337
    +55339
    +55343
    +55351
    +55373
    +55381
    +55399
    +55411
    +55439
    +55441
    +55457
    +55469
    +55487
    +55501
    +55511
    +55529
    +55541
    +55547
    +55579
    +55589
    +55603
    +55609
    +55619
    +55621
    +55631
    +55633
    +55639
    +55661
    +55663
    +55667
    +55673
    +55681
    +55691
    +55697
    +55711
    +55717
    +55721
    +55733
    +55763
    +55787
    +55793
    +55799
    +55807
    +55813
    +55817
    +55819
    +55823
    +55829
    +55837
    +55843
    +55849
    +55871
    +55889
    +55897
    +55901
    +55903
    +55921
    +55927
    +55931
    +55933
    +55949
    +55967
    +55987
    +55997
    +56003
    +56009
    +56039
    +56041
    +56053
    +56081
    +56087
    +56093
    +56099
    +56101
    +56113
    +56123
    +56131
    +56149
    +56167
    +56171
    +56179
    +56197
    +56207
    +56209
    +56237
    +56239
    +56249
    +56263
    +56267
    +56269
    +56299
    +56311
    +56333
    +56359
    +56369
    +56377
    +56383
    +56393
    +56401
    +56417
    +56431
    +56437
    +56443
    +56453
    +56467
    +56473
    +56477
    +56479
    +56489
    +56501
    +56503
    +56509
    +56519
    +56527
    +56531
    +56533
    +56543
    +56569
    +56591
    +56597
    +56599
    +56611
    +56629
    +56633
    +56659
    +56663
    +56671
    +56681
    +56687
    +56701
    +56711
    +56713
    +56731
    +56737
    +56747
    +56767
    +56773
    +56779
    +56783
    +56807
    +56809
    +56813
    +56821
    +56827
    +56843
    +56857
    +56873
    +56891
    +56893
    +56897
    +56909
    +56911
    +56921
    +56923
    +56929
    +56941
    +56951
    +56957
    +56963
    +56983
    +56989
    +56993
    +56999
    +57037
    +57041
    +57047
    +57059
    +57073
    +57077
    +57089
    +57097
    +57107
    +57119
    +57131
    +57139
    +57143
    +57149
    +57163
    +57173
    +57179
    +57191
    +57193
    +57203
    +57221
    +57223
    +57241
    +57251
    +57259
    +57269
    +57271
    +57283
    +57287
    +57301
    +57329
    +57331
    +57347
    +57349
    +57367
    +57373
    +57383
    +57389
    +57397
    +57413
    +57427
    +57457
    +57467
    +57487
    +57493
    +57503
    +57527
    +57529
    +57557
    +57559
    +57571
    +57587
    +57593
    +57601
    +57637
    +57641
    +57649
    +57653
    +57667
    +57679
    +57689
    +57697
    +57709
    +57713
    +57719
    +57727
    +57731
    +57737
    +57751
    +57773
    +57781
    +57787
    +57791
    +57793
    +57803
    +57809
    +57829
    +57839
    +57847
    +57853
    +57859
    +57881
    +57899
    +57901
    +57917
    +57923
    +57943
    +57947
    +57973
    +57977
    +57991
    +58013
    +58027
    +58031
    +58043
    +58049
    +58057
    +58061
    +58067
    +58073
    +58099
    +58109
    +58111
    +58129
    +58147
    +58151
    +58153
    +58169
    +58171
    +58189
    +58193
    +58199
    +58207
    +58211
    +58217
    +58229
    +58231
    +58237
    +58243
    +58271
    +58309
    +58313
    +58321
    +58337
    +58363
    +58367
    +58369
    +58379
    +58391
    +58393
    +58403
    +58411
    +58417
    +58427
    +58439
    +58441
    +58451
    +58453
    +58477
    +58481
    +58511
    +58537
    +58543
    +58549
    +58567
    +58573
    +58579
    +58601
    +58603
    +58613
    +58631
    +58657
    +58661
    +58679
    +58687
    +58693
    +58699
    +58711
    +58727
    +58733
    +58741
    +58757
    +58763
    +58771
    +58787
    +58789
    +58831
    +58889
    +58897
    +58901
    +58907
    +58909
    +58913
    +58921
    +58937
    +58943
    +58963
    +58967
    +58979
    +58991
    +58997
    +59009
    +59011
    +59021
    +59023
    +59029
    +59051
    +59053
    +59063
    +59069
    +59077
    +59083
    +59093
    +59107
    +59113
    +59119
    +59123
    +59141
    +59149
    +59159
    +59167
    +59183
    +59197
    +59207
    +59209
    +59219
    +59221
    +59233
    +59239
    +59243
    +59263
    +59273
    +59281
    +59333
    +59341
    +59351
    +59357
    +59359
    +59369
    +59377
    +59387
    +59393
    +59399
    +59407
    +59417
    +59419
    +59441
    +59443
    +59447
    +59453
    +59467
    +59471
    +59473
    +59497
    +59509
    +59513
    +59539
    +59557
    +59561
    +59567
    +59581
    +59611
    +59617
    +59621
    +59627
    +59629
    +59651
    +59659
    +59663
    +59669
    +59671
    +59693
    +59699
    +59707
    +59723
    +59729
    +59743
    +59747
    +59753
    +59771
    +59779
    +59791
    +59797
    +59809
    +59833
    +59863
    +59879
    +59887
    +59921
    +59929
    +59951
    +59957
    +59971
    +59981
    +59999
    +60013
    +60017
    +60029
    +60037
    +60041
    +60077
    +60083
    +60089
    +60091
    +60101
    +60103
    +60107
    +60127
    +60133
    +60139
    +60149
    +60161
    +60167
    +60169
    +60209
    +60217
    +60223
    +60251
    +60257
    +60259
    +60271
    +60289
    +60293
    +60317
    +60331
    +60337
    +60343
    +60353
    +60373
    +60383
    +60397
    +60413
    +60427
    +60443
    +60449
    +60457
    +60493
    +60497
    +60509
    +60521
    +60527
    +60539
    +60589
    +60601
    +60607
    +60611
    +60617
    +60623
    +60631
    +60637
    +60647
    +60649
    +60659
    +60661
    +60679
    +60689
    +60703
    +60719
    +60727
    +60733
    +60737
    +60757
    +60761
    +60763
    +60773
    +60779
    +60793
    +60811
    +60821
    +60859
    +60869
    +60887
    +60889
    +60899
    +60901
    +60913
    +60917
    +60919
    +60923
    +60937
    +60943
    +60953
    +60961
    +61001
    +61007
    +61027
    +61031
    +61043
    +61051
    +61057
    +61091
    +61099
    +61121
    +61129
    +61141
    +61151
    +61153
    +61169
    +61211
    +61223
    +61231
    +61253
    +61261
    +61283
    +61291
    +61297
    +61331
    +61333
    +61339
    +61343
    +61357
    +61363
    +61379
    +61381
    +61403
    +61409
    +61417
    +61441
    +61463
    +61469
    +61471
    +61483
    +61487
    +61493
    +61507
    +61511
    +61519
    +61543
    +61547
    +61553
    +61559
    +61561
    +61583
    +61603
    +61609
    +61613
    +61627
    +61631
    +61637
    +61643
    +61651
    +61657
    +61667
    +61673
    +61681
    +61687
    +61703
    +61717
    +61723
    +61729
    +61751
    +61757
    +61781
    +61813
    +61819
    +61837
    +61843
    +61861
    +61871
    +61879
    +61909
    +61927
    +61933
    +61949
    +61961
    +61967
    +61979
    +61981
    +61987
    +61991
    +62003
    +62011
    +62017
    +62039
    +62047
    +62053
    +62057
    +62071
    +62081
    +62099
    +62119
    +62129
    +62131
    +62137
    +62141
    +62143
    +62171
    +62189
    +62191
    +62201
    +62207
    +62213
    +62219
    +62233
    +62273
    +62297
    +62299
    +62303
    +62311
    +62323
    +62327
    +62347
    +62351
    +62383
    +62401
    +62417
    +62423
    +62459
    +62467
    +62473
    +62477
    +62483
    +62497
    +62501
    +62507
    +62533
    +62539
    +62549
    +62563
    +62581
    +62591
    +62597
    +62603
    +62617
    +62627
    +62633
    +62639
    +62653
    +62659
    +62683
    +62687
    +62701
    +62723
    +62731
    +62743
    +62753
    +62761
    +62773
    +62791
    +62801
    +62819
    +62827
    +62851
    +62861
    +62869
    +62873
    +62897
    +62903
    +62921
    +62927
    +62929
    +62939
    +62969
    +62971
    +62981
    +62983
    +62987
    +62989
    +63029
    +63031
    +63059
    +63067
    +63073
    +63079
    +63097
    +63103
    +63113
    +63127
    +63131
    +63149
    +63179
    +63197
    +63199
    +63211
    +63241
    +63247
    +63277
    +63281
    +63299
    +63311
    +63313
    +63317
    +63331
    +63337
    +63347
    +63353
    +63361
    +63367
    +63377
    +63389
    +63391
    +63397
    +63409
    +63419
    +63421
    +63439
    +63443
    +63463
    +63467
    +63473
    +63487
    +63493
    +63499
    +63521
    +63527
    +63533
    +63541
    +63559
    +63577
    +63587
    +63589
    +63599
    +63601
    +63607
    +63611
    +63617
    +63629
    +63647
    +63649
    +63659
    +63667
    +63671
    +63689
    +63691
    +63697
    +63703
    +63709
    +63719
    +63727
    +63737
    +63743
    +63761
    +63773
    +63781
    +63793
    +63799
    +63803
    +63809
    +63823
    +63839
    +63841
    +63853
    +63857
    +63863
    +63901
    +63907
    +63913
    +63929
    +63949
    +63977
    +63997
    +64007
    +64013
    +64019
    +64033
    +64037
    +64063
    +64067
    +64081
    +64091
    +64109
    +64123
    +64151
    +64153
    +64157
    +64171
    +64187
    +64189
    +64217
    +64223
    +64231
    +64237
    +64271
    +64279
    +64283
    +64301
    +64303
    +64319
    +64327
    +64333
    +64373
    +64381
    +64399
    +64403
    +64433
    +64439
    +64451
    +64453
    +64483
    +64489
    +64499
    +64513
    +64553
    +64567
    +64577
    +64579
    +64591
    +64601
    +64609
    +64613
    +64621
    +64627
    +64633
    +64661
    +64663
    +64667
    +64679
    +64693
    +64709
    +64717
    +64747
    +64763
    +64781
    +64783
    +64793
    +64811
    +64817
    +64849
    +64853
    +64871
    +64877
    +64879
    +64891
    +64901
    +64919
    +64921
    +64927
    +64937
    +64951
    +64969
    +64997
    +65003
    +65011
    +65027
    +65029
    +65033
    +65053
    +65063
    +65071
    +65089
    +65099
    +65101
    +65111
    +65119
    +65123
    +65129
    +65141
    +65147
    +65167
    +65171
    +65173
    +65179
    +65183
    +65203
    +65213
    +65239
    +65257
    +65267
    +65269
    +65287
    +65293
    +65309
    +65323
    +65327
    +65353
    +65357
    +65371
    +65381
    +65393
    +65407
    +65413
    +65419
    +65423
    +65437
    +65447
    +65449
    +65479
    +65497
    +65519
    +65521
    +65537
    +65539
    +65543
    +65551
    +65557
    +65563
    +65579
    +65581
    +65587
    +65599
    +65609
    +65617
    +65629
    +65633
    +65647
    +65651
    +65657
    +65677
    +65687
    +65699
    +65701
    +65707
    +65713
    +65717
    +65719
    +65729
    +65731
    +65761
    +65777
    +65789
    +65809
    +65827
    +65831
    +65837
    +65839
    +65843
    +65851
    +65867
    +65881
    +65899
    +65921
    +65927
    +65929
    +65951
    +65957
    +65963
    +65981
    +65983
    +65993
    +66029
    +66037
    +66041
    +66047
    +66067
    +66071
    +66083
    +66089
    +66103
    +66107
    +66109
    +66137
    +66161
    +66169
    +66173
    +66179
    +66191
    +66221
    +66239
    +66271
    +66293
    +66301
    +66337
    +66343
    +66347
    +66359
    +66361
    +66373
    +66377
    +66383
    +66403
    +66413
    +66431
    +66449
    +66457
    +66463
    +66467
    +66491
    +66499
    +66509
    +66523
    +66529
    +66533
    +66541
    +66553
    +66569
    +66571
    +66587
    +66593
    +66601
    +66617
    +66629
    +66643
    +66653
    +66683
    +66697
    +66701
    +66713
    +66721
    +66733
    +66739
    +66749
    +66751
    +66763
    +66791
    +66797
    +66809
    +66821
    +66841
    +66851
    +66853
    +66863
    +66877
    +66883
    +66889
    +66919
    +66923
    +66931
    +66943
    +66947
    +66949
    +66959
    +66973
    +66977
    +67003
    +67021
    +67033
    +67043
    +67049
    +67057
    +67061
    +67073
    +67079
    +67103
    +67121
    +67129
    +67139
    +67141
    +67153
    +67157
    +67169
    +67181
    +67187
    +67189
    +67211
    +67213
    +67217
    +67219
    +67231
    +67247
    +67261
    +67271
    +67273
    +67289
    +67307
    +67339
    +67343
    +67349
    +67369
    +67391
    +67399
    +67409
    +67411
    +67421
    +67427
    +67429
    +67433
    +67447
    +67453
    +67477
    +67481
    +67489
    +67493
    +67499
    +67511
    +67523
    +67531
    +67537
    +67547
    +67559
    +67567
    +67577
    +67579
    +67589
    +67601
    +67607
    +67619
    +67631
    +67651
    +67679
    +67699
    +67709
    +67723
    +67733
    +67741
    +67751
    +67757
    +67759
    +67763
    +67777
    +67783
    +67789
    +67801
    +67807
    +67819
    +67829
    +67843
    +67853
    +67867
    +67883
    +67891
    +67901
    +67927
    +67931
    +67933
    +67939
    +67943
    +67957
    +67961
    +67967
    +67979
    +67987
    +67993
    +68023
    +68041
    +68053
    +68059
    +68071
    +68087
    +68099
    +68111
    +68113
    +68141
    +68147
    +68161
    +68171
    +68207
    +68209
    +68213
    +68219
    +68227
    +68239
    +68261
    +68279
    +68281
    +68311
    +68329
    +68351
    +68371
    +68389
    +68399
    +68437
    +68443
    +68447
    +68449
    +68473
    +68477
    +68483
    +68489
    +68491
    +68501
    +68507
    +68521
    +68531
    +68539
    +68543
    +68567
    +68581
    +68597
    +68611
    +68633
    +68639
    +68659
    +68669
    +68683
    +68687
    +68699
    +68711
    +68713
    +68729
    +68737
    +68743
    +68749
    +68767
    +68771
    +68777
    +68791
    +68813
    +68819
    +68821
    +68863
    +68879
    +68881
    +68891
    +68897
    +68899
    +68903
    +68909
    +68917
    +68927
    +68947
    +68963
    +68993
    +69001
    +69011
    +69019
    +69029
    +69031
    +69061
    +69067
    +69073
    +69109
    +69119
    +69127
    +69143
    +69149
    +69151
    +69163
    +69191
    +69193
    +69197
    +69203
    +69221
    +69233
    +69239
    +69247
    +69257
    +69259
    +69263
    +69313
    +69317
    +69337
    +69341
    +69371
    +69379
    +69383
    +69389
    +69401
    +69403
    +69427
    +69431
    +69439
    +69457
    +69463
    +69467
    +69473
    +69481
    +69491
    +69493
    +69497
    +69499
    +69539
    +69557
    +69593
    +69623
    +69653
    +69661
    +69677
    +69691
    +69697
    +69709
    +69737
    +69739
    +69761
    +69763
    +69767
    +69779
    +69809
    +69821
    +69827
    +69829
    +69833
    +69847
    +69857
    +69859
    +69877
    +69899
    +69911
    +69929
    +69931
    +69941
    +69959
    +69991
    +69997
    +70001
    +70003
    +70009
    +70019
    +70039
    +70051
    +70061
    +70067
    +70079
    +70099
    +70111
    +70117
    +70121
    +70123
    +70139
    +70141
    +70157
    +70163
    +70177
    +70181
    +70183
    +70199
    +70201
    +70207
    +70223
    +70229
    +70237
    +70241
    +70249
    +70271
    +70289
    +70297
    +70309
    +70313
    +70321
    +70327
    +70351
    +70373
    +70379
    +70381
    +70393
    +70423
    +70429
    +70439
    +70451
    +70457
    +70459
    +70481
    +70487
    +70489
    +70501
    +70507
    +70529
    +70537
    +70549
    +70571
    +70573
    +70583
    +70589
    +70607
    +70619
    +70621
    +70627
    +70639
    +70657
    +70663
    +70667
    +70687
    +70709
    +70717
    +70729
    +70753
    +70769
    +70783
    +70793
    +70823
    +70841
    +70843
    +70849
    +70853
    +70867
    +70877
    +70879
    +70891
    +70901
    +70913
    +70919
    +70921
    +70937
    +70949
    +70951
    +70957
    +70969
    +70979
    +70981
    +70991
    +70997
    +70999
    +71011
    +71023
    +71039
    +71059
    +71069
    +71081
    +71089
    +71119
    +71129
    +71143
    +71147
    +71153
    +71161
    +71167
    +71171
    +71191
    +71209
    +71233
    +71237
    +71249
    +71257
    +71261
    +71263
    +71287
    +71293
    +71317
    +71327
    +71329
    +71333
    +71339
    +71341
    +71347
    +71353
    +71359
    +71363
    +71387
    +71389
    +71399
    +71411
    +71413
    +71419
    +71429
    +71437
    +71443
    +71453
    +71471
    +71473
    +71479
    +71483
    +71503
    +71527
    +71537
    +71549
    +71551
    +71563
    +71569
    +71593
    +71597
    +71633
    +71647
    +71663
    +71671
    +71693
    +71699
    +71707
    +71711
    +71713
    +71719
    +71741
    +71761
    +71777
    +71789
    +71807
    +71809
    +71821
    +71837
    +71843
    +71849
    +71861
    +71867
    +71879
    +71881
    +71887
    +71899
    +71909
    +71917
    +71933
    +71941
    +71947
    +71963
    +71971
    +71983
    +71987
    +71993
    +71999
    +72019
    +72031
    +72043
    +72047
    +72053
    +72073
    +72077
    +72089
    +72091
    +72101
    +72103
    +72109
    +72139
    +72161
    +72167
    +72169
    +72173
    +72211
    +72221
    +72223
    +72227
    +72229
    +72251
    +72253
    +72269
    +72271
    +72277
    +72287
    +72307
    +72313
    +72337
    +72341
    +72353
    +72367
    +72379
    +72383
    +72421
    +72431
    +72461
    +72467
    +72469
    +72481
    +72493
    +72497
    +72503
    +72533
    +72547
    +72551
    +72559
    +72577
    +72613
    +72617
    +72623
    +72643
    +72647
    +72649
    +72661
    +72671
    +72673
    +72679
    +72689
    +72701
    +72707
    +72719
    +72727
    +72733
    +72739
    +72763
    +72767
    +72797
    +72817
    +72823
    +72859
    +72869
    +72871
    +72883
    +72889
    +72893
    +72901
    +72907
    +72911
    +72923
    +72931
    +72937
    +72949
    +72953
    +72959
    +72973
    +72977
    +72997
    +73009
    +73013
    +73019
    +73037
    +73039
    +73043
    +73061
    +73063
    +73079
    +73091
    +73121
    +73127
    +73133
    +73141
    +73181
    +73189
    +73237
    +73243
    +73259
    +73277
    +73291
    +73303
    +73309
    +73327
    +73331
    +73351
    +73361
    +73363
    +73369
    +73379
    +73387
    +73417
    +73421
    +73433
    +73453
    +73459
    +73471
    +73477
    +73483
    +73517
    +73523
    +73529
    +73547
    +73553
    +73561
    +73571
    +73583
    +73589
    +73597
    +73607
    +73609
    +73613
    +73637
    +73643
    +73651
    +73673
    +73679
    +73681
    +73693
    +73699
    +73709
    +73721
    +73727
    +73751
    +73757
    +73771
    +73783
    +73819
    +73823
    +73847
    +73849
    +73859
    +73867
    +73877
    +73883
    +73897
    +73907
    +73939
    +73943
    +73951
    +73961
    +73973
    +73999
    +74017
    +74021
    +74027
    +74047
    +74051
    +74071
    +74077
    +74093
    +74099
    +74101
    +74131
    +74143
    +74149
    +74159
    +74161
    +74167
    +74177
    +74189
    +74197
    +74201
    +74203
    +74209
    +74219
    +74231
    +74257
    +74279
    +74287
    +74293
    +74297
    +74311
    +74317
    +74323
    +74353
    +74357
    +74363
    +74377
    +74381
    +74383
    +74411
    +74413
    +74419
    +74441
    +74449
    +74453
    +74471
    +74489
    +74507
    +74509
    +74521
    +74527
    +74531
    +74551
    +74561
    +74567
    +74573
    +74587
    +74597
    +74609
    +74611
    +74623
    +74653
    +74687
    +74699
    +74707
    +74713
    +74717
    +74719
    +74729
    +74731
    +74747
    +74759
    +74761
    +74771
    +74779
    +74797
    +74821
    +74827
    +74831
    +74843
    +74857
    +74861
    +74869
    +74873
    +74887
    +74891
    +74897
    +74903
    +74923
    +74929
    +74933
    +74941
    +74959
    +75011
    +75013
    +75017
    +75029
    +75037
    +75041
    +75079
    +75083
    +75109
    +75133
    +75149
    +75161
    +75167
    +75169
    +75181
    +75193
    +75209
    +75211
    +75217
    +75223
    +75227
    +75239
    +75253
    +75269
    +75277
    +75289
    +75307
    +75323
    +75329
    +75337
    +75347
    +75353
    +75367
    +75377
    +75389
    +75391
    +75401
    +75403
    +75407
    +75431
    +75437
    +75479
    +75503
    +75511
    +75521
    +75527
    +75533
    +75539
    +75541
    +75553
    +75557
    +75571
    +75577
    +75583
    +75611
    +75617
    +75619
    +75629
    +75641
    +75653
    +75659
    +75679
    +75683
    +75689
    +75703
    +75707
    +75709
    +75721
    +75731
    +75743
    +75767
    +75773
    +75781
    +75787
    +75793
    +75797
    +75821
    +75833
    +75853
    +75869
    +75883
    +75913
    +75931
    +75937
    +75941
    +75967
    +75979
    +75983
    +75989
    +75991
    +75997
    +76001
    +76003
    +76031
    +76039
    +76079
    +76081
    +76091
    +76099
    +76103
    +76123
    +76129
    +76147
    +76157
    +76159
    +76163
    +76207
    +76213
    +76231
    +76243
    +76249
    +76253
    +76259
    +76261
    +76283
    +76289
    +76303
    +76333
    +76343
    +76367
    +76369
    +76379
    +76387
    +76403
    +76421
    +76423
    +76441
    +76463
    +76471
    +76481
    +76487
    +76493
    +76507
    +76511
    +76519
    +76537
    +76541
    +76543
    +76561
    +76579
    +76597
    +76603
    +76607
    +76631
    +76649
    +76651
    +76667
    +76673
    +76679
    +76697
    +76717
    +76733
    +76753
    +76757
    +76771
    +76777
    +76781
    +76801
    +76819
    +76829
    +76831
    +76837
    +76847
    +76871
    +76873
    +76883
    +76907
    +76913
    +76919
    +76943
    +76949
    +76961
    +76963
    +76991
    +77003
    +77017
    +77023
    +77029
    +77041
    +77047
    +77069
    +77081
    +77093
    +77101
    +77137
    +77141
    +77153
    +77167
    +77171
    +77191
    +77201
    +77213
    +77237
    +77239
    +77243
    +77249
    +77261
    +77263
    +77267
    +77269
    +77279
    +77291
    +77317
    +77323
    +77339
    +77347
    +77351
    +77359
    +77369
    +77377
    +77383
    +77417
    +77419
    +77431
    +77447
    +77471
    +77477
    +77479
    +77489
    +77491
    +77509
    +77513
    +77521
    +77527
    +77543
    +77549
    +77551
    +77557
    +77563
    +77569
    +77573
    +77587
    +77591
    +77611
    +77617
    +77621
    +77641
    +77647
    +77659
    +77681
    +77687
    +77689
    +77699
    +77711
    +77713
    +77719
    +77723
    +77731
    +77743
    +77747
    +77761
    +77773
    +77783
    +77797
    +77801
    +77813
    +77839
    +77849
    +77863
    +77867
    +77893
    +77899
    +77929
    +77933
    +77951
    +77969
    +77977
    +77983
    +77999
    +78007
    +78017
    +78031
    +78041
    +78049
    +78059
    +78079
    +78101
    +78121
    +78137
    +78139
    +78157
    +78163
    +78167
    +78173
    +78179
    +78191
    +78193
    +78203
    +78229
    +78233
    +78241
    +78259
    +78277
    +78283
    +78301
    +78307
    +78311
    +78317
    +78341
    +78347
    +78367
    +78401
    +78427
    +78437
    +78439
    +78467
    +78479
    +78487
    +78497
    +78509
    +78511
    +78517
    +78539
    +78541
    +78553
    +78569
    +78571
    +78577
    +78583
    +78593
    +78607
    +78623
    +78643
    +78649
    +78653
    +78691
    +78697
    +78707
    +78713
    +78721
    +78737
    +78779
    +78781
    +78787
    +78791
    +78797
    +78803
    +78809
    +78823
    +78839
    +78853
    +78857
    +78877
    +78887
    +78889
    +78893
    +78901
    +78919
    +78929
    +78941
    +78977
    +78979
    +78989
    +79031
    +79039
    +79043
    +79063
    +79087
    +79103
    +79111
    +79133
    +79139
    +79147
    +79151
    +79153
    +79159
    +79181
    +79187
    +79193
    +79201
    +79229
    +79231
    +79241
    +79259
    +79273
    +79279
    +79283
    +79301
    +79309
    +79319
    +79333
    +79337
    +79349
    +79357
    +79367
    +79379
    +79393
    +79397
    +79399
    +79411
    +79423
    +79427
    +79433
    +79451
    +79481
    +79493
    +79531
    +79537
    +79549
    +79559
    +79561
    +79579
    +79589
    +79601
    +79609
    +79613
    +79621
    +79627
    +79631
    +79633
    +79657
    +79669
    +79687
    +79691
    +79693
    +79697
    +79699
    +79757
    +79769
    +79777
    +79801
    +79811
    +79813
    +79817
    +79823
    +79829
    +79841
    +79843
    +79847
    +79861
    +79867
    +79873
    +79889
    +79901
    +79903
    +79907
    +79939
    +79943
    +79967
    +79973
    +79979
    +79987
    +79997
    +79999
    +80021
    +80039
    +80051
    +80071
    +80077
    +80107
    +80111
    +80141
    +80147
    +80149
    +80153
    +80167
    +80173
    +80177
    +80191
    +80207
    +80209
    +80221
    +80231
    +80233
    +80239
    +80251
    +80263
    +80273
    +80279
    +80287
    +80309
    +80317
    +80329
    +80341
    +80347
    +80363
    +80369
    +80387
    +80407
    +80429
    +80447
    +80449
    +80471
    +80473
    +80489
    +80491
    +80513
    +80527
    +80537
    +80557
    +80567
    +80599
    +80603
    +80611
    +80621
    +80627
    +80629
    +80651
    +80657
    +80669
    +80671
    +80677
    +80681
    +80683
    +80687
    +80701
    +80713
    +80737
    +80747
    +80749
    +80761
    +80777
    +80779
    +80783
    +80789
    +80803
    +80809
    +80819
    +80831
    +80833
    +80849
    +80863
    +80897
    +80909
    +80911
    +80917
    +80923
    +80929
    +80933
    +80953
    +80963
    +80989
    +81001
    +81013
    +81017
    +81019
    +81023
    +81031
    +81041
    +81043
    +81047
    +81049
    +81071
    +81077
    +81083
    +81097
    +81101
    +81119
    +81131
    +81157
    +81163
    +81173
    +81181
    +81197
    +81199
    +81203
    +81223
    +81233
    +81239
    +81281
    +81283
    +81293
    +81299
    +81307
    +81331
    +81343
    +81349
    +81353
    +81359
    +81371
    +81373
    +81401
    +81409
    +81421
    +81439
    +81457
    +81463
    +81509
    +81517
    +81527
    +81533
    +81547
    +81551
    +81553
    +81559
    +81563
    +81569
    +81611
    +81619
    +81629
    +81637
    +81647
    +81649
    +81667
    +81671
    +81677
    +81689
    +81701
    +81703
    +81707
    +81727
    +81737
    +81749
    +81761
    +81769
    +81773
    +81799
    +81817
    +81839
    +81847
    +81853
    +81869
    +81883
    +81899
    +81901
    +81919
    +81929
    +81931
    +81937
    +81943
    +81953
    +81967
    +81971
    +81973
    +82003
    +82007
    +82009
    +82013
    +82021
    +82031
    +82037
    +82039
    +82051
    +82067
    +82073
    +82129
    +82139
    +82141
    +82153
    +82163
    +82171
    +82183
    +82189
    +82193
    +82207
    +82217
    +82219
    +82223
    +82231
    +82237
    +82241
    +82261
    +82267
    +82279
    +82301
    +82307
    +82339
    +82349
    +82351
    +82361
    +82373
    +82387
    +82393
    +82421
    +82457
    +82463
    +82469
    +82471
    +82483
    +82487
    +82493
    +82499
    +82507
    +82529
    +82531
    +82549
    +82559
    +82561
    +82567
    +82571
    +82591
    +82601
    +82609
    +82613
    +82619
    +82633
    +82651
    +82657
    +82699
    +82721
    +82723
    +82727
    +82729
    +82757
    +82759
    +82763
    +82781
    +82787
    +82793
    +82799
    +82811
    +82813
    +82837
    +82847
    +82883
    +82889
    +82891
    +82903
    +82913
    +82939
    +82963
    +82981
    +82997
    +83003
    +83009
    +83023
    +83047
    +83059
    +83063
    +83071
    +83077
    +83089
    +83093
    +83101
    +83117
    +83137
    +83177
    +83203
    +83207
    +83219
    +83221
    +83227
    +83231
    +83233
    +83243
    +83257
    +83267
    +83269
    +83273
    +83299
    +83311
    +83339
    +83341
    +83357
    +83383
    +83389
    +83399
    +83401
    +83407
    +83417
    +83423
    +83431
    +83437
    +83443
    +83449
    +83459
    +83471
    +83477
    +83497
    +83537
    +83557
    +83561
    +83563
    +83579
    +83591
    +83597
    +83609
    +83617
    +83621
    +83639
    +83641
    +83653
    +83663
    +83689
    +83701
    +83717
    +83719
    +83737
    +83761
    +83773
    +83777
    +83791
    +83813
    +83833
    +83843
    +83857
    +83869
    +83873
    +83891
    +83903
    +83911
    +83921
    +83933
    +83939
    +83969
    +83983
    +83987
    +84011
    +84017
    +84047
    +84053
    +84059
    +84061
    +84067
    +84089
    +84121
    +84127
    +84131
    +84137
    +84143
    +84163
    +84179
    +84181
    +84191
    +84199
    +84211
    +84221
    +84223
    +84229
    +84239
    +84247
    +84263
    +84299
    +84307
    +84313
    +84317
    +84319
    +84347
    +84349
    +84377
    +84389
    +84391
    +84401
    +84407
    +84421
    +84431
    +84437
    +84443
    +84449
    +84457
    +84463
    +84467
    +84481
    +84499
    +84503
    +84509
    +84521
    +84523
    +84533
    +84551
    +84559
    +84589
    +84629
    +84631
    +84649
    +84653
    +84659
    +84673
    +84691
    +84697
    +84701
    +84713
    +84719
    +84731
    +84737
    +84751
    +84761
    +84787
    +84793
    +84809
    +84811
    +84827
    +84857
    +84859
    +84869
    +84871
    +84913
    +84919
    +84947
    +84961
    +84967
    +84977
    +84979
    +84991
    +85009
    +85021
    +85027
    +85037
    +85049
    +85061
    +85081
    +85087
    +85091
    +85093
    +85103
    +85109
    +85121
    +85133
    +85147
    +85159
    +85193
    +85199
    +85201
    +85213
    +85223
    +85229
    +85237
    +85243
    +85247
    +85259
    +85297
    +85303
    +85313
    +85331
    +85333
    +85361
    +85363
    +85369
    +85381
    +85411
    +85427
    +85429
    +85439
    +85447
    +85451
    +85453
    +85469
    +85487
    +85513
    +85517
    +85523
    +85531
    +85549
    +85571
    +85577
    +85597
    +85601
    +85607
    +85619
    +85621
    +85627
    +85639
    +85643
    +85661
    +85667
    +85669
    +85691
    +85703
    +85711
    +85717
    +85733
    +85751
    +85781
    +85793
    +85817
    +85819
    +85829
    +85831
    +85837
    +85843
    +85847
    +85853
    +85889
    +85903
    +85909
    +85931
    +85933
    +85991
    +85999
    +86011
    +86017
    +86027
    +86029
    +86069
    +86077
    +86083
    +86111
    +86113
    +86117
    +86131
    +86137
    +86143
    +86161
    +86171
    +86179
    +86183
    +86197
    +86201
    +86209
    +86239
    +86243
    +86249
    +86257
    +86263
    +86269
    +86287
    +86291
    +86293
    +86297
    +86311
    +86323
    +86341
    +86351
    +86353
    +86357
    +86369
    +86371
    +86381
    +86389
    +86399
    +86413
    +86423
    +86441
    +86453
    +86461
    +86467
    +86477
    +86491
    +86501
    +86509
    +86531
    +86533
    +86539
    +86561
    +86573
    +86579
    +86587
    +86599
    +86627
    +86629
    +86677
    +86689
    +86693
    +86711
    +86719
    +86729
    +86743
    +86753
    +86767
    +86771
    +86783
    +86813
    +86837
    +86843
    +86851
    +86857
    +86861
    +86869
    +86923
    +86927
    +86929
    +86939
    +86951
    +86959
    +86969
    +86981
    +86993
    +87011
    +87013
    +87037
    +87041
    +87049
    +87071
    +87083
    +87103
    +87107
    +87119
    +87121
    +87133
    +87149
    +87151
    +87179
    +87181
    +87187
    +87211
    +87221
    +87223
    +87251
    +87253
    +87257
    +87277
    +87281
    +87293
    +87299
    +87313
    +87317
    +87323
    +87337
    +87359
    +87383
    +87403
    +87407
    +87421
    +87427
    +87433
    +87443
    +87473
    +87481
    +87491
    +87509
    +87511
    +87517
    +87523
    +87539
    +87541
    +87547
    +87553
    +87557
    +87559
    +87583
    +87587
    +87589
    +87613
    +87623
    +87629
    +87631
    +87641
    +87643
    +87649
    +87671
    +87679
    +87683
    +87691
    +87697
    +87701
    +87719
    +87721
    +87739
    +87743
    +87751
    +87767
    +87793
    +87797
    +87803
    +87811
    +87833
    +87853
    +87869
    +87877
    +87881
    +87887
    +87911
    +87917
    +87931
    +87943
    +87959
    +87961
    +87973
    +87977
    +87991
    +88001
    +88003
    +88007
    +88019
    +88037
    +88069
    +88079
    +88093
    +88117
    +88129
    +88169
    +88177
    +88211
    +88223
    +88237
    +88241
    +88259
    +88261
    +88289
    +88301
    +88321
    +88327
    +88337
    +88339
    +88379
    +88397
    +88411
    +88423
    +88427
    +88463
    +88469
    +88471
    +88493
    +88499
    +88513
    +88523
    +88547
    +88589
    +88591
    +88607
    +88609
    +88643
    +88651
    +88657
    +88661
    +88663
    +88667
    +88681
    +88721
    +88729
    +88741
    +88747
    +88771
    +88789
    +88793
    +88799
    +88801
    +88807
    +88811
    +88813
    +88817
    +88819
    +88843
    +88853
    +88861
    +88867
    +88873
    +88883
    +88897
    +88903
    +88919
    +88937
    +88951
    +88969
    +88993
    +88997
    +89003
    +89009
    +89017
    +89021
    +89041
    +89051
    +89057
    +89069
    +89071
    +89083
    +89087
    +89101
    +89107
    +89113
    +89119
    +89123
    +89137
    +89153
    +89189
    +89203
    +89209
    +89213
    +89227
    +89231
    +89237
    +89261
    +89269
    +89273
    +89293
    +89303
    +89317
    +89329
    +89363
    +89371
    +89381
    +89387
    +89393
    +89399
    +89413
    +89417
    +89431
    +89443
    +89449
    +89459
    +89477
    +89491
    +89501
    +89513
    +89519
    +89521
    +89527
    +89533
    +89561
    +89563
    +89567
    +89591
    +89597
    +89599
    +89603
    +89611
    +89627
    +89633
    +89653
    +89657
    +89659
    +89669
    +89671
    +89681
    +89689
    +89753
    +89759
    +89767
    +89779
    +89783
    +89797
    +89809
    +89819
    +89821
    +89833
    +89839
    +89849
    +89867
    +89891
    +89897
    +89899
    +89909
    +89917
    +89923
    +89939
    +89959
    +89963
    +89977
    +89983
    +89989
    +90001
    +90007
    +90011
    +90017
    +90019
    +90023
    +90031
    +90053
    +90059
    +90067
    +90071
    +90073
    +90089
    +90107
    +90121
    +90127
    +90149
    +90163
    +90173
    +90187
    +90191
    +90197
    +90199
    +90203
    +90217
    +90227
    +90239
    +90247
    +90263
    +90271
    +90281
    +90289
    +90313
    +90353
    +90359
    +90371
    +90373
    +90379
    +90397
    +90401
    +90403
    +90407
    +90437
    +90439
    +90469
    +90473
    +90481
    +90499
    +90511
    +90523
    +90527
    +90529
    +90533
    +90547
    +90583
    +90599
    +90617
    +90619
    +90631
    +90641
    +90647
    +90659
    +90677
    +90679
    +90697
    +90703
    +90709
    +90731
    +90749
    +90787
    +90793
    +90803
    +90821
    +90823
    +90833
    +90841
    +90847
    +90863
    +90887
    +90901
    +90907
    +90911
    +90917
    +90931
    +90947
    +90971
    +90977
    +90989
    +90997
    +91009
    +91019
    +91033
    +91079
    +91081
    +91097
    +91099
    +91121
    +91127
    +91129
    +91139
    +91141
    +91151
    +91153
    +91159
    +91163
    +91183
    +91193
    +91199
    +91229
    +91237
    +91243
    +91249
    +91253
    +91283
    +91291
    +91297
    +91303
    +91309
    +91331
    +91367
    +91369
    +91373
    +91381
    +91387
    +91393
    +91397
    +91411
    +91423
    +91433
    +91453
    +91457
    +91459
    +91463
    +91493
    +91499
    +91513
    +91529
    +91541
    +91571
    +91573
    +91577
    +91583
    +91591
    +91621
    +91631
    +91639
    +91673
    +91691
    +91703
    +91711
    +91733
    +91753
    +91757
    +91771
    +91781
    +91801
    +91807
    +91811
    +91813
    +91823
    +91837
    +91841
    +91867
    +91873
    +91909
    +91921
    +91939
    +91943
    +91951
    +91957
    +91961
    +91967
    +91969
    +91997
    +92003
    +92009
    +92033
    +92041
    +92051
    +92077
    +92083
    +92107
    +92111
    +92119
    +92143
    +92153
    +92173
    +92177
    +92179
    +92189
    +92203
    +92219
    +92221
    +92227
    +92233
    +92237
    +92243
    +92251
    +92269
    +92297
    +92311
    +92317
    +92333
    +92347
    +92353
    +92357
    +92363
    +92369
    +92377
    +92381
    +92383
    +92387
    +92399
    +92401
    +92413
    +92419
    +92431
    +92459
    +92461
    +92467
    +92479
    +92489
    +92503
    +92507
    +92551
    +92557
    +92567
    +92569
    +92581
    +92593
    +92623
    +92627
    +92639
    +92641
    +92647
    +92657
    +92669
    +92671
    +92681
    +92683
    +92693
    +92699
    +92707
    +92717
    +92723
    +92737
    +92753
    +92761
    +92767
    +92779
    +92789
    +92791
    +92801
    +92809
    +92821
    +92831
    +92849
    +92857
    +92861
    +92863
    +92867
    +92893
    +92899
    +92921
    +92927
    +92941
    +92951
    +92957
    +92959
    +92987
    +92993
    +93001
    +93047
    +93053
    +93059
    +93077
    +93083
    +93089
    +93097
    +93103
    +93113
    +93131
    +93133
    +93139
    +93151
    +93169
    +93179
    +93187
    +93199
    +93229
    +93239
    +93241
    +93251
    +93253
    +93257
    +93263
    +93281
    +93283
    +93287
    +93307
    +93319
    +93323
    +93329
    +93337
    +93371
    +93377
    +93383
    +93407
    +93419
    +93427
    +93463
    +93479
    +93481
    +93487
    +93491
    +93493
    +93497
    +93503
    +93523
    +93529
    +93553
    +93557
    +93559
    +93563
    +93581
    +93601
    +93607
    +93629
    +93637
    +93683
    +93701
    +93703
    +93719
    +93739
    +93761
    +93763
    +93787
    +93809
    +93811
    +93827
    +93851
    +93871
    +93887
    +93889
    +93893
    +93901
    +93911
    +93913
    +93923
    +93937
    +93941
    +93949
    +93967
    +93971
    +93979
    +93983
    +93997
    +94007
    +94009
    +94033
    +94049
    +94057
    +94063
    +94079
    +94099
    +94109
    +94111
    +94117
    +94121
    +94151
    +94153
    +94169
    +94201
    +94207
    +94219
    +94229
    +94253
    +94261
    +94273
    +94291
    +94307
    +94309
    +94321
    +94327
    +94331
    +94343
    +94349
    +94351
    +94379
    +94397
    +94399
    +94421
    +94427
    +94433
    +94439
    +94441
    +94447
    +94463
    +94477
    +94483
    +94513
    +94529
    +94531
    +94541
    +94543
    +94547
    +94559
    +94561
    +94573
    +94583
    +94597
    +94603
    +94613
    +94621
    +94649
    +94651
    +94687
    +94693
    +94709
    +94723
    +94727
    +94747
    +94771
    +94777
    +94781
    +94789
    +94793
    +94811
    +94819
    +94823
    +94837
    +94841
    +94847
    +94849
    +94873
    +94889
    +94903
    +94907
    +94933
    +94949
    +94951
    +94961
    +94993
    +94999
    +95003
    +95009
    +95021
    +95027
    +95063
    +95071
    +95083
    +95087
    +95089
    +95093
    +95101
    +95107
    +95111
    +95131
    +95143
    +95153
    +95177
    +95189
    +95191
    +95203
    +95213
    +95219
    +95231
    +95233
    +95239
    +95257
    +95261
    +95267
    +95273
    +95279
    +95287
    +95311
    +95317
    +95327
    +95339
    +95369
    +95383
    +95393
    +95401
    +95413
    +95419
    +95429
    +95441
    +95443
    +95461
    +95467
    +95471
    +95479
    +95483
    +95507
    +95527
    +95531
    +95539
    +95549
    +95561
    +95569
    +95581
    +95597
    +95603
    +95617
    +95621
    +95629
    +95633
    +95651
    +95701
    +95707
    +95713
    +95717
    +95723
    +95731
    +95737
    +95747
    +95773
    +95783
    +95789
    +95791
    +95801
    +95803
    +95813
    +95819
    +95857
    +95869
    +95873
    +95881
    +95891
    +95911
    +95917
    +95923
    +95929
    +95947
    +95957
    +95959
    +95971
    +95987
    +95989
    +96001
    +96013
    +96017
    +96043
    +96053
    +96059
    +96079
    +96097
    +96137
    +96149
    +96157
    +96167
    +96179
    +96181
    +96199
    +96211
    +96221
    +96223
    +96233
    +96259
    +96263
    +96269
    +96281
    +96289
    +96293
    +96323
    +96329
    +96331
    +96337
    +96353
    +96377
    +96401
    +96419
    +96431
    +96443
    +96451
    +96457
    +96461
    +96469
    +96479
    +96487
    +96493
    +96497
    +96517
    +96527
    +96553
    +96557
    +96581
    +96587
    +96589
    +96601
    +96643
    +96661
    +96667
    +96671
    +96697
    +96703
    +96731
    +96737
    +96739
    +96749
    +96757
    +96763
    +96769
    +96779
    +96787
    +96797
    +96799
    +96821
    +96823
    +96827
    +96847
    +96851
    +96857
    +96893
    +96907
    +96911
    +96931
    +96953
    +96959
    +96973
    +96979
    +96989
    +96997
    +97001
    +97003
    +97007
    +97021
    +97039
    +97073
    +97081
    +97103
    +97117
    +97127
    +97151
    +97157
    +97159
    +97169
    +97171
    +97177
    +97187
    +97213
    +97231
    +97241
    +97259
    +97283
    +97301
    +97303
    +97327
    +97367
    +97369
    +97373
    +97379
    +97381
    +97387
    +97397
    +97423
    +97429
    +97441
    +97453
    +97459
    +97463
    +97499
    +97501
    +97511
    +97523
    +97547
    +97549
    +97553
    +97561
    +97571
    +97577
    +97579
    +97583
    +97607
    +97609
    +97613
    +97649
    +97651
    +97673
    +97687
    +97711
    +97729
    +97771
    +97777
    +97787
    +97789
    +97813
    +97829
    +97841
    +97843
    +97847
    +97849
    +97859
    +97861
    +97871
    +97879
    +97883
    +97919
    +97927
    +97931
    +97943
    +97961
    +97967
    +97973
    +97987
    +98009
    +98011
    +98017
    +98041
    +98047
    +98057
    +98081
    +98101
    +98123
    +98129
    +98143
    +98179
    +98207
    +98213
    +98221
    +98227
    +98251
    +98257
    +98269
    +98297
    +98299
    +98317
    +98321
    +98323
    +98327
    +98347
    +98369
    +98377
    +98387
    +98389
    +98407
    +98411
    +98419
    +98429
    +98443
    +98453
    +98459
    +98467
    +98473
    +98479
    +98491
    +98507
    +98519
    +98533
    +98543
    +98561
    +98563
    +98573
    +98597
    +98621
    +98627
    +98639
    +98641
    +98663
    +98669
    +98689
    +98711
    +98713
    +98717
    +98729
    +98731
    +98737
    +98773
    +98779
    +98801
    +98807
    +98809
    +98837
    +98849
    +98867
    +98869
    +98873
    +98887
    +98893
    +98897
    +98899
    +98909
    +98911
    +98927
    +98929
    +98939
    +98947
    +98953
    +98963
    +98981
    +98993
    +98999
    +99013
    +99017
    +99023
    +99041
    +99053
    +99079
    +99083
    +99089
    +99103
    +99109
    +99119
    +99131
    +99133
    +99137
    +99139
    +99149
    +99173
    +99181
    +99191
    +99223
    +99233
    +99241
    +99251
    +99257
    +99259
    +99277
    +99289
    +99317
    +99347
    +99349
    +99367
    +99371
    +99377
    +99391
    +99397
    +99401
    +99409
    +99431
    +99439
    +99469
    +99487
    +99497
    +99523
    +99527
    +99529
    +99551
    +99559
    +99563
    +99571
    +99577
    +99581
    +99607
    +99611
    +99623
    +99643
    +99661
    +99667
    +99679
    +99689
    +99707
    +99709
    +99713
    +99719
    +99721
    +99733
    +99761
    +99767
    +99787
    +99793
    +99809
    +99817
    +99823
    +99829
    +99833
    +99839
    +99859
    +99871
    +99877
    +99881
    +99901
    +99907
    +99923
    +99929
    +99961
    +99971
    +99989
    +99991
    +100003
    +100019
    +100043
    +100049
    +100057
    +100069
    +100103
    +100109
    +100129
    +100151
    +100153
    +100169
    +100183
    +100189
    +100193
    +100207
    +100213
    +100237
    +100267
    +100271
    +100279
    +100291
    +100297
    +100313
    +100333
    +100343
    +100357
    +100361
    +100363
    +100379
    +100391
    +100393
    +100403
    +100411
    +100417
    +100447
    +100459
    +100469
    +100483
    +100493
    +100501
    +100511
    +100517
    +100519
    +100523
    +100537
    +100547
    +100549
    +100559
    +100591
    +100609
    +100613
    +100621
    +100649
    +100669
    +100673
    +100693
    +100699
    +100703
    +100733
    +100741
    +100747
    +100769
    +100787
    +100799
    +100801
    +100811
    +100823
    +100829
    +100847
    +100853
    +100907
    +100913
    +100927
    +100931
    +100937
    +100943
    +100957
    +100981
    +100987
    +100999
    +101009
    +101021
    +101027
    +101051
    +101063
    +101081
    +101089
    +101107
    +101111
    +101113
    +101117
    +101119
    +101141
    +101149
    +101159
    +101161
    +101173
    +101183
    +101197
    +101203
    +101207
    +101209
    +101221
    +101267
    +101273
    +101279
    +101281
    +101287
    +101293
    +101323
    +101333
    +101341
    +101347
    +101359
    +101363
    +101377
    +101383
    +101399
    +101411
    +101419
    +101429
    +101449
    +101467
    +101477
    +101483
    +101489
    +101501
    +101503
    +101513
    +101527
    +101531
    +101533
    +101537
    +101561
    +101573
    +101581
    +101599
    +101603
    +101611
    +101627
    +101641
    +101653
    +101663
    +101681
    +101693
    +101701
    +101719
    +101723
    +101737
    +101741
    +101747
    +101749
    +101771
    +101789
    +101797
    +101807
    +101833
    +101837
    +101839
    +101863
    +101869
    +101873
    +101879
    +101891
    +101917
    +101921
    +101929
    +101939
    +101957
    +101963
    +101977
    +101987
    +101999
    +102001
    +102013
    +102019
    +102023
    +102031
    +102043
    +102059
    +102061
    +102071
    +102077
    +102079
    +102101
    +102103
    +102107
    +102121
    +102139
    +102149
    +102161
    +102181
    +102191
    +102197
    +102199
    +102203
    +102217
    +102229
    +102233
    +102241
    +102251
    +102253
    +102259
    +102293
    +102299
    +102301
    +102317
    +102329
    +102337
    +102359
    +102367
    +102397
    +102407
    +102409
    +102433
    +102437
    +102451
    +102461
    +102481
    +102497
    +102499
    +102503
    +102523
    +102533
    +102539
    +102547
    +102551
    +102559
    +102563
    +102587
    +102593
    +102607
    +102611
    +102643
    +102647
    +102653
    +102667
    +102673
    +102677
    +102679
    +102701
    +102761
    +102763
    +102769
    +102793
    +102797
    +102811
    +102829
    +102841
    +102859
    +102871
    +102877
    +102881
    +102911
    +102913
    +102929
    +102931
    +102953
    +102967
    +102983
    +103001
    +103007
    +103043
    +103049
    +103067
    +103069
    +103079
    +103087
    +103091
    +103093
    +103099
    +103123
    +103141
    +103171
    +103177
    +103183
    +103217
    +103231
    +103237
    +103289
    +103291
    +103307
    +103319
    +103333
    +103349
    +103357
    +103387
    +103391
    +103393
    +103399
    +103409
    +103421
    +103423
    +103451
    +103457
    +103471
    +103483
    +103511
    +103529
    +103549
    +103553
    +103561
    +103567
    +103573
    +103577
    +103583
    +103591
    +103613
    +103619
    +103643
    +103651
    +103657
    +103669
    +103681
    +103687
    +103699
    +103703
    +103723
    +103769
    +103787
    +103801
    +103811
    +103813
    +103837
    +103841
    +103843
    +103867
    +103889
    +103903
    +103913
    +103919
    +103951
    +103963
    +103967
    +103969
    +103979
    +103981
    +103991
    +103993
    +103997
    +104003
    +104009
    +104021
    +104033
    +104047
    +104053
    +104059
    +104087
    +104089
    +104107
    +104113
    +104119
    +104123
    +104147
    +104149
    +104161
    +104173
    +104179
    +104183
    +104207
    +104231
    +104233
    +104239
    +104243
    +104281
    +104287
    +104297
    +104309
    +104311
    +104323
    +104327
    +104347
    +104369
    +104381
    +104383
    +104393
    +104399
    +104417
    +104459
    +104471
    +104473
    +104479
    +104491
    +104513
    +104527
    +104537
    +104543
    +104549
    +104551
    +104561
    +104579
    +104593
    +104597
    +104623
    +104639
    +104651
    +104659
    +104677
    +104681
    +104683
    +104693
    +104701
    +104707
    +104711
    +104717
    +104723
    +104729
    +104743
    +104759
    +104761
    +104773
    +104779
    +104789
    +104801
    +104803
    +104827
    +104831
    +104849
    +104851
    +104869
    +104879
    +104891
    +104911
    +104917
    +104933
    +104947
    +104953
    +104959
    +104971
    +104987
    +104999
    +105019
    +105023
    +105031
    +105037
    +105071
    +105097
    +105107
    +105137
    +105143
    +105167
    +105173
    +105199
    +105211
    +105227
    +105229
    +105239
    +105251
    +105253
    +105263
    +105269
    +105277
    +105319
    +105323
    +105331
    +105337
    +105341
    +105359
    +105361
    +105367
    +105373
    +105379
    +105389
    +105397
    +105401
    +105407
    +105437
    +105449
    +105467
    +105491
    +105499
    +105503
    +105509
    +105517
    +105527
    +105529
    +105533
    +105541
    +105557
    +105563
    +105601
    +105607
    +105613
    +105619
    +105649
    +105653
    +105667
    +105673
    +105683
    +105691
    +105701
    +105727
    +105733
    +105751
    +105761
    +105767
    +105769
    +105817
    +105829
    +105863
    +105871
    +105883
    +105899
    +105907
    +105913
    +105929
    +105943
    +105953
    +105967
    +105971
    +105977
    +105983
    +105997
    +106013
    +106019
    +106031
    +106033
    +106087
    +106103
    +106109
    +106121
    +106123
    +106129
    +106163
    +106181
    +106187
    +106189
    +106207
    +106213
    +106217
    +106219
    +106243
    +106261
    +106273
    +106277
    +106279
    +106291
    +106297
    +106303
    +106307
    +106319
    +106321
    +106331
    +106349
    +106357
    +106363
    +106367
    +106373
    +106391
    +106397
    +106411
    +106417
    +106427
    +106433
    +106441
    +106451
    +106453
    +106487
    +106501
    +106531
    +106537
    +106541
    +106543
    +106591
    +106619
    +106621
    +106627
    +106637
    +106649
    +106657
    +106661
    +106663
    +106669
    +106681
    +106693
    +106699
    +106703
    +106721
    +106727
    +106739
    +106747
    +106751
    +106753
    +106759
    +106781
    +106783
    +106787
    +106801
    +106823
    +106853
    +106859
    +106861
    +106867
    +106871
    +106877
    +106903
    +106907
    +106921
    +106937
    +106949
    +106957
    +106961
    +106963
    +106979
    +106993
    +107021
    +107033
    +107053
    +107057
    +107069
    +107071
    +107077
    +107089
    +107099
    +107101
    +107119
    +107123
    +107137
    +107171
    +107183
    +107197
    +107201
    +107209
    +107227
    +107243
    +107251
    +107269
    +107273
    +107279
    +107309
    +107323
    +107339
    +107347
    +107351
    +107357
    +107377
    +107441
    +107449
    +107453
    +107467
    +107473
    +107507
    +107509
    +107563
    +107581
    +107599
    +107603
    +107609
    +107621
    +107641
    +107647
    +107671
    +107687
    +107693
    +107699
    +107713
    +107717
    +107719
    +107741
    +107747
    +107761
    +107773
    +107777
    +107791
    +107827
    +107837
    +107839
    +107843
    +107857
    +107867
    +107873
    +107881
    +107897
    +107903
    +107923
    +107927
    +107941
    +107951
    +107971
    +107981
    +107999
    +108007
    +108011
    +108013
    +108023
    +108037
    +108041
    +108061
    +108079
    +108089
    +108107
    +108109
    +108127
    +108131
    +108139
    +108161
    +108179
    +108187
    +108191
    +108193
    +108203
    +108211
    +108217
    +108223
    +108233
    +108247
    +108263
    +108271
    +108287
    +108289
    +108293
    +108301
    +108343
    +108347
    +108359
    +108377
    +108379
    +108401
    +108413
    +108421
    +108439
    +108457
    +108461
    +108463
    +108497
    +108499
    +108503
    +108517
    +108529
    +108533
    +108541
    +108553
    +108557
    +108571
    +108587
    +108631
    +108637
    +108643
    +108649
    +108677
    +108707
    +108709
    +108727
    +108739
    +108751
    +108761
    +108769
    +108791
    +108793
    +108799
    +108803
    +108821
    +108827
    +108863
    +108869
    +108877
    +108881
    +108883
    +108887
    +108893
    +108907
    +108917
    +108923
    +108929
    +108943
    +108947
    +108949
    +108959
    +108961
    +108967
    +108971
    +108991
    +109001
    +109013
    +109037
    +109049
    +109063
    +109073
    +109097
    +109103
    +109111
    +109121
    +109133
    +109139
    +109141
    +109147
    +109159
    +109169
    +109171
    +109199
    +109201
    +109211
    +109229
    +109253
    +109267
    +109279
    +109297
    +109303
    +109313
    +109321
    +109331
    +109357
    +109363
    +109367
    +109379
    +109387
    +109391
    +109397
    +109423
    +109433
    +109441
    +109451
    +109453
    +109469
    +109471
    +109481
    +109507
    +109517
    +109519
    +109537
    +109541
    +109547
    +109567
    +109579
    +109583
    +109589
    +109597
    +109609
    +109619
    +109621
    +109639
    +109661
    +109663
    +109673
    +109717
    +109721
    +109741
    +109751
    +109789
    +109793
    +109807
    +109819
    +109829
    +109831
    +109841
    +109843
    +109847
    +109849
    +109859
    +109873
    +109883
    +109891
    +109897
    +109903
    +109913
    +109919
    +109937
    +109943
    +109961
    +109987
    +110017
    +110023
    +110039
    +110051
    +110059
    +110063
    +110069
    +110083
    +110119
    +110129
    +110161
    +110183
    +110221
    +110233
    +110237
    +110251
    +110261
    +110269
    +110273
    +110281
    +110291
    +110311
    +110321
    +110323
    +110339
    +110359
    +110419
    +110431
    +110437
    +110441
    +110459
    +110477
    +110479
    +110491
    +110501
    +110503
    +110527
    +110533
    +110543
    +110557
    +110563
    +110567
    +110569
    +110573
    +110581
    +110587
    +110597
    +110603
    +110609
    +110623
    +110629
    +110641
    +110647
    +110651
    +110681
    +110711
    +110729
    +110731
    +110749
    +110753
    +110771
    +110777
    +110807
    +110813
    +110819
    +110821
    +110849
    +110863
    +110879
    +110881
    +110899
    +110909
    +110917
    +110921
    +110923
    +110927
    +110933
    +110939
    +110947
    +110951
    +110969
    +110977
    +110989
    +111029
    +111031
    +111043
    +111049
    +111053
    +111091
    +111103
    +111109
    +111119
    +111121
    +111127
    +111143
    +111149
    +111187
    +111191
    +111211
    +111217
    +111227
    +111229
    +111253
    +111263
    +111269
    +111271
    +111301
    +111317
    +111323
    +111337
    +111341
    +111347
    +111373
    +111409
    +111427
    +111431
    +111439
    +111443
    +111467
    +111487
    +111491
    +111493
    +111497
    +111509
    +111521
    +111533
    +111539
    +111577
    +111581
    +111593
    +111599
    +111611
    +111623
    +111637
    +111641
    +111653
    +111659
    +111667
    +111697
    +111721
    +111731
    +111733
    +111751
    +111767
    +111773
    +111779
    +111781
    +111791
    +111799
    +111821
    +111827
    +111829
    +111833
    +111847
    +111857
    +111863
    +111869
    +111871
    +111893
    +111913
    +111919
    +111949
    +111953
    +111959
    +111973
    +111977
    +111997
    +112019
    +112031
    +112061
    +112067
    +112069
    +112087
    +112097
    +112103
    +112111
    +112121
    +112129
    +112139
    +112153
    +112163
    +112181
    +112199
    +112207
    +112213
    +112223
    +112237
    +112241
    +112247
    +112249
    +112253
    +112261
    +112279
    +112289
    +112291
    +112297
    +112303
    +112327
    +112331
    +112337
    +112339
    +112349
    +112361
    +112363
    +112397
    +112403
    +112429
    +112459
    +112481
    +112501
    +112507
    +112543
    +112559
    +112571
    +112573
    +112577
    +112583
    +112589
    +112601
    +112603
    +112621
    +112643
    +112657
    +112663
    +112687
    +112691
    +112741
    +112757
    +112759
    +112771
    +112787
    +112799
    +112807
    +112831
    +112843
    +112859
    +112877
    +112901
    +112909
    +112913
    +112919
    +112921
    +112927
    +112939
    +112951
    +112967
    +112979
    +112997
    +113011
    +113017
    +113021
    +113023
    +113027
    +113039
    +113041
    +113051
    +113063
    +113081
    +113083
    +113089
    +113093
    +113111
    +113117
    +113123
    +113131
    +113143
    +113147
    +113149
    +113153
    +113159
    +113161
    +113167
    +113171
    +113173
    +113177
    +113189
    +113209
    +113213
    +113227
    +113233
    +113279
    +113287
    +113327
    +113329
    +113341
    +113357
    +113359
    +113363
    +113371
    +113381
    +113383
    +113417
    +113437
    +113453
    +113467
    +113489
    +113497
    +113501
    +113513
    +113537
    +113539
    +113557
    +113567
    +113591
    +113621
    +113623
    +113647
    +113657
    +113683
    +113717
    +113719
    +113723
    +113731
    +113749
    +113759
    +113761
    +113777
    +113779
    +113783
    +113797
    +113809
    +113819
    +113837
    +113843
    +113891
    +113899
    +113903
    +113909
    +113921
    +113933
    +113947
    +113957
    +113963
    +113969
    +113983
    +113989
    +114001
    +114013
    +114031
    +114041
    +114043
    +114067
    +114073
    +114077
    +114083
    +114089
    +114113
    +114143
    +114157
    +114161
    +114167
    +114193
    +114197
    +114199
    +114203
    +114217
    +114221
    +114229
    +114259
    +114269
    +114277
    +114281
    +114299
    +114311
    +114319
    +114329
    +114343
    +114371
    +114377
    +114407
    +114419
    +114451
    +114467
    +114473
    +114479
    +114487
    +114493
    +114547
    +114553
    +114571
    +114577
    +114593
    +114599
    +114601
    +114613
    +114617
    +114641
    +114643
    +114649
    +114659
    +114661
    +114671
    +114679
    +114689
    +114691
    +114713
    +114743
    +114749
    +114757
    +114761
    +114769
    +114773
    +114781
    +114797
    +114799
    +114809
    +114827
    +114833
    +114847
    +114859
    +114883
    +114889
    +114901
    +114913
    +114941
    +114967
    +114973
    +114997
    +115001
    +115013
    +115019
    +115021
    +115057
    +115061
    +115067
    +115079
    +115099
    +115117
    +115123
    +115127
    +115133
    +115151
    +115153
    +115163
    +115183
    +115201
    +115211
    +115223
    +115237
    +115249
    +115259
    +115279
    +115301
    +115303
    +115309
    +115319
    +115321
    +115327
    +115331
    +115337
    +115343
    +115361
    +115363
    +115399
    +115421
    +115429
    +115459
    +115469
    +115471
    +115499
    +115513
    +115523
    +115547
    +115553
    +115561
    +115571
    +115589
    +115597
    +115601
    +115603
    +115613
    +115631
    +115637
    +115657
    +115663
    +115679
    +115693
    +115727
    +115733
    +115741
    +115751
    +115757
    +115763
    +115769
    +115771
    +115777
    +115781
    +115783
    +115793
    +115807
    +115811
    +115823
    +115831
    +115837
    +115849
    +115853
    +115859
    +115861
    +115873
    +115877
    +115879
    +115883
    +115891
    +115901
    +115903
    +115931
    +115933
    +115963
    +115979
    +115981
    +115987
    +116009
    +116027
    +116041
    +116047
    +116089
    +116099
    +116101
    +116107
    +116113
    +116131
    +116141
    +116159
    +116167
    +116177
    +116189
    +116191
    +116201
    +116239
    +116243
    +116257
    +116269
    +116273
    +116279
    +116293
    +116329
    +116341
    +116351
    +116359
    +116371
    +116381
    +116387
    +116411
    +116423
    +116437
    +116443
    +116447
    +116461
    +116471
    +116483
    +116491
    +116507
    +116531
    +116533
    +116537
    +116539
    +116549
    +116579
    +116593
    +116639
    +116657
    +116663
    +116681
    +116687
    +116689
    +116707
    +116719
    +116731
    +116741
    +116747
    +116789
    +116791
    +116797
    +116803
    +116819
    +116827
    +116833
    +116849
    +116867
    +116881
    +116903
    +116911
    +116923
    +116927
    +116929
    +116933
    +116953
    +116959
    +116969
    +116981
    +116989
    +116993
    +117017
    +117023
    +117037
    +117041
    +117043
    +117053
    +117071
    +117101
    +117109
    +117119
    +117127
    +117133
    +117163
    +117167
    +117191
    +117193
    +117203
    +117209
    +117223
    +117239
    +117241
    +117251
    +117259
    +117269
    +117281
    +117307
    +117319
    +117329
    +117331
    +117353
    +117361
    +117371
    +117373
    +117389
    +117413
    +117427
    +117431
    +117437
    +117443
    +117497
    +117499
    +117503
    +117511
    +117517
    +117529
    +117539
    +117541
    +117563
    +117571
    +117577
    +117617
    +117619
    +117643
    +117659
    +117671
    +117673
    +117679
    +117701
    +117703
    +117709
    +117721
    +117727
    +117731
    +117751
    +117757
    +117763
    +117773
    +117779
    +117787
    +117797
    +117809
    +117811
    +117833
    +117839
    +117841
    +117851
    +117877
    +117881
    +117883
    +117889
    +117899
    +117911
    +117917
    +117937
    +117959
    +117973
    +117977
    +117979
    +117989
    +117991
    +118033
    +118037
    +118043
    +118051
    +118057
    +118061
    +118081
    +118093
    +118127
    +118147
    +118163
    +118169
    +118171
    +118189
    +118211
    +118213
    +118219
    +118247
    +118249
    +118253
    +118259
    +118273
    +118277
    +118297
    +118343
    +118361
    +118369
    +118373
    +118387
    +118399
    +118409
    +118411
    +118423
    +118429
    +118453
    +118457
    +118463
    +118471
    +118493
    +118529
    +118543
    +118549
    +118571
    +118583
    +118589
    +118603
    +118619
    +118621
    +118633
    +118661
    +118669
    +118673
    +118681
    +118687
    +118691
    +118709
    +118717
    +118739
    +118747
    +118751
    +118757
    +118787
    +118799
    +118801
    +118819
    +118831
    +118843
    +118861
    +118873
    +118891
    +118897
    +118901
    +118903
    +118907
    +118913
    +118927
    +118931
    +118967
    +118973
    +119027
    +119033
    +119039
    +119047
    +119057
    +119069
    +119083
    +119087
    +119089
    +119099
    +119101
    +119107
    +119129
    +119131
    +119159
    +119173
    +119179
    +119183
    +119191
    +119227
    +119233
    +119237
    +119243
    +119267
    +119291
    +119293
    +119297
    +119299
    +119311
    +119321
    +119359
    +119363
    +119389
    +119417
    +119419
    +119429
    +119447
    +119489
    +119503
    +119513
    +119533
    +119549
    +119551
    +119557
    +119563
    +119569
    +119591
    +119611
    +119617
    +119627
    +119633
    +119653
    +119657
    +119659
    +119671
    +119677
    +119687
    +119689
    +119699
    +119701
    +119723
    +119737
    +119747
    +119759
    +119771
    +119773
    +119783
    +119797
    +119809
    +119813
    +119827
    +119831
    +119839
    +119849
    +119851
    +119869
    +119881
    +119891
    +119921
    +119923
    +119929
    +119953
    +119963
    +119971
    +119981
    +119983
    +119993
    +120011
    +120017
    +120041
    +120047
    +120049
    +120067
    +120077
    +120079
    +120091
    +120097
    +120103
    +120121
    +120157
    +120163
    +120167
    +120181
    +120193
    +120199
    +120209
    +120223
    +120233
    +120247
    +120277
    +120283
    +120293
    +120299
    +120319
    +120331
    +120349
    +120371
    +120383
    +120391
    +120397
    +120401
    +120413
    +120427
    +120431
    +120473
    +120503
    +120511
    +120539
    +120551
    +120557
    +120563
    +120569
    +120577
    +120587
    +120607
    +120619
    +120623
    +120641
    +120647
    +120661
    +120671
    +120677
    +120689
    +120691
    +120709
    +120713
    +120721
    +120737
    +120739
    +120749
    +120763
    +120767
    +120779
    +120811
    +120817
    +120823
    +120829
    +120833
    +120847
    +120851
    +120863
    +120871
    +120877
    +120889
    +120899
    +120907
    +120917
    +120919
    +120929
    +120937
    +120941
    +120943
    +120947
    +120977
    +120997
    +121001
    +121007
    +121013
    +121019
    +121021
    +121039
    +121061
    +121063
    +121067
    +121081
    +121123
    +121139
    +121151
    +121157
    +121169
    +121171
    +121181
    +121189
    +121229
    +121259
    +121267
    +121271
    +121283
    +121291
    +121309
    +121313
    +121321
    +121327
    +121333
    +121343
    +121349
    +121351
    +121357
    +121367
    +121369
    +121379
    +121403
    +121421
    +121439
    +121441
    +121447
    +121453
    +121469
    +121487
    +121493
    +121501
    +121507
    +121523
    +121531
    +121547
    +121553
    +121559
    +121571
    +121577
    +121579
    +121591
    +121607
    +121609
    +121621
    +121631
    +121633
    +121637
    +121661
    +121687
    +121697
    +121711
    +121721
    +121727
    +121763
    +121787
    +121789
    +121843
    +121853
    +121867
    +121883
    +121889
    +121909
    +121921
    +121931
    +121937
    +121949
    +121951
    +121963
    +121967
    +121993
    +121997
    +122011
    +122021
    +122027
    +122029
    +122033
    +122039
    +122041
    +122051
    +122053
    +122069
    +122081
    +122099
    +122117
    +122131
    +122147
    +122149
    +122167
    +122173
    +122201
    +122203
    +122207
    +122209
    +122219
    +122231
    +122251
    +122263
    +122267
    +122273
    +122279
    +122299
    +122321
    +122323
    +122327
    +122347
    +122363
    +122387
    +122389
    +122393
    +122399
    +122401
    +122443
    +122449
    +122453
    +122471
    +122477
    +122489
    +122497
    +122501
    +122503
    +122509
    +122527
    +122533
    +122557
    +122561
    +122579
    +122597
    +122599
    +122609
    +122611
    +122651
    +122653
    +122663
    +122693
    +122701
    +122719
    +122741
    +122743
    +122753
    +122761
    +122777
    +122789
    +122819
    +122827
    +122833
    +122839
    +122849
    +122861
    +122867
    +122869
    +122887
    +122891
    +122921
    +122929
    +122939
    +122953
    +122957
    +122963
    +122971
    +123001
    +123007
    +123017
    +123031
    +123049
    +123059
    +123077
    +123083
    +123091
    +123113
    +123121
    +123127
    +123143
    +123169
    +123191
    +123203
    +123209
    +123217
    +123229
    +123239
    +123259
    +123269
    +123289
    +123307
    +123311
    +123323
    +123341
    +123373
    +123377
    +123379
    +123397
    +123401
    +123407
    +123419
    +123427
    +123433
    +123439
    +123449
    +123457
    +123479
    +123491
    +123493
    +123499
    +123503
    +123517
    +123527
    +123547
    +123551
    +123553
    +123581
    +123583
    +123593
    +123601
    +123619
    +123631
    +123637
    +123653
    +123661
    +123667
    +123677
    +123701
    +123707
    +123719
    +123727
    +123731
    +123733
    +123737
    +123757
    +123787
    +123791
    +123803
    +123817
    +123821
    +123829
    +123833
    +123853
    +123863
    +123887
    +123911
    +123923
    +123931
    +123941
    +123953
    +123973
    +123979
    +123983
    +123989
    +123997
    +124001
    +124021
    +124067
    +124087
    +124097
    +124121
    +124123
    +124133
    +124139
    +124147
    +124153
    +124171
    +124181
    +124183
    +124193
    +124199
    +124213
    +124231
    +124247
    +124249
    +124277
    +124291
    +124297
    +124301
    +124303
    +124309
    +124337
    +124339
    +124343
    +124349
    +124351
    +124363
    +124367
    +124427
    +124429
    +124433
    +124447
    +124459
    +124471
    +124477
    +124489
    +124493
    +124513
    +124529
    +124541
    +124543
    +124561
    +124567
    +124577
    +124601
    +124633
    +124643
    +124669
    +124673
    +124679
    +124693
    +124699
    +124703
    +124717
    +124721
    +124739
    +124753
    +124759
    +124769
    +124771
    +124777
    +124781
    +124783
    +124793
    +124799
    +124819
    +124823
    +124847
    +124853
    +124897
    +124907
    +124909
    +124919
    +124951
    +124979
    +124981
    +124987
    +124991
    +125003
    +125017
    +125029
    +125053
    +125063
    +125093
    +125101
    +125107
    +125113
    +125117
    +125119
    +125131
    +125141
    +125149
    +125183
    +125197
    +125201
    +125207
    +125219
    +125221
    +125231
    +125243
    +125261
    +125269
    +125287
    +125299
    +125303
    +125311
    +125329
    +125339
    +125353
    +125371
    +125383
    +125387
    +125399
    +125407
    +125423
    +125429
    +125441
    +125453
    +125471
    +125497
    +125507
    +125509
    +125527
    +125539
    +125551
    +125591
    +125597
    +125617
    +125621
    +125627
    +125639
    +125641
    +125651
    +125659
    +125669
    +125683
    +125687
    +125693
    +125707
    +125711
    +125717
    +125731
    +125737
    +125743
    +125753
    +125777
    +125789
    +125791
    +125803
    +125813
    +125821
    +125863
    +125887
    +125897
    +125899
    +125921
    +125927
    +125929
    +125933
    +125941
    +125959
    +125963
    +126001
    +126011
    +126013
    +126019
    +126023
    +126031
    +126037
    +126041
    +126047
    +126067
    +126079
    +126097
    +126107
    +126127
    +126131
    +126143
    +126151
    +126173
    +126199
    +126211
    +126223
    +126227
    +126229
    +126233
    +126241
    +126257
    +126271
    +126307
    +126311
    +126317
    +126323
    +126337
    +126341
    +126349
    +126359
    +126397
    +126421
    +126433
    +126443
    +126457
    +126461
    +126473
    +126481
    +126487
    +126491
    +126493
    +126499
    +126517
    +126541
    +126547
    +126551
    +126583
    +126601
    +126611
    +126613
    +126631
    +126641
    +126653
    +126683
    +126691
    +126703
    +126713
    +126719
    +126733
    +126739
    +126743
    +126751
    +126757
    +126761
    +126781
    +126823
    +126827
    +126839
    +126851
    +126857
    +126859
    +126913
    +126923
    +126943
    +126949
    +126961
    +126967
    +126989
    +127031
    +127033
    +127037
    +127051
    +127079
    +127081
    +127103
    +127123
    +127133
    +127139
    +127157
    +127163
    +127189
    +127207
    +127217
    +127219
    +127241
    +127247
    +127249
    +127261
    +127271
    +127277
    +127289
    +127291
    +127297
    +127301
    +127321
    +127331
    +127343
    +127363
    +127373
    +127399
    +127403
    +127423
    +127447
    +127453
    +127481
    +127487
    +127493
    +127507
    +127529
    +127541
    +127549
    +127579
    +127583
    +127591
    +127597
    +127601
    +127607
    +127609
    +127637
    +127643
    +127649
    +127657
    +127663
    +127669
    +127679
    +127681
    +127691
    +127703
    +127709
    +127711
    +127717
    +127727
    +127733
    +127739
    +127747
    +127763
    +127781
    +127807
    +127817
    +127819
    +127837
    +127843
    +127849
    +127859
    +127867
    +127873
    +127877
    +127913
    +127921
    +127931
    +127951
    +127973
    +127979
    +127997
    +128021
    +128033
    +128047
    +128053
    +128099
    +128111
    +128113
    +128119
    +128147
    +128153
    +128159
    +128173
    +128189
    +128201
    +128203
    +128213
    +128221
    +128237
    +128239
    +128257
    +128273
    +128287
    +128291
    +128311
    +128321
    +128327
    +128339
    +128341
    +128347
    +128351
    +128377
    +128389
    +128393
    +128399
    +128411
    +128413
    +128431
    +128437
    +128449
    +128461
    +128467
    +128473
    +128477
    +128483
    +128489
    +128509
    +128519
    +128521
    +128549
    +128551
    +128563
    +128591
    +128599
    +128603
    +128621
    +128629
    +128657
    +128659
    +128663
    +128669
    +128677
    +128683
    +128693
    +128717
    +128747
    +128749
    +128761
    +128767
    +128813
    +128819
    +128831
    +128833
    +128837
    +128857
    +128861
    +128873
    +128879
    +128903
    +128923
    +128939
    +128941
    +128951
    +128959
    +128969
    +128971
    +128981
    +128983
    +128987
    +128993
    +129001
    +129011
    +129023
    +129037
    +129049
    +129061
    +129083
    +129089
    +129097
    +129113
    +129119
    +129121
    +129127
    +129169
    +129187
    +129193
    +129197
    +129209
    +129221
    +129223
    +129229
    +129263
    +129277
    +129281
    +129287
    +129289
    +129293
    +129313
    +129341
    +129347
    +129361
    +129379
    +129401
    +129403
    +129419
    +129439
    +129443
    +129449
    +129457
    +129461
    +129469
    +129491
    +129497
    +129499
    +129509
    +129517
    +129527
    +129529
    +129533
    +129539
    +129553
    +129581
    +129587
    +129589
    +129593
    +129607
    +129629
    +129631
    +129641
    +129643
    +129671
    +129707
    +129719
    +129733
    +129737
    +129749
    +129757
    +129763
    +129769
    +129793
    +129803
    +129841
    +129853
    +129887
    +129893
    +129901
    +129917
    +129919
    +129937
    +129953
    +129959
    +129967
    +129971
    +130003
    +130021
    +130027
    +130043
    +130051
    +130057
    +130069
    +130073
    +130079
    +130087
    +130099
    +130121
    +130127
    +130147
    +130171
    +130183
    +130199
    +130201
    +130211
    +130223
    +130241
    +130253
    +130259
    +130261
    +130267
    +130279
    +130303
    +130307
    +130337
    +130343
    +130349
    +130363
    +130367
    +130369
    +130379
    +130399
    +130409
    +130411
    +130423
    +130439
    +130447
    +130457
    +130469
    +130477
    +130483
    +130489
    +130513
    +130517
    +130523
    +130531
    +130547
    +130553
    +130579
    +130589
    +130619
    +130621
    +130631
    +130633
    +130639
    +130643
    +130649
    +130651
    +130657
    +130681
    +130687
    +130693
    +130699
    +130729
    +130769
    +130783
    +130787
    +130807
    +130811
    +130817
    +130829
    +130841
    +130843
    +130859
    +130873
    +130927
    +130957
    +130969
    +130973
    +130981
    +130987
    +131009
    +131011
    +131023
    +131041
    +131059
    +131063
    +131071
    +131101
    +131111
    +131113
    +131129
    +131143
    +131149
    +131171
    +131203
    +131213
    +131221
    +131231
    +131249
    +131251
    +131267
    +131293
    +131297
    +131303
    +131311
    +131317
    +131321
    +131357
    +131363
    +131371
    +131381
    +131413
    +131431
    +131437
    +131441
    +131447
    +131449
    +131477
    +131479
    +131489
    +131497
    +131501
    +131507
    +131519
    +131543
    +131561
    +131581
    +131591
    +131611
    +131617
    +131627
    +131639
    +131641
    +131671
    +131687
    +131701
    +131707
    +131711
    +131713
    +131731
    +131743
    +131749
    +131759
    +131771
    +131777
    +131779
    +131783
    +131797
    +131837
    +131839
    +131849
    +131861
    +131891
    +131893
    +131899
    +131909
    +131927
    +131933
    +131939
    +131941
    +131947
    +131959
    +131969
    +132001
    +132019
    +132047
    +132049
    +132059
    +132071
    +132103
    +132109
    +132113
    +132137
    +132151
    +132157
    +132169
    +132173
    +132199
    +132229
    +132233
    +132241
    +132247
    +132257
    +132263
    +132283
    +132287
    +132299
    +132313
    +132329
    +132331
    +132347
    +132361
    +132367
    +132371
    +132383
    +132403
    +132409
    +132421
    +132437
    +132439
    +132469
    +132491
    +132499
    +132511
    +132523
    +132527
    +132529
    +132533
    +132541
    +132547
    +132589
    +132607
    +132611
    +132619
    +132623
    +132631
    +132637
    +132647
    +132661
    +132667
    +132679
    +132689
    +132697
    +132701
    +132707
    +132709
    +132721
    +132739
    +132749
    +132751
    +132757
    +132761
    +132763
    +132817
    +132833
    +132851
    +132857
    +132859
    +132863
    +132887
    +132893
    +132911
    +132929
    +132947
    +132949
    +132953
    +132961
    +132967
    +132971
    +132989
    +133013
    +133033
    +133039
    +133051
    +133069
    +133073
    +133087
    +133097
    +133103
    +133109
    +133117
    +133121
    +133153
    +133157
    +133169
    +133183
    +133187
    +133201
    +133213
    +133241
    +133253
    +133261
    +133271
    +133277
    +133279
    +133283
    +133303
    +133319
    +133321
    +133327
    +133337
    +133349
    +133351
    +133379
    +133387
    +133391
    +133403
    +133417
    +133439
    +133447
    +133451
    +133481
    +133493
    +133499
    +133519
    +133541
    +133543
    +133559
    +133571
    +133583
    +133597
    +133631
    +133633
    +133649
    +133657
    +133669
    +133673
    +133691
    +133697
    +133709
    +133711
    +133717
    +133723
    +133733
    +133769
    +133781
    +133801
    +133811
    +133813
    +133831
    +133843
    +133853
    +133873
    +133877
    +133919
    +133949
    +133963
    +133967
    +133979
    +133981
    +133993
    +133999
    +134033
    +134039
    +134047
    +134053
    +134059
    +134077
    +134081
    +134087
    +134089
    +134093
    +134129
    +134153
    +134161
    +134171
    +134177
    +134191
    +134207
    +134213
    +134219
    +134227
    +134243
    +134257
    +134263
    +134269
    +134287
    +134291
    +134293
    +134327
    +134333
    +134339
    +134341
    +134353
    +134359
    +134363
    +134369
    +134371
    +134399
    +134401
    +134417
    +134437
    +134443
    +134471
    +134489
    +134503
    +134507
    +134513
    +134581
    +134587
    +134591
    +134593
    +134597
    +134609
    +134639
    +134669
    +134677
    +134681
    +134683
    +134699
    +134707
    +134731
    +134741
    +134753
    +134777
    +134789
    +134807
    +134837
    +134839
    +134851
    +134857
    +134867
    +134873
    +134887
    +134909
    +134917
    +134921
    +134923
    +134947
    +134951
    +134989
    +134999
    +135007
    +135017
    +135019
    +135029
    +135043
    +135049
    +135059
    +135077
    +135089
    +135101
    +135119
    +135131
    +135151
    +135173
    +135181
    +135193
    +135197
    +135209
    +135211
    +135221
    +135241
    +135257
    +135271
    +135277
    +135281
    +135283
    +135301
    +135319
    +135329
    +135347
    +135349
    +135353
    +135367
    +135389
    +135391
    +135403
    +135409
    +135427
    +135431
    +135433
    +135449
    +135461
    +135463
    +135467
    +135469
    +135479
    +135497
    +135511
    +135533
    +135559
    +135571
    +135581
    +135589
    +135593
    +135599
    +135601
    +135607
    +135613
    +135617
    +135623
    +135637
    +135647
    +135649
    +135661
    +135671
    +135697
    +135701
    +135719
    +135721
    +135727
    +135731
    +135743
    +135757
    +135781
    +135787
    +135799
    +135829
    +135841
    +135851
    +135859
    +135887
    +135893
    +135899
    +135911
    +135913
    +135929
    +135937
    +135977
    +135979
    +136013
    +136027
    +136033
    +136043
    +136057
    +136067
    +136069
    +136093
    +136099
    +136111
    +136133
    +136139
    +136163
    +136177
    +136189
    +136193
    +136207
    +136217
    +136223
    +136237
    +136247
    +136261
    +136273
    +136277
    +136303
    +136309
    +136319
    +136327
    +136333
    +136337
    +136343
    +136351
    +136361
    +136373
    +136379
    +136393
    +136397
    +136399
    +136403
    +136417
    +136421
    +136429
    +136447
    +136453
    +136463
    +136471
    +136481
    +136483
    +136501
    +136511
    +136519
    +136523
    +136531
    +136537
    +136541
    +136547
    +136559
    +136573
    +136601
    +136603
    +136607
    +136621
    +136649
    +136651
    +136657
    +136691
    +136693
    +136709
    +136711
    +136727
    +136733
    +136739
    +136751
    +136753
    +136769
    +136777
    +136811
    +136813
    +136841
    +136849
    +136859
    +136861
    +136879
    +136883
    +136889
    +136897
    +136943
    +136949
    +136951
    +136963
    +136973
    +136979
    +136987
    +136991
    +136993
    +136999
    +137029
    +137077
    +137087
    +137089
    +137117
    +137119
    +137131
    +137143
    +137147
    +137153
    +137177
    +137183
    +137191
    +137197
    +137201
    +137209
    +137219
    +137239
    +137251
    +137273
    +137279
    +137303
    +137321
    +137339
    +137341
    +137353
    +137359
    +137363
    +137369
    +137383
    +137387
    +137393
    +137399
    +137413
    +137437
    +137443
    +137447
    +137453
    +137477
    +137483
    +137491
    +137507
    +137519
    +137537
    +137567
    +137573
    +137587
    +137593
    +137597
    +137623
    +137633
    +137639
    +137653
    +137659
    +137699
    +137707
    +137713
    +137723
    +137737
    +137743
    +137771
    +137777
    +137791
    +137803
    +137827
    +137831
    +137849
    +137867
    +137869
    +137873
    +137909
    +137911
    +137927
    +137933
    +137941
    +137947
    +137957
    +137983
    +137993
    +137999
    +138007
    +138041
    +138053
    +138059
    +138071
    +138077
    +138079
    +138101
    +138107
    +138113
    +138139
    +138143
    +138157
    +138163
    +138179
    +138181
    +138191
    +138197
    +138209
    +138239
    +138241
    +138247
    +138251
    +138283
    +138289
    +138311
    +138319
    +138323
    +138337
    +138349
    +138371
    +138373
    +138389
    +138401
    +138403
    +138407
    +138427
    +138433
    +138449
    +138451
    +138461
    +138469
    +138493
    +138497
    +138511
    +138517
    +138547
    +138559
    +138563
    +138569
    +138571
    +138577
    +138581
    +138587
    +138599
    +138617
    +138629
    +138637
    +138641
    +138647
    +138661
    +138679
    +138683
    +138727
    +138731
    +138739
    +138763
    +138793
    +138797
    +138799
    +138821
    +138829
    +138841
    +138863
    +138869
    +138883
    +138889
    +138893
    +138899
    +138917
    +138923
    +138937
    +138959
    +138967
    +138977
    +139021
    +139033
    +139067
    +139079
    +139091
    +139109
    +139121
    +139123
    +139133
    +139169
    +139177
    +139187
    +139199
    +139201
    +139241
    +139267
    +139273
    +139291
    +139297
    +139301
    +139303
    +139309
    +139313
    +139333
    +139339
    +139343
    +139361
    +139367
    +139369
    +139387
    +139393
    +139397
    +139409
    +139423
    +139429
    +139439
    +139457
    +139459
    +139483
    +139487
    +139493
    +139501
    +139511
    +139537
    +139547
    +139571
    +139589
    +139591
    +139597
    +139609
    +139619
    +139627
    +139661
    +139663
    +139681
    +139697
    +139703
    +139709
    +139721
    +139729
    +139739
    +139747
    +139753
    +139759
    +139787
    +139801
    +139813
    +139831
    +139837
    +139861
    +139871
    +139883
    +139891
    +139901
    +139907
    +139921
    +139939
    +139943
    +139967
    +139969
    +139981
    +139987
    +139991
    +139999
    +140009
    +140053
    +140057
    +140069
    +140071
    +140111
    +140123
    +140143
    +140159
    +140167
    +140171
    +140177
    +140191
    +140197
    +140207
    +140221
    +140227
    +140237
    +140249
    +140263
    +140269
    +140281
    +140297
    +140317
    +140321
    +140333
    +140339
    +140351
    +140363
    +140381
    +140401
    +140407
    +140411
    +140417
    +140419
    +140423
    +140443
    +140449
    +140453
    +140473
    +140477
    +140521
    +140527
    +140533
    +140549
    +140551
    +140557
    +140587
    +140593
    +140603
    +140611
    +140617
    +140627
    +140629
    +140639
    +140659
    +140663
    +140677
    +140681
    +140683
    +140689
    +140717
    +140729
    +140731
    +140741
    +140759
    +140761
    +140773
    +140779
    +140797
    +140813
    +140827
    +140831
    +140837
    +140839
    +140863
    +140867
    +140869
    +140891
    +140893
    +140897
    +140909
    +140929
    +140939
    +140977
    +140983
    +140989
    +141023
    +141041
    +141061
    +141067
    +141073
    +141079
    +141101
    +141107
    +141121
    +141131
    +141157
    +141161
    +141179
    +141181
    +141199
    +141209
    +141221
    +141223
    +141233
    +141241
    +141257
    +141263
    +141269
    +141277
    +141283
    +141301
    +141307
    +141311
    +141319
    +141353
    +141359
    +141371
    +141397
    +141403
    +141413
    +141439
    +141443
    +141461
    +141481
    +141497
    +141499
    +141509
    +141511
    +141529
    +141539
    +141551
    +141587
    +141601
    +141613
    +141619
    +141623
    +141629
    +141637
    +141649
    +141653
    +141667
    +141671
    +141677
    +141679
    +141689
    +141697
    +141707
    +141709
    +141719
    +141731
    +141761
    +141767
    +141769
    +141773
    +141793
    +141803
    +141811
    +141829
    +141833
    +141851
    +141853
    +141863
    +141871
    +141907
    +141917
    +141931
    +141937
    +141941
    +141959
    +141961
    +141971
    +141991
    +142007
    +142019
    +142031
    +142039
    +142049
    +142057
    +142061
    +142067
    +142097
    +142099
    +142111
    +142123
    +142151
    +142157
    +142159
    +142169
    +142183
    +142189
    +142193
    +142211
    +142217
    +142223
    +142231
    +142237
    +142271
    +142297
    +142319
    +142327
    +142357
    +142369
    +142381
    +142391
    +142403
    +142421
    +142427
    +142433
    +142453
    +142469
    +142501
    +142529
    +142537
    +142543
    +142547
    +142553
    +142559
    +142567
    +142573
    +142589
    +142591
    +142601
    +142607
    +142609
    +142619
    +142657
    +142673
    +142697
    +142699
    +142711
    +142733
    +142757
    +142759
    +142771
    +142787
    +142789
    +142799
    +142811
    +142837
    +142841
    +142867
    +142871
    +142873
    +142897
    +142903
    +142907
    +142939
    +142949
    +142963
    +142969
    +142973
    +142979
    +142981
    +142993
    +143053
    +143063
    +143093
    +143107
    +143111
    +143113
    +143137
    +143141
    +143159
    +143177
    +143197
    +143239
    +143243
    +143249
    +143257
    +143261
    +143263
    +143281
    +143287
    +143291
    +143329
    +143333
    +143357
    +143387
    +143401
    +143413
    +143419
    +143443
    +143461
    +143467
    +143477
    +143483
    +143489
    +143501
    +143503
    +143509
    +143513
    +143519
    +143527
    +143537
    +143551
    +143567
    +143569
    +143573
    +143593
    +143609
    +143617
    +143629
    +143651
    +143653
    +143669
    +143677
    +143687
    +143699
    +143711
    +143719
    +143729
    +143743
    +143779
    +143791
    +143797
    +143807
    +143813
    +143821
    +143827
    +143831
    +143833
    +143873
    +143879
    +143881
    +143909
    +143947
    +143953
    +143971
    +143977
    +143981
    +143999
    +144013
    +144031
    +144037
    +144061
    +144071
    +144073
    +144103
    +144139
    +144161
    +144163
    +144167
    +144169
    +144173
    +144203
    +144223
    +144241
    +144247
    +144253
    +144259
    +144271
    +144289
    +144299
    +144307
    +144311
    +144323
    +144341
    +144349
    +144379
    +144383
    +144407
    +144409
    +144413
    +144427
    +144439
    +144451
    +144461
    +144479
    +144481
    +144497
    +144511
    +144539
    +144541
    +144563
    +144569
    +144577
    +144583
    +144589
    +144593
    +144611
    +144629
    +144659
    +144667
    +144671
    +144701
    +144709
    +144719
    +144731
    +144737
    +144751
    +144757
    +144763
    +144773
    +144779
    +144791
    +144817
    +144829
    +144839
    +144847
    +144883
    +144887
    +144889
    +144899
    +144917
    +144931
    +144941
    +144961
    +144967
    +144973
    +144983
    +145007
    +145009
    +145021
    +145031
    +145037
    +145043
    +145063
    +145069
    +145091
    +145109
    +145121
    +145133
    +145139
    +145177
    +145193
    +145207
    +145213
    +145219
    +145253
    +145259
    +145267
    +145283
    +145289
    +145303
    +145307
    +145349
    +145361
    +145381
    +145391
    +145399
    +145417
    +145423
    +145433
    +145441
    +145451
    +145459
    +145463
    +145471
    +145477
    +145487
    +145501
    +145511
    +145513
    +145517
    +145531
    +145543
    +145547
    +145549
    +145577
    +145589
    +145601
    +145603
    +145633
    +145637
    +145643
    +145661
    +145679
    +145681
    +145687
    +145703
    +145709
    +145721
    +145723
    +145753
    +145757
    +145759
    +145771
    +145777
    +145799
    +145807
    +145819
    +145823
    +145829
    +145861
    +145879
    +145897
    +145903
    +145931
    +145933
    +145949
    +145963
    +145967
    +145969
    +145987
    +145991
    +146009
    +146011
    +146021
    +146023
    +146033
    +146051
    +146057
    +146059
    +146063
    +146077
    +146093
    +146099
    +146117
    +146141
    +146161
    +146173
    +146191
    +146197
    +146203
    +146213
    +146221
    +146239
    +146249
    +146273
    +146291
    +146297
    +146299
    +146309
    +146317
    +146323
    +146347
    +146359
    +146369
    +146381
    +146383
    +146389
    +146407
    +146417
    +146423
    +146437
    +146449
    +146477
    +146513
    +146519
    +146521
    +146527
    +146539
    +146543
    +146563
    +146581
    +146603
    +146609
    +146617
    +146639
    +146647
    +146669
    +146677
    +146681
    +146683
    +146701
    +146719
    +146743
    +146749
    +146767
    +146777
    +146801
    +146807
    +146819
    +146833
    +146837
    +146843
    +146849
    +146857
    +146891
    +146893
    +146917
    +146921
    +146933
    +146941
    +146953
    +146977
    +146983
    +146987
    +146989
    +147011
    +147029
    +147031
    +147047
    +147073
    +147083
    +147089
    +147097
    +147107
    +147137
    +147139
    +147151
    +147163
    +147179
    +147197
    +147209
    +147211
    +147221
    +147227
    +147229
    +147253
    +147263
    +147283
    +147289
    +147293
    +147299
    +147311
    +147319
    +147331
    +147341
    +147347
    +147353
    +147377
    +147391
    +147397
    +147401
    +147409
    +147419
    +147449
    +147451
    +147457
    +147481
    +147487
    +147503
    +147517
    +147541
    +147547
    +147551
    +147557
    +147571
    +147583
    +147607
    +147613
    +147617
    +147629
    +147647
    +147661
    +147671
    +147673
    +147689
    +147703
    +147709
    +147727
    +147739
    +147743
    +147761
    +147769
    +147773
    +147779
    +147787
    +147793
    +147799
    +147811
    +147827
    +147853
    +147859
    +147863
    +147881
    +147919
    +147937
    +147949
    +147977
    +147997
    +148013
    +148021
    +148061
    +148063
    +148073
    +148079
    +148091
    +148123
    +148139
    +148147
    +148151
    +148153
    +148157
    +148171
    +148193
    +148199
    +148201
    +148207
    +148229
    +148243
    +148249
    +148279
    +148301
    +148303
    +148331
    +148339
    +148361
    +148367
    +148381
    +148387
    +148399
    +148403
    +148411
    +148429
    +148439
    +148457
    +148469
    +148471
    +148483
    +148501
    +148513
    +148517
    +148531
    +148537
    +148549
    +148573
    +148579
    +148609
    +148627
    +148633
    +148639
    +148663
    +148667
    +148669
    +148691
    +148693
    +148711
    +148721
    +148723
    +148727
    +148747
    +148763
    +148781
    +148783
    +148793
    +148817
    +148829
    +148853
    +148859
    +148861
    +148867
    +148873
    +148891
    +148913
    +148921
    +148927
    +148931
    +148933
    +148949
    +148957
    +148961
    +148991
    +148997
    +149011
    +149021
    +149027
    +149033
    +149053
    +149057
    +149059
    +149069
    +149077
    +149087
    +149099
    +149101
    +149111
    +149113
    +149119
    +149143
    +149153
    +149159
    +149161
    +149173
    +149183
    +149197
    +149213
    +149239
    +149249
    +149251
    +149257
    +149269
    +149287
    +149297
    +149309
    +149323
    +149333
    +149341
    +149351
    +149371
    +149377
    +149381
    +149393
    +149399
    +149411
    +149417
    +149419
    +149423
    +149441
    +149459
    +149489
    +149491
    +149497
    +149503
    +149519
    +149521
    +149531
    +149533
    +149543
    +149551
    +149561
    +149563
    +149579
    +149603
    +149623
    +149627
    +149629
    +149689
    +149711
    +149713
    +149717
    +149729
    +149731
    +149749
    +149759
    +149767
    +149771
    +149791
    +149803
    +149827
    +149837
    +149839
    +149861
    +149867
    +149873
    +149893
    +149899
    +149909
    +149911
    +149921
    +149939
    +149953
    +149969
    +149971
    +149993
    +150001
    +150011
    +150041
    +150053
    +150061
    +150067
    +150077
    +150083
    +150089
    +150091
    +150097
    +150107
    +150131
    +150151
    +150169
    +150193
    +150197
    +150203
    +150209
    +150211
    +150217
    +150221
    +150223
    +150239
    +150247
    +150287
    +150299
    +150301
    +150323
    +150329
    +150343
    +150373
    +150377
    +150379
    +150383
    +150401
    +150407
    +150413
    +150427
    +150431
    +150439
    +150473
    +150497
    +150503
    +150517
    +150523
    +150533
    +150551
    +150559
    +150571
    +150583
    +150587
    +150589
    +150607
    +150611
    +150617
    +150649
    +150659
    +150697
    +150707
    +150721
    +150743
    +150767
    +150769
    +150779
    +150791
    +150797
    +150827
    +150833
    +150847
    +150869
    +150881
    +150883
    +150889
    +150893
    +150901
    +150907
    +150919
    +150929
    +150959
    +150961
    +150967
    +150979
    +150989
    +150991
    +151007
    +151009
    +151013
    +151027
    +151049
    +151051
    +151057
    +151091
    +151121
    +151141
    +151153
    +151157
    +151163
    +151169
    +151171
    +151189
    +151201
    +151213
    +151237
    +151241
    +151243
    +151247
    +151253
    +151273
    +151279
    +151289
    +151303
    +151337
    +151339
    +151343
    +151357
    +151379
    +151381
    +151391
    +151397
    +151423
    +151429
    +151433
    +151451
    +151471
    +151477
    +151483
    +151499
    +151507
    +151517
    +151523
    +151531
    +151537
    +151549
    +151553
    +151561
    +151573
    +151579
    +151597
    +151603
    +151607
    +151609
    +151631
    +151637
    +151643
    +151651
    +151667
    +151673
    +151681
    +151687
    +151693
    +151703
    +151717
    +151729
    +151733
    +151769
    +151771
    +151783
    +151787
    +151799
    +151813
    +151817
    +151841
    +151847
    +151849
    +151871
    +151883
    +151897
    +151901
    +151903
    +151909
    +151937
    +151939
    +151967
    +151969
    +152003
    +152017
    +152027
    +152029
    +152039
    +152041
    +152063
    +152077
    +152081
    +152083
    +152093
    +152111
    +152123
    +152147
    +152183
    +152189
    +152197
    +152203
    +152213
    +152219
    +152231
    +152239
    +152249
    +152267
    +152287
    +152293
    +152297
    +152311
    +152363
    +152377
    +152381
    +152389
    +152393
    +152407
    +152417
    +152419
    +152423
    +152429
    +152441
    +152443
    +152459
    +152461
    +152501
    +152519
    +152531
    +152533
    +152539
    +152563
    +152567
    +152597
    +152599
    +152617
    +152623
    +152629
    +152639
    +152641
    +152657
    +152671
    +152681
    +152717
    +152723
    +152729
    +152753
    +152767
    +152777
    +152783
    +152791
    +152809
    +152819
    +152821
    +152833
    +152837
    +152839
    +152843
    +152851
    +152857
    +152879
    +152897
    +152899
    +152909
    +152939
    +152941
    +152947
    +152953
    +152959
    +152981
    +152989
    +152993
    +153001
    +153059
    +153067
    +153071
    +153073
    +153077
    +153089
    +153107
    +153113
    +153133
    +153137
    +153151
    +153191
    +153247
    +153259
    +153269
    +153271
    +153277
    +153281
    +153287
    +153313
    +153319
    +153337
    +153343
    +153353
    +153359
    +153371
    +153379
    +153407
    +153409
    +153421
    +153427
    +153437
    +153443
    +153449
    +153457
    +153469
    +153487
    +153499
    +153509
    +153511
    +153521
    +153523
    +153529
    +153533
    +153557
    +153563
    +153589
    +153607
    +153611
    +153623
    +153641
    +153649
    +153689
    +153701
    +153719
    +153733
    +153739
    +153743
    +153749
    +153757
    +153763
    +153817
    +153841
    +153871
    +153877
    +153887
    +153889
    +153911
    +153913
    +153929
    +153941
    +153947
    +153949
    +153953
    +153991
    +153997
    +154001
    +154027
    +154043
    +154057
    +154061
    +154067
    +154073
    +154079
    +154081
    +154087
    +154097
    +154111
    +154127
    +154153
    +154157
    +154159
    +154181
    +154183
    +154211
    +154213
    +154229
    +154243
    +154247
    +154267
    +154277
    +154279
    +154291
    +154303
    +154313
    +154321
    +154333
    +154339
    +154351
    +154369
    +154373
    +154387
    +154409
    +154417
    +154423
    +154439
    +154459
    +154487
    +154493
    +154501
    +154523
    +154543
    +154571
    +154573
    +154579
    +154589
    +154591
    +154613
    +154619
    +154621
    +154643
    +154667
    +154669
    +154681
    +154691
    +154699
    +154723
    +154727
    +154733
    +154747
    +154753
    +154769
    +154787
    +154789
    +154799
    +154807
    +154823
    +154841
    +154849
    +154871
    +154873
    +154877
    +154883
    +154897
    +154927
    +154933
    +154937
    +154943
    +154981
    +154991
    +155003
    +155009
    +155017
    +155027
    +155047
    +155069
    +155081
    +155083
    +155087
    +155119
    +155137
    +155153
    +155161
    +155167
    +155171
    +155191
    +155201
    +155203
    +155209
    +155219
    +155231
    +155251
    +155269
    +155291
    +155299
    +155303
    +155317
    +155327
    +155333
    +155371
    +155377
    +155381
    +155383
    +155387
    +155399
    +155413
    +155423
    +155443
    +155453
    +155461
    +155473
    +155501
    +155509
    +155521
    +155537
    +155539
    +155557
    +155569
    +155579
    +155581
    +155593
    +155599
    +155609
    +155621
    +155627
    +155653
    +155657
    +155663
    +155671
    +155689
    +155693
    +155699
    +155707
    +155717
    +155719
    +155723
    +155731
    +155741
    +155747
    +155773
    +155777
    +155783
    +155797
    +155801
    +155809
    +155821
    +155833
    +155849
    +155851
    +155861
    +155863
    +155887
    +155891
    +155893
    +155921
    +156007
    +156011
    +156019
    +156041
    +156059
    +156061
    +156071
    +156089
    +156109
    +156119
    +156127
    +156131
    +156139
    +156151
    +156157
    +156217
    +156227
    +156229
    +156241
    +156253
    +156257
    +156259
    +156269
    +156307
    +156319
    +156329
    +156347
    +156353
    +156361
    +156371
    +156419
    +156421
    +156437
    +156467
    +156487
    +156491
    +156493
    +156511
    +156521
    +156539
    +156577
    +156589
    +156593
    +156601
    +156619
    +156623
    +156631
    +156641
    +156659
    +156671
    +156677
    +156679
    +156683
    +156691
    +156703
    +156707
    +156719
    +156727
    +156733
    +156749
    +156781
    +156797
    +156799
    +156817
    +156823
    +156833
    +156841
    +156887
    +156899
    +156901
    +156913
    +156941
    +156943
    +156967
    +156971
    +156979
    +157007
    +157013
    +157019
    +157037
    +157049
    +157051
    +157057
    +157061
    +157081
    +157103
    +157109
    +157127
    +157133
    +157141
    +157163
    +157177
    +157181
    +157189
    +157207
    +157211
    +157217
    +157219
    +157229
    +157231
    +157243
    +157247
    +157253
    +157259
    +157271
    +157273
    +157277
    +157279
    +157291
    +157303
    +157307
    +157321
    +157327
    +157349
    +157351
    +157363
    +157393
    +157411
    +157427
    +157429
    +157433
    +157457
    +157477
    +157483
    +157489
    +157513
    +157519
    +157523
    +157543
    +157559
    +157561
    +157571
    +157579
    +157627
    +157637
    +157639
    +157649
    +157667
    +157669
    +157679
    +157721
    +157733
    +157739
    +157747
    +157769
    +157771
    +157793
    +157799
    +157813
    +157823
    +157831
    +157837
    +157841
    +157867
    +157877
    +157889
    +157897
    +157901
    +157907
    +157931
    +157933
    +157951
    +157991
    +157999
    +158003
    +158009
    +158017
    +158029
    +158047
    +158071
    +158077
    +158113
    +158129
    +158141
    +158143
    +158161
    +158189
    +158201
    +158209
    +158227
    +158231
    +158233
    +158243
    +158261
    +158269
    +158293
    +158303
    +158329
    +158341
    +158351
    +158357
    +158359
    +158363
    +158371
    +158393
    +158407
    +158419
    +158429
    +158443
    +158449
    +158489
    +158507
    +158519
    +158527
    +158537
    +158551
    +158563
    +158567
    +158573
    +158581
    +158591
    +158597
    +158611
    +158617
    +158621
    +158633
    +158647
    +158657
    +158663
    +158699
    +158731
    +158747
    +158749
    +158759
    +158761
    +158771
    +158777
    +158791
    +158803
    +158843
    +158849
    +158863
    +158867
    +158881
    +158909
    +158923
    +158927
    +158941
    +158959
    +158981
    +158993
    +159013
    +159017
    +159023
    +159059
    +159073
    +159079
    +159097
    +159113
    +159119
    +159157
    +159161
    +159167
    +159169
    +159179
    +159191
    +159193
    +159199
    +159209
    +159223
    +159227
    +159233
    +159287
    +159293
    +159311
    +159319
    +159337
    +159347
    +159349
    +159361
    +159389
    +159403
    +159407
    +159421
    +159431
    +159437
    +159457
    +159463
    +159469
    +159473
    +159491
    +159499
    +159503
    +159521
    +159539
    +159541
    +159553
    +159563
    +159569
    +159571
    +159589
    +159617
    +159623
    +159629
    +159631
    +159667
    +159671
    +159673
    +159683
    +159697
    +159701
    +159707
    +159721
    +159737
    +159739
    +159763
    +159769
    +159773
    +159779
    +159787
    +159791
    +159793
    +159799
    +159811
    +159833
    +159839
    +159853
    +159857
    +159869
    +159871
    +159899
    +159911
    +159931
    +159937
    +159977
    +159979
    +160001
    +160009
    +160019
    +160031
    +160033
    +160049
    +160073
    +160079
    +160081
    +160087
    +160091
    +160093
    +160117
    +160141
    +160159
    +160163
    +160169
    +160183
    +160201
    +160207
    +160217
    +160231
    +160243
    +160253
    +160309
    +160313
    +160319
    +160343
    +160357
    +160367
    +160373
    +160387
    +160397
    +160403
    +160409
    +160423
    +160441
    +160453
    +160481
    +160483
    +160499
    +160507
    +160541
    +160553
    +160579
    +160583
    +160591
    +160603
    +160619
    +160621
    +160627
    +160637
    +160639
    +160649
    +160651
    +160663
    +160669
    +160681
    +160687
    +160697
    +160709
    +160711
    +160723
    +160739
    +160751
    +160753
    +160757
    +160781
    +160789
    +160807
    +160813
    +160817
    +160829
    +160841
    +160861
    +160877
    +160879
    +160883
    +160903
    +160907
    +160933
    +160967
    +160969
    +160981
    +160997
    +161009
    +161017
    +161033
    +161039
    +161047
    +161053
    +161059
    +161071
    +161087
    +161093
    +161123
    +161137
    +161141
    +161149
    +161159
    +161167
    +161201
    +161221
    +161233
    +161237
    +161263
    +161267
    +161281
    +161303
    +161309
    +161323
    +161333
    +161339
    +161341
    +161363
    +161377
    +161387
    +161407
    +161411
    +161453
    +161459
    +161461
    +161471
    +161503
    +161507
    +161521
    +161527
    +161531
    +161543
    +161561
    +161563
    +161569
    +161573
    +161591
    +161599
    +161611
    +161627
    +161639
    +161641
    +161659
    +161683
    +161717
    +161729
    +161731
    +161741
    +161743
    +161753
    +161761
    +161771
    +161773
    +161779
    +161783
    +161807
    +161831
    +161839
    +161869
    +161873
    +161879
    +161881
    +161911
    +161921
    +161923
    +161947
    +161957
    +161969
    +161971
    +161977
    +161983
    +161999
    +162007
    +162011
    +162017
    +162053
    +162059
    +162079
    +162091
    +162109
    +162119
    +162143
    +162209
    +162221
    +162229
    +162251
    +162257
    +162263
    +162269
    +162277
    +162287
    +162289
    +162293
    +162343
    +162359
    +162389
    +162391
    +162413
    +162419
    +162439
    +162451
    +162457
    +162473
    +162493
    +162499
    +162517
    +162523
    +162527
    +162529
    +162553
    +162557
    +162563
    +162577
    +162593
    +162601
    +162611
    +162623
    +162629
    +162641
    +162649
    +162671
    +162677
    +162683
    +162691
    +162703
    +162709
    +162713
    +162727
    +162731
    +162739
    +162749
    +162751
    +162779
    +162787
    +162791
    +162821
    +162823
    +162829
    +162839
    +162847
    +162853
    +162859
    +162881
    +162889
    +162901
    +162907
    +162917
    +162937
    +162947
    +162971
    +162973
    +162989
    +162997
    +163003
    +163019
    +163021
    +163027
    +163061
    +163063
    +163109
    +163117
    +163127
    +163129
    +163147
    +163151
    +163169
    +163171
    +163181
    +163193
    +163199
    +163211
    +163223
    +163243
    +163249
    +163259
    +163307
    +163309
    +163321
    +163327
    +163337
    +163351
    +163363
    +163367
    +163393
    +163403
    +163409
    +163411
    +163417
    +163433
    +163469
    +163477
    +163481
    +163483
    +163487
    +163517
    +163543
    +163561
    +163567
    +163573
    +163601
    +163613
    +163621
    +163627
    +163633
    +163637
    +163643
    +163661
    +163673
    +163679
    +163697
    +163729
    +163733
    +163741
    +163753
    +163771
    +163781
    +163789
    +163811
    +163819
    +163841
    +163847
    +163853
    +163859
    +163861
    +163871
    +163883
    +163901
    +163909
    +163927
    +163973
    +163979
    +163981
    +163987
    +163991
    +163993
    +163997
    +164011
    +164023
    +164039
    +164051
    +164057
    +164071
    +164089
    +164093
    +164113
    +164117
    +164147
    +164149
    +164173
    +164183
    +164191
    +164201
    +164209
    +164231
    +164233
    +164239
    +164249
    +164251
    +164267
    +164279
    +164291
    +164299
    +164309
    +164321
    +164341
    +164357
    +164363
    +164371
    +164377
    +164387
    +164413
    +164419
    +164429
    +164431
    +164443
    +164447
    +164449
    +164471
    +164477
    +164503
    +164513
    +164531
    +164569
    +164581
    +164587
    +164599
    +164617
    +164621
    +164623
    +164627
    +164653
    +164663
    +164677
    +164683
    +164701
    +164707
    +164729
    +164743
    +164767
    +164771
    +164789
    +164809
    +164821
    +164831
    +164837
    +164839
    +164881
    +164893
    +164911
    +164953
    +164963
    +164987
    +164999
    +165001
    +165037
    +165041
    +165047
    +165049
    +165059
    +165079
    +165083
    +165089
    +165103
    +165133
    +165161
    +165173
    +165181
    +165203
    +165211
    +165229
    +165233
    +165247
    +165287
    +165293
    +165311
    +165313
    +165317
    +165331
    +165343
    +165349
    +165367
    +165379
    +165383
    +165391
    +165397
    +165437
    +165443
    +165449
    +165457
    +165463
    +165469
    +165479
    +165511
    +165523
    +165527
    +165533
    +165541
    +165551
    +165553
    +165559
    +165569
    +165587
    +165589
    +165601
    +165611
    +165617
    +165653
    +165667
    +165673
    +165701
    +165703
    +165707
    +165709
    +165713
    +165719
    +165721
    +165749
    +165779
    +165799
    +165811
    +165817
    +165829
    +165833
    +165857
    +165877
    +165883
    +165887
    +165901
    +165931
    +165941
    +165947
    +165961
    +165983
    +166013
    +166021
    +166027
    +166031
    +166043
    +166063
    +166081
    +166099
    +166147
    +166151
    +166157
    +166169
    +166183
    +166189
    +166207
    +166219
    +166237
    +166247
    +166259
    +166273
    +166289
    +166297
    +166301
    +166303
    +166319
    +166349
    +166351
    +166357
    +166363
    +166393
    +166399
    +166403
    +166409
    +166417
    +166429
    +166457
    +166471
    +166487
    +166541
    +166561
    +166567
    +166571
    +166597
    +166601
    +166603
    +166609
    +166613
    +166619
    +166627
    +166631
    +166643
    +166657
    +166667
    +166669
    +166679
    +166693
    +166703
    +166723
    +166739
    +166741
    +166781
    +166783
    +166799
    +166807
    +166823
    +166841
    +166843
    +166847
    +166849
    +166853
    +166861
    +166867
    +166871
    +166909
    +166919
    +166931
    +166949
    +166967
    +166973
    +166979
    +166987
    +167009
    +167017
    +167021
    +167023
    +167033
    +167039
    +167047
    +167051
    +167071
    +167077
    +167081
    +167087
    +167099
    +167107
    +167113
    +167117
    +167119
    +167149
    +167159
    +167173
    +167177
    +167191
    +167197
    +167213
    +167221
    +167249
    +167261
    +167267
    +167269
    +167309
    +167311
    +167317
    +167329
    +167339
    +167341
    +167381
    +167393
    +167407
    +167413
    +167423
    +167429
    +167437
    +167441
    +167443
    +167449
    +167471
    +167483
    +167491
    +167521
    +167537
    +167543
    +167593
    +167597
    +167611
    +167621
    +167623
    +167627
    +167633
    +167641
    +167663
    +167677
    +167683
    +167711
    +167729
    +167747
    +167759
    +167771
    +167777
    +167779
    +167801
    +167809
    +167861
    +167863
    +167873
    +167879
    +167887
    +167891
    +167899
    +167911
    +167917
    +167953
    +167971
    +167987
    +168013
    +168023
    +168029
    +168037
    +168043
    +168067
    +168071
    +168083
    +168089
    +168109
    +168127
    +168143
    +168151
    +168193
    +168197
    +168211
    +168227
    +168247
    +168253
    +168263
    +168269
    +168277
    +168281
    +168293
    +168323
    +168331
    +168347
    +168353
    +168391
    +168409
    +168433
    +168449
    +168451
    +168457
    +168463
    +168481
    +168491
    +168499
    +168523
    +168527
    +168533
    +168541
    +168559
    +168599
    +168601
    +168617
    +168629
    +168631
    +168643
    +168673
    +168677
    +168697
    +168713
    +168719
    +168731
    +168737
    +168743
    +168761
    +168769
    +168781
    +168803
    +168851
    +168863
    +168869
    +168887
    +168893
    +168899
    +168901
    +168913
    +168937
    +168943
    +168977
    +168991
    +169003
    +169007
    +169009
    +169019
    +169049
    +169063
    +169067
    +169069
    +169079
    +169093
    +169097
    +169111
    +169129
    +169151
    +169159
    +169177
    +169181
    +169199
    +169217
    +169219
    +169241
    +169243
    +169249
    +169259
    +169283
    +169307
    +169313
    +169319
    +169321
    +169327
    +169339
    +169343
    +169361
    +169369
    +169373
    +169399
    +169409
    +169427
    +169457
    +169471
    +169483
    +169489
    +169493
    +169501
    +169523
    +169531
    +169553
    +169567
    +169583
    +169591
    +169607
    +169627
    +169633
    +169639
    +169649
    +169657
    +169661
    +169667
    +169681
    +169691
    +169693
    +169709
    +169733
    +169751
    +169753
    +169769
    +169777
    +169783
    +169789
    +169817
    +169823
    +169831
    +169837
    +169843
    +169859
    +169889
    +169891
    +169909
    +169913
    +169919
    +169933
    +169937
    +169943
    +169951
    +169957
    +169987
    +169991
    +170003
    +170021
    +170029
    +170047
    +170057
    +170063
    +170081
    +170099
    +170101
    +170111
    +170123
    +170141
    +170167
    +170179
    +170189
    +170197
    +170207
    +170213
    +170227
    +170231
    +170239
    +170243
    +170249
    +170263
    +170267
    +170279
    +170293
    +170299
    +170327
    +170341
    +170347
    +170351
    +170353
    +170363
    +170369
    +170371
    +170383
    +170389
    +170393
    +170413
    +170441
    +170447
    +170473
    +170483
    +170497
    +170503
    +170509
    +170537
    +170539
    +170551
    +170557
    +170579
    +170603
    +170609
    +170627
    +170633
    +170641
    +170647
    +170669
    +170689
    +170701
    +170707
    +170711
    +170741
    +170749
    +170759
    +170761
    +170767
    +170773
    +170777
    +170801
    +170809
    +170813
    +170827
    +170837
    +170843
    +170851
    +170857
    +170873
    +170881
    +170887
    +170899
    +170921
    +170927
    +170953
    +170957
    +170971
    +171007
    +171023
    +171029
    +171043
    +171047
    +171049
    +171053
    +171077
    +171079
    +171091
    +171103
    +171131
    +171161
    +171163
    +171167
    +171169
    +171179
    +171203
    +171233
    +171251
    +171253
    +171263
    +171271
    +171293
    +171299
    +171317
    +171329
    +171341
    +171383
    +171401
    +171403
    +171427
    +171439
    +171449
    +171467
    +171469
    +171473
    +171481
    +171491
    +171517
    +171529
    +171539
    +171541
    +171553
    +171559
    +171571
    +171583
    +171617
    +171629
    +171637
    +171641
    +171653
    +171659
    +171671
    +171673
    +171679
    +171697
    +171707
    +171713
    +171719
    +171733
    +171757
    +171761
    +171763
    +171793
    +171799
    +171803
    +171811
    +171823
    +171827
    +171851
    +171863
    +171869
    +171877
    +171881
    +171889
    +171917
    +171923
    +171929
    +171937
    +171947
    +172001
    +172009
    +172021
    +172027
    +172031
    +172049
    +172069
    +172079
    +172093
    +172097
    +172127
    +172147
    +172153
    +172157
    +172169
    +172171
    +172181
    +172199
    +172213
    +172217
    +172219
    +172223
    +172243
    +172259
    +172279
    +172283
    +172297
    +172307
    +172313
    +172321
    +172331
    +172343
    +172351
    +172357
    +172373
    +172399
    +172411
    +172421
    +172423
    +172427
    +172433
    +172439
    +172441
    +172489
    +172507
    +172517
    +172519
    +172541
    +172553
    +172561
    +172573
    +172583
    +172589
    +172597
    +172603
    +172607
    +172619
    +172633
    +172643
    +172649
    +172657
    +172663
    +172673
    +172681
    +172687
    +172709
    +172717
    +172721
    +172741
    +172751
    +172759
    +172787
    +172801
    +172807
    +172829
    +172849
    +172853
    +172859
    +172867
    +172871
    +172877
    +172883
    +172933
    +172969
    +172973
    +172981
    +172987
    +172993
    +172999
    +173021
    +173023
    +173039
    +173053
    +173059
    +173081
    +173087
    +173099
    +173137
    +173141
    +173149
    +173177
    +173183
    +173189
    +173191
    +173207
    +173209
    +173219
    +173249
    +173263
    +173267
    +173273
    +173291
    +173293
    +173297
    +173309
    +173347
    +173357
    +173359
    +173429
    +173431
    +173473
    +173483
    +173491
    +173497
    +173501
    +173531
    +173539
    +173543
    +173549
    +173561
    +173573
    +173599
    +173617
    +173629
    +173647
    +173651
    +173659
    +173669
    +173671
    +173683
    +173687
    +173699
    +173707
    +173713
    +173729
    +173741
    +173743
    +173773
    +173777
    +173779
    +173783
    +173807
    +173819
    +173827
    +173839
    +173851
    +173861
    +173867
    +173891
    +173897
    +173909
    +173917
    +173923
    +173933
    +173969
    +173977
    +173981
    +173993
    +174007
    +174017
    +174019
    +174047
    +174049
    +174061
    +174067
    +174071
    +174077
    +174079
    +174091
    +174101
    +174121
    +174137
    +174143
    +174149
    +174157
    +174169
    +174197
    +174221
    +174241
    +174257
    +174259
    +174263
    +174281
    +174289
    +174299
    +174311
    +174329
    +174331
    +174337
    +174347
    +174367
    +174389
    +174407
    +174413
    +174431
    +174443
    +174457
    +174467
    +174469
    +174481
    +174487
    +174491
    +174527
    +174533
    +174569
    +174571
    +174583
    +174599
    +174613
    +174617
    +174631
    +174637
    +174649
    +174653
    +174659
    +174673
    +174679
    +174703
    +174721
    +174737
    +174749
    +174761
    +174763
    +174767
    +174773
    +174799
    +174821
    +174829
    +174851
    +174859
    +174877
    +174893
    +174901
    +174907
    +174917
    +174929
    +174931
    +174943
    +174959
    +174989
    +174991
    +175003
    +175013
    +175039
    +175061
    +175067
    +175069
    +175079
    +175081
    +175103
    +175129
    +175141
    +175211
    +175229
    +175261
    +175267
    +175277
    +175291
    +175303
    +175309
    +175327
    +175333
    +175349
    +175361
    +175391
    +175393
    +175403
    +175411
    +175433
    +175447
    +175453
    +175463
    +175481
    +175493
    +175499
    +175519
    +175523
    +175543
    +175573
    +175601
    +175621
    +175631
    +175633
    +175649
    +175663
    +175673
    +175687
    +175691
    +175699
    +175709
    +175723
    +175727
    +175753
    +175757
    +175759
    +175781
    +175783
    +175811
    +175829
    +175837
    +175843
    +175853
    +175859
    +175873
    +175891
    +175897
    +175909
    +175919
    +175937
    +175939
    +175949
    +175961
    +175963
    +175979
    +175991
    +175993
    +176017
    +176021
    +176023
    +176041
    +176047
    +176051
    +176053
    +176063
    +176081
    +176087
    +176089
    +176123
    +176129
    +176153
    +176159
    +176161
    +176179
    +176191
    +176201
    +176207
    +176213
    +176221
    +176227
    +176237
    +176243
    +176261
    +176299
    +176303
    +176317
    +176321
    +176327
    +176329
    +176333
    +176347
    +176353
    +176357
    +176369
    +176383
    +176389
    +176401
    +176413
    +176417
    +176419
    +176431
    +176459
    +176461
    +176467
    +176489
    +176497
    +176503
    +176507
    +176509
    +176521
    +176531
    +176537
    +176549
    +176551
    +176557
    +176573
    +176591
    +176597
    +176599
    +176609
    +176611
    +176629
    +176641
    +176651
    +176677
    +176699
    +176711
    +176713
    +176741
    +176747
    +176753
    +176777
    +176779
    +176789
    +176791
    +176797
    +176807
    +176809
    +176819
    +176849
    +176857
    +176887
    +176899
    +176903
    +176921
    +176923
    +176927
    +176933
    +176951
    +176977
    +176983
    +176989
    +177007
    +177011
    +177013
    +177019
    +177043
    +177091
    +177101
    +177109
    +177113
    +177127
    +177131
    +177167
    +177173
    +177209
    +177211
    +177217
    +177223
    +177239
    +177257
    +177269
    +177283
    +177301
    +177319
    +177323
    +177337
    +177347
    +177379
    +177383
    +177409
    +177421
    +177427
    +177431
    +177433
    +177467
    +177473
    +177481
    +177487
    +177493
    +177511
    +177533
    +177539
    +177553
    +177589
    +177601
    +177623
    +177647
    +177677
    +177679
    +177691
    +177739
    +177743
    +177761
    +177763
    +177787
    +177791
    +177797
    +177811
    +177823
    +177839
    +177841
    +177883
    +177887
    +177889
    +177893
    +177907
    +177913
    +177917
    +177929
    +177943
    +177949
    +177953
    +177967
    +177979
    +178001
    +178021
    +178037
    +178039
    +178067
    +178069
    +178091
    +178093
    +178103
    +178117
    +178127
    +178141
    +178151
    +178169
    +178183
    +178187
    +178207
    +178223
    +178231
    +178247
    +178249
    +178259
    +178261
    +178289
    +178301
    +178307
    +178327
    +178333
    +178349
    +178351
    +178361
    +178393
    +178397
    +178403
    +178417
    +178439
    +178441
    +178447
    +178469
    +178481
    +178487
    +178489
    +178501
    +178513
    +178531
    +178537
    +178559
    +178561
    +178567
    +178571
    +178597
    +178601
    +178603
    +178609
    +178613
    +178621
    +178627
    +178639
    +178643
    +178681
    +178691
    +178693
    +178697
    +178753
    +178757
    +178781
    +178793
    +178799
    +178807
    +178813
    +178817
    +178819
    +178831
    +178853
    +178859
    +178873
    +178877
    +178889
    +178897
    +178903
    +178907
    +178909
    +178921
    +178931
    +178933
    +178939
    +178951
    +178973
    +178987
    +179021
    +179029
    +179033
    +179041
    +179051
    +179057
    +179083
    +179089
    +179099
    +179107
    +179111
    +179119
    +179143
    +179161
    +179167
    +179173
    +179203
    +179209
    +179213
    +179233
    +179243
    +179261
    +179269
    +179281
    +179287
    +179317
    +179321
    +179327
    +179351
    +179357
    +179369
    +179381
    +179383
    +179393
    +179407
    +179411
    +179429
    +179437
    +179441
    +179453
    +179461
    +179471
    +179479
    +179483
    +179497
    +179519
    +179527
    +179533
    +179549
    +179563
    +179573
    +179579
    +179581
    +179591
    +179593
    +179603
    +179623
    +179633
    +179651
    +179657
    +179659
    +179671
    +179687
    +179689
    +179693
    +179717
    +179719
    +179737
    +179743
    +179749
    +179779
    +179801
    +179807
    +179813
    +179819
    +179821
    +179827
    +179833
    +179849
    +179897
    +179899
    +179903
    +179909
    +179917
    +179923
    +179939
    +179947
    +179951
    +179953
    +179957
    +179969
    +179981
    +179989
    +179999
    +180001
    +180007
    +180023
    +180043
    +180053
    +180071
    +180073
    +180077
    +180097
    +180137
    +180161
    +180179
    +180181
    +180211
    +180221
    +180233
    +180239
    +180241
    +180247
    +180259
    +180263
    +180281
    +180287
    +180289
    +180307
    +180311
    +180317
    +180331
    +180337
    +180347
    +180361
    +180371
    +180379
    +180391
    +180413
    +180419
    +180437
    +180463
    +180473
    +180491
    +180497
    +180503
    +180511
    +180533
    +180539
    +180541
    +180547
    +180563
    +180569
    +180617
    +180623
    +180629
    +180647
    +180667
    +180679
    +180701
    +180731
    +180749
    +180751
    +180773
    +180779
    +180793
    +180797
    +180799
    +180811
    +180847
    +180871
    +180883
    +180907
    +180949
    +180959
    +181001
    +181003
    +181019
    +181031
    +181039
    +181061
    +181063
    +181081
    +181087
    +181123
    +181141
    +181157
    +181183
    +181193
    +181199
    +181201
    +181211
    +181213
    +181219
    +181243
    +181253
    +181273
    +181277
    +181283
    +181297
    +181301
    +181303
    +181361
    +181387
    +181397
    +181399
    +181409
    +181421
    +181439
    +181457
    +181459
    +181499
    +181501
    +181513
    +181523
    +181537
    +181549
    +181553
    +181603
    +181607
    +181609
    +181619
    +181639
    +181667
    +181669
    +181693
    +181711
    +181717
    +181721
    +181729
    +181739
    +181751
    +181757
    +181759
    +181763
    +181777
    +181787
    +181789
    +181813
    +181837
    +181871
    +181873
    +181889
    +181891
    +181903
    +181913
    +181919
    +181927
    +181931
    +181943
    +181957
    +181967
    +181981
    +181997
    +182009
    +182011
    +182027
    +182029
    +182041
    +182047
    +182057
    +182059
    +182089
    +182099
    +182101
    +182107
    +182111
    +182123
    +182129
    +182131
    +182141
    +182159
    +182167
    +182177
    +182179
    +182201
    +182209
    +182233
    +182239
    +182243
    +182261
    +182279
    +182297
    +182309
    +182333
    +182339
    +182341
    +182353
    +182387
    +182389
    +182417
    +182423
    +182431
    +182443
    +182453
    +182467
    +182471
    +182473
    +182489
    +182503
    +182509
    +182519
    +182537
    +182549
    +182561
    +182579
    +182587
    +182593
    +182599
    +182603
    +182617
    +182627
    +182639
    +182641
    +182653
    +182657
    +182659
    +182681
    +182687
    +182701
    +182711
    +182713
    +182747
    +182773
    +182779
    +182789
    +182803
    +182813
    +182821
    +182839
    +182851
    +182857
    +182867
    +182887
    +182893
    +182899
    +182921
    +182927
    +182929
    +182933
    +182953
    +182957
    +182969
    +182981
    +182999
    +183023
    +183037
    +183041
    +183047
    +183059
    +183067
    +183089
    +183091
    +183119
    +183151
    +183167
    +183191
    +183203
    +183247
    +183259
    +183263
    +183283
    +183289
    +183299
    +183301
    +183307
    +183317
    +183319
    +183329
    +183343
    +183349
    +183361
    +183373
    +183377
    +183383
    +183389
    +183397
    +183437
    +183439
    +183451
    +183461
    +183473
    +183479
    +183487
    +183497
    +183499
    +183503
    +183509
    +183511
    +183523
    +183527
    +183569
    +183571
    +183577
    +183581
    +183587
    +183593
    +183611
    +183637
    +183661
    +183683
    +183691
    +183697
    +183707
    +183709
    +183713
    +183761
    +183763
    +183797
    +183809
    +183823
    +183829
    +183871
    +183877
    +183881
    +183907
    +183917
    +183919
    +183943
    +183949
    +183959
    +183971
    +183973
    +183979
    +184003
    +184007
    +184013
    +184031
    +184039
    +184043
    +184057
    +184073
    +184081
    +184087
    +184111
    +184117
    +184133
    +184153
    +184157
    +184181
    +184187
    +184189
    +184199
    +184211
    +184231
    +184241
    +184259
    +184271
    +184273
    +184279
    +184291
    +184309
    +184321
    +184333
    +184337
    +184351
    +184369
    +184409
    +184417
    +184441
    +184447
    +184463
    +184477
    +184487
    +184489
    +184511
    +184517
    +184523
    +184553
    +184559
    +184567
    +184571
    +184577
    +184607
    +184609
    +184627
    +184631
    +184633
    +184649
    +184651
    +184669
    +184687
    +184693
    +184703
    +184711
    +184721
    +184727
    +184733
    +184753
    +184777
    +184823
    +184829
    +184831
    +184837
    +184843
    +184859
    +184879
    +184901
    +184903
    +184913
    +184949
    +184957
    +184967
    +184969
    +184993
    +184997
    +184999
    +185021
    +185027
    +185051
    +185057
    +185063
    +185069
    +185071
    +185077
    +185089
    +185099
    +185123
    +185131
    +185137
    +185149
    +185153
    +185161
    +185167
    +185177
    +185183
    +185189
    +185221
    +185233
    +185243
    +185267
    +185291
    +185299
    +185303
    +185309
    +185323
    +185327
    +185359
    +185363
    +185369
    +185371
    +185401
    +185429
    +185441
    +185467
    +185477
    +185483
    +185491
    +185519
    +185527
    +185531
    +185533
    +185539
    +185543
    +185551
    +185557
    +185567
    +185569
    +185593
    +185599
    +185621
    +185641
    +185651
    +185677
    +185681
    +185683
    +185693
    +185699
    +185707
    +185711
    +185723
    +185737
    +185747
    +185749
    +185753
    +185767
    +185789
    +185797
    +185813
    +185819
    +185821
    +185831
    +185833
    +185849
    +185869
    +185873
    +185893
    +185897
    +185903
    +185917
    +185923
    +185947
    +185951
    +185957
    +185959
    +185971
    +185987
    +185993
    +186007
    +186013
    +186019
    +186023
    +186037
    +186041
    +186049
    +186071
    +186097
    +186103
    +186107
    +186113
    +186119
    +186149
    +186157
    +186161
    +186163
    +186187
    +186191
    +186211
    +186227
    +186229
    +186239
    +186247
    +186253
    +186259
    +186271
    +186283
    +186299
    +186301
    +186311
    +186317
    +186343
    +186377
    +186379
    +186391
    +186397
    +186419
    +186437
    +186451
    +186469
    +186479
    +186481
    +186551
    +186569
    +186581
    +186583
    +186587
    +186601
    +186619
    +186629
    +186647
    +186649
    +186653
    +186671
    +186679
    +186689
    +186701
    +186707
    +186709
    +186727
    +186733
    +186743
    +186757
    +186761
    +186763
    +186773
    +186793
    +186799
    +186841
    +186859
    +186869
    +186871
    +186877
    +186883
    +186889
    +186917
    +186947
    +186959
    +187003
    +187009
    +187027
    +187043
    +187049
    +187067
    +187069
    +187073
    +187081
    +187091
    +187111
    +187123
    +187127
    +187129
    +187133
    +187139
    +187141
    +187163
    +187171
    +187177
    +187181
    +187189
    +187193
    +187211
    +187217
    +187219
    +187223
    +187237
    +187273
    +187277
    +187303
    +187337
    +187339
    +187349
    +187361
    +187367
    +187373
    +187379
    +187387
    +187393
    +187409
    +187417
    +187423
    +187433
    +187441
    +187463
    +187469
    +187471
    +187477
    +187507
    +187513
    +187531
    +187547
    +187559
    +187573
    +187597
    +187631
    +187633
    +187637
    +187639
    +187651
    +187661
    +187669
    +187687
    +187699
    +187711
    +187721
    +187751
    +187763
    +187787
    +187793
    +187823
    +187843
    +187861
    +187871
    +187877
    +187883
    +187897
    +187907
    +187909
    +187921
    +187927
    +187931
    +187951
    +187963
    +187973
    +187987
    +188011
    +188017
    +188021
    +188029
    +188107
    +188137
    +188143
    +188147
    +188159
    +188171
    +188179
    +188189
    +188197
    +188249
    +188261
    +188273
    +188281
    +188291
    +188299
    +188303
    +188311
    +188317
    +188323
    +188333
    +188351
    +188359
    +188369
    +188389
    +188401
    +188407
    +188417
    +188431
    +188437
    +188443
    +188459
    +188473
    +188483
    +188491
    +188519
    +188527
    +188533
    +188563
    +188579
    +188603
    +188609
    +188621
    +188633
    +188653
    +188677
    +188681
    +188687
    +188693
    +188701
    +188707
    +188711
    +188719
    +188729
    +188753
    +188767
    +188779
    +188791
    +188801
    +188827
    +188831
    +188833
    +188843
    +188857
    +188861
    +188863
    +188869
    +188891
    +188911
    +188927
    +188933
    +188939
    +188941
    +188953
    +188957
    +188983
    +188999
    +189011
    +189017
    +189019
    +189041
    +189043
    +189061
    +189067
    +189127
    +189139
    +189149
    +189151
    +189169
    +189187
    +189199
    +189223
    +189229
    +189239
    +189251
    +189253
    +189257
    +189271
    +189307
    +189311
    +189337
    +189347
    +189349
    +189353
    +189361
    +189377
    +189389
    +189391
    +189401
    +189407
    +189421
    +189433
    +189437
    +189439
    +189463
    +189467
    +189473
    +189479
    +189491
    +189493
    +189509
    +189517
    +189523
    +189529
    +189547
    +189559
    +189583
    +189593
    +189599
    +189613
    +189617
    +189619
    +189643
    +189653
    +189661
    +189671
    +189691
    +189697
    +189701
    +189713
    +189733
    +189743
    +189757
    +189767
    +189797
    +189799
    +189817
    +189823
    +189851
    +189853
    +189859
    +189877
    +189881
    +189887
    +189901
    +189913
    +189929
    +189947
    +189949
    +189961
    +189967
    +189977
    +189983
    +189989
    +189997
    +190027
    +190031
    +190051
    +190063
    +190093
    +190097
    +190121
    +190129
    +190147
    +190159
    +190181
    +190207
    +190243
    +190249
    +190261
    +190271
    +190283
    +190297
    +190301
    +190313
    +190321
    +190331
    +190339
    +190357
    +190367
    +190369
    +190387
    +190391
    +190403
    +190409
    +190471
    +190507
    +190523
    +190529
    +190537
    +190543
    +190573
    +190577
    +190579
    +190583
    +190591
    +190607
    +190613
    +190633
    +190639
    +190649
    +190657
    +190667
    +190669
    +190699
    +190709
    +190711
    +190717
    +190753
    +190759
    +190763
    +190769
    +190783
    +190787
    +190793
    +190807
    +190811
    +190823
    +190829
    +190837
    +190843
    +190871
    +190889
    +190891
    +190901
    +190909
    +190913
    +190921
    +190979
    +190997
    +191021
    +191027
    +191033
    +191039
    +191047
    +191057
    +191071
    +191089
    +191099
    +191119
    +191123
    +191137
    +191141
    +191143
    +191161
    +191173
    +191189
    +191227
    +191231
    +191237
    +191249
    +191251
    +191281
    +191297
    +191299
    +191339
    +191341
    +191353
    +191413
    +191441
    +191447
    +191449
    +191453
    +191459
    +191461
    +191467
    +191473
    +191491
    +191497
    +191507
    +191509
    +191519
    +191531
    +191533
    +191537
    +191551
    +191561
    +191563
    +191579
    +191599
    +191621
    +191627
    +191657
    +191669
    +191671
    +191677
    +191689
    +191693
    +191699
    +191707
    +191717
    +191747
    +191749
    +191773
    +191783
    +191791
    +191801
    +191803
    +191827
    +191831
    +191833
    +191837
    +191861
    +191899
    +191903
    +191911
    +191929
    +191953
    +191969
    +191977
    +191999
    +192007
    +192013
    +192029
    +192037
    +192043
    +192047
    +192053
    +192091
    +192097
    +192103
    +192113
    +192121
    +192133
    +192149
    +192161
    +192173
    +192187
    +192191
    +192193
    +192229
    +192233
    +192239
    +192251
    +192259
    +192263
    +192271
    +192307
    +192317
    +192319
    +192323
    +192341
    +192343
    +192347
    +192373
    +192377
    +192383
    +192391
    +192407
    +192431
    +192461
    +192463
    +192497
    +192499
    +192529
    +192539
    +192547
    +192553
    +192557
    +192571
    +192581
    +192583
    +192587
    +192601
    +192611
    +192613
    +192617
    +192629
    +192631
    +192637
    +192667
    +192677
    +192697
    +192737
    +192743
    +192749
    +192757
    +192767
    +192781
    +192791
    +192799
    +192811
    +192817
    +192833
    +192847
    +192853
    +192859
    +192877
    +192883
    +192887
    +192889
    +192917
    +192923
    +192931
    +192949
    +192961
    +192971
    +192977
    +192979
    +192991
    +193003
    +193009
    +193013
    +193031
    +193043
    +193051
    +193057
    +193073
    +193093
    +193133
    +193139
    +193147
    +193153
    +193163
    +193181
    +193183
    +193189
    +193201
    +193243
    +193247
    +193261
    +193283
    +193301
    +193327
    +193337
    +193357
    +193367
    +193373
    +193379
    +193381
    +193387
    +193393
    +193423
    +193433
    +193441
    +193447
    +193451
    +193463
    +193469
    +193493
    +193507
    +193513
    +193541
    +193549
    +193559
    +193573
    +193577
    +193597
    +193601
    +193603
    +193607
    +193619
    +193649
    +193663
    +193679
    +193703
    +193723
    +193727
    +193741
    +193751
    +193757
    +193763
    +193771
    +193789
    +193793
    +193799
    +193811
    +193813
    +193841
    +193847
    +193859
    +193861
    +193871
    +193873
    +193877
    +193883
    +193891
    +193937
    +193939
    +193943
    +193951
    +193957
    +193979
    +193993
    +194003
    +194017
    +194027
    +194057
    +194069
    +194071
    +194083
    +194087
    +194093
    +194101
    +194113
    +194119
    +194141
    +194149
    +194167
    +194179
    +194197
    +194203
    +194239
    +194263
    +194267
    +194269
    +194309
    +194323
    +194353
    +194371
    +194377
    +194413
    +194431
    +194443
    +194471
    +194479
    +194483
    +194507
    +194521
    +194527
    +194543
    +194569
    +194581
    +194591
    +194609
    +194647
    +194653
    +194659
    +194671
    +194681
    +194683
    +194687
    +194707
    +194713
    +194717
    +194723
    +194729
    +194749
    +194767
    +194771
    +194809
    +194813
    +194819
    +194827
    +194839
    +194861
    +194863
    +194867
    +194869
    +194891
    +194899
    +194911
    +194917
    +194933
    +194963
    +194977
    +194981
    +194989
    +195023
    +195029
    +195043
    +195047
    +195049
    +195053
    +195071
    +195077
    +195089
    +195103
    +195121
    +195127
    +195131
    +195137
    +195157
    +195161
    +195163
    +195193
    +195197
    +195203
    +195229
    +195241
    +195253
    +195259
    +195271
    +195277
    +195281
    +195311
    +195319
    +195329
    +195341
    +195343
    +195353
    +195359
    +195389
    +195401
    +195407
    +195413
    +195427
    +195443
    +195457
    +195469
    +195479
    +195493
    +195497
    +195511
    +195527
    +195539
    +195541
    +195581
    +195593
    +195599
    +195659
    +195677
    +195691
    +195697
    +195709
    +195731
    +195733
    +195737
    +195739
    +195743
    +195751
    +195761
    +195781
    +195787
    +195791
    +195809
    +195817
    +195863
    +195869
    +195883
    +195887
    +195893
    +195907
    +195913
    +195919
    +195929
    +195931
    +195967
    +195971
    +195973
    +195977
    +195991
    +195997
    +196003
    +196033
    +196039
    +196043
    +196051
    +196073
    +196081
    +196087
    +196111
    +196117
    +196139
    +196159
    +196169
    +196171
    +196177
    +196181
    +196187
    +196193
    +196201
    +196247
    +196271
    +196277
    +196279
    +196291
    +196303
    +196307
    +196331
    +196337
    +196379
    +196387
    +196429
    +196439
    +196453
    +196459
    +196477
    +196499
    +196501
    +196519
    +196523
    +196541
    +196543
    +196549
    +196561
    +196579
    +196583
    +196597
    +196613
    +196643
    +196657
    +196661
    +196663
    +196681
    +196687
    +196699
    +196709
    +196717
    +196727
    +196739
    +196751
    +196769
    +196771
    +196799
    +196817
    +196831
    +196837
    +196853
    +196871
    +196873
    +196879
    +196901
    +196907
    +196919
    +196927
    +196961
    +196991
    +196993
    +197003
    +197009
    +197023
    +197033
    +197059
    +197063
    +197077
    +197083
    +197089
    +197101
    +197117
    +197123
    +197137
    +197147
    +197159
    +197161
    +197203
    +197207
    +197221
    +197233
    +197243
    +197257
    +197261
    +197269
    +197273
    +197279
    +197293
    +197297
    +197299
    +197311
    +197339
    +197341
    +197347
    +197359
    +197369
    +197371
    +197381
    +197383
    +197389
    +197419
    +197423
    +197441
    +197453
    +197479
    +197507
    +197521
    +197539
    +197551
    +197567
    +197569
    +197573
    +197597
    +197599
    +197609
    +197621
    +197641
    +197647
    +197651
    +197677
    +197683
    +197689
    +197699
    +197711
    +197713
    +197741
    +197753
    +197759
    +197767
    +197773
    +197779
    +197803
    +197807
    +197831
    +197837
    +197887
    +197891
    +197893
    +197909
    +197921
    +197927
    +197933
    +197947
    +197957
    +197959
    +197963
    +197969
    +197971
    +198013
    +198017
    +198031
    +198043
    +198047
    +198073
    +198083
    +198091
    +198097
    +198109
    +198127
    +198139
    +198173
    +198179
    +198193
    +198197
    +198221
    +198223
    +198241
    +198251
    +198257
    +198259
    +198277
    +198281
    +198301
    +198313
    +198323
    +198337
    +198347
    +198349
    +198377
    +198391
    +198397
    +198409
    +198413
    +198427
    +198437
    +198439
    +198461
    +198463
    +198469
    +198479
    +198491
    +198503
    +198529
    +198533
    +198553
    +198571
    +198589
    +198593
    +198599
    +198613
    +198623
    +198637
    +198641
    +198647
    +198659
    +198673
    +198689
    +198701
    +198719
    +198733
    +198761
    +198769
    +198811
    +198817
    +198823
    +198827
    +198829
    +198833
    +198839
    +198841
    +198851
    +198859
    +198899
    +198901
    +198929
    +198937
    +198941
    +198943
    +198953
    +198959
    +198967
    +198971
    +198977
    +198997
    +199021
    +199033
    +199037
    +199039
    +199049
    +199081
    +199103
    +199109
    +199151
    +199153
    +199181
    +199193
    +199207
    +199211
    +199247
    +199261
    +199267
    +199289
    +199313
    +199321
    +199337
    +199343
    +199357
    +199373
    +199379
    +199399
    +199403
    +199411
    +199417
    +199429
    +199447
    +199453
    +199457
    +199483
    +199487
    +199489
    +199499
    +199501
    +199523
    +199559
    +199567
    +199583
    +199601
    +199603
    +199621
    +199637
    +199657
    +199669
    +199673
    +199679
    +199687
    +199697
    +199721
    +199729
    +199739
    +199741
    +199751
    +199753
    +199777
    +199783
    +199799
    +199807
    +199811
    +199813
    +199819
    +199831
    +199853
    +199873
    +199877
    +199889
    +199909
    +199921
    +199931
    +199933
    +199961
    +199967
    +199999
    +200003
    +200009
    +200017
    +200023
    +200029
    +200033
    +200041
    +200063
    +200087
    +200117
    +200131
    +200153
    +200159
    +200171
    +200177
    +200183
    +200191
    +200201
    +200227
    +200231
    +200237
    +200257
    +200273
    +200293
    +200297
    +200323
    +200329
    +200341
    +200351
    +200357
    +200363
    +200371
    +200381
    +200383
    +200401
    +200407
    +200437
    +200443
    +200461
    +200467
    +200483
    +200513
    +200569
    +200573
    +200579
    +200587
    +200591
    +200597
    +200609
    +200639
    +200657
    +200671
    +200689
    +200699
    +200713
    +200723
    +200731
    +200771
    +200779
    +200789
    +200797
    +200807
    +200843
    +200861
    +200867
    +200869
    +200881
    +200891
    +200899
    +200903
    +200909
    +200927
    +200929
    +200971
    +200983
    +200987
    +200989
    +201007
    +201011
    +201031
    +201037
    +201049
    +201073
    +201101
    +201107
    +201119
    +201121
    +201139
    +201151
    +201163
    +201167
    +201193
    +201203
    +201209
    +201211
    +201233
    +201247
    +201251
    +201281
    +201287
    +201307
    +201329
    +201337
    +201359
    +201389
    +201401
    +201403
    +201413
    +201437
    +201449
    +201451
    +201473
    +201491
    +201493
    +201497
    +201499
    +201511
    +201517
    +201547
    +201557
    +201577
    +201581
    +201589
    +201599
    +201611
    +201623
    +201629
    +201653
    +201661
    +201667
    +201673
    +201683
    +201701
    +201709
    +201731
    +201743
    +201757
    +201767
    +201769
    +201781
    +201787
    +201791
    +201797
    +201809
    +201821
    +201823
    +201827
    +201829
    +201833
    +201847
    +201881
    +201889
    +201893
    +201907
    +201911
    +201919
    +201923
    +201937
    +201947
    +201953
    +201961
    +201973
    +201979
    +201997
    +202001
    +202021
    +202031
    +202049
    +202061
    +202063
    +202067
    +202087
    +202099
    +202109
    +202121
    +202127
    +202129
    +202183
    +202187
    +202201
    +202219
    +202231
    +202243
    +202277
    +202289
    +202291
    +202309
    +202327
    +202339
    +202343
    +202357
    +202361
    +202381
    +202387
    +202393
    +202403
    +202409
    +202441
    +202471
    +202481
    +202493
    +202519
    +202529
    +202549
    +202567
    +202577
    +202591
    +202613
    +202621
    +202627
    +202637
    +202639
    +202661
    +202667
    +202679
    +202693
    +202717
    +202729
    +202733
    +202747
    +202751
    +202753
    +202757
    +202777
    +202799
    +202817
    +202823
    +202841
    +202859
    +202877
    +202879
    +202889
    +202907
    +202921
    +202931
    +202933
    +202949
    +202967
    +202973
    +202981
    +202987
    +202999
    +203011
    +203017
    +203023
    +203039
    +203051
    +203057
    +203117
    +203141
    +203173
    +203183
    +203207
    +203209
    +203213
    +203221
    +203227
    +203233
    +203249
    +203279
    +203293
    +203309
    +203311
    +203317
    +203321
    +203323
    +203339
    +203341
    +203351
    +203353
    +203363
    +203381
    +203383
    +203387
    +203393
    +203417
    +203419
    +203429
    +203431
    +203449
    +203459
    +203461
    +203531
    +203549
    +203563
    +203569
    +203579
    +203591
    +203617
    +203627
    +203641
    +203653
    +203657
    +203659
    +203663
    +203669
    +203713
    +203761
    +203767
    +203771
    +203773
    +203789
    +203807
    +203809
    +203821
    +203843
    +203857
    +203869
    +203873
    +203897
    +203909
    +203911
    +203921
    +203947
    +203953
    +203969
    +203971
    +203977
    +203989
    +203999
    +204007
    +204013
    +204019
    +204023
    +204047
    +204059
    +204067
    +204101
    +204107
    +204133
    +204137
    +204143
    +204151
    +204161
    +204163
    +204173
    +204233
    +204251
    +204299
    +204301
    +204311
    +204319
    +204329
    +204331
    +204353
    +204359
    +204361
    +204367
    +204371
    +204377
    +204397
    +204427
    +204431
    +204437
    +204439
    +204443
    +204461
    +204481
    +204487
    +204509
    +204511
    +204517
    +204521
    +204557
    +204563
    +204583
    +204587
    +204599
    +204601
    +204613
    +204623
    +204641
    +204667
    +204679
    +204707
    +204719
    +204733
    +204749
    +204751
    +204781
    +204791
    +204793
    +204797
    +204803
    +204821
    +204857
    +204859
    +204871
    +204887
    +204913
    +204917
    +204923
    +204931
    +204947
    +204973
    +204979
    +204983
    +205019
    +205031
    +205033
    +205043
    +205063
    +205069
    +205081
    +205097
    +205103
    +205111
    +205129
    +205133
    +205141
    +205151
    +205157
    +205171
    +205187
    +205201
    +205211
    +205213
    +205223
    +205237
    +205253
    +205267
    +205297
    +205307
    +205319
    +205327
    +205339
    +205357
    +205391
    +205397
    +205399
    +205417
    +205421
    +205423
    +205427
    +205433
    +205441
    +205453
    +205463
    +205477
    +205483
    +205487
    +205493
    +205507
    +205519
    +205529
    +205537
    +205549
    +205553
    +205559
    +205589
    +205603
    +205607
    +205619
    +205627
    +205633
    +205651
    +205657
    +205661
    +205663
    +205703
    +205721
    +205759
    +205763
    +205783
    +205817
    +205823
    +205837
    +205847
    +205879
    +205883
    +205913
    +205937
    +205949
    +205951
    +205957
    +205963
    +205967
    +205981
    +205991
    +205993
    +206009
    +206021
    +206027
    +206033
    +206039
    +206047
    +206051
    +206069
    +206077
    +206081
    +206083
    +206123
    +206153
    +206177
    +206179
    +206183
    +206191
    +206197
    +206203
    +206209
    +206221
    +206233
    +206237
    +206249
    +206251
    +206263
    +206273
    +206279
    +206281
    +206291
    +206299
    +206303
    +206341
    +206347
    +206351
    +206369
    +206383
    +206399
    +206407
    +206411
    +206413
    +206419
    +206447
    +206461
    +206467
    +206477
    +206483
    +206489
    +206501
    +206519
    +206527
    +206543
    +206551
    +206593
    +206597
    +206603
    +206623
    +206627
    +206639
    +206641
    +206651
    +206699
    +206749
    +206779
    +206783
    +206803
    +206807
    +206813
    +206819
    +206821
    +206827
    +206879
    +206887
    +206897
    +206909
    +206911
    +206917
    +206923
    +206933
    +206939
    +206951
    +206953
    +206993
    +207013
    +207017
    +207029
    +207037
    +207041
    +207061
    +207073
    +207079
    +207113
    +207121
    +207127
    +207139
    +207169
    +207187
    +207191
    +207197
    +207199
    +207227
    +207239
    +207241
    +207257
    +207269
    +207287
    +207293
    +207301
    +207307
    +207329
    +207331
    +207341
    +207343
    +207367
    +207371
    +207377
    +207401
    +207409
    +207433
    +207443
    +207457
    +207463
    +207469
    +207479
    +207481
    +207491
    +207497
    +207509
    +207511
    +207517
    +207521
    +207523
    +207541
    +207547
    +207551
    +207563
    +207569
    +207589
    +207593
    +207619
    +207629
    +207643
    +207653
    +207661
    +207671
    +207673
    +207679
    +207709
    +207719
    +207721
    +207743
    +207763
    +207769
    +207797
    +207799
    +207811
    +207821
    +207833
    +207847
    +207869
    +207877
    +207923
    +207931
    +207941
    +207947
    +207953
    +207967
    +207971
    +207973
    +207997
    +208001
    +208003
    +208009
    +208037
    +208049
    +208057
    +208067
    +208073
    +208099
    +208111
    +208121
    +208129
    +208139
    +208141
    +208147
    +208189
    +208207
    +208213
    +208217
    +208223
    +208231
    +208253
    +208261
    +208277
    +208279
    +208283
    +208291
    +208309
    +208319
    +208333
    +208337
    +208367
    +208379
    +208387
    +208391
    +208393
    +208409
    +208433
    +208441
    +208457
    +208459
    +208463
    +208469
    +208489
    +208493
    +208499
    +208501
    +208511
    +208513
    +208519
    +208529
    +208553
    +208577
    +208589
    +208591
    +208609
    +208627
    +208631
    +208657
    +208667
    +208673
    +208687
    +208697
    +208699
    +208721
    +208729
    +208739
    +208759
    +208787
    +208799
    +208807
    +208837
    +208843
    +208877
    +208889
    +208891
    +208907
    +208927
    +208931
    +208933
    +208961
    +208963
    +208991
    +208993
    +208997
    +209021
    +209029
    +209039
    +209063
    +209071
    +209089
    +209123
    +209147
    +209159
    +209173
    +209179
    +209189
    +209201
    +209203
    +209213
    +209221
    +209227
    +209233
    +209249
    +209257
    +209263
    +209267
    +209269
    +209299
    +209311
    +209317
    +209327
    +209333
    +209347
    +209353
    +209357
    +209359
    +209371
    +209381
    +209393
    +209401
    +209431
    +209441
    +209449
    +209459
    +209471
    +209477
    +209497
    +209519
    +209533
    +209543
    +209549
    +209563
    +209567
    +209569
    +209579
    +209581
    +209597
    +209621
    +209623
    +209639
    +209647
    +209659
    +209669
    +209687
    +209701
    +209707
    +209717
    +209719
    +209743
    +209767
    +209771
    +209789
    +209801
    +209809
    +209813
    +209819
    +209821
    +209837
    +209851
    +209857
    +209861
    +209887
    +209917
    +209927
    +209929
    +209939
    +209953
    +209959
    +209971
    +209977
    +209983
    +209987
    +210011
    +210019
    +210031
    +210037
    +210053
    +210071
    +210097
    +210101
    +210109
    +210113
    +210127
    +210131
    +210139
    +210143
    +210157
    +210169
    +210173
    +210187
    +210191
    +210193
    +210209
    +210229
    +210233
    +210241
    +210247
    +210257
    +210263
    +210277
    +210283
    +210299
    +210317
    +210319
    +210323
    +210347
    +210359
    +210361
    +210391
    +210401
    +210403
    +210407
    +210421
    +210437
    +210461
    +210467
    +210481
    +210487
    +210491
    +210499
    +210523
    +210527
    +210533
    +210557
    +210599
    +210601
    +210619
    +210631
    +210643
    +210659
    +210671
    +210709
    +210713
    +210719
    +210731
    +210739
    +210761
    +210773
    +210803
    +210809
    +210811
    +210823
    +210827
    +210839
    +210853
    +210857
    +210869
    +210901
    +210907
    +210911
    +210913
    +210923
    +210929
    +210943
    +210961
    +210967
    +211007
    +211039
    +211049
    +211051
    +211061
    +211063
    +211067
    +211073
    +211093
    +211097
    +211129
    +211151
    +211153
    +211177
    +211187
    +211193
    +211199
    +211213
    +211217
    +211219
    +211229
    +211231
    +211241
    +211247
    +211271
    +211283
    +211291
    +211297
    +211313
    +211319
    +211333
    +211339
    +211349
    +211369
    +211373
    +211403
    +211427
    +211433
    +211441
    +211457
    +211469
    +211493
    +211499
    +211501
    +211507
    +211543
    +211559
    +211571
    +211573
    +211583
    +211597
    +211619
    +211639
    +211643
    +211657
    +211661
    +211663
    +211681
    +211691
    +211693
    +211711
    +211723
    +211727
    +211741
    +211747
    +211777
    +211781
    +211789
    +211801
    +211811
    +211817
    +211859
    +211867
    +211873
    +211877
    +211879
    +211889
    +211891
    +211927
    +211931
    +211933
    +211943
    +211949
    +211969
    +211979
    +211997
    +212029
    +212039
    +212057
    +212081
    +212099
    +212117
    +212123
    +212131
    +212141
    +212161
    +212167
    +212183
    +212203
    +212207
    +212209
    +212227
    +212239
    +212243
    +212281
    +212293
    +212297
    +212353
    +212369
    +212383
    +212411
    +212419
    +212423
    +212437
    +212447
    +212453
    +212461
    +212467
    +212479
    +212501
    +212507
    +212557
    +212561
    +212573
    +212579
    +212587
    +212593
    +212627
    +212633
    +212651
    +212669
    +212671
    +212677
    +212683
    +212701
    +212777
    +212791
    +212801
    +212827
    +212837
    +212843
    +212851
    +212867
    +212869
    +212873
    +212881
    +212897
    +212903
    +212909
    +212917
    +212923
    +212969
    +212981
    +212987
    +212999
    +213019
    +213023
    +213029
    +213043
    +213067
    +213079
    +213091
    +213097
    +213119
    +213131
    +213133
    +213139
    +213149
    +213173
    +213181
    +213193
    +213203
    +213209
    +213217
    +213223
    +213229
    +213247
    +213253
    +213263
    +213281
    +213287
    +213289
    +213307
    +213319
    +213329
    +213337
    +213349
    +213359
    +213361
    +213383
    +213391
    +213397
    +213407
    +213449
    +213461
    +213467
    +213481
    +213491
    +213523
    +213533
    +213539
    +213553
    +213557
    +213589
    +213599
    +213611
    +213613
    +213623
    +213637
    +213641
    +213649
    +213659
    +213713
    +213721
    +213727
    +213737
    +213751
    +213791
    +213799
    +213821
    +213827
    +213833
    +213847
    +213859
    +213881
    +213887
    +213901
    +213919
    +213929
    +213943
    +213947
    +213949
    +213953
    +213973
    +213977
    +213989
    +214003
    +214007
    +214009
    +214021
    +214031
    +214033
    +214043
    +214051
    +214063
    +214069
    +214087
    +214091
    +214129
    +214133
    +214141
    +214147
    +214163
    +214177
    +214189
    +214211
    +214213
    +214219
    +214237
    +214243
    +214259
    +214283
    +214297
    +214309
    +214351
    +214363
    +214373
    +214381
    +214391
    +214399
    +214433
    +214439
    +214451
    +214457
    +214463
    +214469
    +214481
    +214483
    +214499
    +214507
    +214517
    +214519
    +214531
    +214541
    +214559
    +214561
    +214589
    +214603
    +214607
    +214631
    +214639
    +214651
    +214657
    +214663
    +214667
    +214673
    +214691
    +214723
    +214729
    +214733
    +214741
    +214759
    +214763
    +214771
    +214783
    +214787
    +214789
    +214807
    +214811
    +214817
    +214831
    +214849
    +214853
    +214867
    +214883
    +214891
    +214913
    +214939
    +214943
    +214967
    +214987
    +214993
    +215051
    +215063
    +215077
    +215087
    +215123
    +215141
    +215143
    +215153
    +215161
    +215179
    +215183
    +215191
    +215197
    +215239
    +215249
    +215261
    +215273
    +215279
    +215297
    +215309
    +215317
    +215329
    +215351
    +215353
    +215359
    +215381
    +215389
    +215393
    +215399
    +215417
    +215443
    +215447
    +215459
    +215461
    +215471
    +215483
    +215497
    +215503
    +215507
    +215521
    +215531
    +215563
    +215573
    +215587
    +215617
    +215653
    +215659
    +215681
    +215687
    +215689
    +215693
    +215723
    +215737
    +215753
    +215767
    +215771
    +215797
    +215801
    +215827
    +215833
    +215843
    +215851
    +215857
    +215863
    +215893
    +215899
    +215909
    +215921
    +215927
    +215939
    +215953
    +215959
    +215981
    +215983
    +216023
    +216037
    +216061
    +216071
    +216091
    +216103
    +216107
    +216113
    +216119
    +216127
    +216133
    +216149
    +216157
    +216173
    +216179
    +216211
    +216217
    +216233
    +216259
    +216263
    +216289
    +216317
    +216319
    +216329
    +216347
    +216371
    +216373
    +216379
    +216397
    +216401
    +216421
    +216431
    +216451
    +216481
    +216493
    +216509
    +216523
    +216551
    +216553
    +216569
    +216571
    +216577
    +216607
    +216617
    +216641
    +216647
    +216649
    +216653
    +216661
    +216679
    +216703
    +216719
    +216731
    +216743
    +216751
    +216757
    +216761
    +216779
    +216781
    +216787
    +216791
    +216803
    +216829
    +216841
    +216851
    +216859
    +216877
    +216899
    +216901
    +216911
    +216917
    +216919
    +216947
    +216967
    +216973
    +216991
    +217001
    +217003
    +217027
    +217033
    +217057
    +217069
    +217081
    +217111
    +217117
    +217121
    +217157
    +217163
    +217169
    +217199
    +217201
    +217207
    +217219
    +217223
    +217229
    +217241
    +217253
    +217271
    +217307
    +217309
    +217313
    +217319
    +217333
    +217337
    +217339
    +217351
    +217361
    +217363
    +217367
    +217369
    +217387
    +217397
    +217409
    +217411
    +217421
    +217429
    +217439
    +217457
    +217463
    +217489
    +217499
    +217517
    +217519
    +217559
    +217561
    +217573
    +217577
    +217579
    +217619
    +217643
    +217661
    +217667
    +217681
    +217687
    +217691
    +217697
    +217717
    +217727
    +217733
    +217739
    +217747
    +217771
    +217781
    +217793
    +217823
    +217829
    +217849
    +217859
    +217901
    +217907
    +217909
    +217933
    +217937
    +217969
    +217979
    +217981
    +218003
    +218021
    +218047
    +218069
    +218077
    +218081
    +218083
    +218087
    +218107
    +218111
    +218117
    +218131
    +218137
    +218143
    +218149
    +218171
    +218191
    +218213
    +218227
    +218233
    +218249
    +218279
    +218287
    +218357
    +218363
    +218371
    +218381
    +218389
    +218401
    +218417
    +218419
    +218423
    +218437
    +218447
    +218453
    +218459
    +218461
    +218479
    +218509
    +218513
    +218521
    +218527
    +218531
    +218549
    +218551
    +218579
    +218591
    +218599
    +218611
    +218623
    +218627
    +218629
    +218641
    +218651
    +218657
    +218677
    +218681
    +218711
    +218717
    +218719
    +218723
    +218737
    +218749
    +218761
    +218783
    +218797
    +218809
    +218819
    +218833
    +218839
    +218843
    +218849
    +218857
    +218873
    +218887
    +218923
    +218941
    +218947
    +218963
    +218969
    +218971
    +218987
    +218989
    +218993
    +219001
    +219017
    +219019
    +219031
    +219041
    +219053
    +219059
    +219071
    +219083
    +219091
    +219097
    +219103
    +219119
    +219133
    +219143
    +219169
    +219187
    +219217
    +219223
    +219251
    +219277
    +219281
    +219293
    +219301
    +219311
    +219313
    +219353
    +219361
    +219371
    +219377
    +219389
    +219407
    +219409
    +219433
    +219437
    +219451
    +219463
    +219467
    +219491
    +219503
    +219517
    +219523
    +219529
    +219533
    +219547
    +219577
    +219587
    +219599
    +219607
    +219613
    +219619
    +219629
    +219647
    +219649
    +219677
    +219679
    +219683
    +219689
    +219707
    +219721
    +219727
    +219731
    +219749
    +219757
    +219761
    +219763
    +219767
    +219787
    +219797
    +219799
    +219809
    +219823
    +219829
    +219839
    +219847
    +219851
    +219871
    +219881
    +219889
    +219911
    +219917
    +219931
    +219937
    +219941
    +219943
    +219953
    +219959
    +219971
    +219977
    +219979
    +219983
    +220009
    +220013
    +220019
    +220021
    +220057
    +220063
    +220123
    +220141
    +220147
    +220151
    +220163
    +220169
    +220177
    +220189
    +220217
    +220243
    +220279
    +220291
    +220301
    +220307
    +220327
    +220333
    +220351
    +220357
    +220361
    +220369
    +220373
    +220391
    +220399
    +220403
    +220411
    +220421
    +220447
    +220469
    +220471
    +220511
    +220513
    +220529
    +220537
    +220543
    +220553
    +220559
    +220573
    +220579
    +220589
    +220613
    +220663
    +220667
    +220673
    +220681
    +220687
    +220699
    +220709
    +220721
    +220747
    +220757
    +220771
    +220783
    +220789
    +220793
    +220807
    +220811
    +220841
    +220859
    +220861
    +220873
    +220877
    +220879
    +220889
    +220897
    +220901
    +220903
    +220907
    +220919
    +220931
    +220933
    +220939
    +220973
    +221021
    +221047
    +221059
    +221069
    +221071
    +221077
    +221083
    +221087
    +221093
    +221101
    +221159
    +221171
    +221173
    +221197
    +221201
    +221203
    +221209
    +221219
    +221227
    +221233
    +221239
    +221251
    +221261
    +221281
    +221303
    +221311
    +221317
    +221327
    +221393
    +221399
    +221401
    +221411
    +221413
    +221447
    +221453
    +221461
    +221471
    +221477
    +221489
    +221497
    +221509
    +221537
    +221539
    +221549
    +221567
    +221581
    +221587
    +221603
    +221621
    +221623
    +221653
    +221657
    +221659
    +221671
    +221677
    +221707
    +221713
    +221717
    +221719
    +221723
    +221729
    +221737
    +221747
    +221773
    +221797
    +221807
    +221813
    +221827
    +221831
    +221849
    +221873
    +221891
    +221909
    +221941
    +221951
    +221953
    +221957
    +221987
    +221989
    +221999
    +222007
    +222011
    +222023
    +222029
    +222041
    +222043
    +222059
    +222067
    +222073
    +222107
    +222109
    +222113
    +222127
    +222137
    +222149
    +222151
    +222161
    +222163
    +222193
    +222197
    +222199
    +222247
    +222269
    +222289
    +222293
    +222311
    +222317
    +222323
    +222329
    +222337
    +222347
    +222349
    +222361
    +222367
    +222379
    +222389
    +222403
    +222419
    +222437
    +222461
    +222493
    +222499
    +222511
    +222527
    +222533
    +222553
    +222557
    +222587
    +222601
    +222613
    +222619
    +222643
    +222647
    +222659
    +222679
    +222707
    +222713
    +222731
    +222773
    +222779
    +222787
    +222791
    +222793
    +222799
    +222823
    +222839
    +222841
    +222857
    +222863
    +222877
    +222883
    +222913
    +222919
    +222931
    +222941
    +222947
    +222953
    +222967
    +222977
    +222979
    +222991
    +223007
    +223009
    +223019
    +223037
    +223049
    +223051
    +223061
    +223063
    +223087
    +223099
    +223103
    +223129
    +223133
    +223151
    +223207
    +223211
    +223217
    +223219
    +223229
    +223241
    +223243
    +223247
    +223253
    +223259
    +223273
    +223277
    +223283
    +223291
    +223303
    +223313
    +223319
    +223331
    +223337
    +223339
    +223361
    +223367
    +223381
    +223403
    +223423
    +223429
    +223439
    +223441
    +223463
    +223469
    +223481
    +223493
    +223507
    +223529
    +223543
    +223547
    +223549
    +223577
    +223589
    +223621
    +223633
    +223637
    +223667
    +223679
    +223681
    +223697
    +223711
    +223747
    +223753
    +223757
    +223759
    +223781
    +223823
    +223829
    +223831
    +223837
    +223841
    +223843
    +223849
    +223903
    +223919
    +223921
    +223939
    +223963
    +223969
    +223999
    +224011
    +224027
    +224033
    +224041
    +224047
    +224057
    +224069
    +224071
    +224101
    +224113
    +224129
    +224131
    +224149
    +224153
    +224171
    +224177
    +224197
    +224201
    +224209
    +224221
    +224233
    +224239
    +224251
    +224261
    +224267
    +224291
    +224299
    +224303
    +224309
    +224317
    +224327
    +224351
    +224359
    +224363
    +224401
    +224423
    +224429
    +224443
    +224449
    +224461
    +224467
    +224473
    +224491
    +224501
    +224513
    +224527
    +224563
    +224569
    +224579
    +224591
    +224603
    +224611
    +224617
    +224629
    +224633
    +224669
    +224677
    +224683
    +224699
    +224711
    +224717
    +224729
    +224737
    +224743
    +224759
    +224771
    +224797
    +224813
    +224831
    +224863
    +224869
    +224881
    +224891
    +224897
    +224909
    +224911
    +224921
    +224929
    +224947
    +224951
    +224969
    +224977
    +224993
    +225023
    +225037
    +225061
    +225067
    +225077
    +225079
    +225089
    +225109
    +225119
    +225133
    +225143
    +225149
    +225157
    +225161
    +225163
    +225167
    +225217
    +225221
    +225223
    +225227
    +225241
    +225257
    +225263
    +225287
    +225289
    +225299
    +225307
    +225341
    +225343
    +225347
    +225349
    +225353
    +225371
    +225373
    +225383
    +225427
    +225431
    +225457
    +225461
    +225479
    +225493
    +225499
    +225503
    +225509
    +225523
    +225527
    +225529
    +225569
    +225581
    +225583
    +225601
    +225611
    +225613
    +225619
    +225629
    +225637
    +225671
    +225683
    +225689
    +225697
    +225721
    +225733
    +225749
    +225751
    +225767
    +225769
    +225779
    +225781
    +225809
    +225821
    +225829
    +225839
    +225859
    +225871
    +225889
    +225919
    +225931
    +225941
    +225943
    +225949
    +225961
    +225977
    +225983
    +225989
    +226001
    +226007
    +226013
    +226027
    +226063
    +226087
    +226099
    +226103
    +226123
    +226129
    +226133
    +226141
    +226169
    +226183
    +226189
    +226199
    +226201
    +226217
    +226231
    +226241
    +226267
    +226283
    +226307
    +226313
    +226337
    +226357
    +226367
    +226379
    +226381
    +226397
    +226409
    +226427
    +226433
    +226451
    +226453
    +226463
    +226483
    +226487
    +226511
    +226531
    +226547
    +226549
    +226553
    +226571
    +226601
    +226609
    +226621
    +226631
    +226637
    +226643
    +226649
    +226657
    +226663
    +226669
    +226691
    +226697
    +226741
    +226753
    +226769
    +226777
    +226783
    +226789
    +226799
    +226813
    +226817
    +226819
    +226823
    +226843
    +226871
    +226901
    +226903
    +226907
    +226913
    +226937
    +226943
    +226991
    +227011
    +227027
    +227053
    +227081
    +227089
    +227093
    +227111
    +227113
    +227131
    +227147
    +227153
    +227159
    +227167
    +227177
    +227189
    +227191
    +227207
    +227219
    +227231
    +227233
    +227251
    +227257
    +227267
    +227281
    +227299
    +227303
    +227363
    +227371
    +227377
    +227387
    +227393
    +227399
    +227407
    +227419
    +227431
    +227453
    +227459
    +227467
    +227471
    +227473
    +227489
    +227497
    +227501
    +227519
    +227531
    +227533
    +227537
    +227561
    +227567
    +227569
    +227581
    +227593
    +227597
    +227603
    +227609
    +227611
    +227627
    +227629
    +227651
    +227653
    +227663
    +227671
    +227693
    +227699
    +227707
    +227719
    +227729
    +227743
    +227789
    +227797
    +227827
    +227849
    +227869
    +227873
    +227893
    +227947
    +227951
    +227977
    +227989
    +227993
    +228013
    +228023
    +228049
    +228061
    +228077
    +228097
    +228103
    +228113
    +228127
    +228131
    +228139
    +228181
    +228197
    +228199
    +228203
    +228211
    +228223
    +228233
    +228251
    +228257
    +228281
    +228299
    +228301
    +228307
    +228311
    +228331
    +228337
    +228341
    +228353
    +228359
    +228383
    +228409
    +228419
    +228421
    +228427
    +228443
    +228451
    +228457
    +228461
    +228469
    +228479
    +228509
    +228511
    +228517
    +228521
    +228523
    +228539
    +228559
    +228577
    +228581
    +228587
    +228593
    +228601
    +228611
    +228617
    +228619
    +228637
    +228647
    +228677
    +228707
    +228713
    +228731
    +228733
    +228737
    +228751
    +228757
    +228773
    +228793
    +228797
    +228799
    +228829
    +228841
    +228847
    +228853
    +228859
    +228869
    +228881
    +228883
    +228887
    +228901
    +228911
    +228913
    +228923
    +228929
    +228953
    +228959
    +228961
    +228983
    +228989
    +229003
    +229027
    +229037
    +229081
    +229093
    +229123
    +229127
    +229133
    +229139
    +229153
    +229157
    +229171
    +229181
    +229189
    +229199
    +229213
    +229217
    +229223
    +229237
    +229247
    +229249
    +229253
    +229261
    +229267
    +229283
    +229309
    +229321
    +229343
    +229351
    +229373
    +229393
    +229399
    +229403
    +229409
    +229423
    +229433
    +229459
    +229469
    +229487
    +229499
    +229507
    +229519
    +229529
    +229547
    +229549
    +229553
    +229561
    +229583
    +229589
    +229591
    +229601
    +229613
    +229627
    +229631
    +229637
    +229639
    +229681
    +229693
    +229699
    +229703
    +229711
    +229717
    +229727
    +229739
    +229751
    +229753
    +229759
    +229763
    +229769
    +229771
    +229777
    +229781
    +229799
    +229813
    +229819
    +229837
    +229841
    +229847
    +229849
    +229897
    +229903
    +229937
    +229939
    +229949
    +229961
    +229963
    +229979
    +229981
    +230003
    +230017
    +230047
    +230059
    +230063
    +230077
    +230081
    +230089
    +230101
    +230107
    +230117
    +230123
    +230137
    +230143
    +230149
    +230189
    +230203
    +230213
    +230221
    +230227
    +230233
    +230239
    +230257
    +230273
    +230281
    +230291
    +230303
    +230309
    +230311
    +230327
    +230339
    +230341
    +230353
    +230357
    +230369
    +230383
    +230387
    +230389
    +230393
    +230431
    +230449
    +230453
    +230467
    +230471
    +230479
    +230501
    +230507
    +230539
    +230551
    +230561
    +230563
    +230567
    +230597
    +230611
    +230647
    +230653
    +230663
    +230683
    +230693
    +230719
    +230729
    +230743
    +230761
    +230767
    +230771
    +230773
    +230779
    +230807
    +230819
    +230827
    +230833
    +230849
    +230861
    +230863
    +230873
    +230891
    +230929
    +230933
    +230939
    +230941
    +230959
    +230969
    +230977
    +230999
    +231001
    +231017
    +231019
    +231031
    +231041
    +231053
    +231067
    +231079
    +231107
    +231109
    +231131
    +231169
    +231197
    +231223
    +231241
    +231269
    +231271
    +231277
    +231289
    +231293
    +231299
    +231317
    +231323
    +231331
    +231347
    +231349
    +231359
    +231367
    +231379
    +231409
    +231419
    +231431
    +231433
    +231443
    +231461
    +231463
    +231479
    +231481
    +231493
    +231503
    +231529
    +231533
    +231547
    +231551
    +231559
    +231563
    +231571
    +231589
    +231599
    +231607
    +231611
    +231613
    +231631
    +231643
    +231661
    +231677
    +231701
    +231709
    +231719
    +231779
    +231799
    +231809
    +231821
    +231823
    +231827
    +231839
    +231841
    +231859
    +231871
    +231877
    +231893
    +231901
    +231919
    +231923
    +231943
    +231947
    +231961
    +231967
    +232003
    +232007
    +232013
    +232049
    +232051
    +232073
    +232079
    +232081
    +232091
    +232103
    +232109
    +232117
    +232129
    +232153
    +232171
    +232187
    +232189
    +232207
    +232217
    +232259
    +232303
    +232307
    +232333
    +232357
    +232363
    +232367
    +232381
    +232391
    +232409
    +232411
    +232417
    +232433
    +232439
    +232451
    +232457
    +232459
    +232487
    +232499
    +232513
    +232523
    +232549
    +232567
    +232571
    +232591
    +232597
    +232607
    +232621
    +232633
    +232643
    +232663
    +232669
    +232681
    +232699
    +232709
    +232711
    +232741
    +232751
    +232753
    +232777
    +232801
    +232811
    +232819
    +232823
    +232847
    +232853
    +232861
    +232871
    +232877
    +232891
    +232901
    +232907
    +232919
    +232937
    +232961
    +232963
    +232987
    +233021
    +233069
    +233071
    +233083
    +233113
    +233117
    +233141
    +233143
    +233159
    +233161
    +233173
    +233183
    +233201
    +233221
    +233231
    +233239
    +233251
    +233267
    +233279
    +233293
    +233297
    +233323
    +233327
    +233329
    +233341
    +233347
    +233353
    +233357
    +233371
    +233407
    +233417
    +233419
    +233423
    +233437
    +233477
    +233489
    +233509
    +233549
    +233551
    +233557
    +233591
    +233599
    +233609
    +233617
    +233621
    +233641
    +233663
    +233669
    +233683
    +233687
    +233689
    +233693
    +233713
    +233743
    +233747
    +233759
    +233777
    +233837
    +233851
    +233861
    +233879
    +233881
    +233911
    +233917
    +233921
    +233923
    +233939
    +233941
    +233969
    +233983
    +233993
    +234007
    +234029
    +234043
    +234067
    +234083
    +234089
    +234103
    +234121
    +234131
    +234139
    +234149
    +234161
    +234167
    +234181
    +234187
    +234191
    +234193
    +234197
    +234203
    +234211
    +234217
    +234239
    +234259
    +234271
    +234281
    +234287
    +234293
    +234317
    +234319
    +234323
    +234331
    +234341
    +234343
    +234361
    +234383
    +234431
    +234457
    +234461
    +234463
    +234467
    +234473
    +234499
    +234511
    +234527
    +234529
    +234539
    +234541
    +234547
    +234571
    +234587
    +234589
    +234599
    +234613
    +234629
    +234653
    +234659
    +234673
    +234683
    +234713
    +234721
    +234727
    +234733
    +234743
    +234749
    +234769
    +234781
    +234791
    +234799
    +234803
    +234809
    +234811
    +234833
    +234847
    +234851
    +234863
    +234869
    +234893
    +234907
    +234917
    +234931
    +234947
    +234959
    +234961
    +234967
    +234977
    +234979
    +234989
    +235003
    +235007
    +235009
    +235013
    +235043
    +235051
    +235057
    +235069
    +235091
    +235099
    +235111
    +235117
    +235159
    +235171
    +235177
    +235181
    +235199
    +235211
    +235231
    +235241
    +235243
    +235273
    +235289
    +235307
    +235309
    +235337
    +235349
    +235369
    +235397
    +235439
    +235441
    +235447
    +235483
    +235489
    +235493
    +235513
    +235519
    +235523
    +235537
    +235541
    +235553
    +235559
    +235577
    +235591
    +235601
    +235607
    +235621
    +235661
    +235663
    +235673
    +235679
    +235699
    +235723
    +235747
    +235751
    +235783
    +235787
    +235789
    +235793
    +235811
    +235813
    +235849
    +235871
    +235877
    +235889
    +235891
    +235901
    +235919
    +235927
    +235951
    +235967
    +235979
    +235997
    +236017
    +236021
    +236053
    +236063
    +236069
    +236077
    +236087
    +236107
    +236111
    +236129
    +236143
    +236153
    +236167
    +236207
    +236209
    +236219
    +236231
    +236261
    +236287
    +236293
    +236297
    +236323
    +236329
    +236333
    +236339
    +236377
    +236381
    +236387
    +236399
    +236407
    +236429
    +236449
    +236461
    +236471
    +236477
    +236479
    +236503
    +236507
    +236519
    +236527
    +236549
    +236563
    +236573
    +236609
    +236627
    +236641
    +236653
    +236659
    +236681
    +236699
    +236701
    +236707
    +236713
    +236723
    +236729
    +236737
    +236749
    +236771
    +236773
    +236779
    +236783
    +236807
    +236813
    +236867
    +236869
    +236879
    +236881
    +236891
    +236893
    +236897
    +236909
    +236917
    +236947
    +236981
    +236983
    +236993
    +237011
    +237019
    +237043
    +237053
    +237067
    +237071
    +237073
    +237089
    +237091
    +237137
    +237143
    +237151
    +237157
    +237161
    +237163
    +237173
    +237179
    +237203
    +237217
    +237233
    +237257
    +237271
    +237277
    +237283
    +237287
    +237301
    +237313
    +237319
    +237331
    +237343
    +237361
    +237373
    +237379
    +237401
    +237409
    +237467
    +237487
    +237509
    +237547
    +237563
    +237571
    +237581
    +237607
    +237619
    +237631
    +237673
    +237683
    +237689
    +237691
    +237701
    +237707
    +237733
    +237737
    +237749
    +237763
    +237767
    +237781
    +237791
    +237821
    +237851
    +237857
    +237859
    +237877
    +237883
    +237901
    +237911
    +237929
    +237959
    +237967
    +237971
    +237973
    +237977
    +237997
    +238001
    +238009
    +238019
    +238031
    +238037
    +238039
    +238079
    +238081
    +238093
    +238099
    +238103
    +238109
    +238141
    +238151
    +238157
    +238159
    +238163
    +238171
    +238181
    +238201
    +238207
    +238213
    +238223
    +238229
    +238237
    +238247
    +238261
    +238267
    +238291
    +238307
    +238313
    +238321
    +238331
    +238339
    +238361
    +238363
    +238369
    +238373
    +238397
    +238417
    +238423
    +238439
    +238451
    +238463
    +238471
    +238477
    +238481
    +238499
    +238519
    +238529
    +238531
    +238547
    +238573
    +238591
    +238627
    +238639
    +238649
    +238657
    +238673
    +238681
    +238691
    +238703
    +238709
    +238723
    +238727
    +238729
    +238747
    +238759
    +238781
    +238789
    +238801
    +238829
    +238837
    +238841
    +238853
    +238859
    +238877
    +238879
    +238883
    +238897
    +238919
    +238921
    +238939
    +238943
    +238949
    +238967
    +238991
    +239017
    +239023
    +239027
    +239053
    +239069
    +239081
    +239087
    +239119
    +239137
    +239147
    +239167
    +239171
    +239179
    +239201
    +239231
    +239233
    +239237
    +239243
    +239251
    +239263
    +239273
    +239287
    +239297
    +239329
    +239333
    +239347
    +239357
    +239383
    +239387
    +239389
    +239417
    +239423
    +239429
    +239431
    +239441
    +239461
    +239489
    +239509
    +239521
    +239527
    +239531
    +239539
    +239543
    +239557
    +239567
    +239579
    +239587
    +239597
    +239611
    +239623
    +239633
    +239641
    +239671
    +239689
    +239699
    +239711
    +239713
    +239731
    +239737
    +239753
    +239779
    +239783
    +239803
    +239807
    +239831
    +239843
    +239849
    +239851
    +239857
    +239873
    +239879
    +239893
    +239929
    +239933
    +239947
    +239957
    +239963
    +239977
    +239999
    +240007
    +240011
    +240017
    +240041
    +240043
    +240047
    +240049
    +240059
    +240073
    +240089
    +240101
    +240109
    +240113
    +240131
    +240139
    +240151
    +240169
    +240173
    +240197
    +240203
    +240209
    +240257
    +240259
    +240263
    +240271
    +240283
    +240287
    +240319
    +240341
    +240347
    +240349
    +240353
    +240371
    +240379
    +240421
    +240433
    +240437
    +240473
    +240479
    +240491
    +240503
    +240509
    +240517
    +240551
    +240571
    +240587
    +240589
    +240599
    +240607
    +240623
    +240631
    +240641
    +240659
    +240677
    +240701
    +240707
    +240719
    +240727
    +240733
    +240739
    +240743
    +240763
    +240769
    +240797
    +240811
    +240829
    +240841
    +240853
    +240859
    +240869
    +240881
    +240883
    +240893
    +240899
    +240913
    +240943
    +240953
    +240959
    +240967
    +240997
    +241013
    +241027
    +241037
    +241049
    +241051
    +241061
    +241067
    +241069
    +241079
    +241093
    +241117
    +241127
    +241141
    +241169
    +241177
    +241183
    +241207
    +241229
    +241249
    +241253
    +241259
    +241261
    +241271
    +241291
    +241303
    +241313
    +241321
    +241327
    +241333
    +241337
    +241343
    +241361
    +241363
    +241391
    +241393
    +241421
    +241429
    +241441
    +241453
    +241463
    +241469
    +241489
    +241511
    +241513
    +241517
    +241537
    +241543
    +241559
    +241561
    +241567
    +241589
    +241597
    +241601
    +241603
    +241639
    +241643
    +241651
    +241663
    +241667
    +241679
    +241687
    +241691
    +241711
    +241727
    +241739
    +241771
    +241781
    +241783
    +241793
    +241807
    +241811
    +241817
    +241823
    +241847
    +241861
    +241867
    +241873
    +241877
    +241883
    +241903
    +241907
    +241919
    +241921
    +241931
    +241939
    +241951
    +241963
    +241973
    +241979
    +241981
    +241993
    +242009
    +242057
    +242059
    +242069
    +242083
    +242093
    +242101
    +242119
    +242129
    +242147
    +242161
    +242171
    +242173
    +242197
    +242201
    +242227
    +242243
    +242257
    +242261
    +242273
    +242279
    +242309
    +242329
    +242357
    +242371
    +242377
    +242393
    +242399
    +242413
    +242419
    +242441
    +242447
    +242449
    +242453
    +242467
    +242479
    +242483
    +242491
    +242509
    +242519
    +242521
    +242533
    +242551
    +242591
    +242603
    +242617
    +242621
    +242629
    +242633
    +242639
    +242647
    +242659
    +242677
    +242681
    +242689
    +242713
    +242729
    +242731
    +242747
    +242773
    +242779
    +242789
    +242797
    +242807
    +242813
    +242819
    +242863
    +242867
    +242873
    +242887
    +242911
    +242923
    +242927
    +242971
    +242989
    +242999
    +243011
    +243031
    +243073
    +243077
    +243091
    +243101
    +243109
    +243119
    +243121
    +243137
    +243149
    +243157
    +243161
    +243167
    +243197
    +243203
    +243209
    +243227
    +243233
    +243239
    +243259
    +243263
    +243301
    +243311
    +243343
    +243367
    +243391
    +243401
    +243403
    +243421
    +243431
    +243433
    +243437
    +243461
    +243469
    +243473
    +243479
    +243487
    +243517
    +243521
    +243527
    +243533
    +243539
    +243553
    +243577
    +243583
    +243587
    +243589
    +243613
    +243623
    +243631
    +243643
    +243647
    +243671
    +243673
    +243701
    +243703
    +243707
    +243709
    +243769
    +243781
    +243787
    +243799
    +243809
    +243829
    +243839
    +243851
    +243857
    +243863
    +243871
    +243889
    +243911
    +243917
    +243931
    +243953
    +243973
    +243989
    +244003
    +244009
    +244021
    +244033
    +244043
    +244087
    +244091
    +244109
    +244121
    +244129
    +244141
    +244147
    +244157
    +244159
    +244177
    +244199
    +244217
    +244219
    +244243
    +244247
    +244253
    +244261
    +244291
    +244297
    +244301
    +244303
    +244313
    +244333
    +244339
    +244351
    +244357
    +244367
    +244379
    +244381
    +244393
    +244399
    +244403
    +244411
    +244423
    +244429
    +244451
    +244457
    +244463
    +244471
    +244481
    +244493
    +244507
    +244529
    +244547
    +244553
    +244561
    +244567
    +244583
    +244589
    +244597
    +244603
    +244619
    +244633
    +244637
    +244639
    +244667
    +244669
    +244687
    +244691
    +244703
    +244711
    +244721
    +244733
    +244747
    +244753
    +244759
    +244781
    +244787
    +244813
    +244837
    +244841
    +244843
    +244859
    +244861
    +244873
    +244877
    +244889
    +244897
    +244901
    +244939
    +244943
    +244957
    +244997
    +245023
    +245029
    +245033
    +245039
    +245071
    +245083
    +245087
    +245107
    +245129
    +245131
    +245149
    +245171
    +245173
    +245177
    +245183
    +245209
    +245251
    +245257
    +245261
    +245269
    +245279
    +245291
    +245299
    +245317
    +245321
    +245339
    +245383
    +245389
    +245407
    +245411
    +245417
    +245419
    +245437
    +245471
    +245473
    +245477
    +245501
    +245513
    +245519
    +245521
    +245527
    +245533
    +245561
    +245563
    +245587
    +245591
    +245593
    +245621
    +245627
    +245629
    +245639
    +245653
    +245671
    +245681
    +245683
    +245711
    +245719
    +245723
    +245741
    +245747
    +245753
    +245759
    +245771
    +245783
    +245789
    +245821
    +245849
    +245851
    +245863
    +245881
    +245897
    +245899
    +245909
    +245911
    +245941
    +245963
    +245977
    +245981
    +245983
    +245989
    +246011
    +246017
    +246049
    +246073
    +246097
    +246119
    +246121
    +246131
    +246133
    +246151
    +246167
    +246173
    +246187
    +246193
    +246203
    +246209
    +246217
    +246223
    +246241
    +246247
    +246251
    +246271
    +246277
    +246289
    +246317
    +246319
    +246329
    +246343
    +246349
    +246361
    +246371
    +246391
    +246403
    +246439
    +246469
    +246473
    +246497
    +246509
    +246511
    +246523
    +246527
    +246539
    +246557
    +246569
    +246577
    +246599
    +246607
    +246611
    +246613
    +246637
    +246641
    +246643
    +246661
    +246683
    +246689
    +246707
    +246709
    +246713
    +246731
    +246739
    +246769
    +246773
    +246781
    +246787
    +246793
    +246803
    +246809
    +246811
    +246817
    +246833
    +246839
    +246889
    +246899
    +246907
    +246913
    +246919
    +246923
    +246929
    +246931
    +246937
    +246941
    +246947
    +246971
    +246979
    +247001
    +247007
    +247031
    +247067
    +247069
    +247073
    +247087
    +247099
    +247141
    +247183
    +247193
    +247201
    +247223
    +247229
    +247241
    +247249
    +247259
    +247279
    +247301
    +247309
    +247337
    +247339
    +247343
    +247363
    +247369
    +247381
    +247391
    +247393
    +247409
    +247421
    +247433
    +247439
    +247451
    +247463
    +247501
    +247519
    +247529
    +247531
    +247547
    +247553
    +247579
    +247591
    +247601
    +247603
    +247607
    +247609
    +247613
    +247633
    +247649
    +247651
    +247691
    +247693
    +247697
    +247711
    +247717
    +247729
    +247739
    +247759
    +247769
    +247771
    +247781
    +247799
    +247811
    +247813
    +247829
    +247847
    +247853
    +247873
    +247879
    +247889
    +247901
    +247913
    +247939
    +247943
    +247957
    +247991
    +247993
    +247997
    +247999
    +248021
    +248033
    +248041
    +248051
    +248057
    +248063
    +248071
    +248077
    +248089
    +248099
    +248117
    +248119
    +248137
    +248141
    +248161
    +248167
    +248177
    +248179
    +248189
    +248201
    +248203
    +248231
    +248243
    +248257
    +248267
    +248291
    +248293
    +248299
    +248309
    +248317
    +248323
    +248351
    +248357
    +248371
    +248389
    +248401
    +248407
    +248431
    +248441
    +248447
    +248461
    +248473
    +248477
    +248483
    +248509
    +248533
    +248537
    +248543
    +248569
    +248579
    +248587
    +248593
    +248597
    +248609
    +248621
    +248627
    +248639
    +248641
    +248657
    +248683
    +248701
    +248707
    +248719
    +248723
    +248737
    +248749
    +248753
    +248779
    +248783
    +248789
    +248797
    +248813
    +248821
    +248827
    +248839
    +248851
    +248861
    +248867
    +248869
    +248879
    +248887
    +248891
    +248893
    +248903
    +248909
    +248971
    +248981
    +248987
    +249017
    +249037
    +249059
    +249079
    +249089
    +249097
    +249103
    +249107
    +249127
    +249131
    +249133
    +249143
    +249181
    +249187
    +249199
    +249211
    +249217
    +249229
    +249233
    +249253
    +249257
    +249287
    +249311
    +249317
    +249329
    +249341
    +249367
    +249377
    +249383
    +249397
    +249419
    +249421
    +249427
    +249433
    +249437
    +249439
    +249449
    +249463
    +249497
    +249499
    +249503
    +249517
    +249521
    +249533
    +249539
    +249541
    +249563
    +249583
    +249589
    +249593
    +249607
    +249647
    +249659
    +249671
    +249677
    +249703
    +249721
    +249727
    +249737
    +249749
    +249763
    +249779
    +249797
    +249811
    +249827
    +249833
    +249853
    +249857
    +249859
    +249863
    +249871
    +249881
    +249911
    +249923
    +249943
    +249947
    +249967
    +249971
    +249973
    +249989
    +250007
    +250013
    +250027
    +250031
    +250037
    +250043
    +250049
    +250051
    +250057
    +250073
    +250091
    +250109
    +250123
    +250147
    +250153
    +250169
    +250199
    +250253
    +250259
    +250267
    +250279
    +250301
    +250307
    +250343
    +250361
    +250403
    +250409
    +250423
    +250433
    +250441
    +250451
    +250489
    +250499
    +250501
    +250543
    +250583
    +250619
    +250643
    +250673
    +250681
    +250687
    +250693
    +250703
    +250709
    +250721
    +250727
    +250739
    +250741
    +250751
    +250753
    +250777
    +250787
    +250793
    +250799
    +250807
    +250813
    +250829
    +250837
    +250841
    +250853
    +250867
    +250871
    +250889
    +250919
    +250949
    +250951
    +250963
    +250967
    +250969
    +250979
    +250993
    +251003
    +251033
    +251051
    +251057
    +251059
    +251063
    +251071
    +251081
    +251087
    +251099
    +251117
    +251143
    +251149
    +251159
    +251171
    +251177
    +251179
    +251191
    +251197
    +251201
    +251203
    +251219
    +251221
    +251231
    +251233
    +251257
    +251261
    +251263
    +251287
    +251291
    +251297
    +251323
    +251347
    +251353
    +251359
    +251387
    +251393
    +251417
    +251429
    +251431
    +251437
    +251443
    +251467
    +251473
    +251477
    +251483
    +251491
    +251501
    +251513
    +251519
    +251527
    +251533
    +251539
    +251543
    +251561
    +251567
    +251609
    +251611
    +251621
    +251623
    +251639
    +251653
    +251663
    +251677
    +251701
    +251707
    +251737
    +251761
    +251789
    +251791
    +251809
    +251831
    +251833
    +251843
    +251857
    +251861
    +251879
    +251887
    +251893
    +251897
    +251903
    +251917
    +251939
    +251941
    +251947
    +251969
    +251971
    +251983
    +252001
    +252013
    +252017
    +252029
    +252037
    +252079
    +252101
    +252139
    +252143
    +252151
    +252157
    +252163
    +252169
    +252173
    +252181
    +252193
    +252209
    +252223
    +252233
    +252253
    +252277
    +252283
    +252289
    +252293
    +252313
    +252319
    +252323
    +252341
    +252359
    +252383
    +252391
    +252401
    +252409
    +252419
    +252431
    +252443
    +252449
    +252457
    +252463
    +252481
    +252509
    +252533
    +252541
    +252559
    +252583
    +252589
    +252607
    +252611
    +252617
    +252641
    +252667
    +252691
    +252709
    +252713
    +252727
    +252731
    +252737
    +252761
    +252767
    +252779
    +252817
    +252823
    +252827
    +252829
    +252869
    +252877
    +252881
    +252887
    +252893
    +252899
    +252911
    +252913
    +252919
    +252937
    +252949
    +252971
    +252979
    +252983
    +253003
    +253013
    +253049
    +253063
    +253081
    +253103
    +253109
    +253133
    +253153
    +253157
    +253159
    +253229
    +253243
    +253247
    +253273
    +253307
    +253321
    +253343
    +253349
    +253361
    +253367
    +253369
    +253381
    +253387
    +253417
    +253423
    +253427
    +253433
    +253439
    +253447
    +253469
    +253481
    +253493
    +253501
    +253507
    +253531
    +253537
    +253543
    +253553
    +253567
    +253573
    +253601
    +253607
    +253609
    +253613
    +253633
    +253637
    +253639
    +253651
    +253661
    +253679
    +253681
    +253703
    +253717
    +253733
    +253741
    +253751
    +253763
    +253769
    +253777
    +253787
    +253789
    +253801
    +253811
    +253819
    +253823
    +253853
    +253867
    +253871
    +253879
    +253901
    +253907
    +253909
    +253919
    +253937
    +253949
    +253951
    +253969
    +253987
    +253993
    +253999
    +254003
    +254021
    +254027
    +254039
    +254041
    +254047
    +254053
    +254071
    +254083
    +254119
    +254141
    +254147
    +254161
    +254179
    +254197
    +254207
    +254209
    +254213
    +254249
    +254257
    +254279
    +254281
    +254291
    +254299
    +254329
    +254369
    +254377
    +254383
    +254389
    +254407
    +254413
    +254437
    +254447
    +254461
    +254489
    +254491
    +254519
    +254537
    +254557
    +254593
    +254623
    +254627
    +254647
    +254659
    +254663
    +254699
    +254713
    +254729
    +254731
    +254741
    +254747
    +254753
    +254773
    +254777
    +254783
    +254791
    +254803
    +254827
    +254831
    +254833
    +254857
    +254869
    +254873
    +254879
    +254887
    +254899
    +254911
    +254927
    +254929
    +254941
    +254959
    +254963
    +254971
    +254977
    +254987
    +254993
    +255007
    +255019
    +255023
    +255043
    +255049
    +255053
    +255071
    +255077
    +255083
    +255097
    +255107
    +255121
    +255127
    +255133
    +255137
    +255149
    +255173
    +255179
    +255181
    +255191
    +255193
    +255197
    +255209
    +255217
    +255239
    +255247
    +255251
    +255253
    +255259
    +255313
    +255329
    +255349
    +255361
    +255371
    +255383
    +255413
    +255419
    +255443
    +255457
    +255467
    +255469
    +255473
    +255487
    +255499
    +255503
    +255511
    +255517
    +255523
    +255551
    +255571
    +255587
    +255589
    +255613
    +255617
    +255637
    +255641
    +255649
    +255653
    +255659
    +255667
    +255679
    +255709
    +255713
    +255733
    +255743
    +255757
    +255763
    +255767
    +255803
    +255839
    +255841
    +255847
    +255851
    +255859
    +255869
    +255877
    +255887
    +255907
    +255917
    +255919
    +255923
    +255947
    +255961
    +255971
    +255973
    +255977
    +255989
    +256019
    +256021
    +256031
    +256033
    +256049
    +256057
    +256079
    +256093
    +256117
    +256121
    +256129
    +256133
    +256147
    +256163
    +256169
    +256181
    +256187
    +256189
    +256199
    +256211
    +256219
    +256279
    +256301
    +256307
    +256313
    +256337
    +256349
    +256363
    +256369
    +256391
    +256393
    +256423
    +256441
    +256469
    +256471
    +256483
    +256489
    +256493
    +256499
    +256517
    +256541
    +256561
    +256567
    +256577
    +256579
    +256589
    +256603
    +256609
    +256639
    +256643
    +256651
    +256661
    +256687
    +256699
    +256721
    +256723
    +256757
    +256771
    +256799
    +256801
    +256813
    +256831
    +256873
    +256877
    +256889
    +256901
    +256903
    +256931
    +256939
    +256957
    +256967
    +256981
    +257003
    +257017
    +257053
    +257069
    +257077
    +257093
    +257099
    +257107
    +257123
    +257141
    +257161
    +257171
    +257177
    +257189
    +257219
    +257221
    +257239
    +257249
    +257263
    +257273
    +257281
    +257287
    +257293
    +257297
    +257311
    +257321
    +257339
    +257351
    +257353
    +257371
    +257381
    +257399
    +257401
    +257407
    +257437
    +257443
    +257447
    +257459
    +257473
    +257489
    +257497
    +257501
    +257503
    +257519
    +257539
    +257561
    +257591
    +257611
    +257627
    +257639
    +257657
    +257671
    +257687
    +257689
    +257707
    +257711
    +257713
    +257717
    +257731
    +257783
    +257791
    +257797
    +257837
    +257857
    +257861
    +257863
    +257867
    +257869
    +257879
    +257893
    +257903
    +257921
    +257947
    +257953
    +257981
    +257987
    +257989
    +257993
    +258019
    +258023
    +258031
    +258061
    +258067
    +258101
    +258107
    +258109
    +258113
    +258119
    +258127
    +258131
    +258143
    +258157
    +258161
    +258173
    +258197
    +258211
    +258233
    +258241
    +258253
    +258277
    +258283
    +258299
    +258317
    +258319
    +258329
    +258331
    +258337
    +258353
    +258373
    +258389
    +258403
    +258407
    +258413
    +258421
    +258437
    +258443
    +258449
    +258469
    +258487
    +258491
    +258499
    +258521
    +258527
    +258539
    +258551
    +258563
    +258569
    +258581
    +258607
    +258611
    +258613
    +258617
    +258623
    +258631
    +258637
    +258659
    +258673
    +258677
    +258691
    +258697
    +258703
    +258707
    +258721
    +258733
    +258737
    +258743
    +258763
    +258779
    +258787
    +258803
    +258809
    +258827
    +258847
    +258871
    +258887
    +258917
    +258919
    +258949
    +258959
    +258967
    +258971
    +258977
    +258983
    +258991
    +259001
    +259009
    +259019
    +259033
    +259099
    +259121
    +259123
    +259151
    +259157
    +259159
    +259163
    +259169
    +259177
    +259183
    +259201
    +259211
    +259213
    +259219
    +259229
    +259271
    +259277
    +259309
    +259321
    +259339
    +259379
    +259381
    +259387
    +259397
    +259411
    +259421
    +259429
    +259451
    +259453
    +259459
    +259499
    +259507
    +259517
    +259531
    +259537
    +259547
    +259577
    +259583
    +259603
    +259619
    +259621
    +259627
    +259631
    +259639
    +259643
    +259657
    +259667
    +259681
    +259691
    +259697
    +259717
    +259723
    +259733
    +259751
    +259771
    +259781
    +259783
    +259801
    +259813
    +259823
    +259829
    +259837
    +259841
    +259867
    +259907
    +259933
    +259937
    +259943
    +259949
    +259967
    +259991
    +259993
    +260003
    +260009
    +260011
    +260017
    +260023
    +260047
    +260081
    +260089
    +260111
    +260137
    +260171
    +260179
    +260189
    +260191
    +260201
    +260207
    +260209
    +260213
    +260231
    +260263
    +260269
    +260317
    +260329
    +260339
    +260363
    +260387
    +260399
    +260411
    +260413
    +260417
    +260419
    +260441
    +260453
    +260461
    +260467
    +260483
    +260489
    +260527
    +260539
    +260543
    +260549
    +260551
    +260569
    +260573
    +260581
    +260587
    +260609
    +260629
    +260647
    +260651
    +260671
    +260677
    +260713
    +260717
    +260723
    +260747
    +260753
    +260761
    +260773
    +260791
    +260807
    +260809
    +260849
    +260857
    +260861
    +260863
    +260873
    +260879
    +260893
    +260921
    +260941
    +260951
    +260959
    +260969
    +260983
    +260987
    +260999
    +261011
    +261013
    +261017
    +261031
    +261043
    +261059
    +261061
    +261071
    +261077
    +261089
    +261101
    +261127
    +261167
    +261169
    +261223
    +261229
    +261241
    +261251
    +261271
    +261281
    +261301
    +261323
    +261329
    +261337
    +261347
    +261353
    +261379
    +261389
    +261407
    +261427
    +261431
    +261433
    +261439
    +261451
    +261463
    +261467
    +261509
    +261523
    +261529
    +261557
    +261563
    +261577
    +261581
    +261587
    +261593
    +261601
    +261619
    +261631
    +261637
    +261641
    +261643
    +261673
    +261697
    +261707
    +261713
    +261721
    +261739
    +261757
    +261761
    +261773
    +261787
    +261791
    +261799
    +261823
    +261847
    +261881
    +261887
    +261917
    +261959
    +261971
    +261973
    +261977
    +261983
    +262007
    +262027
    +262049
    +262051
    +262069
    +262079
    +262103
    +262109
    +262111
    +262121
    +262127
    +262133
    +262139
    +262147
    +262151
    +262153
    +262187
    +262193
    +262217
    +262231
    +262237
    +262253
    +262261
    +262271
    +262303
    +262313
    +262321
    +262331
    +262337
    +262349
    +262351
    +262369
    +262387
    +262391
    +262399
    +262411
    +262433
    +262459
    +262469
    +262489
    +262501
    +262511
    +262513
    +262519
    +262541
    +262543
    +262553
    +262567
    +262583
    +262597
    +262621
    +262627
    +262643
    +262649
    +262651
    +262657
    +262681
    +262693
    +262697
    +262709
    +262723
    +262733
    +262739
    +262741
    +262747
    +262781
    +262783
    +262807
    +262819
    +262853
    +262877
    +262883
    +262897
    +262901
    +262909
    +262937
    +262949
    +262957
    +262981
    +263009
    +263023
    +263047
    +263063
    +263071
    +263077
    +263083
    +263089
    +263101
    +263111
    +263119
    +263129
    +263167
    +263171
    +263183
    +263191
    +263201
    +263209
    +263213
    +263227
    +263239
    +263257
    +263267
    +263269
    +263273
    +263287
    +263293
    +263303
    +263323
    +263369
    +263383
    +263387
    +263399
    +263401
    +263411
    +263423
    +263429
    +263437
    +263443
    +263489
    +263491
    +263503
    +263513
    +263519
    +263521
    +263533
    +263537
    +263561
    +263567
    +263573
    +263591
    +263597
    +263609
    +263611
    +263621
    +263647
    +263651
    +263657
    +263677
    +263723
    +263729
    +263737
    +263759
    +263761
    +263803
    +263819
    +263821
    +263827
    +263843
    +263849
    +263863
    +263867
    +263869
    +263881
    +263899
    +263909
    +263911
    +263927
    +263933
    +263941
    +263951
    +263953
    +263957
    +263983
    +264007
    +264013
    +264029
    +264031
    +264053
    +264059
    +264071
    +264083
    +264091
    +264101
    +264113
    +264127
    +264133
    +264137
    +264139
    +264167
    +264169
    +264179
    +264211
    +264221
    +264263
    +264269
    +264283
    +264289
    +264301
    +264323
    +264331
    +264343
    +264349
    +264353
    +264359
    +264371
    +264391
    +264403
    +264437
    +264443
    +264463
    +264487
    +264527
    +264529
    +264553
    +264559
    +264577
    +264581
    +264599
    +264601
    +264619
    +264631
    +264637
    +264643
    +264659
    +264697
    +264731
    +264739
    +264743
    +264749
    +264757
    +264763
    +264769
    +264779
    +264787
    +264791
    +264793
    +264811
    +264827
    +264829
    +264839
    +264871
    +264881
    +264889
    +264893
    +264899
    +264919
    +264931
    +264949
    +264959
    +264961
    +264977
    +264991
    +264997
    +265003
    +265007
    +265021
    +265037
    +265079
    +265091
    +265093
    +265117
    +265123
    +265129
    +265141
    +265151
    +265157
    +265163
    +265169
    +265193
    +265207
    +265231
    +265241
    +265247
    +265249
    +265261
    +265271
    +265273
    +265277
    +265313
    +265333
    +265337
    +265339
    +265381
    +265399
    +265403
    +265417
    +265423
    +265427
    +265451
    +265459
    +265471
    +265483
    +265493
    +265511
    +265513
    +265541
    +265543
    +265547
    +265561
    +265567
    +265571
    +265579
    +265607
    +265613
    +265619
    +265621
    +265703
    +265709
    +265711
    +265717
    +265729
    +265739
    +265747
    +265757
    +265781
    +265787
    +265807
    +265813
    +265819
    +265831
    +265841
    +265847
    +265861
    +265871
    +265873
    +265883
    +265891
    +265921
    +265957
    +265961
    +265987
    +266003
    +266009
    +266023
    +266027
    +266029
    +266047
    +266051
    +266053
    +266059
    +266081
    +266083
    +266089
    +266093
    +266099
    +266111
    +266117
    +266129
    +266137
    +266153
    +266159
    +266177
    +266183
    +266221
    +266239
    +266261
    +266269
    +266281
    +266291
    +266293
    +266297
    +266333
    +266351
    +266353
    +266359
    +266369
    +266381
    +266401
    +266411
    +266417
    +266447
    +266449
    +266477
    +266479
    +266489
    +266491
    +266521
    +266549
    +266587
    +266599
    +266603
    +266633
    +266641
    +266647
    +266663
    +266671
    +266677
    +266681
    +266683
    +266687
    +266689
    +266701
    +266711
    +266719
    +266759
    +266767
    +266797
    +266801
    +266821
    +266837
    +266839
    +266863
    +266867
    +266891
    +266897
    +266899
    +266909
    +266921
    +266927
    +266933
    +266947
    +266953
    +266957
    +266971
    +266977
    +266983
    +266993
    +266999
    +267017
    +267037
    +267049
    +267097
    +267131
    +267133
    +267139
    +267143
    +267167
    +267187
    +267193
    +267199
    +267203
    +267217
    +267227
    +267229
    +267233
    +267259
    +267271
    +267277
    +267299
    +267301
    +267307
    +267317
    +267341
    +267353
    +267373
    +267389
    +267391
    +267401
    +267403
    +267413
    +267419
    +267431
    +267433
    +267439
    +267451
    +267469
    +267479
    +267481
    +267493
    +267497
    +267511
    +267517
    +267521
    +267523
    +267541
    +267551
    +267557
    +267569
    +267581
    +267587
    +267593
    +267601
    +267611
    +267613
    +267629
    +267637
    +267643
    +267647
    +267649
    +267661
    +267667
    +267671
    +267677
    +267679
    +267713
    +267719
    +267721
    +267727
    +267737
    +267739
    +267749
    +267763
    +267781
    +267791
    +267797
    +267803
    +267811
    +267829
    +267833
    +267857
    +267863
    +267877
    +267887
    +267893
    +267899
    +267901
    +267907
    +267913
    +267929
    +267941
    +267959
    +267961
    +268003
    +268013
    +268043
    +268049
    +268063
    +268069
    +268091
    +268123
    +268133
    +268153
    +268171
    +268189
    +268199
    +268207
    +268211
    +268237
    +268253
    +268267
    +268271
    +268283
    +268291
    +268297
    +268343
    +268403
    +268439
    +268459
    +268487
    +268493
    +268501
    +268507
    +268517
    +268519
    +268529
    +268531
    +268537
    +268547
    +268573
    +268607
    +268613
    +268637
    +268643
    +268661
    +268693
    +268721
    +268729
    +268733
    +268747
    +268757
    +268759
    +268771
    +268777
    +268781
    +268783
    +268789
    +268811
    +268813
    +268817
    +268819
    +268823
    +268841
    +268843
    +268861
    +268883
    +268897
    +268909
    +268913
    +268921
    +268927
    +268937
    +268969
    +268973
    +268979
    +268993
    +268997
    +268999
    +269023
    +269029
    +269039
    +269041
    +269057
    +269063
    +269069
    +269089
    +269117
    +269131
    +269141
    +269167
    +269177
    +269179
    +269183
    +269189
    +269201
    +269209
    +269219
    +269221
    +269231
    +269237
    +269251
    +269257
    +269281
    +269317
    +269327
    +269333
    +269341
    +269351
    +269377
    +269383
    +269387
    +269389
    +269393
    +269413
    +269419
    +269429
    +269431
    +269441
    +269461
    +269473
    +269513
    +269519
    +269527
    +269539
    +269543
    +269561
    +269573
    +269579
    +269597
    +269617
    +269623
    +269641
    +269651
    +269663
    +269683
    +269701
    +269713
    +269719
    +269723
    +269741
    +269749
    +269761
    +269779
    +269783
    +269791
    +269851
    +269879
    +269887
    +269891
    +269897
    +269923
    +269939
    +269947
    +269953
    +269981
    +269987
    +270001
    +270029
    +270031
    +270037
    +270059
    +270071
    +270073
    +270097
    +270121
    +270131
    +270133
    +270143
    +270157
    +270163
    +270167
    +270191
    +270209
    +270217
    +270223
    +270229
    +270239
    +270241
    +270269
    +270271
    +270287
    +270299
    +270307
    +270311
    +270323
    +270329
    +270337
    +270343
    +270371
    +270379
    +270407
    +270421
    +270437
    +270443
    +270451
    +270461
    +270463
    +270493
    +270509
    +270527
    +270539
    +270547
    +270551
    +270553
    +270563
    +270577
    +270583
    +270587
    +270593
    +270601
    +270619
    +270631
    +270653
    +270659
    +270667
    +270679
    +270689
    +270701
    +270709
    +270719
    +270737
    +270749
    +270761
    +270763
    +270791
    +270797
    +270799
    +270821
    +270833
    +270841
    +270859
    +270899
    +270913
    +270923
    +270931
    +270937
    +270953
    +270961
    +270967
    +270973
    +271003
    +271013
    +271021
    +271027
    +271043
    +271057
    +271067
    +271079
    +271097
    +271109
    +271127
    +271129
    +271163
    +271169
    +271177
    +271181
    +271211
    +271217
    +271231
    +271241
    +271253
    +271261
    +271273
    +271277
    +271279
    +271289
    +271333
    +271351
    +271357
    +271363
    +271367
    +271393
    +271409
    +271429
    +271451
    +271463
    +271471
    +271483
    +271489
    +271499
    +271501
    +271517
    +271549
    +271553
    +271571
    +271573
    +271597
    +271603
    +271619
    +271637
    +271639
    +271651
    +271657
    +271693
    +271703
    +271723
    +271729
    +271753
    +271769
    +271771
    +271787
    +271807
    +271811
    +271829
    +271841
    +271849
    +271853
    +271861
    +271867
    +271879
    +271897
    +271903
    +271919
    +271927
    +271939
    +271967
    +271969
    +271981
    +272003
    +272009
    +272011
    +272029
    +272039
    +272053
    +272059
    +272093
    +272131
    +272141
    +272171
    +272179
    +272183
    +272189
    +272191
    +272201
    +272203
    +272227
    +272231
    +272249
    +272257
    +272263
    +272267
    +272269
    +272287
    +272299
    +272317
    +272329
    +272333
    +272341
    +272347
    +272351
    +272353
    +272359
    +272369
    +272381
    +272383
    +272399
    +272407
    +272411
    +272417
    +272423
    +272449
    +272453
    +272477
    +272507
    +272533
    +272537
    +272539
    +272549
    +272563
    +272567
    +272581
    +272603
    +272621
    +272651
    +272659
    +272683
    +272693
    +272717
    +272719
    +272737
    +272759
    +272761
    +272771
    +272777
    +272807
    +272809
    +272813
    +272863
    +272879
    +272887
    +272903
    +272911
    +272917
    +272927
    +272933
    +272959
    +272971
    +272981
    +272983
    +272989
    +272999
    +273001
    +273029
    +273043
    +273047
    +273059
    +273061
    +273067
    +273073
    +273083
    +273107
    +273113
    +273127
    +273131
    +273149
    +273157
    +273181
    +273187
    +273193
    +273233
    +273253
    +273269
    +273271
    +273281
    +273283
    +273289
    +273311
    +273313
    +273323
    +273349
    +273359
    +273367
    +273433
    +273457
    +273473
    +273503
    +273517
    +273521
    +273527
    +273551
    +273569
    +273601
    +273613
    +273617
    +273629
    +273641
    +273643
    +273653
    +273697
    +273709
    +273719
    +273727
    +273739
    +273773
    +273787
    +273797
    +273803
    +273821
    +273827
    +273857
    +273881
    +273899
    +273901
    +273913
    +273919
    +273929
    +273941
    +273943
    +273967
    +273971
    +273979
    +273997
    +274007
    +274019
    +274033
    +274061
    +274069
    +274081
    +274093
    +274103
    +274117
    +274121
    +274123
    +274139
    +274147
    +274163
    +274171
    +274177
    +274187
    +274199
    +274201
    +274213
    +274223
    +274237
    +274243
    +274259
    +274271
    +274277
    +274283
    +274301
    +274333
    +274349
    +274357
    +274361
    +274403
    +274423
    +274441
    +274451
    +274453
    +274457
    +274471
    +274489
    +274517
    +274529
    +274579
    +274583
    +274591
    +274609
    +274627
    +274661
    +274667
    +274679
    +274693
    +274697
    +274709
    +274711
    +274723
    +274739
    +274751
    +274777
    +274783
    +274787
    +274811
    +274817
    +274829
    +274831
    +274837
    +274843
    +274847
    +274853
    +274861
    +274867
    +274871
    +274889
    +274909
    +274931
    +274943
    +274951
    +274957
    +274961
    +274973
    +274993
    +275003
    +275027
    +275039
    +275047
    +275053
    +275059
    +275083
    +275087
    +275129
    +275131
    +275147
    +275153
    +275159
    +275161
    +275167
    +275183
    +275201
    +275207
    +275227
    +275251
    +275263
    +275269
    +275299
    +275309
    +275321
    +275323
    +275339
    +275357
    +275371
    +275389
    +275393
    +275399
    +275419
    +275423
    +275447
    +275449
    +275453
    +275459
    +275461
    +275489
    +275491
    +275503
    +275521
    +275531
    +275543
    +275549
    +275573
    +275579
    +275581
    +275591
    +275593
    +275599
    +275623
    +275641
    +275651
    +275657
    +275669
    +275677
    +275699
    +275711
    +275719
    +275729
    +275741
    +275767
    +275773
    +275783
    +275813
    +275827
    +275837
    +275881
    +275897
    +275911
    +275917
    +275921
    +275923
    +275929
    +275939
    +275941
    +275963
    +275969
    +275981
    +275987
    +275999
    +276007
    +276011
    +276019
    +276037
    +276041
    +276043
    +276047
    +276049
    +276079
    +276083
    +276091
    +276113
    +276137
    +276151
    +276173
    +276181
    +276187
    +276191
    +276209
    +276229
    +276239
    +276247
    +276251
    +276257
    +276277
    +276293
    +276319
    +276323
    +276337
    +276343
    +276347
    +276359
    +276371
    +276373
    +276389
    +276401
    +276439
    +276443
    +276449
    +276461
    +276467
    +276487
    +276499
    +276503
    +276517
    +276527
    +276553
    +276557
    +276581
    +276587
    +276589
    +276593
    +276599
    +276623
    +276629
    +276637
    +276671
    +276673
    +276707
    +276721
    +276739
    +276763
    +276767
    +276779
    +276781
    +276817
    +276821
    +276823
    +276827
    +276833
    +276839
    +276847
    +276869
    +276883
    +276901
    +276907
    +276917
    +276919
    +276929
    +276949
    +276953
    +276961
    +276977
    +277003
    +277007
    +277021
    +277051
    +277063
    +277073
    +277087
    +277097
    +277099
    +277157
    +277163
    +277169
    +277177
    +277183
    +277213
    +277217
    +277223
    +277231
    +277247
    +277259
    +277261
    +277273
    +277279
    +277297
    +277301
    +277309
    +277331
    +277363
    +277373
    +277411
    +277421
    +277427
    +277429
    +277483
    +277493
    +277499
    +277513
    +277531
    +277547
    +277549
    +277567
    +277577
    +277579
    +277597
    +277601
    +277603
    +277637
    +277639
    +277643
    +277657
    +277663
    +277687
    +277691
    +277703
    +277741
    +277747
    +277751
    +277757
    +277787
    +277789
    +277793
    +277813
    +277829
    +277847
    +277859
    +277883
    +277889
    +277891
    +277897
    +277903
    +277919
    +277961
    +277993
    +277999
    +278017
    +278029
    +278041
    +278051
    +278063
    +278071
    +278087
    +278111
    +278119
    +278123
    +278143
    +278147
    +278149
    +278177
    +278191
    +278207
    +278209
    +278219
    +278227
    +278233
    +278237
    +278261
    +278269
    +278279
    +278321
    +278329
    +278347
    +278353
    +278363
    +278387
    +278393
    +278413
    +278437
    +278459
    +278479
    +278489
    +278491
    +278497
    +278501
    +278503
    +278543
    +278549
    +278557
    +278561
    +278563
    +278581
    +278591
    +278609
    +278611
    +278617
    +278623
    +278627
    +278639
    +278651
    +278671
    +278687
    +278689
    +278701
    +278717
    +278741
    +278743
    +278753
    +278767
    +278801
    +278807
    +278809
    +278813
    +278819
    +278827
    +278843
    +278849
    +278867
    +278879
    +278881
    +278891
    +278903
    +278909
    +278911
    +278917
    +278947
    +278981
    +279001
    +279007
    +279023
    +279029
    +279047
    +279073
    +279109
    +279119
    +279121
    +279127
    +279131
    +279137
    +279143
    +279173
    +279179
    +279187
    +279203
    +279211
    +279221
    +279269
    +279311
    +279317
    +279329
    +279337
    +279353
    +279397
    +279407
    +279413
    +279421
    +279431
    +279443
    +279451
    +279479
    +279481
    +279511
    +279523
    +279541
    +279551
    +279553
    +279557
    +279571
    +279577
    +279583
    +279593
    +279607
    +279613
    +279619
    +279637
    +279641
    +279649
    +279659
    +279679
    +279689
    +279707
    +279709
    +279731
    +279751
    +279761
    +279767
    +279779
    +279817
    +279823
    +279847
    +279857
    +279863
    +279883
    +279913
    +279919
    +279941
    +279949
    +279967
    +279977
    +279991
    +280001
    +280009
    +280013
    +280031
    +280037
    +280061
    +280069
    +280097
    +280099
    +280103
    +280121
    +280129
    +280139
    +280183
    +280187
    +280199
    +280207
    +280219
    +280223
    +280229
    +280243
    +280249
    +280253
    +280277
    +280297
    +280303
    +280321
    +280327
    +280337
    +280339
    +280351
    +280373
    +280409
    +280411
    +280451
    +280463
    +280487
    +280499
    +280507
    +280513
    +280537
    +280541
    +280547
    +280549
    +280561
    +280583
    +280589
    +280591
    +280597
    +280603
    +280607
    +280613
    +280627
    +280639
    +280673
    +280681
    +280697
    +280699
    +280703
    +280711
    +280717
    +280729
    +280751
    +280759
    +280769
    +280771
    +280811
    +280817
    +280837
    +280843
    +280859
    +280871
    +280879
    +280883
    +280897
    +280909
    +280913
    +280921
    +280927
    +280933
    +280939
    +280949
    +280957
    +280963
    +280967
    +280979
    +280997
    +281023
    +281033
    +281053
    +281063
    +281069
    +281081
    +281117
    +281131
    +281153
    +281159
    +281167
    +281189
    +281191
    +281207
    +281227
    +281233
    +281243
    +281249
    +281251
    +281273
    +281279
    +281291
    +281297
    +281317
    +281321
    +281327
    +281339
    +281353
    +281357
    +281363
    +281381
    +281419
    +281423
    +281429
    +281431
    +281509
    +281527
    +281531
    +281539
    +281549
    +281551
    +281557
    +281563
    +281579
    +281581
    +281609
    +281621
    +281623
    +281627
    +281641
    +281647
    +281651
    +281653
    +281663
    +281669
    +281683
    +281717
    +281719
    +281737
    +281747
    +281761
    +281767
    +281777
    +281783
    +281791
    +281797
    +281803
    +281807
    +281833
    +281837
    +281839
    +281849
    +281857
    +281867
    +281887
    +281893
    +281921
    +281923
    +281927
    +281933
    +281947
    +281959
    +281971
    +281989
    +281993
    +282001
    +282011
    +282019
    +282053
    +282059
    +282071
    +282089
    +282091
    +282097
    +282101
    +282103
    +282127
    +282143
    +282157
    +282167
    +282221
    +282229
    +282239
    +282241
    +282253
    +282281
    +282287
    +282299
    +282307
    +282311
    +282313
    +282349
    +282377
    +282383
    +282389
    +282391
    +282407
    +282409
    +282413
    +282427
    +282439
    +282461
    +282481
    +282487
    +282493
    +282559
    +282563
    +282571
    +282577
    +282589
    +282599
    +282617
    +282661
    +282671
    +282677
    +282679
    +282683
    +282691
    +282697
    +282703
    +282707
    +282713
    +282767
    +282769
    +282773
    +282797
    +282809
    +282827
    +282833
    +282847
    +282851
    +282869
    +282881
    +282889
    +282907
    +282911
    +282913
    +282917
    +282959
    +282973
    +282977
    +282991
    +283001
    +283007
    +283009
    +283027
    +283051
    +283079
    +283093
    +283097
    +283099
    +283111
    +283117
    +283121
    +283133
    +283139
    +283159
    +283163
    +283181
    +283183
    +283193
    +283207
    +283211
    +283267
    +283277
    +283289
    +283303
    +283369
    +283397
    +283403
    +283411
    +283447
    +283463
    +283487
    +283489
    +283501
    +283511
    +283519
    +283541
    +283553
    +283571
    +283573
    +283579
    +283583
    +283601
    +283607
    +283609
    +283631
    +283637
    +283639
    +283669
    +283687
    +283697
    +283721
    +283741
    +283763
    +283769
    +283771
    +283793
    +283799
    +283807
    +283813
    +283817
    +283831
    +283837
    +283859
    +283861
    +283873
    +283909
    +283937
    +283949
    +283957
    +283961
    +283979
    +284003
    +284023
    +284041
    +284051
    +284057
    +284059
    +284083
    +284093
    +284111
    +284117
    +284129
    +284131
    +284149
    +284153
    +284159
    +284161
    +284173
    +284191
    +284201
    +284227
    +284231
    +284233
    +284237
    +284243
    +284261
    +284267
    +284269
    +284293
    +284311
    +284341
    +284357
    +284369
    +284377
    +284387
    +284407
    +284413
    +284423
    +284429
    +284447
    +284467
    +284477
    +284483
    +284489
    +284507
    +284509
    +284521
    +284527
    +284539
    +284551
    +284561
    +284573
    +284587
    +284591
    +284593
    +284623
    +284633
    +284651
    +284657
    +284659
    +284681
    +284689
    +284701
    +284707
    +284723
    +284729
    +284731
    +284737
    +284741
    +284743
    +284747
    +284749
    +284759
    +284777
    +284783
    +284803
    +284807
    +284813
    +284819
    +284831
    +284833
    +284839
    +284857
    +284881
    +284897
    +284899
    +284917
    +284927
    +284957
    +284969
    +284989
    +285007
    +285023
    +285031
    +285049
    +285071
    +285079
    +285091
    +285101
    +285113
    +285119
    +285121
    +285139
    +285151
    +285161
    +285179
    +285191
    +285199
    +285221
    +285227
    +285251
    +285281
    +285283
    +285287
    +285289
    +285301
    +285317
    +285343
    +285377
    +285421
    +285433
    +285451
    +285457
    +285463
    +285469
    +285473
    +285497
    +285517
    +285521
    +285533
    +285539
    +285553
    +285557
    +285559
    +285569
    +285599
    +285611
    +285613
    +285629
    +285631
    +285641
    +285643
    +285661
    +285667
    +285673
    +285697
    +285707
    +285709
    +285721
    +285731
    +285749
    +285757
    +285763
    +285767
    +285773
    +285781
    +285823
    +285827
    +285839
    +285841
    +285871
    +285937
    +285949
    +285953
    +285977
    +285979
    +285983
    +285997
    +286001
    +286009
    +286019
    +286043
    +286049
    +286061
    +286063
    +286073
    +286103
    +286129
    +286163
    +286171
    +286199
    +286243
    +286249
    +286289
    +286301
    +286333
    +286367
    +286369
    +286381
    +286393
    +286397
    +286411
    +286421
    +286427
    +286453
    +286457
    +286459
    +286469
    +286477
    +286483
    +286487
    +286493
    +286499
    +286513
    +286519
    +286541
    +286543
    +286547
    +286553
    +286589
    +286591
    +286609
    +286613
    +286619
    +286633
    +286651
    +286673
    +286687
    +286697
    +286703
    +286711
    +286721
    +286733
    +286751
    +286753
    +286763
    +286771
    +286777
    +286789
    +286801
    +286813
    +286831
    +286859
    +286873
    +286927
    +286973
    +286981
    +286987
    +286999
    +287003
    +287047
    +287057
    +287059
    +287087
    +287093
    +287099
    +287107
    +287117
    +287137
    +287141
    +287149
    +287159
    +287167
    +287173
    +287179
    +287191
    +287219
    +287233
    +287237
    +287239
    +287251
    +287257
    +287269
    +287279
    +287281
    +287291
    +287297
    +287321
    +287327
    +287333
    +287341
    +287347
    +287383
    +287387
    +287393
    +287437
    +287449
    +287491
    +287501
    +287503
    +287537
    +287549
    +287557
    +287579
    +287597
    +287611
    +287629
    +287669
    +287671
    +287681
    +287689
    +287701
    +287731
    +287747
    +287783
    +287789
    +287801
    +287813
    +287821
    +287849
    +287851
    +287857
    +287863
    +287867
    +287873
    +287887
    +287921
    +287933
    +287939
    +287977
    +288007
    +288023
    +288049
    +288053
    +288061
    +288077
    +288089
    +288109
    +288137
    +288179
    +288181
    +288191
    +288199
    +288203
    +288209
    +288227
    +288241
    +288247
    +288257
    +288283
    +288293
    +288307
    +288313
    +288317
    +288349
    +288359
    +288361
    +288383
    +288389
    +288403
    +288413
    +288427
    +288433
    +288461
    +288467
    +288481
    +288493
    +288499
    +288527
    +288529
    +288539
    +288551
    +288559
    +288571
    +288577
    +288583
    +288647
    +288649
    +288653
    +288661
    +288679
    +288683
    +288689
    +288697
    +288731
    +288733
    +288751
    +288767
    +288773
    +288803
    +288817
    +288823
    +288833
    +288839
    +288851
    +288853
    +288877
    +288907
    +288913
    +288929
    +288931
    +288947
    +288973
    +288979
    +288989
    +288991
    +288997
    +289001
    +289019
    +289021
    +289031
    +289033
    +289039
    +289049
    +289063
    +289067
    +289099
    +289103
    +289109
    +289111
    +289127
    +289129
    +289139
    +289141
    +289151
    +289169
    +289171
    +289181
    +289189
    +289193
    +289213
    +289241
    +289243
    +289249
    +289253
    +289273
    +289283
    +289291
    +289297
    +289309
    +289319
    +289343
    +289349
    +289361
    +289369
    +289381
    +289397
    +289417
    +289423
    +289439
    +289453
    +289463
    +289469
    +289477
    +289489
    +289511
    +289543
    +289559
    +289573
    +289577
    +289589
    +289603
    +289607
    +289637
    +289643
    +289657
    +289669
    +289717
    +289721
    +289727
    +289733
    +289741
    +289759
    +289763
    +289771
    +289789
    +289837
    +289841
    +289843
    +289847
    +289853
    +289859
    +289871
    +289889
    +289897
    +289937
    +289951
    +289957
    +289967
    +289973
    +289987
    +289999
    +290011
    +290021
    +290023
    +290027
    +290033
    +290039
    +290041
    +290047
    +290057
    +290083
    +290107
    +290113
    +290119
    +290137
    +290141
    +290161
    +290183
    +290189
    +290201
    +290209
    +290219
    +290233
    +290243
    +290249
    +290317
    +290327
    +290347
    +290351
    +290359
    +290369
    +290383
    +290393
    +290399
    +290419
    +290429
    +290441
    +290443
    +290447
    +290471
    +290473
    +290489
    +290497
    +290509
    +290527
    +290531
    +290533
    +290539
    +290557
    +290593
    +290597
    +290611
    +290617
    +290621
    +290623
    +290627
    +290657
    +290659
    +290663
    +290669
    +290671
    +290677
    +290701
    +290707
    +290711
    +290737
    +290761
    +290767
    +290791
    +290803
    +290821
    +290827
    +290837
    +290839
    +290861
    +290869
    +290879
    +290897
    +290923
    +290959
    +290963
    +290971
    +290987
    +290993
    +290999
    +291007
    +291013
    +291037
    +291041
    +291043
    +291077
    +291089
    +291101
    +291103
    +291107
    +291113
    +291143
    +291167
    +291169
    +291173
    +291191
    +291199
    +291209
    +291217
    +291253
    +291257
    +291271
    +291287
    +291293
    +291299
    +291331
    +291337
    +291349
    +291359
    +291367
    +291371
    +291373
    +291377
    +291419
    +291437
    +291439
    +291443
    +291457
    +291481
    +291491
    +291503
    +291509
    +291521
    +291539
    +291547
    +291559
    +291563
    +291569
    +291619
    +291647
    +291649
    +291661
    +291677
    +291689
    +291691
    +291701
    +291721
    +291727
    +291743
    +291751
    +291779
    +291791
    +291817
    +291829
    +291833
    +291853
    +291857
    +291869
    +291877
    +291887
    +291899
    +291901
    +291923
    +291971
    +291979
    +291983
    +291997
    +292021
    +292027
    +292037
    +292057
    +292069
    +292079
    +292081
    +292091
    +292093
    +292133
    +292141
    +292147
    +292157
    +292181
    +292183
    +292223
    +292231
    +292241
    +292249
    +292267
    +292283
    +292301
    +292309
    +292319
    +292343
    +292351
    +292363
    +292367
    +292381
    +292393
    +292427
    +292441
    +292459
    +292469
    +292471
    +292477
    +292483
    +292489
    +292493
    +292517
    +292531
    +292541
    +292549
    +292561
    +292573
    +292577
    +292601
    +292627
    +292631
    +292661
    +292667
    +292673
    +292679
    +292693
    +292703
    +292709
    +292711
    +292717
    +292727
    +292753
    +292759
    +292777
    +292793
    +292801
    +292807
    +292819
    +292837
    +292841
    +292849
    +292867
    +292879
    +292909
    +292921
    +292933
    +292969
    +292973
    +292979
    +292993
    +293021
    +293071
    +293081
    +293087
    +293093
    +293099
    +293107
    +293123
    +293129
    +293147
    +293149
    +293173
    +293177
    +293179
    +293201
    +293207
    +293213
    +293221
    +293257
    +293261
    +293263
    +293269
    +293311
    +293329
    +293339
    +293351
    +293357
    +293399
    +293413
    +293431
    +293441
    +293453
    +293459
    +293467
    +293473
    +293483
    +293507
    +293543
    +293599
    +293603
    +293617
    +293621
    +293633
    +293639
    +293651
    +293659
    +293677
    +293681
    +293701
    +293717
    +293723
    +293729
    +293749
    +293767
    +293773
    +293791
    +293803
    +293827
    +293831
    +293861
    +293863
    +293893
    +293899
    +293941
    +293957
    +293983
    +293989
    +293999
    +294001
    +294013
    +294023
    +294029
    +294043
    +294053
    +294059
    +294067
    +294103
    +294127
    +294131
    +294149
    +294157
    +294167
    +294169
    +294179
    +294181
    +294199
    +294211
    +294223
    +294227
    +294241
    +294247
    +294251
    +294269
    +294277
    +294289
    +294293
    +294311
    +294313
    +294317
    +294319
    +294337
    +294341
    +294347
    +294353
    +294383
    +294391
    +294397
    +294403
    +294431
    +294439
    +294461
    +294467
    +294479
    +294499
    +294509
    +294523
    +294529
    +294551
    +294563
    +294629
    +294641
    +294647
    +294649
    +294659
    +294673
    +294703
    +294731
    +294751
    +294757
    +294761
    +294773
    +294781
    +294787
    +294793
    +294799
    +294803
    +294809
    +294821
    +294829
    +294859
    +294869
    +294887
    +294893
    +294911
    +294919
    +294923
    +294947
    +294949
    +294953
    +294979
    +294989
    +294991
    +294997
    +295007
    +295033
    +295037
    +295039
    +295049
    +295073
    +295079
    +295081
    +295111
    +295123
    +295129
    +295153
    +295187
    +295199
    +295201
    +295219
    +295237
    +295247
    +295259
    +295271
    +295277
    +295283
    +295291
    +295313
    +295319
    +295333
    +295357
    +295363
    +295387
    +295411
    +295417
    +295429
    +295433
    +295439
    +295441
    +295459
    +295513
    +295517
    +295541
    +295553
    +295567
    +295571
    +295591
    +295601
    +295663
    +295693
    +295699
    +295703
    +295727
    +295751
    +295759
    +295769
    +295777
    +295787
    +295819
    +295831
    +295837
    +295843
    +295847
    +295853
    +295861
    +295871
    +295873
    +295877
    +295879
    +295901
    +295903
    +295909
    +295937
    +295943
    +295949
    +295951
    +295961
    +295973
    +295993
    +296011
    +296017
    +296027
    +296041
    +296047
    +296071
    +296083
    +296099
    +296117
    +296129
    +296137
    +296159
    +296183
    +296201
    +296213
    +296221
    +296237
    +296243
    +296249
    +296251
    +296269
    +296273
    +296279
    +296287
    +296299
    +296347
    +296353
    +296363
    +296369
    +296377
    +296437
    +296441
    +296473
    +296477
    +296479
    +296489
    +296503
    +296507
    +296509
    +296519
    +296551
    +296557
    +296561
    +296563
    +296579
    +296581
    +296587
    +296591
    +296627
    +296651
    +296663
    +296669
    +296683
    +296687
    +296693
    +296713
    +296719
    +296729
    +296731
    +296741
    +296749
    +296753
    +296767
    +296771
    +296773
    +296797
    +296801
    +296819
    +296827
    +296831
    +296833
    +296843
    +296909
    +296911
    +296921
    +296929
    +296941
    +296969
    +296971
    +296981
    +296983
    +296987
    +297019
    +297023
    +297049
    +297061
    +297067
    +297079
    +297083
    +297097
    +297113
    +297133
    +297151
    +297161
    +297169
    +297191
    +297233
    +297247
    +297251
    +297257
    +297263
    +297289
    +297317
    +297359
    +297371
    +297377
    +297391
    +297397
    +297403
    +297421
    +297439
    +297457
    +297467
    +297469
    +297481
    +297487
    +297503
    +297509
    +297523
    +297533
    +297581
    +297589
    +297601
    +297607
    +297613
    +297617
    +297623
    +297629
    +297641
    +297659
    +297683
    +297691
    +297707
    +297719
    +297727
    +297757
    +297779
    +297793
    +297797
    +297809
    +297811
    +297833
    +297841
    +297853
    +297881
    +297889
    +297893
    +297907
    +297911
    +297931
    +297953
    +297967
    +297971
    +297989
    +297991
    +298013
    +298021
    +298031
    +298043
    +298049
    +298063
    +298087
    +298093
    +298099
    +298153
    +298157
    +298159
    +298169
    +298171
    +298187
    +298201
    +298211
    +298213
    +298223
    +298237
    +298247
    +298261
    +298283
    +298303
    +298307
    +298327
    +298339
    +298343
    +298349
    +298369
    +298373
    +298399
    +298409
    +298411
    +298427
    +298451
    +298477
    +298483
    +298513
    +298559
    +298579
    +298583
    +298589
    +298601
    +298607
    +298621
    +298631
    +298651
    +298667
    +298679
    +298681
    +298687
    +298691
    +298693
    +298709
    +298723
    +298733
    +298757
    +298759
    +298777
    +298799
    +298801
    +298817
    +298819
    +298841
    +298847
    +298853
    +298861
    +298897
    +298937
    +298943
    +298993
    +298999
    +299011
    +299017
    +299027
    +299029
    +299053
    +299059
    +299063
    +299087
    +299099
    +299107
    +299113
    +299137
    +299147
    +299171
    +299179
    +299191
    +299197
    +299213
    +299239
    +299261
    +299281
    +299287
    +299311
    +299317
    +299329
    +299333
    +299357
    +299359
    +299363
    +299371
    +299389
    +299393
    +299401
    +299417
    +299419
    +299447
    +299471
    +299473
    +299477
    +299479
    +299501
    +299513
    +299521
    +299527
    +299539
    +299567
    +299569
    +299603
    +299617
    +299623
    +299653
    +299671
    +299681
    +299683
    +299699
    +299701
    +299711
    +299723
    +299731
    +299743
    +299749
    +299771
    +299777
    +299807
    +299843
    +299857
    +299861
    +299881
    +299891
    +299903
    +299909
    +299933
    +299941
    +299951
    +299969
    +299977
    +299983
    +299993
    +300007
    +300017
    +300023
    +300043
    +300073
    +300089
    +300109
    +300119
    +300137
    +300149
    +300151
    +300163
    +300187
    +300191
    +300193
    +300221
    +300229
    +300233
    +300239
    +300247
    +300277
    +300299
    +300301
    +300317
    +300319
    +300323
    +300331
    +300343
    +300347
    +300367
    +300397
    +300413
    +300427
    +300431
    +300439
    +300463
    +300481
    +300491
    +300493
    +300497
    +300499
    +300511
    +300557
    +300569
    +300581
    +300583
    +300589
    +300593
    +300623
    +300631
    +300647
    +300649
    +300661
    +300667
    +300673
    +300683
    +300691
    +300719
    +300721
    +300733
    +300739
    +300743
    +300749
    +300757
    +300761
    +300779
    +300787
    +300799
    +300809
    +300821
    +300823
    +300851
    +300857
    +300869
    +300877
    +300889
    +300893
    +300929
    +300931
    +300953
    +300961
    +300967
    +300973
    +300977
    +300997
    +301013
    +301027
    +301039
    +301051
    +301057
    +301073
    +301079
    +301123
    +301127
    +301141
    +301153
    +301159
    +301177
    +301181
    +301183
    +301211
    +301219
    +301237
    +301241
    +301243
    +301247
    +301267
    +301303
    +301319
    +301331
    +301333
    +301349
    +301361
    +301363
    +301381
    +301403
    +301409
    +301423
    +301429
    +301447
    +301459
    +301463
    +301471
    +301487
    +301489
    +301493
    +301501
    +301531
    +301577
    +301579
    +301583
    +301591
    +301601
    +301619
    +301627
    +301643
    +301649
    +301657
    +301669
    +301673
    +301681
    +301703
    +301711
    +301747
    +301751
    +301753
    +301759
    +301789
    +301793
    +301813
    +301831
    +301841
    +301843
    +301867
    +301877
    +301897
    +301901
    +301907
    +301913
    +301927
    +301933
    +301943
    +301949
    +301979
    +301991
    +301993
    +301997
    +301999
    +302009
    +302053
    +302111
    +302123
    +302143
    +302167
    +302171
    +302173
    +302189
    +302191
    +302213
    +302221
    +302227
    +302261
    +302273
    +302279
    +302287
    +302297
    +302299
    +302317
    +302329
    +302399
    +302411
    +302417
    +302429
    +302443
    +302459
    +302483
    +302507
    +302513
    +302551
    +302563
    +302567
    +302573
    +302579
    +302581
    +302587
    +302593
    +302597
    +302609
    +302629
    +302647
    +302663
    +302681
    +302711
    +302723
    +302747
    +302759
    +302767
    +302779
    +302791
    +302801
    +302831
    +302833
    +302837
    +302843
    +302851
    +302857
    +302873
    +302891
    +302903
    +302909
    +302921
    +302927
    +302941
    +302959
    +302969
    +302971
    +302977
    +302983
    +302989
    +302999
    +303007
    +303011
    +303013
    +303019
    +303029
    +303049
    +303053
    +303073
    +303089
    +303091
    +303097
    +303119
    +303139
    +303143
    +303151
    +303157
    +303187
    +303217
    +303257
    +303271
    +303283
    +303287
    +303293
    +303299
    +303307
    +303313
    +303323
    +303337
    +303341
    +303361
    +303367
    +303371
    +303377
    +303379
    +303389
    +303409
    +303421
    +303431
    +303463
    +303469
    +303473
    +303491
    +303493
    +303497
    +303529
    +303539
    +303547
    +303551
    +303553
    +303571
    +303581
    +303587
    +303593
    +303613
    +303617
    +303619
    +303643
    +303647
    +303649
    +303679
    +303683
    +303689
    +303691
    +303703
    +303713
    +303727
    +303731
    +303749
    +303767
    +303781
    +303803
    +303817
    +303827
    +303839
    +303859
    +303871
    +303889
    +303907
    +303917
    +303931
    +303937
    +303959
    +303983
    +303997
    +304009
    +304013
    +304021
    +304033
    +304039
    +304049
    +304063
    +304067
    +304069
    +304081
    +304091
    +304099
    +304127
    +304151
    +304153
    +304163
    +304169
    +304193
    +304211
    +304217
    +304223
    +304253
    +304259
    +304279
    +304301
    +304303
    +304331
    +304349
    +304357
    +304363
    +304373
    +304391
    +304393
    +304411
    +304417
    +304429
    +304433
    +304439
    +304457
    +304459
    +304477
    +304481
    +304489
    +304501
    +304511
    +304517
    +304523
    +304537
    +304541
    +304553
    +304559
    +304561
    +304597
    +304609
    +304631
    +304643
    +304651
    +304663
    +304687
    +304709
    +304723
    +304729
    +304739
    +304751
    +304757
    +304763
    +304771
    +304781
    +304789
    +304807
    +304813
    +304831
    +304847
    +304849
    +304867
    +304879
    +304883
    +304897
    +304901
    +304903
    +304907
    +304933
    +304937
    +304943
    +304949
    +304961
    +304979
    +304981
    +305017
    +305021
    +305023
    +305029
    +305033
    +305047
    +305069
    +305093
    +305101
    +305111
    +305113
    +305119
    +305131
    +305143
    +305147
    +305209
    +305219
    +305231
    +305237
    +305243
    +305267
    +305281
    +305297
    +305329
    +305339
    +305351
    +305353
    +305363
    +305369
    +305377
    +305401
    +305407
    +305411
    +305413
    +305419
    +305423
    +305441
    +305449
    +305471
    +305477
    +305479
    +305483
    +305489
    +305497
    +305521
    +305533
    +305551
    +305563
    +305581
    +305593
    +305597
    +305603
    +305611
    +305621
    +305633
    +305639
    +305663
    +305717
    +305719
    +305741
    +305743
    +305749
    +305759
    +305761
    +305771
    +305783
    +305803
    +305821
    +305839
    +305849
    +305857
    +305861
    +305867
    +305873
    +305917
    +305927
    +305933
    +305947
    +305971
    +305999
    +306011
    +306023
    +306029
    +306041
    +306049
    +306083
    +306091
    +306121
    +306133
    +306139
    +306149
    +306157
    +306167
    +306169
    +306191
    +306193
    +306209
    +306239
    +306247
    +306253
    +306259
    +306263
    +306301
    +306329
    +306331
    +306347
    +306349
    +306359
    +306367
    +306377
    +306389
    +306407
    +306419
    +306421
    +306431
    +306437
    +306457
    +306463
    +306473
    +306479
    +306491
    +306503
    +306511
    +306517
    +306529
    +306533
    +306541
    +306563
    +306577
    +306587
    +306589
    +306643
    +306653
    +306661
    +306689
    +306701
    +306703
    +306707
    +306727
    +306739
    +306749
    +306763
    +306781
    +306809
    +306821
    +306827
    +306829
    +306847
    +306853
    +306857
    +306871
    +306877
    +306883
    +306893
    +306899
    +306913
    +306919
    +306941
    +306947
    +306949
    +306953
    +306991
    +307009
    +307019
    +307031
    +307033
    +307067
    +307079
    +307091
    +307093
    +307103
    +307121
    +307129
    +307147
    +307163
    +307169
    +307171
    +307187
    +307189
    +307201
    +307243
    +307253
    +307259
    +307261
    +307267
    +307273
    +307277
    +307283
    +307289
    +307301
    +307337
    +307339
    +307361
    +307367
    +307381
    +307397
    +307399
    +307409
    +307423
    +307451
    +307471
    +307481
    +307511
    +307523
    +307529
    +307537
    +307543
    +307577
    +307583
    +307589
    +307609
    +307627
    +307631
    +307633
    +307639
    +307651
    +307669
    +307687
    +307691
    +307693
    +307711
    +307733
    +307759
    +307817
    +307823
    +307831
    +307843
    +307859
    +307871
    +307873
    +307891
    +307903
    +307919
    +307939
    +307969
    +308003
    +308017
    +308027
    +308041
    +308051
    +308081
    +308093
    +308101
    +308107
    +308117
    +308129
    +308137
    +308141
    +308149
    +308153
    +308213
    +308219
    +308249
    +308263
    +308291
    +308293
    +308303
    +308309
    +308311
    +308317
    +308323
    +308327
    +308333
    +308359
    +308383
    +308411
    +308423
    +308437
    +308447
    +308467
    +308489
    +308491
    +308501
    +308507
    +308509
    +308519
    +308521
    +308527
    +308537
    +308551
    +308569
    +308573
    +308587
    +308597
    +308621
    +308639
    +308641
    +308663
    +308681
    +308701
    +308713
    +308723
    +308761
    +308773
    +308801
    +308809
    +308813
    +308827
    +308849
    +308851
    +308857
    +308887
    +308899
    +308923
    +308927
    +308929
    +308933
    +308939
    +308951
    +308989
    +308999
    +309007
    +309011
    +309013
    +309019
    +309031
    +309037
    +309059
    +309079
    +309083
    +309091
    +309107
    +309109
    +309121
    +309131
    +309137
    +309157
    +309167
    +309173
    +309193
    +309223
    +309241
    +309251
    +309259
    +309269
    +309271
    +309277
    +309289
    +309293
    +309311
    +309313
    +309317
    +309359
    +309367
    +309371
    +309391
    +309403
    +309433
    +309437
    +309457
    +309461
    +309469
    +309479
    +309481
    +309493
    +309503
    +309521
    +309523
    +309539
    +309541
    +309559
    +309571
    +309577
    +309583
    +309599
    +309623
    +309629
    +309637
    +309667
    +309671
    +309677
    +309707
    +309713
    +309731
    +309737
    +309769
    +309779
    +309781
    +309797
    +309811
    +309823
    +309851
    +309853
    +309857
    +309877
    +309899
    +309929
    +309931
    +309937
    +309977
    +309989
    +310019
    +310021
    +310027
    +310043
    +310049
    +310081
    +310087
    +310091
    +310111
    +310117
    +310127
    +310129
    +310169
    +310181
    +310187
    +310223
    +310229
    +310231
    +310237
    +310243
    +310273
    +310283
    +310291
    +310313
    +310333
    +310357
    +310361
    +310363
    +310379
    +310397
    +310423
    +310433
    +310439
    +310447
    +310459
    +310463
    +310481
    +310489
    +310501
    +310507
    +310511
    +310547
    +310553
    +310559
    +310567
    +310571
    +310577
    +310591
    +310627
    +310643
    +310663
    +310693
    +310697
    +310711
    +310721
    +310727
    +310729
    +310733
    +310741
    +310747
    +310771
    +310781
    +310789
    +310801
    +310819
    +310823
    +310829
    +310831
    +310861
    +310867
    +310883
    +310889
    +310901
    +310927
    +310931
    +310949
    +310969
    +310987
    +310997
    +311009
    +311021
    +311027
    +311033
    +311041
    +311099
    +311111
    +311123
    +311137
    +311153
    +311173
    +311177
    +311183
    +311189
    +311197
    +311203
    +311237
    +311279
    +311291
    +311293
    +311299
    +311303
    +311323
    +311329
    +311341
    +311347
    +311359
    +311371
    +311393
    +311407
    +311419
    +311447
    +311453
    +311473
    +311533
    +311537
    +311539
    +311551
    +311557
    +311561
    +311567
    +311569
    +311603
    +311609
    +311653
    +311659
    +311677
    +311681
    +311683
    +311687
    +311711
    +311713
    +311737
    +311743
    +311747
    +311749
    +311791
    +311803
    +311807
    +311821
    +311827
    +311867
    +311869
    +311881
    +311897
    +311951
    +311957
    +311963
    +311981
    +312007
    +312023
    +312029
    +312031
    +312043
    +312047
    +312071
    +312073
    +312083
    +312089
    +312101
    +312107
    +312121
    +312161
    +312197
    +312199
    +312203
    +312209
    +312211
    +312217
    +312229
    +312233
    +312241
    +312251
    +312253
    +312269
    +312281
    +312283
    +312289
    +312311
    +312313
    +312331
    +312343
    +312349
    +312353
    +312371
    +312383
    +312397
    +312401
    +312407
    +312413
    +312427
    +312451
    +312469
    +312509
    +312517
    +312527
    +312551
    +312553
    +312563
    +312581
    +312583
    +312589
    +312601
    +312617
    +312619
    +312623
    +312643
    +312673
    +312677
    +312679
    +312701
    +312703
    +312709
    +312727
    +312737
    +312743
    +312757
    +312773
    +312779
    +312799
    +312839
    +312841
    +312857
    +312863
    +312887
    +312899
    +312929
    +312931
    +312937
    +312941
    +312943
    +312967
    +312971
    +312979
    +312989
    +313003
    +313009
    +313031
    +313037
    +313081
    +313087
    +313109
    +313127
    +313129
    +313133
    +313147
    +313151
    +313153
    +313163
    +313207
    +313211
    +313219
    +313241
    +313249
    +313267
    +313273
    +313289
    +313297
    +313301
    +313307
    +313321
    +313331
    +313333
    +313343
    +313351
    +313373
    +313381
    +313387
    +313399
    +313409
    +313471
    +313477
    +313507
    +313517
    +313543
    +313549
    +313553
    +313561
    +313567
    +313571
    +313583
    +313589
    +313597
    +313603
    +313613
    +313619
    +313637
    +313639
    +313661
    +313669
    +313679
    +313699
    +313711
    +313717
    +313721
    +313727
    +313739
    +313741
    +313763
    +313777
    +313783
    +313829
    +313849
    +313853
    +313879
    +313883
    +313889
    +313897
    +313909
    +313921
    +313931
    +313933
    +313949
    +313961
    +313969
    +313979
    +313981
    +313987
    +313991
    +313993
    +313997
    +314003
    +314021
    +314059
    +314063
    +314077
    +314107
    +314113
    +314117
    +314129
    +314137
    +314159
    +314161
    +314173
    +314189
    +314213
    +314219
    +314227
    +314233
    +314239
    +314243
    +314257
    +314261
    +314263
    +314267
    +314299
    +314329
    +314339
    +314351
    +314357
    +314359
    +314399
    +314401
    +314407
    +314423
    +314441
    +314453
    +314467
    +314491
    +314497
    +314513
    +314527
    +314543
    +314549
    +314569
    +314581
    +314591
    +314597
    +314599
    +314603
    +314623
    +314627
    +314641
    +314651
    +314693
    +314707
    +314711
    +314719
    +314723
    +314747
    +314761
    +314771
    +314777
    +314779
    +314807
    +314813
    +314827
    +314851
    +314879
    +314903
    +314917
    +314927
    +314933
    +314953
    +314957
    +314983
    +314989
    +315011
    +315013
    +315037
    +315047
    +315059
    +315067
    +315083
    +315097
    +315103
    +315109
    +315127
    +315179
    +315181
    +315193
    +315199
    +315223
    +315247
    +315251
    +315257
    +315269
    +315281
    +315313
    +315349
    +315361
    +315373
    +315377
    +315389
    +315407
    +315409
    +315421
    +315437
    +315449
    +315451
    +315461
    +315467
    +315481
    +315493
    +315517
    +315521
    +315527
    +315529
    +315547
    +315551
    +315559
    +315569
    +315589
    +315593
    +315599
    +315613
    +315617
    +315631
    +315643
    +315671
    +315677
    +315691
    +315697
    +315701
    +315703
    +315739
    +315743
    +315751
    +315779
    +315803
    +315811
    +315829
    +315851
    +315857
    +315881
    +315883
    +315893
    +315899
    +315907
    +315937
    +315949
    +315961
    +315967
    +315977
    +316003
    +316031
    +316033
    +316037
    +316051
    +316067
    +316073
    +316087
    +316097
    +316109
    +316133
    +316139
    +316153
    +316177
    +316189
    +316193
    +316201
    +316213
    +316219
    +316223
    +316241
    +316243
    +316259
    +316271
    +316291
    +316297
    +316301
    +316321
    +316339
    +316343
    +316363
    +316373
    +316391
    +316403
    +316423
    +316429
    +316439
    +316453
    +316469
    +316471
    +316493
    +316499
    +316501
    +316507
    +316531
    +316567
    +316571
    +316577
    +316583
    +316621
    +316633
    +316637
    +316649
    +316661
    +316663
    +316681
    +316691
    +316697
    +316699
    +316703
    +316717
    +316753
    +316759
    +316769
    +316777
    +316783
    +316793
    +316801
    +316817
    +316819
    +316847
    +316853
    +316859
    +316861
    +316879
    +316891
    +316903
    +316907
    +316919
    +316937
    +316951
    +316957
    +316961
    +316991
    +317003
    +317011
    +317021
    +317029
    +317047
    +317063
    +317071
    +317077
    +317087
    +317089
    +317123
    +317159
    +317171
    +317179
    +317189
    +317197
    +317209
    +317227
    +317257
    +317263
    +317267
    +317269
    +317279
    +317321
    +317323
    +317327
    +317333
    +317351
    +317353
    +317363
    +317371
    +317399
    +317411
    +317419
    +317431
    +317437
    +317453
    +317459
    +317483
    +317489
    +317491
    +317503
    +317539
    +317557
    +317563
    +317587
    +317591
    +317593
    +317599
    +317609
    +317617
    +317621
    +317651
    +317663
    +317671
    +317693
    +317701
    +317711
    +317717
    +317729
    +317731
    +317741
    +317743
    +317771
    +317773
    +317777
    +317783
    +317789
    +317797
    +317827
    +317831
    +317839
    +317857
    +317887
    +317903
    +317921
    +317923
    +317957
    +317959
    +317963
    +317969
    +317971
    +317983
    +317987
    +318001
    +318007
    +318023
    +318077
    +318103
    +318107
    +318127
    +318137
    +318161
    +318173
    +318179
    +318181
    +318191
    +318203
    +318209
    +318211
    +318229
    +318233
    +318247
    +318259
    +318271
    +318281
    +318287
    +318289
    +318299
    +318301
    +318313
    +318319
    +318323
    +318337
    +318347
    +318349
    +318377
    +318403
    +318407
    +318419
    +318431
    +318443
    +318457
    +318467
    +318473
    +318503
    +318523
    +318557
    +318559
    +318569
    +318581
    +318589
    +318601
    +318629
    +318641
    +318653
    +318671
    +318677
    +318679
    +318683
    +318691
    +318701
    +318713
    +318737
    +318743
    +318749
    +318751
    +318781
    +318793
    +318809
    +318811
    +318817
    +318823
    +318833
    +318841
    +318863
    +318881
    +318883
    +318889
    +318907
    +318911
    +318917
    +318919
    +318949
    +318979
    +319001
    +319027
    +319031
    +319037
    +319049
    +319057
    +319061
    +319069
    +319093
    +319097
    +319117
    +319127
    +319129
    +319133
    +319147
    +319159
    +319169
    +319183
    +319201
    +319211
    +319223
    +319237
    +319259
    +319279
    +319289
    +319313
    +319321
    +319327
    +319339
    +319343
    +319351
    +319357
    +319387
    +319391
    +319399
    +319411
    +319427
    +319433
    +319439
    +319441
    +319453
    +319469
    +319477
    +319483
    +319489
    +319499
    +319511
    +319519
    +319541
    +319547
    +319567
    +319577
    +319589
    +319591
    +319601
    +319607
    +319639
    +319673
    +319679
    +319681
    +319687
    +319691
    +319699
    +319727
    +319729
    +319733
    +319747
    +319757
    +319763
    +319811
    +319817
    +319819
    +319829
    +319831
    +319849
    +319883
    +319897
    +319901
    +319919
    +319927
    +319931
    +319937
    +319967
    +319973
    +319981
    +319993
    +320009
    +320011
    +320027
    +320039
    +320041
    +320053
    +320057
    +320063
    +320081
    +320083
    +320101
    +320107
    +320113
    +320119
    +320141
    +320143
    +320149
    +320153
    +320179
    +320209
    +320213
    +320219
    +320237
    +320239
    +320267
    +320269
    +320273
    +320291
    +320293
    +320303
    +320317
    +320329
    +320339
    +320377
    +320387
    +320389
    +320401
    +320417
    +320431
    +320449
    +320471
    +320477
    +320483
    +320513
    +320521
    +320533
    +320539
    +320561
    +320563
    +320591
    +320609
    +320611
    +320627
    +320647
    +320657
    +320659
    +320669
    +320687
    +320693
    +320699
    +320713
    +320741
    +320759
    +320767
    +320791
    +320821
    +320833
    +320839
    +320843
    +320851
    +320861
    +320867
    +320899
    +320911
    +320923
    +320927
    +320939
    +320941
    +320953
    +321007
    +321017
    +321031
    +321037
    +321047
    +321053
    +321073
    +321077
    +321091
    +321109
    +321143
    +321163
    +321169
    +321187
    +321193
    +321199
    +321203
    +321221
    +321227
    +321239
    +321247
    +321289
    +321301
    +321311
    +321313
    +321319
    +321323
    +321329
    +321331
    +321341
    +321359
    +321367
    +321371
    +321383
    +321397
    +321403
    +321413
    +321427
    +321443
    +321449
    +321467
    +321469
    +321509
    +321547
    +321553
    +321569
    +321571
    +321577
    +321593
    +321611
    +321617
    +321619
    +321631
    +321647
    +321661
    +321679
    +321707
    +321709
    +321721
    +321733
    +321743
    +321751
    +321757
    +321779
    +321799
    +321817
    +321821
    +321823
    +321829
    +321833
    +321847
    +321851
    +321889
    +321901
    +321911
    +321947
    +321949
    +321961
    +321983
    +321991
    +322001
    +322009
    +322013
    +322037
    +322039
    +322051
    +322057
    +322067
    +322073
    +322079
    +322093
    +322097
    +322109
    +322111
    +322139
    +322169
    +322171
    +322193
    +322213
    +322229
    +322237
    +322243
    +322247
    +322249
    +322261
    +322271
    +322319
    +322327
    +322339
    +322349
    +322351
    +322397
    +322403
    +322409
    +322417
    +322429
    +322433
    +322459
    +322463
    +322501
    +322513
    +322519
    +322523
    +322537
    +322549
    +322559
    +322571
    +322573
    +322583
    +322589
    +322591
    +322607
    +322613
    +322627
    +322631
    +322633
    +322649
    +322669
    +322709
    +322727
    +322747
    +322757
    +322769
    +322771
    +322781
    +322783
    +322807
    +322849
    +322859
    +322871
    +322877
    +322891
    +322901
    +322919
    +322921
    +322939
    +322951
    +322963
    +322969
    +322997
    +322999
    +323003
    +323009
    +323027
    +323053
    +323077
    +323083
    +323087
    +323093
    +323101
    +323123
    +323131
    +323137
    +323149
    +323201
    +323207
    +323233
    +323243
    +323249
    +323251
    +323273
    +323333
    +323339
    +323341
    +323359
    +323369
    +323371
    +323377
    +323381
    +323383
    +323413
    +323419
    +323441
    +323443
    +323467
    +323471
    +323473
    +323507
    +323509
    +323537
    +323549
    +323567
    +323579
    +323581
    +323591
    +323597
    +323599
    +323623
    +323641
    +323647
    +323651
    +323699
    +323707
    +323711
    +323717
    +323759
    +323767
    +323789
    +323797
    +323801
    +323803
    +323819
    +323837
    +323879
    +323899
    +323903
    +323923
    +323927
    +323933
    +323951
    +323957
    +323987
    +324011
    +324031
    +324053
    +324067
    +324073
    +324089
    +324097
    +324101
    +324113
    +324119
    +324131
    +324143
    +324151
    +324161
    +324179
    +324199
    +324209
    +324211
    +324217
    +324223
    +324239
    +324251
    +324293
    +324299
    +324301
    +324319
    +324329
    +324341
    +324361
    +324391
    +324397
    +324403
    +324419
    +324427
    +324431
    +324437
    +324439
    +324449
    +324451
    +324469
    +324473
    +324491
    +324497
    +324503
    +324517
    +324523
    +324529
    +324557
    +324587
    +324589
    +324593
    +324617
    +324619
    +324637
    +324641
    +324647
    +324661
    +324673
    +324689
    +324697
    +324707
    +324733
    +324743
    +324757
    +324763
    +324773
    +324781
    +324791
    +324799
    +324809
    +324811
    +324839
    +324847
    +324869
    +324871
    +324889
    +324893
    +324901
    +324931
    +324941
    +324949
    +324953
    +324977
    +324979
    +324983
    +324991
    +324997
    +325001
    +325009
    +325019
    +325021
    +325027
    +325043
    +325051
    +325063
    +325079
    +325081
    +325093
    +325133
    +325153
    +325163
    +325181
    +325187
    +325189
    +325201
    +325217
    +325219
    +325229
    +325231
    +325249
    +325271
    +325301
    +325307
    +325309
    +325319
    +325333
    +325343
    +325349
    +325379
    +325411
    +325421
    +325439
    +325447
    +325453
    +325459
    +325463
    +325477
    +325487
    +325513
    +325517
    +325537
    +325541
    +325543
    +325571
    +325597
    +325607
    +325627
    +325631
    +325643
    +325667
    +325673
    +325681
    +325691
    +325693
    +325697
    +325709
    +325723
    +325729
    +325747
    +325751
    +325753
    +325769
    +325777
    +325781
    +325783
    +325807
    +325813
    +325849
    +325861
    +325877
    +325883
    +325889
    +325891
    +325901
    +325921
    +325939
    +325943
    +325951
    +325957
    +325987
    +325993
    +325999
    +326023
    +326057
    +326063
    +326083
    +326087
    +326099
    +326101
    +326113
    +326119
    +326141
    +326143
    +326147
    +326149
    +326153
    +326159
    +326171
    +326189
    +326203
    +326219
    +326251
    +326257
    +326309
    +326323
    +326351
    +326353
    +326369
    +326437
    +326441
    +326449
    +326467
    +326479
    +326497
    +326503
    +326537
    +326539
    +326549
    +326561
    +326563
    +326567
    +326581
    +326593
    +326597
    +326609
    +326611
    +326617
    +326633
    +326657
    +326659
    +326663
    +326681
    +326687
    +326693
    +326701
    +326707
    +326737
    +326741
    +326773
    +326779
    +326831
    +326863
    +326867
    +326869
    +326873
    +326881
    +326903
    +326923
    +326939
    +326941
    +326947
    +326951
    +326983
    +326993
    +326999
    +327001
    +327007
    +327011
    +327017
    +327023
    +327059
    +327071
    +327079
    +327127
    +327133
    +327163
    +327179
    +327193
    +327203
    +327209
    +327211
    +327247
    +327251
    +327263
    +327277
    +327289
    +327307
    +327311
    +327317
    +327319
    +327331
    +327337
    +327343
    +327347
    +327401
    +327407
    +327409
    +327419
    +327421
    +327433
    +327443
    +327463
    +327469
    +327473
    +327479
    +327491
    +327493
    +327499
    +327511
    +327517
    +327529
    +327553
    +327557
    +327559
    +327571
    +327581
    +327583
    +327599
    +327619
    +327629
    +327647
    +327661
    +327667
    +327673
    +327689
    +327707
    +327721
    +327737
    +327739
    +327757
    +327779
    +327797
    +327799
    +327809
    +327823
    +327827
    +327829
    +327839
    +327851
    +327853
    +327869
    +327871
    +327881
    +327889
    +327917
    +327923
    +327941
    +327953
    +327967
    +327979
    +327983
    +328007
    +328037
    +328043
    +328051
    +328061
    +328063
    +328067
    +328093
    +328103
    +328109
    +328121
    +328127
    +328129
    +328171
    +328177
    +328213
    +328243
    +328249
    +328271
    +328277
    +328283
    +328291
    +328303
    +328327
    +328331
    +328333
    +328343
    +328357
    +328373
    +328379
    +328381
    +328397
    +328411
    +328421
    +328429
    +328439
    +328481
    +328511
    +328513
    +328519
    +328543
    +328579
    +328589
    +328591
    +328619
    +328621
    +328633
    +328637
    +328639
    +328651
    +328667
    +328687
    +328709
    +328721
    +328753
    +328777
    +328781
    +328787
    +328789
    +328813
    +328829
    +328837
    +328847
    +328849
    +328883
    +328891
    +328897
    +328901
    +328919
    +328921
    +328931
    +328961
    +328981
    +329009
    +329027
    +329053
    +329059
    +329081
    +329083
    +329089
    +329101
    +329111
    +329123
    +329143
    +329167
    +329177
    +329191
    +329201
    +329207
    +329209
    +329233
    +329243
    +329257
    +329267
    +329269
    +329281
    +329293
    +329297
    +329299
    +329309
    +329317
    +329321
    +329333
    +329347
    +329387
    +329393
    +329401
    +329419
    +329431
    +329471
    +329473
    +329489
    +329503
    +329519
    +329533
    +329551
    +329557
    +329587
    +329591
    +329597
    +329603
    +329617
    +329627
    +329629
    +329639
    +329657
    +329663
    +329671
    +329677
    +329683
    +329687
    +329711
    +329717
    +329723
    +329729
    +329761
    +329773
    +329779
    +329789
    +329801
    +329803
    +329863
    +329867
    +329873
    +329891
    +329899
    +329941
    +329947
    +329951
    +329957
    +329969
    +329977
    +329993
    +329999
    +330017
    +330019
    +330037
    +330041
    +330047
    +330053
    +330061
    +330067
    +330097
    +330103
    +330131
    +330133
    +330139
    +330149
    +330167
    +330199
    +330203
    +330217
    +330227
    +330229
    +330233
    +330241
    +330247
    +330271
    +330287
    +330289
    +330311
    +330313
    +330329
    +330331
    +330347
    +330359
    +330383
    +330389
    +330409
    +330413
    +330427
    +330431
    +330433
    +330439
    +330469
    +330509
    +330557
    +330563
    +330569
    +330587
    +330607
    +330611
    +330623
    +330641
    +330643
    +330653
    +330661
    +330679
    +330683
    +330689
    +330697
    +330703
    +330719
    +330721
    +330731
    +330749
    +330767
    +330787
    +330791
    +330793
    +330821
    +330823
    +330839
    +330853
    +330857
    +330859
    +330877
    +330887
    +330899
    +330907
    +330917
    +330943
    +330983
    +330997
    +331013
    +331027
    +331031
    +331043
    +331063
    +331081
    +331099
    +331127
    +331141
    +331147
    +331153
    +331159
    +331171
    +331183
    +331207
    +331213
    +331217
    +331231
    +331241
    +331249
    +331259
    +331277
    +331283
    +331301
    +331307
    +331319
    +331333
    +331337
    +331339
    +331349
    +331367
    +331369
    +331391
    +331399
    +331423
    +331447
    +331451
    +331489
    +331501
    +331511
    +331519
    +331523
    +331537
    +331543
    +331547
    +331549
    +331553
    +331577
    +331579
    +331589
    +331603
    +331609
    +331613
    +331651
    +331663
    +331691
    +331693
    +331697
    +331711
    +331739
    +331753
    +331769
    +331777
    +331781
    +331801
    +331819
    +331841
    +331843
    +331871
    +331883
    +331889
    +331897
    +331907
    +331909
    +331921
    +331937
    +331943
    +331957
    +331967
    +331973
    +331997
    +331999
    +332009
    +332011
    +332039
    +332053
    +332069
    +332081
    +332099
    +332113
    +332117
    +332147
    +332159
    +332161
    +332179
    +332183
    +332191
    +332201
    +332203
    +332207
    +332219
    +332221
    +332251
    +332263
    +332273
    +332287
    +332303
    +332309
    +332317
    +332393
    +332399
    +332411
    +332417
    +332441
    +332447
    +332461
    +332467
    +332471
    +332473
    +332477
    +332489
    +332509
    +332513
    +332561
    +332567
    +332569
    +332573
    +332611
    +332617
    +332623
    +332641
    +332687
    +332699
    +332711
    +332729
    +332743
    +332749
    +332767
    +332779
    +332791
    +332803
    +332837
    +332851
    +332873
    +332881
    +332887
    +332903
    +332921
    +332933
    +332947
    +332951
    +332987
    +332989
    +332993
    +333019
    +333023
    +333029
    +333031
    +333041
    +333049
    +333071
    +333097
    +333101
    +333103
    +333107
    +333131
    +333139
    +333161
    +333187
    +333197
    +333209
    +333227
    +333233
    +333253
    +333269
    +333271
    +333283
    +333287
    +333299
    +333323
    +333331
    +333337
    +333341
    +333349
    +333367
    +333383
    +333397
    +333419
    +333427
    +333433
    +333439
    +333449
    +333451
    +333457
    +333479
    +333491
    +333493
    +333497
    +333503
    +333517
    +333533
    +333539
    +333563
    +333581
    +333589
    +333623
    +333631
    +333647
    +333667
    +333673
    +333679
    +333691
    +333701
    +333713
    +333719
    +333721
    +333737
    +333757
    +333769
    +333779
    +333787
    +333791
    +333793
    +333803
    +333821
    +333857
    +333871
    +333911
    +333923
    +333929
    +333941
    +333959
    +333973
    +333989
    +333997
    +334021
    +334031
    +334043
    +334049
    +334057
    +334069
    +334093
    +334099
    +334127
    +334133
    +334157
    +334171
    +334177
    +334183
    +334189
    +334199
    +334231
    +334247
    +334261
    +334289
    +334297
    +334319
    +334331
    +334333
    +334349
    +334363
    +334379
    +334387
    +334393
    +334403
    +334421
    +334423
    +334427
    +334429
    +334447
    +334487
    +334493
    +334507
    +334511
    +334513
    +334541
    +334547
    +334549
    +334561
    +334603
    +334619
    +334637
    +334643
    +334651
    +334661
    +334667
    +334681
    +334693
    +334699
    +334717
    +334721
    +334727
    +334751
    +334753
    +334759
    +334771
    +334777
    +334783
    +334787
    +334793
    +334843
    +334861
    +334877
    +334889
    +334891
    +334897
    +334931
    +334963
    +334973
    +334987
    +334991
    +334993
    +335009
    +335021
    +335029
    +335033
    +335047
    +335051
    +335057
    +335077
    +335081
    +335089
    +335107
    +335113
    +335117
    +335123
    +335131
    +335149
    +335161
    +335171
    +335173
    +335207
    +335213
    +335221
    +335249
    +335261
    +335273
    +335281
    +335299
    +335323
    +335341
    +335347
    +335381
    +335383
    +335411
    +335417
    +335429
    +335449
    +335453
    +335459
    +335473
    +335477
    +335507
    +335519
    +335527
    +335539
    +335557
    +335567
    +335579
    +335591
    +335609
    +335633
    +335641
    +335653
    +335663
    +335669
    +335681
    +335689
    +335693
    +335719
    +335729
    +335743
    +335747
    +335771
    +335807
    +335809
    +335813
    +335821
    +335833
    +335843
    +335857
    +335879
    +335893
    +335897
    +335917
    +335941
    +335953
    +335957
    +335999
    +336029
    +336031
    +336041
    +336059
    +336079
    +336101
    +336103
    +336109
    +336113
    +336121
    +336143
    +336151
    +336157
    +336163
    +336181
    +336199
    +336211
    +336221
    +336223
    +336227
    +336239
    +336247
    +336251
    +336253
    +336263
    +336307
    +336317
    +336353
    +336361
    +336373
    +336397
    +336403
    +336419
    +336437
    +336463
    +336491
    +336499
    +336503
    +336521
    +336527
    +336529
    +336533
    +336551
    +336563
    +336571
    +336577
    +336587
    +336593
    +336599
    +336613
    +336631
    +336643
    +336649
    +336653
    +336667
    +336671
    +336683
    +336689
    +336703
    +336727
    +336757
    +336761
    +336767
    +336769
    +336773
    +336793
    +336799
    +336803
    +336823
    +336827
    +336829
    +336857
    +336863
    +336871
    +336887
    +336899
    +336901
    +336911
    +336929
    +336961
    +336977
    +336983
    +336989
    +336997
    +337013
    +337021
    +337031
    +337039
    +337049
    +337069
    +337081
    +337091
    +337097
    +337121
    +337153
    +337189
    +337201
    +337213
    +337217
    +337219
    +337223
    +337261
    +337277
    +337279
    +337283
    +337291
    +337301
    +337313
    +337327
    +337339
    +337343
    +337349
    +337361
    +337367
    +337369
    +337397
    +337411
    +337427
    +337453
    +337457
    +337487
    +337489
    +337511
    +337517
    +337529
    +337537
    +337541
    +337543
    +337583
    +337607
    +337609
    +337627
    +337633
    +337639
    +337651
    +337661
    +337669
    +337681
    +337691
    +337697
    +337721
    +337741
    +337751
    +337759
    +337781
    +337793
    +337817
    +337837
    +337853
    +337859
    +337861
    +337867
    +337871
    +337873
    +337891
    +337901
    +337903
    +337907
    +337919
    +337949
    +337957
    +337969
    +337973
    +337999
    +338017
    +338027
    +338033
    +338119
    +338137
    +338141
    +338153
    +338159
    +338161
    +338167
    +338171
    +338183
    +338197
    +338203
    +338207
    +338213
    +338231
    +338237
    +338251
    +338263
    +338267
    +338269
    +338279
    +338287
    +338293
    +338297
    +338309
    +338321
    +338323
    +338339
    +338341
    +338347
    +338369
    +338383
    +338389
    +338407
    +338411
    +338413
    +338423
    +338431
    +338449
    +338461
    +338473
    +338477
    +338497
    +338531
    +338543
    +338563
    +338567
    +338573
    +338579
    +338581
    +338609
    +338659
    +338669
    +338683
    +338687
    +338707
    +338717
    +338731
    +338747
    +338753
    +338761
    +338773
    +338777
    +338791
    +338803
    +338839
    +338851
    +338857
    +338867
    +338893
    +338909
    +338927
    +338959
    +338993
    +338999
    +339023
    +339049
    +339067
    +339071
    +339091
    +339103
    +339107
    +339121
    +339127
    +339137
    +339139
    +339151
    +339161
    +339173
    +339187
    +339211
    +339223
    +339239
    +339247
    +339257
    +339263
    +339289
    +339307
    +339323
    +339331
    +339341
    +339373
    +339389
    +339413
    +339433
    +339467
    +339491
    +339517
    +339527
    +339539
    +339557
    +339583
    +339589
    +339601
    +339613
    +339617
    +339631
    +339637
    +339649
    +339653
    +339659
    +339671
    +339673
    +339679
    +339707
    +339727
    +339749
    +339751
    +339761
    +339769
    +339799
    +339811
    +339817
    +339821
    +339827
    +339839
    +339841
    +339863
    +339887
    +339907
    +339943
    +339959
    +339991
    +340007
    +340027
    +340031
    +340037
    +340049
    +340057
    +340061
    +340063
    +340073
    +340079
    +340103
    +340111
    +340117
    +340121
    +340127
    +340129
    +340169
    +340183
    +340201
    +340211
    +340237
    +340261
    +340267
    +340283
    +340297
    +340321
    +340337
    +340339
    +340369
    +340381
    +340387
    +340393
    +340397
    +340409
    +340429
    +340447
    +340451
    +340453
    +340477
    +340481
    +340519
    +340541
    +340559
    +340573
    +340577
    +340579
    +340583
    +340591
    +340601
    +340619
    +340633
    +340643
    +340649
    +340657
    +340661
    +340687
    +340693
    +340709
    +340723
    +340757
    +340777
    +340787
    +340789
    +340793
    +340801
    +340811
    +340819
    +340849
    +340859
    +340877
    +340889
    +340897
    +340903
    +340909
    +340913
    +340919
    +340927
    +340931
    +340933
    +340937
    +340939
    +340957
    +340979
    +340999
    +341017
    +341027
    +341041
    +341057
    +341059
    +341063
    +341083
    +341087
    +341123
    +341141
    +341171
    +341179
    +341191
    +341203
    +341219
    +341227
    +341233
    +341269
    +341273
    +341281
    +341287
    +341293
    +341303
    +341311
    +341321
    +341323
    +341333
    +341339
    +341347
    +341357
    +341423
    +341443
    +341447
    +341459
    +341461
    +341477
    +341491
    +341501
    +341507
    +341521
    +341543
    +341557
    +341569
    +341587
    +341597
    +341603
    +341617
    +341623
    +341629
    +341641
    +341647
    +341659
    +341681
    +341687
    +341701
    +341729
    +341743
    +341749
    +341771
    +341773
    +341777
    +341813
    +341821
    +341827
    +341839
    +341851
    +341863
    +341879
    +341911
    +341927
    +341947
    +341951
    +341953
    +341959
    +341963
    +341983
    +341993
    +342037
    +342047
    +342049
    +342059
    +342061
    +342071
    +342073
    +342077
    +342101
    +342107
    +342131
    +342143
    +342179
    +342187
    +342191
    +342197
    +342203
    +342211
    +342233
    +342239
    +342241
    +342257
    +342281
    +342283
    +342299
    +342319
    +342337
    +342341
    +342343
    +342347
    +342359
    +342371
    +342373
    +342379
    +342389
    +342413
    +342421
    +342449
    +342451
    +342467
    +342469
    +342481
    +342497
    +342521
    +342527
    +342547
    +342553
    +342569
    +342593
    +342599
    +342607
    +342647
    +342653
    +342659
    +342673
    +342679
    +342691
    +342697
    +342733
    +342757
    +342761
    +342791
    +342799
    +342803
    +342821
    +342833
    +342841
    +342847
    +342863
    +342869
    +342871
    +342889
    +342899
    +342929
    +342949
    +342971
    +342989
    +343019
    +343037
    +343051
    +343061
    +343073
    +343081
    +343087
    +343127
    +343141
    +343153
    +343163
    +343169
    +343177
    +343193
    +343199
    +343219
    +343237
    +343243
    +343253
    +343261
    +343267
    +343289
    +343303
    +343307
    +343309
    +343313
    +343327
    +343333
    +343337
    +343373
    +343379
    +343381
    +343391
    +343393
    +343411
    +343423
    +343433
    +343481
    +343489
    +343517
    +343529
    +343531
    +343543
    +343547
    +343559
    +343561
    +343579
    +343583
    +343589
    +343591
    +343601
    +343627
    +343631
    +343639
    +343649
    +343661
    +343667
    +343687
    +343709
    +343727
    +343769
    +343771
    +343787
    +343799
    +343801
    +343813
    +343817
    +343823
    +343829
    +343831
    +343891
    +343897
    +343901
    +343913
    +343933
    +343939
    +343943
    +343951
    +343963
    +343997
    +344017
    +344021
    +344039
    +344053
    +344083
    +344111
    +344117
    +344153
    +344161
    +344167
    +344171
    +344173
    +344177
    +344189
    +344207
    +344209
    +344213
    +344221
    +344231
    +344237
    +344243
    +344249
    +344251
    +344257
    +344263
    +344269
    +344273
    +344291
    +344293
    +344321
    +344327
    +344347
    +344353
    +344363
    +344371
    +344417
    +344423
    +344429
    +344453
    +344479
    +344483
    +344497
    +344543
    +344567
    +344587
    +344599
    +344611
    +344621
    +344629
    +344639
    +344653
    +344671
    +344681
    +344683
    +344693
    +344719
    +344749
    +344753
    +344759
    +344791
    +344797
    +344801
    +344807
    +344819
    +344821
    +344843
    +344857
    +344863
    +344873
    +344887
    +344893
    +344909
    +344917
    +344921
    +344941
    +344957
    +344959
    +344963
    +344969
    +344987
    +345001
    +345011
    +345017
    +345019
    +345041
    +345047
    +345067
    +345089
    +345109
    +345133
    +345139
    +345143
    +345181
    +345193
    +345221
    +345227
    +345229
    +345259
    +345263
    +345271
    +345307
    +345311
    +345329
    +345379
    +345413
    +345431
    +345451
    +345461
    +345463
    +345473
    +345479
    +345487
    +345511
    +345517
    +345533
    +345547
    +345551
    +345571
    +345577
    +345581
    +345599
    +345601
    +345607
    +345637
    +345643
    +345647
    +345659
    +345673
    +345679
    +345689
    +345701
    +345707
    +345727
    +345731
    +345733
    +345739
    +345749
    +345757
    +345769
    +345773
    +345791
    +345803
    +345811
    +345817
    +345823
    +345853
    +345869
    +345881
    +345887
    +345889
    +345907
    +345923
    +345937
    +345953
    +345979
    +345997
    +346013
    +346039
    +346043
    +346051
    +346079
    +346091
    +346097
    +346111
    +346117
    +346133
    +346139
    +346141
    +346147
    +346169
    +346187
    +346201
    +346207
    +346217
    +346223
    +346259
    +346261
    +346277
    +346303
    +346309
    +346321
    +346331
    +346337
    +346349
    +346361
    +346369
    +346373
    +346391
    +346393
    +346397
    +346399
    +346417
    +346421
    +346429
    +346433
    +346439
    +346441
    +346447
    +346453
    +346469
    +346501
    +346529
    +346543
    +346547
    +346553
    +346559
    +346561
    +346589
    +346601
    +346607
    +346627
    +346639
    +346649
    +346651
    +346657
    +346667
    +346669
    +346699
    +346711
    +346721
    +346739
    +346751
    +346763
    +346793
    +346831
    +346849
    +346867
    +346873
    +346877
    +346891
    +346903
    +346933
    +346939
    +346943
    +346961
    +346963
    +347003
    +347033
    +347041
    +347051
    +347057
    +347059
    +347063
    +347069
    +347071
    +347099
    +347129
    +347131
    +347141
    +347143
    +347161
    +347167
    +347173
    +347177
    +347183
    +347197
    +347201
    +347209
    +347227
    +347233
    +347239
    +347251
    +347257
    +347287
    +347297
    +347299
    +347317
    +347329
    +347341
    +347359
    +347401
    +347411
    +347437
    +347443
    +347489
    +347509
    +347513
    +347519
    +347533
    +347539
    +347561
    +347563
    +347579
    +347587
    +347591
    +347609
    +347621
    +347629
    +347651
    +347671
    +347707
    +347717
    +347729
    +347731
    +347747
    +347759
    +347771
    +347773
    +347779
    +347801
    +347813
    +347821
    +347849
    +347873
    +347887
    +347891
    +347899
    +347929
    +347933
    +347951
    +347957
    +347959
    +347969
    +347981
    +347983
    +347987
    +347989
    +347993
    +348001
    +348011
    +348017
    +348031
    +348043
    +348053
    +348077
    +348083
    +348097
    +348149
    +348163
    +348181
    +348191
    +348209
    +348217
    +348221
    +348239
    +348241
    +348247
    +348253
    +348259
    +348269
    +348287
    +348307
    +348323
    +348353
    +348367
    +348389
    +348401
    +348407
    +348419
    +348421
    +348431
    +348433
    +348437
    +348443
    +348451
    +348457
    +348461
    +348463
    +348487
    +348527
    +348547
    +348553
    +348559
    +348563
    +348571
    +348583
    +348587
    +348617
    +348629
    +348637
    +348643
    +348661
    +348671
    +348709
    +348731
    +348739
    +348757
    +348763
    +348769
    +348779
    +348811
    +348827
    +348833
    +348839
    +348851
    +348883
    +348889
    +348911
    +348917
    +348919
    +348923
    +348937
    +348949
    +348989
    +348991
    +349007
    +349039
    +349043
    +349051
    +349079
    +349081
    +349093
    +349099
    +349109
    +349121
    +349133
    +349171
    +349177
    +349183
    +349187
    +349199
    +349207
    +349211
    +349241
    +349291
    +349303
    +349313
    +349331
    +349337
    +349343
    +349357
    +349369
    +349373
    +349379
    +349381
    +349387
    +349397
    +349399
    +349403
    +349409
    +349411
    +349423
    +349471
    +349477
    +349483
    +349493
    +349499
    +349507
    +349519
    +349529
    +349553
    +349567
    +349579
    +349589
    +349603
    +349637
    +349663
    +349667
    +349697
    +349709
    +349717
    +349729
    +349753
    +349759
    +349787
    +349793
    +349801
    +349813
    +349819
    +349829
    +349831
    +349837
    +349841
    +349849
    +349871
    +349903
    +349907
    +349913
    +349919
    +349927
    +349931
    +349933
    +349939
    +349949
    +349963
    +349967
    +349981
    +350003
    +350029
    +350033
    +350039
    +350087
    +350089
    +350093
    +350107
    +350111
    +350137
    +350159
    +350179
    +350191
    +350213
    +350219
    +350237
    +350249
    +350257
    +350281
    +350293
    +350347
    +350351
    +350377
    +350381
    +350411
    +350423
    +350429
    +350431
    +350437
    +350443
    +350447
    +350453
    +350459
    +350503
    +350521
    +350549
    +350561
    +350563
    +350587
    +350593
    +350617
    +350621
    +350629
    +350657
    +350663
    +350677
    +350699
    +350711
    +350719
    +350729
    +350731
    +350737
    +350741
    +350747
    +350767
    +350771
    +350783
    +350789
    +350803
    +350809
    +350843
    +350851
    +350869
    +350881
    +350887
    +350891
    +350899
    +350941
    +350947
    +350963
    +350971
    +350981
    +350983
    +350989
    +351011
    +351023
    +351031
    +351037
    +351041
    +351047
    +351053
    +351059
    +351061
    +351077
    +351079
    +351097
    +351121
    +351133
    +351151
    +351157
    +351179
    +351217
    +351223
    +351229
    +351257
    +351259
    +351269
    +351287
    +351289
    +351293
    +351301
    +351311
    +351341
    +351343
    +351347
    +351359
    +351361
    +351383
    +351391
    +351397
    +351401
    +351413
    +351427
    +351437
    +351457
    +351469
    +351479
    +351497
    +351503
    +351517
    +351529
    +351551
    +351563
    +351587
    +351599
    +351643
    +351653
    +351661
    +351667
    +351691
    +351707
    +351727
    +351731
    +351733
    +351749
    +351751
    +351763
    +351773
    +351779
    +351797
    +351803
    +351811
    +351829
    +351847
    +351851
    +351859
    +351863
    +351887
    +351913
    +351919
    +351929
    +351931
    +351959
    +351971
    +351991
    +352007
    +352021
    +352043
    +352049
    +352057
    +352069
    +352073
    +352081
    +352097
    +352109
    +352111
    +352123
    +352133
    +352181
    +352193
    +352201
    +352217
    +352229
    +352237
    +352249
    +352267
    +352271
    +352273
    +352301
    +352309
    +352327
    +352333
    +352349
    +352357
    +352361
    +352367
    +352369
    +352381
    +352399
    +352403
    +352409
    +352411
    +352421
    +352423
    +352441
    +352459
    +352463
    +352481
    +352483
    +352489
    +352493
    +352511
    +352523
    +352543
    +352549
    +352579
    +352589
    +352601
    +352607
    +352619
    +352633
    +352637
    +352661
    +352691
    +352711
    +352739
    +352741
    +352753
    +352757
    +352771
    +352813
    +352817
    +352819
    +352831
    +352837
    +352841
    +352853
    +352867
    +352883
    +352907
    +352909
    +352931
    +352939
    +352949
    +352951
    +352973
    +352991
    +353011
    +353021
    +353047
    +353053
    +353057
    +353069
    +353081
    +353099
    +353117
    +353123
    +353137
    +353147
    +353149
    +353161
    +353173
    +353179
    +353201
    +353203
    +353237
    +353263
    +353293
    +353317
    +353321
    +353329
    +353333
    +353341
    +353359
    +353389
    +353401
    +353411
    +353429
    +353443
    +353453
    +353459
    +353471
    +353473
    +353489
    +353501
    +353527
    +353531
    +353557
    +353567
    +353603
    +353611
    +353621
    +353627
    +353629
    +353641
    +353653
    +353657
    +353677
    +353681
    +353687
    +353699
    +353711
    +353737
    +353747
    +353767
    +353777
    +353783
    +353797
    +353807
    +353813
    +353819
    +353833
    +353867
    +353869
    +353879
    +353891
    +353897
    +353911
    +353917
    +353921
    +353929
    +353939
    +353963
    +354001
    +354007
    +354017
    +354023
    +354031
    +354037
    +354041
    +354043
    +354047
    +354073
    +354091
    +354097
    +354121
    +354139
    +354143
    +354149
    +354163
    +354169
    +354181
    +354209
    +354247
    +354251
    +354253
    +354257
    +354259
    +354271
    +354301
    +354307
    +354313
    +354317
    +354323
    +354329
    +354337
    +354353
    +354371
    +354373
    +354377
    +354383
    +354391
    +354401
    +354421
    +354439
    +354443
    +354451
    +354461
    +354463
    +354469
    +354479
    +354533
    +354539
    +354551
    +354553
    +354581
    +354587
    +354619
    +354643
    +354647
    +354661
    +354667
    +354677
    +354689
    +354701
    +354703
    +354727
    +354737
    +354743
    +354751
    +354763
    +354779
    +354791
    +354799
    +354829
    +354833
    +354839
    +354847
    +354869
    +354877
    +354881
    +354883
    +354911
    +354953
    +354961
    +354971
    +354973
    +354979
    +354983
    +354997
    +355007
    +355009
    +355027
    +355031
    +355037
    +355039
    +355049
    +355057
    +355063
    +355073
    +355087
    +355093
    +355099
    +355109
    +355111
    +355127
    +355139
    +355171
    +355193
    +355211
    +355261
    +355297
    +355307
    +355321
    +355331
    +355339
    +355343
    +355361
    +355363
    +355379
    +355417
    +355427
    +355441
    +355457
    +355463
    +355483
    +355499
    +355501
    +355507
    +355513
    +355517
    +355519
    +355529
    +355541
    +355549
    +355559
    +355571
    +355573
    +355591
    +355609
    +355633
    +355643
    +355651
    +355669
    +355679
    +355697
    +355717
    +355721
    +355723
    +355753
    +355763
    +355777
    +355783
    +355799
    +355811
    +355819
    +355841
    +355847
    +355853
    +355867
    +355891
    +355909
    +355913
    +355933
    +355937
    +355939
    +355951
    +355967
    +355969
    +356023
    +356039
    +356077
    +356093
    +356101
    +356113
    +356123
    +356129
    +356137
    +356141
    +356143
    +356171
    +356173
    +356197
    +356219
    +356243
    +356261
    +356263
    +356287
    +356299
    +356311
    +356327
    +356333
    +356351
    +356387
    +356399
    +356441
    +356443
    +356449
    +356453
    +356467
    +356479
    +356501
    +356509
    +356533
    +356549
    +356561
    +356563
    +356567
    +356579
    +356591
    +356621
    +356647
    +356663
    +356693
    +356701
    +356731
    +356737
    +356749
    +356761
    +356803
    +356819
    +356821
    +356831
    +356869
    +356887
    +356893
    +356927
    +356929
    +356933
    +356947
    +356959
    +356969
    +356977
    +356981
    +356989
    +356999
    +357031
    +357047
    +357073
    +357079
    +357083
    +357103
    +357107
    +357109
    +357131
    +357139
    +357169
    +357179
    +357197
    +357199
    +357211
    +357229
    +357239
    +357241
    +357263
    +357271
    +357281
    +357283
    +357293
    +357319
    +357347
    +357349
    +357353
    +357359
    +357377
    +357389
    +357421
    +357431
    +357437
    +357473
    +357503
    +357509
    +357517
    +357551
    +357559
    +357563
    +357569
    +357571
    +357583
    +357587
    +357593
    +357611
    +357613
    +357619
    +357649
    +357653
    +357659
    +357661
    +357667
    +357671
    +357677
    +357683
    +357689
    +357703
    +357727
    +357733
    +357737
    +357739
    +357767
    +357779
    +357781
    +357787
    +357793
    +357809
    +357817
    +357823
    +357829
    +357839
    +357859
    +357883
    +357913
    +357967
    +357977
    +357983
    +357989
    +357997
    +358031
    +358051
    +358069
    +358073
    +358079
    +358103
    +358109
    +358153
    +358157
    +358159
    +358181
    +358201
    +358213
    +358219
    +358223
    +358229
    +358243
    +358273
    +358277
    +358279
    +358289
    +358291
    +358297
    +358301
    +358313
    +358327
    +358331
    +358349
    +358373
    +358417
    +358427
    +358429
    +358441
    +358447
    +358459
    +358471
    +358483
    +358487
    +358499
    +358531
    +358541
    +358571
    +358573
    +358591
    +358597
    +358601
    +358607
    +358613
    +358637
    +358667
    +358669
    +358681
    +358691
    +358697
    +358703
    +358711
    +358723
    +358727
    +358733
    +358747
    +358753
    +358769
    +358783
    +358793
    +358811
    +358829
    +358847
    +358859
    +358861
    +358867
    +358877
    +358879
    +358901
    +358903
    +358907
    +358909
    +358931
    +358951
    +358973
    +358979
    +358987
    +358993
    +358999
    +359003
    +359017
    +359027
    +359041
    +359063
    +359069
    +359101
    +359111
    +359129
    +359137
    +359143
    +359147
    +359153
    +359167
    +359171
    +359207
    +359209
    +359231
    +359243
    +359263
    +359267
    +359279
    +359291
    +359297
    +359299
    +359311
    +359323
    +359327
    +359353
    +359357
    +359377
    +359389
    +359407
    +359417
    +359419
    +359441
    +359449
    +359477
    +359479
    +359483
    +359501
    +359509
    +359539
    +359549
    +359561
    +359563
    +359581
    +359587
    +359599
    +359621
    +359633
    +359641
    +359657
    +359663
    +359701
    +359713
    +359719
    +359731
    +359747
    +359753
    +359761
    +359767
    +359783
    +359837
    +359851
    +359869
    +359897
    +359911
    +359929
    +359981
    +359987
    +360007
    +360023
    +360037
    +360049
    +360053
    +360071
    +360089
    +360091
    +360163
    +360167
    +360169
    +360181
    +360187
    +360193
    +360197
    +360223
    +360229
    +360233
    +360257
    +360271
    +360277
    +360287
    +360289
    +360293
    +360307
    +360317
    +360323
    +360337
    +360391
    +360407
    +360421
    +360439
    +360457
    +360461
    +360497
    +360509
    +360511
    +360541
    +360551
    +360589
    +360593
    +360611
    +360637
    +360649
    +360653
    +360749
    +360769
    +360779
    +360781
    +360803
    +360817
    +360821
    +360823
    +360827
    +360851
    +360853
    +360863
    +360869
    +360901
    +360907
    +360947
    +360949
    +360953
    +360959
    +360973
    +360977
    +360979
    +360989
    +361001
    +361003
    +361013
    +361033
    +361069
    +361091
    +361093
    +361111
    +361159
    +361183
    +361211
    +361213
    +361217
    +361219
    +361223
    +361237
    +361241
    +361271
    +361279
    +361313
    +361321
    +361327
    +361337
    +361349
    +361351
    +361357
    +361363
    +361373
    +361409
    +361411
    +361421
    +361433
    +361441
    +361447
    +361451
    +361463
    +361469
    +361481
    +361499
    +361507
    +361511
    +361523
    +361531
    +361541
    +361549
    +361561
    +361577
    +361637
    +361643
    +361649
    +361651
    +361663
    +361679
    +361687
    +361723
    +361727
    +361747
    +361763
    +361769
    +361787
    +361789
    +361793
    +361799
    +361807
    +361843
    +361871
    +361873
    +361877
    +361901
    +361903
    +361909
    +361919
    +361927
    +361943
    +361961
    +361967
    +361973
    +361979
    +361993
    +362003
    +362027
    +362051
    +362053
    +362059
    +362069
    +362081
    +362093
    +362099
    +362107
    +362137
    +362143
    +362147
    +362161
    +362177
    +362191
    +362203
    +362213
    +362221
    +362233
    +362237
    +362281
    +362291
    +362293
    +362303
    +362309
    +362333
    +362339
    +362347
    +362353
    +362357
    +362363
    +362371
    +362377
    +362381
    +362393
    +362407
    +362419
    +362429
    +362431
    +362443
    +362449
    +362459
    +362473
    +362521
    +362561
    +362569
    +362581
    +362599
    +362629
    +362633
    +362657
    +362693
    +362707
    +362717
    +362723
    +362741
    +362743
    +362749
    +362753
    +362759
    +362801
    +362851
    +362863
    +362867
    +362897
    +362903
    +362911
    +362927
    +362941
    +362951
    +362953
    +362969
    +362977
    +362983
    +362987
    +363017
    +363019
    +363037
    +363043
    +363047
    +363059
    +363061
    +363067
    +363119
    +363149
    +363151
    +363157
    +363161
    +363173
    +363179
    +363199
    +363211
    +363217
    +363257
    +363269
    +363271
    +363277
    +363313
    +363317
    +363329
    +363343
    +363359
    +363361
    +363367
    +363371
    +363373
    +363379
    +363397
    +363401
    +363403
    +363431
    +363437
    +363439
    +363463
    +363481
    +363491
    +363497
    +363523
    +363529
    +363533
    +363541
    +363551
    +363557
    +363563
    +363569
    +363577
    +363581
    +363589
    +363611
    +363619
    +363659
    +363677
    +363683
    +363691
    +363719
    +363731
    +363751
    +363757
    +363761
    +363767
    +363773
    +363799
    +363809
    +363829
    +363833
    +363841
    +363871
    +363887
    +363889
    +363901
    +363911
    +363917
    +363941
    +363947
    +363949
    +363959
    +363967
    +363977
    +363989
    +364027
    +364031
    +364069
    +364073
    +364079
    +364103
    +364127
    +364129
    +364141
    +364171
    +364183
    +364187
    +364193
    +364213
    +364223
    +364241
    +364267
    +364271
    +364289
    +364291
    +364303
    +364313
    +364321
    +364333
    +364337
    +364349
    +364373
    +364379
    +364393
    +364411
    +364417
    +364423
    +364433
    +364447
    +364451
    +364459
    +364471
    +364499
    +364513
    +364523
    +364537
    +364541
    +364543
    +364571
    +364583
    +364601
    +364607
    +364621
    +364627
    +364643
    +364657
    +364669
    +364687
    +364691
    +364699
    +364717
    +364739
    +364747
    +364751
    +364753
    +364759
    +364801
    +364829
    +364853
    +364873
    +364879
    +364883
    +364891
    +364909
    +364919
    +364921
    +364937
    +364943
    +364961
    +364979
    +364993
    +364997
    +365003
    +365017
    +365021
    +365039
    +365063
    +365069
    +365089
    +365107
    +365119
    +365129
    +365137
    +365147
    +365159
    +365173
    +365179
    +365201
    +365213
    +365231
    +365249
    +365251
    +365257
    +365291
    +365293
    +365297
    +365303
    +365327
    +365333
    +365357
    +365369
    +365377
    +365411
    +365413
    +365419
    +365423
    +365441
    +365461
    +365467
    +365471
    +365473
    +365479
    +365489
    +365507
    +365509
    +365513
    +365527
    +365531
    +365537
    +365557
    +365567
    +365569
    +365587
    +365591
    +365611
    +365627
    +365639
    +365641
    +365669
    +365683
    +365689
    +365699
    +365747
    +365749
    +365759
    +365773
    +365779
    +365791
    +365797
    +365809
    +365837
    +365839
    +365851
    +365903
    +365929
    +365933
    +365941
    +365969
    +365983
    +366001
    +366013
    +366019
    +366029
    +366031
    +366053
    +366077
    +366097
    +366103
    +366127
    +366133
    +366139
    +366161
    +366167
    +366169
    +366173
    +366181
    +366193
    +366199
    +366211
    +366217
    +366221
    +366227
    +366239
    +366259
    +366269
    +366277
    +366287
    +366293
    +366307
    +366313
    +366329
    +366341
    +366343
    +366347
    +366383
    +366397
    +366409
    +366419
    +366433
    +366437
    +366439
    +366461
    +366463
    +366467
    +366479
    +366497
    +366511
    +366517
    +366521
    +366547
    +366593
    +366599
    +366607
    +366631
    +366677
    +366683
    +366697
    +366701
    +366703
    +366713
    +366721
    +366727
    +366733
    +366787
    +366791
    +366811
    +366829
    +366841
    +366851
    +366853
    +366859
    +366869
    +366881
    +366889
    +366901
    +366907
    +366917
    +366923
    +366941
    +366953
    +366967
    +366973
    +366983
    +366997
    +367001
    +367007
    +367019
    +367021
    +367027
    +367033
    +367049
    +367069
    +367097
    +367121
    +367123
    +367127
    +367139
    +367163
    +367181
    +367189
    +367201
    +367207
    +367219
    +367229
    +367231
    +367243
    +367259
    +367261
    +367273
    +367277
    +367307
    +367309
    +367313
    +367321
    +367357
    +367369
    +367391
    +367397
    +367427
    +367453
    +367457
    +367469
    +367501
    +367519
    +367531
    +367541
    +367547
    +367559
    +367561
    +367573
    +367597
    +367603
    +367613
    +367621
    +367637
    +367649
    +367651
    +367663
    +367673
    +367687
    +367699
    +367711
    +367721
    +367733
    +367739
    +367751
    +367771
    +367777
    +367781
    +367789
    +367819
    +367823
    +367831
    +367841
    +367849
    +367853
    +367867
    +367879
    +367883
    +367889
    +367909
    +367949
    +367957
    +368021
    +368029
    +368047
    +368059
    +368077
    +368083
    +368089
    +368099
    +368107
    +368111
    +368117
    +368129
    +368141
    +368149
    +368153
    +368171
    +368189
    +368197
    +368227
    +368231
    +368233
    +368243
    +368273
    +368279
    +368287
    +368293
    +368323
    +368327
    +368359
    +368363
    +368369
    +368399
    +368411
    +368443
    +368447
    +368453
    +368471
    +368491
    +368507
    +368513
    +368521
    +368531
    +368539
    +368551
    +368579
    +368593
    +368597
    +368609
    +368633
    +368647
    +368651
    +368653
    +368689
    +368717
    +368729
    +368737
    +368743
    +368773
    +368783
    +368789
    +368791
    +368801
    +368803
    +368833
    +368857
    +368873
    +368881
    +368899
    +368911
    +368939
    +368947
    +368957
    +369007
    +369013
    +369023
    +369029
    +369067
    +369071
    +369077
    +369079
    +369097
    +369119
    +369133
    +369137
    +369143
    +369169
    +369181
    +369191
    +369197
    +369211
    +369247
    +369253
    +369263
    +369269
    +369283
    +369293
    +369301
    +369319
    +369331
    +369353
    +369361
    +369407
    +369409
    +369419
    +369469
    +369487
    +369491
    +369539
    +369553
    +369557
    +369581
    +369637
    +369647
    +369659
    +369661
    +369673
    +369703
    +369709
    +369731
    +369739
    +369751
    +369791
    +369793
    +369821
    +369827
    +369829
    +369833
    +369841
    +369851
    +369877
    +369893
    +369913
    +369917
    +369947
    +369959
    +369961
    +369979
    +369983
    +369991
    +369997
    +370003
    +370009
    +370021
    +370033
    +370057
    +370061
    +370067
    +370081
    +370091
    +370103
    +370121
    +370133
    +370147
    +370159
    +370169
    +370193
    +370199
    +370207
    +370213
    +370217
    +370241
    +370247
    +370261
    +370373
    +370387
    +370399
    +370411
    +370421
    +370423
    +370427
    +370439
    +370441
    +370451
    +370463
    +370471
    +370477
    +370483
    +370493
    +370511
    +370529
    +370537
    +370547
    +370561
    +370571
    +370597
    +370603
    +370609
    +370613
    +370619
    +370631
    +370661
    +370663
    +370673
    +370679
    +370687
    +370693
    +370723
    +370759
    +370793
    +370801
    +370813
    +370837
    +370871
    +370873
    +370879
    +370883
    +370891
    +370897
    +370919
    +370949
    +371027
    +371029
    +371057
    +371069
    +371071
    +371083
    +371087
    +371099
    +371131
    +371141
    +371143
    +371153
    +371177
    +371179
    +371191
    +371213
    +371227
    +371233
    +371237
    +371249
    +371251
    +371257
    +371281
    +371291
    +371299
    +371303
    +371311
    +371321
    +371333
    +371339
    +371341
    +371353
    +371359
    +371383
    +371387
    +371389
    +371417
    +371447
    +371453
    +371471
    +371479
    +371491
    +371509
    +371513
    +371549
    +371561
    +371573
    +371587
    +371617
    +371627
    +371633
    +371639
    +371663
    +371669
    +371699
    +371719
    +371737
    +371779
    +371797
    +371831
    +371837
    +371843
    +371851
    +371857
    +371869
    +371873
    +371897
    +371927
    +371929
    +371939
    +371941
    +371951
    +371957
    +371971
    +371981
    +371999
    +372013
    +372023
    +372037
    +372049
    +372059
    +372061
    +372067
    +372107
    +372121
    +372131
    +372137
    +372149
    +372167
    +372173
    +372179
    +372223
    +372241
    +372263
    +372269
    +372271
    +372277
    +372289
    +372293
    +372299
    +372311
    +372313
    +372353
    +372367
    +372371
    +372377
    +372397
    +372401
    +372409
    +372413
    +372443
    +372451
    +372461
    +372473
    +372481
    +372497
    +372511
    +372523
    +372539
    +372607
    +372611
    +372613
    +372629
    +372637
    +372653
    +372661
    +372667
    +372677
    +372689
    +372707
    +372709
    +372719
    +372733
    +372739
    +372751
    +372763
    +372769
    +372773
    +372797
    +372803
    +372809
    +372817
    +372829
    +372833
    +372839
    +372847
    +372859
    +372871
    +372877
    +372881
    +372901
    +372917
    +372941
    +372943
    +372971
    +372973
    +372979
    +373003
    +373007
    +373019
    +373049
    +373063
    +373073
    +373091
    +373127
    +373151
    +373157
    +373171
    +373181
    +373183
    +373187
    +373193
    +373199
    +373207
    +373211
    +373213
    +373229
    +373231
    +373273
    +373291
    +373297
    +373301
    +373327
    +373339
    +373343
    +373349
    +373357
    +373361
    +373363
    +373379
    +373393
    +373447
    +373453
    +373459
    +373463
    +373487
    +373489
    +373501
    +373517
    +373553
    +373561
    +373567
    +373613
    +373621
    +373631
    +373649
    +373657
    +373661
    +373669
    +373693
    +373717
    +373721
    +373753
    +373757
    +373777
    +373783
    +373823
    +373837
    +373859
    +373861
    +373903
    +373909
    +373937
    +373943
    +373951
    +373963
    +373969
    +373981
    +373987
    +373999
    +374009
    +374029
    +374039
    +374041
    +374047
    +374063
    +374069
    +374083
    +374089
    +374093
    +374111
    +374117
    +374123
    +374137
    +374149
    +374159
    +374173
    +374177
    +374189
    +374203
    +374219
    +374239
    +374287
    +374291
    +374293
    +374299
    +374317
    +374321
    +374333
    +374347
    +374351
    +374359
    +374389
    +374399
    +374441
    +374443
    +374447
    +374461
    +374483
    +374501
    +374531
    +374537
    +374557
    +374587
    +374603
    +374639
    +374641
    +374653
    +374669
    +374677
    +374681
    +374683
    +374687
    +374701
    +374713
    +374719
    +374729
    +374741
    +374753
    +374761
    +374771
    +374783
    +374789
    +374797
    +374807
    +374819
    +374837
    +374839
    +374849
    +374879
    +374887
    +374893
    +374903
    +374909
    +374929
    +374939
    +374953
    +374977
    +374981
    +374987
    +374989
    +374993
    +375017
    +375019
    +375029
    +375043
    +375049
    +375059
    +375083
    +375091
    +375097
    +375101
    +375103
    +375113
    +375119
    +375121
    +375127
    +375149
    +375157
    +375163
    +375169
    +375203
    +375209
    +375223
    +375227
    +375233
    +375247
    +375251
    +375253
    +375257
    +375259
    +375281
    +375283
    +375311
    +375341
    +375359
    +375367
    +375371
    +375373
    +375391
    +375407
    +375413
    +375443
    +375449
    +375451
    +375457
    +375467
    +375481
    +375509
    +375511
    +375523
    +375527
    +375533
    +375553
    +375559
    +375563
    +375569
    +375593
    +375607
    +375623
    +375631
    +375643
    +375647
    +375667
    +375673
    +375703
    +375707
    +375709
    +375743
    +375757
    +375761
    +375773
    +375779
    +375787
    +375799
    +375833
    +375841
    +375857
    +375899
    +375901
    +375923
    +375931
    +375967
    +375971
    +375979
    +375983
    +375997
    +376001
    +376003
    +376009
    +376021
    +376039
    +376049
    +376063
    +376081
    +376097
    +376099
    +376127
    +376133
    +376147
    +376153
    +376171
    +376183
    +376199
    +376231
    +376237
    +376241
    +376283
    +376291
    +376297
    +376307
    +376351
    +376373
    +376393
    +376399
    +376417
    +376463
    +376469
    +376471
    +376477
    +376483
    +376501
    +376511
    +376529
    +376531
    +376547
    +376573
    +376577
    +376583
    +376589
    +376603
    +376609
    +376627
    +376631
    +376633
    +376639
    +376657
    +376679
    +376687
    +376699
    +376709
    +376721
    +376729
    +376757
    +376759
    +376769
    +376787
    +376793
    +376801
    +376807
    +376811
    +376819
    +376823
    +376837
    +376841
    +376847
    +376853
    +376889
    +376891
    +376897
    +376921
    +376927
    +376931
    +376933
    +376949
    +376963
    +376969
    +377011
    +377021
    +377051
    +377059
    +377071
    +377099
    +377123
    +377129
    +377137
    +377147
    +377171
    +377173
    +377183
    +377197
    +377219
    +377231
    +377257
    +377263
    +377287
    +377291
    +377297
    +377327
    +377329
    +377339
    +377347
    +377353
    +377369
    +377371
    +377387
    +377393
    +377459
    +377471
    +377477
    +377491
    +377513
    +377521
    +377527
    +377537
    +377543
    +377557
    +377561
    +377563
    +377581
    +377593
    +377599
    +377617
    +377623
    +377633
    +377653
    +377681
    +377687
    +377711
    +377717
    +377737
    +377749
    +377761
    +377771
    +377779
    +377789
    +377801
    +377809
    +377827
    +377831
    +377843
    +377851
    +377873
    +377887
    +377911
    +377963
    +377981
    +377999
    +378011
    +378019
    +378023
    +378041
    +378071
    +378083
    +378089
    +378101
    +378127
    +378137
    +378149
    +378151
    +378163
    +378167
    +378179
    +378193
    +378223
    +378229
    +378239
    +378241
    +378253
    +378269
    +378277
    +378283
    +378289
    +378317
    +378353
    +378361
    +378379
    +378401
    +378407
    +378439
    +378449
    +378463
    +378467
    +378493
    +378503
    +378509
    +378523
    +378533
    +378551
    +378559
    +378569
    +378571
    +378583
    +378593
    +378601
    +378619
    +378629
    +378661
    +378667
    +378671
    +378683
    +378691
    +378713
    +378733
    +378739
    +378757
    +378761
    +378779
    +378793
    +378809
    +378817
    +378821
    +378823
    +378869
    +378883
    +378893
    +378901
    +378919
    +378929
    +378941
    +378949
    +378953
    +378967
    +378977
    +378997
    +379007
    +379009
    +379013
    +379033
    +379039
    +379073
    +379081
    +379087
    +379097
    +379103
    +379123
    +379133
    +379147
    +379157
    +379163
    +379177
    +379187
    +379189
    +379199
    +379207
    +379273
    +379277
    +379283
    +379289
    +379307
    +379319
    +379333
    +379343
    +379369
    +379387
    +379391
    +379397
    +379399
    +379417
    +379433
    +379439
    +379441
    +379451
    +379459
    +379499
    +379501
    +379513
    +379531
    +379541
    +379549
    +379571
    +379573
    +379579
    +379597
    +379607
    +379633
    +379649
    +379663
    +379667
    +379679
    +379681
    +379693
    +379699
    +379703
    +379721
    +379723
    +379727
    +379751
    +379777
    +379787
    +379811
    +379817
    +379837
    +379849
    +379853
    +379859
    +379877
    +379889
    +379903
    +379909
    +379913
    +379927
    +379931
    +379963
    +379979
    +379993
    +379997
    +379999
    +380041
    +380047
    +380059
    +380071
    +380117
    +380129
    +380131
    +380141
    +380147
    +380179
    +380189
    +380197
    +380201
    +380203
    +380207
    +380231
    +380251
    +380267
    +380269
    +380287
    +380291
    +380299
    +380309
    +380311
    +380327
    +380329
    +380333
    +380363
    +380377
    +380383
    +380417
    +380423
    +380441
    +380447
    +380453
    +380459
    +380461
    +380483
    +380503
    +380533
    +380557
    +380563
    +380591
    +380621
    +380623
    +380629
    +380641
    +380651
    +380657
    +380707
    +380713
    +380729
    +380753
    +380777
    +380797
    +380803
    +380819
    +380837
    +380839
    +380843
    +380867
    +380869
    +380879
    +380881
    +380909
    +380917
    +380929
    +380951
    +380957
    +380971
    +380977
    +380983
    +381001
    +381011
    +381019
    +381037
    +381047
    +381061
    +381071
    +381077
    +381097
    +381103
    +381167
    +381169
    +381181
    +381209
    +381221
    +381223
    +381233
    +381239
    +381253
    +381287
    +381289
    +381301
    +381319
    +381323
    +381343
    +381347
    +381371
    +381373
    +381377
    +381383
    +381389
    +381401
    +381413
    +381419
    +381439
    +381443
    +381461
    +381467
    +381481
    +381487
    +381509
    +381523
    +381527
    +381529
    +381533
    +381541
    +381559
    +381569
    +381607
    +381629
    +381631
    +381637
    +381659
    +381673
    +381697
    +381707
    +381713
    +381737
    +381739
    +381749
    +381757
    +381761
    +381791
    +381793
    +381817
    +381841
    +381853
    +381859
    +381911
    +381917
    +381937
    +381943
    +381949
    +381977
    +381989
    +381991
    +382001
    +382003
    +382021
    +382037
    +382061
    +382069
    +382073
    +382087
    +382103
    +382117
    +382163
    +382171
    +382189
    +382229
    +382231
    +382241
    +382253
    +382267
    +382271
    +382303
    +382331
    +382351
    +382357
    +382363
    +382373
    +382391
    +382427
    +382429
    +382457
    +382463
    +382493
    +382507
    +382511
    +382519
    +382541
    +382549
    +382553
    +382567
    +382579
    +382583
    +382589
    +382601
    +382621
    +382631
    +382643
    +382649
    +382661
    +382663
    +382693
    +382703
    +382709
    +382727
    +382729
    +382747
    +382751
    +382763
    +382769
    +382777
    +382801
    +382807
    +382813
    +382843
    +382847
    +382861
    +382867
    +382871
    +382873
    +382883
    +382919
    +382933
    +382939
    +382961
    +382979
    +382999
    +383011
    +383023
    +383029
    +383041
    +383051
    +383069
    +383077
    +383081
    +383083
    +383099
    +383101
    +383107
    +383113
    +383143
    +383147
    +383153
    +383171
    +383179
    +383219
    +383221
    +383261
    +383267
    +383281
    +383291
    +383297
    +383303
    +383321
    +383347
    +383371
    +383393
    +383399
    +383417
    +383419
    +383429
    +383459
    +383483
    +383489
    +383519
    +383521
    +383527
    +383533
    +383549
    +383557
    +383573
    +383587
    +383609
    +383611
    +383623
    +383627
    +383633
    +383651
    +383657
    +383659
    +383681
    +383683
    +383693
    +383723
    +383729
    +383753
    +383759
    +383767
    +383777
    +383791
    +383797
    +383807
    +383813
    +383821
    +383833
    +383837
    +383839
    +383869
    +383891
    +383909
    +383917
    +383923
    +383941
    +383951
    +383963
    +383969
    +383983
    +383987
    +384001
    +384017
    +384029
    +384049
    +384061
    +384067
    +384079
    +384089
    +384107
    +384113
    +384133
    +384143
    +384151
    +384157
    +384173
    +384187
    +384193
    +384203
    +384227
    +384247
    +384253
    +384257
    +384259
    +384277
    +384287
    +384289
    +384299
    +384301
    +384317
    +384331
    +384343
    +384359
    +384367
    +384383
    +384403
    +384407
    +384437
    +384469
    +384473
    +384479
    +384481
    +384487
    +384497
    +384509
    +384533
    +384547
    +384577
    +384581
    +384589
    +384599
    +384611
    +384619
    +384623
    +384641
    +384673
    +384691
    +384697
    +384701
    +384719
    +384733
    +384737
    +384751
    +384757
    +384773
    +384779
    +384817
    +384821
    +384827
    +384841
    +384847
    +384851
    +384889
    +384907
    +384913
    +384919
    +384941
    +384961
    +384973
    +385001
    +385013
    +385027
    +385039
    +385057
    +385069
    +385079
    +385081
    +385087
    +385109
    +385127
    +385129
    +385139
    +385141
    +385153
    +385159
    +385171
    +385193
    +385199
    +385223
    +385249
    +385261
    +385267
    +385279
    +385289
    +385291
    +385321
    +385327
    +385331
    +385351
    +385379
    +385391
    +385393
    +385397
    +385403
    +385417
    +385433
    +385471
    +385481
    +385493
    +385501
    +385519
    +385531
    +385537
    +385559
    +385571
    +385573
    +385579
    +385589
    +385591
    +385597
    +385607
    +385621
    +385631
    +385639
    +385657
    +385661
    +385663
    +385709
    +385739
    +385741
    +385771
    +385783
    +385793
    +385811
    +385817
    +385831
    +385837
    +385843
    +385859
    +385877
    +385897
    +385901
    +385907
    +385927
    +385939
    +385943
    +385967
    +385991
    +385997
    +386017
    +386039
    +386041
    +386047
    +386051
    +386083
    +386093
    +386117
    +386119
    +386129
    +386131
    +386143
    +386149
    +386153
    +386159
    +386161
    +386173
    +386219
    +386227
    +386233
    +386237
    +386249
    +386263
    +386279
    +386297
    +386299
    +386303
    +386329
    +386333
    +386339
    +386363
    +386369
    +386371
    +386381
    +386383
    +386401
    +386411
    +386413
    +386429
    +386431
    +386437
    +386471
    +386489
    +386501
    +386521
    +386537
    +386543
    +386549
    +386569
    +386587
    +386609
    +386611
    +386621
    +386629
    +386641
    +386647
    +386651
    +386677
    +386689
    +386693
    +386713
    +386719
    +386723
    +386731
    +386747
    +386777
    +386809
    +386839
    +386851
    +386887
    +386891
    +386921
    +386927
    +386963
    +386977
    +386987
    +386989
    +386993
    +387007
    +387017
    +387031
    +387047
    +387071
    +387077
    +387083
    +387089
    +387109
    +387137
    +387151
    +387161
    +387169
    +387173
    +387187
    +387197
    +387199
    +387203
    +387227
    +387253
    +387263
    +387269
    +387281
    +387307
    +387313
    +387329
    +387341
    +387371
    +387397
    +387403
    +387433
    +387437
    +387449
    +387463
    +387493
    +387503
    +387509
    +387529
    +387551
    +387577
    +387587
    +387613
    +387623
    +387631
    +387641
    +387659
    +387677
    +387679
    +387683
    +387707
    +387721
    +387727
    +387743
    +387749
    +387763
    +387781
    +387791
    +387799
    +387839
    +387853
    +387857
    +387911
    +387913
    +387917
    +387953
    +387967
    +387971
    +387973
    +387977
    +388009
    +388051
    +388057
    +388067
    +388081
    +388099
    +388109
    +388111
    +388117
    +388133
    +388159
    +388163
    +388169
    +388177
    +388181
    +388183
    +388187
    +388211
    +388231
    +388237
    +388253
    +388259
    +388273
    +388277
    +388301
    +388313
    +388319
    +388351
    +388363
    +388369
    +388373
    +388391
    +388403
    +388459
    +388471
    +388477
    +388481
    +388483
    +388489
    +388499
    +388519
    +388529
    +388541
    +388567
    +388573
    +388621
    +388651
    +388657
    +388673
    +388691
    +388693
    +388697
    +388699
    +388711
    +388727
    +388757
    +388777
    +388781
    +388789
    +388793
    +388813
    +388823
    +388837
    +388859
    +388879
    +388891
    +388897
    +388901
    +388903
    +388931
    +388933
    +388937
    +388961
    +388963
    +388991
    +389003
    +389023
    +389027
    +389029
    +389041
    +389047
    +389057
    +389083
    +389089
    +389099
    +389111
    +389117
    +389141
    +389149
    +389161
    +389167
    +389171
    +389173
    +389189
    +389219
    +389227
    +389231
    +389269
    +389273
    +389287
    +389297
    +389299
    +389303
    +389357
    +389369
    +389381
    +389399
    +389401
    +389437
    +389447
    +389461
    +389479
    +389483
    +389507
    +389513
    +389527
    +389531
    +389533
    +389539
    +389561
    +389563
    +389567
    +389569
    +389579
    +389591
    +389621
    +389629
    +389651
    +389659
    +389663
    +389687
    +389699
    +389713
    +389723
    +389743
    +389749
    +389761
    +389773
    +389783
    +389791
    +389797
    +389819
    +389839
    +389849
    +389867
    +389891
    +389897
    +389903
    +389911
    +389923
    +389927
    +389941
    +389947
    +389953
    +389957
    +389971
    +389981
    +389989
    +389999
    +390001
    +390043
    +390067
    +390077
    +390083
    +390097
    +390101
    +390107
    +390109
    +390113
    +390119
    +390151
    +390157
    +390161
    +390191
    +390193
    +390199
    +390209
    +390211
    +390223
    +390263
    +390281
    +390289
    +390307
    +390323
    +390343
    +390347
    +390353
    +390359
    +390367
    +390373
    +390389
    +390391
    +390407
    +390413
    +390419
    +390421
    +390433
    +390437
    +390449
    +390463
    +390479
    +390487
    +390491
    +390493
    +390499
    +390503
    +390527
    +390539
    +390553
    +390581
    +390647
    +390653
    +390671
    +390673
    +390703
    +390707
    +390721
    +390727
    +390737
    +390739
    +390743
    +390751
    +390763
    +390781
    +390791
    +390809
    +390821
    +390829
    +390851
    +390869
    +390877
    +390883
    +390889
    +390893
    +390953
    +390959
    +390961
    +390967
    +390989
    +390991
    +391009
    +391019
    +391021
    +391031
    +391049
    +391057
    +391063
    +391067
    +391073
    +391103
    +391117
    +391133
    +391151
    +391159
    +391163
    +391177
    +391199
    +391217
    +391219
    +391231
    +391247
    +391249
    +391273
    +391283
    +391291
    +391301
    +391331
    +391337
    +391351
    +391367
    +391373
    +391379
    +391387
    +391393
    +391397
    +391399
    +391403
    +391441
    +391451
    +391453
    +391487
    +391519
    +391537
    +391553
    +391579
    +391613
    +391619
    +391627
    +391631
    +391639
    +391661
    +391679
    +391691
    +391693
    +391711
    +391717
    +391733
    +391739
    +391751
    +391753
    +391757
    +391789
    +391801
    +391817
    +391823
    +391847
    +391861
    +391873
    +391879
    +391889
    +391891
    +391903
    +391907
    +391921
    +391939
    +391961
    +391967
    +391987
    +391999
    +392011
    +392033
    +392053
    +392059
    +392069
    +392087
    +392099
    +392101
    +392111
    +392113
    +392131
    +392143
    +392149
    +392153
    +392159
    +392177
    +392201
    +392209
    +392213
    +392221
    +392233
    +392239
    +392251
    +392261
    +392263
    +392267
    +392269
    +392279
    +392281
    +392297
    +392299
    +392321
    +392333
    +392339
    +392347
    +392351
    +392363
    +392383
    +392389
    +392423
    +392437
    +392443
    +392467
    +392473
    +392477
    +392489
    +392503
    +392519
    +392531
    +392543
    +392549
    +392569
    +392593
    +392599
    +392611
    +392629
    +392647
    +392663
    +392669
    +392699
    +392723
    +392737
    +392741
    +392759
    +392761
    +392767
    +392803
    +392807
    +392809
    +392827
    +392831
    +392837
    +392849
    +392851
    +392857
    +392879
    +392893
    +392911
    +392923
    +392927
    +392929
    +392957
    +392963
    +392969
    +392981
    +392983
    +393007
    +393013
    +393017
    +393031
    +393059
    +393073
    +393077
    +393079
    +393083
    +393097
    +393103
    +393109
    +393121
    +393137
    +393143
    +393157
    +393161
    +393181
    +393187
    +393191
    +393203
    +393209
    +393241
    +393247
    +393257
    +393271
    +393287
    +393299
    +393301
    +393311
    +393331
    +393361
    +393373
    +393377
    +393383
    +393401
    +393403
    +393413
    +393451
    +393473
    +393479
    +393487
    +393517
    +393521
    +393539
    +393541
    +393551
    +393557
    +393571
    +393577
    +393581
    +393583
    +393587
    +393593
    +393611
    +393629
    +393637
    +393649
    +393667
    +393671
    +393677
    +393683
    +393697
    +393709
    +393713
    +393721
    +393727
    +393739
    +393749
    +393761
    +393779
    +393797
    +393847
    +393853
    +393857
    +393859
    +393863
    +393871
    +393901
    +393919
    +393929
    +393931
    +393947
    +393961
    +393977
    +393989
    +393997
    +394007
    +394019
    +394039
    +394049
    +394063
    +394073
    +394099
    +394123
    +394129
    +394153
    +394157
    +394169
    +394187
    +394201
    +394211
    +394223
    +394241
    +394249
    +394259
    +394271
    +394291
    +394319
    +394327
    +394357
    +394363
    +394367
    +394369
    +394393
    +394409
    +394411
    +394453
    +394481
    +394489
    +394501
    +394507
    +394523
    +394529
    +394549
    +394571
    +394577
    +394579
    +394601
    +394619
    +394631
    +394633
    +394637
    +394643
    +394673
    +394699
    +394717
    +394721
    +394727
    +394729
    +394733
    +394739
    +394747
    +394759
    +394787
    +394811
    +394813
    +394817
    +394819
    +394829
    +394837
    +394861
    +394879
    +394897
    +394931
    +394943
    +394963
    +394967
    +394969
    +394981
    +394987
    +394993
    +395023
    +395027
    +395039
    +395047
    +395069
    +395089
    +395093
    +395107
    +395111
    +395113
    +395119
    +395137
    +395141
    +395147
    +395159
    +395173
    +395189
    +395191
    +395201
    +395231
    +395243
    +395251
    +395261
    +395273
    +395287
    +395293
    +395303
    +395309
    +395321
    +395323
    +395377
    +395383
    +395407
    +395429
    +395431
    +395443
    +395449
    +395453
    +395459
    +395491
    +395509
    +395513
    +395533
    +395537
    +395543
    +395581
    +395597
    +395611
    +395621
    +395627
    +395657
    +395671
    +395677
    +395687
    +395701
    +395719
    +395737
    +395741
    +395749
    +395767
    +395803
    +395849
    +395851
    +395873
    +395887
    +395891
    +395897
    +395909
    +395921
    +395953
    +395959
    +395971
    +396001
    +396029
    +396031
    +396041
    +396043
    +396061
    +396079
    +396091
    +396103
    +396107
    +396119
    +396157
    +396173
    +396181
    +396197
    +396199
    +396203
    +396217
    +396239
    +396247
    +396259
    +396269
    +396293
    +396299
    +396301
    +396311
    +396323
    +396349
    +396353
    +396373
    +396377
    +396379
    +396413
    +396427
    +396437
    +396443
    +396449
    +396479
    +396509
    +396523
    +396527
    +396533
    +396541
    +396547
    +396563
    +396577
    +396581
    +396601
    +396619
    +396623
    +396629
    +396631
    +396637
    +396647
    +396667
    +396679
    +396703
    +396709
    +396713
    +396719
    +396733
    +396833
    +396871
    +396881
    +396883
    +396887
    +396919
    +396931
    +396937
    +396943
    +396947
    +396953
    +396971
    +396983
    +396997
    +397013
    +397027
    +397037
    +397051
    +397057
    +397063
    +397073
    +397093
    +397099
    +397127
    +397151
    +397153
    +397181
    +397183
    +397211
    +397217
    +397223
    +397237
    +397253
    +397259
    +397283
    +397289
    +397297
    +397301
    +397303
    +397337
    +397351
    +397357
    +397361
    +397373
    +397379
    +397427
    +397429
    +397433
    +397459
    +397469
    +397489
    +397493
    +397517
    +397519
    +397541
    +397543
    +397547
    +397549
    +397567
    +397589
    +397591
    +397597
    +397633
    +397643
    +397673
    +397687
    +397697
    +397721
    +397723
    +397729
    +397751
    +397753
    +397757
    +397759
    +397763
    +397799
    +397807
    +397811
    +397829
    +397849
    +397867
    +397897
    +397907
    +397921
    +397939
    +397951
    +397963
    +397973
    +397981
    +398011
    +398023
    +398029
    +398033
    +398039
    +398053
    +398059
    +398063
    +398077
    +398087
    +398113
    +398117
    +398119
    +398129
    +398143
    +398149
    +398171
    +398207
    +398213
    +398219
    +398227
    +398249
    +398261
    +398267
    +398273
    +398287
    +398303
    +398311
    +398323
    +398339
    +398341
    +398347
    +398353
    +398357
    +398369
    +398393
    +398407
    +398417
    +398423
    +398441
    +398459
    +398467
    +398471
    +398473
    +398477
    +398491
    +398509
    +398539
    +398543
    +398549
    +398557
    +398569
    +398581
    +398591
    +398609
    +398611
    +398621
    +398627
    +398669
    +398681
    +398683
    +398693
    +398711
    +398729
    +398731
    +398759
    +398771
    +398813
    +398819
    +398821
    +398833
    +398857
    +398863
    +398887
    +398903
    +398917
    +398921
    +398933
    +398941
    +398969
    +398977
    +398989
    +399023
    +399031
    +399043
    +399059
    +399067
    +399071
    +399079
    +399097
    +399101
    +399107
    +399131
    +399137
    +399149
    +399151
    +399163
    +399173
    +399181
    +399197
    +399221
    +399227
    +399239
    +399241
    +399263
    +399271
    +399277
    +399281
    +399283
    +399353
    +399379
    +399389
    +399391
    +399401
    +399403
    +399409
    +399433
    +399439
    +399473
    +399481
    +399491
    +399493
    +399499
    +399523
    +399527
    +399541
    +399557
    +399571
    +399577
    +399583
    +399587
    +399601
    +399613
    +399617
    +399643
    +399647
    +399667
    +399677
    +399689
    +399691
    +399719
    +399727
    +399731
    +399739
    +399757
    +399761
    +399769
    +399781
    +399787
    +399793
    +399851
    +399853
    +399871
    +399887
    +399899
    +399911
    +399913
    +399937
    +399941
    +399953
    +399979
    +399983
    +399989
    +400009
    +400031
    +400033
    +400051
    +400067
    +400069
    +400087
    +400093
    +400109
    +400123
    +400151
    +400157
    +400187
    +400199
    +400207
    +400217
    +400237
    +400243
    +400247
    +400249
    +400261
    +400277
    +400291
    +400297
    +400307
    +400313
    +400321
    +400331
    +400339
    +400381
    +400391
    +400409
    +400417
    +400429
    +400441
    +400457
    +400471
    +400481
    +400523
    +400559
    +400579
    +400597
    +400601
    +400607
    +400619
    +400643
    +400651
    +400657
    +400679
    +400681
    +400703
    +400711
    +400721
    +400723
    +400739
    +400753
    +400759
    +400823
    +400837
    +400849
    +400853
    +400859
    +400871
    +400903
    +400927
    +400931
    +400943
    +400949
    +400963
    +400997
    +401017
    +401029
    +401039
    +401053
    +401057
    +401069
    +401077
    +401087
    +401101
    +401113
    +401119
    +401161
    +401173
    +401179
    +401201
    +401209
    +401231
    +401237
    +401243
    +401279
    +401287
    +401309
    +401311
    +401321
    +401329
    +401341
    +401347
    +401371
    +401381
    +401393
    +401407
    +401411
    +401417
    +401473
    +401477
    +401507
    +401519
    +401537
    +401539
    +401551
    +401567
    +401587
    +401593
    +401627
    +401629
    +401651
    +401669
    +401671
    +401689
    +401707
    +401711
    +401743
    +401771
    +401773
    +401809
    +401813
    +401827
    +401839
    +401861
    +401867
    +401887
    +401903
    +401909
    +401917
    +401939
    +401953
    +401957
    +401959
    +401981
    +401987
    +401993
    +402023
    +402029
    +402037
    +402043
    +402049
    +402053
    +402071
    +402089
    +402091
    +402107
    +402131
    +402133
    +402137
    +402139
    +402197
    +402221
    +402223
    +402239
    +402253
    +402263
    +402277
    +402299
    +402307
    +402313
    +402329
    +402331
    +402341
    +402343
    +402359
    +402361
    +402371
    +402379
    +402383
    +402403
    +402419
    +402443
    +402487
    +402503
    +402511
    +402517
    +402527
    +402529
    +402541
    +402551
    +402559
    +402581
    +402583
    +402587
    +402593
    +402601
    +402613
    +402631
    +402691
    +402697
    +402739
    +402751
    +402757
    +402761
    +402763
    +402767
    +402769
    +402797
    +402803
    +402817
    +402823
    +402847
    +402851
    +402859
    +402863
    +402869
    +402881
    +402923
    +402943
    +402947
    +402949
    +402991
    +403001
    +403003
    +403037
    +403043
    +403049
    +403057
    +403061
    +403063
    +403079
    +403097
    +403103
    +403133
    +403141
    +403159
    +403163
    +403181
    +403219
    +403241
    +403243
    +403253
    +403261
    +403267
    +403289
    +403301
    +403309
    +403327
    +403331
    +403339
    +403363
    +403369
    +403387
    +403391
    +403433
    +403439
    +403483
    +403499
    +403511
    +403537
    +403547
    +403549
    +403553
    +403567
    +403577
    +403591
    +403603
    +403607
    +403621
    +403649
    +403661
    +403679
    +403681
    +403687
    +403703
    +403717
    +403721
    +403729
    +403757
    +403783
    +403787
    +403817
    +403829
    +403831
    +403849
    +403861
    +403867
    +403877
    +403889
    +403901
    +403933
    +403951
    +403957
    +403969
    +403979
    +403981
    +403993
    +404009
    +404011
    +404017
    +404021
    +404029
    +404051
    +404081
    +404099
    +404113
    +404119
    +404123
    +404161
    +404167
    +404177
    +404189
    +404191
    +404197
    +404213
    +404221
    +404249
    +404251
    +404267
    +404269
    +404273
    +404291
    +404309
    +404321
    +404323
    +404357
    +404381
    +404387
    +404389
    +404399
    +404419
    +404423
    +404429
    +404431
    +404449
    +404461
    +404483
    +404489
    +404497
    +404507
    +404513
    +404527
    +404531
    +404533
    +404539
    +404557
    +404597
    +404671
    +404693
    +404699
    +404713
    +404773
    +404779
    +404783
    +404819
    +404827
    +404837
    +404843
    +404849
    +404851
    +404941
    +404951
    +404959
    +404969
    +404977
    +404981
    +404983
    +405001
    +405011
    +405029
    +405037
    +405047
    +405049
    +405071
    +405073
    +405089
    +405091
    +405143
    +405157
    +405179
    +405199
    +405211
    +405221
    +405227
    +405239
    +405241
    +405247
    +405253
    +405269
    +405277
    +405287
    +405299
    +405323
    +405341
    +405343
    +405347
    +405373
    +405401
    +405407
    +405413
    +405437
    +405439
    +405473
    +405487
    +405491
    +405497
    +405499
    +405521
    +405527
    +405529
    +405541
    +405553
    +405577
    +405599
    +405607
    +405611
    +405641
    +405659
    +405667
    +405677
    +405679
    +405683
    +405689
    +405701
    +405703
    +405709
    +405719
    +405731
    +405749
    +405763
    +405767
    +405781
    +405799
    +405817
    +405827
    +405829
    +405857
    +405863
    +405869
    +405871
    +405893
    +405901
    +405917
    +405947
    +405949
    +405959
    +405967
    +405989
    +405991
    +405997
    +406013
    +406027
    +406037
    +406067
    +406073
    +406093
    +406117
    +406123
    +406169
    +406171
    +406177
    +406183
    +406207
    +406247
    +406253
    +406267
    +406271
    +406309
    +406313
    +406327
    +406331
    +406339
    +406349
    +406361
    +406381
    +406397
    +406403
    +406423
    +406447
    +406481
    +406499
    +406501
    +406507
    +406513
    +406517
    +406531
    +406547
    +406559
    +406561
    +406573
    +406577
    +406579
    +406583
    +406591
    +406631
    +406633
    +406649
    +406661
    +406673
    +406697
    +406699
    +406717
    +406729
    +406739
    +406789
    +406807
    +406811
    +406817
    +406837
    +406859
    +406873
    +406883
    +406907
    +406951
    +406969
    +406981
    +406993
    +407023
    +407047
    +407059
    +407083
    +407119
    +407137
    +407149
    +407153
    +407177
    +407179
    +407191
    +407203
    +407207
    +407219
    +407221
    +407233
    +407249
    +407257
    +407263
    +407273
    +407287
    +407291
    +407299
    +407311
    +407317
    +407321
    +407347
    +407357
    +407359
    +407369
    +407377
    +407383
    +407401
    +407437
    +407471
    +407483
    +407489
    +407501
    +407503
    +407509
    +407521
    +407527
    +407567
    +407573
    +407579
    +407587
    +407599
    +407621
    +407633
    +407639
    +407651
    +407657
    +407669
    +407699
    +407707
    +407713
    +407717
    +407723
    +407741
    +407747
    +407783
    +407789
    +407791
    +407801
    +407807
    +407821
    +407833
    +407843
    +407857
    +407861
    +407879
    +407893
    +407899
    +407917
    +407923
    +407947
    +407959
    +407969
    +407971
    +407977
    +407993
    +408011
    +408019
    +408041
    +408049
    +408071
    +408077
    +408091
    +408127
    +408131
    +408137
    +408169
    +408173
    +408197
    +408203
    +408209
    +408211
    +408217
    +408223
    +408229
    +408241
    +408251
    +408263
    +408271
    +408283
    +408311
    +408337
    +408341
    +408347
    +408361
    +408379
    +408389
    +408403
    +408413
    +408427
    +408431
    +408433
    +408437
    +408461
    +408469
    +408479
    +408491
    +408497
    +408533
    +408539
    +408553
    +408563
    +408607
    +408623
    +408631
    +408637
    +408643
    +408659
    +408677
    +408689
    +408691
    +408701
    +408703
    +408713
    +408719
    +408743
    +408763
    +408769
    +408773
    +408787
    +408803
    +408809
    +408817
    +408841
    +408857
    +408869
    +408911
    +408913
    +408923
    +408943
    +408953
    +408959
    +408971
    +408979
    +408997
    +409007
    +409021
    +409027
    +409033
    +409043
    +409063
    +409069
    +409081
    +409099
    +409121
    +409153
    +409163
    +409177
    +409187
    +409217
    +409237
    +409259
    +409261
    +409267
    +409271
    +409289
    +409291
    +409327
    +409333
    +409337
    +409349
    +409351
    +409369
    +409379
    +409391
    +409397
    +409429
    +409433
    +409441
    +409463
    +409471
    +409477
    +409483
    +409499
    +409517
    +409523
    +409529
    +409543
    +409573
    +409579
    +409589
    +409597
    +409609
    +409639
    +409657
    +409691
    +409693
    +409709
    +409711
    +409723
    +409729
    +409733
    +409753
    +409769
    +409777
    +409781
    +409813
    +409817
    +409823
    +409831
    +409841
    +409861
    +409867
    +409879
    +409889
    +409891
    +409897
    +409901
    +409909
    +409933
    +409943
    +409951
    +409961
    +409967
    +409987
    +409993
    +409999
    +410009
    +410029
    +410063
    +410087
    +410093
    +410117
    +410119
    +410141
    +410143
    +410149
    +410171
    +410173
    +410203
    +410231
    +410233
    +410239
    +410243
    +410257
    +410279
    +410281
    +410299
    +410317
    +410323
    +410339
    +410341
    +410353
    +410359
    +410383
    +410387
    +410393
    +410401
    +410411
    +410413
    +410453
    +410461
    +410477
    +410489
    +410491
    +410497
    +410507
    +410513
    +410519
    +410551
    +410561
    +410587
    +410617
    +410621
    +410623
    +410629
    +410651
    +410659
    +410671
    +410687
    +410701
    +410717
    +410731
    +410741
    +410747
    +410749
    +410759
    +410783
    +410789
    +410801
    +410807
    +410819
    +410833
    +410857
    +410899
    +410903
    +410929
    +410953
    +410983
    +410999
    +411001
    +411007
    +411011
    +411013
    +411031
    +411041
    +411049
    +411067
    +411071
    +411083
    +411101
    +411113
    +411119
    +411127
    +411143
    +411157
    +411167
    +411193
    +411197
    +411211
    +411233
    +411241
    +411251
    +411253
    +411259
    +411287
    +411311
    +411337
    +411347
    +411361
    +411371
    +411379
    +411409
    +411421
    +411443
    +411449
    +411469
    +411473
    +411479
    +411491
    +411503
    +411527
    +411529
    +411557
    +411563
    +411569
    +411577
    +411583
    +411589
    +411611
    +411613
    +411617
    +411637
    +411641
    +411667
    +411679
    +411683
    +411703
    +411707
    +411709
    +411721
    +411727
    +411737
    +411739
    +411743
    +411751
    +411779
    +411799
    +411809
    +411821
    +411823
    +411833
    +411841
    +411883
    +411919
    +411923
    +411937
    +411941
    +411947
    +411967
    +411991
    +412001
    +412007
    +412019
    +412031
    +412033
    +412037
    +412039
    +412051
    +412067
    +412073
    +412081
    +412099
    +412109
    +412123
    +412127
    +412133
    +412147
    +412157
    +412171
    +412187
    +412189
    +412193
    +412201
    +412211
    +412213
    +412219
    +412249
    +412253
    +412273
    +412277
    +412289
    +412303
    +412333
    +412339
    +412343
    +412387
    +412397
    +412411
    +412457
    +412463
    +412481
    +412487
    +412493
    +412537
    +412561
    +412567
    +412571
    +412589
    +412591
    +412603
    +412609
    +412619
    +412627
    +412637
    +412639
    +412651
    +412663
    +412667
    +412717
    +412739
    +412771
    +412793
    +412807
    +412831
    +412849
    +412859
    +412891
    +412901
    +412903
    +412939
    +412943
    +412949
    +412967
    +412987
    +413009
    +413027
    +413033
    +413053
    +413069
    +413071
    +413081
    +413087
    +413089
    +413093
    +413111
    +413113
    +413129
    +413141
    +413143
    +413159
    +413167
    +413183
    +413197
    +413201
    +413207
    +413233
    +413243
    +413251
    +413263
    +413267
    +413293
    +413299
    +413353
    +413411
    +413417
    +413429
    +413443
    +413461
    +413477
    +413521
    +413527
    +413533
    +413537
    +413551
    +413557
    +413579
    +413587
    +413597
    +413629
    +413653
    +413681
    +413683
    +413689
    +413711
    +413713
    +413719
    +413737
    +413753
    +413759
    +413779
    +413783
    +413807
    +413827
    +413849
    +413863
    +413867
    +413869
    +413879
    +413887
    +413911
    +413923
    +413951
    +413981
    +414013
    +414017
    +414019
    +414031
    +414049
    +414053
    +414061
    +414077
    +414083
    +414097
    +414101
    +414107
    +414109
    +414131
    +414157
    +414179
    +414199
    +414203
    +414209
    +414217
    +414221
    +414241
    +414259
    +414269
    +414277
    +414283
    +414311
    +414313
    +414329
    +414331
    +414347
    +414361
    +414367
    +414383
    +414389
    +414397
    +414413
    +414431
    +414433
    +414451
    +414457
    +414461
    +414467
    +414487
    +414503
    +414521
    +414539
    +414553
    +414559
    +414571
    +414577
    +414607
    +414611
    +414629
    +414641
    +414643
    +414653
    +414677
    +414679
    +414683
    +414691
    +414697
    +414703
    +414707
    +414709
    +414721
    +414731
    +414737
    +414763
    +414767
    +414769
    +414773
    +414779
    +414793
    +414803
    +414809
    +414833
    +414857
    +414871
    +414889
    +414893
    +414899
    +414913
    +414923
    +414929
    +414949
    +414959
    +414971
    +414977
    +414991
    +415013
    +415031
    +415039
    +415061
    +415069
    +415073
    +415087
    +415097
    +415109
    +415111
    +415133
    +415141
    +415147
    +415153
    +415159
    +415171
    +415187
    +415189
    +415201
    +415213
    +415231
    +415253
    +415271
    +415273
    +415319
    +415343
    +415379
    +415381
    +415391
    +415409
    +415427
    +415447
    +415469
    +415477
    +415489
    +415507
    +415517
    +415523
    +415543
    +415553
    +415559
    +415567
    +415577
    +415603
    +415607
    +415609
    +415627
    +415631
    +415643
    +415651
    +415661
    +415669
    +415673
    +415687
    +415691
    +415697
    +415717
    +415721
    +415729
    +415759
    +415783
    +415787
    +415799
    +415801
    +415819
    +415823
    +415861
    +415873
    +415879
    +415901
    +415931
    +415937
    +415949
    +415951
    +415957
    +415963
    +415969
    +415979
    +415993
    +415999
    +416011
    +416023
    +416071
    +416077
    +416089
    +416107
    +416147
    +416149
    +416153
    +416159
    +416167
    +416201
    +416219
    +416239
    +416243
    +416249
    +416257
    +416263
    +416281
    +416291
    +416333
    +416359
    +416387
    +416389
    +416393
    +416399
    +416401
    +416407
    +416413
    +416417
    +416419
    +416441
    +416443
    +416459
    +416473
    +416477
    +416491
    +416497
    +416501
    +416503
    +416513
    +416531
    +416543
    +416573
    +416579
    +416593
    +416621
    +416623
    +416629
    +416659
    +416677
    +416693
    +416719
    +416761
    +416797
    +416821
    +416833
    +416839
    +416849
    +416851
    +416873
    +416881
    +416887
    +416947
    +416957
    +416963
    +416989
    +417007
    +417017
    +417019
    +417023
    +417037
    +417089
    +417097
    +417113
    +417119
    +417127
    +417133
    +417161
    +417169
    +417173
    +417181
    +417187
    +417191
    +417203
    +417217
    +417227
    +417239
    +417251
    +417271
    +417283
    +417293
    +417311
    +417317
    +417331
    +417337
    +417371
    +417377
    +417379
    +417383
    +417419
    +417437
    +417451
    +417457
    +417479
    +417491
    +417493
    +417509
    +417511
    +417523
    +417541
    +417553
    +417559
    +417577
    +417581
    +417583
    +417617
    +417623
    +417631
    +417643
    +417649
    +417671
    +417691
    +417719
    +417721
    +417727
    +417731
    +417733
    +417737
    +417751
    +417763
    +417773
    +417793
    +417811
    +417821
    +417839
    +417863
    +417869
    +417881
    +417883
    +417899
    +417931
    +417941
    +417947
    +417953
    +417959
    +417961
    +417983
    +417997
    +418007
    +418009
    +418027
    +418031
    +418043
    +418051
    +418069
    +418073
    +418079
    +418087
    +418109
    +418129
    +418157
    +418169
    +418177
    +418181
    +418189
    +418199
    +418207
    +418219
    +418259
    +418273
    +418279
    +418289
    +418303
    +418321
    +418331
    +418337
    +418339
    +418343
    +418349
    +418351
    +418357
    +418373
    +418381
    +418391
    +418423
    +418427
    +418447
    +418459
    +418471
    +418493
    +418511
    +418553
    +418559
    +418597
    +418601
    +418603
    +418631
    +418633
    +418637
    +418657
    +418667
    +418699
    +418709
    +418721
    +418739
    +418751
    +418763
    +418771
    +418783
    +418787
    +418793
    +418799
    +418811
    +418813
    +418819
    +418837
    +418843
    +418849
    +418861
    +418867
    +418871
    +418883
    +418889
    +418909
    +418921
    +418927
    +418933
    +418939
    +418961
    +418981
    +418987
    +418993
    +418997
    +419047
    +419051
    +419053
    +419057
    +419059
    +419087
    +419141
    +419147
    +419161
    +419171
    +419183
    +419189
    +419191
    +419201
    +419231
    +419249
    +419261
    +419281
    +419291
    +419297
    +419303
    +419317
    +419329
    +419351
    +419383
    +419401
    +419417
    +419423
    +419429
    +419443
    +419449
    +419459
    +419467
    +419473
    +419477
    +419483
    +419491
    +419513
    +419527
    +419537
    +419557
    +419561
    +419563
    +419567
    +419579
    +419591
    +419597
    +419599
    +419603
    +419609
    +419623
    +419651
    +419687
    +419693
    +419701
    +419711
    +419743
    +419753
    +419777
    +419789
    +419791
    +419801
    +419803
    +419821
    +419827
    +419831
    +419873
    +419893
    +419921
    +419927
    +419929
    +419933
    +419953
    +419959
    +419999
    +420001
    +420029
    +420037
    +420041
    +420047
    +420073
    +420097
    +420103
    +420149
    +420163
    +420191
    +420193
    +420221
    +420241
    +420253
    +420263
    +420269
    +420271
    +420293
    +420307
    +420313
    +420317
    +420319
    +420323
    +420331
    +420341
    +420349
    +420353
    +420361
    +420367
    +420383
    +420397
    +420419
    +420421
    +420439
    +420457
    +420467
    +420479
    +420481
    +420499
    +420503
    +420521
    +420551
    +420557
    +420569
    +420571
    +420593
    +420599
    +420613
    +420671
    +420677
    +420683
    +420691
    +420731
    +420737
    +420743
    +420757
    +420769
    +420779
    +420781
    +420799
    +420803
    +420809
    +420811
    +420851
    +420853
    +420857
    +420859
    +420899
    +420919
    +420929
    +420941
    +420967
    +420977
    +420997
    +421009
    +421019
    +421033
    +421037
    +421049
    +421079
    +421081
    +421093
    +421103
    +421121
    +421123
    +421133
    +421147
    +421159
    +421163
    +421177
    +421181
    +421189
    +421207
    +421241
    +421273
    +421279
    +421303
    +421313
    +421331
    +421339
    +421349
    +421361
    +421381
    +421397
    +421409
    +421417
    +421423
    +421433
    +421453
    +421459
    +421469
    +421471
    +421483
    +421493
    +421501
    +421517
    +421559
    +421607
    +421609
    +421621
    +421633
    +421639
    +421643
    +421657
    +421661
    +421691
    +421697
    +421699
    +421703
    +421709
    +421711
    +421717
    +421727
    +421739
    +421741
    +421783
    +421801
    +421807
    +421831
    +421847
    +421891
    +421907
    +421913
    +421943
    +421973
    +421987
    +421997
    +422029
    +422041
    +422057
    +422063
    +422069
    +422077
    +422083
    +422087
    +422089
    +422099
    +422101
    +422111
    +422113
    +422129
    +422137
    +422141
    +422183
    +422203
    +422209
    +422231
    +422239
    +422243
    +422249
    +422267
    +422287
    +422291
    +422309
    +422311
    +422321
    +422339
    +422353
    +422363
    +422369
    +422377
    +422393
    +422407
    +422431
    +422453
    +422459
    +422479
    +422537
    +422549
    +422551
    +422557
    +422563
    +422567
    +422573
    +422581
    +422621
    +422627
    +422657
    +422689
    +422701
    +422707
    +422711
    +422749
    +422753
    +422759
    +422761
    +422789
    +422797
    +422803
    +422827
    +422857
    +422861
    +422867
    +422869
    +422879
    +422881
    +422893
    +422897
    +422899
    +422911
    +422923
    +422927
    +422969
    +422987
    +423001
    +423013
    +423019
    +423043
    +423053
    +423061
    +423067
    +423083
    +423091
    +423097
    +423103
    +423109
    +423121
    +423127
    +423133
    +423173
    +423179
    +423191
    +423209
    +423221
    +423229
    +423233
    +423251
    +423257
    +423259
    +423277
    +423281
    +423287
    +423289
    +423299
    +423307
    +423323
    +423341
    +423347
    +423389
    +423403
    +423413
    +423427
    +423431
    +423439
    +423457
    +423461
    +423463
    +423469
    +423481
    +423497
    +423503
    +423509
    +423541
    +423547
    +423557
    +423559
    +423581
    +423587
    +423601
    +423617
    +423649
    +423667
    +423697
    +423707
    +423713
    +423727
    +423749
    +423751
    +423763
    +423769
    +423779
    +423781
    +423791
    +423803
    +423823
    +423847
    +423853
    +423859
    +423869
    +423883
    +423887
    +423931
    +423949
    +423961
    +423977
    +423989
    +423991
    +424001
    +424003
    +424007
    +424019
    +424027
    +424037
    +424079
    +424091
    +424093
    +424103
    +424117
    +424121
    +424129
    +424139
    +424147
    +424157
    +424163
    +424169
    +424187
    +424199
    +424223
    +424231
    +424243
    +424247
    +424261
    +424267
    +424271
    +424273
    +424313
    +424331
    +424339
    +424343
    +424351
    +424397
    +424423
    +424429
    +424433
    +424451
    +424471
    +424481
    +424493
    +424519
    +424537
    +424547
    +424549
    +424559
    +424573
    +424577
    +424597
    +424601
    +424639
    +424661
    +424667
    +424679
    +424687
    +424693
    +424709
    +424727
    +424729
    +424757
    +424769
    +424771
    +424777
    +424811
    +424817
    +424819
    +424829
    +424841
    +424843
    +424849
    +424861
    +424867
    +424889
    +424891
    +424903
    +424909
    +424913
    +424939
    +424961
    +424967
    +424997
    +425003
    +425027
    +425039
    +425057
    +425059
    +425071
    +425083
    +425101
    +425107
    +425123
    +425147
    +425149
    +425189
    +425197
    +425207
    +425233
    +425237
    +425251
    +425273
    +425279
    +425281
    +425291
    +425297
    +425309
    +425317
    +425329
    +425333
    +425363
    +425377
    +425387
    +425393
    +425417
    +425419
    +425423
    +425441
    +425443
    +425471
    +425473
    +425489
    +425501
    +425519
    +425521
    +425533
    +425549
    +425563
    +425591
    +425603
    +425609
    +425641
    +425653
    +425681
    +425701
    +425713
    +425779
    +425783
    +425791
    +425801
    +425813
    +425819
    +425837
    +425839
    +425851
    +425857
    +425861
    +425869
    +425879
    +425899
    +425903
    +425911
    +425939
    +425959
    +425977
    +425987
    +425989
    +426007
    +426011
    +426061
    +426073
    +426077
    +426089
    +426091
    +426103
    +426131
    +426161
    +426163
    +426193
    +426197
    +426211
    +426229
    +426233
    +426253
    +426287
    +426301
    +426311
    +426319
    +426331
    +426353
    +426383
    +426389
    +426401
    +426407
    +426421
    +426427
    +426469
    +426487
    +426527
    +426541
    +426551
    +426553
    +426563
    +426583
    +426611
    +426631
    +426637
    +426641
    +426661
    +426691
    +426697
    +426707
    +426709
    +426731
    +426737
    +426739
    +426743
    +426757
    +426761
    +426763
    +426773
    +426779
    +426787
    +426799
    +426841
    +426859
    +426863
    +426871
    +426889
    +426893
    +426913
    +426917
    +426919
    +426931
    +426941
    +426971
    +426973
    +426997
    +427001
    +427013
    +427039
    +427043
    +427067
    +427069
    +427073
    +427079
    +427081
    +427103
    +427117
    +427151
    +427169
    +427181
    +427213
    +427237
    +427241
    +427243
    +427247
    +427249
    +427279
    +427283
    +427307
    +427309
    +427327
    +427333
    +427351
    +427369
    +427379
    +427381
    +427403
    +427417
    +427421
    +427423
    +427429
    +427433
    +427439
    +427447
    +427451
    +427457
    +427477
    +427513
    +427517
    +427523
    +427529
    +427541
    +427579
    +427591
    +427597
    +427619
    +427621
    +427681
    +427711
    +427717
    +427723
    +427727
    +427733
    +427751
    +427781
    +427787
    +427789
    +427813
    +427849
    +427859
    +427877
    +427879
    +427883
    +427913
    +427919
    +427939
    +427949
    +427951
    +427957
    +427967
    +427969
    +427991
    +427993
    +427997
    +428003
    +428023
    +428027
    +428033
    +428039
    +428041
    +428047
    +428083
    +428093
    +428137
    +428143
    +428147
    +428149
    +428161
    +428167
    +428173
    +428177
    +428221
    +428227
    +428231
    +428249
    +428251
    +428273
    +428297
    +428299
    +428303
    +428339
    +428353
    +428369
    +428401
    +428411
    +428429
    +428471
    +428473
    +428489
    +428503
    +428509
    +428531
    +428539
    +428551
    +428557
    +428563
    +428567
    +428569
    +428579
    +428629
    +428633
    +428639
    +428657
    +428663
    +428671
    +428677
    +428683
    +428693
    +428731
    +428741
    +428759
    +428777
    +428797
    +428801
    +428807
    +428809
    +428833
    +428843
    +428851
    +428863
    +428873
    +428899
    +428951
    +428957
    +428977
    +429007
    +429017
    +429043
    +429083
    +429101
    +429109
    +429119
    +429127
    +429137
    +429139
    +429161
    +429181
    +429197
    +429211
    +429217
    +429223
    +429227
    +429241
    +429259
    +429271
    +429277
    +429281
    +429283
    +429329
    +429347
    +429349
    +429361
    +429367
    +429389
    +429397
    +429409
    +429413
    +429427
    +429431
    +429449
    +429463
    +429467
    +429469
    +429487
    +429497
    +429503
    +429509
    +429511
    +429521
    +429529
    +429547
    +429551
    +429563
    +429581
    +429587
    +429589
    +429599
    +429631
    +429643
    +429659
    +429661
    +429673
    +429677
    +429679
    +429683
    +429701
    +429719
    +429727
    +429731
    +429733
    +429773
    +429791
    +429797
    +429817
    +429823
    +429827
    +429851
    +429853
    +429881
    +429887
    +429889
    +429899
    +429901
    +429907
    +429911
    +429917
    +429929
    +429931
    +429937
    +429943
    +429953
    +429971
    +429973
    +429991
    +430007
    +430009
    +430013
    +430019
    +430057
    +430061
    +430081
    +430091
    +430093
    +430121
    +430139
    +430147
    +430193
    +430259
    +430267
    +430277
    +430279
    +430289
    +430303
    +430319
    +430333
    +430343
    +430357
    +430393
    +430411
    +430427
    +430433
    +430453
    +430487
    +430499
    +430511
    +430513
    +430517
    +430543
    +430553
    +430571
    +430579
    +430589
    +430601
    +430603
    +430649
    +430663
    +430691
    +430697
    +430699
    +430709
    +430723
    +430739
    +430741
    +430747
    +430751
    +430753
    +430769
    +430783
    +430789
    +430799
    +430811
    +430819
    +430823
    +430841
    +430847
    +430861
    +430873
    +430879
    +430883
    +430891
    +430897
    +430907
    +430909
    +430921
    +430949
    +430957
    +430979
    +430981
    +430987
    +430999
    +431017
    +431021
    +431029
    +431047
    +431051
    +431063
    +431077
    +431083
    +431099
    +431107
    +431141
    +431147
    +431153
    +431173
    +431191
    +431203
    +431213
    +431219
    +431237
    +431251
    +431257
    +431267
    +431269
    +431287
    +431297
    +431311
    +431329
    +431339
    +431363
    +431369
    +431377
    +431381
    +431399
    +431423
    +431429
    +431441
    +431447
    +431449
    +431479
    +431513
    +431521
    +431533
    +431567
    +431581
    +431597
    +431603
    +431611
    +431617
    +431621
    +431657
    +431659
    +431663
    +431671
    +431693
    +431707
    +431729
    +431731
    +431759
    +431777
    +431797
    +431801
    +431803
    +431807
    +431831
    +431833
    +431857
    +431863
    +431867
    +431869
    +431881
    +431887
    +431891
    +431903
    +431911
    +431929
    +431933
    +431947
    +431983
    +431993
    +432001
    +432007
    +432023
    +432031
    +432037
    +432043
    +432053
    +432059
    +432067
    +432073
    +432097
    +432121
    +432137
    +432139
    +432143
    +432149
    +432161
    +432163
    +432167
    +432199
    +432203
    +432227
    +432241
    +432251
    +432277
    +432281
    +432287
    +432301
    +432317
    +432323
    +432337
    +432343
    +432349
    +432359
    +432373
    +432389
    +432391
    +432401
    +432413
    +432433
    +432437
    +432449
    +432457
    +432479
    +432491
    +432499
    +432503
    +432511
    +432527
    +432539
    +432557
    +432559
    +432569
    +432577
    +432587
    +432589
    +432613
    +432631
    +432637
    +432659
    +432661
    +432713
    +432721
    +432727
    +432737
    +432743
    +432749
    +432781
    +432793
    +432797
    +432799
    +432833
    +432847
    +432857
    +432869
    +432893
    +432907
    +432923
    +432931
    +432959
    +432961
    +432979
    +432983
    +432989
    +433003
    +433033
    +433049
    +433051
    +433061
    +433073
    +433079
    +433087
    +433093
    +433099
    +433117
    +433123
    +433141
    +433151
    +433187
    +433193
    +433201
    +433207
    +433229
    +433241
    +433249
    +433253
    +433259
    +433261
    +433267
    +433271
    +433291
    +433309
    +433319
    +433337
    +433351
    +433357
    +433361
    +433369
    +433373
    +433393
    +433399
    +433421
    +433429
    +433439
    +433453
    +433469
    +433471
    +433501
    +433507
    +433513
    +433549
    +433571
    +433577
    +433607
    +433627
    +433633
    +433639
    +433651
    +433661
    +433663
    +433673
    +433679
    +433681
    +433703
    +433723
    +433729
    +433747
    +433759
    +433777
    +433781
    +433787
    +433813
    +433817
    +433847
    +433859
    +433861
    +433877
    +433883
    +433889
    +433931
    +433943
    +433963
    +433967
    +433981
    +434009
    +434011
    +434029
    +434039
    +434081
    +434087
    +434107
    +434111
    +434113
    +434117
    +434141
    +434167
    +434179
    +434191
    +434201
    +434209
    +434221
    +434237
    +434243
    +434249
    +434261
    +434267
    +434293
    +434297
    +434303
    +434311
    +434323
    +434347
    +434353
    +434363
    +434377
    +434383
    +434387
    +434389
    +434407
    +434411
    +434431
    +434437
    +434459
    +434461
    +434471
    +434479
    +434501
    +434509
    +434521
    +434561
    +434563
    +434573
    +434593
    +434597
    +434611
    +434647
    +434659
    +434683
    +434689
    +434699
    +434717
    +434719
    +434743
    +434761
    +434783
    +434803
    +434807
    +434813
    +434821
    +434827
    +434831
    +434839
    +434849
    +434857
    +434867
    +434873
    +434881
    +434909
    +434921
    +434923
    +434927
    +434933
    +434939
    +434947
    +434957
    +434963
    +434977
    +434981
    +434989
    +435037
    +435041
    +435059
    +435103
    +435107
    +435109
    +435131
    +435139
    +435143
    +435151
    +435161
    +435179
    +435181
    +435187
    +435191
    +435221
    +435223
    +435247
    +435257
    +435263
    +435277
    +435283
    +435287
    +435307
    +435317
    +435343
    +435349
    +435359
    +435371
    +435397
    +435401
    +435403
    +435419
    +435427
    +435437
    +435439
    +435451
    +435481
    +435503
    +435529
    +435541
    +435553
    +435559
    +435563
    +435569
    +435571
    +435577
    +435583
    +435593
    +435619
    +435623
    +435637
    +435641
    +435647
    +435649
    +435653
    +435661
    +435679
    +435709
    +435731
    +435733
    +435739
    +435751
    +435763
    +435769
    +435779
    +435817
    +435839
    +435847
    +435857
    +435859
    +435881
    +435889
    +435893
    +435907
    +435913
    +435923
    +435947
    +435949
    +435973
    +435983
    +435997
    +436003
    +436013
    +436027
    +436061
    +436081
    +436087
    +436091
    +436097
    +436127
    +436147
    +436151
    +436157
    +436171
    +436181
    +436217
    +436231
    +436253
    +436273
    +436279
    +436283
    +436291
    +436307
    +436309
    +436313
    +436343
    +436357
    +436399
    +436417
    +436427
    +436439
    +436459
    +436463
    +436477
    +436481
    +436483
    +436507
    +436523
    +436529
    +436531
    +436547
    +436549
    +436571
    +436591
    +436607
    +436621
    +436627
    +436649
    +436651
    +436673
    +436687
    +436693
    +436717
    +436727
    +436729
    +436739
    +436741
    +436757
    +436801
    +436811
    +436819
    +436831
    +436841
    +436853
    +436871
    +436889
    +436913
    +436957
    +436963
    +436967
    +436973
    +436979
    +436993
    +436999
    +437011
    +437033
    +437071
    +437077
    +437083
    +437093
    +437111
    +437113
    +437137
    +437141
    +437149
    +437153
    +437159
    +437191
    +437201
    +437219
    +437237
    +437243
    +437263
    +437273
    +437279
    +437287
    +437293
    +437321
    +437351
    +437357
    +437363
    +437387
    +437389
    +437401
    +437413
    +437467
    +437471
    +437473
    +437497
    +437501
    +437509
    +437519
    +437527
    +437533
    +437539
    +437543
    +437557
    +437587
    +437629
    +437641
    +437651
    +437653
    +437677
    +437681
    +437687
    +437693
    +437719
    +437729
    +437743
    +437753
    +437771
    +437809
    +437819
    +437837
    +437849
    +437861
    +437867
    +437881
    +437909
    +437923
    +437947
    +437953
    +437959
    +437977
    +438001
    +438017
    +438029
    +438047
    +438049
    +438091
    +438131
    +438133
    +438143
    +438169
    +438203
    +438211
    +438223
    +438233
    +438241
    +438253
    +438259
    +438271
    +438281
    +438287
    +438301
    +438313
    +438329
    +438341
    +438377
    +438391
    +438401
    +438409
    +438419
    +438439
    +438443
    +438467
    +438479
    +438499
    +438517
    +438521
    +438523
    +438527
    +438533
    +438551
    +438569
    +438589
    +438601
    +438611
    +438623
    +438631
    +438637
    +438661
    +438667
    +438671
    +438701
    +438707
    +438721
    +438733
    +438761
    +438769
    +438793
    +438827
    +438829
    +438833
    +438847
    +438853
    +438869
    +438877
    +438887
    +438899
    +438913
    +438937
    +438941
    +438953
    +438961
    +438967
    +438979
    +438983
    +438989
    +439007
    +439009
    +439063
    +439081
    +439123
    +439133
    +439141
    +439157
    +439163
    +439171
    +439183
    +439199
    +439217
    +439253
    +439273
    +439279
    +439289
    +439303
    +439339
    +439349
    +439357
    +439367
    +439381
    +439409
    +439421
    +439427
    +439429
    +439441
    +439459
    +439463
    +439471
    +439493
    +439511
    +439519
    +439541
    +439559
    +439567
    +439573
    +439577
    +439583
    +439601
    +439613
    +439631
    +439639
    +439661
    +439667
    +439687
    +439693
    +439697
    +439709
    +439723
    +439729
    +439753
    +439759
    +439763
    +439771
    +439781
    +439787
    +439799
    +439811
    +439823
    +439849
    +439853
    +439861
    +439867
    +439883
    +439891
    +439903
    +439919
    +439949
    +439961
    +439969
    +439973
    +439981
    +439991
    +440009
    +440023
    +440039
    +440047
    +440087
    +440093
    +440101
    +440131
    +440159
    +440171
    +440177
    +440179
    +440183
    +440203
    +440207
    +440221
    +440227
    +440239
    +440261
    +440269
    +440281
    +440303
    +440311
    +440329
    +440333
    +440339
    +440347
    +440371
    +440383
    +440389
    +440393
    +440399
    +440431
    +440441
    +440443
    +440471
    +440497
    +440501
    +440507
    +440509
    +440527
    +440537
    +440543
    +440549
    +440551
    +440567
    +440569
    +440579
    +440581
    +440641
    +440651
    +440653
    +440669
    +440677
    +440681
    +440683
    +440711
    +440717
    +440723
    +440731
    +440753
    +440761
    +440773
    +440807
    +440809
    +440821
    +440831
    +440849
    +440863
    +440893
    +440903
    +440911
    +440939
    +440941
    +440953
    +440959
    +440983
    +440987
    +440989
    +441011
    +441029
    +441041
    +441043
    +441053
    +441073
    +441079
    +441101
    +441107
    +441109
    +441113
    +441121
    +441127
    +441157
    +441169
    +441179
    +441187
    +441191
    +441193
    +441229
    +441247
    +441251
    +441257
    +441263
    +441281
    +441307
    +441319
    +441349
    +441359
    +441361
    +441403
    +441421
    +441443
    +441449
    +441461
    +441479
    +441499
    +441517
    +441523
    +441527
    +441547
    +441557
    +441563
    +441569
    +441587
    +441607
    +441613
    +441619
    +441631
    +441647
    +441667
    +441697
    +441703
    +441713
    +441737
    +441751
    +441787
    +441797
    +441799
    +441811
    +441827
    +441829
    +441839
    +441841
    +441877
    +441887
    +441907
    +441913
    +441923
    +441937
    +441953
    +441971
    +442003
    +442007
    +442009
    +442019
    +442027
    +442031
    +442033
    +442061
    +442069
    +442097
    +442109
    +442121
    +442139
    +442147
    +442151
    +442157
    +442171
    +442177
    +442181
    +442193
    +442201
    +442207
    +442217
    +442229
    +442237
    +442243
    +442271
    +442283
    +442291
    +442319
    +442327
    +442333
    +442363
    +442367
    +442397
    +442399
    +442439
    +442447
    +442457
    +442469
    +442487
    +442489
    +442499
    +442501
    +442517
    +442531
    +442537
    +442571
    +442573
    +442577
    +442579
    +442601
    +442609
    +442619
    +442633
    +442691
    +442699
    +442703
    +442721
    +442733
    +442747
    +442753
    +442763
    +442769
    +442777
    +442781
    +442789
    +442807
    +442817
    +442823
    +442829
    +442831
    +442837
    +442843
    +442861
    +442879
    +442903
    +442919
    +442961
    +442963
    +442973
    +442979
    +442987
    +442991
    +442997
    +443011
    +443017
    +443039
    +443041
    +443057
    +443059
    +443063
    +443077
    +443089
    +443117
    +443123
    +443129
    +443147
    +443153
    +443159
    +443161
    +443167
    +443171
    +443189
    +443203
    +443221
    +443227
    +443231
    +443237
    +443243
    +443249
    +443263
    +443273
    +443281
    +443291
    +443293
    +443341
    +443347
    +443353
    +443363
    +443369
    +443389
    +443407
    +443413
    +443419
    +443423
    +443431
    +443437
    +443453
    +443467
    +443489
    +443501
    +443533
    +443543
    +443551
    +443561
    +443563
    +443567
    +443587
    +443591
    +443603
    +443609
    +443629
    +443659
    +443687
    +443689
    +443701
    +443711
    +443731
    +443749
    +443753
    +443759
    +443761
    +443771
    +443777
    +443791
    +443837
    +443851
    +443867
    +443869
    +443873
    +443879
    +443881
    +443893
    +443899
    +443909
    +443917
    +443939
    +443941
    +443953
    +443983
    +443987
    +443999
    +444001
    +444007
    +444029
    +444043
    +444047
    +444079
    +444089
    +444109
    +444113
    +444121
    +444127
    +444131
    +444151
    +444167
    +444173
    +444179
    +444181
    +444187
    +444209
    +444253
    +444271
    +444281
    +444287
    +444289
    +444293
    +444307
    +444341
    +444343
    +444347
    +444349
    +444401
    +444403
    +444421
    +444443
    +444449
    +444461
    +444463
    +444469
    +444473
    +444487
    +444517
    +444523
    +444527
    +444529
    +444539
    +444547
    +444553
    +444557
    +444569
    +444589
    +444607
    +444623
    +444637
    +444641
    +444649
    +444671
    +444677
    +444701
    +444713
    +444739
    +444767
    +444791
    +444793
    +444803
    +444811
    +444817
    +444833
    +444841
    +444859
    +444863
    +444869
    +444877
    +444883
    +444887
    +444893
    +444901
    +444929
    +444937
    +444953
    +444967
    +444971
    +444979
    +445001
    +445019
    +445021
    +445031
    +445033
    +445069
    +445087
    +445091
    +445097
    +445103
    +445141
    +445157
    +445169
    +445183
    +445187
    +445199
    +445229
    +445261
    +445271
    +445279
    +445283
    +445297
    +445307
    +445321
    +445339
    +445363
    +445427
    +445433
    +445447
    +445453
    +445463
    +445477
    +445499
    +445507
    +445537
    +445541
    +445567
    +445573
    +445583
    +445589
    +445597
    +445619
    +445631
    +445633
    +445649
    +445657
    +445691
    +445699
    +445703
    +445741
    +445747
    +445769
    +445771
    +445789
    +445799
    +445807
    +445829
    +445847
    +445853
    +445871
    +445877
    +445883
    +445891
    +445931
    +445937
    +445943
    +445967
    +445969
    +446003
    +446009
    +446041
    +446053
    +446081
    +446087
    +446111
    +446123
    +446129
    +446141
    +446179
    +446189
    +446191
    +446197
    +446221
    +446227
    +446231
    +446261
    +446263
    +446273
    +446279
    +446293
    +446309
    +446323
    +446333
    +446353
    +446363
    +446387
    +446389
    +446399
    +446401
    +446417
    +446441
    +446447
    +446461
    +446473
    +446477
    +446503
    +446533
    +446549
    +446561
    +446569
    +446597
    +446603
    +446609
    +446647
    +446657
    +446713
    +446717
    +446731
    +446753
    +446759
    +446767
    +446773
    +446819
    +446827
    +446839
    +446863
    +446881
    +446891
    +446893
    +446909
    +446911
    +446921
    +446933
    +446951
    +446969
    +446983
    +447001
    +447011
    +447019
    +447053
    +447067
    +447079
    +447101
    +447107
    +447119
    +447133
    +447137
    +447173
    +447179
    +447193
    +447197
    +447211
    +447217
    +447221
    +447233
    +447247
    +447257
    +447259
    +447263
    +447311
    +447319
    +447323
    +447331
    +447353
    +447401
    +447409
    +447427
    +447439
    +447443
    +447449
    +447451
    +447463
    +447467
    +447481
    +447509
    +447521
    +447527
    +447541
    +447569
    +447571
    +447611
    +447617
    +447637
    +447641
    +447677
    +447683
    +447701
    +447703
    +447743
    +447749
    +447757
    +447779
    +447791
    +447793
    +447817
    +447823
    +447827
    +447829
    +447841
    +447859
    +447877
    +447883
    +447893
    +447901
    +447907
    +447943
    +447961
    +447983
    +447991
    +448003
    +448013
    +448027
    +448031
    +448057
    +448067
    +448073
    +448093
    +448111
    +448121
    +448139
    +448141
    +448157
    +448159
    +448169
    +448177
    +448187
    +448193
    +448199
    +448207
    +448241
    +448249
    +448303
    +448309
    +448313
    +448321
    +448351
    +448363
    +448367
    +448373
    +448379
    +448387
    +448397
    +448421
    +448451
    +448519
    +448531
    +448561
    +448597
    +448607
    +448627
    +448631
    +448633
    +448667
    +448687
    +448697
    +448703
    +448727
    +448733
    +448741
    +448769
    +448793
    +448801
    +448807
    +448829
    +448843
    +448853
    +448859
    +448867
    +448871
    +448873
    +448879
    +448883
    +448907
    +448927
    +448939
    +448969
    +448993
    +448997
    +448999
    +449003
    +449011
    +449051
    +449077
    +449083
    +449093
    +449107
    +449117
    +449129
    +449131
    +449149
    +449153
    +449161
    +449171
    +449173
    +449201
    +449203
    +449209
    +449227
    +449243
    +449249
    +449261
    +449263
    +449269
    +449287
    +449299
    +449303
    +449311
    +449321
    +449333
    +449347
    +449353
    +449363
    +449381
    +449399
    +449411
    +449417
    +449419
    +449437
    +449441
    +449459
    +449473
    +449543
    +449549
    +449557
    +449563
    +449567
    +449569
    +449591
    +449609
    +449621
    +449629
    +449653
    +449663
    +449671
    +449677
    +449681
    +449689
    +449693
    +449699
    +449741
    +449759
    +449767
    +449773
    +449783
    +449797
    +449807
    +449821
    +449833
    +449851
    +449879
    +449921
    +449929
    +449941
    +449951
    +449959
    +449963
    +449971
    +449987
    +449989
    +450001
    +450011
    +450019
    +450029
    +450067
    +450071
    +450077
    +450083
    +450101
    +450103
    +450113
    +450127
    +450137
    +450161
    +450169
    +450193
    +450199
    +450209
    +450217
    +450223
    +450227
    +450239
    +450257
    +450259
    +450277
    +450287
    +450293
    +450299
    +450301
    +450311
    +450343
    +450349
    +450361
    +450367
    +450377
    +450383
    +450391
    +450403
    +450413
    +450421
    +450431
    +450451
    +450473
    +450479
    +450481
    +450487
    +450493
    +450503
    +450529
    +450533
    +450557
    +450563
    +450581
    +450587
    +450599
    +450601
    +450617
    +450641
    +450643
    +450649
    +450677
    +450691
    +450707
    +450719
    +450727
    +450761
    +450767
    +450787
    +450797
    +450799
    +450803
    +450809
    +450811
    +450817
    +450829
    +450839
    +450841
    +450847
    +450859
    +450881
    +450883
    +450887
    +450893
    +450899
    +450913
    +450917
    +450929
    +450943
    +450949
    +450971
    +450991
    +450997
    +451013
    +451039
    +451051
    +451057
    +451069
    +451093
    +451097
    +451103
    +451109
    +451159
    +451177
    +451181
    +451183
    +451201
    +451207
    +451249
    +451277
    +451279
    +451301
    +451303
    +451309
    +451313
    +451331
    +451337
    +451343
    +451361
    +451387
    +451397
    +451411
    +451439
    +451441
    +451481
    +451499
    +451519
    +451523
    +451541
    +451547
    +451553
    +451579
    +451601
    +451609
    +451621
    +451637
    +451657
    +451663
    +451667
    +451669
    +451679
    +451681
    +451691
    +451699
    +451709
    +451723
    +451747
    +451753
    +451771
    +451783
    +451793
    +451799
    +451823
    +451831
    +451837
    +451859
    +451873
    +451879
    +451897
    +451901
    +451903
    +451909
    +451921
    +451933
    +451937
    +451939
    +451961
    +451967
    +451987
    +452009
    +452017
    +452027
    +452033
    +452041
    +452077
    +452083
    +452087
    +452131
    +452159
    +452161
    +452171
    +452191
    +452201
    +452213
    +452227
    +452233
    +452239
    +452269
    +452279
    +452293
    +452297
    +452329
    +452363
    +452377
    +452393
    +452401
    +452443
    +452453
    +452497
    +452519
    +452521
    +452531
    +452533
    +452537
    +452539
    +452549
    +452579
    +452587
    +452597
    +452611
    +452629
    +452633
    +452671
    +452687
    +452689
    +452701
    +452731
    +452759
    +452773
    +452797
    +452807
    +452813
    +452821
    +452831
    +452857
    +452869
    +452873
    +452923
    +452953
    +452957
    +452983
    +452989
    +453023
    +453029
    +453053
    +453073
    +453107
    +453119
    +453133
    +453137
    +453143
    +453157
    +453161
    +453181
    +453197
    +453199
    +453209
    +453217
    +453227
    +453239
    +453247
    +453269
    +453289
    +453293
    +453301
    +453311
    +453317
    +453329
    +453347
    +453367
    +453371
    +453377
    +453379
    +453421
    +453451
    +453461
    +453527
    +453553
    +453559
    +453569
    +453571
    +453599
    +453601
    +453617
    +453631
    +453637
    +453641
    +453643
    +453659
    +453667
    +453671
    +453683
    +453703
    +453707
    +453709
    +453737
    +453757
    +453797
    +453799
    +453823
    +453833
    +453847
    +453851
    +453877
    +453889
    +453907
    +453913
    +453923
    +453931
    +453949
    +453961
    +453977
    +453983
    +453991
    +454009
    +454021
    +454031
    +454033
    +454039
    +454061
    +454063
    +454079
    +454109
    +454141
    +454151
    +454159
    +454183
    +454199
    +454211
    +454213
    +454219
    +454229
    +454231
    +454247
    +454253
    +454277
    +454297
    +454303
    +454313
    +454331
    +454351
    +454357
    +454361
    +454379
    +454387
    +454409
    +454417
    +454451
    +454453
    +454483
    +454501
    +454507
    +454513
    +454541
    +454543
    +454547
    +454577
    +454579
    +454603
    +454609
    +454627
    +454637
    +454673
    +454679
    +454709
    +454711
    +454721
    +454723
    +454759
    +454763
    +454777
    +454799
    +454823
    +454843
    +454847
    +454849
    +454859
    +454889
    +454891
    +454907
    +454919
    +454921
    +454931
    +454943
    +454967
    +454969
    +454973
    +454991
    +455003
    +455011
    +455033
    +455047
    +455053
    +455093
    +455099
    +455123
    +455149
    +455159
    +455167
    +455171
    +455177
    +455201
    +455219
    +455227
    +455233
    +455237
    +455261
    +455263
    +455269
    +455291
    +455309
    +455317
    +455321
    +455333
    +455339
    +455341
    +455353
    +455381
    +455393
    +455401
    +455407
    +455419
    +455431
    +455437
    +455443
    +455461
    +455471
    +455473
    +455479
    +455489
    +455491
    +455513
    +455527
    +455531
    +455537
    +455557
    +455573
    +455579
    +455597
    +455599
    +455603
    +455627
    +455647
    +455659
    +455681
    +455683
    +455687
    +455701
    +455711
    +455717
    +455737
    +455761
    +455783
    +455789
    +455809
    +455827
    +455831
    +455849
    +455863
    +455881
    +455899
    +455921
    +455933
    +455941
    +455953
    +455969
    +455977
    +455989
    +455993
    +455999
    +456007
    +456013
    +456023
    +456037
    +456047
    +456061
    +456091
    +456107
    +456109
    +456119
    +456149
    +456151
    +456167
    +456193
    +456223
    +456233
    +456241
    +456283
    +456293
    +456329
    +456349
    +456353
    +456367
    +456377
    +456403
    +456409
    +456427
    +456439
    +456451
    +456457
    +456461
    +456499
    +456503
    +456517
    +456523
    +456529
    +456539
    +456553
    +456557
    +456559
    +456571
    +456581
    +456587
    +456607
    +456611
    +456613
    +456623
    +456641
    +456647
    +456649
    +456653
    +456679
    +456683
    +456697
    +456727
    +456737
    +456763
    +456767
    +456769
    +456791
    +456809
    +456811
    +456821
    +456871
    +456877
    +456881
    +456899
    +456901
    +456923
    +456949
    +456959
    +456979
    +456991
    +457001
    +457003
    +457013
    +457021
    +457043
    +457049
    +457057
    +457087
    +457091
    +457097
    +457099
    +457117
    +457139
    +457151
    +457153
    +457183
    +457189
    +457201
    +457213
    +457229
    +457241
    +457253
    +457267
    +457271
    +457277
    +457279
    +457307
    +457319
    +457333
    +457339
    +457363
    +457367
    +457381
    +457393
    +457397
    +457399
    +457403
    +457411
    +457421
    +457433
    +457459
    +457469
    +457507
    +457511
    +457517
    +457547
    +457553
    +457559
    +457571
    +457607
    +457609
    +457621
    +457643
    +457651
    +457661
    +457669
    +457673
    +457679
    +457687
    +457697
    +457711
    +457739
    +457757
    +457789
    +457799
    +457813
    +457817
    +457829
    +457837
    +457871
    +457889
    +457903
    +457913
    +457943
    +457979
    +457981
    +457987
    +458009
    +458027
    +458039
    +458047
    +458053
    +458057
    +458063
    +458069
    +458119
    +458123
    +458173
    +458179
    +458189
    +458191
    +458197
    +458207
    +458219
    +458239
    +458309
    +458317
    +458323
    +458327
    +458333
    +458357
    +458363
    +458377
    +458399
    +458401
    +458407
    +458449
    +458477
    +458483
    +458501
    +458531
    +458533
    +458543
    +458567
    +458569
    +458573
    +458593
    +458599
    +458611
    +458621
    +458629
    +458639
    +458651
    +458663
    +458669
    +458683
    +458701
    +458719
    +458729
    +458747
    +458789
    +458791
    +458797
    +458807
    +458819
    +458849
    +458863
    +458879
    +458891
    +458897
    +458917
    +458921
    +458929
    +458947
    +458957
    +458959
    +458963
    +458971
    +458977
    +458981
    +458987
    +458993
    +459007
    +459013
    +459023
    +459029
    +459031
    +459037
    +459047
    +459089
    +459091
    +459113
    +459127
    +459167
    +459169
    +459181
    +459209
    +459223
    +459229
    +459233
    +459257
    +459271
    +459293
    +459301
    +459313
    +459317
    +459337
    +459341
    +459343
    +459353
    +459373
    +459377
    +459383
    +459397
    +459421
    +459427
    +459443
    +459463
    +459467
    +459469
    +459479
    +459509
    +459521
    +459523
    +459593
    +459607
    +459611
    +459619
    +459623
    +459631
    +459647
    +459649
    +459671
    +459677
    +459691
    +459703
    +459749
    +459763
    +459791
    +459803
    +459817
    +459829
    +459841
    +459847
    +459883
    +459913
    +459923
    +459929
    +459937
    +459961
    +460013
    +460039
    +460051
    +460063
    +460073
    +460079
    +460081
    +460087
    +460091
    +460099
    +460111
    +460127
    +460147
    +460157
    +460171
    +460181
    +460189
    +460211
    +460217
    +460231
    +460247
    +460267
    +460289
    +460297
    +460301
    +460337
    +460349
    +460373
    +460379
    +460387
    +460393
    +460403
    +460409
    +460417
    +460451
    +460463
    +460477
    +460531
    +460543
    +460561
    +460571
    +460589
    +460609
    +460619
    +460627
    +460633
    +460637
    +460643
    +460657
    +460673
    +460697
    +460709
    +460711
    +460721
    +460771
    +460777
    +460787
    +460793
    +460813
    +460829
    +460841
    +460843
    +460871
    +460891
    +460903
    +460907
    +460913
    +460919
    +460937
    +460949
    +460951
    +460969
    +460973
    +460979
    +460981
    +460987
    +460991
    +461009
    +461011
    +461017
    +461051
    +461053
    +461059
    +461093
    +461101
    +461119
    +461143
    +461147
    +461171
    +461183
    +461191
    +461207
    +461233
    +461239
    +461257
    +461269
    +461273
    +461297
    +461299
    +461309
    +461317
    +461323
    +461327
    +461333
    +461359
    +461381
    +461393
    +461407
    +461411
    +461413
    +461437
    +461441
    +461443
    +461467
    +461479
    +461507
    +461521
    +461561
    +461569
    +461581
    +461599
    +461603
    +461609
    +461627
    +461639
    +461653
    +461677
    +461687
    +461689
    +461693
    +461707
    +461717
    +461801
    +461803
    +461819
    +461843
    +461861
    +461887
    +461891
    +461917
    +461921
    +461933
    +461957
    +461971
    +461977
    +461983
    +462013
    +462041
    +462067
    +462073
    +462079
    +462097
    +462103
    +462109
    +462113
    +462131
    +462149
    +462181
    +462191
    +462199
    +462221
    +462239
    +462263
    +462271
    +462307
    +462311
    +462331
    +462337
    +462361
    +462373
    +462377
    +462401
    +462409
    +462419
    +462421
    +462437
    +462443
    +462467
    +462481
    +462491
    +462493
    +462499
    +462529
    +462541
    +462547
    +462557
    +462569
    +462571
    +462577
    +462589
    +462607
    +462629
    +462641
    +462643
    +462653
    +462659
    +462667
    +462673
    +462677
    +462697
    +462713
    +462719
    +462727
    +462733
    +462739
    +462773
    +462827
    +462841
    +462851
    +462863
    +462871
    +462881
    +462887
    +462899
    +462901
    +462911
    +462937
    +462947
    +462953
    +462983
    +463003
    +463031
    +463033
    +463093
    +463103
    +463157
    +463181
    +463189
    +463207
    +463213
    +463219
    +463231
    +463237
    +463247
    +463249
    +463261
    +463283
    +463291
    +463297
    +463303
    +463313
    +463319
    +463321
    +463339
    +463343
    +463363
    +463387
    +463399
    +463433
    +463447
    +463451
    +463453
    +463457
    +463459
    +463483
    +463501
    +463511
    +463513
    +463523
    +463531
    +463537
    +463549
    +463579
    +463613
    +463627
    +463633
    +463643
    +463649
    +463663
    +463679
    +463693
    +463711
    +463717
    +463741
    +463747
    +463753
    +463763
    +463781
    +463787
    +463807
    +463823
    +463829
    +463831
    +463849
    +463861
    +463867
    +463873
    +463889
    +463891
    +463907
    +463919
    +463921
    +463949
    +463963
    +463973
    +463987
    +463993
    +464003
    +464011
    +464021
    +464033
    +464047
    +464069
    +464081
    +464089
    +464119
    +464129
    +464131
    +464137
    +464141
    +464143
    +464171
    +464173
    +464197
    +464201
    +464213
    +464237
    +464251
    +464257
    +464263
    +464279
    +464281
    +464291
    +464309
    +464311
    +464327
    +464351
    +464371
    +464381
    +464383
    +464413
    +464419
    +464437
    +464447
    +464459
    +464467
    +464479
    +464483
    +464521
    +464537
    +464539
    +464549
    +464557
    +464561
    +464587
    +464591
    +464603
    +464617
    +464621
    +464647
    +464663
    +464687
    +464699
    +464741
    +464747
    +464749
    +464753
    +464767
    +464771
    +464773
    +464777
    +464801
    +464803
    +464809
    +464813
    +464819
    +464843
    +464857
    +464879
    +464897
    +464909
    +464917
    +464923
    +464927
    +464939
    +464941
    +464951
    +464953
    +464963
    +464983
    +464993
    +464999
    +465007
    +465011
    +465013
    +465019
    +465041
    +465061
    +465067
    +465071
    +465077
    +465079
    +465089
    +465107
    +465119
    +465133
    +465151
    +465161
    +465163
    +465167
    +465169
    +465173
    +465187
    +465209
    +465211
    +465259
    +465271
    +465277
    +465281
    +465293
    +465299
    +465317
    +465319
    +465331
    +465337
    +465373
    +465379
    +465383
    +465407
    +465419
    +465433
    +465463
    +465469
    +465523
    +465529
    +465541
    +465551
    +465581
    +465587
    +465611
    +465631
    +465643
    +465649
    +465659
    +465679
    +465701
    +465721
    +465739
    +465743
    +465761
    +465781
    +465797
    +465799
    +465809
    +465821
    +465833
    +465841
    +465887
    +465893
    +465901
    +465917
    +465929
    +465931
    +465947
    +465977
    +465989
    +466009
    +466019
    +466027
    +466033
    +466043
    +466061
    +466069
    +466073
    +466079
    +466087
    +466091
    +466121
    +466139
    +466153
    +466171
    +466181
    +466183
    +466201
    +466243
    +466247
    +466261
    +466267
    +466273
    +466283
    +466303
    +466321
    +466331
    +466339
    +466357
    +466369
    +466373
    +466409
    +466423
    +466441
    +466451
    +466483
    +466517
    +466537
    +466547
    +466553
    +466561
    +466567
    +466573
    +466579
    +466603
    +466619
    +466637
    +466649
    +466651
    +466673
    +466717
    +466723
    +466729
    +466733
    +466747
    +466751
    +466777
    +466787
    +466801
    +466819
    +466853
    +466859
    +466897
    +466909
    +466913
    +466919
    +466951
    +466957
    +466997
    +467003
    +467009
    +467017
    +467021
    +467063
    +467081
    +467083
    +467101
    +467119
    +467123
    +467141
    +467147
    +467171
    +467183
    +467197
    +467209
    +467213
    +467237
    +467239
    +467261
    +467293
    +467297
    +467317
    +467329
    +467333
    +467353
    +467371
    +467399
    +467417
    +467431
    +467437
    +467447
    +467471
    +467473
    +467477
    +467479
    +467491
    +467497
    +467503
    +467507
    +467527
    +467531
    +467543
    +467549
    +467557
    +467587
    +467591
    +467611
    +467617
    +467627
    +467629
    +467633
    +467641
    +467651
    +467657
    +467669
    +467671
    +467681
    +467689
    +467699
    +467713
    +467729
    +467737
    +467743
    +467749
    +467773
    +467783
    +467813
    +467827
    +467833
    +467867
    +467869
    +467879
    +467881
    +467893
    +467897
    +467899
    +467903
    +467927
    +467941
    +467953
    +467963
    +467977
    +468001
    +468011
    +468019
    +468029
    +468049
    +468059
    +468067
    +468071
    +468079
    +468107
    +468109
    +468113
    +468121
    +468133
    +468137
    +468151
    +468157
    +468173
    +468187
    +468191
    +468199
    +468239
    +468241
    +468253
    +468271
    +468277
    +468289
    +468319
    +468323
    +468353
    +468359
    +468371
    +468389
    +468421
    +468439
    +468451
    +468463
    +468473
    +468491
    +468493
    +468499
    +468509
    +468527
    +468551
    +468557
    +468577
    +468581
    +468593
    +468599
    +468613
    +468619
    +468623
    +468641
    +468647
    +468653
    +468661
    +468667
    +468683
    +468691
    +468697
    +468703
    +468709
    +468719
    +468737
    +468739
    +468761
    +468773
    +468781
    +468803
    +468817
    +468821
    +468841
    +468851
    +468859
    +468869
    +468883
    +468887
    +468889
    +468893
    +468899
    +468913
    +468953
    +468967
    +468973
    +468983
    +469009
    +469031
    +469037
    +469069
    +469099
    +469121
    +469127
    +469141
    +469153
    +469169
    +469193
    +469207
    +469219
    +469229
    +469237
    +469241
    +469253
    +469267
    +469279
    +469283
    +469303
    +469321
    +469331
    +469351
    +469363
    +469367
    +469369
    +469379
    +469397
    +469411
    +469429
    +469439
    +469457
    +469487
    +469501
    +469529
    +469541
    +469543
    +469561
    +469583
    +469589
    +469613
    +469627
    +469631
    +469649
    +469657
    +469673
    +469687
    +469691
    +469717
    +469723
    +469747
    +469753
    +469757
    +469769
    +469787
    +469793
    +469801
    +469811
    +469823
    +469841
    +469849
    +469877
    +469879
    +469891
    +469907
    +469919
    +469939
    +469957
    +469969
    +469979
    +469993
    +470021
    +470039
    +470059
    +470077
    +470081
    +470083
    +470087
    +470089
    +470131
    +470149
    +470153
    +470161
    +470167
    +470179
    +470201
    +470207
    +470209
    +470213
    +470219
    +470227
    +470243
    +470251
    +470263
    +470279
    +470297
    +470299
    +470303
    +470317
    +470333
    +470347
    +470359
    +470389
    +470399
    +470411
    +470413
    +470417
    +470429
    +470443
    +470447
    +470453
    +470461
    +470471
    +470473
    +470489
    +470501
    +470513
    +470521
    +470531
    +470539
    +470551
    +470579
    +470593
    +470597
    +470599
    +470609
    +470621
    +470627
    +470647
    +470651
    +470653
    +470663
    +470669
    +470689
    +470711
    +470719
    +470731
    +470749
    +470779
    +470783
    +470791
    +470819
    +470831
    +470837
    +470863
    +470867
    +470881
    +470887
    +470891
    +470903
    +470927
    +470933
    +470941
    +470947
    +470957
    +470959
    +470993
    +470999
    +471007
    +471041
    +471061
    +471073
    +471089
    +471091
    +471101
    +471137
    +471139
    +471161
    +471173
    +471179
    +471187
    +471193
    +471209
    +471217
    +471241
    +471253
    +471259
    +471277
    +471281
    +471283
    +471299
    +471301
    +471313
    +471353
    +471389
    +471391
    +471403
    +471407
    +471439
    +471451
    +471467
    +471481
    +471487
    +471503
    +471509
    +471521
    +471533
    +471539
    +471553
    +471571
    +471589
    +471593
    +471607
    +471617
    +471619
    +471641
    +471649
    +471659
    +471671
    +471673
    +471677
    +471683
    +471697
    +471703
    +471719
    +471721
    +471749
    +471769
    +471781
    +471791
    +471803
    +471817
    +471841
    +471847
    +471853
    +471871
    +471893
    +471901
    +471907
    +471923
    +471929
    +471931
    +471943
    +471949
    +471959
    +471997
    +472019
    +472027
    +472051
    +472057
    +472063
    +472067
    +472103
    +472111
    +472123
    +472127
    +472133
    +472139
    +472151
    +472159
    +472163
    +472189
    +472193
    +472247
    +472249
    +472253
    +472261
    +472273
    +472289
    +472301
    +472309
    +472319
    +472331
    +472333
    +472349
    +472369
    +472391
    +472393
    +472399
    +472411
    +472421
    +472457
    +472469
    +472477
    +472523
    +472541
    +472543
    +472559
    +472561
    +472573
    +472597
    +472631
    +472639
    +472643
    +472669
    +472687
    +472691
    +472697
    +472709
    +472711
    +472721
    +472741
    +472751
    +472763
    +472793
    +472799
    +472817
    +472831
    +472837
    +472847
    +472859
    +472883
    +472907
    +472909
    +472921
    +472937
    +472939
    +472963
    +472993
    +473009
    +473021
    +473027
    +473089
    +473101
    +473117
    +473141
    +473147
    +473159
    +473167
    +473173
    +473191
    +473197
    +473201
    +473203
    +473219
    +473227
    +473257
    +473279
    +473287
    +473293
    +473311
    +473321
    +473327
    +473351
    +473353
    +473377
    +473381
    +473383
    +473411
    +473419
    +473441
    +473443
    +473453
    +473471
    +473477
    +473479
    +473497
    +473503
    +473507
    +473513
    +473519
    +473527
    +473531
    +473533
    +473549
    +473579
    +473597
    +473611
    +473617
    +473633
    +473647
    +473659
    +473719
    +473723
    +473729
    +473741
    +473743
    +473761
    +473789
    +473833
    +473839
    +473857
    +473861
    +473867
    +473887
    +473899
    +473911
    +473923
    +473927
    +473929
    +473939
    +473951
    +473953
    +473971
    +473981
    +473987
    +473999
    +474017
    +474029
    +474037
    +474043
    +474049
    +474059
    +474073
    +474077
    +474101
    +474119
    +474127
    +474137
    +474143
    +474151
    +474163
    +474169
    +474197
    +474211
    +474223
    +474241
    +474263
    +474289
    +474307
    +474311
    +474319
    +474337
    +474343
    +474347
    +474359
    +474379
    +474389
    +474391
    +474413
    +474433
    +474437
    +474443
    +474479
    +474491
    +474497
    +474499
    +474503
    +474533
    +474541
    +474547
    +474557
    +474569
    +474571
    +474581
    +474583
    +474619
    +474629
    +474647
    +474659
    +474667
    +474671
    +474707
    +474709
    +474737
    +474751
    +474757
    +474769
    +474779
    +474787
    +474809
    +474811
    +474839
    +474847
    +474857
    +474899
    +474907
    +474911
    +474917
    +474923
    +474931
    +474937
    +474941
    +474949
    +474959
    +474977
    +474983
    +475037
    +475051
    +475073
    +475081
    +475091
    +475093
    +475103
    +475109
    +475141
    +475147
    +475151
    +475159
    +475169
    +475207
    +475219
    +475229
    +475243
    +475271
    +475273
    +475283
    +475289
    +475297
    +475301
    +475327
    +475331
    +475333
    +475351
    +475367
    +475369
    +475379
    +475381
    +475403
    +475417
    +475421
    +475427
    +475429
    +475441
    +475457
    +475469
    +475483
    +475511
    +475523
    +475529
    +475549
    +475583
    +475597
    +475613
    +475619
    +475621
    +475637
    +475639
    +475649
    +475669
    +475679
    +475681
    +475691
    +475693
    +475697
    +475721
    +475729
    +475751
    +475753
    +475759
    +475763
    +475777
    +475789
    +475793
    +475807
    +475823
    +475831
    +475837
    +475841
    +475859
    +475877
    +475879
    +475889
    +475897
    +475903
    +475907
    +475921
    +475927
    +475933
    +475957
    +475973
    +475991
    +475997
    +476009
    +476023
    +476027
    +476029
    +476039
    +476041
    +476059
    +476081
    +476087
    +476089
    +476101
    +476107
    +476111
    +476137
    +476143
    +476167
    +476183
    +476219
    +476233
    +476237
    +476243
    +476249
    +476279
    +476299
    +476317
    +476347
    +476351
    +476363
    +476369
    +476381
    +476401
    +476407
    +476419
    +476423
    +476429
    +476467
    +476477
    +476479
    +476507
    +476513
    +476519
    +476579
    +476587
    +476591
    +476599
    +476603
    +476611
    +476633
    +476639
    +476647
    +476659
    +476681
    +476683
    +476701
    +476713
    +476719
    +476737
    +476743
    +476753
    +476759
    +476783
    +476803
    +476831
    +476849
    +476851
    +476863
    +476869
    +476887
    +476891
    +476911
    +476921
    +476929
    +476977
    +476981
    +476989
    +477011
    +477013
    +477017
    +477019
    +477031
    +477047
    +477073
    +477077
    +477091
    +477131
    +477149
    +477163
    +477209
    +477221
    +477229
    +477259
    +477277
    +477293
    +477313
    +477317
    +477329
    +477341
    +477359
    +477361
    +477383
    +477409
    +477439
    +477461
    +477469
    +477497
    +477511
    +477517
    +477523
    +477539
    +477551
    +477553
    +477557
    +477571
    +477577
    +477593
    +477619
    +477623
    +477637
    +477671
    +477677
    +477721
    +477727
    +477731
    +477739
    +477767
    +477769
    +477791
    +477797
    +477809
    +477811
    +477821
    +477823
    +477839
    +477847
    +477857
    +477863
    +477881
    +477899
    +477913
    +477941
    +477947
    +477973
    +477977
    +477991
    +478001
    +478039
    +478063
    +478067
    +478069
    +478087
    +478099
    +478111
    +478129
    +478139
    +478157
    +478169
    +478171
    +478189
    +478199
    +478207
    +478213
    +478241
    +478243
    +478253
    +478259
    +478271
    +478273
    +478321
    +478339
    +478343
    +478351
    +478391
    +478399
    +478403
    +478411
    +478417
    +478421
    +478427
    +478433
    +478441
    +478451
    +478453
    +478459
    +478481
    +478483
    +478493
    +478523
    +478531
    +478571
    +478573
    +478579
    +478589
    +478603
    +478627
    +478631
    +478637
    +478651
    +478679
    +478697
    +478711
    +478727
    +478729
    +478739
    +478741
    +478747
    +478763
    +478769
    +478787
    +478801
    +478811
    +478813
    +478823
    +478831
    +478843
    +478853
    +478861
    +478871
    +478879
    +478897
    +478901
    +478913
    +478927
    +478931
    +478937
    +478943
    +478963
    +478967
    +478991
    +478999
    +479023
    +479027
    +479029
    +479041
    +479081
    +479131
    +479137
    +479147
    +479153
    +479189
    +479191
    +479201
    +479209
    +479221
    +479231
    +479239
    +479243
    +479263
    +479267
    +479287
    +479299
    +479309
    +479317
    +479327
    +479357
    +479371
    +479377
    +479387
    +479419
    +479429
    +479431
    +479441
    +479461
    +479473
    +479489
    +479497
    +479509
    +479513
    +479533
    +479543
    +479561
    +479569
    +479581
    +479593
    +479599
    +479623
    +479629
    +479639
    +479701
    +479749
    +479753
    +479761
    +479771
    +479777
    +479783
    +479797
    +479813
    +479821
    +479833
    +479839
    +479861
    +479879
    +479881
    +479891
    +479903
    +479909
    +479939
    +479951
    +479953
    +479957
    +479971
    +480013
    +480017
    +480019
    +480023
    +480043
    +480047
    +480049
    +480059
    +480061
    +480071
    +480091
    +480101
    +480107
    +480113
    +480133
    +480143
    +480157
    +480167
    +480169
    +480203
    +480209
    +480287
    +480299
    +480317
    +480329
    +480341
    +480343
    +480349
    +480367
    +480373
    +480379
    +480383
    +480391
    +480409
    +480419
    +480427
    +480449
    +480451
    +480461
    +480463
    +480499
    +480503
    +480509
    +480517
    +480521
    +480527
    +480533
    +480541
    +480553
    +480563
    +480569
    +480583
    +480587
    +480647
    +480661
    +480707
    +480713
    +480731
    +480737
    +480749
    +480761
    +480773
    +480787
    +480803
    +480827
    +480839
    +480853
    +480881
    +480911
    +480919
    +480929
    +480937
    +480941
    +480959
    +480967
    +480979
    +480989
    +481001
    +481003
    +481009
    +481021
    +481043
    +481051
    +481067
    +481073
    +481087
    +481093
    +481097
    +481109
    +481123
    +481133
    +481141
    +481147
    +481153
    +481157
    +481171
    +481177
    +481181
    +481199
    +481207
    +481211
    +481231
    +481249
    +481297
    +481301
    +481303
    +481307
    +481343
    +481363
    +481373
    +481379
    +481387
    +481409
    +481417
    +481433
    +481447
    +481469
    +481489
    +481501
    +481513
    +481531
    +481549
    +481571
    +481577
    +481589
    +481619
    +481633
    +481639
    +481651
    +481667
    +481673
    +481681
    +481693
    +481697
    +481699
    +481721
    +481751
    +481753
    +481769
    +481787
    +481801
    +481807
    +481813
    +481837
    +481843
    +481847
    +481849
    +481861
    +481867
    +481879
    +481883
    +481909
    +481939
    +481963
    +481997
    +482017
    +482021
    +482029
    +482033
    +482039
    +482051
    +482071
    +482093
    +482099
    +482101
    +482117
    +482123
    +482179
    +482189
    +482203
    +482213
    +482227
    +482231
    +482233
    +482243
    +482263
    +482281
    +482309
    +482323
    +482347
    +482351
    +482359
    +482371
    +482387
    +482393
    +482399
    +482401
    +482407
    +482413
    +482423
    +482437
    +482441
    +482483
    +482501
    +482507
    +482509
    +482513
    +482519
    +482527
    +482539
    +482569
    +482593
    +482597
    +482621
    +482627
    +482633
    +482641
    +482659
    +482663
    +482683
    +482687
    +482689
    +482707
    +482711
    +482717
    +482719
    +482731
    +482743
    +482753
    +482759
    +482767
    +482773
    +482789
    +482803
    +482819
    +482827
    +482837
    +482861
    +482863
    +482873
    +482897
    +482899
    +482917
    +482941
    +482947
    +482957
    +482971
    +483017
    +483031
    +483061
    +483071
    +483097
    +483127
    +483139
    +483163
    +483167
    +483179
    +483209
    +483211
    +483221
    +483229
    +483233
    +483239
    +483247
    +483251
    +483281
    +483289
    +483317
    +483323
    +483337
    +483347
    +483367
    +483377
    +483389
    +483397
    +483407
    +483409
    +483433
    +483443
    +483467
    +483481
    +483491
    +483499
    +483503
    +483523
    +483541
    +483551
    +483557
    +483563
    +483577
    +483611
    +483619
    +483629
    +483643
    +483649
    +483671
    +483697
    +483709
    +483719
    +483727
    +483733
    +483751
    +483757
    +483761
    +483767
    +483773
    +483787
    +483809
    +483811
    +483827
    +483829
    +483839
    +483853
    +483863
    +483869
    +483883
    +483907
    +483929
    +483937
    +483953
    +483971
    +483991
    +484019
    +484027
    +484037
    +484061
    +484067
    +484079
    +484091
    +484111
    +484117
    +484123
    +484129
    +484151
    +484153
    +484171
    +484181
    +484193
    +484201
    +484207
    +484229
    +484243
    +484259
    +484283
    +484301
    +484303
    +484327
    +484339
    +484361
    +484369
    +484373
    +484397
    +484411
    +484417
    +484439
    +484447
    +484457
    +484459
    +484487
    +484489
    +484493
    +484531
    +484543
    +484577
    +484597
    +484607
    +484609
    +484613
    +484621
    +484639
    +484643
    +484691
    +484703
    +484727
    +484733
    +484751
    +484763
    +484769
    +484777
    +484787
    +484829
    +484853
    +484867
    +484927
    +484951
    +484987
    +484999
    +485021
    +485029
    +485041
    +485053
    +485059
    +485063
    +485081
    +485101
    +485113
    +485123
    +485131
    +485137
    +485161
    +485167
    +485171
    +485201
    +485207
    +485209
    +485263
    +485311
    +485347
    +485351
    +485363
    +485371
    +485383
    +485389
    +485411
    +485417
    +485423
    +485437
    +485447
    +485479
    +485497
    +485509
    +485519
    +485543
    +485567
    +485587
    +485593
    +485603
    +485609
    +485647
    +485657
    +485671
    +485689
    +485701
    +485717
    +485729
    +485731
    +485753
    +485777
    +485819
    +485827
    +485831
    +485833
    +485893
    +485899
    +485909
    +485923
    +485941
    +485959
    +485977
    +485993
    +486023
    +486037
    +486041
    +486043
    +486053
    +486061
    +486071
    +486091
    +486103
    +486119
    +486133
    +486139
    +486163
    +486179
    +486181
    +486193
    +486203
    +486221
    +486223
    +486247
    +486281
    +486293
    +486307
    +486313
    +486323
    +486329
    +486331
    +486341
    +486349
    +486377
    +486379
    +486389
    +486391
    +486397
    +486407
    +486433
    +486443
    +486449
    +486481
    +486491
    +486503
    +486509
    +486511
    +486527
    +486539
    +486559
    +486569
    +486583
    +486589
    +486601
    +486617
    +486637
    +486641
    +486643
    +486653
    +486667
    +486671
    +486677
    +486679
    +486683
    +486697
    +486713
    +486721
    +486757
    +486767
    +486769
    +486781
    +486797
    +486817
    +486821
    +486833
    +486839
    +486869
    +486907
    +486923
    +486929
    +486943
    +486947
    +486949
    +486971
    +486977
    +486991
    +487007
    +487013
    +487021
    +487049
    +487051
    +487057
    +487073
    +487079
    +487093
    +487099
    +487111
    +487133
    +487177
    +487183
    +487187
    +487211
    +487213
    +487219
    +487247
    +487261
    +487283
    +487303
    +487307
    +487313
    +487349
    +487363
    +487381
    +487387
    +487391
    +487397
    +487423
    +487427
    +487429
    +487447
    +487457
    +487463
    +487469
    +487471
    +487477
    +487481
    +487489
    +487507
    +487561
    +487589
    +487601
    +487603
    +487607
    +487637
    +487649
    +487651
    +487657
    +487681
    +487691
    +487703
    +487709
    +487717
    +487727
    +487733
    +487741
    +487757
    +487769
    +487783
    +487789
    +487793
    +487811
    +487819
    +487829
    +487831
    +487843
    +487873
    +487889
    +487891
    +487897
    +487933
    +487943
    +487973
    +487979
    +487997
    +488003
    +488009
    +488011
    +488021
    +488051
    +488057
    +488069
    +488119
    +488143
    +488149
    +488153
    +488161
    +488171
    +488197
    +488203
    +488207
    +488209
    +488227
    +488231
    +488233
    +488239
    +488249
    +488261
    +488263
    +488287
    +488303
    +488309
    +488311
    +488317
    +488321
    +488329
    +488333
    +488339
    +488347
    +488353
    +488381
    +488399
    +488401
    +488407
    +488417
    +488419
    +488441
    +488459
    +488473
    +488503
    +488513
    +488539
    +488567
    +488573
    +488603
    +488611
    +488617
    +488627
    +488633
    +488639
    +488641
    +488651
    +488687
    +488689
    +488701
    +488711
    +488717
    +488723
    +488729
    +488743
    +488749
    +488759
    +488779
    +488791
    +488797
    +488821
    +488827
    +488833
    +488861
    +488879
    +488893
    +488897
    +488909
    +488921
    +488947
    +488959
    +488981
    +488993
    +489001
    +489011
    +489019
    +489043
    +489053
    +489061
    +489101
    +489109
    +489113
    +489127
    +489133
    +489157
    +489161
    +489179
    +489191
    +489197
    +489217
    +489239
    +489241
    +489257
    +489263
    +489283
    +489299
    +489329
    +489337
    +489343
    +489361
    +489367
    +489389
    +489407
    +489409
    +489427
    +489431
    +489439
    +489449
    +489457
    +489479
    +489487
    +489493
    +489529
    +489539
    +489551
    +489553
    +489557
    +489571
    +489613
    +489631
    +489653
    +489659
    +489673
    +489677
    +489679
    +489689
    +489691
    +489733
    +489743
    +489761
    +489791
    +489793
    +489799
    +489803
    +489817
    +489823
    +489833
    +489847
    +489851
    +489869
    +489871
    +489887
    +489901
    +489911
    +489913
    +489941
    +489943
    +489959
    +489961
    +489977
    +489989
    +490001
    +490003
    +490019
    +490031
    +490033
    +490057
    +490097
    +490103
    +490111
    +490117
    +490121
    +490151
    +490159
    +490169
    +490183
    +490201
    +490207
    +490223
    +490241
    +490247
    +490249
    +490267
    +490271
    +490277
    +490283
    +490309
    +490313
    +490339
    +490367
    +490393
    +490417
    +490421
    +490453
    +490459
    +490463
    +490481
    +490493
    +490499
    +490519
    +490537
    +490541
    +490543
    +490549
    +490559
    +490571
    +490573
    +490577
    +490579
    +490591
    +490619
    +490627
    +490631
    +490643
    +490661
    +490663
    +490697
    +490733
    +490741
    +490769
    +490771
    +490783
    +490829
    +490837
    +490849
    +490859
    +490877
    +490891
    +490913
    +490921
    +490927
    +490937
    +490949
    +490951
    +490957
    +490967
    +490969
    +490991
    +490993
    +491003
    +491039
    +491041
    +491059
    +491081
    +491083
    +491129
    +491137
    +491149
    +491159
    +491167
    +491171
    +491201
    +491213
    +491219
    +491251
    +491261
    +491273
    +491279
    +491297
    +491299
    +491327
    +491329
    +491333
    +491339
    +491341
    +491353
    +491357
    +491371
    +491377
    +491417
    +491423
    +491429
    +491461
    +491483
    +491489
    +491497
    +491501
    +491503
    +491527
    +491531
    +491537
    +491539
    +491581
    +491591
    +491593
    +491611
    +491627
    +491633
    +491639
    +491651
    +491653
    +491669
    +491677
    +491707
    +491719
    +491731
    +491737
    +491747
    +491773
    +491783
    +491789
    +491797
    +491819
    +491833
    +491837
    +491851
    +491857
    +491867
    +491873
    +491899
    +491923
    +491951
    +491969
    +491977
    +491983
    +492007
    +492013
    +492017
    +492029
    +492047
    +492053
    +492059
    +492061
    +492067
    +492077
    +492083
    +492103
    +492113
    +492227
    +492251
    +492253
    +492257
    +492281
    +492293
    +492299
    +492319
    +492377
    +492389
    +492397
    +492403
    +492409
    +492413
    +492421
    +492431
    +492463
    +492467
    +492487
    +492491
    +492511
    +492523
    +492551
    +492563
    +492587
    +492601
    +492617
    +492619
    +492629
    +492631
    +492641
    +492647
    +492659
    +492671
    +492673
    +492707
    +492719
    +492721
    +492731
    +492757
    +492761
    +492763
    +492769
    +492781
    +492799
    +492839
    +492853
    +492871
    +492883
    +492893
    +492901
    +492911
    +492967
    +492979
    +493001
    +493013
    +493021
    +493027
    +493043
    +493049
    +493067
    +493093
    +493109
    +493111
    +493121
    +493123
    +493127
    +493133
    +493139
    +493147
    +493159
    +493169
    +493177
    +493193
    +493201
    +493211
    +493217
    +493219
    +493231
    +493243
    +493249
    +493277
    +493279
    +493291
    +493301
    +493313
    +493333
    +493351
    +493369
    +493393
    +493397
    +493399
    +493403
    +493433
    +493447
    +493457
    +493463
    +493481
    +493523
    +493531
    +493541
    +493567
    +493573
    +493579
    +493583
    +493607
    +493621
    +493627
    +493643
    +493657
    +493693
    +493709
    +493711
    +493721
    +493729
    +493733
    +493747
    +493777
    +493793
    +493807
    +493811
    +493813
    +493817
    +493853
    +493859
    +493873
    +493877
    +493897
    +493919
    +493931
    +493937
    +493939
    +493967
    +493973
    +493979
    +493993
    +494023
    +494029
    +494041
    +494051
    +494069
    +494077
    +494083
    +494093
    +494101
    +494107
    +494129
    +494141
    +494147
    +494167
    +494191
    +494213
    +494237
    +494251
    +494257
    +494267
    +494269
    +494281
    +494287
    +494317
    +494327
    +494341
    +494353
    +494359
    +494369
    +494381
    +494383
    +494387
    +494407
    +494413
    +494441
    +494443
    +494471
    +494497
    +494519
    +494521
    +494539
    +494561
    +494563
    +494567
    +494587
    +494591
    +494609
    +494617
    +494621
    +494639
    +494647
    +494651
    +494671
    +494677
    +494687
    +494693
    +494699
    +494713
    +494719
    +494723
    +494731
    +494737
    +494743
    +494749
    +494759
    +494761
    +494783
    +494789
    +494803
    +494843
    +494849
    +494873
    +494899
    +494903
    +494917
    +494927
    +494933
    +494939
    +494959
    +494987
    +495017
    +495037
    +495041
    +495043
    +495067
    +495071
    +495109
    +495113
    +495119
    +495133
    +495139
    +495149
    +495151
    +495161
    +495181
    +495199
    +495211
    +495221
    +495241
    +495269
    +495277
    +495289
    +495301
    +495307
    +495323
    +495337
    +495343
    +495347
    +495359
    +495361
    +495371
    +495377
    +495389
    +495401
    +495413
    +495421
    +495433
    +495437
    +495449
    +495457
    +495461
    +495491
    +495511
    +495527
    +495557
    +495559
    +495563
    +495569
    +495571
    +495587
    +495589
    +495611
    +495613
    +495617
    +495619
    +495629
    +495637
    +495647
    +495667
    +495679
    +495701
    +495707
    +495713
    +495749
    +495751
    +495757
    +495769
    +495773
    +495787
    +495791
    +495797
    +495799
    +495821
    +495827
    +495829
    +495851
    +495877
    +495893
    +495899
    +495923
    +495931
    +495947
    +495953
    +495959
    +495967
    +495973
    +495983
    +496007
    +496019
    +496039
    +496051
    +496063
    +496073
    +496079
    +496123
    +496127
    +496163
    +496187
    +496193
    +496211
    +496229
    +496231
    +496259
    +496283
    +496289
    +496291
    +496297
    +496303
    +496313
    +496333
    +496339
    +496343
    +496381
    +496399
    +496427
    +496439
    +496453
    +496459
    +496471
    +496477
    +496481
    +496487
    +496493
    +496499
    +496511
    +496549
    +496579
    +496583
    +496609
    +496631
    +496669
    +496681
    +496687
    +496703
    +496711
    +496733
    +496747
    +496763
    +496789
    +496813
    +496817
    +496841
    +496849
    +496871
    +496877
    +496889
    +496891
    +496897
    +496901
    +496913
    +496919
    +496949
    +496963
    +496997
    +496999
    +497011
    +497017
    +497041
    +497047
    +497051
    +497069
    +497093
    +497111
    +497113
    +497117
    +497137
    +497141
    +497153
    +497171
    +497177
    +497197
    +497239
    +497257
    +497261
    +497269
    +497279
    +497281
    +497291
    +497297
    +497303
    +497309
    +497323
    +497339
    +497351
    +497389
    +497411
    +497417
    +497423
    +497449
    +497461
    +497473
    +497479
    +497491
    +497501
    +497507
    +497509
    +497521
    +497537
    +497551
    +497557
    +497561
    +497579
    +497587
    +497597
    +497603
    +497633
    +497659
    +497663
    +497671
    +497677
    +497689
    +497701
    +497711
    +497719
    +497729
    +497737
    +497741
    +497771
    +497773
    +497801
    +497813
    +497831
    +497839
    +497851
    +497867
    +497869
    +497873
    +497899
    +497929
    +497957
    +497963
    +497969
    +497977
    +497989
    +497993
    +497999
    +498013
    +498053
    +498061
    +498073
    +498089
    +498101
    +498103
    +498119
    +498143
    +498163
    +498167
    +498181
    +498209
    +498227
    +498257
    +498259
    +498271
    +498301
    +498331
    +498343
    +498361
    +498367
    +498391
    +498397
    +498401
    +498403
    +498409
    +498439
    +498461
    +498467
    +498469
    +498493
    +498497
    +498521
    +498523
    +498527
    +498551
    +498557
    +498577
    +498583
    +498599
    +498611
    +498613
    +498643
    +498647
    +498653
    +498679
    +498689
    +498691
    +498733
    +498739
    +498749
    +498761
    +498767
    +498779
    +498781
    +498787
    +498791
    +498803
    +498833
    +498857
    +498859
    +498881
    +498907
    +498923
    +498931
    +498937
    +498947
    +498961
    +498973
    +498977
    +498989
    +499021
    +499027
    +499033
    +499039
    +499063
    +499067
    +499099
    +499117
    +499127
    +499129
    +499133
    +499139
    +499141
    +499151
    +499157
    +499159
    +499181
    +499183
    +499189
    +499211
    +499229
    +499253
    +499267
    +499277
    +499283
    +499309
    +499321
    +499327
    +499349
    +499361
    +499363
    +499391
    +499397
    +499403
    +499423
    +499439
    +499459
    +499481
    +499483
    +499493
    +499507
    +499519
    +499523
    +499549
    +499559
    +499571
    +499591
    +499601
    +499607
    +499621
    +499633
    +499637
    +499649
    +499661
    +499663
    +499669
    +499673
    +499679
    +499687
    +499691
    +499693
    +499711
    +499717
    +499729
    +499739
    +499747
    +499781
    +499787
    +499801
    +499819
    +499853
    +499879
    +499883
    +499897
    +499903
    +499927
    +499943
    +499957
    +499969
    +499973
    +499979
    +500009
    +500029
    +500041
    +500057
    +500069
    +500083
    +500107
    +500111
    +500113
    +500119
    +500153
    +500167
    +500173
    +500177
    +500179
    +500197
    +500209
    +500231
    +500233
    +500237
    +500239
    +500249
    +500257
    +500287
    +500299
    +500317
    +500321
    +500333
    +500341
    +500363
    +500369
    +500389
    +500393
    +500413
    +500417
    +500431
    +500443
    +500459
    +500471
    +500473
    +500483
    +500501
    +500509
    +500519
    +500527
    +500567
    +500579
    +500587
    +500603
    +500629
    +500671
    +500677
    +500693
    +500699
    +500713
    +500719
    +500723
    +500729
    +500741
    +500777
    +500791
    +500807
    +500809
    +500831
    +500839
    +500861
    +500873
    +500881
    +500887
    +500891
    +500909
    +500911
    +500921
    +500923
    +500933
    +500947
    +500953
    +500957
    +500977
    +501001
    +501013
    +501019
    +501029
    +501031
    +501037
    +501043
    +501077
    +501089
    +501103
    +501121
    +501131
    +501133
    +501139
    +501157
    +501173
    +501187
    +501191
    +501197
    +501203
    +501209
    +501217
    +501223
    +501229
    +501233
    +501257
    +501271
    +501287
    +501299
    +501317
    +501341
    +501343
    +501367
    +501383
    +501401
    +501409
    +501419
    +501427
    +501451
    +501463
    +501493
    +501503
    +501511
    +501563
    +501577
    +501593
    +501601
    +501617
    +501623
    +501637
    +501659
    +501691
    +501701
    +501703
    +501707
    +501719
    +501731
    +501769
    +501779
    +501803
    +501817
    +501821
    +501827
    +501829
    +501841
    +501863
    +501889
    +501911
    +501931
    +501947
    +501953
    +501967
    +501971
    +501997
    +502001
    +502013
    +502039
    +502043
    +502057
    +502063
    +502079
    +502081
    +502087
    +502093
    +502121
    +502133
    +502141
    +502171
    +502181
    +502217
    +502237
    +502247
    +502259
    +502261
    +502277
    +502301
    +502321
    +502339
    +502393
    +502409
    +502421
    +502429
    +502441
    +502451
    +502487
    +502499
    +502501
    +502507
    +502517
    +502543
    +502549
    +502553
    +502591
    +502597
    +502613
    +502631
    +502633
    +502643
    +502651
    +502669
    +502687
    +502699
    +502703
    +502717
    +502729
    +502769
    +502771
    +502781
    +502787
    +502807
    +502819
    +502829
    +502841
    +502847
    +502861
    +502883
    +502919
    +502921
    +502937
    +502961
    +502973
    +503003
    +503017
    +503039
    +503053
    +503077
    +503123
    +503131
    +503137
    +503147
    +503159
    +503197
    +503207
    +503213
    +503227
    +503231
    +503233
    +503249
    +503267
    +503287
    +503297
    +503303
    +503317
    +503339
    +503351
    +503359
    +503369
    +503381
    +503383
    +503389
    +503407
    +503413
    +503423
    +503431
    +503441
    +503453
    +503483
    +503501
    +503543
    +503549
    +503551
    +503563
    +503593
    +503599
    +503609
    +503611
    +503621
    +503623
    +503647
    +503653
    +503663
    +503707
    +503717
    +503743
    +503753
    +503771
    +503777
    +503779
    +503791
    +503803
    +503819
    +503821
    +503827
    +503851
    +503857
    +503869
    +503879
    +503911
    +503927
    +503929
    +503939
    +503947
    +503959
    +503963
    +503969
    +503983
    +503989
    +504001
    +504011
    +504017
    +504047
    +504061
    +504073
    +504103
    +504121
    +504139
    +504143
    +504149
    +504151
    +504157
    +504181
    +504187
    +504197
    +504209
    +504221
    +504247
    +504269
    +504289
    +504299
    +504307
    +504311
    +504323
    +504337
    +504349
    +504353
    +504359
    +504377
    +504379
    +504389
    +504403
    +504457
    +504461
    +504473
    +504479
    +504521
    +504523
    +504527
    +504547
    +504563
    +504593
    +504599
    +504607
    +504617
    +504619
    +504631
    +504661
    +504667
    +504671
    +504677
    +504683
    +504727
    +504767
    +504787
    +504797
    +504799
    +504817
    +504821
    +504851
    +504853
    +504857
    +504871
    +504877
    +504893
    +504901
    +504929
    +504937
    +504943
    +504947
    +504953
    +504967
    +504983
    +504989
    +504991
    +505027
    +505031
    +505033
    +505049
    +505051
    +505061
    +505067
    +505073
    +505091
    +505097
    +505111
    +505117
    +505123
    +505129
    +505139
    +505157
    +505159
    +505181
    +505187
    +505201
    +505213
    +505231
    +505237
    +505277
    +505279
    +505283
    +505301
    +505313
    +505319
    +505321
    +505327
    +505339
    +505357
    +505367
    +505369
    +505399
    +505409
    +505411
    +505429
    +505447
    +505459
    +505469
    +505481
    +505493
    +505501
    +505511
    +505513
    +505523
    +505537
    +505559
    +505573
    +505601
    +505607
    +505613
    +505619
    +505633
    +505639
    +505643
    +505657
    +505663
    +505669
    +505691
    +505693
    +505709
    +505711
    +505727
    +505759
    +505763
    +505777
    +505781
    +505811
    +505819
    +505823
    +505867
    +505871
    +505877
    +505907
    +505919
    +505927
    +505949
    +505961
    +505969
    +505979
    +506047
    +506071
    +506083
    +506101
    +506113
    +506119
    +506131
    +506147
    +506171
    +506173
    +506183
    +506201
    +506213
    +506251
    +506263
    +506269
    +506281
    +506291
    +506327
    +506329
    +506333
    +506339
    +506347
    +506351
    +506357
    +506381
    +506393
    +506417
    +506423
    +506449
    +506459
    +506461
    +506479
    +506491
    +506501
    +506507
    +506531
    +506533
    +506537
    +506551
    +506563
    +506573
    +506591
    +506593
    +506599
    +506609
    +506629
    +506647
    +506663
    +506683
    +506687
    +506689
    +506699
    +506729
    +506731
    +506743
    +506773
    +506783
    +506791
    +506797
    +506809
    +506837
    +506843
    +506861
    +506873
    +506887
    +506893
    +506899
    +506903
    +506911
    +506929
    +506941
    +506963
    +506983
    +506993
    +506999
    +507029
    +507049
    +507071
    +507077
    +507079
    +507103
    +507109
    +507113
    +507119
    +507137
    +507139
    +507149
    +507151
    +507163
    +507193
    +507197
    +507217
    +507289
    +507301
    +507313
    +507317
    +507329
    +507347
    +507349
    +507359
    +507361
    +507371
    +507383
    +507401
    +507421
    +507431
    +507461
    +507491
    +507497
    +507499
    +507503
    +507523
    +507557
    +507571
    +507589
    +507593
    +507599
    +507607
    +507631
    +507641
    +507667
    +507673
    +507691
    +507697
    +507713
    +507719
    +507743
    +507757
    +507779
    +507781
    +507797
    +507803
    +507809
    +507821
    +507827
    +507839
    +507883
    +507901
    +507907
    +507917
    +507919
    +507937
    +507953
    +507961
    +507971
    +507979
    +508009
    +508019
    +508021
    +508033
    +508037
    +508073
    +508087
    +508091
    +508097
    +508103
    +508129
    +508159
    +508171
    +508187
    +508213
    +508223
    +508229
    +508237
    +508243
    +508259
    +508271
    +508273
    +508297
    +508301
    +508327
    +508331
    +508349
    +508363
    +508367
    +508373
    +508393
    +508433
    +508439
    +508451
    +508471
    +508477
    +508489
    +508499
    +508513
    +508517
    +508531
    +508549
    +508559
    +508567
    +508577
    +508579
    +508583
    +508619
    +508621
    +508637
    +508643
    +508661
    +508693
    +508709
    +508727
    +508771
    +508789
    +508799
    +508811
    +508817
    +508841
    +508847
    +508867
    +508901
    +508903
    +508909
    +508913
    +508919
    +508931
    +508943
    +508951
    +508957
    +508961
    +508969
    +508973
    +508987
    +509023
    +509027
    +509053
    +509063
    +509071
    +509087
    +509101
    +509123
    +509137
    +509147
    +509149
    +509203
    +509221
    +509227
    +509239
    +509263
    +509281
    +509287
    +509293
    +509297
    +509317
    +509329
    +509359
    +509363
    +509389
    +509393
    +509413
    +509417
    +509429
    +509441
    +509449
    +509477
    +509513
    +509521
    +509543
    +509549
    +509557
    +509563
    +509569
    +509573
    +509581
    +509591
    +509603
    +509623
    +509633
    +509647
    +509653
    +509659
    +509681
    +509687
    +509689
    +509693
    +509699
    +509723
    +509731
    +509737
    +509741
    +509767
    +509783
    +509797
    +509801
    +509833
    +509837
    +509843
    +509863
    +509867
    +509879
    +509909
    +509911
    +509921
    +509939
    +509947
    +509959
    +509963
    +509989
    +510007
    +510031
    +510047
    +510049
    +510061
    +510067
    +510073
    +510077
    +510079
    +510089
    +510101
    +510121
    +510127
    +510137
    +510157
    +510179
    +510199
    +510203
    +510217
    +510227
    +510233
    +510241
    +510247
    +510253
    +510271
    +510287
    +510299
    +510311
    +510319
    +510331
    +510361
    +510379
    +510383
    +510401
    +510403
    +510449
    +510451
    +510457
    +510463
    +510481
    +510529
    +510551
    +510553
    +510569
    +510581
    +510583
    +510589
    +510611
    +510613
    +510617
    +510619
    +510677
    +510683
    +510691
    +510707
    +510709
    +510751
    +510767
    +510773
    +510793
    +510803
    +510817
    +510823
    +510827
    +510847
    +510889
    +510907
    +510919
    +510931
    +510941
    +510943
    +510989
    +511001
    +511013
    +511019
    +511033
    +511039
    +511057
    +511061
    +511087
    +511109
    +511111
    +511123
    +511151
    +511153
    +511163
    +511169
    +511171
    +511177
    +511193
    +511201
    +511211
    +511213
    +511223
    +511237
    +511243
    +511261
    +511279
    +511289
    +511297
    +511327
    +511333
    +511337
    +511351
    +511361
    +511387
    +511391
    +511409
    +511417
    +511439
    +511447
    +511453
    +511457
    +511463
    +511477
    +511487
    +511507
    +511519
    +511523
    +511541
    +511549
    +511559
    +511573
    +511579
    +511583
    +511591
    +511603
    +511627
    +511631
    +511633
    +511669
    +511691
    +511703
    +511711
    +511723
    +511757
    +511787
    +511793
    +511801
    +511811
    +511831
    +511843
    +511859
    +511867
    +511873
    +511891
    +511897
    +511909
    +511933
    +511939
    +511961
    +511963
    +511991
    +511997
    +512009
    +512011
    +512021
    +512047
    +512059
    +512093
    +512101
    +512137
    +512147
    +512167
    +512207
    +512249
    +512251
    +512269
    +512287
    +512311
    +512321
    +512333
    +512353
    +512389
    +512419
    +512429
    +512443
    +512467
    +512497
    +512503
    +512507
    +512521
    +512531
    +512537
    +512543
    +512569
    +512573
    +512579
    +512581
    +512591
    +512593
    +512597
    +512609
    +512621
    +512641
    +512657
    +512663
    +512671
    +512683
    +512711
    +512713
    +512717
    +512741
    +512747
    +512761
    +512767
    +512779
    +512797
    +512803
    +512819
    +512821
    +512843
    +512849
    +512891
    +512899
    +512903
    +512917
    +512921
    +512927
    +512929
    +512959
    +512977
    +512989
    +512999
    +513001
    +513013
    +513017
    +513031
    +513041
    +513047
    +513053
    +513059
    +513067
    +513083
    +513101
    +513103
    +513109
    +513131
    +513137
    +513157
    +513167
    +513169
    +513173
    +513203
    +513239
    +513257
    +513269
    +513277
    +513283
    +513307
    +513311
    +513313
    +513319
    +513341
    +513347
    +513353
    +513367
    +513371
    +513397
    +513407
    +513419
    +513427
    +513431
    +513439
    +513473
    +513479
    +513481
    +513509
    +513511
    +513529
    +513533
    +513593
    +513631
    +513641
    +513649
    +513673
    +513679
    +513683
    +513691
    +513697
    +513719
    +513727
    +513731
    +513739
    +513749
    +513761
    +513767
    +513769
    +513781
    +513829
    +513839
    +513841
    +513871
    +513881
    +513899
    +513917
    +513923
    +513937
    +513943
    +513977
    +513991
    +514001
    +514009
    +514013
    +514021
    +514049
    +514051
    +514057
    +514061
    +514079
    +514081
    +514093
    +514103
    +514117
    +514123
    +514127
    +514147
    +514177
    +514187
    +514201
    +514219
    +514229
    +514243
    +514247
    +514249
    +514271
    +514277
    +514289
    +514309
    +514313
    +514333
    +514343
    +514357
    +514361
    +514379
    +514399
    +514417
    +514429
    +514433
    +514453
    +514499
    +514513
    +514519
    +514523
    +514529
    +514531
    +514543
    +514561
    +514571
    +514621
    +514637
    +514639
    +514643
    +514649
    +514651
    +514669
    +514681
    +514711
    +514733
    +514739
    +514741
    +514747
    +514751
    +514757
    +514769
    +514783
    +514793
    +514819
    +514823
    +514831
    +514841
    +514847
    +514853
    +514859
    +514867
    +514873
    +514889
    +514903
    +514933
    +514939
    +514949
    +514967
    +515041
    +515087
    +515089
    +515111
    +515143
    +515149
    +515153
    +515173
    +515191
    +515227
    +515231
    +515233
    +515237
    +515279
    +515293
    +515311
    +515323
    +515351
    +515357
    +515369
    +515371
    +515377
    +515381
    +515401
    +515429
    +515477
    +515507
    +515519
    +515539
    +515563
    +515579
    +515587
    +515597
    +515611
    +515621
    +515639
    +515651
    +515653
    +515663
    +515677
    +515681
    +515687
    +515693
    +515701
    +515737
    +515741
    +515761
    +515771
    +515773
    +515777
    +515783
    +515803
    +515813
    +515839
    +515843
    +515857
    +515861
    +515873
    +515887
    +515917
    +515923
    +515929
    +515941
    +515951
    +515969
    +515993
    +516017
    +516023
    +516049
    +516053
    +516077
    +516091
    +516127
    +516151
    +516157
    +516161
    +516163
    +516169
    +516179
    +516193
    +516199
    +516209
    +516223
    +516227
    +516233
    +516247
    +516251
    +516253
    +516277
    +516283
    +516293
    +516319
    +516323
    +516349
    +516359
    +516361
    +516371
    +516377
    +516391
    +516407
    +516421
    +516431
    +516433
    +516437
    +516449
    +516457
    +516469
    +516493
    +516499
    +516517
    +516521
    +516539
    +516541
    +516563
    +516587
    +516589
    +516599
    +516611
    +516617
    +516619
    +516623
    +516643
    +516653
    +516673
    +516679
    +516689
    +516701
    +516709
    +516713
    +516721
    +516727
    +516757
    +516793
    +516811
    +516821
    +516829
    +516839
    +516847
    +516871
    +516877
    +516883
    +516907
    +516911
    +516931
    +516947
    +516949
    +516959
    +516973
    +516977
    +516979
    +516991
    +517003
    +517043
    +517061
    +517067
    +517073
    +517079
    +517081
    +517087
    +517091
    +517129
    +517151
    +517169
    +517177
    +517183
    +517189
    +517207
    +517211
    +517217
    +517229
    +517241
    +517243
    +517249
    +517261
    +517267
    +517277
    +517289
    +517303
    +517337
    +517343
    +517367
    +517373
    +517381
    +517393
    +517399
    +517403
    +517411
    +517417
    +517457
    +517459
    +517469
    +517471
    +517481
    +517487
    +517499
    +517501
    +517507
    +517511
    +517513
    +517547
    +517549
    +517553
    +517571
    +517577
    +517589
    +517597
    +517603
    +517609
    +517613
    +517619
    +517637
    +517639
    +517711
    +517717
    +517721
    +517729
    +517733
    +517739
    +517747
    +517817
    +517823
    +517831
    +517861
    +517873
    +517877
    +517901
    +517919
    +517927
    +517931
    +517949
    +517967
    +517981
    +517991
    +517999
    +518017
    +518047
    +518057
    +518059
    +518083
    +518099
    +518101
    +518113
    +518123
    +518129
    +518131
    +518137
    +518153
    +518159
    +518171
    +518179
    +518191
    +518207
    +518209
    +518233
    +518237
    +518239
    +518249
    +518261
    +518291
    +518299
    +518311
    +518327
    +518341
    +518387
    +518389
    +518411
    +518417
    +518429
    +518431
    +518447
    +518467
    +518471
    +518473
    +518509
    +518521
    +518533
    +518543
    +518579
    +518587
    +518597
    +518611
    +518621
    +518657
    +518689
    +518699
    +518717
    +518729
    +518737
    +518741
    +518743
    +518747
    +518759
    +518761
    +518767
    +518779
    +518801
    +518803
    +518807
    +518809
    +518813
    +518831
    +518863
    +518867
    +518893
    +518911
    +518933
    +518953
    +518981
    +518983
    +518989
    +519011
    +519031
    +519037
    +519067
    +519083
    +519089
    +519091
    +519097
    +519107
    +519119
    +519121
    +519131
    +519151
    +519161
    +519193
    +519217
    +519227
    +519229
    +519247
    +519257
    +519269
    +519283
    +519287
    +519301
    +519307
    +519349
    +519353
    +519359
    +519371
    +519373
    +519383
    +519391
    +519413
    +519427
    +519433
    +519457
    +519487
    +519499
    +519509
    +519521
    +519523
    +519527
    +519539
    +519551
    +519553
    +519577
    +519581
    +519587
    +519611
    +519619
    +519643
    +519647
    +519667
    +519683
    +519691
    +519703
    +519713
    +519733
    +519737
    +519769
    +519787
    +519793
    +519797
    +519803
    +519817
    +519863
    +519881
    +519889
    +519907
    +519917
    +519919
    +519923
    +519931
    +519943
    +519947
    +519971
    +519989
    +519997
    +520019
    +520021
    +520031
    +520043
    +520063
    +520067
    +520073
    +520103
    +520111
    +520123
    +520129
    +520151
    +520193
    +520213
    +520241
    +520279
    +520291
    +520297
    +520307
    +520309
    +520313
    +520339
    +520349
    +520357
    +520361
    +520363
    +520369
    +520379
    +520381
    +520393
    +520409
    +520411
    +520423
    +520427
    +520433
    +520447
    +520451
    +520529
    +520547
    +520549
    +520567
    +520571
    +520589
    +520607
    +520609
    +520621
    +520631
    +520633
    +520649
    +520679
    +520691
    +520699
    +520703
    +520717
    +520721
    +520747
    +520759
    +520763
    +520787
    +520813
    +520837
    +520841
    +520853
    +520867
    +520889
    +520913
    +520921
    +520943
    +520957
    +520963
    +520967
    +520969
    +520981
    +521009
    +521021
    +521023
    +521039
    +521041
    +521047
    +521051
    +521063
    +521107
    +521119
    +521137
    +521153
    +521161
    +521167
    +521173
    +521177
    +521179
    +521201
    +521231
    +521243
    +521251
    +521267
    +521281
    +521299
    +521309
    +521317
    +521329
    +521357
    +521359
    +521363
    +521369
    +521377
    +521393
    +521399
    +521401
    +521429
    +521447
    +521471
    +521483
    +521491
    +521497
    +521503
    +521519
    +521527
    +521533
    +521537
    +521539
    +521551
    +521557
    +521567
    +521581
    +521603
    +521641
    +521657
    +521659
    +521669
    +521671
    +521693
    +521707
    +521723
    +521743
    +521749
    +521753
    +521767
    +521777
    +521789
    +521791
    +521809
    +521813
    +521819
    +521831
    +521861
    +521869
    +521879
    +521881
    +521887
    +521897
    +521903
    +521923
    +521929
    +521981
    +521993
    +521999
    +522017
    +522037
    +522047
    +522059
    +522061
    +522073
    +522079
    +522083
    +522113
    +522127
    +522157
    +522161
    +522167
    +522191
    +522199
    +522211
    +522227
    +522229
    +522233
    +522239
    +522251
    +522259
    +522281
    +522283
    +522289
    +522317
    +522323
    +522337
    +522371
    +522373
    +522383
    +522391
    +522409
    +522413
    +522439
    +522449
    +522469
    +522479
    +522497
    +522517
    +522521
    +522523
    +522541
    +522553
    +522569
    +522601
    +522623
    +522637
    +522659
    +522661
    +522673
    +522677
    +522679
    +522689
    +522703
    +522707
    +522719
    +522737
    +522749
    +522757
    +522761
    +522763
    +522787
    +522811
    +522827
    +522829
    +522839
    +522853
    +522857
    +522871
    +522881
    +522883
    +522887
    +522919
    +522943
    +522947
    +522959
    +522961
    +522989
    +523007
    +523021
    +523031
    +523049
    +523093
    +523097
    +523109
    +523129
    +523169
    +523177
    +523207
    +523213
    +523219
    +523261
    +523297
    +523307
    +523333
    +523349
    +523351
    +523357
    +523387
    +523403
    +523417
    +523427
    +523433
    +523459
    +523463
    +523487
    +523489
    +523493
    +523511
    +523519
    +523541
    +523543
    +523553
    +523571
    +523573
    +523577
    +523597
    +523603
    +523631
    +523637
    +523639
    +523657
    +523667
    +523669
    +523673
    +523681
    +523717
    +523729
    +523741
    +523759
    +523763
    +523771
    +523777
    +523793
    +523801
    +523829
    +523847
    +523867
    +523877
    +523903
    +523907
    +523927
    +523937
    +523949
    +523969
    +523987
    +523997
    +524047
    +524053
    +524057
    +524063
    +524071
    +524081
    +524087
    +524099
    +524113
    +524119
    +524123
    +524149
    +524171
    +524189
    +524197
    +524201
    +524203
    +524219
    +524221
    +524231
    +524243
    +524257
    +524261
    +524269
    +524287
    +524309
    +524341
    +524347
    +524351
    +524353
    +524369
    +524387
    +524389
    +524411
    +524413
    +524429
    +524453
    +524497
    +524507
    +524509
    +524519
    +524521
    +524591
    +524593
    +524599
    +524633
    +524669
    +524681
    +524683
    +524701
    +524707
    +524731
    +524743
    +524789
    +524801
    +524803
    +524827
    +524831
    +524857
    +524863
    +524869
    +524873
    +524893
    +524899
    +524921
    +524933
    +524939
    +524941
    +524947
    +524957
    +524959
    +524963
    +524969
    +524971
    +524981
    +524983
    +524999
    +525001
    +525013
    +525017
    +525029
    +525043
    +525101
    +525127
    +525137
    +525143
    +525157
    +525163
    +525167
    +525191
    +525193
    +525199
    +525209
    +525221
    +525241
    +525247
    +525253
    +525257
    +525299
    +525313
    +525353
    +525359
    +525361
    +525373
    +525377
    +525379
    +525391
    +525397
    +525409
    +525431
    +525433
    +525439
    +525457
    +525461
    +525467
    +525491
    +525493
    +525517
    +525529
    +525533
    +525541
    +525571
    +525583
    +525593
    +525599
    +525607
    +525641
    +525649
    +525671
    +525677
    +525697
    +525709
    +525713
    +525719
    +525727
    +525731
    +525739
    +525769
    +525773
    +525781
    +525809
    +525817
    +525839
    +525869
    +525871
    +525887
    +525893
    +525913
    +525923
    +525937
    +525947
    +525949
    +525953
    +525961
    +525979
    +525983
    +526027
    +526037
    +526049
    +526051
    +526063
    +526067
    +526069
    +526073
    +526087
    +526117
    +526121
    +526139
    +526157
    +526159
    +526189
    +526193
    +526199
    +526213
    +526223
    +526231
    +526249
    +526271
    +526283
    +526289
    +526291
    +526297
    +526307
    +526367
    +526373
    +526381
    +526387
    +526391
    +526397
    +526423
    +526429
    +526441
    +526453
    +526459
    +526483
    +526499
    +526501
    +526511
    +526531
    +526543
    +526571
    +526573
    +526583
    +526601
    +526619
    +526627
    +526633
    +526637
    +526649
    +526651
    +526657
    +526667
    +526679
    +526681
    +526703
    +526709
    +526717
    +526733
    +526739
    +526741
    +526759
    +526763
    +526777
    +526781
    +526829
    +526831
    +526837
    +526853
    +526859
    +526871
    +526909
    +526913
    +526931
    +526937
    +526943
    +526951
    +526957
    +526963
    +526993
    +526997
    +527053
    +527057
    +527063
    +527069
    +527071
    +527081
    +527099
    +527123
    +527129
    +527143
    +527159
    +527161
    +527173
    +527179
    +527203
    +527207
    +527209
    +527237
    +527251
    +527273
    +527281
    +527291
    +527327
    +527333
    +527347
    +527353
    +527377
    +527381
    +527393
    +527399
    +527407
    +527411
    +527419
    +527441
    +527447
    +527453
    +527489
    +527507
    +527533
    +527557
    +527563
    +527581
    +527591
    +527599
    +527603
    +527623
    +527627
    +527633
    +527671
    +527699
    +527701
    +527729
    +527741
    +527749
    +527753
    +527789
    +527803
    +527809
    +527819
    +527843
    +527851
    +527869
    +527881
    +527897
    +527909
    +527921
    +527929
    +527941
    +527981
    +527983
    +527987
    +527993
    +528001
    +528013
    +528041
    +528043
    +528053
    +528091
    +528097
    +528107
    +528127
    +528131
    +528137
    +528163
    +528167
    +528191
    +528197
    +528217
    +528223
    +528247
    +528263
    +528289
    +528299
    +528313
    +528317
    +528329
    +528373
    +528383
    +528391
    +528401
    +528403
    +528413
    +528419
    +528433
    +528469
    +528487
    +528491
    +528509
    +528511
    +528527
    +528559
    +528611
    +528623
    +528629
    +528631
    +528659
    +528667
    +528673
    +528679
    +528691
    +528707
    +528709
    +528719
    +528763
    +528779
    +528791
    +528799
    +528811
    +528821
    +528823
    +528833
    +528863
    +528877
    +528881
    +528883
    +528911
    +528929
    +528947
    +528967
    +528971
    +528973
    +528991
    +529003
    +529007
    +529027
    +529033
    +529037
    +529043
    +529049
    +529051
    +529097
    +529103
    +529117
    +529121
    +529127
    +529129
    +529153
    +529157
    +529181
    +529183
    +529213
    +529229
    +529237
    +529241
    +529259
    +529271
    +529273
    +529301
    +529307
    +529313
    +529327
    +529343
    +529349
    +529357
    +529381
    +529393
    +529411
    +529421
    +529423
    +529471
    +529489
    +529513
    +529517
    +529519
    +529531
    +529547
    +529577
    +529579
    +529603
    +529619
    +529637
    +529649
    +529657
    +529673
    +529681
    +529687
    +529691
    +529693
    +529709
    +529723
    +529741
    +529747
    +529751
    +529807
    +529811
    +529813
    +529819
    +529829
    +529847
    +529871
    +529927
    +529933
    +529939
    +529957
    +529961
    +529973
    +529979
    +529981
    +529987
    +529999
    +530017
    +530021
    +530027
    +530041
    +530051
    +530063
    +530087
    +530093
    +530129
    +530137
    +530143
    +530177
    +530183
    +530197
    +530203
    +530209
    +530227
    +530237
    +530249
    +530251
    +530261
    +530267
    +530279
    +530293
    +530297
    +530303
    +530329
    +530333
    +530339
    +530353
    +530359
    +530389
    +530393
    +530401
    +530429
    +530443
    +530447
    +530501
    +530507
    +530513
    +530527
    +530531
    +530533
    +530539
    +530549
    +530567
    +530597
    +530599
    +530603
    +530609
    +530641
    +530653
    +530659
    +530669
    +530693
    +530701
    +530711
    +530713
    +530731
    +530741
    +530743
    +530753
    +530767
    +530773
    +530797
    +530807
    +530833
    +530837
    +530843
    +530851
    +530857
    +530861
    +530869
    +530897
    +530911
    +530947
    +530969
    +530977
    +530983
    +530989
    +531017
    +531023
    +531043
    +531071
    +531079
    +531101
    +531103
    +531121
    +531133
    +531143
    +531163
    +531169
    +531173
    +531197
    +531203
    +531229
    +531239
    +531253
    +531263
    +531281
    +531287
    +531299
    +531331
    +531337
    +531343
    +531347
    +531353
    +531359
    +531383
    +531457
    +531481
    +531497
    +531521
    +531547
    +531551
    +531569
    +531571
    +531581
    +531589
    +531611
    +531613
    +531623
    +531631
    +531637
    +531667
    +531673
    +531689
    +531701
    +531731
    +531793
    +531799
    +531821
    +531823
    +531827
    +531833
    +531841
    +531847
    +531857
    +531863
    +531871
    +531877
    +531901
    +531911
    +531919
    +531977
    +531983
    +531989
    +531997
    +532001
    +532009
    +532027
    +532033
    +532061
    +532069
    +532093
    +532099
    +532141
    +532153
    +532159
    +532163
    +532183
    +532187
    +532193
    +532199
    +532241
    +532249
    +532261
    +532267
    +532277
    +532283
    +532307
    +532313
    +532327
    +532331
    +532333
    +532349
    +532373
    +532379
    +532391
    +532403
    +532417
    +532421
    +532439
    +532447
    +532451
    +532453
    +532489
    +532501
    +532523
    +532529
    +532531
    +532537
    +532547
    +532561
    +532601
    +532603
    +532607
    +532619
    +532621
    +532633
    +532639
    +532663
    +532669
    +532687
    +532691
    +532709
    +532733
    +532739
    +532751
    +532757
    +532771
    +532781
    +532783
    +532789
    +532801
    +532811
    +532823
    +532849
    +532853
    +532867
    +532907
    +532919
    +532949
    +532951
    +532981
    +532993
    +532999
    +533003
    +533009
    +533011
    +533033
    +533051
    +533053
    +533063
    +533077
    +533089
    +533111
    +533129
    +533149
    +533167
    +533177
    +533189
    +533191
    +533213
    +533219
    +533227
    +533237
    +533249
    +533257
    +533261
    +533263
    +533297
    +533303
    +533317
    +533321
    +533327
    +533353
    +533363
    +533371
    +533389
    +533399
    +533413
    +533447
    +533453
    +533459
    +533509
    +533543
    +533549
    +533573
    +533581
    +533593
    +533633
    +533641
    +533671
    +533693
    +533711
    +533713
    +533719
    +533723
    +533737
    +533747
    +533777
    +533801
    +533809
    +533821
    +533831
    +533837
    +533857
    +533879
    +533887
    +533893
    +533909
    +533921
    +533927
    +533959
    +533963
    +533969
    +533971
    +533989
    +533993
    +533999
    +534007
    +534013
    +534019
    +534029
    +534043
    +534047
    +534049
    +534059
    +534073
    +534077
    +534091
    +534101
    +534113
    +534137
    +534167
    +534173
    +534199
    +534203
    +534211
    +534229
    +534241
    +534253
    +534283
    +534301
    +534307
    +534311
    +534323
    +534329
    +534341
    +534367
    +534371
    +534403
    +534407
    +534431
    +534439
    +534473
    +534491
    +534511
    +534529
    +534553
    +534571
    +534577
    +534581
    +534601
    +534607
    +534617
    +534629
    +534631
    +534637
    +534647
    +534649
    +534659
    +534661
    +534671
    +534697
    +534707
    +534739
    +534799
    +534811
    +534827
    +534839
    +534841
    +534851
    +534857
    +534883
    +534889
    +534913
    +534923
    +534931
    +534943
    +534949
    +534971
    +535013
    +535019
    +535033
    +535037
    +535061
    +535099
    +535103
    +535123
    +535133
    +535151
    +535159
    +535169
    +535181
    +535193
    +535207
    +535219
    +535229
    +535237
    +535243
    +535273
    +535303
    +535319
    +535333
    +535349
    +535351
    +535361
    +535387
    +535391
    +535399
    +535481
    +535487
    +535489
    +535499
    +535511
    +535523
    +535529
    +535547
    +535571
    +535573
    +535589
    +535607
    +535609
    +535627
    +535637
    +535663
    +535669
    +535673
    +535679
    +535697
    +535709
    +535727
    +535741
    +535751
    +535757
    +535771
    +535783
    +535793
    +535811
    +535849
    +535859
    +535861
    +535879
    +535919
    +535937
    +535939
    +535943
    +535957
    +535967
    +535973
    +535991
    +535999
    +536017
    +536023
    +536051
    +536057
    +536059
    +536069
    +536087
    +536099
    +536101
    +536111
    +536141
    +536147
    +536149
    +536189
    +536191
    +536203
    +536213
    +536219
    +536227
    +536233
    +536243
    +536267
    +536273
    +536279
    +536281
    +536287
    +536293
    +536311
    +536323
    +536353
    +536357
    +536377
    +536399
    +536407
    +536423
    +536441
    +536443
    +536447
    +536449
    +536453
    +536461
    +536467
    +536479
    +536491
    +536509
    +536513
    +536531
    +536533
    +536561
    +536563
    +536593
    +536609
    +536621
    +536633
    +536651
    +536671
    +536677
    +536687
    +536699
    +536717
    +536719
    +536729
    +536743
    +536749
    +536771
    +536773
    +536777
    +536779
    +536791
    +536801
    +536803
    +536839
    +536849
    +536857
    +536867
    +536869
    +536891
    +536909
    +536917
    +536923
    +536929
    +536933
    +536947
    +536953
    +536971
    +536989
    +536999
    +537001
    +537007
    +537011
    +537023
    +537029
    +537037
    +537041
    +537067
    +537071
    +537079
    +537091
    +537127
    +537133
    +537143
    +537157
    +537169
    +537181
    +537191
    +537197
    +537221
    +537233
    +537241
    +537269
    +537281
    +537287
    +537307
    +537331
    +537343
    +537347
    +537373
    +537379
    +537401
    +537403
    +537413
    +537497
    +537527
    +537547
    +537569
    +537583
    +537587
    +537599
    +537611
    +537637
    +537661
    +537673
    +537679
    +537703
    +537709
    +537739
    +537743
    +537749
    +537769
    +537773
    +537781
    +537787
    +537793
    +537811
    +537841
    +537847
    +537853
    +537877
    +537883
    +537899
    +537913
    +537919
    +537941
    +537991
    +538001
    +538019
    +538049
    +538051
    +538073
    +538079
    +538093
    +538117
    +538121
    +538123
    +538127
    +538147
    +538151
    +538157
    +538159
    +538163
    +538199
    +538201
    +538247
    +538249
    +538259
    +538267
    +538283
    +538297
    +538301
    +538303
    +538309
    +538331
    +538333
    +538357
    +538367
    +538397
    +538399
    +538411
    +538423
    +538457
    +538471
    +538481
    +538487
    +538511
    +538513
    +538519
    +538523
    +538529
    +538553
    +538561
    +538567
    +538579
    +538589
    +538597
    +538621
    +538649
    +538651
    +538697
    +538709
    +538711
    +538721
    +538723
    +538739
    +538751
    +538763
    +538771
    +538777
    +538789
    +538799
    +538801
    +538817
    +538823
    +538829
    +538841
    +538871
    +538877
    +538921
    +538927
    +538931
    +538939
    +538943
    +538987
    +539003
    +539009
    +539039
    +539047
    +539089
    +539093
    +539101
    +539107
    +539111
    +539113
    +539129
    +539141
    +539153
    +539159
    +539167
    +539171
    +539207
    +539219
    +539233
    +539237
    +539261
    +539267
    +539269
    +539293
    +539303
    +539309
    +539311
    +539321
    +539323
    +539339
    +539347
    +539351
    +539389
    +539401
    +539447
    +539449
    +539479
    +539501
    +539503
    +539507
    +539509
    +539533
    +539573
    +539621
    +539629
    +539633
    +539639
    +539641
    +539653
    +539663
    +539677
    +539687
    +539711
    +539713
    +539723
    +539729
    +539743
    +539761
    +539783
    +539797
    +539837
    +539839
    +539843
    +539849
    +539863
    +539881
    +539897
    +539899
    +539921
    +539947
    +539993
    +540041
    +540061
    +540079
    +540101
    +540119
    +540121
    +540139
    +540149
    +540157
    +540167
    +540173
    +540179
    +540181
    +540187
    +540203
    +540217
    +540233
    +540251
    +540269
    +540271
    +540283
    +540301
    +540307
    +540343
    +540347
    +540349
    +540367
    +540373
    +540377
    +540383
    +540389
    +540391
    +540433
    +540437
    +540461
    +540469
    +540509
    +540511
    +540517
    +540539
    +540541
    +540557
    +540559
    +540577
    +540587
    +540599
    +540611
    +540613
    +540619
    +540629
    +540677
    +540679
    +540689
    +540691
    +540697
    +540703
    +540713
    +540751
    +540769
    +540773
    +540779
    +540781
    +540803
    +540809
    +540823
    +540851
    +540863
    +540871
    +540877
    +540901
    +540907
    +540961
    +540989
    +541001
    +541007
    +541027
    +541049
    +541061
    +541087
    +541097
    +541129
    +541133
    +541141
    +541153
    +541181
    +541193
    +541201
    +541217
    +541231
    +541237
    +541249
    +541267
    +541271
    +541283
    +541301
    +541309
    +541339
    +541349
    +541361
    +541363
    +541369
    +541381
    +541391
    +541417
    +541439
    +541447
    +541469
    +541483
    +541507
    +541511
    +541523
    +541529
    +541531
    +541537
    +541543
    +541547
    +541549
    +541571
    +541577
    +541579
    +541589
    +541613
    +541631
    +541657
    +541661
    +541669
    +541693
    +541699
    +541711
    +541721
    +541727
    +541759
    +541763
    +541771
    +541777
    +541781
    +541799
    +541817
    +541831
    +541837
    +541859
    +541889
    +541901
    +541927
    +541951
    +541967
    +541987
    +541991
    +541993
    +541999
    +542021
    +542023
    +542027
    +542053
    +542063
    +542071
    +542081
    +542083
    +542093
    +542111
    +542117
    +542119
    +542123
    +542131
    +542141
    +542149
    +542153
    +542167
    +542183
    +542189
    +542197
    +542207
    +542219
    +542237
    +542251
    +542261
    +542263
    +542281
    +542293
    +542299
    +542323
    +542371
    +542401
    +542441
    +542447
    +542461
    +542467
    +542483
    +542489
    +542497
    +542519
    +542533
    +542537
    +542539
    +542551
    +542557
    +542567
    +542579
    +542587
    +542599
    +542603
    +542683
    +542687
    +542693
    +542713
    +542719
    +542723
    +542747
    +542761
    +542771
    +542783
    +542791
    +542797
    +542821
    +542831
    +542837
    +542873
    +542891
    +542911
    +542921
    +542923
    +542933
    +542939
    +542947
    +542951
    +542981
    +542987
    +542999
    +543017
    +543019
    +543029
    +543061
    +543097
    +543113
    +543131
    +543139
    +543143
    +543149
    +543157
    +543161
    +543163
    +543187
    +543203
    +543217
    +543223
    +543227
    +543233
    +543241
    +543253
    +543259
    +543281
    +543287
    +543289
    +543299
    +543307
    +543311
    +543313
    +543341
    +543349
    +543353
    +543359
    +543379
    +543383
    +543407
    +543427
    +543463
    +543497
    +543503
    +543509
    +543539
    +543551
    +543553
    +543593
    +543601
    +543607
    +543611
    +543617
    +543637
    +543659
    +543661
    +543671
    +543679
    +543689
    +543703
    +543707
    +543713
    +543769
    +543773
    +543787
    +543791
    +543793
    +543797
    +543811
    +543827
    +543841
    +543853
    +543857
    +543859
    +543871
    +543877
    +543883
    +543887
    +543889
    +543901
    +543911
    +543929
    +543967
    +543971
    +543997
    +544001
    +544007
    +544009
    +544013
    +544021
    +544031
    +544097
    +544099
    +544109
    +544123
    +544129
    +544133
    +544139
    +544171
    +544177
    +544183
    +544199
    +544223
    +544259
    +544273
    +544277
    +544279
    +544367
    +544373
    +544399
    +544403
    +544429
    +544451
    +544471
    +544477
    +544487
    +544501
    +544513
    +544517
    +544543
    +544549
    +544601
    +544613
    +544627
    +544631
    +544651
    +544667
    +544699
    +544717
    +544721
    +544723
    +544727
    +544757
    +544759
    +544771
    +544781
    +544793
    +544807
    +544813
    +544837
    +544861
    +544877
    +544879
    +544883
    +544889
    +544897
    +544903
    +544919
    +544927
    +544937
    +544961
    +544963
    +544979
    +545023
    +545029
    +545033
    +545057
    +545063
    +545087
    +545089
    +545093
    +545117
    +545131
    +545141
    +545143
    +545161
    +545189
    +545203
    +545213
    +545231
    +545239
    +545257
    +545267
    +545291
    +545329
    +545371
    +545387
    +545429
    +545437
    +545443
    +545449
    +545473
    +545477
    +545483
    +545497
    +545521
    +545527
    +545533
    +545543
    +545549
    +545551
    +545579
    +545599
    +545609
    +545617
    +545621
    +545641
    +545647
    +545651
    +545663
    +545711
    +545723
    +545731
    +545747
    +545749
    +545759
    +545773
    +545789
    +545791
    +545827
    +545843
    +545863
    +545873
    +545893
    +545899
    +545911
    +545917
    +545929
    +545933
    +545939
    +545947
    +545959
    +546001
    +546017
    +546019
    +546031
    +546047
    +546053
    +546067
    +546071
    +546097
    +546101
    +546103
    +546109
    +546137
    +546149
    +546151
    +546173
    +546179
    +546197
    +546211
    +546233
    +546239
    +546241
    +546253
    +546263
    +546283
    +546289
    +546317
    +546323
    +546341
    +546349
    +546353
    +546361
    +546367
    +546373
    +546391
    +546461
    +546467
    +546479
    +546509
    +546523
    +546547
    +546569
    +546583
    +546587
    +546599
    +546613
    +546617
    +546619
    +546631
    +546643
    +546661
    +546671
    +546677
    +546683
    +546691
    +546709
    +546719
    +546731
    +546739
    +546781
    +546841
    +546859
    +546863
    +546869
    +546881
    +546893
    +546919
    +546937
    +546943
    +546947
    +546961
    +546967
    +546977
    +547007
    +547021
    +547037
    +547061
    +547087
    +547093
    +547097
    +547103
    +547121
    +547133
    +547139
    +547171
    +547223
    +547229
    +547237
    +547241
    +547249
    +547271
    +547273
    +547291
    +547301
    +547321
    +547357
    +547361
    +547363
    +547369
    +547373
    +547387
    +547397
    +547399
    +547411
    +547441
    +547453
    +547471
    +547483
    +547487
    +547493
    +547499
    +547501
    +547513
    +547529
    +547537
    +547559
    +547567
    +547577
    +547583
    +547601
    +547609
    +547619
    +547627
    +547639
    +547643
    +547661
    +547663
    +547681
    +547709
    +547727
    +547741
    +547747
    +547753
    +547763
    +547769
    +547787
    +547817
    +547819
    +547823
    +547831
    +547849
    +547853
    +547871
    +547889
    +547901
    +547909
    +547951
    +547957
    +547999
    +548003
    +548039
    +548059
    +548069
    +548083
    +548089
    +548099
    +548117
    +548123
    +548143
    +548153
    +548189
    +548201
    +548213
    +548221
    +548227
    +548239
    +548243
    +548263
    +548291
    +548309
    +548323
    +548347
    +548351
    +548363
    +548371
    +548393
    +548399
    +548407
    +548417
    +548423
    +548441
    +548453
    +548459
    +548461
    +548489
    +548501
    +548503
    +548519
    +548521
    +548533
    +548543
    +548557
    +548567
    +548579
    +548591
    +548623
    +548629
    +548657
    +548671
    +548677
    +548687
    +548693
    +548707
    +548719
    +548749
    +548753
    +548761
    +548771
    +548783
    +548791
    +548827
    +548831
    +548833
    +548837
    +548843
    +548851
    +548861
    +548869
    +548893
    +548897
    +548903
    +548909
    +548927
    +548953
    +548957
    +548963
    +549001
    +549011
    +549013
    +549019
    +549023
    +549037
    +549071
    +549089
    +549091
    +549097
    +549121
    +549139
    +549149
    +549161
    +549163
    +549167
    +549169
    +549193
    +549203
    +549221
    +549229
    +549247
    +549257
    +549259
    +549281
    +549313
    +549319
    +549323
    +549331
    +549379
    +549391
    +549403
    +549421
    +549431
    +549443
    +549449
    +549481
    +549503
    +549509
    +549511
    +549517
    +549533
    +549547
    +549551
    +549553
    +549569
    +549587
    +549589
    +549607
    +549623
    +549641
    +549643
    +549649
    +549667
    +549683
    +549691
    +549701
    +549707
    +549713
    +549719
    +549733
    +549737
    +549739
    +549749
    +549751
    +549767
    +549817
    +549833
    +549839
    +549863
    +549877
    +549883
    +549911
    +549937
    +549943
    +549949
    +549977
    +549979
    +550007
    +550009
    +550027
    +550049
    +550061
    +550063
    +550073
    +550111
    +550117
    +550127
    +550129
    +550139
    +550163
    +550169
    +550177
    +550181
    +550189
    +550211
    +550213
    +550241
    +550267
    +550279
    +550283
    +550289
    +550309
    +550337
    +550351
    +550369
    +550379
    +550427
    +550439
    +550441
    +550447
    +550457
    +550469
    +550471
    +550489
    +550513
    +550519
    +550531
    +550541
    +550553
    +550577
    +550607
    +550609
    +550621
    +550631
    +550637
    +550651
    +550657
    +550661
    +550663
    +550679
    +550691
    +550703
    +550717
    +550721
    +550733
    +550757
    +550763
    +550789
    +550801
    +550811
    +550813
    +550831
    +550841
    +550843
    +550859
    +550861
    +550903
    +550909
    +550937
    +550939
    +550951
    +550961
    +550969
    +550973
    +550993
    +550997
    +551003
    +551017
    +551027
    +551039
    +551059
    +551063
    +551069
    +551093
    +551099
    +551107
    +551113
    +551129
    +551143
    +551179
    +551197
    +551207
    +551219
    +551231
    +551233
    +551269
    +551281
    +551297
    +551311
    +551321
    +551339
    +551347
    +551363
    +551381
    +551387
    +551407
    +551423
    +551443
    +551461
    +551483
    +551489
    +551503
    +551519
    +551539
    +551543
    +551549
    +551557
    +551569
    +551581
    +551587
    +551597
    +551651
    +551653
    +551659
    +551671
    +551689
    +551693
    +551713
    +551717
    +551723
    +551729
    +551731
    +551743
    +551753
    +551767
    +551773
    +551801
    +551809
    +551813
    +551843
    +551849
    +551861
    +551909
    +551911
    +551917
    +551927
    +551933
    +551951
    +551959
    +551963
    +551981
    +552001
    +552011
    +552029
    +552031
    +552047
    +552053
    +552059
    +552089
    +552091
    +552103
    +552107
    +552113
    +552127
    +552137
    +552179
    +552193
    +552217
    +552239
    +552241
    +552259
    +552263
    +552271
    +552283
    +552301
    +552317
    +552341
    +552353
    +552379
    +552397
    +552401
    +552403
    +552469
    +552473
    +552481
    +552491
    +552493
    +552511
    +552523
    +552527
    +552553
    +552581
    +552583
    +552589
    +552611
    +552649
    +552659
    +552677
    +552703
    +552707
    +552709
    +552731
    +552749
    +552751
    +552757
    +552787
    +552791
    +552793
    +552809
    +552821
    +552833
    +552841
    +552847
    +552859
    +552883
    +552887
    +552899
    +552913
    +552917
    +552971
    +552983
    +552991
    +553013
    +553037
    +553043
    +553051
    +553057
    +553067
    +553073
    +553093
    +553097
    +553099
    +553103
    +553123
    +553139
    +553141
    +553153
    +553171
    +553181
    +553193
    +553207
    +553211
    +553229
    +553249
    +553253
    +553277
    +553279
    +553309
    +553351
    +553363
    +553369
    +553411
    +553417
    +553433
    +553439
    +553447
    +553457
    +553463
    +553471
    +553481
    +553507
    +553513
    +553517
    +553529
    +553543
    +553549
    +553561
    +553573
    +553583
    +553589
    +553591
    +553601
    +553607
    +553627
    +553643
    +553649
    +553667
    +553681
    +553687
    +553699
    +553703
    +553727
    +553733
    +553747
    +553757
    +553759
    +553769
    +553789
    +553811
    +553837
    +553849
    +553867
    +553873
    +553897
    +553901
    +553919
    +553921
    +553933
    +553961
    +553963
    +553981
    +553991
    +554003
    +554011
    +554017
    +554051
    +554077
    +554087
    +554089
    +554117
    +554123
    +554129
    +554137
    +554167
    +554171
    +554179
    +554189
    +554207
    +554209
    +554233
    +554237
    +554263
    +554269
    +554293
    +554299
    +554303
    +554317
    +554347
    +554377
    +554383
    +554417
    +554419
    +554431
    +554447
    +554453
    +554467
    +554503
    +554527
    +554531
    +554569
    +554573
    +554597
    +554611
    +554627
    +554633
    +554639
    +554641
    +554663
    +554669
    +554677
    +554699
    +554707
    +554711
    +554731
    +554747
    +554753
    +554759
    +554767
    +554779
    +554789
    +554791
    +554797
    +554803
    +554821
    +554833
    +554837
    +554839
    +554843
    +554849
    +554887
    +554891
    +554893
    +554899
    +554923
    +554927
    +554951
    +554959
    +554969
    +554977
    +555029
    +555041
    +555043
    +555053
    +555073
    +555077
    +555083
    +555091
    +555097
    +555109
    +555119
    +555143
    +555167
    +555209
    +555221
    +555251
    +555253
    +555257
    +555277
    +555287
    +555293
    +555301
    +555307
    +555337
    +555349
    +555361
    +555383
    +555391
    +555419
    +555421
    +555439
    +555461
    +555487
    +555491
    +555521
    +555523
    +555557
    +555589
    +555593
    +555637
    +555661
    +555671
    +555677
    +555683
    +555691
    +555697
    +555707
    +555739
    +555743
    +555761
    +555767
    +555823
    +555827
    +555829
    +555853
    +555857
    +555871
    +555931
    +555941
    +555953
    +555967
    +556007
    +556021
    +556027
    +556037
    +556043
    +556051
    +556067
    +556069
    +556093
    +556103
    +556123
    +556159
    +556177
    +556181
    +556211
    +556219
    +556229
    +556243
    +556253
    +556261
    +556267
    +556271
    +556273
    +556279
    +556289
    +556313
    +556321
    +556327
    +556331
    +556343
    +556351
    +556373
    +556399
    +556403
    +556441
    +556459
    +556477
    +556483
    +556487
    +556513
    +556519
    +556537
    +556559
    +556573
    +556579
    +556583
    +556601
    +556607
    +556609
    +556613
    +556627
    +556639
    +556651
    +556679
    +556687
    +556691
    +556693
    +556697
    +556709
    +556723
    +556727
    +556741
    +556753
    +556763
    +556769
    +556781
    +556789
    +556793
    +556799
    +556811
    +556817
    +556819
    +556823
    +556841
    +556849
    +556859
    +556861
    +556867
    +556883
    +556891
    +556931
    +556939
    +556943
    +556957
    +556967
    +556981
    +556987
    +556999
    +557017
    +557021
    +557027
    +557033
    +557041
    +557057
    +557059
    +557069
    +557087
    +557093
    +557153
    +557159
    +557197
    +557201
    +557261
    +557269
    +557273
    +557281
    +557303
    +557309
    +557321
    +557329
    +557339
    +557369
    +557371
    +557377
    +557423
    +557443
    +557449
    +557461
    +557483
    +557489
    +557519
    +557521
    +557533
    +557537
    +557551
    +557567
    +557573
    +557591
    +557611
    +557633
    +557639
    +557663
    +557671
    +557693
    +557717
    +557729
    +557731
    +557741
    +557743
    +557747
    +557759
    +557761
    +557779
    +557789
    +557801
    +557803
    +557831
    +557857
    +557861
    +557863
    +557891
    +557899
    +557903
    +557927
    +557981
    +557987
    +558007
    +558017
    +558029
    +558053
    +558067
    +558083
    +558091
    +558109
    +558113
    +558121
    +558139
    +558149
    +558167
    +558179
    +558197
    +558203
    +558209
    +558223
    +558241
    +558251
    +558253
    +558287
    +558289
    +558307
    +558319
    +558343
    +558401
    +558413
    +558421
    +558427
    +558431
    +558457
    +558469
    +558473
    +558479
    +558491
    +558497
    +558499
    +558521
    +558529
    +558533
    +558539
    +558541
    +558563
    +558583
    +558587
    +558599
    +558611
    +558629
    +558643
    +558661
    +558683
    +558703
    +558721
    +558731
    +558757
    +558769
    +558781
    +558787
    +558791
    +558793
    +558827
    +558829
    +558863
    +558869
    +558881
    +558893
    +558913
    +558931
    +558937
    +558947
    +558973
    +558979
    +558997
    +559001
    +559049
    +559051
    +559067
    +559081
    +559093
    +559099
    +559123
    +559133
    +559157
    +559177
    +559183
    +559201
    +559211
    +559213
    +559217
    +559219
    +559231
    +559243
    +559259
    +559277
    +559297
    +559313
    +559319
    +559343
    +559357
    +559367
    +559369
    +559397
    +559421
    +559451
    +559459
    +559469
    +559483
    +559511
    +559513
    +559523
    +559529
    +559541
    +559547
    +559549
    +559561
    +559571
    +559577
    +559583
    +559591
    +559597
    +559631
    +559633
    +559639
    +559649
    +559667
    +559673
    +559679
    +559687
    +559703
    +559709
    +559739
    +559747
    +559777
    +559781
    +559799
    +559807
    +559813
    +559831
    +559841
    +559849
    +559859
    +559877
    +559883
    +559901
    +559907
    +559913
    +559939
    +559967
    +559973
    +559991
    +560017
    +560023
    +560029
    +560039
    +560047
    +560081
    +560083
    +560089
    +560093
    +560107
    +560113
    +560117
    +560123
    +560137
    +560149
    +560159
    +560171
    +560173
    +560179
    +560191
    +560207
    +560213
    +560221
    +560227
    +560233
    +560237
    +560239
    +560243
    +560249
    +560281
    +560293
    +560297
    +560299
    +560311
    +560317
    +560341
    +560353
    +560393
    +560411
    +560437
    +560447
    +560459
    +560471
    +560477
    +560479
    +560489
    +560491
    +560501
    +560503
    +560531
    +560543
    +560551
    +560561
    +560597
    +560617
    +560621
    +560639
    +560641
    +560653
    +560669
    +560683
    +560689
    +560701
    +560719
    +560737
    +560753
    +560761
    +560767
    +560771
    +560783
    +560797
    +560803
    +560827
    +560837
    +560863
    +560869
    +560873
    +560887
    +560891
    +560893
    +560897
    +560929
    +560939
    +560941
    +560969
    +560977
    +561019
    +561047
    +561053
    +561059
    +561061
    +561079
    +561083
    +561091
    +561097
    +561101
    +561103
    +561109
    +561161
    +561173
    +561181
    +561191
    +561199
    +561229
    +561251
    +561277
    +561307
    +561313
    +561343
    +561347
    +561359
    +561367
    +561373
    +561377
    +561389
    +561409
    +561419
    +561439
    +561461
    +561521
    +561529
    +561551
    +561553
    +561559
    +561599
    +561607
    +561667
    +561703
    +561713
    +561733
    +561761
    +561767
    +561787
    +561797
    +561809
    +561829
    +561839
    +561907
    +561917
    +561923
    +561931
    +561943
    +561947
    +561961
    +561973
    +561983
    +561997
    +562007
    +562019
    +562021
    +562043
    +562091
    +562103
    +562129
    +562147
    +562169
    +562181
    +562193
    +562201
    +562231
    +562259
    +562271
    +562273
    +562283
    +562291
    +562297
    +562301
    +562307
    +562313
    +562333
    +562337
    +562349
    +562351
    +562357
    +562361
    +562399
    +562403
    +562409
    +562417
    +562421
    +562427
    +562439
    +562459
    +562477
    +562493
    +562501
    +562517
    +562519
    +562537
    +562577
    +562579
    +562589
    +562591
    +562607
    +562613
    +562621
    +562631
    +562633
    +562651
    +562663
    +562669
    +562673
    +562691
    +562693
    +562699
    +562703
    +562711
    +562721
    +562739
    +562753
    +562759
    +562763
    +562781
    +562789
    +562813
    +562831
    +562841
    +562871
    +562897
    +562901
    +562909
    +562931
    +562943
    +562949
    +562963
    +562967
    +562973
    +562979
    +562987
    +562997
    +563009
    +563011
    +563021
    +563039
    +563041
    +563047
    +563051
    +563077
    +563081
    +563099
    +563113
    +563117
    +563119
    +563131
    +563149
    +563153
    +563183
    +563197
    +563219
    +563249
    +563263
    +563287
    +563327
    +563351
    +563357
    +563359
    +563377
    +563401
    +563411
    +563413
    +563417
    +563419
    +563447
    +563449
    +563467
    +563489
    +563501
    +563503
    +563543
    +563551
    +563561
    +563587
    +563593
    +563599
    +563623
    +563657
    +563663
    +563723
    +563743
    +563747
    +563777
    +563809
    +563813
    +563821
    +563831
    +563837
    +563851
    +563869
    +563881
    +563887
    +563897
    +563929
    +563933
    +563947
    +563971
    +563987
    +563999
    +564013
    +564017
    +564041
    +564049
    +564059
    +564061
    +564089
    +564097
    +564103
    +564127
    +564133
    +564149
    +564163
    +564173
    +564191
    +564197
    +564227
    +564229
    +564233
    +564251
    +564257
    +564269
    +564271
    +564299
    +564301
    +564307
    +564313
    +564323
    +564353
    +564359
    +564367
    +564371
    +564373
    +564391
    +564401
    +564407
    +564409
    +564419
    +564437
    +564449
    +564457
    +564463
    +564467
    +564491
    +564497
    +564523
    +564533
    +564593
    +564607
    +564617
    +564643
    +564653
    +564667
    +564671
    +564679
    +564701
    +564703
    +564709
    +564713
    +564761
    +564779
    +564793
    +564797
    +564827
    +564871
    +564881
    +564899
    +564917
    +564919
    +564923
    +564937
    +564959
    +564973
    +564979
    +564983
    +564989
    +564997
    +565013
    +565039
    +565049
    +565057
    +565069
    +565109
    +565111
    +565127
    +565163
    +565171
    +565177
    +565183
    +565189
    +565207
    +565237
    +565241
    +565247
    +565259
    +565261
    +565273
    +565283
    +565289
    +565303
    +565319
    +565333
    +565337
    +565343
    +565361
    +565379
    +565381
    +565387
    +565391
    +565393
    +565427
    +565429
    +565441
    +565451
    +565463
    +565469
    +565483
    +565489
    +565507
    +565511
    +565517
    +565519
    +565549
    +565553
    +565559
    +565567
    +565571
    +565583
    +565589
    +565597
    +565603
    +565613
    +565637
    +565651
    +565661
    +565667
    +565723
    +565727
    +565769
    +565771
    +565787
    +565793
    +565813
    +565849
    +565867
    +565889
    +565891
    +565907
    +565909
    +565919
    +565921
    +565937
    +565973
    +565979
    +565997
    +566011
    +566023
    +566047
    +566057
    +566077
    +566089
    +566101
    +566107
    +566131
    +566149
    +566161
    +566173
    +566179
    +566183
    +566201
    +566213
    +566227
    +566231
    +566233
    +566273
    +566311
    +566323
    +566347
    +566387
    +566393
    +566413
    +566417
    +566429
    +566431
    +566437
    +566441
    +566443
    +566453
    +566521
    +566537
    +566539
    +566543
    +566549
    +566551
    +566557
    +566563
    +566567
    +566617
    +566633
    +566639
    +566653
    +566659
    +566677
    +566681
    +566693
    +566701
    +566707
    +566717
    +566719
    +566723
    +566737
    +566759
    +566767
    +566791
    +566821
    +566833
    +566851
    +566857
    +566879
    +566911
    +566939
    +566947
    +566963
    +566971
    +566977
    +566987
    +566999
    +567011
    +567013
    +567031
    +567053
    +567059
    +567067
    +567097
    +567101
    +567107
    +567121
    +567143
    +567179
    +567181
    +567187
    +567209
    +567257
    +567263
    +567277
    +567319
    +567323
    +567367
    +567377
    +567383
    +567389
    +567401
    +567407
    +567439
    +567449
    +567451
    +567467
    +567487
    +567493
    +567499
    +567527
    +567529
    +567533
    +567569
    +567601
    +567607
    +567631
    +567649
    +567653
    +567659
    +567661
    +567667
    +567673
    +567689
    +567719
    +567737
    +567751
    +567761
    +567767
    +567779
    +567793
    +567811
    +567829
    +567841
    +567857
    +567863
    +567871
    +567877
    +567881
    +567883
    +567899
    +567937
    +567943
    +567947
    +567949
    +567961
    +567979
    +567991
    +567997
    +568019
    +568027
    +568033
    +568049
    +568069
    +568091
    +568097
    +568109
    +568133
    +568151
    +568153
    +568163
    +568171
    +568177
    +568187
    +568189
    +568193
    +568201
    +568207
    +568231
    +568237
    +568241
    +568273
    +568279
    +568289
    +568303
    +568349
    +568363
    +568367
    +568387
    +568391
    +568433
    +568439
    +568441
    +568453
    +568471
    +568481
    +568493
    +568523
    +568541
    +568549
    +568577
    +568609
    +568619
    +568627
    +568643
    +568657
    +568669
    +568679
    +568691
    +568699
    +568709
    +568723
    +568751
    +568783
    +568787
    +568807
    +568823
    +568831
    +568853
    +568877
    +568891
    +568903
    +568907
    +568913
    +568921
    +568963
    +568979
    +568987
    +568991
    +568999
    +569003
    +569011
    +569021
    +569047
    +569053
    +569057
    +569071
    +569077
    +569081
    +569083
    +569111
    +569117
    +569137
    +569141
    +569159
    +569161
    +569189
    +569197
    +569201
    +569209
    +569213
    +569237
    +569243
    +569249
    +569251
    +569263
    +569267
    +569269
    +569321
    +569323
    +569369
    +569417
    +569419
    +569423
    +569431
    +569447
    +569461
    +569479
    +569497
    +569507
    +569533
    +569573
    +569579
    +569581
    +569599
    +569603
    +569609
    +569617
    +569623
    +569659
    +569663
    +569671
    +569683
    +569711
    +569713
    +569717
    +569729
    +569731
    +569747
    +569759
    +569771
    +569773
    +569797
    +569809
    +569813
    +569819
    +569831
    +569839
    +569843
    +569851
    +569861
    +569869
    +569887
    +569893
    +569897
    +569903
    +569927
    +569939
    +569957
    +569983
    +570001
    +570013
    +570029
    +570041
    +570043
    +570047
    +570049
    +570071
    +570077
    +570079
    +570083
    +570091
    +570107
    +570109
    +570113
    +570131
    +570139
    +570161
    +570173
    +570181
    +570191
    +570217
    +570221
    +570233
    +570253
    +570329
    +570359
    +570373
    +570379
    +570389
    +570391
    +570403
    +570407
    +570413
    +570419
    +570421
    +570461
    +570463
    +570467
    +570487
    +570491
    +570497
    +570499
    +570509
    +570511
    +570527
    +570529
    +570539
    +570547
    +570553
    +570569
    +570587
    +570601
    +570613
    +570637
    +570643
    +570649
    +570659
    +570667
    +570671
    +570677
    +570683
    +570697
    +570719
    +570733
    +570737
    +570743
    +570781
    +570821
    +570827
    +570839
    +570841
    +570851
    +570853
    +570859
    +570881
    +570887
    +570901
    +570919
    +570937
    +570949
    +570959
    +570961
    +570967
    +570991
    +571001
    +571019
    +571031
    +571037
    +571049
    +571069
    +571093
    +571099
    +571111
    +571133
    +571147
    +571157
    +571163
    +571199
    +571201
    +571211
    +571223
    +571229
    +571231
    +571261
    +571267
    +571279
    +571303
    +571321
    +571331
    +571339
    +571369
    +571381
    +571397
    +571399
    +571409
    +571433
    +571453
    +571471
    +571477
    +571531
    +571541
    +571579
    +571583
    +571589
    +571601
    +571603
    +571633
    +571657
    +571673
    +571679
    +571699
    +571709
    +571717
    +571721
    +571741
    +571751
    +571759
    +571777
    +571783
    +571789
    +571799
    +571801
    +571811
    +571841
    +571847
    +571853
    +571861
    +571867
    +571871
    +571873
    +571877
    +571903
    +571933
    +571939
    +571969
    +571973
    +572023
    +572027
    +572041
    +572051
    +572053
    +572059
    +572063
    +572069
    +572087
    +572093
    +572107
    +572137
    +572161
    +572177
    +572179
    +572183
    +572207
    +572233
    +572239
    +572251
    +572269
    +572281
    +572303
    +572311
    +572321
    +572323
    +572329
    +572333
    +572357
    +572387
    +572399
    +572417
    +572419
    +572423
    +572437
    +572449
    +572461
    +572471
    +572479
    +572491
    +572497
    +572519
    +572521
    +572549
    +572567
    +572573
    +572581
    +572587
    +572597
    +572599
    +572609
    +572629
    +572633
    +572639
    +572651
    +572653
    +572657
    +572659
    +572683
    +572687
    +572699
    +572707
    +572711
    +572749
    +572777
    +572791
    +572801
    +572807
    +572813
    +572821
    +572827
    +572833
    +572843
    +572867
    +572879
    +572881
    +572903
    +572909
    +572927
    +572933
    +572939
    +572941
    +572963
    +572969
    +572993
    +573007
    +573031
    +573047
    +573101
    +573107
    +573109
    +573119
    +573143
    +573161
    +573163
    +573179
    +573197
    +573247
    +573253
    +573263
    +573277
    +573289
    +573299
    +573317
    +573329
    +573341
    +573343
    +573371
    +573379
    +573383
    +573409
    +573437
    +573451
    +573457
    +573473
    +573479
    +573481
    +573487
    +573493
    +573497
    +573509
    +573511
    +573523
    +573527
    +573557
    +573569
    +573571
    +573637
    +573647
    +573673
    +573679
    +573691
    +573719
    +573737
    +573739
    +573757
    +573761
    +573763
    +573787
    +573791
    +573809
    +573817
    +573829
    +573847
    +573851
    +573863
    +573871
    +573883
    +573887
    +573899
    +573901
    +573929
    +573941
    +573953
    +573967
    +573973
    +573977
    +574003
    +574031
    +574033
    +574051
    +574061
    +574081
    +574099
    +574109
    +574127
    +574157
    +574159
    +574163
    +574169
    +574181
    +574183
    +574201
    +574219
    +574261
    +574279
    +574283
    +574289
    +574297
    +574307
    +574309
    +574363
    +574367
    +574373
    +574393
    +574423
    +574429
    +574433
    +574439
    +574477
    +574489
    +574493
    +574501
    +574507
    +574529
    +574543
    +574547
    +574597
    +574619
    +574621
    +574627
    +574631
    +574643
    +574657
    +574667
    +574687
    +574699
    +574703
    +574711
    +574723
    +574727
    +574733
    +574741
    +574789
    +574799
    +574801
    +574813
    +574817
    +574859
    +574907
    +574913
    +574933
    +574939
    +574949
    +574963
    +574967
    +574969
    +575009
    +575027
    +575033
    +575053
    +575063
    +575077
    +575087
    +575119
    +575123
    +575129
    +575131
    +575137
    +575153
    +575173
    +575177
    +575203
    +575213
    +575219
    +575231
    +575243
    +575249
    +575251
    +575257
    +575261
    +575303
    +575317
    +575359
    +575369
    +575371
    +575401
    +575417
    +575429
    +575431
    +575441
    +575473
    +575479
    +575489
    +575503
    +575513
    +575551
    +575557
    +575573
    +575579
    +575581
    +575591
    +575593
    +575611
    +575623
    +575647
    +575651
    +575669
    +575677
    +575689
    +575693
    +575699
    +575711
    +575717
    +575723
    +575747
    +575753
    +575777
    +575791
    +575821
    +575837
    +575849
    +575857
    +575863
    +575867
    +575893
    +575903
    +575921
    +575923
    +575941
    +575957
    +575959
    +575963
    +575987
    +576001
    +576013
    +576019
    +576029
    +576031
    +576041
    +576049
    +576089
    +576101
    +576119
    +576131
    +576151
    +576161
    +576167
    +576179
    +576193
    +576203
    +576211
    +576217
    +576221
    +576223
    +576227
    +576287
    +576293
    +576299
    +576313
    +576319
    +576341
    +576377
    +576379
    +576391
    +576421
    +576427
    +576431
    +576439
    +576461
    +576469
    +576473
    +576493
    +576509
    +576523
    +576529
    +576533
    +576539
    +576551
    +576553
    +576577
    +576581
    +576613
    +576617
    +576637
    +576647
    +576649
    +576659
    +576671
    +576677
    +576683
    +576689
    +576701
    +576703
    +576721
    +576727
    +576731
    +576739
    +576743
    +576749
    +576757
    +576769
    +576787
    +576791
    +576881
    +576883
    +576889
    +576899
    +576943
    +576949
    +576967
    +576977
    +577007
    +577009
    +577033
    +577043
    +577063
    +577067
    +577069
    +577081
    +577097
    +577111
    +577123
    +577147
    +577151
    +577153
    +577169
    +577177
    +577193
    +577219
    +577249
    +577259
    +577271
    +577279
    +577307
    +577327
    +577331
    +577333
    +577349
    +577351
    +577363
    +577387
    +577397
    +577399
    +577427
    +577453
    +577457
    +577463
    +577471
    +577483
    +577513
    +577517
    +577523
    +577529
    +577531
    +577537
    +577547
    +577559
    +577573
    +577589
    +577601
    +577613
    +577627
    +577637
    +577639
    +577667
    +577721
    +577739
    +577751
    +577757
    +577781
    +577799
    +577807
    +577817
    +577831
    +577849
    +577867
    +577873
    +577879
    +577897
    +577901
    +577909
    +577919
    +577931
    +577937
    +577939
    +577957
    +577979
    +577981
    +578021
    +578029
    +578041
    +578047
    +578063
    +578077
    +578093
    +578117
    +578131
    +578167
    +578183
    +578191
    +578203
    +578209
    +578213
    +578251
    +578267
    +578297
    +578299
    +578309
    +578311
    +578317
    +578327
    +578353
    +578363
    +578371
    +578399
    +578401
    +578407
    +578419
    +578441
    +578453
    +578467
    +578477
    +578483
    +578489
    +578497
    +578503
    +578509
    +578533
    +578537
    +578563
    +578573
    +578581
    +578587
    +578597
    +578603
    +578609
    +578621
    +578647
    +578659
    +578687
    +578689
    +578693
    +578701
    +578719
    +578729
    +578741
    +578777
    +578779
    +578789
    +578803
    +578819
    +578821
    +578827
    +578839
    +578843
    +578857
    +578861
    +578881
    +578917
    +578923
    +578957
    +578959
    +578971
    +578999
    +579011
    +579017
    +579023
    +579053
    +579079
    +579083
    +579107
    +579113
    +579119
    +579133
    +579179
    +579197
    +579199
    +579239
    +579251
    +579259
    +579263
    +579277
    +579281
    +579283
    +579287
    +579311
    +579331
    +579353
    +579379
    +579407
    +579409
    +579427
    +579433
    +579451
    +579473
    +579497
    +579499
    +579503
    +579517
    +579521
    +579529
    +579533
    +579539
    +579541
    +579563
    +579569
    +579571
    +579583
    +579587
    +579611
    +579613
    +579629
    +579637
    +579641
    +579643
    +579653
    +579673
    +579701
    +579707
    +579713
    +579721
    +579737
    +579757
    +579763
    +579773
    +579779
    +579809
    +579829
    +579851
    +579869
    +579877
    +579881
    +579883
    +579893
    +579907
    +579947
    +579949
    +579961
    +579967
    +579973
    +579983
    +580001
    +580031
    +580033
    +580079
    +580081
    +580093
    +580133
    +580163
    +580169
    +580183
    +580187
    +580201
    +580213
    +580219
    +580231
    +580259
    +580291
    +580301
    +580303
    +580331
    +580339
    +580343
    +580357
    +580361
    +580373
    +580379
    +580381
    +580409
    +580417
    +580471
    +580477
    +580487
    +580513
    +580529
    +580549
    +580553
    +580561
    +580577
    +580607
    +580627
    +580631
    +580633
    +580639
    +580663
    +580673
    +580687
    +580691
    +580693
    +580711
    +580717
    +580733
    +580747
    +580757
    +580759
    +580763
    +580787
    +580793
    +580807
    +580813
    +580837
    +580843
    +580859
    +580871
    +580889
    +580891
    +580901
    +580913
    +580919
    +580927
    +580939
    +580969
    +580981
    +580997
    +581029
    +581041
    +581047
    +581069
    +581071
    +581089
    +581099
    +581101
    +581137
    +581143
    +581149
    +581171
    +581173
    +581177
    +581183
    +581197
    +581201
    +581227
    +581237
    +581239
    +581261
    +581263
    +581293
    +581303
    +581311
    +581323
    +581333
    +581341
    +581351
    +581353
    +581369
    +581377
    +581393
    +581407
    +581411
    +581429
    +581443
    +581447
    +581459
    +581473
    +581491
    +581521
    +581527
    +581549
    +581551
    +581557
    +581573
    +581597
    +581599
    +581617
    +581639
    +581657
    +581663
    +581683
    +581687
    +581699
    +581701
    +581729
    +581731
    +581743
    +581753
    +581767
    +581773
    +581797
    +581809
    +581821
    +581843
    +581857
    +581863
    +581869
    +581873
    +581891
    +581909
    +581921
    +581941
    +581947
    +581953
    +581981
    +581983
    +582011
    +582013
    +582017
    +582031
    +582037
    +582067
    +582083
    +582119
    +582137
    +582139
    +582157
    +582161
    +582167
    +582173
    +582181
    +582203
    +582209
    +582221
    +582223
    +582227
    +582247
    +582251
    +582299
    +582317
    +582319
    +582371
    +582391
    +582409
    +582419
    +582427
    +582433
    +582451
    +582457
    +582469
    +582499
    +582509
    +582511
    +582541
    +582551
    +582563
    +582587
    +582601
    +582623
    +582643
    +582649
    +582677
    +582689
    +582691
    +582719
    +582721
    +582727
    +582731
    +582737
    +582761
    +582763
    +582767
    +582773
    +582781
    +582793
    +582809
    +582821
    +582851
    +582853
    +582859
    +582887
    +582899
    +582931
    +582937
    +582949
    +582961
    +582971
    +582973
    +582983
    +583007
    +583013
    +583019
    +583021
    +583031
    +583069
    +583087
    +583127
    +583139
    +583147
    +583153
    +583169
    +583171
    +583181
    +583189
    +583207
    +583213
    +583229
    +583237
    +583249
    +583267
    +583273
    +583279
    +583291
    +583301
    +583337
    +583339
    +583351
    +583367
    +583391
    +583397
    +583403
    +583409
    +583417
    +583421
    +583447
    +583459
    +583469
    +583481
    +583493
    +583501
    +583511
    +583519
    +583523
    +583537
    +583543
    +583577
    +583603
    +583613
    +583619
    +583621
    +583631
    +583651
    +583657
    +583669
    +583673
    +583697
    +583727
    +583733
    +583753
    +583769
    +583777
    +583783
    +583789
    +583801
    +583841
    +583853
    +583859
    +583861
    +583873
    +583879
    +583903
    +583909
    +583937
    +583969
    +583981
    +583991
    +583997
    +584011
    +584027
    +584033
    +584053
    +584057
    +584063
    +584081
    +584099
    +584141
    +584153
    +584167
    +584183
    +584203
    +584249
    +584261
    +584279
    +584281
    +584303
    +584347
    +584357
    +584359
    +584377
    +584387
    +584393
    +584399
    +584411
    +584417
    +584429
    +584447
    +584471
    +584473
    +584509
    +584531
    +584557
    +584561
    +584587
    +584593
    +584599
    +584603
    +584609
    +584621
    +584627
    +584659
    +584663
    +584677
    +584693
    +584699
    +584707
    +584713
    +584719
    +584723
    +584737
    +584767
    +584777
    +584789
    +584791
    +584809
    +584849
    +584863
    +584869
    +584873
    +584879
    +584897
    +584911
    +584917
    +584923
    +584951
    +584963
    +584971
    +584981
    +584993
    +584999
    +585019
    +585023
    +585031
    +585037
    +585041
    +585043
    +585049
    +585061
    +585071
    +585073
    +585077
    +585107
    +585113
    +585119
    +585131
    +585149
    +585163
    +585199
    +585217
    +585251
    +585269
    +585271
    +585283
    +585289
    +585313
    +585317
    +585337
    +585341
    +585367
    +585383
    +585391
    +585413
    +585437
    +585443
    +585461
    +585467
    +585493
    +585503
    +585517
    +585547
    +585551
    +585569
    +585577
    +585581
    +585587
    +585593
    +585601
    +585619
    +585643
    +585653
    +585671
    +585677
    +585691
    +585721
    +585727
    +585733
    +585737
    +585743
    +585749
    +585757
    +585779
    +585791
    +585799
    +585839
    +585841
    +585847
    +585853
    +585857
    +585863
    +585877
    +585881
    +585883
    +585889
    +585899
    +585911
    +585913
    +585917
    +585919
    +585953
    +585989
    +585997
    +586009
    +586037
    +586051
    +586057
    +586067
    +586073
    +586087
    +586111
    +586121
    +586123
    +586129
    +586139
    +586147
    +586153
    +586189
    +586213
    +586237
    +586273
    +586277
    +586291
    +586301
    +586309
    +586319
    +586349
    +586361
    +586363
    +586367
    +586387
    +586403
    +586429
    +586433
    +586457
    +586459
    +586463
    +586471
    +586493
    +586499
    +586501
    +586541
    +586543
    +586567
    +586571
    +586577
    +586589
    +586601
    +586603
    +586609
    +586627
    +586631
    +586633
    +586667
    +586679
    +586693
    +586711
    +586723
    +586741
    +586769
    +586787
    +586793
    +586801
    +586811
    +586813
    +586819
    +586837
    +586841
    +586849
    +586871
    +586897
    +586903
    +586909
    +586919
    +586921
    +586933
    +586939
    +586951
    +586961
    +586973
    +586979
    +586981
    +587017
    +587021
    +587033
    +587051
    +587053
    +587057
    +587063
    +587087
    +587101
    +587107
    +587117
    +587123
    +587131
    +587137
    +587143
    +587149
    +587173
    +587179
    +587189
    +587201
    +587219
    +587263
    +587267
    +587269
    +587281
    +587287
    +587297
    +587303
    +587341
    +587371
    +587381
    +587387
    +587413
    +587417
    +587429
    +587437
    +587441
    +587459
    +587467
    +587473
    +587497
    +587513
    +587519
    +587527
    +587533
    +587539
    +587549
    +587551
    +587563
    +587579
    +587599
    +587603
    +587617
    +587621
    +587623
    +587633
    +587659
    +587669
    +587677
    +587687
    +587693
    +587711
    +587731
    +587737
    +587747
    +587749
    +587753
    +587771
    +587773
    +587789
    +587813
    +587827
    +587833
    +587849
    +587863
    +587887
    +587891
    +587897
    +587927
    +587933
    +587947
    +587959
    +587969
    +587971
    +587987
    +587989
    +587999
    +588011
    +588019
    +588037
    +588043
    +588061
    +588073
    +588079
    +588083
    +588097
    +588113
    +588121
    +588131
    +588151
    +588167
    +588169
    +588173
    +588191
    +588199
    +588229
    +588239
    +588241
    +588257
    +588277
    +588293
    +588311
    +588347
    +588359
    +588361
    +588383
    +588389
    +588397
    +588403
    +588433
    +588437
    +588463
    +588481
    +588493
    +588503
    +588509
    +588517
    +588521
    +588529
    +588569
    +588571
    +588619
    +588631
    +588641
    +588647
    +588649
    +588667
    +588673
    +588683
    +588703
    +588733
    +588737
    +588743
    +588767
    +588773
    +588779
    +588811
    +588827
    +588839
    +588871
    +588877
    +588881
    +588893
    +588911
    +588937
    +588941
    +588947
    +588949
    +588953
    +588977
    +589021
    +589027
    +589049
    +589063
    +589109
    +589111
    +589123
    +589139
    +589159
    +589163
    +589181
    +589187
    +589189
    +589207
    +589213
    +589219
    +589231
    +589241
    +589243
    +589273
    +589289
    +589291
    +589297
    +589327
    +589331
    +589349
    +589357
    +589387
    +589409
    +589439
    +589451
    +589453
    +589471
    +589481
    +589493
    +589507
    +589529
    +589531
    +589579
    +589583
    +589591
    +589601
    +589607
    +589609
    +589639
    +589643
    +589681
    +589711
    +589717
    +589751
    +589753
    +589759
    +589763
    +589783
    +589793
    +589807
    +589811
    +589829
    +589847
    +589859
    +589861
    +589873
    +589877
    +589903
    +589921
    +589933
    +589993
    +589997
    +590021
    +590027
    +590033
    +590041
    +590071
    +590077
    +590099
    +590119
    +590123
    +590129
    +590131
    +590137
    +590141
    +590153
    +590171
    +590201
    +590207
    +590243
    +590251
    +590263
    +590267
    +590269
    +590279
    +590309
    +590321
    +590323
    +590327
    +590357
    +590363
    +590377
    +590383
    +590389
    +590399
    +590407
    +590431
    +590437
    +590489
    +590537
    +590543
    +590567
    +590573
    +590593
    +590599
    +590609
    +590627
    +590641
    +590647
    +590657
    +590659
    +590669
    +590713
    +590717
    +590719
    +590741
    +590753
    +590771
    +590797
    +590809
    +590813
    +590819
    +590833
    +590839
    +590867
    +590899
    +590921
    +590923
    +590929
    +590959
    +590963
    +590983
    +590987
    +591023
    +591053
    +591061
    +591067
    +591079
    +591089
    +591091
    +591113
    +591127
    +591131
    +591137
    +591161
    +591163
    +591181
    +591193
    +591233
    +591259
    +591271
    +591287
    +591289
    +591301
    +591317
    +591319
    +591341
    +591377
    +591391
    +591403
    +591407
    +591421
    +591431
    +591443
    +591457
    +591469
    +591499
    +591509
    +591523
    +591553
    +591559
    +591581
    +591599
    +591601
    +591611
    +591623
    +591649
    +591653
    +591659
    +591673
    +591691
    +591709
    +591739
    +591743
    +591749
    +591751
    +591757
    +591779
    +591791
    +591827
    +591841
    +591847
    +591863
    +591881
    +591887
    +591893
    +591901
    +591937
    +591959
    +591973
    +592019
    +592027
    +592049
    +592057
    +592061
    +592073
    +592087
    +592099
    +592121
    +592129
    +592133
    +592139
    +592157
    +592199
    +592217
    +592219
    +592223
    +592237
    +592261
    +592289
    +592303
    +592307
    +592309
    +592321
    +592337
    +592343
    +592351
    +592357
    +592367
    +592369
    +592387
    +592391
    +592393
    +592429
    +592451
    +592453
    +592463
    +592469
    +592483
    +592489
    +592507
    +592517
    +592531
    +592547
    +592561
    +592577
    +592589
    +592597
    +592601
    +592609
    +592621
    +592639
    +592643
    +592649
    +592661
    +592663
    +592681
    +592693
    +592723
    +592727
    +592741
    +592747
    +592759
    +592763
    +592793
    +592843
    +592849
    +592853
    +592861
    +592873
    +592877
    +592897
    +592903
    +592919
    +592931
    +592939
    +592967
    +592973
    +592987
    +592993
    +593003
    +593029
    +593041
    +593051
    +593059
    +593071
    +593081
    +593083
    +593111
    +593119
    +593141
    +593143
    +593149
    +593171
    +593179
    +593183
    +593207
    +593209
    +593213
    +593227
    +593231
    +593233
    +593251
    +593261
    +593273
    +593291
    +593293
    +593297
    +593321
    +593323
    +593353
    +593381
    +593387
    +593399
    +593401
    +593407
    +593429
    +593447
    +593449
    +593473
    +593479
    +593491
    +593497
    +593501
    +593507
    +593513
    +593519
    +593531
    +593539
    +593573
    +593587
    +593597
    +593603
    +593627
    +593629
    +593633
    +593641
    +593647
    +593651
    +593689
    +593707
    +593711
    +593767
    +593777
    +593783
    +593839
    +593851
    +593863
    +593869
    +593899
    +593903
    +593933
    +593951
    +593969
    +593977
    +593987
    +593993
    +594023
    +594037
    +594047
    +594091
    +594103
    +594107
    +594119
    +594137
    +594151
    +594157
    +594161
    +594163
    +594179
    +594193
    +594203
    +594211
    +594227
    +594241
    +594271
    +594281
    +594283
    +594287
    +594299
    +594311
    +594313
    +594329
    +594359
    +594367
    +594379
    +594397
    +594401
    +594403
    +594421
    +594427
    +594449
    +594457
    +594467
    +594469
    +594499
    +594511
    +594521
    +594523
    +594533
    +594551
    +594563
    +594569
    +594571
    +594577
    +594617
    +594637
    +594641
    +594653
    +594667
    +594679
    +594697
    +594709
    +594721
    +594739
    +594749
    +594751
    +594773
    +594793
    +594821
    +594823
    +594827
    +594829
    +594857
    +594889
    +594899
    +594911
    +594917
    +594929
    +594931
    +594953
    +594959
    +594961
    +594977
    +594989
    +595003
    +595037
    +595039
    +595043
    +595057
    +595069
    +595073
    +595081
    +595087
    +595093
    +595097
    +595117
    +595123
    +595129
    +595139
    +595141
    +595157
    +595159
    +595181
    +595183
    +595201
    +595207
    +595229
    +595247
    +595253
    +595261
    +595267
    +595271
    +595277
    +595291
    +595303
    +595313
    +595319
    +595333
    +595339
    +595351
    +595363
    +595373
    +595379
    +595381
    +595411
    +595451
    +595453
    +595481
    +595513
    +595519
    +595523
    +595547
    +595549
    +595571
    +595577
    +595579
    +595613
    +595627
    +595687
    +595703
    +595709
    +595711
    +595717
    +595733
    +595741
    +595801
    +595807
    +595817
    +595843
    +595873
    +595877
    +595927
    +595939
    +595943
    +595949
    +595951
    +595957
    +595961
    +595963
    +595967
    +595981
    +596009
    +596021
    +596027
    +596047
    +596053
    +596059
    +596069
    +596081
    +596083
    +596093
    +596117
    +596119
    +596143
    +596147
    +596159
    +596179
    +596209
    +596227
    +596231
    +596243
    +596251
    +596257
    +596261
    +596273
    +596279
    +596291
    +596293
    +596317
    +596341
    +596363
    +596369
    +596399
    +596419
    +596423
    +596461
    +596489
    +596503
    +596507
    +596537
    +596569
    +596573
    +596579
    +596587
    +596593
    +596599
    +596611
    +596623
    +596633
    +596653
    +596663
    +596669
    +596671
    +596693
    +596707
    +596737
    +596741
    +596749
    +596767
    +596779
    +596789
    +596803
    +596821
    +596831
    +596839
    +596851
    +596857
    +596861
    +596863
    +596879
    +596899
    +596917
    +596927
    +596929
    +596933
    +596941
    +596963
    +596977
    +596983
    +596987
    +597031
    +597049
    +597053
    +597059
    +597073
    +597127
    +597131
    +597133
    +597137
    +597169
    +597209
    +597221
    +597239
    +597253
    +597263
    +597269
    +597271
    +597301
    +597307
    +597349
    +597353
    +597361
    +597367
    +597383
    +597391
    +597403
    +597407
    +597409
    +597419
    +597433
    +597437
    +597451
    +597473
    +597497
    +597521
    +597523
    +597539
    +597551
    +597559
    +597577
    +597581
    +597589
    +597593
    +597599
    +597613
    +597637
    +597643
    +597659
    +597671
    +597673
    +597677
    +597679
    +597689
    +597697
    +597757
    +597761
    +597767
    +597769
    +597781
    +597803
    +597823
    +597827
    +597833
    +597853
    +597859
    +597869
    +597889
    +597899
    +597901
    +597923
    +597929
    +597967
    +597997
    +598007
    +598049
    +598051
    +598057
    +598079
    +598093
    +598099
    +598123
    +598127
    +598141
    +598151
    +598159
    +598163
    +598187
    +598189
    +598193
    +598219
    +598229
    +598261
    +598303
    +598307
    +598333
    +598363
    +598369
    +598379
    +598387
    +598399
    +598421
    +598427
    +598439
    +598447
    +598457
    +598463
    +598487
    +598489
    +598501
    +598537
    +598541
    +598571
    +598613
    +598643
    +598649
    +598651
    +598657
    +598669
    +598681
    +598687
    +598691
    +598711
    +598721
    +598727
    +598729
    +598777
    +598783
    +598789
    +598799
    +598817
    +598841
    +598853
    +598867
    +598877
    +598883
    +598891
    +598903
    +598931
    +598933
    +598963
    +598967
    +598973
    +598981
    +598987
    +598999
    +599003
    +599009
    +599021
    +599023
    +599069
    +599087
    +599117
    +599143
    +599147
    +599149
    +599153
    +599191
    +599213
    +599231
    +599243
    +599251
    +599273
    +599281
    +599303
    +599309
    +599321
    +599341
    +599353
    +599359
    +599371
    +599383
    +599387
    +599399
    +599407
    +599413
    +599419
    +599429
    +599477
    +599479
    +599491
    +599513
    +599519
    +599537
    +599551
    +599561
    +599591
    +599597
    +599603
    +599611
    +599623
    +599629
    +599657
    +599663
    +599681
    +599693
    +599699
    +599701
    +599713
    +599719
    +599741
    +599759
    +599779
    +599783
    +599803
    +599831
    +599843
    +599857
    +599869
    +599891
    +599899
    +599927
    +599933
    +599939
    +599941
    +599959
    +599983
    +599993
    +599999
    +600011
    +600043
    +600053
    +600071
    +600073
    +600091
    +600101
    +600109
    +600167
    +600169
    +600203
    +600217
    +600221
    +600233
    +600239
    +600241
    +600247
    +600269
    +600283
    +600289
    +600293
    +600307
    +600311
    +600317
    +600319
    +600337
    +600359
    +600361
    +600367
    +600371
    +600401
    +600403
    +600407
    +600421
    +600433
    +600449
    +600451
    +600463
    +600469
    +600487
    +600517
    +600529
    +600557
    +600569
    +600577
    +600601
    +600623
    +600631
    +600641
    +600659
    +600673
    +600689
    +600697
    +600701
    +600703
    +600727
    +600751
    +600791
    +600823
    +600827
    +600833
    +600841
    +600857
    +600877
    +600881
    +600883
    +600889
    +600893
    +600931
    +600947
    +600949
    +600959
    +600961
    +600973
    +600979
    +600983
    +601021
    +601031
    +601037
    +601039
    +601043
    +601061
    +601067
    +601079
    +601093
    +601127
    +601147
    +601187
    +601189
    +601193
    +601201
    +601207
    +601219
    +601231
    +601241
    +601247
    +601259
    +601267
    +601283
    +601291
    +601297
    +601309
    +601313
    +601319
    +601333
    +601339
    +601357
    +601379
    +601397
    +601411
    +601423
    +601439
    +601451
    +601457
    +601487
    +601507
    +601541
    +601543
    +601589
    +601591
    +601607
    +601631
    +601651
    +601669
    +601687
    +601697
    +601717
    +601747
    +601751
    +601759
    +601763
    +601771
    +601801
    +601807
    +601813
    +601819
    +601823
    +601831
    +601849
    +601873
    +601883
    +601889
    +601897
    +601903
    +601943
    +601949
    +601961
    +601969
    +601981
    +602029
    +602033
    +602039
    +602047
    +602057
    +602081
    +602083
    +602087
    +602093
    +602099
    +602111
    +602137
    +602141
    +602143
    +602153
    +602179
    +602197
    +602201
    +602221
    +602227
    +602233
    +602257
    +602267
    +602269
    +602279
    +602297
    +602309
    +602311
    +602317
    +602321
    +602333
    +602341
    +602351
    +602377
    +602383
    +602401
    +602411
    +602431
    +602453
    +602461
    +602477
    +602479
    +602489
    +602501
    +602513
    +602521
    +602543
    +602551
    +602593
    +602597
    +602603
    +602621
    +602627
    +602639
    +602647
    +602677
    +602687
    +602689
    +602711
    +602713
    +602717
    +602729
    +602743
    +602753
    +602759
    +602773
    +602779
    +602801
    +602821
    +602831
    +602839
    +602867
    +602873
    +602887
    +602891
    +602909
    +602929
    +602947
    +602951
    +602971
    +602977
    +602983
    +602999
    +603011
    +603013
    +603023
    +603047
    +603077
    +603091
    +603101
    +603103
    +603131
    +603133
    +603149
    +603173
    +603191
    +603203
    +603209
    +603217
    +603227
    +603257
    +603283
    +603311
    +603319
    +603349
    +603389
    +603391
    +603401
    +603431
    +603443
    +603457
    +603467
    +603487
    +603503
    +603521
    +603523
    +603529
    +603541
    +603553
    +603557
    +603563
    +603569
    +603607
    +603613
    +603623
    +603641
    +603667
    +603679
    +603689
    +603719
    +603731
    +603739
    +603749
    +603761
    +603769
    +603781
    +603791
    +603793
    +603817
    +603821
    +603833
    +603847
    +603851
    +603853
    +603859
    +603881
    +603893
    +603899
    +603901
    +603907
    +603913
    +603917
    +603919
    +603923
    +603931
    +603937
    +603947
    +603949
    +603989
    +604001
    +604007
    +604013
    +604031
    +604057
    +604063
    +604069
    +604073
    +604171
    +604189
    +604223
    +604237
    +604243
    +604249
    +604259
    +604277
    +604291
    +604309
    +604313
    +604319
    +604339
    +604343
    +604349
    +604361
    +604369
    +604379
    +604397
    +604411
    +604427
    +604433
    +604441
    +604477
    +604481
    +604517
    +604529
    +604547
    +604559
    +604579
    +604589
    +604603
    +604609
    +604613
    +604619
    +604649
    +604651
    +604661
    +604697
    +604699
    +604711
    +604727
    +604729
    +604733
    +604753
    +604759
    +604781
    +604787
    +604801
    +604811
    +604819
    +604823
    +604829
    +604837
    +604859
    +604861
    +604867
    +604883
    +604907
    +604931
    +604939
    +604949
    +604957
    +604973
    +604997
    +605009
    +605021
    +605023
    +605039
    +605051
    +605069
    +605071
    +605113
    +605117
    +605123
    +605147
    +605167
    +605173
    +605177
    +605191
    +605221
    +605233
    +605237
    +605239
    +605249
    +605257
    +605261
    +605309
    +605323
    +605329
    +605333
    +605347
    +605369
    +605393
    +605401
    +605411
    +605413
    +605443
    +605471
    +605477
    +605497
    +605503
    +605509
    +605531
    +605533
    +605543
    +605551
    +605573
    +605593
    +605597
    +605599
    +605603
    +605609
    +605617
    +605629
    +605639
    +605641
    +605687
    +605707
    +605719
    +605779
    +605789
    +605809
    +605837
    +605849
    +605861
    +605867
    +605873
    +605879
    +605887
    +605893
    +605909
    +605921
    +605933
    +605947
    +605953
    +605977
    +605987
    +605993
    +606017
    +606029
    +606031
    +606037
    +606041
    +606049
    +606059
    +606077
    +606079
    +606083
    +606091
    +606113
    +606121
    +606131
    +606173
    +606181
    +606223
    +606241
    +606247
    +606251
    +606299
    +606301
    +606311
    +606313
    +606323
    +606341
    +606379
    +606383
    +606413
    +606433
    +606443
    +606449
    +606493
    +606497
    +606503
    +606521
    +606527
    +606539
    +606559
    +606569
    +606581
    +606587
    +606589
    +606607
    +606643
    +606649
    +606653
    +606659
    +606673
    +606721
    +606731
    +606733
    +606737
    +606743
    +606757
    +606791
    +606811
    +606829
    +606833
    +606839
    +606847
    +606857
    +606863
    +606899
    +606913
    +606919
    +606943
    +606959
    +606961
    +606967
    +606971
    +606997
    +607001
    +607003
    +607007
    +607037
    +607043
    +607049
    +607063
    +607067
    +607081
    +607091
    +607093
    +607097
    +607109
    +607127
    +607129
    +607147
    +607151
    +607153
    +607157
    +607163
    +607181
    +607199
    +607213
    +607219
    +607249
    +607253
    +607261
    +607301
    +607303
    +607307
    +607309
    +607319
    +607331
    +607337
    +607339
    +607349
    +607357
    +607363
    +607417
    +607421
    +607423
    +607471
    +607493
    +607517
    +607531
    +607549
    +607573
    +607583
    +607619
    +607627
    +607667
    +607669
    +607681
    +607697
    +607703
    +607721
    +607723
    +607727
    +607741
    +607769
    +607813
    +607819
    +607823
    +607837
    +607843
    +607861
    +607883
    +607889
    +607909
    +607921
    +607931
    +607933
    +607939
    +607951
    +607961
    +607967
    +607991
    +607993
    +608011
    +608029
    +608033
    +608087
    +608089
    +608099
    +608117
    +608123
    +608129
    +608131
    +608147
    +608161
    +608177
    +608191
    +608207
    +608213
    +608269
    +608273
    +608297
    +608299
    +608303
    +608339
    +608347
    +608357
    +608359
    +608369
    +608371
    +608383
    +608389
    +608393
    +608401
    +608411
    +608423
    +608429
    +608431
    +608459
    +608471
    +608483
    +608497
    +608519
    +608521
    +608527
    +608581
    +608591
    +608593
    +608609
    +608611
    +608633
    +608653
    +608659
    +608669
    +608677
    +608693
    +608701
    +608737
    +608743
    +608749
    +608759
    +608767
    +608789
    +608819
    +608831
    +608843
    +608851
    +608857
    +608863
    +608873
    +608887
    +608897
    +608899
    +608903
    +608941
    +608947
    +608953
    +608977
    +608987
    +608989
    +608999
    +609043
    +609047
    +609067
    +609071
    +609079
    +609101
    +609107
    +609113
    +609143
    +609149
    +609163
    +609173
    +609179
    +609199
    +609209
    +609221
    +609227
    +609233
    +609241
    +609253
    +609269
    +609277
    +609283
    +609289
    +609307
    +609313
    +609337
    +609359
    +609361
    +609373
    +609379
    +609391
    +609397
    +609403
    +609407
    +609421
    +609437
    +609443
    +609461
    +609487
    +609503
    +609509
    +609517
    +609527
    +609533
    +609541
    +609571
    +609589
    +609593
    +609599
    +609601
    +609607
    +609613
    +609617
    +609619
    +609641
    +609673
    +609683
    +609701
    +609709
    +609743
    +609751
    +609757
    +609779
    +609781
    +609803
    +609809
    +609821
    +609859
    +609877
    +609887
    +609907
    +609911
    +609913
    +609923
    +609929
    +609979
    +609989
    +609991
    +609997
    +610031
    +610063
    +610081
    +610123
    +610157
    +610163
    +610187
    +610193
    +610199
    +610217
    +610219
    +610229
    +610243
    +610271
    +610279
    +610289
    +610301
    +610327
    +610331
    +610339
    +610391
    +610409
    +610417
    +610429
    +610439
    +610447
    +610457
    +610469
    +610501
    +610523
    +610541
    +610543
    +610553
    +610559
    +610567
    +610579
    +610583
    +610619
    +610633
    +610639
    +610651
    +610661
    +610667
    +610681
    +610699
    +610703
    +610721
    +610733
    +610739
    +610741
    +610763
    +610781
    +610783
    +610787
    +610801
    +610817
    +610823
    +610829
    +610837
    +610843
    +610847
    +610849
    +610867
    +610877
    +610879
    +610891
    +610913
    +610919
    +610921
    +610933
    +610957
    +610969
    +610993
    +611011
    +611027
    +611033
    +611057
    +611069
    +611071
    +611081
    +611101
    +611111
    +611113
    +611131
    +611137
    +611147
    +611189
    +611207
    +611213
    +611257
    +611263
    +611279
    +611293
    +611297
    +611323
    +611333
    +611389
    +611393
    +611411
    +611419
    +611441
    +611449
    +611453
    +611459
    +611467
    +611483
    +611497
    +611531
    +611543
    +611549
    +611551
    +611557
    +611561
    +611587
    +611603
    +611621
    +611641
    +611657
    +611671
    +611693
    +611707
    +611729
    +611753
    +611791
    +611801
    +611803
    +611827
    +611833
    +611837
    +611839
    +611873
    +611879
    +611887
    +611903
    +611921
    +611927
    +611939
    +611951
    +611953
    +611957
    +611969
    +611977
    +611993
    +611999
    +612011
    +612023
    +612037
    +612041
    +612043
    +612049
    +612061
    +612067
    +612071
    +612083
    +612107
    +612109
    +612113
    +612133
    +612137
    +612149
    +612169
    +612173
    +612181
    +612193
    +612217
    +612223
    +612229
    +612259
    +612263
    +612301
    +612307
    +612317
    +612319
    +612331
    +612341
    +612349
    +612371
    +612373
    +612377
    +612383
    +612401
    +612407
    +612439
    +612481
    +612497
    +612511
    +612553
    +612583
    +612589
    +612611
    +612613
    +612637
    +612643
    +612649
    +612671
    +612679
    +612713
    +612719
    +612727
    +612737
    +612751
    +612763
    +612791
    +612797
    +612809
    +612811
    +612817
    +612823
    +612841
    +612847
    +612853
    +612869
    +612877
    +612889
    +612923
    +612929
    +612947
    +612967
    +612971
    +612977
    +613007
    +613009
    +613013
    +613049
    +613061
    +613097
    +613099
    +613141
    +613153
    +613163
    +613169
    +613177
    +613181
    +613189
    +613199
    +613213
    +613219
    +613229
    +613231
    +613243
    +613247
    +613253
    +613267
    +613279
    +613289
    +613297
    +613337
    +613357
    +613363
    +613367
    +613381
    +613421
    +613427
    +613439
    +613441
    +613447
    +613451
    +613463
    +613469
    +613471
    +613493
    +613499
    +613507
    +613523
    +613549
    +613559
    +613573
    +613577
    +613597
    +613607
    +613609
    +613633
    +613637
    +613651
    +613661
    +613667
    +613673
    +613699
    +613733
    +613741
    +613747
    +613759
    +613763
    +613807
    +613813
    +613817
    +613829
    +613841
    +613849
    +613861
    +613883
    +613889
    +613903
    +613957
    +613967
    +613969
    +613981
    +613993
    +613999
    +614041
    +614051
    +614063
    +614071
    +614093
    +614101
    +614113
    +614129
    +614143
    +614147
    +614153
    +614167
    +614177
    +614179
    +614183
    +614219
    +614267
    +614279
    +614291
    +614293
    +614297
    +614321
    +614333
    +614377
    +614387
    +614413
    +614417
    +614437
    +614477
    +614483
    +614503
    +614527
    +614531
    +614543
    +614561
    +614563
    +614569
    +614609
    +614611
    +614617
    +614623
    +614633
    +614639
    +614657
    +614659
    +614671
    +614683
    +614687
    +614693
    +614701
    +614717
    +614729
    +614741
    +614743
    +614749
    +614753
    +614759
    +614773
    +614827
    +614843
    +614849
    +614851
    +614863
    +614881
    +614893
    +614909
    +614917
    +614927
    +614963
    +614981
    +614983
    +615019
    +615031
    +615047
    +615053
    +615067
    +615101
    +615103
    +615107
    +615137
    +615151
    +615161
    +615187
    +615229
    +615233
    +615253
    +615259
    +615269
    +615289
    +615299
    +615313
    +615337
    +615341
    +615343
    +615367
    +615379
    +615389
    +615401
    +615403
    +615413
    +615427
    +615431
    +615437
    +615449
    +615473
    +615479
    +615491
    +615493
    +615497
    +615509
    +615521
    +615539
    +615557
    +615577
    +615599
    +615607
    +615617
    +615623
    +615661
    +615677
    +615679
    +615709
    +615721
    +615731
    +615739
    +615743
    +615749
    +615751
    +615761
    +615767
    +615773
    +615793
    +615799
    +615821
    +615827
    +615829
    +615833
    +615869
    +615883
    +615887
    +615907
    +615919
    +615941
    +615949
    +615971
    +615997
    +616003
    +616027
    +616051
    +616069
    +616073
    +616079
    +616103
    +616111
    +616117
    +616129
    +616139
    +616141
    +616153
    +616157
    +616169
    +616171
    +616181
    +616207
    +616211
    +616219
    +616223
    +616229
    +616243
    +616261
    +616277
    +616289
    +616307
    +616313
    +616321
    +616327
    +616361
    +616367
    +616387
    +616391
    +616393
    +616409
    +616411
    +616433
    +616439
    +616459
    +616463
    +616481
    +616489
    +616501
    +616507
    +616513
    +616519
    +616523
    +616529
    +616537
    +616547
    +616579
    +616589
    +616597
    +616639
    +616643
    +616669
    +616673
    +616703
    +616717
    +616723
    +616729
    +616741
    +616757
    +616769
    +616783
    +616787
    +616789
    +616793
    +616799
    +616829
    +616841
    +616843
    +616849
    +616871
    +616877
    +616897
    +616909
    +616933
    +616943
    +616951
    +616961
    +616991
    +616997
    +616999
    +617011
    +617027
    +617039
    +617051
    +617053
    +617059
    +617077
    +617087
    +617107
    +617119
    +617129
    +617131
    +617147
    +617153
    +617161
    +617189
    +617191
    +617231
    +617233
    +617237
    +617249
    +617257
    +617269
    +617273
    +617293
    +617311
    +617327
    +617333
    +617339
    +617341
    +617359
    +617363
    +617369
    +617387
    +617401
    +617411
    +617429
    +617447
    +617453
    +617467
    +617471
    +617473
    +617479
    +617509
    +617521
    +617531
    +617537
    +617579
    +617587
    +617647
    +617651
    +617657
    +617677
    +617681
    +617689
    +617693
    +617699
    +617707
    +617717
    +617719
    +617723
    +617731
    +617759
    +617761
    +617767
    +617777
    +617791
    +617801
    +617809
    +617819
    +617843
    +617857
    +617873
    +617879
    +617887
    +617917
    +617951
    +617959
    +617963
    +617971
    +617983
    +618029
    +618031
    +618041
    +618049
    +618053
    +618083
    +618119
    +618131
    +618161
    +618173
    +618199
    +618227
    +618229
    +618253
    +618257
    +618269
    +618271
    +618287
    +618301
    +618311
    +618323
    +618329
    +618337
    +618347
    +618349
    +618361
    +618377
    +618407
    +618413
    +618421
    +618437
    +618439
    +618463
    +618509
    +618521
    +618547
    +618559
    +618571
    +618577
    +618581
    +618587
    +618589
    +618593
    +618619
    +618637
    +618643
    +618671
    +618679
    +618703
    +618707
    +618719
    +618799
    +618823
    +618833
    +618841
    +618847
    +618857
    +618859
    +618869
    +618883
    +618913
    +618929
    +618941
    +618971
    +618979
    +618991
    +618997
    +619007
    +619009
    +619019
    +619027
    +619033
    +619057
    +619061
    +619067
    +619079
    +619111
    +619117
    +619139
    +619159
    +619169
    +619181
    +619187
    +619189
    +619207
    +619247
    +619253
    +619261
    +619273
    +619277
    +619279
    +619303
    +619309
    +619313
    +619331
    +619363
    +619373
    +619391
    +619397
    +619471
    +619477
    +619511
    +619537
    +619543
    +619561
    +619573
    +619583
    +619589
    +619603
    +619607
    +619613
    +619621
    +619657
    +619669
    +619681
    +619687
    +619693
    +619711
    +619739
    +619741
    +619753
    +619763
    +619771
    +619793
    +619807
    +619811
    +619813
    +619819
    +619831
    +619841
    +619849
    +619867
    +619897
    +619909
    +619921
    +619967
    +619979
    +619981
    +619987
    +619999
    +620003
    +620029
    +620033
    +620051
    +620099
    +620111
    +620117
    +620159
    +620161
    +620171
    +620183
    +620197
    +620201
    +620227
    +620233
    +620237
    +620239
    +620251
    +620261
    +620297
    +620303
    +620311
    +620317
    +620329
    +620351
    +620359
    +620363
    +620377
    +620383
    +620393
    +620401
    +620413
    +620429
    +620437
    +620441
    +620461
    +620467
    +620491
    +620507
    +620519
    +620531
    +620549
    +620561
    +620567
    +620569
    +620579
    +620603
    +620623
    +620639
    +620647
    +620657
    +620663
    +620671
    +620689
    +620693
    +620717
    +620731
    +620743
    +620759
    +620771
    +620773
    +620777
    +620813
    +620821
    +620827
    +620831
    +620849
    +620869
    +620887
    +620909
    +620911
    +620929
    +620933
    +620947
    +620957
    +620981
    +620999
    +621007
    +621013
    +621017
    +621029
    +621031
    +621043
    +621059
    +621083
    +621097
    +621113
    +621133
    +621139
    +621143
    +621217
    +621223
    +621227
    +621239
    +621241
    +621259
    +621289
    +621301
    +621317
    +621337
    +621343
    +621347
    +621353
    +621359
    +621371
    +621389
    +621419
    +621427
    +621431
    +621443
    +621451
    +621461
    +621473
    +621521
    +621527
    +621541
    +621583
    +621611
    +621617
    +621619
    +621629
    +621631
    +621641
    +621671
    +621679
    +621697
    +621701
    +621703
    +621721
    +621739
    +621749
    +621757
    +621769
    +621779
    +621799
    +621821
    +621833
    +621869
    +621871
    +621883
    +621893
    +621913
    +621923
    +621937
    +621941
    +621983
    +621997
    +622009
    +622019
    +622043
    +622049
    +622051
    +622067
    +622073
    +622091
    +622103
    +622109
    +622123
    +622129
    +622133
    +622151
    +622157
    +622159
    +622177
    +622187
    +622189
    +622241
    +622243
    +622247
    +622249
    +622277
    +622301
    +622313
    +622331
    +622333
    +622337
    +622351
    +622367
    +622397
    +622399
    +622423
    +622477
    +622481
    +622483
    +622493
    +622513
    +622519
    +622529
    +622547
    +622549
    +622561
    +622571
    +622577
    +622603
    +622607
    +622613
    +622619
    +622621
    +622637
    +622639
    +622663
    +622669
    +622709
    +622723
    +622729
    +622751
    +622777
    +622781
    +622793
    +622813
    +622849
    +622861
    +622879
    +622889
    +622901
    +622927
    +622943
    +622957
    +622967
    +622987
    +622997
    +623003
    +623009
    +623017
    +623023
    +623041
    +623057
    +623059
    +623071
    +623107
    +623171
    +623209
    +623221
    +623261
    +623263
    +623269
    +623279
    +623281
    +623291
    +623299
    +623303
    +623321
    +623327
    +623341
    +623351
    +623353
    +623383
    +623387
    +623393
    +623401
    +623417
    +623423
    +623431
    +623437
    +623477
    +623521
    +623531
    +623537
    +623563
    +623591
    +623617
    +623621
    +623633
    +623641
    +623653
    +623669
    +623671
    +623677
    +623681
    +623683
    +623699
    +623717
    +623719
    +623723
    +623729
    +623743
    +623759
    +623767
    +623771
    +623803
    +623839
    +623851
    +623867
    +623869
    +623879
    +623881
    +623893
    +623923
    +623929
    +623933
    +623947
    +623957
    +623963
    +623977
    +623983
    +623989
    +624007
    +624031
    +624037
    +624047
    +624049
    +624067
    +624089
    +624097
    +624119
    +624133
    +624139
    +624149
    +624163
    +624191
    +624199
    +624203
    +624209
    +624229
    +624233
    +624241
    +624251
    +624259
    +624271
    +624277
    +624311
    +624313
    +624319
    +624329
    +624331
    +624347
    +624391
    +624401
    +624419
    +624443
    +624451
    +624467
    +624469
    +624479
    +624487
    +624497
    +624509
    +624517
    +624521
    +624539
    +624541
    +624577
    +624593
    +624599
    +624601
    +624607
    +624643
    +624649
    +624667
    +624683
    +624707
    +624709
    +624721
    +624727
    +624731
    +624737
    +624763
    +624769
    +624787
    +624791
    +624797
    +624803
    +624809
    +624829
    +624839
    +624847
    +624851
    +624859
    +624917
    +624961
    +624973
    +624977
    +624983
    +624997
    +625007
    +625033
    +625057
    +625063
    +625087
    +625103
    +625109
    +625111
    +625129
    +625133
    +625169
    +625171
    +625181
    +625187
    +625199
    +625213
    +625231
    +625237
    +625253
    +625267
    +625279
    +625283
    +625307
    +625319
    +625343
    +625351
    +625367
    +625369
    +625397
    +625409
    +625451
    +625477
    +625483
    +625489
    +625507
    +625517
    +625529
    +625543
    +625589
    +625591
    +625609
    +625621
    +625627
    +625631
    +625637
    +625643
    +625657
    +625661
    +625663
    +625697
    +625699
    +625763
    +625777
    +625789
    +625811
    +625819
    +625831
    +625837
    +625861
    +625871
    +625883
    +625909
    +625913
    +625927
    +625939
    +625943
    +625969
    +625979
    +625997
    +626009
    +626011
    +626033
    +626051
    +626063
    +626113
    +626117
    +626147
    +626159
    +626173
    +626177
    +626189
    +626191
    +626201
    +626207
    +626239
    +626251
    +626261
    +626317
    +626323
    +626333
    +626341
    +626347
    +626363
    +626377
    +626389
    +626393
    +626443
    +626477
    +626489
    +626519
    +626533
    +626539
    +626581
    +626597
    +626599
    +626609
    +626611
    +626617
    +626621
    +626623
    +626627
    +626629
    +626663
    +626683
    +626687
    +626693
    +626701
    +626711
    +626713
    +626723
    +626741
    +626749
    +626761
    +626771
    +626783
    +626797
    +626809
    +626833
    +626837
    +626861
    +626887
    +626917
    +626921
    +626929
    +626947
    +626953
    +626959
    +626963
    +626987
    +627017
    +627041
    +627059
    +627071
    +627073
    +627083
    +627089
    +627091
    +627101
    +627119
    +627131
    +627139
    +627163
    +627169
    +627191
    +627197
    +627217
    +627227
    +627251
    +627257
    +627269
    +627271
    +627293
    +627301
    +627329
    +627349
    +627353
    +627377
    +627379
    +627383
    +627391
    +627433
    +627449
    +627479
    +627481
    +627491
    +627511
    +627541
    +627547
    +627559
    +627593
    +627611
    +627617
    +627619
    +627637
    +627643
    +627659
    +627661
    +627667
    +627673
    +627709
    +627721
    +627733
    +627749
    +627773
    +627787
    +627791
    +627797
    +627799
    +627811
    +627841
    +627859
    +627901
    +627911
    +627919
    +627943
    +627947
    +627953
    +627961
    +627973
    +628013
    +628021
    +628037
    +628049
    +628051
    +628057
    +628063
    +628093
    +628097
    +628127
    +628139
    +628171
    +628183
    +628189
    +628193
    +628207
    +628213
    +628217
    +628219
    +628231
    +628261
    +628267
    +628289
    +628301
    +628319
    +628357
    +628363
    +628373
    +628379
    +628391
    +628399
    +628423
    +628427
    +628447
    +628477
    +628487
    +628493
    +628499
    +628547
    +628561
    +628583
    +628591
    +628651
    +628673
    +628679
    +628681
    +628687
    +628699
    +628709
    +628721
    +628753
    +628757
    +628759
    +628781
    +628783
    +628787
    +628799
    +628801
    +628811
    +628819
    +628841
    +628861
    +628877
    +628909
    +628913
    +628921
    +628937
    +628939
    +628973
    +628993
    +628997
    +629003
    +629009
    +629011
    +629023
    +629029
    +629059
    +629081
    +629113
    +629137
    +629143
    +629171
    +629177
    +629203
    +629243
    +629249
    +629263
    +629281
    +629311
    +629339
    +629341
    +629351
    +629371
    +629381
    +629383
    +629401
    +629411
    +629417
    +629429
    +629449
    +629467
    +629483
    +629491
    +629509
    +629513
    +629537
    +629567
    +629569
    +629591
    +629593
    +629609
    +629611
    +629617
    +629623
    +629653
    +629683
    +629687
    +629689
    +629701
    +629711
    +629723
    +629737
    +629743
    +629747
    +629767
    +629773
    +629779
    +629803
    +629807
    +629819
    +629843
    +629857
    +629861
    +629873
    +629891
    +629897
    +629899
    +629903
    +629921
    +629927
    +629929
    +629939
    +629963
    +629977
    +629987
    +629989
    +630017
    +630023
    +630029
    +630043
    +630067
    +630101
    +630107
    +630127
    +630151
    +630163
    +630167
    +630169
    +630181
    +630193
    +630197
    +630229
    +630247
    +630263
    +630281
    +630299
    +630307
    +630319
    +630349
    +630353
    +630391
    +630433
    +630451
    +630467
    +630473
    +630481
    +630493
    +630521
    +630523
    +630529
    +630559
    +630577
    +630583
    +630587
    +630589
    +630593
    +630607
    +630613
    +630659
    +630677
    +630689
    +630701
    +630709
    +630713
    +630719
    +630733
    +630737
    +630797
    +630803
    +630823
    +630827
    +630841
    +630863
    +630871
    +630893
    +630899
    +630901
    +630907
    +630911
    +630919
    +630941
    +630967
    +630997
    +631003
    +631013
    +631039
    +631061
    +631121
    +631133
    +631139
    +631151
    +631153
    +631157
    +631171
    +631181
    +631187
    +631223
    +631229
    +631247
    +631249
    +631259
    +631271
    +631273
    +631291
    +631307
    +631339
    +631357
    +631361
    +631387
    +631391
    +631399
    +631409
    +631429
    +631453
    +631457
    +631459
    +631469
    +631471
    +631483
    +631487
    +631507
    +631513
    +631529
    +631531
    +631537
    +631549
    +631559
    +631573
    +631577
    +631583
    +631597
    +631613
    +631619
    +631643
    +631667
    +631679
    +631681
    +631711
    +631717
    +631723
    +631733
    +631739
    +631751
    +631753
    +631789
    +631817
    +631819
    +631843
    +631847
    +631853
    +631859
    +631861
    +631867
    +631889
    +631901
    +631903
    +631913
    +631927
    +631931
    +631937
    +631979
    +631987
    +631991
    +631993
    +632029
    +632041
    +632053
    +632081
    +632083
    +632087
    +632089
    +632101
    +632117
    +632123
    +632141
    +632147
    +632153
    +632189
    +632209
    +632221
    +632227
    +632231
    +632251
    +632257
    +632267
    +632273
    +632297
    +632299
    +632321
    +632323
    +632327
    +632329
    +632347
    +632351
    +632353
    +632363
    +632371
    +632381
    +632389
    +632393
    +632447
    +632459
    +632473
    +632483
    +632497
    +632501
    +632503
    +632521
    +632557
    +632561
    +632591
    +632609
    +632623
    +632627
    +632629
    +632647
    +632669
    +632677
    +632683
    +632699
    +632713
    +632717
    +632743
    +632747
    +632773
    +632777
    +632813
    +632839
    +632843
    +632851
    +632857
    +632881
    +632897
    +632911
    +632923
    +632939
    +632941
    +632971
    +632977
    +632987
    +632993
    +633001
    +633013
    +633037
    +633053
    +633067
    +633079
    +633091
    +633133
    +633151
    +633161
    +633187
    +633197
    +633209
    +633221
    +633253
    +633257
    +633263
    +633271
    +633287
    +633307
    +633317
    +633337
    +633359
    +633377
    +633379
    +633383
    +633401
    +633407
    +633427
    +633449
    +633461
    +633463
    +633467
    +633469
    +633473
    +633487
    +633497
    +633559
    +633569
    +633571
    +633583
    +633599
    +633613
    +633623
    +633629
    +633649
    +633653
    +633667
    +633739
    +633751
    +633757
    +633767
    +633781
    +633791
    +633793
    +633797
    +633799
    +633803
    +633823
    +633833
    +633877
    +633883
    +633923
    +633931
    +633937
    +633943
    +633953
    +633961
    +633967
    +633991
    +634003
    +634013
    +634031
    +634061
    +634079
    +634091
    +634097
    +634103
    +634141
    +634157
    +634159
    +634169
    +634177
    +634181
    +634187
    +634199
    +634211
    +634223
    +634237
    +634241
    +634247
    +634261
    +634267
    +634273
    +634279
    +634301
    +634307
    +634313
    +634327
    +634331
    +634343
    +634367
    +634373
    +634397
    +634421
    +634441
    +634471
    +634483
    +634493
    +634499
    +634511
    +634519
    +634523
    +634531
    +634541
    +634567
    +634573
    +634577
    +634597
    +634603
    +634609
    +634643
    +634649
    +634651
    +634679
    +634681
    +634687
    +634703
    +634709
    +634717
    +634727
    +634741
    +634747
    +634757
    +634759
    +634793
    +634807
    +634817
    +634841
    +634853
    +634859
    +634861
    +634871
    +634891
    +634901
    +634903
    +634927
    +634937
    +634939
    +634943
    +634969
    +634979
    +635003
    +635021
    +635039
    +635051
    +635057
    +635087
    +635119
    +635147
    +635149
    +635197
    +635203
    +635207
    +635249
    +635251
    +635263
    +635267
    +635279
    +635287
    +635291
    +635293
    +635309
    +635317
    +635333
    +635339
    +635347
    +635351
    +635353
    +635359
    +635363
    +635387
    +635389
    +635413
    +635423
    +635431
    +635441
    +635449
    +635461
    +635471
    +635483
    +635507
    +635519
    +635527
    +635533
    +635563
    +635567
    +635599
    +635603
    +635617
    +635639
    +635653
    +635659
    +635689
    +635707
    +635711
    +635729
    +635731
    +635737
    +635777
    +635801
    +635809
    +635813
    +635821
    +635837
    +635849
    +635867
    +635879
    +635891
    +635893
    +635909
    +635917
    +635923
    +635939
    +635959
    +635969
    +635977
    +635981
    +635983
    +635989
    +636017
    +636023
    +636043
    +636059
    +636061
    +636071
    +636073
    +636107
    +636109
    +636133
    +636137
    +636149
    +636193
    +636211
    +636217
    +636241
    +636247
    +636257
    +636263
    +636277
    +636283
    +636287
    +636301
    +636313
    +636319
    +636331
    +636343
    +636353
    +636359
    +636403
    +636407
    +636409
    +636421
    +636469
    +636473
    +636499
    +636533
    +636539
    +636541
    +636547
    +636553
    +636563
    +636569
    +636613
    +636619
    +636631
    +636653
    +636673
    +636697
    +636719
    +636721
    +636731
    +636739
    +636749
    +636761
    +636763
    +636773
    +636781
    +636809
    +636817
    +636821
    +636829
    +636851
    +636863
    +636877
    +636917
    +636919
    +636931
    +636947
    +636953
    +636967
    +636983
    +636997
    +637001
    +637003
    +637067
    +637073
    +637079
    +637097
    +637129
    +637139
    +637157
    +637163
    +637171
    +637199
    +637201
    +637229
    +637243
    +637271
    +637277
    +637283
    +637291
    +637297
    +637309
    +637319
    +637321
    +637327
    +637337
    +637339
    +637349
    +637369
    +637379
    +637409
    +637421
    +637423
    +637447
    +637459
    +637463
    +637471
    +637489
    +637499
    +637513
    +637519
    +637529
    +637531
    +637543
    +637573
    +637597
    +637601
    +637603
    +637607
    +637627
    +637657
    +637669
    +637691
    +637699
    +637709
    +637711
    +637717
    +637723
    +637727
    +637729
    +637751
    +637771
    +637781
    +637783
    +637787
    +637817
    +637829
    +637831
    +637841
    +637873
    +637883
    +637909
    +637933
    +637937
    +637939
    +638023
    +638047
    +638051
    +638059
    +638063
    +638081
    +638117
    +638123
    +638147
    +638159
    +638161
    +638171
    +638177
    +638179
    +638201
    +638233
    +638263
    +638269
    +638303
    +638317
    +638327
    +638347
    +638359
    +638371
    +638423
    +638431
    +638437
    +638453
    +638459
    +638467
    +638489
    +638501
    +638527
    +638567
    +638581
    +638587
    +638621
    +638629
    +638633
    +638663
    +638669
    +638689
    +638699
    +638717
    +638719
    +638767
    +638801
    +638819
    +638839
    +638857
    +638861
    +638893
    +638923
    +638933
    +638959
    +638971
    +638977
    +638993
    +638999
    +639007
    +639011
    +639043
    +639049
    +639053
    +639083
    +639091
    +639137
    +639143
    +639151
    +639157
    +639167
    +639169
    +639181
    +639211
    +639253
    +639257
    +639259
    +639263
    +639269
    +639299
    +639307
    +639311
    +639329
    +639337
    +639361
    +639371
    +639391
    +639433
    +639439
    +639451
    +639487
    +639491
    +639493
    +639511
    +639517
    +639533
    +639547
    +639563
    +639571
    +639577
    +639589
    +639599
    +639601
    +639631
    +639637
    +639647
    +639671
    +639677
    +639679
    +639689
    +639697
    +639701
    +639703
    +639713
    +639719
    +639731
    +639739
    +639757
    +639833
    +639839
    +639851
    +639853
    +639857
    +639907
    +639911
    +639937
    +639941
    +639949
    +639959
    +639983
    +639997
    +640007
    +640009
    +640019
    +640027
    +640039
    +640043
    +640049
    +640061
    +640069
    +640099
    +640109
    +640121
    +640127
    +640139
    +640151
    +640153
    +640163
    +640193
    +640219
    +640223
    +640229
    +640231
    +640247
    +640249
    +640259
    +640261
    +640267
    +640279
    +640303
    +640307
    +640333
    +640363
    +640369
    +640411
    +640421
    +640457
    +640463
    +640477
    +640483
    +640499
    +640529
    +640531
    +640579
    +640583
    +640589
    +640613
    +640621
    +640631
    +640649
    +640663
    +640667
    +640669
    +640687
    +640691
    +640727
    +640733
    +640741
    +640771
    +640777
    +640793
    +640837
    +640847
    +640853
    +640859
    +640873
    +640891
    +640901
    +640907
    +640919
    +640933
    +640943
    +640949
    +640957
    +640963
    +640967
    +640973
    +640993
    +641051
    +641057
    +641077
    +641083
    +641089
    +641093
    +641101
    +641129
    +641131
    +641143
    +641167
    +641197
    +641203
    +641213
    +641227
    +641239
    +641261
    +641279
    +641287
    +641299
    +641317
    +641327
    +641371
    +641387
    +641411
    +641413
    +641419
    +641437
    +641441
    +641453
    +641467
    +641471
    +641479
    +641491
    +641513
    +641519
    +641521
    +641549
    +641551
    +641579
    +641581
    +641623
    +641633
    +641639
    +641681
    +641701
    +641713
    +641747
    +641749
    +641761
    +641789
    +641791
    +641803
    +641813
    +641819
    +641821
    +641827
    +641833
    +641843
    +641863
    +641867
    +641873
    +641881
    +641891
    +641897
    +641909
    +641923
    +641929
    +641959
    +641969
    +641981
    +642011
    +642013
    +642049
    +642071
    +642077
    +642079
    +642113
    +642121
    +642133
    +642149
    +642151
    +642157
    +642163
    +642197
    +642199
    +642211
    +642217
    +642223
    +642233
    +642241
    +642247
    +642253
    +642281
    +642359
    +642361
    +642373
    +642403
    +642407
    +642419
    +642427
    +642457
    +642487
    +642517
    +642527
    +642529
    +642533
    +642547
    +642557
    +642563
    +642581
    +642613
    +642623
    +642673
    +642683
    +642701
    +642737
    +642739
    +642769
    +642779
    +642791
    +642797
    +642799
    +642809
    +642833
    +642853
    +642869
    +642871
    +642877
    +642881
    +642899
    +642907
    +642931
    +642937
    +642947
    +642953
    +642973
    +642977
    +642997
    +643009
    +643021
    +643031
    +643039
    +643043
    +643051
    +643061
    +643073
    +643081
    +643087
    +643099
    +643121
    +643129
    +643183
    +643187
    +643199
    +643213
    +643217
    +643231
    +643243
    +643273
    +643301
    +643303
    +643369
    +643373
    +643403
    +643421
    +643429
    +643439
    +643453
    +643457
    +643463
    +643469
    +643493
    +643507
    +643523
    +643547
    +643553
    +643567
    +643583
    +643589
    +643619
    +643633
    +643639
    +643649
    +643651
    +643661
    +643681
    +643691
    +643693
    +643697
    +643703
    +643723
    +643729
    +643751
    +643781
    +643847
    +643849
    +643859
    +643873
    +643879
    +643883
    +643889
    +643919
    +643927
    +643949
    +643957
    +643961
    +643969
    +643991
    +644009
    +644029
    +644047
    +644051
    +644053
    +644057
    +644089
    +644101
    +644107
    +644117
    +644123
    +644129
    +644131
    +644141
    +644143
    +644153
    +644159
    +644173
    +644191
    +644197
    +644201
    +644227
    +644239
    +644257
    +644261
    +644291
    +644297
    +644327
    +644341
    +644353
    +644359
    +644363
    +644377
    +644381
    +644383
    +644401
    +644411
    +644431
    +644443
    +644447
    +644489
    +644491
    +644507
    +644513
    +644519
    +644531
    +644549
    +644557
    +644563
    +644569
    +644593
    +644597
    +644599
    +644617
    +644629
    +644647
    +644653
    +644669
    +644671
    +644687
    +644701
    +644717
    +644729
    +644731
    +644747
    +644753
    +644767
    +644783
    +644789
    +644797
    +644801
    +644837
    +644843
    +644857
    +644863
    +644867
    +644869
    +644881
    +644899
    +644909
    +644911
    +644923
    +644933
    +644951
    +644977
    +644999
    +645011
    +645013
    +645019
    +645023
    +645037
    +645041
    +645049
    +645067
    +645077
    +645083
    +645091
    +645097
    +645131
    +645137
    +645149
    +645179
    +645187
    +645233
    +645257
    +645313
    +645329
    +645347
    +645353
    +645367
    +645383
    +645397
    +645409
    +645419
    +645431
    +645433
    +645443
    +645467
    +645481
    +645493
    +645497
    +645499
    +645503
    +645521
    +645527
    +645529
    +645571
    +645577
    +645581
    +645583
    +645599
    +645611
    +645629
    +645641
    +645647
    +645649
    +645661
    +645683
    +645691
    +645703
    +645713
    +645727
    +645737
    +645739
    +645751
    +645763
    +645787
    +645803
    +645833
    +645839
    +645851
    +645857
    +645877
    +645889
    +645893
    +645901
    +645907
    +645937
    +645941
    +645973
    +645979
    +646003
    +646013
    +646027
    +646039
    +646067
    +646073
    +646099
    +646103
    +646147
    +646157
    +646159
    +646169
    +646181
    +646183
    +646189
    +646193
    +646199
    +646237
    +646253
    +646259
    +646267
    +646271
    +646273
    +646291
    +646301
    +646307
    +646309
    +646339
    +646379
    +646397
    +646403
    +646411
    +646421
    +646423
    +646433
    +646453
    +646519
    +646523
    +646537
    +646543
    +646549
    +646571
    +646573
    +646577
    +646609
    +646619
    +646631
    +646637
    +646643
    +646669
    +646687
    +646721
    +646757
    +646771
    +646781
    +646823
    +646831
    +646837
    +646843
    +646859
    +646873
    +646879
    +646883
    +646889
    +646897
    +646909
    +646913
    +646927
    +646937
    +646957
    +646979
    +646981
    +646991
    +646993
    +647011
    +647033
    +647039
    +647047
    +647057
    +647069
    +647081
    +647099
    +647111
    +647113
    +647117
    +647131
    +647147
    +647161
    +647189
    +647201
    +647209
    +647219
    +647261
    +647263
    +647293
    +647303
    +647321
    +647327
    +647333
    +647341
    +647357
    +647359
    +647363
    +647371
    +647399
    +647401
    +647417
    +647429
    +647441
    +647453
    +647477
    +647489
    +647503
    +647509
    +647527
    +647531
    +647551
    +647557
    +647579
    +647587
    +647593
    +647609
    +647617
    +647627
    +647641
    +647651
    +647659
    +647663
    +647687
    +647693
    +647719
    +647723
    +647741
    +647743
    +647747
    +647753
    +647771
    +647783
    +647789
    +647809
    +647821
    +647837
    +647839
    +647851
    +647861
    +647891
    +647893
    +647909
    +647917
    +647951
    +647953
    +647963
    +647987
    +648007
    +648019
    +648029
    +648041
    +648047
    +648059
    +648061
    +648073
    +648079
    +648097
    +648101
    +648107
    +648119
    +648133
    +648173
    +648181
    +648191
    +648199
    +648211
    +648217
    +648229
    +648239
    +648257
    +648259
    +648269
    +648283
    +648289
    +648293
    +648317
    +648331
    +648341
    +648343
    +648371
    +648377
    +648379
    +648383
    +648391
    +648433
    +648437
    +648449
    +648481
    +648509
    +648563
    +648607
    +648617
    +648619
    +648629
    +648631
    +648649
    +648653
    +648671
    +648677
    +648689
    +648709
    +648719
    +648731
    +648763
    +648779
    +648803
    +648841
    +648859
    +648863
    +648871
    +648887
    +648889
    +648911
    +648917
    +648931
    +648937
    +648953
    +648961
    +648971
    +648997
    +649001
    +649007
    +649039
    +649063
    +649069
    +649073
    +649079
    +649081
    +649087
    +649093
    +649123
    +649141
    +649147
    +649151
    +649157
    +649183
    +649217
    +649261
    +649273
    +649277
    +649279
    +649283
    +649291
    +649307
    +649321
    +649361
    +649379
    +649381
    +649403
    +649421
    +649423
    +649427
    +649457
    +649469
    +649471
    +649483
    +649487
    +649499
    +649501
    +649507
    +649511
    +649529
    +649541
    +649559
    +649567
    +649573
    +649577
    +649613
    +649619
    +649631
    +649633
    +649639
    +649643
    +649651
    +649657
    +649661
    +649697
    +649709
    +649717
    +649739
    +649751
    +649769
    +649771
    +649777
    +649783
    +649787
    +649793
    +649799
    +649801
    +649813
    +649829
    +649843
    +649849
    +649867
    +649871
    +649877
    +649879
    +649897
    +649907
    +649921
    +649937
    +649969
    +649981
    +649991
    +650011
    +650017
    +650059
    +650071
    +650081
    +650099
    +650107
    +650179
    +650183
    +650189
    +650213
    +650227
    +650261
    +650269
    +650281
    +650291
    +650317
    +650327
    +650329
    +650347
    +650359
    +650387
    +650401
    +650413
    +650449
    +650477
    +650479
    +650483
    +650519
    +650537
    +650543
    +650549
    +650563
    +650567
    +650581
    +650591
    +650599
    +650609
    +650623
    +650627
    +650669
    +650701
    +650759
    +650761
    +650779
    +650813
    +650821
    +650827
    +650833
    +650851
    +650861
    +650863
    +650869
    +650873
    +650911
    +650917
    +650927
    +650933
    +650953
    +650971
    +650987
    +651017
    +651019
    +651029
    +651043
    +651067
    +651071
    +651097
    +651103
    +651109
    +651127
    +651139
    +651143
    +651169
    +651179
    +651181
    +651191
    +651193
    +651221
    +651223
    +651239
    +651247
    +651251
    +651257
    +651271
    +651281
    +651289
    +651293
    +651323
    +651331
    +651347
    +651361
    +651397
    +651401
    +651437
    +651439
    +651461
    +651473
    +651481
    +651487
    +651503
    +651509
    +651517
    +651587
    +651617
    +651641
    +651647
    +651649
    +651667
    +651683
    +651689
    +651697
    +651727
    +651731
    +651733
    +651767
    +651769
    +651793
    +651803
    +651809
    +651811
    +651821
    +651839
    +651841
    +651853
    +651857
    +651863
    +651869
    +651877
    +651881
    +651901
    +651913
    +651943
    +651971
    +651997
    +652019
    +652033
    +652039
    +652063
    +652079
    +652081
    +652087
    +652117
    +652121
    +652153
    +652189
    +652207
    +652217
    +652229
    +652237
    +652241
    +652243
    +652261
    +652279
    +652283
    +652291
    +652319
    +652321
    +652331
    +652339
    +652343
    +652357
    +652361
    +652369
    +652373
    +652381
    +652411
    +652417
    +652429
    +652447
    +652451
    +652453
    +652493
    +652499
    +652507
    +652541
    +652543
    +652549
    +652559
    +652567
    +652573
    +652577
    +652591
    +652601
    +652607
    +652609
    +652621
    +652627
    +652651
    +652657
    +652667
    +652699
    +652723
    +652727
    +652733
    +652739
    +652741
    +652747
    +652753
    +652759
    +652787
    +652811
    +652831
    +652837
    +652849
    +652853
    +652871
    +652903
    +652909
    +652913
    +652921
    +652931
    +652933
    +652937
    +652943
    +652957
    +652969
    +652991
    +652997
    +652999
    +653033
    +653057
    +653083
    +653111
    +653113
    +653117
    +653143
    +653153
    +653197
    +653203
    +653207
    +653209
    +653243
    +653267
    +653273
    +653281
    +653311
    +653321
    +653339
    +653357
    +653363
    +653431
    +653461
    +653473
    +653491
    +653501
    +653503
    +653507
    +653519
    +653537
    +653539
    +653561
    +653563
    +653579
    +653593
    +653617
    +653621
    +653623
    +653641
    +653647
    +653651
    +653659
    +653687
    +653693
    +653707
    +653711
    +653713
    +653743
    +653749
    +653761
    +653777
    +653789
    +653797
    +653801
    +653819
    +653831
    +653879
    +653881
    +653893
    +653899
    +653903
    +653927
    +653929
    +653941
    +653951
    +653963
    +653969
    +653977
    +653993
    +654001
    +654011
    +654019
    +654023
    +654029
    +654047
    +654053
    +654067
    +654089
    +654107
    +654127
    +654149
    +654161
    +654163
    +654167
    +654169
    +654187
    +654191
    +654209
    +654221
    +654223
    +654229
    +654233
    +654257
    +654293
    +654301
    +654307
    +654323
    +654343
    +654349
    +654371
    +654397
    +654413
    +654421
    +654427
    +654439
    +654491
    +654499
    +654509
    +654527
    +654529
    +654539
    +654541
    +654553
    +654571
    +654587
    +654593
    +654601
    +654611
    +654613
    +654623
    +654629
    +654671
    +654679
    +654697
    +654701
    +654727
    +654739
    +654743
    +654749
    +654767
    +654779
    +654781
    +654799
    +654803
    +654817
    +654821
    +654827
    +654839
    +654853
    +654877
    +654889
    +654917
    +654923
    +654931
    +654943
    +654967
    +654991
    +655001
    +655003
    +655013
    +655021
    +655033
    +655037
    +655043
    +655069
    +655087
    +655103
    +655111
    +655121
    +655157
    +655181
    +655211
    +655219
    +655223
    +655229
    +655241
    +655243
    +655261
    +655267
    +655273
    +655283
    +655289
    +655301
    +655331
    +655337
    +655351
    +655357
    +655373
    +655379
    +655387
    +655399
    +655439
    +655453
    +655471
    +655489
    +655507
    +655511
    +655517
    +655531
    +655541
    +655547
    +655559
    +655561
    +655579
    +655583
    +655597
    +655601
    +655637
    +655643
    +655649
    +655651
    +655657
    +655687
    +655693
    +655717
    +655723
    +655727
    +655757
    +655807
    +655847
    +655849
    +655859
    +655883
    +655901
    +655909
    +655913
    +655927
    +655943
    +655961
    +655987
    +656023
    +656039
    +656063
    +656077
    +656113
    +656119
    +656129
    +656141
    +656147
    +656153
    +656171
    +656221
    +656237
    +656263
    +656267
    +656273
    +656291
    +656297
    +656303
    +656311
    +656321
    +656323
    +656329
    +656333
    +656347
    +656371
    +656377
    +656389
    +656407
    +656423
    +656429
    +656459
    +656471
    +656479
    +656483
    +656519
    +656527
    +656561
    +656587
    +656597
    +656599
    +656603
    +656609
    +656651
    +656657
    +656671
    +656681
    +656683
    +656687
    +656701
    +656707
    +656737
    +656741
    +656749
    +656753
    +656771
    +656783
    +656791
    +656809
    +656819
    +656833
    +656839
    +656891
    +656917
    +656923
    +656939
    +656951
    +656959
    +656977
    +656989
    +656993
    +657017
    +657029
    +657047
    +657049
    +657061
    +657071
    +657079
    +657089
    +657091
    +657113
    +657121
    +657127
    +657131
    +657187
    +657193
    +657197
    +657233
    +657257
    +657269
    +657281
    +657289
    +657299
    +657311
    +657313
    +657323
    +657347
    +657361
    +657383
    +657403
    +657413
    +657431
    +657439
    +657451
    +657469
    +657473
    +657491
    +657493
    +657497
    +657499
    +657523
    +657529
    +657539
    +657557
    +657581
    +657583
    +657589
    +657607
    +657617
    +657649
    +657653
    +657659
    +657661
    +657703
    +657707
    +657719
    +657743
    +657779
    +657793
    +657809
    +657827
    +657841
    +657863
    +657893
    +657911
    +657929
    +657931
    +657947
    +657959
    +657973
    +657983
    +658001
    +658043
    +658051
    +658057
    +658069
    +658079
    +658111
    +658117
    +658123
    +658127
    +658139
    +658153
    +658159
    +658169
    +658187
    +658199
    +658211
    +658219
    +658247
    +658253
    +658261
    +658277
    +658279
    +658303
    +658309
    +658319
    +658321
    +658327
    +658349
    +658351
    +658367
    +658379
    +658391
    +658403
    +658417
    +658433
    +658447
    +658453
    +658477
    +658487
    +658507
    +658547
    +658549
    +658573
    +658579
    +658589
    +658591
    +658601
    +658607
    +658613
    +658633
    +658639
    +658643
    +658649
    +658663
    +658681
    +658703
    +658751
    +658753
    +658783
    +658807
    +658817
    +658831
    +658837
    +658841
    +658871
    +658873
    +658883
    +658897
    +658907
    +658913
    +658919
    +658943
    +658961
    +658963
    +658969
    +658979
    +658991
    +658997
    +659011
    +659023
    +659047
    +659059
    +659063
    +659069
    +659077
    +659101
    +659137
    +659159
    +659171
    +659173
    +659177
    +659189
    +659221
    +659231
    +659237
    +659251
    +659279
    +659299
    +659317
    +659327
    +659333
    +659353
    +659371
    +659419
    +659423
    +659437
    +659453
    +659467
    +659473
    +659497
    +659501
    +659513
    +659521
    +659531
    +659539
    +659563
    +659569
    +659591
    +659597
    +659609
    +659611
    +659621
    +659629
    +659639
    +659653
    +659657
    +659669
    +659671
    +659689
    +659693
    +659713
    +659723
    +659741
    +659759
    +659761
    +659783
    +659819
    +659831
    +659843
    +659849
    +659863
    +659873
    +659881
    +659899
    +659917
    +659941
    +659947
    +659951
    +659963
    +659983
    +659999
    +660001
    +660013
    +660029
    +660047
    +660053
    +660061
    +660067
    +660071
    +660073
    +660097
    +660103
    +660119
    +660131
    +660137
    +660157
    +660167
    +660181
    +660197
    +660199
    +660217
    +660227
    +660241
    +660251
    +660271
    +660277
    +660281
    +660299
    +660329
    +660337
    +660347
    +660349
    +660367
    +660377
    +660379
    +660391
    +660403
    +660409
    +660449
    +660493
    +660503
    +660509
    +660521
    +660529
    +660547
    +660557
    +660559
    +660563
    +660589
    +660593
    +660599
    +660601
    +660607
    +660617
    +660619
    +660643
    +660659
    +660661
    +660683
    +660719
    +660727
    +660731
    +660733
    +660757
    +660769
    +660787
    +660791
    +660799
    +660809
    +660811
    +660817
    +660833
    +660851
    +660853
    +660887
    +660893
    +660899
    +660901
    +660917
    +660923
    +660941
    +660949
    +660973
    +660983
    +661009
    +661019
    +661027
    +661049
    +661061
    +661091
    +661093
    +661097
    +661099
    +661103
    +661109
    +661117
    +661121
    +661139
    +661183
    +661187
    +661189
    +661201
    +661217
    +661231
    +661237
    +661253
    +661259
    +661267
    +661321
    +661327
    +661343
    +661361
    +661373
    +661393
    +661417
    +661421
    +661439
    +661459
    +661477
    +661481
    +661483
    +661513
    +661517
    +661541
    +661547
    +661553
    +661603
    +661607
    +661613
    +661621
    +661663
    +661673
    +661679
    +661697
    +661721
    +661741
    +661769
    +661777
    +661823
    +661849
    +661873
    +661877
    +661879
    +661883
    +661889
    +661897
    +661909
    +661931
    +661939
    +661949
    +661951
    +661961
    +661987
    +661993
    +662003
    +662021
    +662029
    +662047
    +662059
    +662063
    +662083
    +662107
    +662111
    +662141
    +662143
    +662149
    +662177
    +662203
    +662227
    +662231
    +662251
    +662261
    +662267
    +662281
    +662287
    +662309
    +662323
    +662327
    +662339
    +662351
    +662353
    +662357
    +662369
    +662401
    +662407
    +662443
    +662449
    +662477
    +662483
    +662491
    +662513
    +662527
    +662531
    +662537
    +662539
    +662551
    +662567
    +662591
    +662617
    +662639
    +662647
    +662657
    +662671
    +662681
    +662689
    +662693
    +662713
    +662719
    +662743
    +662771
    +662773
    +662789
    +662797
    +662819
    +662833
    +662839
    +662843
    +662867
    +662897
    +662899
    +662917
    +662939
    +662941
    +662947
    +662951
    +662953
    +662957
    +662999
    +663001
    +663007
    +663031
    +663037
    +663049
    +663053
    +663071
    +663097
    +663127
    +663149
    +663161
    +663163
    +663167
    +663191
    +663203
    +663209
    +663239
    +663241
    +663263
    +663269
    +663281
    +663283
    +663301
    +663319
    +663331
    +663349
    +663359
    +663371
    +663407
    +663409
    +663437
    +663463
    +663517
    +663529
    +663539
    +663541
    +663547
    +663557
    +663563
    +663569
    +663571
    +663581
    +663583
    +663587
    +663589
    +663599
    +663601
    +663631
    +663653
    +663659
    +663661
    +663683
    +663709
    +663713
    +663737
    +663763
    +663787
    +663797
    +663821
    +663823
    +663827
    +663853
    +663857
    +663869
    +663881
    +663893
    +663907
    +663937
    +663959
    +663961
    +663967
    +663973
    +663977
    +663979
    +663983
    +663991
    +663997
    +664009
    +664019
    +664043
    +664061
    +664067
    +664091
    +664099
    +664109
    +664117
    +664121
    +664123
    +664133
    +664141
    +664151
    +664177
    +664193
    +664199
    +664211
    +664243
    +664253
    +664271
    +664273
    +664289
    +664319
    +664331
    +664357
    +664369
    +664379
    +664381
    +664403
    +664421
    +664427
    +664441
    +664459
    +664471
    +664507
    +664511
    +664529
    +664537
    +664549
    +664561
    +664571
    +664579
    +664583
    +664589
    +664597
    +664603
    +664613
    +664619
    +664621
    +664633
    +664661
    +664663
    +664667
    +664669
    +664679
    +664687
    +664691
    +664693
    +664711
    +664739
    +664757
    +664771
    +664777
    +664789
    +664793
    +664799
    +664843
    +664847
    +664849
    +664879
    +664891
    +664933
    +664949
    +664967
    +664973
    +664997
    +665011
    +665017
    +665029
    +665039
    +665047
    +665051
    +665053
    +665069
    +665089
    +665111
    +665113
    +665117
    +665123
    +665131
    +665141
    +665153
    +665177
    +665179
    +665201
    +665207
    +665213
    +665221
    +665233
    +665239
    +665251
    +665267
    +665279
    +665293
    +665299
    +665303
    +665311
    +665351
    +665359
    +665369
    +665381
    +665387
    +665419
    +665429
    +665447
    +665479
    +665501
    +665503
    +665507
    +665527
    +665549
    +665557
    +665563
    +665569
    +665573
    +665591
    +665603
    +665617
    +665629
    +665633
    +665659
    +665677
    +665713
    +665719
    +665723
    +665747
    +665761
    +665773
    +665783
    +665789
    +665801
    +665803
    +665813
    +665843
    +665857
    +665897
    +665921
    +665923
    +665947
    +665953
    +665981
    +665983
    +665993
    +666013
    +666019
    +666023
    +666031
    +666041
    +666067
    +666073
    +666079
    +666089
    +666091
    +666109
    +666119
    +666139
    +666143
    +666167
    +666173
    +666187
    +666191
    +666203
    +666229
    +666233
    +666269
    +666277
    +666301
    +666329
    +666353
    +666403
    +666427
    +666431
    +666433
    +666437
    +666439
    +666461
    +666467
    +666493
    +666511
    +666527
    +666529
    +666541
    +666557
    +666559
    +666599
    +666607
    +666637
    +666643
    +666647
    +666649
    +666667
    +666671
    +666683
    +666697
    +666707
    +666727
    +666733
    +666737
    +666749
    +666751
    +666769
    +666773
    +666811
    +666821
    +666823
    +666829
    +666857
    +666871
    +666889
    +666901
    +666929
    +666937
    +666959
    +666979
    +666983
    +666989
    +667013
    +667019
    +667021
    +667081
    +667091
    +667103
    +667123
    +667127
    +667129
    +667141
    +667171
    +667181
    +667211
    +667229
    +667241
    +667243
    +667273
    +667283
    +667309
    +667321
    +667333
    +667351
    +667361
    +667363
    +667367
    +667379
    +667417
    +667421
    +667423
    +667427
    +667441
    +667463
    +667477
    +667487
    +667501
    +667507
    +667519
    +667531
    +667547
    +667549
    +667553
    +667559
    +667561
    +667577
    +667631
    +667643
    +667649
    +667657
    +667673
    +667687
    +667691
    +667697
    +667699
    +667727
    +667741
    +667753
    +667769
    +667781
    +667801
    +667817
    +667819
    +667829
    +667837
    +667859
    +667861
    +667867
    +667883
    +667903
    +667921
    +667949
    +667963
    +667987
    +667991
    +667999
    +668009
    +668029
    +668033
    +668047
    +668051
    +668069
    +668089
    +668093
    +668111
    +668141
    +668153
    +668159
    +668179
    +668201
    +668203
    +668209
    +668221
    +668243
    +668273
    +668303
    +668347
    +668407
    +668417
    +668471
    +668509
    +668513
    +668527
    +668531
    +668533
    +668539
    +668543
    +668567
    +668579
    +668581
    +668599
    +668609
    +668611
    +668617
    +668623
    +668671
    +668677
    +668687
    +668699
    +668713
    +668719
    +668737
    +668741
    +668747
    +668761
    +668791
    +668803
    +668813
    +668821
    +668851
    +668867
    +668869
    +668873
    +668879
    +668903
    +668929
    +668939
    +668947
    +668959
    +668963
    +668989
    +668999
    +669023
    +669029
    +669049
    +669077
    +669089
    +669091
    +669107
    +669113
    +669121
    +669127
    +669133
    +669167
    +669173
    +669181
    +669241
    +669247
    +669271
    +669283
    +669287
    +669289
    +669301
    +669311
    +669329
    +669359
    +669371
    +669377
    +669379
    +669391
    +669401
    +669413
    +669419
    +669433
    +669437
    +669451
    +669463
    +669479
    +669481
    +669527
    +669551
    +669577
    +669607
    +669611
    +669637
    +669649
    +669659
    +669661
    +669667
    +669673
    +669677
    +669679
    +669689
    +669701
    +669707
    +669733
    +669763
    +669787
    +669791
    +669839
    +669847
    +669853
    +669857
    +669859
    +669863
    +669869
    +669887
    +669901
    +669913
    +669923
    +669931
    +669937
    +669943
    +669947
    +669971
    +669989
    +670001
    +670031
    +670037
    +670039
    +670049
    +670051
    +670097
    +670099
    +670129
    +670139
    +670147
    +670177
    +670193
    +670199
    +670211
    +670217
    +670223
    +670231
    +670237
    +670249
    +670261
    +670279
    +670297
    +670303
    +670321
    +670333
    +670343
    +670349
    +670363
    +670379
    +670399
    +670409
    +670447
    +670457
    +670471
    +670487
    +670489
    +670493
    +670507
    +670511
    +670517
    +670541
    +670543
    +670559
    +670577
    +670583
    +670597
    +670613
    +670619
    +670627
    +670639
    +670669
    +670673
    +670693
    +670711
    +670727
    +670729
    +670739
    +670763
    +670777
    +670781
    +670811
    +670823
    +670849
    +670853
    +670867
    +670877
    +670897
    +670903
    +670919
    +670931
    +670951
    +670963
    +670987
    +670991
    +671003
    +671017
    +671029
    +671039
    +671059
    +671063
    +671081
    +671087
    +671093
    +671123
    +671131
    +671141
    +671159
    +671161
    +671189
    +671201
    +671219
    +671233
    +671249
    +671257
    +671261
    +671269
    +671287
    +671299
    +671303
    +671323
    +671339
    +671353
    +671357
    +671369
    +671383
    +671401
    +671417
    +671431
    +671443
    +671467
    +671471
    +671477
    +671501
    +671519
    +671533
    +671537
    +671557
    +671581
    +671591
    +671603
    +671609
    +671633
    +671647
    +671651
    +671681
    +671701
    +671717
    +671729
    +671743
    +671753
    +671777
    +671779
    +671791
    +671831
    +671837
    +671851
    +671887
    +671893
    +671903
    +671911
    +671917
    +671921
    +671933
    +671939
    +671941
    +671947
    +671969
    +671971
    +671981
    +671999
    +672019
    +672029
    +672041
    +672043
    +672059
    +672073
    +672079
    +672097
    +672103
    +672107
    +672127
    +672131
    +672137
    +672143
    +672151
    +672167
    +672169
    +672181
    +672193
    +672209
    +672223
    +672227
    +672229
    +672251
    +672271
    +672283
    +672289
    +672293
    +672311
    +672317
    +672323
    +672341
    +672349
    +672377
    +672379
    +672439
    +672443
    +672473
    +672493
    +672499
    +672521
    +672557
    +672577
    +672587
    +672593
    +672629
    +672641
    +672643
    +672653
    +672667
    +672703
    +672743
    +672757
    +672767
    +672779
    +672781
    +672787
    +672799
    +672803
    +672811
    +672817
    +672823
    +672827
    +672863
    +672869
    +672871
    +672883
    +672901
    +672913
    +672937
    +672943
    +672949
    +672953
    +672967
    +672977
    +672983
    +673019
    +673039
    +673063
    +673069
    +673073
    +673091
    +673093
    +673109
    +673111
    +673117
    +673121
    +673129
    +673157
    +673193
    +673199
    +673201
    +673207
    +673223
    +673241
    +673247
    +673271
    +673273
    +673291
    +673297
    +673313
    +673327
    +673339
    +673349
    +673381
    +673391
    +673397
    +673399
    +673403
    +673411
    +673427
    +673429
    +673441
    +673447
    +673451
    +673457
    +673459
    +673469
    +673487
    +673499
    +673513
    +673529
    +673549
    +673553
    +673567
    +673573
    +673579
    +673609
    +673613
    +673619
    +673637
    +673639
    +673643
    +673649
    +673667
    +673669
    +673747
    +673769
    +673781
    +673787
    +673793
    +673801
    +673811
    +673817
    +673837
    +673879
    +673891
    +673921
    +673943
    +673951
    +673961
    +673979
    +673991
    +674017
    +674057
    +674059
    +674071
    +674083
    +674099
    +674117
    +674123
    +674131
    +674159
    +674161
    +674173
    +674183
    +674189
    +674227
    +674231
    +674239
    +674249
    +674263
    +674269
    +674273
    +674299
    +674321
    +674347
    +674357
    +674363
    +674371
    +674393
    +674419
    +674431
    +674449
    +674461
    +674483
    +674501
    +674533
    +674537
    +674551
    +674563
    +674603
    +674647
    +674669
    +674677
    +674683
    +674693
    +674699
    +674701
    +674711
    +674717
    +674719
    +674731
    +674741
    +674749
    +674759
    +674761
    +674767
    +674771
    +674789
    +674813
    +674827
    +674831
    +674833
    +674837
    +674851
    +674857
    +674867
    +674879
    +674903
    +674929
    +674941
    +674953
    +674957
    +674977
    +674987
    +675029
    +675067
    +675071
    +675079
    +675083
    +675097
    +675109
    +675113
    +675131
    +675133
    +675151
    +675161
    +675163
    +675173
    +675179
    +675187
    +675197
    +675221
    +675239
    +675247
    +675251
    +675253
    +675263
    +675271
    +675299
    +675313
    +675319
    +675341
    +675347
    +675391
    +675407
    +675413
    +675419
    +675449
    +675457
    +675463
    +675481
    +675511
    +675539
    +675541
    +675551
    +675553
    +675559
    +675569
    +675581
    +675593
    +675601
    +675607
    +675611
    +675617
    +675629
    +675643
    +675713
    +675739
    +675743
    +675751
    +675781
    +675797
    +675817
    +675823
    +675827
    +675839
    +675841
    +675859
    +675863
    +675877
    +675881
    +675889
    +675923
    +675929
    +675931
    +675959
    +675973
    +675977
    +675979
    +676007
    +676009
    +676031
    +676037
    +676043
    +676051
    +676057
    +676061
    +676069
    +676099
    +676103
    +676111
    +676129
    +676147
    +676171
    +676211
    +676217
    +676219
    +676241
    +676253
    +676259
    +676279
    +676289
    +676297
    +676337
    +676339
    +676349
    +676363
    +676373
    +676387
    +676391
    +676409
    +676411
    +676421
    +676427
    +676463
    +676469
    +676493
    +676523
    +676573
    +676589
    +676597
    +676601
    +676649
    +676661
    +676679
    +676703
    +676717
    +676721
    +676727
    +676733
    +676747
    +676751
    +676763
    +676771
    +676807
    +676829
    +676859
    +676861
    +676883
    +676891
    +676903
    +676909
    +676919
    +676927
    +676931
    +676937
    +676943
    +676961
    +676967
    +676979
    +676981
    +676987
    +676993
    +677011
    +677021
    +677029
    +677041
    +677057
    +677077
    +677081
    +677107
    +677111
    +677113
    +677119
    +677147
    +677167
    +677177
    +677213
    +677227
    +677231
    +677233
    +677239
    +677309
    +677311
    +677321
    +677323
    +677333
    +677357
    +677371
    +677387
    +677423
    +677441
    +677447
    +677459
    +677461
    +677471
    +677473
    +677531
    +677533
    +677539
    +677543
    +677561
    +677563
    +677587
    +677627
    +677639
    +677647
    +677657
    +677681
    +677683
    +677687
    +677717
    +677737
    +677767
    +677779
    +677783
    +677791
    +677813
    +677827
    +677857
    +677891
    +677927
    +677947
    +677953
    +677959
    +677983
    +678023
    +678037
    +678047
    +678061
    +678077
    +678101
    +678103
    +678133
    +678157
    +678169
    +678179
    +678191
    +678199
    +678203
    +678211
    +678217
    +678221
    +678229
    +678253
    +678289
    +678299
    +678329
    +678341
    +678343
    +678367
    +678371
    +678383
    +678401
    +678407
    +678409
    +678413
    +678421
    +678437
    +678451
    +678463
    +678479
    +678481
    +678493
    +678499
    +678533
    +678541
    +678553
    +678563
    +678577
    +678581
    +678593
    +678599
    +678607
    +678611
    +678631
    +678637
    +678641
    +678647
    +678649
    +678653
    +678659
    +678719
    +678721
    +678731
    +678739
    +678749
    +678757
    +678761
    +678763
    +678767
    +678773
    +678779
    +678809
    +678823
    +678829
    +678833
    +678859
    +678871
    +678883
    +678901
    +678907
    +678941
    +678943
    +678949
    +678959
    +678971
    +678989
    +679033
    +679037
    +679039
    +679051
    +679067
    +679087
    +679111
    +679123
    +679127
    +679153
    +679157
    +679169
    +679171
    +679183
    +679207
    +679219
    +679223
    +679229
    +679249
    +679277
    +679279
    +679297
    +679309
    +679319
    +679333
    +679361
    +679363
    +679369
    +679373
    +679381
    +679403
    +679409
    +679417
    +679423
    +679433
    +679451
    +679463
    +679487
    +679501
    +679517
    +679519
    +679531
    +679537
    +679561
    +679597
    +679603
    +679607
    +679633
    +679639
    +679669
    +679681
    +679691
    +679699
    +679709
    +679733
    +679741
    +679747
    +679751
    +679753
    +679781
    +679793
    +679807
    +679823
    +679829
    +679837
    +679843
    +679859
    +679867
    +679879
    +679883
    +679891
    +679897
    +679907
    +679909
    +679919
    +679933
    +679951
    +679957
    +679961
    +679969
    +679981
    +679993
    +679999
    +680003
    +680027
    +680039
    +680059
    +680077
    +680081
    +680083
    +680107
    +680123
    +680129
    +680159
    +680161
    +680177
    +680189
    +680203
    +680209
    +680213
    +680237
    +680249
    +680263
    +680291
    +680293
    +680297
    +680299
    +680321
    +680327
    +680341
    +680347
    +680353
    +680377
    +680387
    +680399
    +680401
    +680411
    +680417
    +680431
    +680441
    +680443
    +680453
    +680489
    +680503
    +680507
    +680509
    +680531
    +680539
    +680567
    +680569
    +680587
    +680597
    +680611
    +680623
    +680633
    +680651
    +680657
    +680681
    +680707
    +680749
    +680759
    +680767
    +680783
    +680803
    +680809
    +680831
    +680857
    +680861
    +680873
    +680879
    +680881
    +680917
    +680929
    +680959
    +680971
    +680987
    +680989
    +680993
    +681001
    +681011
    +681019
    +681041
    +681047
    +681049
    +681061
    +681067
    +681089
    +681091
    +681113
    +681127
    +681137
    +681151
    +681167
    +681179
    +681221
    +681229
    +681251
    +681253
    +681257
    +681259
    +681271
    +681293
    +681311
    +681337
    +681341
    +681361
    +681367
    +681371
    +681403
    +681407
    +681409
    +681419
    +681427
    +681449
    +681451
    +681481
    +681487
    +681493
    +681497
    +681521
    +681523
    +681539
    +681557
    +681563
    +681589
    +681607
    +681613
    +681623
    +681631
    +681647
    +681673
    +681677
    +681689
    +681719
    +681727
    +681731
    +681763
    +681773
    +681781
    +681787
    +681809
    +681823
    +681833
    +681839
    +681841
    +681883
    +681899
    +681913
    +681931
    +681943
    +681949
    +681971
    +681977
    +681979
    +681983
    +681997
    +682001
    +682009
    +682037
    +682049
    +682063
    +682069
    +682079
    +682141
    +682147
    +682151
    +682153
    +682183
    +682207
    +682219
    +682229
    +682237
    +682247
    +682259
    +682277
    +682289
    +682291
    +682303
    +682307
    +682321
    +682327
    +682333
    +682337
    +682361
    +682373
    +682411
    +682417
    +682421
    +682427
    +682439
    +682447
    +682463
    +682471
    +682483
    +682489
    +682511
    +682519
    +682531
    +682547
    +682597
    +682607
    +682637
    +682657
    +682673
    +682679
    +682697
    +682699
    +682723
    +682729
    +682733
    +682739
    +682751
    +682763
    +682777
    +682789
    +682811
    +682819
    +682901
    +682933
    +682943
    +682951
    +682967
    +683003
    +683021
    +683041
    +683047
    +683071
    +683083
    +683087
    +683119
    +683129
    +683143
    +683149
    +683159
    +683201
    +683231
    +683251
    +683257
    +683273
    +683299
    +683303
    +683317
    +683323
    +683341
    +683351
    +683357
    +683377
    +683381
    +683401
    +683407
    +683437
    +683447
    +683453
    +683461
    +683471
    +683477
    +683479
    +683483
    +683489
    +683503
    +683513
    +683567
    +683591
    +683597
    +683603
    +683651
    +683653
    +683681
    +683687
    +683693
    +683699
    +683701
    +683713
    +683719
    +683731
    +683737
    +683747
    +683759
    +683777
    +683783
    +683789
    +683807
    +683819
    +683821
    +683831
    +683833
    +683843
    +683857
    +683861
    +683863
    +683873
    +683887
    +683899
    +683909
    +683911
    +683923
    +683933
    +683939
    +683957
    +683983
    +684007
    +684017
    +684037
    +684053
    +684091
    +684109
    +684113
    +684119
    +684121
    +684127
    +684157
    +684163
    +684191
    +684217
    +684221
    +684239
    +684269
    +684287
    +684289
    +684293
    +684311
    +684329
    +684337
    +684347
    +684349
    +684373
    +684379
    +684407
    +684419
    +684427
    +684433
    +684443
    +684451
    +684469
    +684473
    +684493
    +684527
    +684547
    +684557
    +684559
    +684569
    +684581
    +684587
    +684599
    +684617
    +684637
    +684643
    +684647
    +684683
    +684713
    +684727
    +684731
    +684751
    +684757
    +684767
    +684769
    +684773
    +684791
    +684793
    +684799
    +684809
    +684829
    +684841
    +684857
    +684869
    +684889
    +684923
    +684949
    +684961
    +684973
    +684977
    +684989
    +685001
    +685019
    +685031
    +685039
    +685051
    +685057
    +685063
    +685073
    +685081
    +685093
    +685099
    +685103
    +685109
    +685123
    +685141
    +685169
    +685177
    +685199
    +685231
    +685247
    +685249
    +685271
    +685297
    +685301
    +685319
    +685337
    +685339
    +685361
    +685367
    +685369
    +685381
    +685393
    +685417
    +685427
    +685429
    +685453
    +685459
    +685471
    +685493
    +685511
    +685513
    +685519
    +685537
    +685541
    +685547
    +685591
    +685609
    +685613
    +685621
    +685631
    +685637
    +685649
    +685669
    +685679
    +685697
    +685717
    +685723
    +685733
    +685739
    +685747
    +685753
    +685759
    +685781
    +685793
    +685819
    +685849
    +685859
    +685907
    +685939
    +685963
    +685969
    +685973
    +685987
    +685991
    +686003
    +686009
    +686011
    +686027
    +686029
    +686039
    +686041
    +686051
    +686057
    +686087
    +686089
    +686099
    +686117
    +686131
    +686141
    +686143
    +686149
    +686173
    +686177
    +686197
    +686201
    +686209
    +686267
    +686269
    +686293
    +686317
    +686321
    +686333
    +686339
    +686353
    +686359
    +686363
    +686417
    +686423
    +686437
    +686449
    +686453
    +686473
    +686479
    +686503
    +686513
    +686519
    +686551
    +686563
    +686593
    +686611
    +686639
    +686669
    +686671
    +686687
    +686723
    +686729
    +686731
    +686737
    +686761
    +686773
    +686789
    +686797
    +686801
    +686837
    +686843
    +686863
    +686879
    +686891
    +686893
    +686897
    +686911
    +686947
    +686963
    +686969
    +686971
    +686977
    +686989
    +686993
    +687007
    +687013
    +687017
    +687019
    +687023
    +687031
    +687041
    +687061
    +687073
    +687083
    +687101
    +687107
    +687109
    +687121
    +687131
    +687139
    +687151
    +687161
    +687163
    +687179
    +687223
    +687233
    +687277
    +687289
    +687299
    +687307
    +687311
    +687317
    +687331
    +687341
    +687343
    +687359
    +687383
    +687389
    +687397
    +687403
    +687413
    +687431
    +687433
    +687437
    +687443
    +687457
    +687461
    +687473
    +687481
    +687499
    +687517
    +687521
    +687523
    +687541
    +687551
    +687559
    +687581
    +687593
    +687623
    +687637
    +687641
    +687647
    +687679
    +687683
    +687691
    +687707
    +687721
    +687737
    +687749
    +687767
    +687773
    +687779
    +687787
    +687809
    +687823
    +687829
    +687839
    +687847
    +687893
    +687901
    +687917
    +687923
    +687931
    +687949
    +687961
    +687977
    +688003
    +688013
    +688027
    +688031
    +688063
    +688067
    +688073
    +688087
    +688097
    +688111
    +688133
    +688139
    +688147
    +688159
    +688187
    +688201
    +688217
    +688223
    +688249
    +688253
    +688277
    +688297
    +688309
    +688333
    +688339
    +688357
    +688379
    +688393
    +688397
    +688403
    +688411
    +688423
    +688433
    +688447
    +688451
    +688453
    +688477
    +688511
    +688531
    +688543
    +688561
    +688573
    +688591
    +688621
    +688627
    +688631
    +688637
    +688657
    +688661
    +688669
    +688679
    +688697
    +688717
    +688729
    +688733
    +688741
    +688747
    +688757
    +688763
    +688777
    +688783
    +688799
    +688813
    +688861
    +688867
    +688871
    +688889
    +688907
    +688939
    +688951
    +688957
    +688969
    +688979
    +688999
    +689021
    +689033
    +689041
    +689063
    +689071
    +689077
    +689081
    +689089
    +689093
    +689107
    +689113
    +689131
    +689141
    +689167
    +689201
    +689219
    +689233
    +689237
    +689257
    +689261
    +689267
    +689279
    +689291
    +689309
    +689317
    +689321
    +689341
    +689357
    +689369
    +689383
    +689389
    +689393
    +689411
    +689431
    +689441
    +689459
    +689461
    +689467
    +689509
    +689551
    +689561
    +689581
    +689587
    +689597
    +689599
    +689603
    +689621
    +689629
    +689641
    +689693
    +689699
    +689713
    +689723
    +689761
    +689771
    +689779
    +689789
    +689797
    +689803
    +689807
    +689827
    +689831
    +689851
    +689867
    +689869
    +689873
    +689879
    +689891
    +689893
    +689903
    +689917
    +689921
    +689929
    +689951
    +689957
    +689959
    +689963
    +689981
    +689987
    +690037
    +690059
    +690073
    +690089
    +690103
    +690119
    +690127
    +690139
    +690143
    +690163
    +690187
    +690233
    +690259
    +690269
    +690271
    +690281
    +690293
    +690323
    +690341
    +690367
    +690377
    +690397
    +690407
    +690419
    +690427
    +690433
    +690439
    +690449
    +690467
    +690491
    +690493
    +690509
    +690511
    +690533
    +690541
    +690553
    +690583
    +690589
    +690607
    +690611
    +690629
    +690661
    +690673
    +690689
    +690719
    +690721
    +690757
    +690787
    +690793
    +690817
    +690839
    +690841
    +690869
    +690871
    +690887
    +690889
    +690919
    +690929
    +690953
    +690997
    +691001
    +691037
    +691051
    +691063
    +691079
    +691109
    +691111
    +691121
    +691129
    +691147
    +691151
    +691153
    +691181
    +691183
    +691189
    +691193
    +691199
    +691231
    +691241
    +691267
    +691289
    +691297
    +691309
    +691333
    +691337
    +691343
    +691349
    +691363
    +691381
    +691399
    +691409
    +691433
    +691451
    +691463
    +691489
    +691499
    +691531
    +691553
    +691573
    +691583
    +691589
    +691591
    +691631
    +691637
    +691651
    +691661
    +691681
    +691687
    +691693
    +691697
    +691709
    +691721
    +691723
    +691727
    +691729
    +691739
    +691759
    +691763
    +691787
    +691799
    +691813
    +691829
    +691837
    +691841
    +691843
    +691871
    +691877
    +691891
    +691897
    +691903
    +691907
    +691919
    +691921
    +691931
    +691949
    +691973
    +691979
    +691991
    +691997
    +692009
    +692017
    +692051
    +692059
    +692063
    +692071
    +692089
    +692099
    +692117
    +692141
    +692147
    +692149
    +692161
    +692191
    +692221
    +692239
    +692249
    +692269
    +692273
    +692281
    +692287
    +692297
    +692299
    +692309
    +692327
    +692333
    +692347
    +692353
    +692371
    +692387
    +692389
    +692399
    +692401
    +692407
    +692413
    +692423
    +692431
    +692441
    +692453
    +692459
    +692467
    +692513
    +692521
    +692537
    +692539
    +692543
    +692567
    +692581
    +692591
    +692621
    +692641
    +692647
    +692651
    +692663
    +692689
    +692707
    +692711
    +692717
    +692729
    +692743
    +692753
    +692761
    +692771
    +692779
    +692789
    +692821
    +692851
    +692863
    +692893
    +692917
    +692927
    +692929
    +692933
    +692957
    +692963
    +692969
    +692983
    +693019
    +693037
    +693041
    +693061
    +693079
    +693089
    +693097
    +693103
    +693127
    +693137
    +693149
    +693157
    +693167
    +693169
    +693179
    +693223
    +693257
    +693283
    +693317
    +693323
    +693337
    +693353
    +693359
    +693373
    +693397
    +693401
    +693403
    +693409
    +693421
    +693431
    +693437
    +693487
    +693493
    +693503
    +693523
    +693527
    +693529
    +693533
    +693569
    +693571
    +693601
    +693607
    +693619
    +693629
    +693659
    +693661
    +693677
    +693683
    +693689
    +693691
    +693697
    +693701
    +693727
    +693731
    +693733
    +693739
    +693743
    +693757
    +693779
    +693793
    +693799
    +693809
    +693827
    +693829
    +693851
    +693859
    +693871
    +693877
    +693881
    +693943
    +693961
    +693967
    +693989
    +694019
    +694033
    +694039
    +694061
    +694069
    +694079
    +694081
    +694087
    +694091
    +694123
    +694189
    +694193
    +694201
    +694207
    +694223
    +694259
    +694261
    +694271
    +694273
    +694277
    +694313
    +694319
    +694327
    +694333
    +694339
    +694349
    +694357
    +694361
    +694367
    +694373
    +694381
    +694387
    +694391
    +694409
    +694427
    +694457
    +694471
    +694481
    +694483
    +694487
    +694511
    +694513
    +694523
    +694541
    +694549
    +694559
    +694567
    +694571
    +694591
    +694597
    +694609
    +694619
    +694633
    +694649
    +694651
    +694717
    +694721
    +694747
    +694763
    +694781
    +694783
    +694789
    +694829
    +694831
    +694867
    +694871
    +694873
    +694879
    +694901
    +694919
    +694951
    +694957
    +694979
    +694987
    +694997
    +694999
    +695003
    +695017
    +695021
    +695047
    +695059
    +695069
    +695081
    +695087
    +695089
    +695099
    +695111
    +695117
    +695131
    +695141
    +695171
    +695207
    +695239
    +695243
    +695257
    +695263
    +695269
    +695281
    +695293
    +695297
    +695309
    +695323
    +695327
    +695329
    +695347
    +695369
    +695371
    +695377
    +695389
    +695407
    +695411
    +695441
    +695447
    +695467
    +695477
    +695491
    +695503
    +695509
    +695561
    +695567
    +695573
    +695581
    +695593
    +695599
    +695603
    +695621
    +695627
    +695641
    +695659
    +695663
    +695677
    +695687
    +695689
    +695701
    +695719
    +695743
    +695749
    +695771
    +695777
    +695791
    +695801
    +695809
    +695839
    +695843
    +695867
    +695873
    +695879
    +695881
    +695899
    +695917
    +695927
    +695939
    +695999
    +696019
    +696053
    +696061
    +696067
    +696077
    +696079
    +696083
    +696107
    +696109
    +696119
    +696149
    +696181
    +696239
    +696253
    +696257
    +696263
    +696271
    +696281
    +696313
    +696317
    +696323
    +696343
    +696349
    +696359
    +696361
    +696373
    +696379
    +696403
    +696413
    +696427
    +696433
    +696457
    +696481
    +696491
    +696497
    +696503
    +696517
    +696523
    +696533
    +696547
    +696569
    +696607
    +696611
    +696617
    +696623
    +696629
    +696653
    +696659
    +696679
    +696691
    +696719
    +696721
    +696737
    +696743
    +696757
    +696763
    +696793
    +696809
    +696811
    +696823
    +696827
    +696833
    +696851
    +696853
    +696887
    +696889
    +696893
    +696907
    +696929
    +696937
    +696961
    +696989
    +696991
    +697009
    +697013
    +697019
    +697033
    +697049
    +697063
    +697069
    +697079
    +697087
    +697093
    +697111
    +697121
    +697127
    +697133
    +697141
    +697157
    +697181
    +697201
    +697211
    +697217
    +697259
    +697261
    +697267
    +697271
    +697303
    +697327
    +697351
    +697373
    +697379
    +697381
    +697387
    +697397
    +697399
    +697409
    +697423
    +697441
    +697447
    +697453
    +697457
    +697481
    +697507
    +697511
    +697513
    +697519
    +697523
    +697553
    +697579
    +697583
    +697591
    +697601
    +697603
    +697637
    +697643
    +697673
    +697681
    +697687
    +697691
    +697693
    +697703
    +697727
    +697729
    +697733
    +697757
    +697759
    +697787
    +697819
    +697831
    +697877
    +697891
    +697897
    +697909
    +697913
    +697937
    +697951
    +697967
    +697973
    +697979
    +697993
    +697999
    +698017
    +698021
    +698039
    +698051
    +698053
    +698077
    +698083
    +698111
    +698171
    +698183
    +698239
    +698249
    +698251
    +698261
    +698263
    +698273
    +698287
    +698293
    +698297
    +698311
    +698329
    +698339
    +698359
    +698371
    +698387
    +698393
    +698413
    +698417
    +698419
    +698437
    +698447
    +698471
    +698483
    +698491
    +698507
    +698521
    +698527
    +698531
    +698539
    +698543
    +698557
    +698567
    +698591
    +698641
    +698653
    +698669
    +698701
    +698713
    +698723
    +698729
    +698773
    +698779
    +698821
    +698827
    +698849
    +698891
    +698899
    +698903
    +698923
    +698939
    +698977
    +698983
    +699001
    +699007
    +699037
    +699053
    +699059
    +699073
    +699077
    +699089
    +699113
    +699119
    +699133
    +699151
    +699157
    +699169
    +699187
    +699191
    +699197
    +699211
    +699217
    +699221
    +699241
    +699253
    +699271
    +699287
    +699289
    +699299
    +699319
    +699323
    +699343
    +699367
    +699373
    +699379
    +699383
    +699401
    +699427
    +699437
    +699443
    +699449
    +699463
    +699469
    +699493
    +699511
    +699521
    +699527
    +699529
    +699539
    +699541
    +699557
    +699571
    +699581
    +699617
    +699631
    +699641
    +699649
    +699697
    +699709
    +699719
    +699733
    +699757
    +699761
    +699767
    +699791
    +699793
    +699817
    +699823
    +699863
    +699931
    +699943
    +699947
    +699953
    +699961
    +699967
    +700001
    +700027
    +700057
    +700067
    +700079
    +700081
    +700087
    +700099
    +700103
    +700109
    +700127
    +700129
    +700171
    +700199
    +700201
    +700211
    +700223
    +700229
    +700237
    +700241
    +700277
    +700279
    +700303
    +700307
    +700319
    +700331
    +700339
    +700361
    +700363
    +700367
    +700387
    +700391
    +700393
    +700423
    +700429
    +700433
    +700459
    +700471
    +700499
    +700523
    +700537
    +700561
    +700571
    +700573
    +700577
    +700591
    +700597
    +700627
    +700633
    +700639
    +700643
    +700673
    +700681
    +700703
    +700717
    +700751
    +700759
    +700781
    +700789
    +700801
    +700811
    +700831
    +700837
    +700849
    +700871
    +700877
    +700883
    +700897
    +700907
    +700919
    +700933
    +700937
    +700949
    +700963
    +700993
    +701009
    +701011
    +701023
    +701033
    +701047
    +701089
    +701117
    +701147
    +701159
    +701177
    +701179
    +701209
    +701219
    +701221
    +701227
    +701257
    +701279
    +701291
    +701299
    +701329
    +701341
    +701357
    +701359
    +701377
    +701383
    +701399
    +701401
    +701413
    +701417
    +701419
    +701443
    +701447
    +701453
    +701473
    +701479
    +701489
    +701497
    +701507
    +701509
    +701527
    +701531
    +701549
    +701579
    +701581
    +701593
    +701609
    +701611
    +701621
    +701627
    +701629
    +701653
    +701669
    +701671
    +701681
    +701699
    +701711
    +701719
    +701731
    +701741
    +701761
    +701783
    +701791
    +701819
    +701837
    +701863
    +701881
    +701903
    +701951
    +701957
    +701963
    +701969
    +702007
    +702011
    +702017
    +702067
    +702077
    +702101
    +702113
    +702127
    +702131
    +702137
    +702139
    +702173
    +702179
    +702193
    +702199
    +702203
    +702211
    +702239
    +702257
    +702269
    +702281
    +702283
    +702311
    +702313
    +702323
    +702329
    +702337
    +702341
    +702347
    +702349
    +702353
    +702379
    +702391
    +702407
    +702413
    +702431
    +702433
    +702439
    +702451
    +702469
    +702497
    +702503
    +702511
    +702517
    +702523
    +702529
    +702539
    +702551
    +702557
    +702587
    +702589
    +702599
    +702607
    +702613
    +702623
    +702671
    +702679
    +702683
    +702701
    +702707
    +702721
    +702731
    +702733
    +702743
    +702773
    +702787
    +702803
    +702809
    +702817
    +702827
    +702847
    +702851
    +702853
    +702869
    +702881
    +702887
    +702893
    +702913
    +702937
    +702983
    +702991
    +703013
    +703033
    +703039
    +703081
    +703117
    +703121
    +703123
    +703127
    +703139
    +703141
    +703169
    +703193
    +703211
    +703217
    +703223
    +703229
    +703231
    +703243
    +703249
    +703267
    +703277
    +703301
    +703309
    +703321
    +703327
    +703331
    +703349
    +703357
    +703379
    +703393
    +703411
    +703441
    +703447
    +703459
    +703463
    +703471
    +703489
    +703499
    +703531
    +703537
    +703559
    +703561
    +703631
    +703643
    +703657
    +703663
    +703673
    +703679
    +703691
    +703699
    +703709
    +703711
    +703721
    +703733
    +703753
    +703763
    +703789
    +703819
    +703837
    +703849
    +703861
    +703873
    +703883
    +703897
    +703903
    +703907
    +703943
    +703949
    +703957
    +703981
    +703991
    +704003
    +704009
    +704017
    +704023
    +704027
    +704029
    +704059
    +704069
    +704087
    +704101
    +704111
    +704117
    +704131
    +704141
    +704153
    +704161
    +704177
    +704183
    +704189
    +704213
    +704219
    +704233
    +704243
    +704251
    +704269
    +704279
    +704281
    +704287
    +704299
    +704303
    +704309
    +704321
    +704357
    +704393
    +704399
    +704419
    +704441
    +704447
    +704449
    +704453
    +704461
    +704477
    +704507
    +704521
    +704527
    +704549
    +704551
    +704567
    +704569
    +704579
    +704581
    +704593
    +704603
    +704617
    +704647
    +704657
    +704663
    +704681
    +704687
    +704713
    +704719
    +704731
    +704747
    +704761
    +704771
    +704777
    +704779
    +704783
    +704797
    +704801
    +704807
    +704819
    +704833
    +704839
    +704849
    +704857
    +704861
    +704863
    +704867
    +704897
    +704929
    +704933
    +704947
    +704983
    +704989
    +704993
    +704999
    +705011
    +705013
    +705017
    +705031
    +705043
    +705053
    +705073
    +705079
    +705097
    +705113
    +705119
    +705127
    +705137
    +705161
    +705163
    +705167
    +705169
    +705181
    +705191
    +705197
    +705209
    +705247
    +705259
    +705269
    +705277
    +705293
    +705307
    +705317
    +705389
    +705403
    +705409
    +705421
    +705427
    +705437
    +705461
    +705491
    +705493
    +705499
    +705521
    +705533
    +705559
    +705613
    +705631
    +705643
    +705689
    +705713
    +705737
    +705751
    +705763
    +705769
    +705779
    +705781
    +705787
    +705821
    +705827
    +705829
    +705833
    +705841
    +705863
    +705871
    +705883
    +705899
    +705919
    +705937
    +705949
    +705967
    +705973
    +705989
    +706001
    +706003
    +706009
    +706019
    +706033
    +706039
    +706049
    +706051
    +706067
    +706099
    +706109
    +706117
    +706133
    +706141
    +706151
    +706157
    +706159
    +706183
    +706193
    +706201
    +706207
    +706213
    +706229
    +706253
    +706267
    +706283
    +706291
    +706297
    +706301
    +706309
    +706313
    +706337
    +706357
    +706369
    +706373
    +706403
    +706417
    +706427
    +706463
    +706481
    +706487
    +706499
    +706507
    +706523
    +706547
    +706561
    +706597
    +706603
    +706613
    +706621
    +706631
    +706633
    +706661
    +706669
    +706679
    +706703
    +706709
    +706729
    +706733
    +706747
    +706751
    +706753
    +706757
    +706763
    +706787
    +706793
    +706801
    +706829
    +706837
    +706841
    +706847
    +706883
    +706897
    +706907
    +706913
    +706919
    +706921
    +706943
    +706961
    +706973
    +706987
    +706999
    +707011
    +707027
    +707029
    +707053
    +707071
    +707099
    +707111
    +707117
    +707131
    +707143
    +707153
    +707159
    +707177
    +707191
    +707197
    +707219
    +707249
    +707261
    +707279
    +707293
    +707299
    +707321
    +707341
    +707359
    +707383
    +707407
    +707429
    +707431
    +707437
    +707459
    +707467
    +707501
    +707527
    +707543
    +707561
    +707563
    +707573
    +707627
    +707633
    +707647
    +707653
    +707669
    +707671
    +707677
    +707683
    +707689
    +707711
    +707717
    +707723
    +707747
    +707753
    +707767
    +707789
    +707797
    +707801
    +707813
    +707827
    +707831
    +707849
    +707857
    +707869
    +707873
    +707887
    +707911
    +707923
    +707929
    +707933
    +707939
    +707951
    +707953
    +707957
    +707969
    +707981
    +707983
    +708007
    +708011
    +708017
    +708023
    +708031
    +708041
    +708047
    +708049
    +708053
    +708061
    +708091
    +708109
    +708119
    +708131
    +708137
    +708139
    +708161
    +708163
    +708179
    +708199
    +708221
    +708223
    +708229
    +708251
    +708269
    +708283
    +708287
    +708293
    +708311
    +708329
    +708343
    +708347
    +708353
    +708359
    +708361
    +708371
    +708403
    +708437
    +708457
    +708473
    +708479
    +708481
    +708493
    +708497
    +708517
    +708527
    +708559
    +708563
    +708569
    +708583
    +708593
    +708599
    +708601
    +708641
    +708647
    +708667
    +708689
    +708703
    +708733
    +708751
    +708803
    +708823
    +708839
    +708857
    +708859
    +708893
    +708899
    +708907
    +708913
    +708923
    +708937
    +708943
    +708959
    +708979
    +708989
    +708991
    +708997
    +709043
    +709057
    +709097
    +709117
    +709123
    +709139
    +709141
    +709151
    +709153
    +709157
    +709201
    +709211
    +709217
    +709231
    +709237
    +709271
    +709273
    +709279
    +709283
    +709307
    +709321
    +709337
    +709349
    +709351
    +709381
    +709409
    +709417
    +709421
    +709433
    +709447
    +709451
    +709453
    +709469
    +709507
    +709519
    +709531
    +709537
    +709547
    +709561
    +709589
    +709603
    +709607
    +709609
    +709649
    +709651
    +709663
    +709673
    +709679
    +709691
    +709693
    +709703
    +709729
    +709739
    +709741
    +709769
    +709777
    +709789
    +709799
    +709817
    +709823
    +709831
    +709843
    +709847
    +709853
    +709861
    +709871
    +709879
    +709901
    +709909
    +709913
    +709921
    +709927
    +709957
    +709963
    +709967
    +709981
    +709991
    +710009
    +710023
    +710027
    +710051
    +710053
    +710081
    +710089
    +710119
    +710189
    +710207
    +710219
    +710221
    +710257
    +710261
    +710273
    +710293
    +710299
    +710321
    +710323
    +710327
    +710341
    +710351
    +710371
    +710377
    +710383
    +710389
    +710399
    +710441
    +710443
    +710449
    +710459
    +710473
    +710483
    +710491
    +710503
    +710513
    +710519
    +710527
    +710531
    +710557
    +710561
    +710569
    +710573
    +710599
    +710603
    +710609
    +710621
    +710623
    +710627
    +710641
    +710663
    +710683
    +710693
    +710713
    +710777
    +710779
    +710791
    +710813
    +710837
    +710839
    +710849
    +710851
    +710863
    +710867
    +710873
    +710887
    +710903
    +710909
    +710911
    +710917
    +710929
    +710933
    +710951
    +710959
    +710971
    +710977
    +710987
    +710989
    +711001
    +711017
    +711019
    +711023
    +711041
    +711049
    +711089
    +711097
    +711121
    +711131
    +711133
    +711143
    +711163
    +711173
    +711181
    +711187
    +711209
    +711223
    +711259
    +711287
    +711299
    +711307
    +711317
    +711329
    +711353
    +711371
    +711397
    +711409
    +711427
    +711437
    +711463
    +711479
    +711497
    +711499
    +711509
    +711517
    +711523
    +711539
    +711563
    +711577
    +711583
    +711589
    +711617
    +711629
    +711649
    +711653
    +711679
    +711691
    +711701
    +711707
    +711709
    +711713
    +711727
    +711731
    +711749
    +711751
    +711757
    +711793
    +711811
    +711817
    +711829
    +711839
    +711847
    +711859
    +711877
    +711889
    +711899
    +711913
    +711923
    +711929
    +711937
    +711947
    +711959
    +711967
    +711973
    +711983
    +712007
    +712021
    +712051
    +712067
    +712093
    +712109
    +712121
    +712133
    +712157
    +712169
    +712171
    +712183
    +712199
    +712219
    +712237
    +712279
    +712289
    +712301
    +712303
    +712319
    +712321
    +712331
    +712339
    +712357
    +712409
    +712417
    +712427
    +712429
    +712433
    +712447
    +712477
    +712483
    +712489
    +712493
    +712499
    +712507
    +712511
    +712531
    +712561
    +712571
    +712573
    +712601
    +712603
    +712631
    +712651
    +712669
    +712681
    +712687
    +712693
    +712697
    +712711
    +712717
    +712739
    +712781
    +712807
    +712819
    +712837
    +712841
    +712843
    +712847
    +712883
    +712889
    +712891
    +712909
    +712913
    +712927
    +712939
    +712951
    +712961
    +712967
    +712973
    +712981
    +713021
    +713039
    +713059
    +713077
    +713107
    +713117
    +713129
    +713147
    +713149
    +713159
    +713171
    +713177
    +713183
    +713189
    +713191
    +713227
    +713233
    +713239
    +713243
    +713261
    +713267
    +713281
    +713287
    +713309
    +713311
    +713329
    +713347
    +713351
    +713353
    +713357
    +713381
    +713389
    +713399
    +713407
    +713411
    +713417
    +713467
    +713477
    +713491
    +713497
    +713501
    +713509
    +713533
    +713563
    +713569
    +713597
    +713599
    +713611
    +713627
    +713653
    +713663
    +713681
    +713737
    +713743
    +713747
    +713753
    +713771
    +713807
    +713827
    +713831
    +713833
    +713861
    +713863
    +713873
    +713891
    +713903
    +713917
    +713927
    +713939
    +713941
    +713957
    +713981
    +713987
    +714029
    +714037
    +714061
    +714073
    +714107
    +714113
    +714139
    +714143
    +714151
    +714163
    +714169
    +714199
    +714223
    +714227
    +714247
    +714257
    +714283
    +714341
    +714349
    +714361
    +714377
    +714443
    +714463
    +714479
    +714481
    +714487
    +714503
    +714509
    +714517
    +714521
    +714529
    +714551
    +714557
    +714563
    +714569
    +714577
    +714601
    +714619
    +714673
    +714677
    +714691
    +714719
    +714739
    +714751
    +714773
    +714781
    +714787
    +714797
    +714809
    +714827
    +714839
    +714841
    +714851
    +714853
    +714869
    +714881
    +714887
    +714893
    +714907
    +714911
    +714919
    +714943
    +714947
    +714949
    +714971
    +714991
    +715019
    +715031
    +715049
    +715063
    +715069
    +715073
    +715087
    +715109
    +715123
    +715151
    +715153
    +715157
    +715159
    +715171
    +715189
    +715193
    +715223
    +715229
    +715237
    +715243
    +715249
    +715259
    +715289
    +715301
    +715303
    +715313
    +715339
    +715357
    +715361
    +715373
    +715397
    +715417
    +715423
    +715439
    +715441
    +715453
    +715457
    +715489
    +715499
    +715523
    +715537
    +715549
    +715567
    +715571
    +715577
    +715579
    +715613
    +715621
    +715639
    +715643
    +715651
    +715657
    +715679
    +715681
    +715699
    +715727
    +715739
    +715753
    +715777
    +715789
    +715801
    +715811
    +715817
    +715823
    +715843
    +715849
    +715859
    +715867
    +715873
    +715877
    +715879
    +715889
    +715903
    +715909
    +715919
    +715927
    +715943
    +715961
    +715963
    +715969
    +715973
    +715991
    +715999
    +716003
    +716033
    +716063
    +716087
    +716117
    +716123
    +716137
    +716143
    +716161
    +716171
    +716173
    +716249
    +716257
    +716279
    +716291
    +716299
    +716321
    +716351
    +716383
    +716389
    +716399
    +716411
    +716413
    +716447
    +716449
    +716453
    +716459
    +716477
    +716479
    +716483
    +716491
    +716501
    +716531
    +716543
    +716549
    +716563
    +716581
    +716591
    +716621
    +716629
    +716633
    +716659
    +716663
    +716671
    +716687
    +716693
    +716707
    +716713
    +716731
    +716741
    +716743
    +716747
    +716783
    +716789
    +716809
    +716819
    +716827
    +716857
    +716861
    +716869
    +716897
    +716899
    +716917
    +716929
    +716951
    +716953
    +716959
    +716981
    +716987
    +717001
    +717011
    +717047
    +717089
    +717091
    +717103
    +717109
    +717113
    +717127
    +717133
    +717139
    +717149
    +717151
    +717161
    +717191
    +717229
    +717259
    +717271
    +717289
    +717293
    +717317
    +717323
    +717331
    +717341
    +717397
    +717413
    +717419
    +717427
    +717443
    +717449
    +717463
    +717491
    +717511
    +717527
    +717529
    +717533
    +717539
    +717551
    +717559
    +717581
    +717589
    +717593
    +717631
    +717653
    +717659
    +717667
    +717679
    +717683
    +717697
    +717719
    +717751
    +717797
    +717803
    +717811
    +717817
    +717841
    +717851
    +717883
    +717887
    +717917
    +717919
    +717923
    +717967
    +717979
    +717989
    +718007
    +718043
    +718049
    +718051
    +718087
    +718093
    +718121
    +718139
    +718163
    +718169
    +718171
    +718183
    +718187
    +718241
    +718259
    +718271
    +718303
    +718321
    +718331
    +718337
    +718343
    +718349
    +718357
    +718379
    +718381
    +718387
    +718391
    +718411
    +718423
    +718427
    +718433
    +718453
    +718457
    +718463
    +718493
    +718511
    +718513
    +718541
    +718547
    +718559
    +718579
    +718603
    +718621
    +718633
    +718657
    +718661
    +718691
    +718703
    +718717
    +718723
    +718741
    +718747
    +718759
    +718801
    +718807
    +718813
    +718841
    +718847
    +718871
    +718897
    +718901
    +718919
    +718931
    +718937
    +718943
    +718973
    +718999
    +719009
    +719011
    +719027
    +719041
    +719057
    +719063
    +719071
    +719101
    +719119
    +719143
    +719149
    +719153
    +719167
    +719177
    +719179
    +719183
    +719189
    +719197
    +719203
    +719227
    +719237
    +719239
    +719267
    +719281
    +719297
    +719333
    +719351
    +719353
    +719377
    +719393
    +719413
    +719419
    +719441
    +719447
    +719483
    +719503
    +719533
    +719557
    +719567
    +719569
    +719573
    +719597
    +719599
    +719633
    +719639
    +719659
    +719671
    +719681
    +719683
    +719689
    +719699
    +719713
    +719717
    +719723
    +719731
    +719749
    +719753
    +719773
    +719779
    +719791
    +719801
    +719813
    +719821
    +719833
    +719839
    +719893
    +719903
    +719911
    +719941
    +719947
    +719951
    +719959
    +719981
    +719989
    +720007
    +720019
    +720023
    +720053
    +720059
    +720089
    +720091
    +720101
    +720127
    +720133
    +720151
    +720173
    +720179
    +720193
    +720197
    +720211
    +720221
    +720229
    +720241
    +720253
    +720257
    +720281
    +720283
    +720289
    +720299
    +720301
    +720311
    +720319
    +720359
    +720361
    +720367
    +720373
    +720397
    +720403
    +720407
    +720413
    +720439
    +720481
    +720491
    +720497
    +720527
    +720547
    +720569
    +720571
    +720607
    +720611
    +720617
    +720619
    +720653
    +720661
    +720677
    +720683
    +720697
    +720703
    +720743
    +720763
    +720767
    +720773
    +720779
    +720791
    +720793
    +720829
    +720847
    +720857
    +720869
    +720877
    +720887
    +720899
    +720901
    +720913
    +720931
    +720943
    +720947
    +720961
    +720971
    +720983
    +720991
    +720997
    +721003
    +721013
    +721037
    +721043
    +721051
    +721057
    +721079
    +721087
    +721109
    +721111
    +721117
    +721129
    +721139
    +721141
    +721159
    +721163
    +721169
    +721177
    +721181
    +721199
    +721207
    +721213
    +721219
    +721223
    +721229
    +721243
    +721261
    +721267
    +721283
    +721291
    +721307
    +721319
    +721321
    +721333
    +721337
    +721351
    +721363
    +721379
    +721381
    +721387
    +721397
    +721439
    +721451
    +721481
    +721499
    +721529
    +721547
    +721561
    +721571
    +721577
    +721597
    +721613
    +721619
    +721621
    +721631
    +721661
    +721663
    +721687
    +721697
    +721703
    +721709
    +721733
    +721739
    +721783
    +721793
    +721843
    +721849
    +721859
    +721883
    +721891
    +721909
    +721921
    +721951
    +721961
    +721979
    +721991
    +721997
    +722011
    +722023
    +722027
    +722047
    +722063
    +722069
    +722077
    +722093
    +722119
    +722123
    +722147
    +722149
    +722153
    +722159
    +722167
    +722173
    +722213
    +722237
    +722243
    +722257
    +722273
    +722287
    +722291
    +722299
    +722311
    +722317
    +722321
    +722333
    +722341
    +722353
    +722363
    +722369
    +722377
    +722389
    +722411
    +722417
    +722431
    +722459
    +722467
    +722479
    +722489
    +722509
    +722521
    +722537
    +722539
    +722563
    +722581
    +722599
    +722611
    +722633
    +722639
    +722663
    +722669
    +722713
    +722723
    +722737
    +722749
    +722783
    +722791
    +722797
    +722807
    +722819
    +722833
    +722849
    +722881
    +722899
    +722903
    +722921
    +722933
    +722963
    +722971
    +722977
    +722983
    +723029
    +723031
    +723043
    +723049
    +723053
    +723067
    +723071
    +723089
    +723101
    +723103
    +723109
    +723113
    +723119
    +723127
    +723133
    +723157
    +723161
    +723167
    +723169
    +723181
    +723193
    +723209
    +723221
    +723227
    +723257
    +723259
    +723263
    +723269
    +723271
    +723287
    +723293
    +723319
    +723337
    +723353
    +723361
    +723379
    +723391
    +723407
    +723409
    +723413
    +723421
    +723439
    +723451
    +723467
    +723473
    +723479
    +723491
    +723493
    +723529
    +723551
    +723553
    +723559
    +723563
    +723587
    +723589
    +723601
    +723607
    +723617
    +723623
    +723661
    +723721
    +723727
    +723739
    +723761
    +723791
    +723797
    +723799
    +723803
    +723823
    +723829
    +723839
    +723851
    +723857
    +723859
    +723893
    +723901
    +723907
    +723913
    +723917
    +723923
    +723949
    +723959
    +723967
    +723973
    +723977
    +723997
    +724001
    +724007
    +724021
    +724079
    +724093
    +724099
    +724111
    +724117
    +724121
    +724123
    +724153
    +724187
    +724211
    +724219
    +724259
    +724267
    +724277
    +724291
    +724303
    +724309
    +724313
    +724331
    +724393
    +724403
    +724433
    +724441
    +724447
    +724453
    +724459
    +724469
    +724481
    +724487
    +724499
    +724513
    +724517
    +724519
    +724531
    +724547
    +724553
    +724567
    +724573
    +724583
    +724597
    +724601
    +724609
    +724621
    +724627
    +724631
    +724639
    +724643
    +724651
    +724721
    +724723
    +724729
    +724733
    +724747
    +724751
    +724769
    +724777
    +724781
    +724783
    +724807
    +724813
    +724837
    +724847
    +724853
    +724879
    +724901
    +724903
    +724939
    +724949
    +724961
    +724967
    +724991
    +724993
    +725009
    +725041
    +725057
    +725071
    +725077
    +725099
    +725111
    +725113
    +725119
    +725147
    +725149
    +725159
    +725161
    +725189
    +725201
    +725209
    +725273
    +725293
    +725303
    +725317
    +725321
    +725323
    +725327
    +725341
    +725357
    +725359
    +725371
    +725381
    +725393
    +725399
    +725423
    +725437
    +725447
    +725449
    +725479
    +725507
    +725519
    +725531
    +725537
    +725579
    +725587
    +725597
    +725603
    +725639
    +725653
    +725663
    +725671
    +725687
    +725723
    +725731
    +725737
    +725749
    +725789
    +725801
    +725807
    +725827
    +725861
    +725863
    +725867
    +725891
    +725897
    +725909
    +725929
    +725939
    +725953
    +725981
    +725983
    +725993
    +725999
    +726007
    +726013
    +726023
    +726043
    +726071
    +726091
    +726097
    +726101
    +726107
    +726109
    +726137
    +726139
    +726149
    +726157
    +726163
    +726169
    +726181
    +726191
    +726221
    +726287
    +726289
    +726301
    +726307
    +726331
    +726337
    +726367
    +726371
    +726377
    +726379
    +726391
    +726413
    +726419
    +726431
    +726457
    +726463
    +726469
    +726487
    +726497
    +726521
    +726527
    +726533
    +726559
    +726589
    +726599
    +726601
    +726611
    +726619
    +726623
    +726629
    +726641
    +726647
    +726659
    +726679
    +726689
    +726697
    +726701
    +726707
    +726751
    +726779
    +726787
    +726797
    +726809
    +726811
    +726839
    +726841
    +726853
    +726893
    +726899
    +726911
    +726917
    +726923
    +726941
    +726953
    +726983
    +726989
    +726991
    +727003
    +727009
    +727019
    +727021
    +727049
    +727061
    +727063
    +727079
    +727121
    +727123
    +727157
    +727159
    +727169
    +727183
    +727189
    +727201
    +727211
    +727241
    +727247
    +727249
    +727261
    +727267
    +727271
    +727273
    +727289
    +727297
    +727313
    +727327
    +727343
    +727351
    +727369
    +727399
    +727409
    +727427
    +727451
    +727459
    +727471
    +727483
    +727487
    +727499
    +727501
    +727541
    +727561
    +727577
    +727589
    +727613
    +727621
    +727633
    +727667
    +727673
    +727691
    +727703
    +727711
    +727717
    +727729
    +727733
    +727747
    +727759
    +727763
    +727777
    +727781
    +727799
    +727807
    +727817
    +727823
    +727843
    +727847
    +727877
    +727879
    +727891
    +727933
    +727939
    +727949
    +727981
    +727997
    +728003
    +728017
    +728027
    +728047
    +728069
    +728087
    +728113
    +728129
    +728131
    +728173
    +728191
    +728207
    +728209
    +728261
    +728267
    +728269
    +728281
    +728293
    +728303
    +728317
    +728333
    +728369
    +728381
    +728383
    +728417
    +728423
    +728437
    +728471
    +728477
    +728489
    +728521
    +728527
    +728537
    +728551
    +728557
    +728561
    +728573
    +728579
    +728627
    +728639
    +728647
    +728659
    +728681
    +728687
    +728699
    +728701
    +728713
    +728723
    +728729
    +728731
    +728743
    +728747
    +728771
    +728809
    +728813
    +728831
    +728837
    +728839
    +728843
    +728851
    +728867
    +728869
    +728873
    +728881
    +728891
    +728899
    +728911
    +728921
    +728927
    +728929
    +728941
    +728947
    +728953
    +728969
    +728971
    +728993
    +729019
    +729023
    +729037
    +729041
    +729059
    +729073
    +729139
    +729143
    +729173
    +729187
    +729191
    +729199
    +729203
    +729217
    +729257
    +729269
    +729271
    +729293
    +729301
    +729329
    +729331
    +729359
    +729367
    +729371
    +729373
    +729389
    +729403
    +729413
    +729451
    +729457
    +729473
    +729493
    +729497
    +729503
    +729511
    +729527
    +729551
    +729557
    +729559
    +729569
    +729571
    +729577
    +729587
    +729601
    +729607
    +729613
    +729637
    +729643
    +729649
    +729661
    +729671
    +729679
    +729689
    +729713
    +729719
    +729737
    +729749
    +729761
    +729779
    +729787
    +729791
    +729821
    +729851
    +729871
    +729877
    +729907
    +729913
    +729919
    +729931
    +729941
    +729943
    +729947
    +729977
    +729979
    +729991
    +730003
    +730021
    +730033
    +730049
    +730069
    +730091
    +730111
    +730139
    +730157
    +730187
    +730199
    +730217
    +730237
    +730253
    +730277
    +730283
    +730297
    +730321
    +730339
    +730363
    +730397
    +730399
    +730421
    +730447
    +730451
    +730459
    +730469
    +730487
    +730537
    +730553
    +730559
    +730567
    +730571
    +730573
    +730589
    +730591
    +730603
    +730619
    +730633
    +730637
    +730663
    +730669
    +730679
    +730727
    +730747
    +730753
    +730757
    +730777
    +730781
    +730783
    +730789
    +730799
    +730811
    +730819
    +730823
    +730837
    +730843
    +730853
    +730867
    +730879
    +730889
    +730901
    +730909
    +730913
    +730943
    +730969
    +730973
    +730993
    +730999
    +731033
    +731041
    +731047
    +731053
    +731057
    +731113
    +731117
    +731141
    +731173
    +731183
    +731189
    +731191
    +731201
    +731209
    +731219
    +731233
    +731243
    +731249
    +731251
    +731257
    +731261
    +731267
    +731287
    +731299
    +731327
    +731333
    +731359
    +731363
    +731369
    +731389
    +731413
    +731447
    +731483
    +731501
    +731503
    +731509
    +731531
    +731539
    +731567
    +731587
    +731593
    +731597
    +731603
    +731611
    +731623
    +731639
    +731651
    +731681
    +731683
    +731711
    +731713
    +731719
    +731729
    +731737
    +731741
    +731761
    +731767
    +731779
    +731803
    +731807
    +731821
    +731827
    +731831
    +731839
    +731851
    +731869
    +731881
    +731893
    +731909
    +731911
    +731921
    +731923
    +731933
    +731957
    +731981
    +731999
    +732023
    +732029
    +732041
    +732073
    +732077
    +732079
    +732097
    +732101
    +732133
    +732157
    +732169
    +732181
    +732187
    +732191
    +732197
    +732209
    +732211
    +732217
    +732229
    +732233
    +732239
    +732257
    +732271
    +732283
    +732287
    +732293
    +732299
    +732311
    +732323
    +732331
    +732373
    +732439
    +732449
    +732461
    +732467
    +732491
    +732493
    +732497
    +732509
    +732521
    +732533
    +732541
    +732601
    +732617
    +732631
    +732653
    +732673
    +732689
    +732703
    +732709
    +732713
    +732731
    +732749
    +732761
    +732769
    +732799
    +732817
    +732827
    +732829
    +732833
    +732841
    +732863
    +732877
    +732889
    +732911
    +732923
    +732943
    +732959
    +732967
    +732971
    +732997
    +733003
    +733009
    +733067
    +733097
    +733099
    +733111
    +733123
    +733127
    +733133
    +733141
    +733147
    +733157
    +733169
    +733177
    +733189
    +733237
    +733241
    +733273
    +733277
    +733283
    +733289
    +733301
    +733307
    +733321
    +733331
    +733333
    +733339
    +733351
    +733373
    +733387
    +733391
    +733393
    +733399
    +733409
    +733427
    +733433
    +733459
    +733477
    +733489
    +733511
    +733517
    +733519
    +733559
    +733561
    +733591
    +733619
    +733639
    +733651
    +733687
    +733697
    +733741
    +733751
    +733753
    +733757
    +733793
    +733807
    +733813
    +733823
    +733829
    +733841
    +733847
    +733849
    +733867
    +733871
    +733879
    +733883
    +733919
    +733921
    +733937
    +733939
    +733949
    +733963
    +733973
    +733981
    +733991
    +734003
    +734017
    +734021
    +734047
    +734057
    +734087
    +734113
    +734131
    +734143
    +734159
    +734171
    +734177
    +734189
    +734197
    +734203
    +734207
    +734221
    +734233
    +734263
    +734267
    +734273
    +734291
    +734303
    +734329
    +734347
    +734381
    +734389
    +734401
    +734411
    +734423
    +734429
    +734431
    +734443
    +734471
    +734473
    +734477
    +734479
    +734497
    +734537
    +734543
    +734549
    +734557
    +734567
    +734627
    +734647
    +734653
    +734659
    +734663
    +734687
    +734693
    +734707
    +734717
    +734729
    +734737
    +734743
    +734759
    +734771
    +734803
    +734807
    +734813
    +734819
    +734837
    +734849
    +734869
    +734879
    +734887
    +734897
    +734911
    +734933
    +734941
    +734953
    +734957
    +734959
    +734971
    +735001
    +735019
    +735043
    +735061
    +735067
    +735071
    +735073
    +735083
    +735107
    +735109
    +735113
    +735139
    +735143
    +735157
    +735169
    +735173
    +735181
    +735187
    +735193
    +735209
    +735211
    +735239
    +735247
    +735263
    +735271
    +735283
    +735307
    +735311
    +735331
    +735337
    +735341
    +735359
    +735367
    +735373
    +735389
    +735391
    +735419
    +735421
    +735431
    +735439
    +735443
    +735451
    +735461
    +735467
    +735473
    +735479
    +735491
    +735529
    +735533
    +735557
    +735571
    +735617
    +735649
    +735653
    +735659
    +735673
    +735689
    +735697
    +735719
    +735731
    +735733
    +735739
    +735751
    +735781
    +735809
    +735821
    +735829
    +735853
    +735871
    +735877
    +735883
    +735901
    +735919
    +735937
    +735949
    +735953
    +735979
    +735983
    +735997
    +736007
    +736013
    +736027
    +736037
    +736039
    +736051
    +736061
    +736063
    +736091
    +736093
    +736097
    +736111
    +736121
    +736147
    +736159
    +736181
    +736187
    +736243
    +736247
    +736249
    +736259
    +736273
    +736277
    +736279
    +736357
    +736361
    +736363
    +736367
    +736369
    +736381
    +736387
    +736399
    +736403
    +736409
    +736429
    +736433
    +736441
    +736447
    +736469
    +736471
    +736511
    +736577
    +736607
    +736639
    +736657
    +736679
    +736691
    +736699
    +736717
    +736721
    +736741
    +736787
    +736793
    +736817
    +736823
    +736843
    +736847
    +736867
    +736871
    +736889
    +736903
    +736921
    +736927
    +736937
    +736951
    +736961
    +736973
    +736987
    +736993
    +737017
    +737039
    +737041
    +737047
    +737053
    +737059
    +737083
    +737089
    +737111
    +737119
    +737129
    +737131
    +737147
    +737159
    +737179
    +737183
    +737203
    +737207
    +737251
    +737263
    +737279
    +737281
    +737287
    +737291
    +737293
    +737309
    +737327
    +737339
    +737351
    +737353
    +737411
    +737413
    +737423
    +737431
    +737479
    +737483
    +737497
    +737501
    +737507
    +737509
    +737531
    +737533
    +737537
    +737563
    +737567
    +737573
    +737591
    +737593
    +737617
    +737629
    +737641
    +737657
    +737663
    +737683
    +737687
    +737717
    +737719
    +737729
    +737747
    +737753
    +737767
    +737773
    +737797
    +737801
    +737809
    +737819
    +737843
    +737857
    +737861
    +737873
    +737887
    +737897
    +737921
    +737927
    +737929
    +737969
    +737981
    +737999
    +738011
    +738029
    +738043
    +738053
    +738071
    +738083
    +738107
    +738109
    +738121
    +738151
    +738163
    +738173
    +738197
    +738211
    +738217
    +738223
    +738247
    +738263
    +738301
    +738313
    +738317
    +738319
    +738341
    +738349
    +738373
    +738379
    +738383
    +738391
    +738401
    +738403
    +738421
    +738443
    +738457
    +738469
    +738487
    +738499
    +738509
    +738523
    +738539
    +738547
    +738581
    +738583
    +738589
    +738623
    +738643
    +738677
    +738707
    +738713
    +738721
    +738743
    +738757
    +738781
    +738791
    +738797
    +738811
    +738827
    +738839
    +738847
    +738851
    +738863
    +738877
    +738889
    +738917
    +738919
    +738923
    +738937
    +738953
    +738961
    +738977
    +738989
    +739003
    +739021
    +739027
    +739031
    +739051
    +739061
    +739069
    +739087
    +739099
    +739103
    +739111
    +739117
    +739121
    +739153
    +739163
    +739171
    +739183
    +739187
    +739199
    +739201
    +739217
    +739241
    +739253
    +739273
    +739283
    +739301
    +739303
    +739307
    +739327
    +739331
    +739337
    +739351
    +739363
    +739369
    +739373
    +739379
    +739391
    +739393
    +739397
    +739399
    +739433
    +739439
    +739463
    +739469
    +739493
    +739507
    +739511
    +739513
    +739523
    +739549
    +739553
    +739579
    +739601
    +739603
    +739621
    +739631
    +739633
    +739637
    +739649
    +739693
    +739699
    +739723
    +739751
    +739759
    +739771
    +739777
    +739787
    +739799
    +739813
    +739829
    +739847
    +739853
    +739859
    +739861
    +739909
    +739931
    +739943
    +739951
    +739957
    +739967
    +739969
    +740011
    +740021
    +740023
    +740041
    +740053
    +740059
    +740087
    +740099
    +740123
    +740141
    +740143
    +740153
    +740161
    +740171
    +740189
    +740191
    +740227
    +740237
    +740279
    +740287
    +740303
    +740321
    +740323
    +740329
    +740351
    +740359
    +740371
    +740387
    +740423
    +740429
    +740461
    +740473
    +740477
    +740483
    +740513
    +740521
    +740527
    +740533
    +740549
    +740561
    +740581
    +740591
    +740599
    +740603
    +740651
    +740653
    +740659
    +740671
    +740681
    +740687
    +740693
    +740711
    +740713
    +740717
    +740737
    +740749
    +740801
    +740849
    +740891
    +740893
    +740897
    +740903
    +740923
    +740939
    +740951
    +740969
    +740989
    +741001
    +741007
    +741011
    +741031
    +741043
    +741053
    +741061
    +741071
    +741077
    +741079
    +741101
    +741119
    +741121
    +741127
    +741131
    +741137
    +741163
    +741187
    +741193
    +741227
    +741229
    +741233
    +741253
    +741283
    +741337
    +741341
    +741343
    +741347
    +741373
    +741401
    +741409
    +741413
    +741431
    +741457
    +741467
    +741469
    +741473
    +741479
    +741491
    +741493
    +741509
    +741541
    +741547
    +741563
    +741569
    +741593
    +741599
    +741641
    +741661
    +741667
    +741677
    +741679
    +741683
    +741691
    +741709
    +741721
    +741781
    +741787
    +741803
    +741809
    +741827
    +741833
    +741847
    +741857
    +741859
    +741869
    +741877
    +741883
    +741913
    +741929
    +741941
    +741967
    +741973
    +741991
    +742009
    +742031
    +742037
    +742057
    +742069
    +742073
    +742111
    +742117
    +742127
    +742151
    +742153
    +742193
    +742199
    +742201
    +742211
    +742213
    +742219
    +742229
    +742241
    +742243
    +742253
    +742277
    +742283
    +742289
    +742307
    +742327
    +742333
    +742351
    +742369
    +742381
    +742393
    +742409
    +742439
    +742457
    +742499
    +742507
    +742513
    +742519
    +742531
    +742537
    +742541
    +742549
    +742559
    +742579
    +742591
    +742607
    +742619
    +742657
    +742663
    +742673
    +742681
    +742697
    +742699
    +742711
    +742717
    +742723
    +742757
    +742759
    +742783
    +742789
    +742801
    +742817
    +742891
    +742897
    +742909
    +742913
    +742943
    +742949
    +742967
    +742981
    +742991
    +742993
    +742999
    +743027
    +743047
    +743059
    +743069
    +743089
    +743111
    +743123
    +743129
    +743131
    +743137
    +743143
    +743159
    +743161
    +743167
    +743173
    +743177
    +743179
    +743203
    +743209
    +743221
    +743251
    +743263
    +743269
    +743273
    +743279
    +743297
    +743321
    +743333
    +743339
    +743363
    +743377
    +743401
    +743423
    +743447
    +743507
    +743549
    +743551
    +743573
    +743579
    +743591
    +743609
    +743657
    +743669
    +743671
    +743689
    +743693
    +743711
    +743731
    +743747
    +743777
    +743779
    +743791
    +743803
    +743819
    +743833
    +743837
    +743849
    +743851
    +743881
    +743891
    +743917
    +743921
    +743923
    +743933
    +743947
    +743987
    +743989
    +744019
    +744043
    +744071
    +744077
    +744083
    +744113
    +744127
    +744137
    +744179
    +744187
    +744199
    +744203
    +744221
    +744239
    +744251
    +744253
    +744283
    +744301
    +744313
    +744353
    +744371
    +744377
    +744389
    +744391
    +744397
    +744407
    +744409
    +744431
    +744451
    +744493
    +744503
    +744511
    +744539
    +744547
    +744559
    +744599
    +744607
    +744637
    +744641
    +744649
    +744659
    +744661
    +744677
    +744701
    +744707
    +744721
    +744727
    +744739
    +744761
    +744767
    +744791
    +744811
    +744817
    +744823
    +744829
    +744833
    +744859
    +744893
    +744911
    +744917
    +744941
    +744949
    +744959
    +744977
    +745001
    +745013
    +745027
    +745033
    +745037
    +745051
    +745067
    +745103
    +745117
    +745133
    +745141
    +745181
    +745187
    +745189
    +745201
    +745231
    +745243
    +745247
    +745249
    +745273
    +745301
    +745307
    +745337
    +745343
    +745357
    +745369
    +745379
    +745391
    +745397
    +745471
    +745477
    +745517
    +745529
    +745531
    +745543
    +745567
    +745573
    +745601
    +745609
    +745621
    +745631
    +745649
    +745673
    +745697
    +745699
    +745709
    +745711
    +745727
    +745733
    +745741
    +745747
    +745751
    +745753
    +745757
    +745817
    +745837
    +745859
    +745873
    +745903
    +745931
    +745933
    +745939
    +745951
    +745973
    +745981
    +745993
    +745999
    +746017
    +746023
    +746033
    +746041
    +746047
    +746069
    +746099
    +746101
    +746107
    +746117
    +746129
    +746153
    +746167
    +746171
    +746177
    +746183
    +746191
    +746197
    +746203
    +746209
    +746227
    +746231
    +746233
    +746243
    +746267
    +746287
    +746303
    +746309
    +746329
    +746353
    +746363
    +746371
    +746411
    +746413
    +746429
    +746477
    +746479
    +746483
    +746497
    +746503
    +746507
    +746509
    +746531
    +746533
    +746561
    +746563
    +746597
    +746653
    +746659
    +746671
    +746677
    +746723
    +746737
    +746743
    +746747
    +746749
    +746773
    +746777
    +746791
    +746797
    +746807
    +746813
    +746839
    +746843
    +746869
    +746873
    +746891
    +746899
    +746903
    +746939
    +746951
    +746957
    +746959
    +746969
    +746981
    +746989
    +747037
    +747049
    +747053
    +747073
    +747107
    +747113
    +747139
    +747157
    +747161
    +747199
    +747203
    +747223
    +747239
    +747259
    +747277
    +747283
    +747287
    +747319
    +747323
    +747343
    +747361
    +747377
    +747391
    +747401
    +747407
    +747421
    +747427
    +747449
    +747451
    +747457
    +747463
    +747493
    +747497
    +747499
    +747521
    +747529
    +747547
    +747557
    +747563
    +747583
    +747587
    +747599
    +747611
    +747619
    +747647
    +747673
    +747679
    +747713
    +747731
    +747737
    +747743
    +747763
    +747781
    +747811
    +747827
    +747829
    +747833
    +747839
    +747841
    +747853
    +747863
    +747869
    +747871
    +747889
    +747917
    +747919
    +747941
    +747953
    +747977
    +747979
    +747991
    +748003
    +748019
    +748021
    +748039
    +748057
    +748091
    +748093
    +748133
    +748169
    +748183
    +748199
    +748207
    +748211
    +748217
    +748219
    +748249
    +748271
    +748273
    +748283
    +748301
    +748331
    +748337
    +748339
    +748343
    +748361
    +748379
    +748387
    +748441
    +748453
    +748463
    +748471
    +748481
    +748487
    +748499
    +748513
    +748523
    +748541
    +748567
    +748589
    +748597
    +748603
    +748609
    +748613
    +748633
    +748637
    +748639
    +748669
    +748687
    +748691
    +748703
    +748711
    +748717
    +748723
    +748729
    +748763
    +748777
    +748789
    +748801
    +748807
    +748817
    +748819
    +748823
    +748829
    +748831
    +748849
    +748861
    +748871
    +748877
    +748883
    +748889
    +748921
    +748933
    +748963
    +748973
    +748981
    +748987
    +749011
    +749027
    +749051
    +749069
    +749081
    +749083
    +749093
    +749129
    +749137
    +749143
    +749149
    +749153
    +749167
    +749171
    +749183
    +749197
    +749209
    +749219
    +749237
    +749249
    +749257
    +749267
    +749279
    +749297
    +749299
    +749323
    +749339
    +749347
    +749351
    +749383
    +749393
    +749401
    +749423
    +749429
    +749431
    +749443
    +749449
    +749453
    +749461
    +749467
    +749471
    +749543
    +749557
    +749587
    +749641
    +749653
    +749659
    +749677
    +749701
    +749711
    +749729
    +749741
    +749747
    +749761
    +749773
    +749779
    +749803
    +749807
    +749809
    +749843
    +749851
    +749863
    +749891
    +749893
    +749899
    +749909
    +749923
    +749927
    +749939
    +749941
    +749971
    +749993
    +750019
    +750037
    +750059
    +750077
    +750083
    +750097
    +750119
    +750121
    +750131
    +750133
    +750137
    +750151
    +750157
    +750161
    +750163
    +750173
    +750179
    +750203
    +750209
    +750223
    +750229
    +750287
    +750311
    +750313
    +750353
    +750383
    +750401
    +750413
    +750419
    +750437
    +750457
    +750473
    +750487
    +750509
    +750517
    +750521
    +750553
    +750571
    +750599
    +750613
    +750641
    +750653
    +750661
    +750667
    +750679
    +750691
    +750707
    +750713
    +750719
    +750721
    +750749
    +750769
    +750787
    +750791
    +750797
    +750803
    +750809
    +750817
    +750829
    +750853
    +750857
    +750863
    +750917
    +750929
    +750943
    +750961
    +750977
    +750983
    +751001
    +751007
    +751021
    +751027
    +751057
    +751061
    +751087
    +751103
    +751123
    +751133
    +751139
    +751141
    +751147
    +751151
    +751181
    +751183
    +751189
    +751193
    +751199
    +751207
    +751217
    +751237
    +751259
    +751273
    +751277
    +751291
    +751297
    +751301
    +751307
    +751319
    +751321
    +751327
    +751343
    +751351
    +751357
    +751363
    +751367
    +751379
    +751411
    +751423
    +751447
    +751453
    +751463
    +751481
    +751523
    +751529
    +751549
    +751567
    +751579
    +751609
    +751613
    +751627
    +751631
    +751633
    +751637
    +751643
    +751661
    +751669
    +751691
    +751711
    +751717
    +751727
    +751739
    +751747
    +751753
    +751759
    +751763
    +751787
    +751799
    +751813
    +751823
    +751841
    +751853
    +751867
    +751871
    +751879
    +751901
    +751909
    +751913
    +751921
    +751943
    +751957
    +751969
    +751987
    +751997
    +752009
    +752023
    +752033
    +752053
    +752083
    +752093
    +752107
    +752111
    +752117
    +752137
    +752149
    +752177
    +752183
    +752189
    +752197
    +752201
    +752203
    +752207
    +752251
    +752263
    +752273
    +752281
    +752287
    +752291
    +752293
    +752299
    +752303
    +752351
    +752359
    +752383
    +752413
    +752431
    +752447
    +752449
    +752459
    +752483
    +752489
    +752503
    +752513
    +752519
    +752527
    +752569
    +752581
    +752593
    +752603
    +752627
    +752639
    +752651
    +752681
    +752683
    +752699
    +752701
    +752707
    +752747
    +752771
    +752789
    +752797
    +752803
    +752809
    +752819
    +752821
    +752831
    +752833
    +752861
    +752867
    +752881
    +752891
    +752903
    +752911
    +752929
    +752933
    +752977
    +752993
    +753001
    +753007
    +753019
    +753023
    +753031
    +753079
    +753091
    +753127
    +753133
    +753139
    +753143
    +753161
    +753187
    +753191
    +753197
    +753229
    +753257
    +753307
    +753329
    +753341
    +753353
    +753367
    +753373
    +753383
    +753409
    +753421
    +753427
    +753437
    +753439
    +753461
    +753463
    +753497
    +753499
    +753527
    +753547
    +753569
    +753583
    +753587
    +753589
    +753611
    +753617
    +753619
    +753631
    +753647
    +753659
    +753677
    +753679
    +753689
    +753691
    +753707
    +753719
    +753721
    +753737
    +753743
    +753751
    +753773
    +753793
    +753799
    +753803
    +753811
    +753821
    +753839
    +753847
    +753859
    +753931
    +753937
    +753941
    +753947
    +753959
    +753979
    +753983
    +754003
    +754027
    +754037
    +754043
    +754057
    +754067
    +754073
    +754081
    +754093
    +754099
    +754109
    +754111
    +754121
    +754123
    +754133
    +754153
    +754157
    +754181
    +754183
    +754207
    +754211
    +754217
    +754223
    +754241
    +754249
    +754267
    +754279
    +754283
    +754289
    +754297
    +754301
    +754333
    +754337
    +754343
    +754367
    +754373
    +754379
    +754381
    +754399
    +754417
    +754421
    +754427
    +754451
    +754463
    +754483
    +754489
    +754513
    +754531
    +754549
    +754573
    +754577
    +754583
    +754597
    +754627
    +754639
    +754651
    +754703
    +754709
    +754711
    +754717
    +754723
    +754739
    +754751
    +754771
    +754781
    +754811
    +754829
    +754861
    +754877
    +754891
    +754903
    +754907
    +754921
    +754931
    +754937
    +754939
    +754967
    +754969
    +754973
    +754979
    +754981
    +754991
    +754993
    +755009
    +755033
    +755057
    +755071
    +755077
    +755081
    +755087
    +755107
    +755137
    +755143
    +755147
    +755171
    +755173
    +755203
    +755213
    +755233
    +755239
    +755257
    +755267
    +755273
    +755309
    +755311
    +755317
    +755329
    +755333
    +755351
    +755357
    +755371
    +755387
    +755393
    +755399
    +755401
    +755413
    +755437
    +755441
    +755449
    +755473
    +755483
    +755509
    +755539
    +755551
    +755561
    +755567
    +755569
    +755593
    +755597
    +755617
    +755627
    +755663
    +755681
    +755707
    +755717
    +755719
    +755737
    +755759
    +755767
    +755771
    +755789
    +755791
    +755809
    +755813
    +755861
    +755863
    +755869
    +755879
    +755899
    +755903
    +755959
    +755969
    +755977
    +756011
    +756023
    +756043
    +756053
    +756097
    +756101
    +756127
    +756131
    +756139
    +756149
    +756167
    +756179
    +756191
    +756199
    +756227
    +756247
    +756251
    +756253
    +756271
    +756281
    +756289
    +756293
    +756319
    +756323
    +756331
    +756373
    +756403
    +756419
    +756421
    +756433
    +756443
    +756463
    +756467
    +756527
    +756533
    +756541
    +756563
    +756571
    +756593
    +756601
    +756607
    +756629
    +756641
    +756649
    +756667
    +756673
    +756683
    +756689
    +756703
    +756709
    +756719
    +756727
    +756739
    +756773
    +756799
    +756829
    +756839
    +756853
    +756869
    +756881
    +756887
    +756919
    +756923
    +756961
    +756967
    +756971
    +757019
    +757039
    +757063
    +757067
    +757109
    +757111
    +757151
    +757157
    +757171
    +757181
    +757201
    +757241
    +757243
    +757247
    +757259
    +757271
    +757291
    +757297
    +757307
    +757319
    +757327
    +757331
    +757343
    +757363
    +757381
    +757387
    +757403
    +757409
    +757417
    +757429
    +757433
    +757457
    +757481
    +757487
    +757507
    +757513
    +757517
    +757543
    +757553
    +757577
    +757579
    +757583
    +757607
    +757633
    +757651
    +757661
    +757693
    +757699
    +757709
    +757711
    +757727
    +757751
    +757753
    +757763
    +757793
    +757807
    +757811
    +757819
    +757829
    +757879
    +757903
    +757909
    +757927
    +757937
    +757943
    +757951
    +757993
    +757997
    +758003
    +758029
    +758041
    +758053
    +758071
    +758083
    +758099
    +758101
    +758111
    +758137
    +758141
    +758159
    +758179
    +758189
    +758201
    +758203
    +758227
    +758231
    +758237
    +758243
    +758267
    +758269
    +758273
    +758279
    +758299
    +758323
    +758339
    +758341
    +758357
    +758363
    +758383
    +758393
    +758411
    +758431
    +758441
    +758449
    +758453
    +758491
    +758501
    +758503
    +758519
    +758521
    +758551
    +758561
    +758573
    +758579
    +758599
    +758617
    +758629
    +758633
    +758671
    +758687
    +758699
    +758707
    +758711
    +758713
    +758729
    +758731
    +758741
    +758743
    +758753
    +758767
    +758783
    +758789
    +758819
    +758827
    +758837
    +758851
    +758867
    +758887
    +758893
    +758899
    +758929
    +758941
    +758957
    +758963
    +758969
    +758971
    +758987
    +759001
    +759019
    +759029
    +759037
    +759047
    +759053
    +759089
    +759103
    +759113
    +759131
    +759149
    +759167
    +759173
    +759179
    +759181
    +759193
    +759223
    +759229
    +759263
    +759287
    +759293
    +759301
    +759313
    +759329
    +759359
    +759371
    +759377
    +759397
    +759401
    +759431
    +759433
    +759457
    +759463
    +759467
    +759491
    +759503
    +759523
    +759547
    +759553
    +759557
    +759559
    +759569
    +759571
    +759581
    +759589
    +759599
    +759617
    +759623
    +759631
    +759637
    +759641
    +759653
    +759659
    +759673
    +759691
    +759697
    +759701
    +759709
    +759719
    +759727
    +759739
    +759757
    +759763
    +759797
    +759799
    +759821
    +759833
    +759881
    +759893
    +759911
    +759923
    +759929
    +759947
    +759953
    +759959
    +759961
    +759973
    +760007
    +760043
    +760063
    +760079
    +760093
    +760103
    +760117
    +760129
    +760141
    +760147
    +760153
    +760163
    +760169
    +760183
    +760187
    +760211
    +760229
    +760231
    +760237
    +760241
    +760261
    +760267
    +760273
    +760289
    +760297
    +760301
    +760321
    +760343
    +760367
    +760373
    +760411
    +760423
    +760433
    +760447
    +760453
    +760457
    +760477
    +760489
    +760499
    +760511
    +760519
    +760531
    +760537
    +760549
    +760553
    +760561
    +760567
    +760579
    +760607
    +760619
    +760621
    +760637
    +760649
    +760657
    +760693
    +760723
    +760729
    +760759
    +760769
    +760783
    +760807
    +760813
    +760841
    +760843
    +760847
    +760871
    +760891
    +760897
    +760901
    +760913
    +760927
    +760933
    +760939
    +760951
    +760961
    +760993
    +760997
    +761003
    +761009
    +761023
    +761051
    +761069
    +761087
    +761113
    +761119
    +761129
    +761153
    +761161
    +761177
    +761179
    +761183
    +761203
    +761207
    +761213
    +761227
    +761249
    +761251
    +761261
    +761263
    +761291
    +761297
    +761347
    +761351
    +761357
    +761363
    +761377
    +761381
    +761389
    +761393
    +761399
    +761407
    +761417
    +761429
    +761437
    +761441
    +761443
    +761459
    +761471
    +761477
    +761483
    +761489
    +761521
    +761531
    +761533
    +761543
    +761561
    +761567
    +761591
    +761597
    +761603
    +761611
    +761623
    +761633
    +761669
    +761671
    +761681
    +761689
    +761711
    +761713
    +761731
    +761773
    +761777
    +761779
    +761807
    +761809
    +761833
    +761861
    +761863
    +761869
    +761879
    +761897
    +761927
    +761939
    +761963
    +761977
    +761983
    +761993
    +762001
    +762007
    +762017
    +762031
    +762037
    +762049
    +762053
    +762061
    +762101
    +762121
    +762187
    +762211
    +762227
    +762233
    +762239
    +762241
    +762253
    +762257
    +762277
    +762319
    +762329
    +762367
    +762371
    +762373
    +762379
    +762389
    +762397
    +762401
    +762407
    +762409
    +762479
    +762491
    +762499
    +762529
    +762539
    +762547
    +762557
    +762563
    +762571
    +762577
    +762583
    +762599
    +762647
    +762653
    +762659
    +762667
    +762721
    +762737
    +762743
    +762761
    +762779
    +762791
    +762809
    +762821
    +762823
    +762847
    +762871
    +762877
    +762893
    +762899
    +762901
    +762913
    +762917
    +762919
    +762959
    +762967
    +762973
    +762989
    +763001
    +763013
    +763027
    +763031
    +763039
    +763043
    +763067
    +763073
    +763093
    +763111
    +763123
    +763141
    +763157
    +763159
    +763183
    +763201
    +763223
    +763237
    +763261
    +763267
    +763271
    +763303
    +763307
    +763339
    +763349
    +763369
    +763381
    +763391
    +763403
    +763409
    +763417
    +763423
    +763429
    +763447
    +763457
    +763471
    +763481
    +763493
    +763513
    +763523
    +763549
    +763559
    +763573
    +763579
    +763583
    +763597
    +763601
    +763613
    +763619
    +763621
    +763627
    +763649
    +763663
    +763673
    +763699
    +763739
    +763751
    +763753
    +763757
    +763771
    +763787
    +763801
    +763811
    +763823
    +763843
    +763859
    +763879
    +763883
    +763897
    +763901
    +763907
    +763913
    +763921
    +763927
    +763937
    +763943
    +763957
    +763967
    +763999
    +764003
    +764011
    +764017
    +764021
    +764041
    +764051
    +764053
    +764059
    +764081
    +764089
    +764111
    +764131
    +764143
    +764149
    +764171
    +764189
    +764209
    +764233
    +764249
    +764251
    +764261
    +764273
    +764293
    +764317
    +764321
    +764327
    +764339
    +764341
    +764369
    +764381
    +764399
    +764431
    +764447
    +764459
    +764471
    +764501
    +764521
    +764539
    +764551
    +764563
    +764587
    +764591
    +764593
    +764611
    +764623
    +764627
    +764629
    +764657
    +764683
    +764689
    +764717
    +764719
    +764723
    +764783
    +764789
    +764809
    +764837
    +764839
    +764849
    +764857
    +764887
    +764891
    +764893
    +764899
    +764903
    +764947
    +764969
    +764971
    +764977
    +764989
    +764993
    +764999
    +765007
    +765031
    +765041
    +765043
    +765047
    +765059
    +765091
    +765097
    +765103
    +765109
    +765131
    +765137
    +765139
    +765143
    +765151
    +765169
    +765181
    +765199
    +765203
    +765209
    +765211
    +765227
    +765229
    +765241
    +765251
    +765257
    +765283
    +765287
    +765293
    +765307
    +765313
    +765319
    +765329
    +765353
    +765379
    +765383
    +765389
    +765409
    +765437
    +765439
    +765461
    +765467
    +765487
    +765497
    +765503
    +765521
    +765533
    +765539
    +765577
    +765581
    +765587
    +765613
    +765619
    +765623
    +765649
    +765659
    +765673
    +765707
    +765727
    +765749
    +765763
    +765767
    +765773
    +765781
    +765823
    +765827
    +765847
    +765851
    +765857
    +765859
    +765881
    +765889
    +765893
    +765899
    +765907
    +765913
    +765931
    +765949
    +765953
    +765971
    +765983
    +765991
    +766021
    +766039
    +766049
    +766067
    +766079
    +766091
    +766097
    +766109
    +766111
    +766127
    +766163
    +766169
    +766177
    +766187
    +766211
    +766223
    +766229
    +766231
    +766237
    +766247
    +766261
    +766273
    +766277
    +766301
    +766313
    +766321
    +766333
    +766357
    +766361
    +766369
    +766373
    +766387
    +766393
    +766399
    +766421
    +766439
    +766453
    +766457
    +766471
    +766477
    +766487
    +766501
    +766511
    +766531
    +766541
    +766543
    +766553
    +766559
    +766583
    +766609
    +766637
    +766639
    +766651
    +766679
    +766687
    +766721
    +766739
    +766757
    +766763
    +766769
    +766793
    +766807
    +766811
    +766813
    +766817
    +766861
    +766867
    +766873
    +766877
    +766891
    +766901
    +766907
    +766937
    +766939
    +766943
    +766957
    +766967
    +766999
    +767017
    +767029
    +767051
    +767071
    +767089
    +767093
    +767101
    +767111
    +767131
    +767147
    +767153
    +767161
    +767167
    +767203
    +767243
    +767279
    +767287
    +767293
    +767309
    +767317
    +767321
    +767323
    +767339
    +767357
    +767359
    +767381
    +767399
    +767423
    +767443
    +767471
    +767489
    +767509
    +767513
    +767521
    +767527
    +767537
    +767539
    +767549
    +767551
    +767587
    +767597
    +767603
    +767617
    +767623
    +767633
    +767647
    +767677
    +767681
    +767707
    +767729
    +767747
    +767749
    +767759
    +767761
    +767773
    +767783
    +767813
    +767827
    +767831
    +767843
    +767857
    +767863
    +767867
    +767869
    +767881
    +767909
    +767951
    +767957
    +768013
    +768029
    +768041
    +768049
    +768059
    +768073
    +768101
    +768107
    +768127
    +768133
    +768139
    +768161
    +768167
    +768169
    +768191
    +768193
    +768197
    +768199
    +768203
    +768221
    +768241
    +768259
    +768263
    +768301
    +768319
    +768323
    +768329
    +768343
    +768347
    +768353
    +768359
    +768371
    +768373
    +768377
    +768389
    +768401
    +768409
    +768419
    +768431
    +768437
    +768457
    +768461
    +768479
    +768491
    +768503
    +768541
    +768563
    +768571
    +768589
    +768613
    +768623
    +768629
    +768631
    +768641
    +768643
    +768653
    +768671
    +768727
    +768751
    +768767
    +768773
    +768787
    +768793
    +768799
    +768811
    +768841
    +768851
    +768853
    +768857
    +768869
    +768881
    +768923
    +768931
    +768941
    +768953
    +768979
    +768983
    +769003
    +769007
    +769019
    +769033
    +769039
    +769057
    +769073
    +769081
    +769091
    +769117
    +769123
    +769147
    +769151
    +769159
    +769169
    +769207
    +769231
    +769243
    +769247
    +769259
    +769261
    +769273
    +769289
    +769297
    +769309
    +769319
    +769339
    +769357
    +769387
    +769411
    +769421
    +769423
    +769429
    +769453
    +769459
    +769463
    +769469
    +769487
    +769541
    +769543
    +769547
    +769553
    +769577
    +769579
    +769589
    +769591
    +769597
    +769619
    +769627
    +769661
    +769663
    +769673
    +769687
    +769723
    +769729
    +769733
    +769739
    +769751
    +769781
    +769789
    +769799
    +769807
    +769837
    +769871
    +769903
    +769919
    +769927
    +769943
    +769961
    +769963
    +769973
    +769987
    +769997
    +769999
    +770027
    +770039
    +770041
    +770047
    +770053
    +770057
    +770059
    +770069
    +770101
    +770111
    +770113
    +770123
    +770129
    +770167
    +770177
    +770179
    +770183
    +770191
    +770207
    +770227
    +770233
    +770239
    +770261
    +770281
    +770291
    +770309
    +770311
    +770353
    +770359
    +770387
    +770401
    +770417
    +770437
    +770447
    +770449
    +770459
    +770503
    +770519
    +770527
    +770533
    +770537
    +770551
    +770557
    +770573
    +770579
    +770587
    +770591
    +770597
    +770611
    +770639
    +770641
    +770647
    +770657
    +770663
    +770669
    +770741
    +770761
    +770767
    +770771
    +770789
    +770801
    +770813
    +770837
    +770839
    +770843
    +770863
    +770867
    +770873
    +770881
    +770897
    +770909
    +770927
    +770929
    +770951
    +770971
    +770981
    +770993
    +771011
    +771013
    +771019
    +771031
    +771037
    +771047
    +771049
    +771073
    +771079
    +771091
    +771109
    +771143
    +771163
    +771179
    +771181
    +771209
    +771217
    +771227
    +771233
    +771269
    +771283
    +771289
    +771293
    +771299
    +771301
    +771349
    +771359
    +771389
    +771401
    +771403
    +771427
    +771431
    +771437
    +771439
    +771461
    +771473
    +771481
    +771499
    +771503
    +771509
    +771517
    +771527
    +771553
    +771569
    +771583
    +771587
    +771607
    +771619
    +771623
    +771629
    +771637
    +771643
    +771653
    +771679
    +771691
    +771697
    +771703
    +771739
    +771763
    +771769
    +771781
    +771809
    +771853
    +771863
    +771877
    +771887
    +771889
    +771899
    +771917
    +771937
    +771941
    +771961
    +771971
    +771973
    +771997
    +772001
    +772003
    +772019
    +772061
    +772073
    +772081
    +772091
    +772097
    +772127
    +772139
    +772147
    +772159
    +772169
    +772181
    +772207
    +772229
    +772231
    +772273
    +772279
    +772297
    +772313
    +772333
    +772339
    +772349
    +772367
    +772379
    +772381
    +772391
    +772393
    +772403
    +772439
    +772441
    +772451
    +772459
    +772477
    +772493
    +772517
    +772537
    +772567
    +772571
    +772573
    +772591
    +772619
    +772631
    +772649
    +772657
    +772661
    +772663
    +772669
    +772691
    +772697
    +772703
    +772721
    +772757
    +772771
    +772789
    +772843
    +772847
    +772853
    +772859
    +772867
    +772903
    +772907
    +772909
    +772913
    +772921
    +772949
    +772963
    +772987
    +772991
    +773021
    +773023
    +773027
    +773029
    +773039
    +773057
    +773063
    +773081
    +773083
    +773093
    +773117
    +773147
    +773153
    +773159
    +773207
    +773209
    +773231
    +773239
    +773249
    +773251
    +773273
    +773287
    +773299
    +773317
    +773341
    +773363
    +773371
    +773387
    +773393
    +773407
    +773417
    +773447
    +773453
    +773473
    +773491
    +773497
    +773501
    +773533
    +773537
    +773561
    +773567
    +773569
    +773579
    +773599
    +773603
    +773609
    +773611
    +773657
    +773659
    +773681
    +773683
    +773693
    +773713
    +773719
    +773723
    +773767
    +773777
    +773779
    +773803
    +773821
    +773831
    +773837
    +773849
    +773863
    +773867
    +773869
    +773879
    +773897
    +773909
    +773933
    +773939
    +773951
    +773953
    +773987
    +773989
    +773999
    +774001
    +774017
    +774023
    +774047
    +774071
    +774073
    +774083
    +774107
    +774119
    +774127
    +774131
    +774133
    +774143
    +774149
    +774161
    +774173
    +774181
    +774199
    +774217
    +774223
    +774229
    +774233
    +774239
    +774283
    +774289
    +774313
    +774317
    +774337
    +774343
    +774377
    +774427
    +774439
    +774463
    +774467
    +774491
    +774511
    +774523
    +774541
    +774551
    +774577
    +774583
    +774589
    +774593
    +774601
    +774629
    +774643
    +774661
    +774667
    +774671
    +774679
    +774691
    +774703
    +774733
    +774757
    +774773
    +774779
    +774791
    +774797
    +774799
    +774803
    +774811
    +774821
    +774833
    +774853
    +774857
    +774863
    +774901
    +774919
    +774929
    +774931
    +774959
    +774997
    +775007
    +775037
    +775043
    +775057
    +775063
    +775079
    +775087
    +775091
    +775097
    +775121
    +775147
    +775153
    +775157
    +775163
    +775189
    +775193
    +775237
    +775241
    +775259
    +775267
    +775273
    +775309
    +775343
    +775349
    +775361
    +775363
    +775367
    +775393
    +775417
    +775441
    +775451
    +775477
    +775507
    +775513
    +775517
    +775531
    +775553
    +775573
    +775601
    +775603
    +775613
    +775627
    +775633
    +775639
    +775661
    +775669
    +775681
    +775711
    +775729
    +775739
    +775741
    +775757
    +775777
    +775787
    +775807
    +775811
    +775823
    +775861
    +775871
    +775889
    +775919
    +775933
    +775937
    +775939
    +775949
    +775963
    +775987
    +776003
    +776029
    +776047
    +776057
    +776059
    +776077
    +776099
    +776117
    +776119
    +776137
    +776143
    +776159
    +776173
    +776177
    +776179
    +776183
    +776201
    +776219
    +776221
    +776233
    +776249
    +776257
    +776267
    +776287
    +776317
    +776327
    +776357
    +776389
    +776401
    +776429
    +776449
    +776453
    +776467
    +776471
    +776483
    +776497
    +776507
    +776513
    +776521
    +776551
    +776557
    +776561
    +776563
    +776569
    +776599
    +776627
    +776651
    +776683
    +776693
    +776719
    +776729
    +776749
    +776753
    +776759
    +776801
    +776813
    +776819
    +776837
    +776851
    +776861
    +776869
    +776879
    +776887
    +776899
    +776921
    +776947
    +776969
    +776977
    +776983
    +776987
    +777001
    +777011
    +777013
    +777031
    +777041
    +777071
    +777097
    +777103
    +777109
    +777137
    +777143
    +777151
    +777167
    +777169
    +777173
    +777181
    +777187
    +777191
    +777199
    +777209
    +777221
    +777241
    +777247
    +777251
    +777269
    +777277
    +777313
    +777317
    +777349
    +777353
    +777373
    +777383
    +777389
    +777391
    +777419
    +777421
    +777431
    +777433
    +777437
    +777451
    +777463
    +777473
    +777479
    +777541
    +777551
    +777571
    +777583
    +777589
    +777617
    +777619
    +777641
    +777643
    +777661
    +777671
    +777677
    +777683
    +777731
    +777737
    +777743
    +777761
    +777769
    +777781
    +777787
    +777817
    +777839
    +777857
    +777859
    +777863
    +777871
    +777877
    +777901
    +777911
    +777919
    +777977
    +777979
    +777989
    +778013
    +778027
    +778049
    +778051
    +778061
    +778079
    +778081
    +778091
    +778097
    +778109
    +778111
    +778121
    +778123
    +778153
    +778163
    +778187
    +778201
    +778213
    +778223
    +778237
    +778241
    +778247
    +778301
    +778307
    +778313
    +778319
    +778333
    +778357
    +778361
    +778363
    +778391
    +778397
    +778403
    +778409
    +778417
    +778439
    +778469
    +778507
    +778511
    +778513
    +778523
    +778529
    +778537
    +778541
    +778553
    +778559
    +778567
    +778579
    +778597
    +778633
    +778643
    +778663
    +778667
    +778681
    +778693
    +778697
    +778699
    +778709
    +778717
    +778727
    +778733
    +778759
    +778763
    +778769
    +778777
    +778793
    +778819
    +778831
    +778847
    +778871
    +778873
    +778879
    +778903
    +778907
    +778913
    +778927
    +778933
    +778951
    +778963
    +778979
    +778993
    +779003
    +779011
    +779021
    +779039
    +779063
    +779069
    +779081
    +779101
    +779111
    +779131
    +779137
    +779159
    +779173
    +779189
    +779221
    +779231
    +779239
    +779249
    +779267
    +779327
    +779329
    +779341
    +779347
    +779351
    +779353
    +779357
    +779377
    +779413
    +779477
    +779489
    +779507
    +779521
    +779531
    +779543
    +779561
    +779563
    +779573
    +779579
    +779591
    +779593
    +779599
    +779609
    +779617
    +779621
    +779657
    +779659
    +779663
    +779693
    +779699
    +779707
    +779731
    +779747
    +779749
    +779761
    +779767
    +779771
    +779791
    +779797
    +779827
    +779837
    +779869
    +779873
    +779879
    +779887
    +779899
    +779927
    +779939
    +779971
    +779981
    +779983
    +779993
    +780029
    +780037
    +780041
    +780047
    +780049
    +780061
    +780119
    +780127
    +780163
    +780173
    +780179
    +780191
    +780193
    +780211
    +780223
    +780233
    +780253
    +780257
    +780287
    +780323
    +780343
    +780347
    +780371
    +780379
    +780383
    +780389
    +780397
    +780401
    +780421
    +780433
    +780457
    +780469
    +780499
    +780523
    +780553
    +780583
    +780587
    +780601
    +780613
    +780631
    +780649
    +780667
    +780671
    +780679
    +780683
    +780697
    +780707
    +780719
    +780721
    +780733
    +780799
    +780803
    +780809
    +780817
    +780823
    +780833
    +780841
    +780851
    +780853
    +780869
    +780877
    +780887
    +780889
    +780917
    +780931
    +780953
    +780961
    +780971
    +780973
    +780991
    +781003
    +781007
    +781021
    +781043
    +781051
    +781063
    +781069
    +781087
    +781111
    +781117
    +781127
    +781129
    +781139
    +781163
    +781171
    +781199
    +781211
    +781217
    +781229
    +781243
    +781247
    +781271
    +781283
    +781301
    +781307
    +781309
    +781321
    +781327
    +781351
    +781357
    +781367
    +781369
    +781387
    +781397
    +781399
    +781409
    +781423
    +781427
    +781433
    +781453
    +781481
    +781483
    +781493
    +781511
    +781513
    +781519
    +781523
    +781531
    +781559
    +781567
    +781589
    +781601
    +781607
    +781619
    +781631
    +781633
    +781661
    +781673
    +781681
    +781721
    +781733
    +781741
    +781771
    +781799
    +781801
    +781817
    +781819
    +781853
    +781861
    +781867
    +781883
    +781889
    +781897
    +781919
    +781951
    +781961
    +781967
    +781969
    +781973
    +781987
    +781997
    +781999
    +782003
    +782009
    +782011
    +782053
    +782057
    +782071
    +782083
    +782087
    +782107
    +782113
    +782123
    +782129
    +782137
    +782141
    +782147
    +782149
    +782183
    +782189
    +782191
    +782209
    +782219
    +782231
    +782251
    +782263
    +782267
    +782297
    +782311
    +782329
    +782339
    +782371
    +782381
    +782387
    +782389
    +782393
    +782429
    +782443
    +782461
    +782473
    +782489
    +782497
    +782501
    +782519
    +782539
    +782581
    +782611
    +782641
    +782659
    +782669
    +782671
    +782687
    +782689
    +782707
    +782711
    +782723
    +782777
    +782783
    +782791
    +782839
    +782849
    +782861
    +782891
    +782911
    +782921
    +782941
    +782963
    +782981
    +782983
    +782993
    +783007
    +783011
    +783019
    +783023
    +783043
    +783077
    +783089
    +783119
    +783121
    +783131
    +783137
    +783143
    +783149
    +783151
    +783191
    +783193
    +783197
    +783227
    +783247
    +783257
    +783259
    +783269
    +783283
    +783317
    +783323
    +783329
    +783337
    +783359
    +783361
    +783373
    +783379
    +783407
    +783413
    +783421
    +783473
    +783487
    +783527
    +783529
    +783533
    +783553
    +783557
    +783569
    +783571
    +783599
    +783613
    +783619
    +783641
    +783647
    +783661
    +783677
    +783689
    +783691
    +783701
    +783703
    +783707
    +783719
    +783721
    +783733
    +783737
    +783743
    +783749
    +783763
    +783767
    +783779
    +783781
    +783787
    +783791
    +783793
    +783799
    +783803
    +783829
    +783869
    +783877
    +783931
    +783953
    +784009
    +784039
    +784061
    +784081
    +784087
    +784097
    +784103
    +784109
    +784117
    +784129
    +784153
    +784171
    +784181
    +784183
    +784211
    +784213
    +784219
    +784229
    +784243
    +784249
    +784283
    +784307
    +784309
    +784313
    +784321
    +784327
    +784349
    +784351
    +784367
    +784373
    +784379
    +784387
    +784409
    +784411
    +784423
    +784447
    +784451
    +784457
    +784463
    +784471
    +784481
    +784489
    +784501
    +784513
    +784541
    +784543
    +784547
    +784561
    +784573
    +784577
    +784583
    +784603
    +784627
    +784649
    +784661
    +784687
    +784697
    +784717
    +784723
    +784727
    +784753
    +784789
    +784799
    +784831
    +784837
    +784841
    +784859
    +784867
    +784897
    +784913
    +784919
    +784939
    +784957
    +784961
    +784981
    +785003
    +785017
    +785033
    +785053
    +785093
    +785101
    +785107
    +785119
    +785123
    +785129
    +785143
    +785153
    +785159
    +785167
    +785203
    +785207
    +785219
    +785221
    +785227
    +785249
    +785269
    +785287
    +785293
    +785299
    +785303
    +785311
    +785321
    +785329
    +785333
    +785341
    +785347
    +785353
    +785357
    +785363
    +785377
    +785413
    +785423
    +785431
    +785459
    +785461
    +785483
    +785501
    +785503
    +785527
    +785537
    +785549
    +785569
    +785573
    +785579
    +785591
    +785597
    +785623
    +785627
    +785641
    +785651
    +785671
    +785693
    +785717
    +785731
    +785737
    +785753
    +785773
    +785777
    +785779
    +785801
    +785803
    +785809
    +785839
    +785857
    +785861
    +785879
    +785903
    +785921
    +785923
    +785947
    +785951
    +785963
    +786001
    +786013
    +786017
    +786031
    +786047
    +786053
    +786059
    +786061
    +786077
    +786109
    +786127
    +786151
    +786167
    +786173
    +786179
    +786197
    +786211
    +786223
    +786241
    +786251
    +786271
    +786307
    +786311
    +786319
    +786329
    +786337
    +786349
    +786371
    +786407
    +786419
    +786431
    +786433
    +786449
    +786469
    +786491
    +786547
    +786551
    +786553
    +786587
    +786589
    +786613
    +786629
    +786659
    +786661
    +786673
    +786691
    +786697
    +786701
    +786703
    +786707
    +786719
    +786739
    +786763
    +786803
    +786823
    +786829
    +786833
    +786859
    +786881
    +786887
    +786889
    +786901
    +786931
    +786937
    +786941
    +786949
    +786959
    +786971
    +786979
    +786983
    +787021
    +787043
    +787051
    +787057
    +787067
    +787069
    +787079
    +787091
    +787099
    +787123
    +787139
    +787153
    +787181
    +787187
    +787207
    +787217
    +787243
    +787261
    +787277
    +787289
    +787309
    +787331
    +787333
    +787337
    +787357
    +787361
    +787427
    +787429
    +787433
    +787439
    +787447
    +787469
    +787477
    +787483
    +787489
    +787513
    +787517
    +787519
    +787529
    +787537
    +787541
    +787547
    +787573
    +787601
    +787609
    +787621
    +787639
    +787649
    +787667
    +787697
    +787711
    +787747
    +787751
    +787757
    +787769
    +787771
    +787777
    +787783
    +787793
    +787807
    +787811
    +787817
    +787823
    +787837
    +787879
    +787883
    +787903
    +787907
    +787939
    +787973
    +787981
    +787993
    +787999
    +788009
    +788023
    +788027
    +788033
    +788041
    +788071
    +788077
    +788087
    +788089
    +788093
    +788107
    +788129
    +788153
    +788159
    +788167
    +788173
    +788189
    +788209
    +788213
    +788231
    +788261
    +788267
    +788287
    +788309
    +788317
    +788321
    +788351
    +788353
    +788357
    +788363
    +788369
    +788377
    +788383
    +788387
    +788393
    +788399
    +788413
    +788419
    +788429
    +788449
    +788467
    +788479
    +788497
    +788521
    +788527
    +788531
    +788537
    +788549
    +788561
    +788563
    +788569
    +788603
    +788621
    +788651
    +788659
    +788677
    +788687
    +788701
    +788719
    +788761
    +788779
    +788789
    +788813
    +788819
    +788849
    +788863
    +788867
    +788869
    +788873
    +788891
    +788897
    +788903
    +788927
    +788933
    +788941
    +788947
    +788959
    +788971
    +788993
    +788999
    +789001
    +789017
    +789029
    +789031
    +789067
    +789077
    +789091
    +789097
    +789101
    +789109
    +789121
    +789133
    +789137
    +789149
    +789169
    +789181
    +789221
    +789227
    +789251
    +789311
    +789323
    +789331
    +789343
    +789367
    +789377
    +789389
    +789391
    +789407
    +789419
    +789443
    +789473
    +789491
    +789493
    +789511
    +789527
    +789533
    +789557
    +789571
    +789577
    +789587
    +789589
    +789611
    +789623
    +789631
    +789653
    +789671
    +789673
    +789683
    +789689
    +789709
    +789713
    +789721
    +789731
    +789739
    +789749
    +789793
    +789823
    +789829
    +789847
    +789851
    +789857
    +789883
    +789941
    +789959
    +789961
    +789967
    +789977
    +789979
    +790003
    +790021
    +790033
    +790043
    +790051
    +790057
    +790063
    +790087
    +790093
    +790099
    +790121
    +790169
    +790171
    +790189
    +790199
    +790201
    +790219
    +790241
    +790261
    +790271
    +790277
    +790289
    +790291
    +790327
    +790331
    +790333
    +790351
    +790369
    +790379
    +790397
    +790403
    +790417
    +790421
    +790429
    +790451
    +790459
    +790481
    +790501
    +790513
    +790519
    +790523
    +790529
    +790547
    +790567
    +790583
    +790589
    +790607
    +790613
    +790633
    +790637
    +790649
    +790651
    +790693
    +790697
    +790703
    +790709
    +790733
    +790739
    +790747
    +790753
    +790781
    +790793
    +790817
    +790819
    +790831
    +790843
    +790861
    +790871
    +790879
    +790883
    +790897
    +790927
    +790957
    +790961
    +790967
    +790969
    +790991
    +790997
    +791003
    +791009
    +791017
    +791029
    +791047
    +791053
    +791081
    +791093
    +791099
    +791111
    +791117
    +791137
    +791159
    +791191
    +791201
    +791209
    +791227
    +791233
    +791251
    +791257
    +791261
    +791291
    +791309
    +791311
    +791317
    +791321
    +791347
    +791363
    +791377
    +791387
    +791411
    +791419
    +791431
    +791443
    +791447
    +791473
    +791489
    +791519
    +791543
    +791561
    +791563
    +791569
    +791573
    +791599
    +791627
    +791629
    +791657
    +791663
    +791677
    +791699
    +791773
    +791783
    +791789
    +791797
    +791801
    +791803
    +791827
    +791849
    +791851
    +791887
    +791891
    +791897
    +791899
    +791909
    +791927
    +791929
    +791933
    +791951
    +791969
    +791971
    +791993
    +792023
    +792031
    +792037
    +792041
    +792049
    +792061
    +792067
    +792073
    +792101
    +792107
    +792109
    +792119
    +792131
    +792151
    +792163
    +792179
    +792223
    +792227
    +792229
    +792241
    +792247
    +792257
    +792263
    +792277
    +792283
    +792293
    +792299
    +792301
    +792307
    +792317
    +792359
    +792371
    +792377
    +792383
    +792397
    +792413
    +792443
    +792461
    +792479
    +792481
    +792487
    +792521
    +792529
    +792551
    +792553
    +792559
    +792563
    +792581
    +792593
    +792601
    +792613
    +792629
    +792637
    +792641
    +792643
    +792647
    +792667
    +792679
    +792689
    +792691
    +792697
    +792703
    +792709
    +792713
    +792731
    +792751
    +792769
    +792793
    +792797
    +792821
    +792871
    +792881
    +792893
    +792907
    +792919
    +792929
    +792941
    +792959
    +792973
    +792983
    +792989
    +792991
    +793043
    +793069
    +793099
    +793103
    +793123
    +793129
    +793139
    +793159
    +793181
    +793187
    +793189
    +793207
    +793229
    +793253
    +793279
    +793297
    +793301
    +793327
    +793333
    +793337
    +793343
    +793379
    +793399
    +793439
    +793447
    +793453
    +793487
    +793489
    +793493
    +793511
    +793517
    +793519
    +793537
    +793547
    +793553
    +793561
    +793591
    +793601
    +793607
    +793621
    +793627
    +793633
    +793669
    +793673
    +793691
    +793699
    +793711
    +793717
    +793721
    +793733
    +793739
    +793757
    +793769
    +793777
    +793787
    +793789
    +793813
    +793841
    +793843
    +793853
    +793867
    +793889
    +793901
    +793927
    +793931
    +793939
    +793957
    +793967
    +793979
    +793981
    +793999
    +794009
    +794011
    +794023
    +794033
    +794039
    +794041
    +794063
    +794071
    +794077
    +794089
    +794111
    +794113
    +794119
    +794137
    +794141
    +794149
    +794153
    +794161
    +794173
    +794179
    +794191
    +794201
    +794203
    +794207
    +794221
    +794231
    +794239
    +794249
    +794327
    +794341
    +794363
    +794383
    +794389
    +794399
    +794407
    +794413
    +794449
    +794471
    +794473
    +794477
    +794483
    +794491
    +794509
    +794531
    +794537
    +794543
    +794551
    +794557
    +794569
    +794579
    +794587
    +794593
    +794641
    +794653
    +794657
    +794659
    +794669
    +794693
    +794711
    +794741
    +794743
    +794749
    +794779
    +794831
    +794879
    +794881
    +794887
    +794921
    +794923
    +794953
    +794957
    +794993
    +794999
    +795001
    +795007
    +795023
    +795071
    +795077
    +795079
    +795083
    +795097
    +795101
    +795103
    +795121
    +795127
    +795139
    +795149
    +795161
    +795187
    +795203
    +795211
    +795217
    +795233
    +795239
    +795251
    +795253
    +795299
    +795307
    +795323
    +795329
    +795337
    +795343
    +795349
    +795427
    +795449
    +795461
    +795467
    +795479
    +795493
    +795503
    +795517
    +795527
    +795533
    +795539
    +795551
    +795581
    +795589
    +795601
    +795643
    +795647
    +795649
    +795653
    +795659
    +795661
    +795667
    +795679
    +795703
    +795709
    +795713
    +795727
    +795737
    +795761
    +795763
    +795791
    +795793
    +795797
    +795799
    +795803
    +795827
    +795829
    +795871
    +795877
    +795913
    +795917
    +795931
    +795937
    +795941
    +795943
    +795947
    +795979
    +795983
    +795997
    +796001
    +796009
    +796063
    +796067
    +796091
    +796121
    +796139
    +796141
    +796151
    +796171
    +796177
    +796181
    +796189
    +796193
    +796217
    +796247
    +796259
    +796267
    +796291
    +796303
    +796307
    +796337
    +796339
    +796361
    +796363
    +796373
    +796379
    +796387
    +796391
    +796409
    +796447
    +796451
    +796459
    +796487
    +796493
    +796517
    +796531
    +796541
    +796553
    +796561
    +796567
    +796571
    +796583
    +796591
    +796619
    +796633
    +796657
    +796673
    +796687
    +796693
    +796699
    +796709
    +796711
    +796751
    +796759
    +796769
    +796777
    +796781
    +796799
    +796801
    +796813
    +796819
    +796847
    +796849
    +796853
    +796867
    +796871
    +796877
    +796889
    +796921
    +796931
    +796933
    +796937
    +796951
    +796967
    +796969
    +796981
    +797003
    +797009
    +797021
    +797029
    +797033
    +797039
    +797051
    +797053
    +797057
    +797063
    +797077
    +797119
    +797131
    +797143
    +797161
    +797171
    +797201
    +797207
    +797273
    +797281
    +797287
    +797309
    +797311
    +797333
    +797353
    +797359
    +797383
    +797389
    +797399
    +797417
    +797429
    +797473
    +797497
    +797507
    +797509
    +797539
    +797549
    +797551
    +797557
    +797561
    +797567
    +797569
    +797579
    +797581
    +797591
    +797593
    +797611
    +797627
    +797633
    +797647
    +797681
    +797689
    +797701
    +797711
    +797729
    +797743
    +797747
    +797767
    +797773
    +797813
    +797833
    +797851
    +797869
    +797887
    +797897
    +797911
    +797917
    +797933
    +797947
    +797957
    +797977
    +797987
    +798023
    +798043
    +798059
    +798067
    +798071
    +798079
    +798089
    +798097
    +798101
    +798121
    +798131
    +798139
    +798143
    +798151
    +798173
    +798179
    +798191
    +798197
    +798199
    +798221
    +798223
    +798227
    +798251
    +798257
    +798263
    +798271
    +798293
    +798319
    +798331
    +798373
    +798383
    +798397
    +798403
    +798409
    +798443
    +798451
    +798461
    +798481
    +798487
    +798503
    +798517
    +798521
    +798527
    +798533
    +798569
    +798599
    +798613
    +798641
    +798647
    +798649
    +798667
    +798691
    +798697
    +798701
    +798713
    +798727
    +798737
    +798751
    +798757
    +798773
    +798781
    +798799
    +798823
    +798871
    +798887
    +798911
    +798923
    +798929
    +798937
    +798943
    +798961
    +799003
    +799021
    +799031
    +799061
    +799063
    +799091
    +799093
    +799103
    +799147
    +799151
    +799171
    +799217
    +799219
    +799223
    +799259
    +799291
    +799301
    +799303
    +799307
    +799313
    +799333
    +799343
    +799361
    +799363
    +799369
    +799417
    +799427
    +799441
    +799453
    +799471
    +799481
    +799483
    +799489
    +799507
    +799523
    +799529
    +799543
    +799553
    +799573
    +799609
    +799613
    +799619
    +799621
    +799633
    +799637
    +799651
    +799657
    +799661
    +799679
    +799723
    +799727
    +799739
    +799741
    +799753
    +799759
    +799789
    +799801
    +799807
    +799817
    +799837
    +799853
    +799859
    +799873
    +799891
    +799921
    +799949
    +799961
    +799979
    +799991
    +799993
    +799999
    +800011
    +800029
    +800053
    +800057
    +800077
    +800083
    +800089
    +800113
    +800117
    +800119
    +800123
    +800131
    +800143
    +800159
    +800161
    +800171
    +800209
    +800213
    +800221
    +800231
    +800237
    +800243
    +800281
    +800287
    +800291
    +800311
    +800329
    +800333
    +800351
    +800357
    +800399
    +800407
    +800417
    +800419
    +800441
    +800447
    +800473
    +800477
    +800483
    +800497
    +800509
    +800519
    +800521
    +800533
    +800537
    +800539
    +800549
    +800557
    +800573
    +800587
    +800593
    +800599
    +800621
    +800623
    +800647
    +800651
    +800659
    +800663
    +800669
    +800677
    +800687
    +800693
    +800707
    +800711
    +800729
    +800731
    +800741
    +800743
    +800759
    +800773
    +800783
    +800801
    +800861
    +800873
    +800879
    +800897
    +800903
    +800909
    +800923
    +800953
    +800959
    +800971
    +800977
    +800993
    +800999
    +801001
    +801007
    +801011
    +801019
    +801037
    +801061
    +801077
    +801079
    +801103
    +801107
    +801127
    +801137
    +801179
    +801187
    +801197
    +801217
    +801247
    +801277
    +801289
    +801293
    +801301
    +801331
    +801337
    +801341
    +801349
    +801371
    +801379
    +801403
    +801407
    +801419
    +801421
    +801461
    +801469
    +801487
    +801503
    +801517
    +801539
    +801551
    +801557
    +801569
    +801571
    +801607
    +801611
    +801617
    +801631
    +801641
    +801677
    +801683
    +801701
    +801707
    +801709
    +801733
    +801761
    +801791
    +801809
    +801811
    +801817
    +801833
    +801841
    +801859
    +801883
    +801947
    +801949
    +801959
    +801973
    +801989
    +802007
    +802019
    +802027
    +802031
    +802037
    +802073
    +802103
    +802121
    +802127
    +802129
    +802133
    +802141
    +802147
    +802159
    +802163
    +802177
    +802181
    +802183
    +802189
    +802231
    +802253
    +802279
    +802283
    +802297
    +802331
    +802339
    +802357
    +802387
    +802421
    +802441
    +802453
    +802463
    +802471
    +802499
    +802511
    +802523
    +802531
    +802573
    +802583
    +802589
    +802597
    +802603
    +802609
    +802643
    +802649
    +802651
    +802661
    +802667
    +802709
    +802721
    +802729
    +802733
    +802751
    +802759
    +802777
    +802783
    +802787
    +802793
    +802799
    +802811
    +802829
    +802831
    +802873
    +802909
    +802913
    +802933
    +802951
    +802969
    +802979
    +802987
    +803027
    +803041
    +803053
    +803057
    +803059
    +803087
    +803093
    +803119
    +803141
    +803171
    +803189
    +803207
    +803227
    +803237
    +803251
    +803269
    +803273
    +803287
    +803311
    +803323
    +803333
    +803347
    +803359
    +803389
    +803393
    +803399
    +803417
    +803441
    +803443
    +803447
    +803449
    +803461
    +803479
    +803483
    +803497
    +803501
    +803513
    +803519
    +803549
    +803587
    +803591
    +803609
    +803611
    +803623
    +803629
    +803651
    +803659
    +803669
    +803687
    +803717
    +803729
    +803731
    +803741
    +803749
    +803813
    +803819
    +803849
    +803857
    +803867
    +803893
    +803897
    +803911
    +803921
    +803927
    +803939
    +803963
    +803977
    +803987
    +803989
    +804007
    +804017
    +804031
    +804043
    +804059
    +804073
    +804077
    +804091
    +804107
    +804113
    +804119
    +804127
    +804157
    +804161
    +804179
    +804191
    +804197
    +804203
    +804211
    +804239
    +804259
    +804281
    +804283
    +804313
    +804317
    +804329
    +804337
    +804341
    +804367
    +804371
    +804383
    +804409
    +804443
    +804449
    +804473
    +804493
    +804497
    +804511
    +804521
    +804523
    +804541
    +804553
    +804571
    +804577
    +804581
    +804589
    +804607
    +804611
    +804613
    +804619
    +804653
    +804689
    +804697
    +804703
    +804709
    +804743
    +804751
    +804757
    +804761
    +804767
    +804803
    +804823
    +804829
    +804833
    +804847
    +804857
    +804877
    +804889
    +804893
    +804901
    +804913
    +804919
    +804929
    +804941
    +804943
    +804983
    +804989
    +804997
    +805019
    +805027
    +805031
    +805033
    +805037
    +805061
    +805067
    +805073
    +805081
    +805097
    +805099
    +805109
    +805111
    +805121
    +805153
    +805159
    +805177
    +805187
    +805213
    +805219
    +805223
    +805241
    +805249
    +805267
    +805271
    +805279
    +805289
    +805297
    +805309
    +805313
    +805327
    +805331
    +805333
    +805339
    +805369
    +805381
    +805397
    +805403
    +805421
    +805451
    +805463
    +805471
    +805487
    +805499
    +805501
    +805507
    +805517
    +805523
    +805531
    +805537
    +805559
    +805573
    +805583
    +805589
    +805633
    +805639
    +805687
    +805703
    +805711
    +805723
    +805729
    +805741
    +805757
    +805789
    +805799
    +805807
    +805811
    +805843
    +805853
    +805859
    +805867
    +805873
    +805877
    +805891
    +805901
    +805913
    +805933
    +805967
    +805991
    +806009
    +806011
    +806017
    +806023
    +806027
    +806033
    +806041
    +806051
    +806059
    +806087
    +806107
    +806111
    +806129
    +806137
    +806153
    +806159
    +806177
    +806203
    +806213
    +806233
    +806257
    +806261
    +806263
    +806269
    +806291
    +806297
    +806317
    +806329
    +806363
    +806369
    +806371
    +806381
    +806383
    +806389
    +806447
    +806453
    +806467
    +806483
    +806503
    +806513
    +806521
    +806543
    +806549
    +806579
    +806581
    +806609
    +806639
    +806657
    +806671
    +806719
    +806737
    +806761
    +806783
    +806789
    +806791
    +806801
    +806807
    +806821
    +806857
    +806893
    +806903
    +806917
    +806929
    +806941
    +806947
    +806951
    +806977
    +806999
    +807011
    +807017
    +807071
    +807077
    +807083
    +807089
    +807097
    +807113
    +807119
    +807127
    +807151
    +807181
    +807187
    +807193
    +807197
    +807203
    +807217
    +807221
    +807241
    +807251
    +807259
    +807281
    +807299
    +807337
    +807371
    +807379
    +807383
    +807403
    +807407
    +807409
    +807419
    +807427
    +807463
    +807473
    +807479
    +807487
    +807491
    +807493
    +807509
    +807511
    +807523
    +807539
    +807559
    +807571
    +807607
    +807613
    +807629
    +807637
    +807647
    +807689
    +807707
    +807731
    +807733
    +807749
    +807757
    +807787
    +807797
    +807809
    +807817
    +807869
    +807871
    +807901
    +807907
    +807923
    +807931
    +807941
    +807943
    +807949
    +807973
    +807997
    +808019
    +808021
    +808039
    +808081
    +808097
    +808111
    +808147
    +808153
    +808169
    +808177
    +808187
    +808211
    +808217
    +808229
    +808237
    +808261
    +808267
    +808307
    +808309
    +808343
    +808349
    +808351
    +808361
    +808363
    +808369
    +808373
    +808391
    +808399
    +808417
    +808421
    +808439
    +808441
    +808459
    +808481
    +808517
    +808523
    +808553
    +808559
    +808579
    +808589
    +808597
    +808601
    +808603
    +808627
    +808637
    +808651
    +808679
    +808681
    +808693
    +808699
    +808721
    +808733
    +808739
    +808747
    +808751
    +808771
    +808777
    +808789
    +808793
    +808837
    +808853
    +808867
    +808919
    +808937
    +808957
    +808961
    +808981
    +808991
    +808993
    +809023
    +809041
    +809051
    +809063
    +809087
    +809093
    +809101
    +809141
    +809143
    +809147
    +809173
    +809177
    +809189
    +809201
    +809203
    +809213
    +809231
    +809239
    +809243
    +809261
    +809269
    +809273
    +809297
    +809309
    +809323
    +809339
    +809357
    +809359
    +809377
    +809383
    +809399
    +809401
    +809407
    +809423
    +809437
    +809443
    +809447
    +809453
    +809461
    +809491
    +809507
    +809521
    +809527
    +809563
    +809569
    +809579
    +809581
    +809587
    +809603
    +809629
    +809701
    +809707
    +809719
    +809729
    +809737
    +809741
    +809747
    +809749
    +809759
    +809771
    +809779
    +809797
    +809801
    +809803
    +809821
    +809827
    +809833
    +809839
    +809843
    +809869
    +809891
    +809903
    +809909
    +809917
    +809929
    +809981
    +809983
    +809993
    +810013
    +810023
    +810049
    +810053
    +810059
    +810071
    +810079
    +810091
    +810109
    +810137
    +810149
    +810151
    +810191
    +810193
    +810209
    +810223
    +810239
    +810253
    +810259
    +810269
    +810281
    +810307
    +810319
    +810343
    +810349
    +810353
    +810361
    +810367
    +810377
    +810379
    +810389
    +810391
    +810401
    +810409
    +810419
    +810427
    +810437
    +810443
    +810457
    +810473
    +810487
    +810493
    +810503
    +810517
    +810533
    +810539
    +810541
    +810547
    +810553
    +810571
    +810581
    +810583
    +810587
    +810643
    +810653
    +810659
    +810671
    +810697
    +810737
    +810757
    +810763
    +810769
    +810791
    +810809
    +810839
    +810853
    +810871
    +810881
    +810893
    +810907
    +810913
    +810923
    +810941
    +810949
    +810961
    +810967
    +810973
    +810989
    +811037
    +811039
    +811067
    +811081
    +811099
    +811123
    +811127
    +811147
    +811157
    +811163
    +811171
    +811183
    +811193
    +811199
    +811207
    +811231
    +811241
    +811253
    +811259
    +811273
    +811277
    +811289
    +811297
    +811337
    +811351
    +811379
    +811387
    +811411
    +811429
    +811441
    +811457
    +811469
    +811493
    +811501
    +811511
    +811519
    +811523
    +811553
    +811561
    +811583
    +811607
    +811619
    +811627
    +811637
    +811649
    +811651
    +811667
    +811691
    +811697
    +811703
    +811709
    +811729
    +811747
    +811753
    +811757
    +811763
    +811771
    +811777
    +811799
    +811819
    +811861
    +811871
    +811879
    +811897
    +811919
    +811931
    +811933
    +811957
    +811961
    +811981
    +811991
    +811997
    +812011
    +812033
    +812047
    +812051
    +812057
    +812081
    +812101
    +812129
    +812137
    +812167
    +812173
    +812179
    +812183
    +812191
    +812213
    +812221
    +812233
    +812249
    +812257
    +812267
    +812281
    +812297
    +812299
    +812309
    +812341
    +812347
    +812351
    +812353
    +812359
    +812363
    +812381
    +812387
    +812393
    +812401
    +812431
    +812443
    +812467
    +812473
    +812477
    +812491
    +812501
    +812503
    +812519
    +812527
    +812587
    +812597
    +812599
    +812627
    +812633
    +812639
    +812641
    +812671
    +812681
    +812689
    +812699
    +812701
    +812711
    +812717
    +812731
    +812759
    +812761
    +812807
    +812849
    +812857
    +812869
    +812921
    +812939
    +812963
    +812969
    +813013
    +813017
    +813023
    +813041
    +813049
    +813061
    +813083
    +813089
    +813091
    +813097
    +813107
    +813121
    +813133
    +813157
    +813167
    +813199
    +813203
    +813209
    +813217
    +813221
    +813227
    +813251
    +813269
    +813277
    +813283
    +813287
    +813299
    +813301
    +813311
    +813343
    +813361
    +813367
    +813377
    +813383
    +813401
    +813419
    +813427
    +813443
    +813493
    +813499
    +813503
    +813511
    +813529
    +813541
    +813559
    +813577
    +813583
    +813601
    +813613
    +813623
    +813647
    +813677
    +813697
    +813707
    +813721
    +813749
    +813767
    +813797
    +813811
    +813817
    +813829
    +813833
    +813847
    +813863
    +813871
    +813893
    +813907
    +813931
    +813961
    +813971
    +813991
    +813997
    +814003
    +814007
    +814013
    +814019
    +814031
    +814043
    +814049
    +814061
    +814063
    +814067
    +814069
    +814081
    +814097
    +814127
    +814129
    +814139
    +814171
    +814183
    +814193
    +814199
    +814211
    +814213
    +814237
    +814241
    +814243
    +814279
    +814309
    +814327
    +814337
    +814367
    +814379
    +814381
    +814393
    +814399
    +814403
    +814423
    +814447
    +814469
    +814477
    +814493
    +814501
    +814531
    +814537
    +814543
    +814559
    +814577
    +814579
    +814601
    +814603
    +814609
    +814631
    +814633
    +814643
    +814687
    +814699
    +814717
    +814741
    +814747
    +814763
    +814771
    +814783
    +814789
    +814799
    +814823
    +814829
    +814841
    +814859
    +814873
    +814883
    +814889
    +814901
    +814903
    +814927
    +814937
    +814939
    +814943
    +814949
    +814991
    +815029
    +815033
    +815047
    +815053
    +815063
    +815123
    +815141
    +815149
    +815159
    +815173
    +815197
    +815209
    +815231
    +815251
    +815257
    +815261
    +815273
    +815279
    +815291
    +815317
    +815333
    +815341
    +815351
    +815389
    +815401
    +815411
    +815413
    +815417
    +815431
    +815453
    +815459
    +815471
    +815491
    +815501
    +815519
    +815527
    +815533
    +815539
    +815543
    +815569
    +815587
    +815599
    +815621
    +815623
    +815627
    +815653
    +815663
    +815669
    +815671
    +815681
    +815687
    +815693
    +815713
    +815729
    +815809
    +815819
    +815821
    +815831
    +815851
    +815869
    +815891
    +815897
    +815923
    +815933
    +815939
    +815953
    +815963
    +815977
    +815989
    +816019
    +816037
    +816043
    +816047
    +816077
    +816091
    +816103
    +816113
    +816121
    +816131
    +816133
    +816157
    +816161
    +816163
    +816169
    +816191
    +816203
    +816209
    +816217
    +816223
    +816227
    +816239
    +816251
    +816271
    +816317
    +816329
    +816341
    +816353
    +816367
    +816377
    +816401
    +816427
    +816443
    +816451
    +816469
    +816499
    +816521
    +816539
    +816547
    +816559
    +816581
    +816587
    +816589
    +816593
    +816649
    +816653
    +816667
    +816689
    +816691
    +816703
    +816709
    +816743
    +816763
    +816769
    +816779
    +816811
    +816817
    +816821
    +816839
    +816841
    +816847
    +816857
    +816859
    +816869
    +816883
    +816887
    +816899
    +816911
    +816917
    +816919
    +816929
    +816941
    +816947
    +816961
    +816971
    +817013
    +817027
    +817039
    +817049
    +817051
    +817073
    +817081
    +817087
    +817093
    +817111
    +817123
    +817127
    +817147
    +817151
    +817153
    +817163
    +817169
    +817183
    +817211
    +817237
    +817273
    +817277
    +817279
    +817291
    +817303
    +817319
    +817321
    +817331
    +817337
    +817357
    +817379
    +817403
    +817409
    +817433
    +817457
    +817463
    +817483
    +817519
    +817529
    +817549
    +817561
    +817567
    +817603
    +817637
    +817651
    +817669
    +817679
    +817697
    +817709
    +817711
    +817721
    +817723
    +817727
    +817757
    +817769
    +817777
    +817783
    +817787
    +817793
    +817823
    +817837
    +817841
    +817867
    +817871
    +817877
    +817889
    +817891
    +817897
    +817907
    +817913
    +817919
    +817933
    +817951
    +817979
    +817987
    +818011
    +818017
    +818021
    +818093
    +818099
    +818101
    +818113
    +818123
    +818143
    +818171
    +818173
    +818189
    +818219
    +818231
    +818239
    +818249
    +818281
    +818287
    +818291
    +818303
    +818309
    +818327
    +818339
    +818341
    +818347
    +818353
    +818359
    +818371
    +818383
    +818393
    +818399
    +818413
    +818429
    +818453
    +818473
    +818509
    +818561
    +818569
    +818579
    +818581
    +818603
    +818621
    +818659
    +818683
    +818687
    +818689
    +818707
    +818717
    +818723
    +818813
    +818819
    +818821
    +818827
    +818837
    +818887
    +818897
    +818947
    +818959
    +818963
    +818969
    +818977
    +818999
    +819001
    +819017
    +819029
    +819031
    +819037
    +819061
    +819073
    +819083
    +819101
    +819131
    +819149
    +819157
    +819167
    +819173
    +819187
    +819229
    +819239
    +819241
    +819251
    +819253
    +819263
    +819271
    +819289
    +819307
    +819311
    +819317
    +819319
    +819367
    +819373
    +819389
    +819391
    +819407
    +819409
    +819419
    +819431
    +819437
    +819443
    +819449
    +819457
    +819463
    +819473
    +819487
    +819491
    +819493
    +819499
    +819503
    +819509
    +819523
    +819563
    +819583
    +819593
    +819607
    +819617
    +819619
    +819629
    +819647
    +819653
    +819659
    +819673
    +819691
    +819701
    +819719
    +819737
    +819739
    +819761
    +819769
    +819773
    +819781
    +819787
    +819799
    +819811
    +819823
    +819827
    +819829
    +819853
    +819899
    +819911
    +819913
    +819937
    +819943
    +819977
    +819989
    +819991
    +820037
    +820051
    +820067
    +820073
    +820093
    +820109
    +820117
    +820129
    +820133
    +820163
    +820177
    +820187
    +820201
    +820213
    +820223
    +820231
    +820241
    +820243
    +820247
    +820271
    +820273
    +820279
    +820319
    +820321
    +820331
    +820333
    +820343
    +820349
    +820361
    +820367
    +820399
    +820409
    +820411
    +820427
    +820429
    +820441
    +820459
    +820481
    +820489
    +820537
    +820541
    +820559
    +820577
    +820597
    +820609
    +820619
    +820627
    +820637
    +820643
    +820649
    +820657
    +820679
    +820681
    +820691
    +820711
    +820723
    +820733
    +820747
    +820753
    +820759
    +820763
    +820789
    +820793
    +820837
    +820873
    +820891
    +820901
    +820907
    +820909
    +820921
    +820927
    +820957
    +820969
    +820991
    +820997
    +821003
    +821027
    +821039
    +821053
    +821057
    +821063
    +821069
    +821081
    +821089
    +821099
    +821101
    +821113
    +821131
    +821143
    +821147
    +821153
    +821167
    +821173
    +821207
    +821209
    +821263
    +821281
    +821291
    +821297
    +821311
    +821329
    +821333
    +821377
    +821383
    +821411
    +821441
    +821449
    +821459
    +821461
    +821467
    +821477
    +821479
    +821489
    +821497
    +821507
    +821519
    +821551
    +821573
    +821603
    +821641
    +821647
    +821651
    +821663
    +821677
    +821741
    +821747
    +821753
    +821759
    +821771
    +821801
    +821803
    +821809
    +821819
    +821827
    +821833
    +821851
    +821857
    +821861
    +821869
    +821879
    +821897
    +821911
    +821939
    +821941
    +821971
    +821993
    +821999
    +822007
    +822011
    +822013
    +822037
    +822049
    +822067
    +822079
    +822113
    +822131
    +822139
    +822161
    +822163
    +822167
    +822169
    +822191
    +822197
    +822221
    +822223
    +822229
    +822233
    +822253
    +822259
    +822277
    +822293
    +822299
    +822313
    +822317
    +822323
    +822329
    +822343
    +822347
    +822361
    +822379
    +822383
    +822389
    +822391
    +822407
    +822431
    +822433
    +822517
    +822539
    +822541
    +822551
    +822553
    +822557
    +822571
    +822581
    +822587
    +822589
    +822599
    +822607
    +822611
    +822631
    +822667
    +822671
    +822673
    +822683
    +822691
    +822697
    +822713
    +822721
    +822727
    +822739
    +822743
    +822761
    +822763
    +822781
    +822791
    +822793
    +822803
    +822821
    +822823
    +822839
    +822853
    +822881
    +822883
    +822889
    +822893
    +822901
    +822907
    +822949
    +822971
    +822973
    +822989
    +823001
    +823003
    +823013
    +823033
    +823051
    +823117
    +823127
    +823129
    +823153
    +823169
    +823177
    +823183
    +823201
    +823219
    +823231
    +823237
    +823241
    +823243
    +823261
    +823271
    +823283
    +823309
    +823337
    +823349
    +823351
    +823357
    +823373
    +823399
    +823421
    +823447
    +823451
    +823457
    +823481
    +823483
    +823489
    +823499
    +823519
    +823541
    +823547
    +823553
    +823573
    +823591
    +823601
    +823619
    +823621
    +823637
    +823643
    +823651
    +823663
    +823679
    +823703
    +823709
    +823717
    +823721
    +823723
    +823727
    +823729
    +823741
    +823747
    +823759
    +823777
    +823787
    +823789
    +823799
    +823819
    +823829
    +823831
    +823841
    +823843
    +823877
    +823903
    +823913
    +823961
    +823967
    +823969
    +823981
    +823993
    +823997
    +824017
    +824029
    +824039
    +824063
    +824069
    +824077
    +824081
    +824099
    +824123
    +824137
    +824147
    +824179
    +824183
    +824189
    +824191
    +824227
    +824231
    +824233
    +824269
    +824281
    +824287
    +824339
    +824393
    +824399
    +824401
    +824413
    +824419
    +824437
    +824443
    +824459
    +824477
    +824489
    +824497
    +824501
    +824513
    +824531
    +824539
    +824563
    +824591
    +824609
    +824641
    +824647
    +824651
    +824669
    +824671
    +824683
    +824699
    +824701
    +824723
    +824741
    +824749
    +824753
    +824773
    +824777
    +824779
    +824801
    +824821
    +824833
    +824843
    +824861
    +824893
    +824899
    +824911
    +824921
    +824933
    +824939
    +824947
    +824951
    +824977
    +824981
    +824983
    +825001
    +825007
    +825017
    +825029
    +825047
    +825049
    +825059
    +825067
    +825073
    +825101
    +825107
    +825109
    +825131
    +825161
    +825191
    +825193
    +825199
    +825203
    +825229
    +825241
    +825247
    +825259
    +825277
    +825281
    +825283
    +825287
    +825301
    +825329
    +825337
    +825343
    +825347
    +825353
    +825361
    +825389
    +825397
    +825403
    +825413
    +825421
    +825439
    +825443
    +825467
    +825479
    +825491
    +825509
    +825527
    +825533
    +825547
    +825551
    +825553
    +825577
    +825593
    +825611
    +825613
    +825637
    +825647
    +825661
    +825679
    +825689
    +825697
    +825701
    +825709
    +825733
    +825739
    +825749
    +825763
    +825779
    +825791
    +825821
    +825827
    +825829
    +825857
    +825883
    +825889
    +825919
    +825947
    +825959
    +825961
    +825971
    +825983
    +825991
    +825997
    +826019
    +826037
    +826039
    +826051
    +826061
    +826069
    +826087
    +826093
    +826097
    +826129
    +826151
    +826153
    +826169
    +826171
    +826193
    +826201
    +826211
    +826271
    +826283
    +826289
    +826303
    +826313
    +826333
    +826339
    +826349
    +826351
    +826363
    +826379
    +826381
    +826391
    +826393
    +826403
    +826411
    +826453
    +826477
    +826493
    +826499
    +826541
    +826549
    +826559
    +826561
    +826571
    +826583
    +826603
    +826607
    +826613
    +826621
    +826663
    +826667
    +826669
    +826673
    +826681
    +826697
    +826699
    +826711
    +826717
    +826723
    +826729
    +826753
    +826759
    +826783
    +826799
    +826807
    +826811
    +826831
    +826849
    +826867
    +826879
    +826883
    +826907
    +826921
    +826927
    +826939
    +826957
    +826963
    +826967
    +826979
    +826997
    +827009
    +827023
    +827039
    +827041
    +827063
    +827087
    +827129
    +827131
    +827143
    +827147
    +827161
    +827213
    +827227
    +827231
    +827251
    +827269
    +827293
    +827303
    +827311
    +827327
    +827347
    +827369
    +827389
    +827417
    +827423
    +827429
    +827443
    +827447
    +827461
    +827473
    +827501
    +827521
    +827537
    +827539
    +827549
    +827581
    +827591
    +827599
    +827633
    +827639
    +827677
    +827681
    +827693
    +827699
    +827719
    +827737
    +827741
    +827767
    +827779
    +827791
    +827803
    +827809
    +827821
    +827833
    +827837
    +827843
    +827851
    +827857
    +827867
    +827873
    +827899
    +827903
    +827923
    +827927
    +827929
    +827941
    +827969
    +827987
    +827989
    +828007
    +828011
    +828013
    +828029
    +828043
    +828059
    +828067
    +828071
    +828101
    +828109
    +828119
    +828127
    +828131
    +828133
    +828169
    +828199
    +828209
    +828221
    +828239
    +828277
    +828349
    +828361
    +828371
    +828379
    +828383
    +828397
    +828407
    +828409
    +828431
    +828449
    +828517
    +828523
    +828547
    +828557
    +828577
    +828587
    +828601
    +828637
    +828643
    +828649
    +828673
    +828677
    +828691
    +828697
    +828701
    +828703
    +828721
    +828731
    +828743
    +828757
    +828787
    +828797
    +828809
    +828811
    +828823
    +828829
    +828833
    +828859
    +828871
    +828881
    +828889
    +828899
    +828901
    +828917
    +828923
    +828941
    +828953
    +828967
    +828977
    +829001
    +829013
    +829057
    +829063
    +829069
    +829093
    +829097
    +829111
    +829121
    +829123
    +829151
    +829159
    +829177
    +829187
    +829193
    +829211
    +829223
    +829229
    +829237
    +829249
    +829267
    +829273
    +829289
    +829319
    +829349
    +829399
    +829453
    +829457
    +829463
    +829469
    +829501
    +829511
    +829519
    +829537
    +829547
    +829561
    +829601
    +829613
    +829627
    +829637
    +829639
    +829643
    +829657
    +829687
    +829693
    +829709
    +829721
    +829723
    +829727
    +829729
    +829733
    +829757
    +829789
    +829811
    +829813
    +829819
    +829831
    +829841
    +829847
    +829849
    +829867
    +829877
    +829883
    +829949
    +829967
    +829979
    +829987
    +829993
    +830003
    +830017
    +830041
    +830051
    +830099
    +830111
    +830117
    +830131
    +830143
    +830153
    +830173
    +830177
    +830191
    +830233
    +830237
    +830257
    +830267
    +830279
    +830293
    +830309
    +830311
    +830327
    +830329
    +830339
    +830341
    +830353
    +830359
    +830363
    +830383
    +830387
    +830411
    +830413
    +830419
    +830441
    +830447
    +830449
    +830477
    +830483
    +830497
    +830503
    +830513
    +830549
    +830551
    +830561
    +830567
    +830579
    +830587
    +830591
    +830597
    +830617
    +830639
    +830657
    +830677
    +830693
    +830719
    +830729
    +830741
    +830743
    +830777
    +830789
    +830801
    +830827
    +830833
    +830839
    +830849
    +830861
    +830873
    +830887
    +830891
    +830899
    +830911
    +830923
    +830939
    +830957
    +830981
    +830989
    +831023
    +831031
    +831037
    +831043
    +831067
    +831071
    +831073
    +831091
    +831109
    +831139
    +831161
    +831163
    +831167
    +831191
    +831217
    +831221
    +831239
    +831253
    +831287
    +831301
    +831323
    +831329
    +831361
    +831367
    +831371
    +831373
    +831407
    +831409
    +831431
    +831433
    +831437
    +831443
    +831461
    +831503
    +831529
    +831539
    +831541
    +831547
    +831553
    +831559
    +831583
    +831587
    +831599
    +831617
    +831619
    +831631
    +831643
    +831647
    +831653
    +831659
    +831661
    +831679
    +831683
    +831697
    +831707
    +831709
    +831713
    +831731
    +831739
    +831751
    +831757
    +831769
    +831781
    +831799
    +831811
    +831821
    +831829
    +831847
    +831851
    +831863
    +831881
    +831889
    +831893
    +831899
    +831911
    +831913
    +831917
    +831967
    +831983
    +832003
    +832063
    +832079
    +832081
    +832103
    +832109
    +832121
    +832123
    +832129
    +832141
    +832151
    +832157
    +832159
    +832189
    +832211
    +832217
    +832253
    +832291
    +832297
    +832309
    +832327
    +832331
    +832339
    +832361
    +832367
    +832369
    +832373
    +832379
    +832399
    +832411
    +832421
    +832427
    +832451
    +832457
    +832477
    +832483
    +832487
    +832493
    +832499
    +832519
    +832583
    +832591
    +832597
    +832607
    +832613
    +832621
    +832627
    +832631
    +832633
    +832639
    +832673
    +832679
    +832681
    +832687
    +832693
    +832703
    +832709
    +832717
    +832721
    +832729
    +832747
    +832757
    +832763
    +832771
    +832787
    +832801
    +832837
    +832841
    +832861
    +832879
    +832883
    +832889
    +832913
    +832919
    +832927
    +832933
    +832943
    +832957
    +832963
    +832969
    +832973
    +832987
    +833009
    +833023
    +833033
    +833047
    +833057
    +833099
    +833101
    +833117
    +833171
    +833177
    +833179
    +833191
    +833197
    +833201
    +833219
    +833251
    +833269
    +833281
    +833293
    +833299
    +833309
    +833347
    +833353
    +833363
    +833377
    +833389
    +833429
    +833449
    +833453
    +833461
    +833467
    +833477
    +833479
    +833491
    +833509
    +833537
    +833557
    +833563
    +833593
    +833597
    +833617
    +833633
    +833659
    +833669
    +833689
    +833711
    +833713
    +833717
    +833719
    +833737
    +833747
    +833759
    +833783
    +833801
    +833821
    +833839
    +833843
    +833857
    +833873
    +833887
    +833893
    +833897
    +833923
    +833927
    +833933
    +833947
    +833977
    +833999
    +834007
    +834013
    +834023
    +834059
    +834107
    +834131
    +834133
    +834137
    +834143
    +834149
    +834151
    +834181
    +834199
    +834221
    +834257
    +834259
    +834269
    +834277
    +834283
    +834287
    +834299
    +834311
    +834341
    +834367
    +834433
    +834439
    +834469
    +834487
    +834497
    +834503
    +834511
    +834523
    +834527
    +834569
    +834571
    +834593
    +834599
    +834607
    +834611
    +834623
    +834629
    +834641
    +834643
    +834653
    +834671
    +834703
    +834709
    +834721
    +834761
    +834773
    +834781
    +834787
    +834797
    +834809
    +834811
    +834829
    +834857
    +834859
    +834893
    +834913
    +834941
    +834947
    +834949
    +834959
    +834961
    +834983
    +834991
    +835001
    +835013
    +835019
    +835033
    +835039
    +835097
    +835099
    +835117
    +835123
    +835139
    +835141
    +835207
    +835213
    +835217
    +835249
    +835253
    +835271
    +835313
    +835319
    +835321
    +835327
    +835369
    +835379
    +835391
    +835399
    +835421
    +835427
    +835441
    +835451
    +835453
    +835459
    +835469
    +835489
    +835511
    +835531
    +835553
    +835559
    +835591
    +835603
    +835607
    +835609
    +835633
    +835643
    +835661
    +835663
    +835673
    +835687
    +835717
    +835721
    +835733
    +835739
    +835759
    +835789
    +835811
    +835817
    +835819
    +835823
    +835831
    +835841
    +835847
    +835859
    +835897
    +835909
    +835927
    +835931
    +835937
    +835951
    +835957
    +835973
    +835979
    +835987
    +835993
    +835997
    +836047
    +836063
    +836071
    +836107
    +836117
    +836131
    +836137
    +836149
    +836153
    +836159
    +836161
    +836183
    +836189
    +836191
    +836203
    +836219
    +836233
    +836239
    +836243
    +836267
    +836291
    +836299
    +836317
    +836327
    +836347
    +836351
    +836369
    +836377
    +836387
    +836413
    +836449
    +836471
    +836477
    +836491
    +836497
    +836501
    +836509
    +836567
    +836569
    +836573
    +836609
    +836611
    +836623
    +836657
    +836663
    +836677
    +836683
    +836699
    +836701
    +836707
    +836713
    +836729
    +836747
    +836749
    +836753
    +836761
    +836789
    +836807
    +836821
    +836833
    +836839
    +836861
    +836863
    +836873
    +836879
    +836881
    +836917
    +836921
    +836939
    +836951
    +836971
    +837017
    +837043
    +837047
    +837059
    +837071
    +837073
    +837077
    +837079
    +837107
    +837113
    +837139
    +837149
    +837157
    +837191
    +837203
    +837257
    +837271
    +837283
    +837293
    +837307
    +837313
    +837359
    +837367
    +837373
    +837377
    +837379
    +837409
    +837413
    +837439
    +837451
    +837461
    +837467
    +837497
    +837503
    +837509
    +837521
    +837533
    +837583
    +837601
    +837611
    +837619
    +837631
    +837659
    +837667
    +837673
    +837677
    +837679
    +837721
    +837731
    +837737
    +837773
    +837779
    +837797
    +837817
    +837833
    +837847
    +837853
    +837887
    +837923
    +837929
    +837931
    +837937
    +837943
    +837979
    +838003
    +838021
    +838037
    +838039
    +838043
    +838063
    +838069
    +838091
    +838093
    +838099
    +838133
    +838139
    +838141
    +838153
    +838157
    +838169
    +838171
    +838193
    +838207
    +838247
    +838249
    +838349
    +838351
    +838363
    +838367
    +838379
    +838391
    +838393
    +838399
    +838403
    +838421
    +838429
    +838441
    +838447
    +838459
    +838463
    +838471
    +838483
    +838517
    +838547
    +838553
    +838561
    +838571
    +838583
    +838589
    +838597
    +838601
    +838609
    +838613
    +838631
    +838633
    +838657
    +838667
    +838687
    +838693
    +838711
    +838751
    +838757
    +838769
    +838771
    +838777
    +838781
    +838807
    +838813
    +838837
    +838853
    +838889
    +838897
    +838909
    +838913
    +838919
    +838927
    +838931
    +838939
    +838949
    +838951
    +838963
    +838969
    +838991
    +838993
    +839009
    +839029
    +839051
    +839071
    +839087
    +839117
    +839131
    +839161
    +839203
    +839207
    +839221
    +839227
    +839261
    +839269
    +839303
    +839323
    +839327
    +839351
    +839353
    +839369
    +839381
    +839413
    +839429
    +839437
    +839441
    +839453
    +839459
    +839471
    +839473
    +839483
    +839491
    +839497
    +839519
    +839539
    +839551
    +839563
    +839599
    +839603
    +839609
    +839611
    +839617
    +839621
    +839633
    +839651
    +839653
    +839669
    +839693
    +839723
    +839731
    +839767
    +839771
    +839791
    +839801
    +839809
    +839831
    +839837
    +839873
    +839879
    +839887
    +839897
    +839899
    +839903
    +839911
    +839921
    +839957
    +839959
    +839963
    +839981
    +839999
    +840023
    +840053
    +840061
    +840067
    +840083
    +840109
    +840137
    +840139
    +840149
    +840163
    +840179
    +840181
    +840187
    +840197
    +840223
    +840239
    +840241
    +840253
    +840269
    +840277
    +840289
    +840299
    +840319
    +840331
    +840341
    +840347
    +840353
    +840439
    +840451
    +840457
    +840467
    +840473
    +840479
    +840491
    +840523
    +840547
    +840557
    +840571
    +840589
    +840601
    +840611
    +840643
    +840661
    +840683
    +840703
    +840709
    +840713
    +840727
    +840733
    +840743
    +840757
    +840761
    +840767
    +840817
    +840821
    +840823
    +840839
    +840841
    +840859
    +840863
    +840907
    +840911
    +840923
    +840929
    +840941
    +840943
    +840967
    +840979
    +840989
    +840991
    +841003
    +841013
    +841019
    +841021
    +841063
    +841069
    +841079
    +841081
    +841091
    +841097
    +841103
    +841147
    +841157
    +841189
    +841193
    +841207
    +841213
    +841219
    +841223
    +841231
    +841237
    +841241
    +841259
    +841273
    +841277
    +841283
    +841289
    +841297
    +841307
    +841327
    +841333
    +841349
    +841369
    +841391
    +841397
    +841411
    +841427
    +841447
    +841457
    +841459
    +841541
    +841549
    +841559
    +841573
    +841597
    +841601
    +841637
    +841651
    +841661
    +841663
    +841691
    +841697
    +841727
    +841741
    +841751
    +841793
    +841801
    +841849
    +841859
    +841873
    +841879
    +841889
    +841913
    +841921
    +841927
    +841931
    +841933
    +841979
    +841987
    +842003
    +842021
    +842041
    +842047
    +842063
    +842071
    +842077
    +842081
    +842087
    +842089
    +842111
    +842113
    +842141
    +842147
    +842159
    +842161
    +842167
    +842173
    +842183
    +842203
    +842209
    +842249
    +842267
    +842279
    +842291
    +842293
    +842311
    +842321
    +842323
    +842339
    +842341
    +842351
    +842353
    +842371
    +842383
    +842393
    +842399
    +842407
    +842417
    +842419
    +842423
    +842447
    +842449
    +842473
    +842477
    +842483
    +842489
    +842497
    +842507
    +842519
    +842521
    +842531
    +842551
    +842581
    +842587
    +842599
    +842617
    +842623
    +842627
    +842657
    +842701
    +842729
    +842747
    +842759
    +842767
    +842771
    +842791
    +842801
    +842813
    +842819
    +842857
    +842869
    +842879
    +842887
    +842923
    +842939
    +842951
    +842957
    +842969
    +842977
    +842981
    +842987
    +842993
    +843043
    +843067
    +843079
    +843091
    +843103
    +843113
    +843127
    +843131
    +843137
    +843173
    +843179
    +843181
    +843209
    +843211
    +843229
    +843253
    +843257
    +843289
    +843299
    +843301
    +843307
    +843331
    +843347
    +843361
    +843371
    +843377
    +843379
    +843383
    +843397
    +843443
    +843449
    +843457
    +843461
    +843473
    +843487
    +843497
    +843503
    +843527
    +843539
    +843553
    +843559
    +843587
    +843589
    +843607
    +843613
    +843629
    +843643
    +843649
    +843677
    +843679
    +843701
    +843737
    +843757
    +843763
    +843779
    +843781
    +843793
    +843797
    +843811
    +843823
    +843833
    +843841
    +843881
    +843883
    +843889
    +843901
    +843907
    +843911
    +844001
    +844013
    +844043
    +844061
    +844069
    +844087
    +844093
    +844111
    +844117
    +844121
    +844127
    +844139
    +844141
    +844153
    +844157
    +844163
    +844183
    +844187
    +844199
    +844201
    +844243
    +844247
    +844253
    +844279
    +844289
    +844297
    +844309
    +844321
    +844351
    +844369
    +844421
    +844427
    +844429
    +844433
    +844439
    +844447
    +844453
    +844457
    +844463
    +844469
    +844483
    +844489
    +844499
    +844507
    +844511
    +844513
    +844517
    +844523
    +844549
    +844553
    +844601
    +844603
    +844609
    +844619
    +844621
    +844631
    +844639
    +844643
    +844651
    +844709
    +844717
    +844733
    +844757
    +844763
    +844769
    +844771
    +844777
    +844841
    +844847
    +844861
    +844867
    +844891
    +844897
    +844903
    +844913
    +844927
    +844957
    +844999
    +845003
    +845017
    +845021
    +845027
    +845041
    +845069
    +845083
    +845099
    +845111
    +845129
    +845137
    +845167
    +845179
    +845183
    +845197
    +845203
    +845209
    +845219
    +845231
    +845237
    +845261
    +845279
    +845287
    +845303
    +845309
    +845333
    +845347
    +845357
    +845363
    +845371
    +845381
    +845387
    +845431
    +845441
    +845447
    +845459
    +845489
    +845491
    +845531
    +845567
    +845599
    +845623
    +845653
    +845657
    +845659
    +845683
    +845717
    +845723
    +845729
    +845749
    +845753
    +845771
    +845777
    +845809
    +845833
    +845849
    +845863
    +845879
    +845881
    +845893
    +845909
    +845921
    +845927
    +845941
    +845951
    +845969
    +845981
    +845983
    +845987
    +845989
    +846037
    +846059
    +846061
    +846067
    +846113
    +846137
    +846149
    +846161
    +846179
    +846187
    +846217
    +846229
    +846233
    +846247
    +846259
    +846271
    +846323
    +846341
    +846343
    +846353
    +846359
    +846361
    +846383
    +846389
    +846397
    +846401
    +846403
    +846407
    +846421
    +846427
    +846437
    +846457
    +846487
    +846493
    +846499
    +846529
    +846563
    +846577
    +846589
    +846647
    +846661
    +846667
    +846673
    +846689
    +846721
    +846733
    +846739
    +846749
    +846751
    +846757
    +846779
    +846823
    +846841
    +846851
    +846869
    +846871
    +846877
    +846913
    +846917
    +846919
    +846931
    +846943
    +846949
    +846953
    +846961
    +846973
    +846977
    +846983
    +846997
    +847009
    +847031
    +847037
    +847043
    +847051
    +847069
    +847073
    +847079
    +847097
    +847103
    +847109
    +847129
    +847139
    +847151
    +847157
    +847163
    +847169
    +847193
    +847201
    +847213
    +847219
    +847237
    +847247
    +847271
    +847277
    +847279
    +847283
    +847309
    +847321
    +847339
    +847361
    +847367
    +847373
    +847393
    +847423
    +847453
    +847477
    +847493
    +847499
    +847507
    +847519
    +847531
    +847537
    +847543
    +847549
    +847577
    +847589
    +847601
    +847607
    +847621
    +847657
    +847663
    +847673
    +847681
    +847687
    +847697
    +847703
    +847727
    +847729
    +847741
    +847787
    +847789
    +847813
    +847817
    +847853
    +847871
    +847883
    +847901
    +847919
    +847933
    +847937
    +847949
    +847967
    +847969
    +847991
    +847993
    +847997
    +848017
    +848051
    +848087
    +848101
    +848119
    +848123
    +848131
    +848143
    +848149
    +848173
    +848201
    +848203
    +848213
    +848227
    +848251
    +848269
    +848273
    +848297
    +848321
    +848359
    +848363
    +848383
    +848387
    +848399
    +848417
    +848423
    +848429
    +848443
    +848461
    +848467
    +848473
    +848489
    +848531
    +848537
    +848557
    +848567
    +848579
    +848591
    +848593
    +848599
    +848611
    +848629
    +848633
    +848647
    +848651
    +848671
    +848681
    +848699
    +848707
    +848713
    +848737
    +848747
    +848761
    +848779
    +848789
    +848791
    +848797
    +848803
    +848807
    +848839
    +848843
    +848849
    +848851
    +848857
    +848879
    +848893
    +848909
    +848921
    +848923
    +848927
    +848933
    +848941
    +848959
    +848983
    +848993
    +849019
    +849047
    +849049
    +849061
    +849083
    +849097
    +849103
    +849119
    +849127
    +849131
    +849143
    +849161
    +849179
    +849197
    +849203
    +849217
    +849221
    +849223
    +849241
    +849253
    +849271
    +849301
    +849311
    +849347
    +849349
    +849353
    +849383
    +849391
    +849419
    +849427
    +849461
    +849467
    +849481
    +849523
    +849533
    +849539
    +849571
    +849581
    +849587
    +849593
    +849599
    +849601
    +849649
    +849691
    +849701
    +849703
    +849721
    +849727
    +849731
    +849733
    +849743
    +849763
    +849767
    +849773
    +849829
    +849833
    +849839
    +849857
    +849869
    +849883
    +849917
    +849923
    +849931
    +849943
    +849967
    +849973
    +849991
    +849997
    +850009
    +850021
    +850027
    +850033
    +850043
    +850049
    +850061
    +850063
    +850081
    +850093
    +850121
    +850133
    +850139
    +850147
    +850177
    +850181
    +850189
    +850207
    +850211
    +850229
    +850243
    +850247
    +850253
    +850261
    +850271
    +850273
    +850301
    +850303
    +850331
    +850337
    +850349
    +850351
    +850373
    +850387
    +850393
    +850397
    +850403
    +850417
    +850427
    +850433
    +850439
    +850453
    +850457
    +850481
    +850529
    +850537
    +850567
    +850571
    +850613
    +850631
    +850637
    +850673
    +850679
    +850691
    +850711
    +850727
    +850753
    +850781
    +850807
    +850823
    +850849
    +850853
    +850879
    +850891
    +850897
    +850933
    +850943
    +850951
    +850973
    +850979
    +851009
    +851017
    +851033
    +851041
    +851051
    +851057
    +851087
    +851093
    +851113
    +851117
    +851131
    +851153
    +851159
    +851171
    +851177
    +851197
    +851203
    +851209
    +851231
    +851239
    +851251
    +851261
    +851267
    +851273
    +851293
    +851297
    +851303
    +851321
    +851327
    +851351
    +851359
    +851363
    +851381
    +851387
    +851393
    +851401
    +851413
    +851419
    +851423
    +851449
    +851471
    +851491
    +851507
    +851519
    +851537
    +851549
    +851569
    +851573
    +851597
    +851603
    +851623
    +851633
    +851639
    +851647
    +851659
    +851671
    +851677
    +851689
    +851723
    +851731
    +851749
    +851761
    +851797
    +851801
    +851803
    +851813
    +851821
    +851831
    +851839
    +851843
    +851863
    +851881
    +851891
    +851899
    +851953
    +851957
    +851971
    +852011
    +852013
    +852031
    +852037
    +852079
    +852101
    +852121
    +852139
    +852143
    +852149
    +852151
    +852167
    +852179
    +852191
    +852197
    +852199
    +852211
    +852233
    +852239
    +852253
    +852259
    +852263
    +852287
    +852289
    +852301
    +852323
    +852347
    +852367
    +852391
    +852409
    +852427
    +852437
    +852457
    +852463
    +852521
    +852557
    +852559
    +852563
    +852569
    +852581
    +852583
    +852589
    +852613
    +852617
    +852623
    +852641
    +852661
    +852671
    +852673
    +852689
    +852749
    +852751
    +852757
    +852763
    +852769
    +852793
    +852799
    +852809
    +852827
    +852829
    +852833
    +852847
    +852851
    +852857
    +852871
    +852881
    +852889
    +852893
    +852913
    +852937
    +852953
    +852959
    +852989
    +852997
    +853007
    +853031
    +853033
    +853049
    +853057
    +853079
    +853091
    +853103
    +853123
    +853133
    +853159
    +853187
    +853189
    +853211
    +853217
    +853241
    +853283
    +853289
    +853291
    +853319
    +853339
    +853357
    +853387
    +853403
    +853427
    +853429
    +853439
    +853477
    +853481
    +853493
    +853529
    +853543
    +853547
    +853571
    +853577
    +853597
    +853637
    +853663
    +853667
    +853669
    +853687
    +853693
    +853703
    +853717
    +853733
    +853739
    +853759
    +853763
    +853793
    +853799
    +853807
    +853813
    +853819
    +853823
    +853837
    +853843
    +853873
    +853889
    +853901
    +853903
    +853913
    +853933
    +853949
    +853969
    +853981
    +853999
    +854017
    +854033
    +854039
    +854041
    +854047
    +854053
    +854083
    +854089
    +854093
    +854099
    +854111
    +854123
    +854129
    +854141
    +854149
    +854159
    +854171
    +854213
    +854257
    +854263
    +854299
    +854303
    +854323
    +854327
    +854333
    +854351
    +854353
    +854363
    +854383
    +854387
    +854407
    +854417
    +854419
    +854423
    +854431
    +854443
    +854459
    +854461
    +854467
    +854479
    +854527
    +854533
    +854569
    +854587
    +854593
    +854599
    +854617
    +854621
    +854629
    +854647
    +854683
    +854713
    +854729
    +854747
    +854771
    +854801
    +854807
    +854849
    +854869
    +854881
    +854897
    +854899
    +854921
    +854923
    +854927
    +854929
    +854951
    +854957
    +854963
    +854993
    +854999
    +855031
    +855059
    +855061
    +855067
    +855079
    +855089
    +855119
    +855131
    +855143
    +855187
    +855191
    +855199
    +855203
    +855221
    +855229
    +855241
    +855269
    +855271
    +855277
    +855293
    +855307
    +855311
    +855317
    +855331
    +855359
    +855373
    +855377
    +855391
    +855397
    +855401
    +855419
    +855427
    +855431
    +855461
    +855467
    +855499
    +855511
    +855521
    +855527
    +855581
    +855601
    +855607
    +855619
    +855641
    +855667
    +855671
    +855683
    +855697
    +855709
    +855713
    +855719
    +855721
    +855727
    +855731
    +855733
    +855737
    +855739
    +855781
    +855787
    +855821
    +855851
    +855857
    +855863
    +855887
    +855889
    +855901
    +855919
    +855923
    +855937
    +855947
    +855983
    +855989
    +855997
    +856021
    +856043
    +856057
    +856061
    +856073
    +856081
    +856099
    +856111
    +856117
    +856133
    +856139
    +856147
    +856153
    +856169
    +856181
    +856187
    +856213
    +856237
    +856241
    +856249
    +856277
    +856279
    +856301
    +856309
    +856333
    +856343
    +856351
    +856369
    +856381
    +856391
    +856393
    +856411
    +856417
    +856421
    +856441
    +856459
    +856469
    +856483
    +856487
    +856507
    +856519
    +856529
    +856547
    +856549
    +856553
    +856567
    +856571
    +856627
    +856637
    +856649
    +856693
    +856697
    +856699
    +856703
    +856711
    +856717
    +856721
    +856733
    +856759
    +856787
    +856789
    +856799
    +856811
    +856813
    +856831
    +856841
    +856847
    +856853
    +856897
    +856901
    +856903
    +856909
    +856927
    +856939
    +856943
    +856949
    +856969
    +856993
    +857009
    +857011
    +857027
    +857029
    +857039
    +857047
    +857053
    +857069
    +857081
    +857083
    +857099
    +857107
    +857137
    +857161
    +857167
    +857201
    +857203
    +857221
    +857249
    +857267
    +857273
    +857281
    +857287
    +857309
    +857321
    +857333
    +857341
    +857347
    +857357
    +857369
    +857407
    +857411
    +857419
    +857431
    +857453
    +857459
    +857471
    +857513
    +857539
    +857551
    +857567
    +857569
    +857573
    +857579
    +857581
    +857629
    +857653
    +857663
    +857669
    +857671
    +857687
    +857707
    +857711
    +857713
    +857723
    +857737
    +857741
    +857743
    +857749
    +857809
    +857821
    +857827
    +857839
    +857851
    +857867
    +857873
    +857897
    +857903
    +857929
    +857951
    +857953
    +857957
    +857959
    +857963
    +857977
    +857981
    +858001
    +858029
    +858043
    +858073
    +858083
    +858101
    +858103
    +858113
    +858127
    +858149
    +858161
    +858167
    +858217
    +858223
    +858233
    +858239
    +858241
    +858251
    +858259
    +858269
    +858281
    +858293
    +858301
    +858307
    +858311
    +858317
    +858373
    +858397
    +858427
    +858433
    +858457
    +858463
    +858467
    +858479
    +858497
    +858503
    +858527
    +858563
    +858577
    +858589
    +858623
    +858631
    +858673
    +858691
    +858701
    +858707
    +858709
    +858713
    +858749
    +858757
    +858763
    +858769
    +858787
    +858817
    +858821
    +858833
    +858841
    +858859
    +858877
    +858883
    +858899
    +858911
    +858919
    +858931
    +858943
    +858953
    +858961
    +858989
    +858997
    +859003
    +859031
    +859037
    +859049
    +859051
    +859057
    +859081
    +859091
    +859093
    +859109
    +859121
    +859181
    +859189
    +859213
    +859223
    +859249
    +859259
    +859267
    +859273
    +859277
    +859279
    +859297
    +859321
    +859361
    +859363
    +859373
    +859381
    +859393
    +859423
    +859433
    +859447
    +859459
    +859477
    +859493
    +859513
    +859553
    +859559
    +859561
    +859567
    +859577
    +859601
    +859603
    +859609
    +859619
    +859633
    +859657
    +859667
    +859669
    +859679
    +859681
    +859697
    +859709
    +859751
    +859783
    +859787
    +859799
    +859801
    +859823
    +859841
    +859849
    +859853
    +859861
    +859891
    +859913
    +859919
    +859927
    +859933
    +859939
    +859973
    +859981
    +859987
    +860009
    +860011
    +860029
    +860051
    +860059
    +860063
    +860071
    +860077
    +860087
    +860089
    +860107
    +860113
    +860117
    +860143
    +860239
    +860257
    +860267
    +860291
    +860297
    +860309
    +860311
    +860317
    +860323
    +860333
    +860341
    +860351
    +860357
    +860369
    +860381
    +860383
    +860393
    +860399
    +860413
    +860417
    +860423
    +860441
    +860479
    +860501
    +860507
    +860513
    +860533
    +860543
    +860569
    +860579
    +860581
    +860593
    +860599
    +860609
    +860623
    +860641
    +860647
    +860663
    +860689
    +860701
    +860747
    +860753
    +860759
    +860779
    +860789
    +860791
    +860809
    +860813
    +860819
    +860843
    +860861
    +860887
    +860891
    +860911
    +860917
    +860921
    +860927
    +860929
    +860939
    +860941
    +860957
    +860969
    +860971
    +861001
    +861013
    +861019
    +861031
    +861037
    +861043
    +861053
    +861059
    +861079
    +861083
    +861089
    +861109
    +861121
    +861131
    +861139
    +861163
    +861167
    +861191
    +861199
    +861221
    +861239
    +861293
    +861299
    +861317
    +861347
    +861353
    +861361
    +861391
    +861433
    +861437
    +861439
    +861491
    +861493
    +861499
    +861541
    +861547
    +861551
    +861559
    +861563
    +861571
    +861589
    +861599
    +861613
    +861617
    +861647
    +861659
    +861691
    +861701
    +861703
    +861719
    +861733
    +861739
    +861743
    +861761
    +861797
    +861799
    +861803
    +861823
    +861829
    +861853
    +861857
    +861871
    +861877
    +861881
    +861899
    +861901
    +861907
    +861929
    +861937
    +861941
    +861947
    +861977
    +861979
    +861997
    +862009
    +862013
    +862031
    +862033
    +862061
    +862067
    +862097
    +862117
    +862123
    +862129
    +862139
    +862157
    +862159
    +862171
    +862177
    +862181
    +862187
    +862207
    +862219
    +862229
    +862231
    +862241
    +862249
    +862259
    +862261
    +862273
    +862283
    +862289
    +862297
    +862307
    +862319
    +862331
    +862343
    +862369
    +862387
    +862397
    +862399
    +862409
    +862417
    +862423
    +862441
    +862447
    +862471
    +862481
    +862483
    +862487
    +862493
    +862501
    +862541
    +862553
    +862559
    +862567
    +862571
    +862573
    +862583
    +862607
    +862627
    +862633
    +862649
    +862651
    +862669
    +862703
    +862727
    +862739
    +862769
    +862777
    +862783
    +862789
    +862811
    +862819
    +862861
    +862879
    +862907
    +862909
    +862913
    +862919
    +862921
    +862943
    +862957
    +862973
    +862987
    +862991
    +862997
    +863003
    +863017
    +863047
    +863081
    +863087
    +863119
    +863123
    +863131
    +863143
    +863153
    +863179
    +863197
    +863231
    +863251
    +863279
    +863287
    +863299
    +863309
    +863323
    +863363
    +863377
    +863393
    +863479
    +863491
    +863497
    +863509
    +863521
    +863537
    +863539
    +863561
    +863593
    +863609
    +863633
    +863641
    +863671
    +863689
    +863693
    +863711
    +863729
    +863743
    +863749
    +863767
    +863771
    +863783
    +863801
    +863803
    +863833
    +863843
    +863851
    +863867
    +863869
    +863879
    +863887
    +863897
    +863899
    +863909
    +863917
    +863921
    +863959
    +863983
    +864007
    +864011
    +864013
    +864029
    +864037
    +864047
    +864049
    +864053
    +864077
    +864079
    +864091
    +864103
    +864107
    +864119
    +864121
    +864131
    +864137
    +864151
    +864167
    +864169
    +864191
    +864203
    +864211
    +864221
    +864223
    +864251
    +864277
    +864289
    +864299
    +864301
    +864307
    +864319
    +864323
    +864341
    +864359
    +864361
    +864379
    +864407
    +864419
    +864427
    +864439
    +864449
    +864491
    +864503
    +864509
    +864511
    +864533
    +864541
    +864551
    +864581
    +864583
    +864587
    +864613
    +864623
    +864629
    +864631
    +864641
    +864673
    +864679
    +864691
    +864707
    +864733
    +864737
    +864757
    +864781
    +864793
    +864803
    +864811
    +864817
    +864883
    +864887
    +864901
    +864911
    +864917
    +864947
    +864953
    +864959
    +864967
    +864979
    +864989
    +865001
    +865003
    +865043
    +865049
    +865057
    +865061
    +865069
    +865087
    +865091
    +865103
    +865121
    +865153
    +865159
    +865177
    +865201
    +865211
    +865213
    +865217
    +865231
    +865247
    +865253
    +865259
    +865261
    +865301
    +865307
    +865313
    +865321
    +865327
    +865339
    +865343
    +865349
    +865357
    +865363
    +865379
    +865409
    +865457
    +865477
    +865481
    +865483
    +865493
    +865499
    +865511
    +865537
    +865577
    +865591
    +865597
    +865609
    +865619
    +865637
    +865639
    +865643
    +865661
    +865681
    +865687
    +865717
    +865721
    +865729
    +865741
    +865747
    +865751
    +865757
    +865769
    +865771
    +865783
    +865801
    +865807
    +865817
    +865819
    +865829
    +865847
    +865859
    +865867
    +865871
    +865877
    +865889
    +865933
    +865937
    +865957
    +865979
    +865993
    +866003
    +866009
    +866011
    +866029
    +866051
    +866053
    +866057
    +866081
    +866083
    +866087
    +866093
    +866101
    +866119
    +866123
    +866161
    +866183
    +866197
    +866213
    +866221
    +866231
    +866279
    +866293
    +866309
    +866311
    +866329
    +866353
    +866389
    +866399
    +866417
    +866431
    +866443
    +866461
    +866471
    +866477
    +866513
    +866519
    +866573
    +866581
    +866623
    +866629
    +866639
    +866641
    +866653
    +866683
    +866689
    +866693
    +866707
    +866713
    +866717
    +866737
    +866743
    +866759
    +866777
    +866783
    +866819
    +866843
    +866849
    +866851
    +866857
    +866869
    +866909
    +866917
    +866927
    +866933
    +866941
    +866953
    +866963
    +866969
    +867001
    +867007
    +867011
    +867023
    +867037
    +867059
    +867067
    +867079
    +867091
    +867121
    +867131
    +867143
    +867151
    +867161
    +867173
    +867203
    +867211
    +867227
    +867233
    +867253
    +867257
    +867259
    +867263
    +867271
    +867281
    +867301
    +867319
    +867337
    +867343
    +867371
    +867389
    +867397
    +867401
    +867409
    +867413
    +867431
    +867443
    +867457
    +867463
    +867467
    +867487
    +867509
    +867511
    +867541
    +867547
    +867553
    +867563
    +867571
    +867577
    +867589
    +867617
    +867619
    +867623
    +867631
    +867641
    +867653
    +867677
    +867679
    +867689
    +867701
    +867719
    +867733
    +867743
    +867773
    +867781
    +867793
    +867803
    +867817
    +867827
    +867829
    +867857
    +867871
    +867887
    +867913
    +867943
    +867947
    +867959
    +867991
    +868019
    +868033
    +868039
    +868051
    +868069
    +868073
    +868081
    +868103
    +868111
    +868121
    +868123
    +868151
    +868157
    +868171
    +868177
    +868199
    +868211
    +868229
    +868249
    +868267
    +868271
    +868277
    +868291
    +868313
    +868327
    +868331
    +868337
    +868349
    +868369
    +868379
    +868381
    +868397
    +868409
    +868423
    +868451
    +868453
    +868459
    +868487
    +868489
    +868493
    +868529
    +868531
    +868537
    +868559
    +868561
    +868577
    +868583
    +868603
    +868613
    +868639
    +868663
    +868669
    +868691
    +868697
    +868727
    +868739
    +868741
    +868771
    +868783
    +868787
    +868793
    +868799
    +868801
    +868817
    +868841
    +868849
    +868867
    +868873
    +868877
    +868883
    +868891
    +868909
    +868937
    +868939
    +868943
    +868951
    +868957
    +868993
    +868997
    +868999
    +869017
    +869021
    +869039
    +869053
    +869059
    +869069
    +869081
    +869119
    +869131
    +869137
    +869153
    +869173
    +869179
    +869203
    +869233
    +869249
    +869251
    +869257
    +869273
    +869291
    +869293
    +869299
    +869303
    +869317
    +869321
    +869339
    +869369
    +869371
    +869381
    +869399
    +869413
    +869419
    +869437
    +869443
    +869461
    +869467
    +869471
    +869489
    +869501
    +869521
    +869543
    +869551
    +869563
    +869579
    +869587
    +869597
    +869599
    +869657
    +869663
    +869683
    +869689
    +869707
    +869717
    +869747
    +869753
    +869773
    +869777
    +869779
    +869807
    +869809
    +869819
    +869849
    +869863
    +869879
    +869887
    +869893
    +869899
    +869909
    +869927
    +869951
    +869959
    +869983
    +869989
    +870007
    +870013
    +870031
    +870047
    +870049
    +870059
    +870083
    +870097
    +870109
    +870127
    +870131
    +870137
    +870151
    +870161
    +870169
    +870173
    +870197
    +870211
    +870223
    +870229
    +870239
    +870241
    +870253
    +870271
    +870283
    +870301
    +870323
    +870329
    +870341
    +870367
    +870391
    +870403
    +870407
    +870413
    +870431
    +870433
    +870437
    +870461
    +870479
    +870491
    +870497
    +870517
    +870533
    +870547
    +870577
    +870589
    +870593
    +870601
    +870613
    +870629
    +870641
    +870643
    +870679
    +870691
    +870703
    +870731
    +870739
    +870743
    +870773
    +870787
    +870809
    +870811
    +870823
    +870833
    +870847
    +870853
    +870871
    +870889
    +870901
    +870907
    +870911
    +870917
    +870929
    +870931
    +870953
    +870967
    +870977
    +870983
    +870997
    +871001
    +871021
    +871027
    +871037
    +871061
    +871103
    +871147
    +871159
    +871163
    +871177
    +871181
    +871229
    +871231
    +871249
    +871259
    +871271
    +871289
    +871303
    +871337
    +871349
    +871393
    +871439
    +871459
    +871463
    +871477
    +871513
    +871517
    +871531
    +871553
    +871571
    +871589
    +871597
    +871613
    +871621
    +871639
    +871643
    +871649
    +871657
    +871679
    +871681
    +871687
    +871727
    +871763
    +871771
    +871789
    +871817
    +871823
    +871837
    +871867
    +871883
    +871901
    +871919
    +871931
    +871957
    +871963
    +871973
    +871987
    +871993
    +872017
    +872023
    +872033
    +872041
    +872057
    +872071
    +872077
    +872089
    +872099
    +872107
    +872129
    +872141
    +872143
    +872149
    +872159
    +872161
    +872173
    +872177
    +872189
    +872203
    +872227
    +872231
    +872237
    +872243
    +872251
    +872257
    +872269
    +872281
    +872317
    +872323
    +872351
    +872353
    +872369
    +872381
    +872383
    +872387
    +872393
    +872411
    +872419
    +872429
    +872437
    +872441
    +872453
    +872471
    +872477
    +872479
    +872533
    +872549
    +872561
    +872563
    +872567
    +872587
    +872609
    +872611
    +872621
    +872623
    +872647
    +872657
    +872659
    +872671
    +872687
    +872731
    +872737
    +872747
    +872749
    +872761
    +872789
    +872791
    +872843
    +872863
    +872923
    +872947
    +872951
    +872953
    +872959
    +872999
    +873017
    +873043
    +873049
    +873073
    +873079
    +873083
    +873091
    +873109
    +873113
    +873121
    +873133
    +873139
    +873157
    +873209
    +873247
    +873251
    +873263
    +873293
    +873317
    +873319
    +873331
    +873343
    +873349
    +873359
    +873403
    +873407
    +873419
    +873421
    +873427
    +873437
    +873461
    +873463
    +873469
    +873497
    +873527
    +873529
    +873539
    +873541
    +873553
    +873569
    +873571
    +873617
    +873619
    +873641
    +873643
    +873659
    +873667
    +873671
    +873689
    +873707
    +873709
    +873721
    +873727
    +873739
    +873767
    +873773
    +873781
    +873787
    +873863
    +873877
    +873913
    +873959
    +873979
    +873989
    +873991
    +874001
    +874009
    +874037
    +874063
    +874087
    +874091
    +874099
    +874103
    +874109
    +874117
    +874121
    +874127
    +874151
    +874193
    +874213
    +874217
    +874229
    +874249
    +874267
    +874271
    +874277
    +874301
    +874303
    +874331
    +874337
    +874343
    +874351
    +874373
    +874387
    +874397
    +874403
    +874409
    +874427
    +874457
    +874459
    +874477
    +874487
    +874537
    +874543
    +874547
    +874567
    +874583
    +874597
    +874619
    +874637
    +874639
    +874651
    +874661
    +874673
    +874681
    +874693
    +874697
    +874711
    +874721
    +874723
    +874729
    +874739
    +874763
    +874771
    +874777
    +874799
    +874807
    +874813
    +874823
    +874831
    +874847
    +874859
    +874873
    +874879
    +874889
    +874891
    +874919
    +874957
    +874967
    +874987
    +875011
    +875027
    +875033
    +875089
    +875107
    +875113
    +875117
    +875129
    +875141
    +875183
    +875201
    +875209
    +875213
    +875233
    +875239
    +875243
    +875261
    +875263
    +875267
    +875269
    +875297
    +875299
    +875317
    +875323
    +875327
    +875333
    +875339
    +875341
    +875363
    +875377
    +875389
    +875393
    +875417
    +875419
    +875429
    +875443
    +875447
    +875477
    +875491
    +875503
    +875509
    +875513
    +875519
    +875521
    +875543
    +875579
    +875591
    +875593
    +875617
    +875621
    +875627
    +875629
    +875647
    +875659
    +875663
    +875681
    +875683
    +875689
    +875701
    +875711
    +875717
    +875731
    +875741
    +875759
    +875761
    +875773
    +875779
    +875783
    +875803
    +875821
    +875837
    +875851
    +875893
    +875923
    +875929
    +875933
    +875947
    +875969
    +875981
    +875983
    +876011
    +876013
    +876017
    +876019
    +876023
    +876041
    +876067
    +876077
    +876079
    +876097
    +876103
    +876107
    +876121
    +876131
    +876137
    +876149
    +876181
    +876191
    +876193
    +876199
    +876203
    +876229
    +876233
    +876257
    +876263
    +876287
    +876301
    +876307
    +876311
    +876329
    +876331
    +876341
    +876349
    +876371
    +876373
    +876431
    +876433
    +876443
    +876479
    +876481
    +876497
    +876523
    +876529
    +876569
    +876581
    +876593
    +876607
    +876611
    +876619
    +876643
    +876647
    +876653
    +876661
    +876677
    +876719
    +876721
    +876731
    +876749
    +876751
    +876761
    +876769
    +876787
    +876791
    +876797
    +876817
    +876823
    +876833
    +876851
    +876853
    +876871
    +876893
    +876913
    +876929
    +876947
    +876971
    +877003
    +877027
    +877043
    +877057
    +877073
    +877091
    +877109
    +877111
    +877117
    +877133
    +877169
    +877181
    +877187
    +877199
    +877213
    +877223
    +877237
    +877267
    +877291
    +877297
    +877301
    +877313
    +877321
    +877333
    +877343
    +877351
    +877361
    +877367
    +877379
    +877397
    +877399
    +877403
    +877411
    +877423
    +877463
    +877469
    +877531
    +877543
    +877567
    +877573
    +877577
    +877601
    +877609
    +877619
    +877621
    +877651
    +877661
    +877699
    +877739
    +877771
    +877783
    +877817
    +877823
    +877837
    +877843
    +877853
    +877867
    +877871
    +877873
    +877879
    +877883
    +877907
    +877909
    +877937
    +877939
    +877949
    +877997
    +878011
    +878021
    +878023
    +878039
    +878041
    +878077
    +878083
    +878089
    +878099
    +878107
    +878113
    +878131
    +878147
    +878153
    +878159
    +878167
    +878173
    +878183
    +878191
    +878197
    +878201
    +878221
    +878239
    +878279
    +878287
    +878291
    +878299
    +878309
    +878359
    +878377
    +878387
    +878411
    +878413
    +878419
    +878443
    +878453
    +878467
    +878489
    +878513
    +878539
    +878551
    +878567
    +878573
    +878593
    +878597
    +878609
    +878621
    +878629
    +878641
    +878651
    +878659
    +878663
    +878677
    +878681
    +878699
    +878719
    +878737
    +878743
    +878749
    +878777
    +878783
    +878789
    +878797
    +878821
    +878831
    +878833
    +878837
    +878851
    +878863
    +878869
    +878873
    +878893
    +878929
    +878939
    +878953
    +878957
    +878987
    +878989
    +879001
    +879007
    +879023
    +879031
    +879061
    +879089
    +879097
    +879103
    +879113
    +879119
    +879133
    +879143
    +879167
    +879169
    +879181
    +879199
    +879227
    +879239
    +879247
    +879259
    +879269
    +879271
    +879283
    +879287
    +879299
    +879331
    +879341
    +879343
    +879353
    +879371
    +879391
    +879401
    +879413
    +879449
    +879457
    +879493
    +879523
    +879533
    +879539
    +879553
    +879581
    +879583
    +879607
    +879617
    +879623
    +879629
    +879649
    +879653
    +879661
    +879667
    +879673
    +879679
    +879689
    +879691
    +879701
    +879707
    +879709
    +879713
    +879721
    +879743
    +879797
    +879799
    +879817
    +879821
    +879839
    +879859
    +879863
    +879881
    +879917
    +879919
    +879941
    +879953
    +879961
    +879973
    +879979
    +880001
    +880007
    +880021
    +880027
    +880031
    +880043
    +880057
    +880067
    +880069
    +880091
    +880097
    +880109
    +880127
    +880133
    +880151
    +880153
    +880199
    +880211
    +880219
    +880223
    +880247
    +880249
    +880259
    +880283
    +880301
    +880303
    +880331
    +880337
    +880343
    +880349
    +880361
    +880367
    +880409
    +880421
    +880423
    +880427
    +880483
    +880487
    +880513
    +880519
    +880531
    +880541
    +880543
    +880553
    +880559
    +880571
    +880573
    +880589
    +880603
    +880661
    +880667
    +880673
    +880681
    +880687
    +880699
    +880703
    +880709
    +880723
    +880727
    +880729
    +880751
    +880793
    +880799
    +880801
    +880813
    +880819
    +880823
    +880853
    +880861
    +880871
    +880883
    +880903
    +880907
    +880909
    +880939
    +880949
    +880951
    +880961
    +880981
    +880993
    +881003
    +881009
    +881017
    +881029
    +881057
    +881071
    +881077
    +881099
    +881119
    +881141
    +881143
    +881147
    +881159
    +881171
    +881173
    +881191
    +881197
    +881207
    +881219
    +881233
    +881249
    +881269
    +881273
    +881311
    +881317
    +881327
    +881333
    +881351
    +881357
    +881369
    +881393
    +881407
    +881411
    +881417
    +881437
    +881449
    +881471
    +881473
    +881477
    +881479
    +881509
    +881527
    +881533
    +881537
    +881539
    +881591
    +881597
    +881611
    +881641
    +881663
    +881669
    +881681
    +881707
    +881711
    +881729
    +881743
    +881779
    +881813
    +881833
    +881849
    +881897
    +881899
    +881911
    +881917
    +881939
    +881953
    +881963
    +881983
    +881987
    +882017
    +882019
    +882029
    +882031
    +882047
    +882061
    +882067
    +882071
    +882083
    +882103
    +882139
    +882157
    +882169
    +882173
    +882179
    +882187
    +882199
    +882239
    +882241
    +882247
    +882251
    +882253
    +882263
    +882289
    +882313
    +882359
    +882367
    +882377
    +882389
    +882391
    +882433
    +882439
    +882449
    +882451
    +882461
    +882481
    +882491
    +882517
    +882529
    +882551
    +882571
    +882577
    +882587
    +882593
    +882599
    +882617
    +882631
    +882653
    +882659
    +882697
    +882701
    +882703
    +882719
    +882727
    +882733
    +882751
    +882773
    +882779
    +882823
    +882851
    +882863
    +882877
    +882881
    +882883
    +882907
    +882913
    +882923
    +882943
    +882953
    +882961
    +882967
    +882979
    +883013
    +883049
    +883061
    +883073
    +883087
    +883093
    +883109
    +883111
    +883117
    +883121
    +883163
    +883187
    +883193
    +883213
    +883217
    +883229
    +883231
    +883237
    +883241
    +883247
    +883249
    +883273
    +883279
    +883307
    +883327
    +883331
    +883339
    +883343
    +883357
    +883391
    +883397
    +883409
    +883411
    +883423
    +883429
    +883433
    +883451
    +883471
    +883483
    +883489
    +883517
    +883537
    +883549
    +883577
    +883579
    +883613
    +883621
    +883627
    +883639
    +883661
    +883667
    +883691
    +883697
    +883699
    +883703
    +883721
    +883733
    +883739
    +883763
    +883777
    +883781
    +883783
    +883807
    +883871
    +883877
    +883889
    +883921
    +883933
    +883963
    +883969
    +883973
    +883979
    +883991
    +884003
    +884011
    +884029
    +884057
    +884069
    +884077
    +884087
    +884111
    +884129
    +884131
    +884159
    +884167
    +884171
    +884183
    +884201
    +884227
    +884231
    +884243
    +884251
    +884267
    +884269
    +884287
    +884293
    +884309
    +884311
    +884321
    +884341
    +884353
    +884363
    +884369
    +884371
    +884417
    +884423
    +884437
    +884441
    +884453
    +884483
    +884489
    +884491
    +884497
    +884501
    +884537
    +884573
    +884579
    +884591
    +884593
    +884617
    +884651
    +884669
    +884693
    +884699
    +884717
    +884743
    +884789
    +884791
    +884803
    +884813
    +884827
    +884831
    +884857
    +884881
    +884899
    +884921
    +884951
    +884959
    +884977
    +884981
    +884987
    +884999
    +885023
    +885041
    +885061
    +885083
    +885091
    +885097
    +885103
    +885107
    +885127
    +885133
    +885161
    +885163
    +885169
    +885187
    +885217
    +885223
    +885233
    +885239
    +885251
    +885257
    +885263
    +885289
    +885301
    +885307
    +885331
    +885359
    +885371
    +885383
    +885389
    +885397
    +885403
    +885421
    +885427
    +885449
    +885473
    +885487
    +885497
    +885503
    +885509
    +885517
    +885529
    +885551
    +885553
    +885589
    +885607
    +885611
    +885623
    +885679
    +885713
    +885721
    +885727
    +885733
    +885737
    +885769
    +885791
    +885793
    +885803
    +885811
    +885821
    +885823
    +885839
    +885869
    +885881
    +885883
    +885889
    +885893
    +885919
    +885923
    +885931
    +885943
    +885947
    +885959
    +885961
    +885967
    +885971
    +885977
    +885991
    +886007
    +886013
    +886019
    +886021
    +886031
    +886043
    +886069
    +886097
    +886117
    +886129
    +886163
    +886177
    +886181
    +886183
    +886189
    +886199
    +886241
    +886243
    +886247
    +886271
    +886283
    +886307
    +886313
    +886337
    +886339
    +886349
    +886367
    +886381
    +886387
    +886421
    +886427
    +886429
    +886433
    +886453
    +886463
    +886469
    +886471
    +886493
    +886511
    +886517
    +886519
    +886537
    +886541
    +886547
    +886549
    +886583
    +886591
    +886607
    +886609
    +886619
    +886643
    +886651
    +886663
    +886667
    +886741
    +886747
    +886751
    +886759
    +886777
    +886793
    +886799
    +886807
    +886819
    +886859
    +886867
    +886891
    +886909
    +886913
    +886967
    +886969
    +886973
    +886979
    +886981
    +886987
    +886993
    +886999
    +887017
    +887057
    +887059
    +887069
    +887093
    +887101
    +887113
    +887141
    +887143
    +887153
    +887171
    +887177
    +887191
    +887203
    +887233
    +887261
    +887267
    +887269
    +887291
    +887311
    +887323
    +887333
    +887377
    +887387
    +887399
    +887401
    +887423
    +887441
    +887449
    +887459
    +887479
    +887483
    +887503
    +887533
    +887543
    +887567
    +887569
    +887573
    +887581
    +887599
    +887617
    +887629
    +887633
    +887641
    +887651
    +887657
    +887659
    +887669
    +887671
    +887681
    +887693
    +887701
    +887707
    +887717
    +887743
    +887749
    +887759
    +887819
    +887827
    +887837
    +887839
    +887849
    +887867
    +887903
    +887911
    +887921
    +887923
    +887941
    +887947
    +887987
    +887989
    +888001
    +888011
    +888047
    +888059
    +888061
    +888077
    +888091
    +888103
    +888109
    +888133
    +888143
    +888157
    +888161
    +888163
    +888179
    +888203
    +888211
    +888247
    +888257
    +888263
    +888271
    +888287
    +888313
    +888319
    +888323
    +888359
    +888361
    +888373
    +888389
    +888397
    +888409
    +888413
    +888427
    +888431
    +888443
    +888451
    +888457
    +888469
    +888479
    +888493
    +888499
    +888533
    +888541
    +888557
    +888623
    +888631
    +888637
    +888653
    +888659
    +888661
    +888683
    +888689
    +888691
    +888721
    +888737
    +888751
    +888761
    +888773
    +888779
    +888781
    +888793
    +888799
    +888809
    +888827
    +888857
    +888869
    +888871
    +888887
    +888917
    +888919
    +888931
    +888959
    +888961
    +888967
    +888983
    +888989
    +888997
    +889001
    +889027
    +889037
    +889039
    +889043
    +889051
    +889069
    +889081
    +889087
    +889123
    +889139
    +889171
    +889177
    +889211
    +889237
    +889247
    +889261
    +889271
    +889279
    +889289
    +889309
    +889313
    +889327
    +889337
    +889349
    +889351
    +889363
    +889367
    +889373
    +889391
    +889411
    +889429
    +889439
    +889453
    +889481
    +889489
    +889501
    +889519
    +889579
    +889589
    +889597
    +889631
    +889639
    +889657
    +889673
    +889687
    +889697
    +889699
    +889703
    +889727
    +889747
    +889769
    +889783
    +889829
    +889871
    +889873
    +889877
    +889879
    +889891
    +889901
    +889907
    +889909
    +889921
    +889937
    +889951
    +889957
    +889963
    +889997
    +890003
    +890011
    +890027
    +890053
    +890063
    +890083
    +890107
    +890111
    +890117
    +890119
    +890129
    +890147
    +890159
    +890161
    +890177
    +890221
    +890231
    +890237
    +890287
    +890291
    +890303
    +890317
    +890333
    +890371
    +890377
    +890419
    +890429
    +890437
    +890441
    +890459
    +890467
    +890501
    +890531
    +890543
    +890551
    +890563
    +890597
    +890609
    +890653
    +890657
    +890671
    +890683
    +890707
    +890711
    +890717
    +890737
    +890761
    +890789
    +890797
    +890803
    +890809
    +890821
    +890833
    +890843
    +890861
    +890863
    +890867
    +890881
    +890887
    +890893
    +890927
    +890933
    +890941
    +890957
    +890963
    +890969
    +890993
    +890999
    +891001
    +891017
    +891047
    +891049
    +891061
    +891067
    +891091
    +891101
    +891103
    +891133
    +891151
    +891161
    +891173
    +891179
    +891223
    +891239
    +891251
    +891277
    +891287
    +891311
    +891323
    +891329
    +891349
    +891377
    +891379
    +891389
    +891391
    +891409
    +891421
    +891427
    +891439
    +891481
    +891487
    +891491
    +891493
    +891509
    +891521
    +891523
    +891551
    +891557
    +891559
    +891563
    +891571
    +891577
    +891587
    +891593
    +891601
    +891617
    +891629
    +891643
    +891647
    +891659
    +891661
    +891677
    +891679
    +891707
    +891743
    +891749
    +891763
    +891767
    +891797
    +891799
    +891809
    +891817
    +891823
    +891827
    +891829
    +891851
    +891859
    +891887
    +891889
    +891893
    +891899
    +891907
    +891923
    +891929
    +891967
    +891983
    +891991
    +891997
    +892019
    +892027
    +892049
    +892057
    +892079
    +892091
    +892093
    +892097
    +892103
    +892123
    +892141
    +892153
    +892159
    +892169
    +892189
    +892219
    +892237
    +892249
    +892253
    +892261
    +892267
    +892271
    +892291
    +892321
    +892351
    +892357
    +892387
    +892391
    +892421
    +892433
    +892439
    +892457
    +892471
    +892481
    +892513
    +892523
    +892531
    +892547
    +892553
    +892559
    +892579
    +892597
    +892603
    +892609
    +892627
    +892643
    +892657
    +892663
    +892667
    +892709
    +892733
    +892747
    +892757
    +892763
    +892777
    +892781
    +892783
    +892817
    +892841
    +892849
    +892861
    +892877
    +892901
    +892919
    +892933
    +892951
    +892973
    +892987
    +892999
    +893003
    +893023
    +893029
    +893033
    +893041
    +893051
    +893059
    +893093
    +893099
    +893107
    +893111
    +893117
    +893119
    +893131
    +893147
    +893149
    +893161
    +893183
    +893213
    +893219
    +893227
    +893237
    +893257
    +893261
    +893281
    +893317
    +893339
    +893341
    +893351
    +893359
    +893363
    +893381
    +893383
    +893407
    +893413
    +893419
    +893429
    +893441
    +893449
    +893479
    +893489
    +893509
    +893521
    +893549
    +893567
    +893591
    +893603
    +893609
    +893653
    +893657
    +893671
    +893681
    +893701
    +893719
    +893723
    +893743
    +893777
    +893797
    +893821
    +893839
    +893857
    +893863
    +893873
    +893881
    +893897
    +893903
    +893917
    +893929
    +893933
    +893939
    +893989
    +893999
    +894011
    +894037
    +894059
    +894067
    +894073
    +894097
    +894109
    +894119
    +894137
    +894139
    +894151
    +894161
    +894167
    +894181
    +894191
    +894193
    +894203
    +894209
    +894211
    +894221
    +894227
    +894233
    +894239
    +894247
    +894259
    +894277
    +894281
    +894287
    +894301
    +894329
    +894343
    +894371
    +894391
    +894403
    +894407
    +894409
    +894419
    +894427
    +894431
    +894449
    +894451
    +894503
    +894511
    +894521
    +894527
    +894541
    +894547
    +894559
    +894581
    +894589
    +894611
    +894613
    +894637
    +894643
    +894667
    +894689
    +894709
    +894713
    +894721
    +894731
    +894749
    +894763
    +894779
    +894791
    +894793
    +894811
    +894869
    +894871
    +894893
    +894917
    +894923
    +894947
    +894973
    +894997
    +895003
    +895007
    +895009
    +895039
    +895049
    +895051
    +895079
    +895087
    +895127
    +895133
    +895151
    +895157
    +895159
    +895171
    +895189
    +895211
    +895231
    +895241
    +895243
    +895247
    +895253
    +895277
    +895283
    +895291
    +895309
    +895313
    +895319
    +895333
    +895343
    +895351
    +895357
    +895361
    +895387
    +895393
    +895421
    +895423
    +895457
    +895463
    +895469
    +895471
    +895507
    +895529
    +895553
    +895571
    +895579
    +895591
    +895613
    +895627
    +895633
    +895649
    +895651
    +895667
    +895669
    +895673
    +895681
    +895691
    +895703
    +895709
    +895721
    +895729
    +895757
    +895771
    +895777
    +895787
    +895789
    +895799
    +895801
    +895813
    +895823
    +895841
    +895861
    +895879
    +895889
    +895901
    +895903
    +895913
    +895927
    +895933
    +895957
    +895987
    +896003
    +896009
    +896047
    +896069
    +896101
    +896107
    +896111
    +896113
    +896123
    +896143
    +896167
    +896191
    +896201
    +896263
    +896281
    +896293
    +896297
    +896299
    +896323
    +896327
    +896341
    +896347
    +896353
    +896369
    +896381
    +896417
    +896443
    +896447
    +896449
    +896453
    +896479
    +896491
    +896509
    +896521
    +896531
    +896537
    +896543
    +896549
    +896557
    +896561
    +896573
    +896587
    +896617
    +896633
    +896647
    +896669
    +896677
    +896681
    +896717
    +896719
    +896723
    +896771
    +896783
    +896803
    +896837
    +896867
    +896879
    +896897
    +896921
    +896927
    +896947
    +896953
    +896963
    +896983
    +897007
    +897011
    +897019
    +897049
    +897053
    +897059
    +897067
    +897077
    +897101
    +897103
    +897119
    +897133
    +897137
    +897157
    +897163
    +897191
    +897223
    +897229
    +897241
    +897251
    +897263
    +897269
    +897271
    +897301
    +897307
    +897317
    +897319
    +897329
    +897349
    +897359
    +897373
    +897401
    +897433
    +897443
    +897461
    +897467
    +897469
    +897473
    +897497
    +897499
    +897517
    +897527
    +897553
    +897557
    +897563
    +897571
    +897577
    +897581
    +897593
    +897601
    +897607
    +897629
    +897647
    +897649
    +897671
    +897691
    +897703
    +897707
    +897709
    +897727
    +897751
    +897779
    +897781
    +897817
    +897829
    +897847
    +897877
    +897881
    +897887
    +897899
    +897907
    +897931
    +897947
    +897971
    +897983
    +898013
    +898019
    +898033
    +898063
    +898067
    +898069
    +898091
    +898097
    +898109
    +898129
    +898133
    +898147
    +898153
    +898171
    +898181
    +898189
    +898199
    +898211
    +898213
    +898223
    +898231
    +898241
    +898243
    +898253
    +898259
    +898279
    +898283
    +898291
    +898307
    +898319
    +898327
    +898361
    +898369
    +898409
    +898421
    +898423
    +898427
    +898439
    +898459
    +898477
    +898481
    +898483
    +898493
    +898519
    +898523
    +898543
    +898549
    +898553
    +898561
    +898607
    +898613
    +898621
    +898661
    +898663
    +898669
    +898673
    +898691
    +898717
    +898727
    +898753
    +898763
    +898769
    +898787
    +898813
    +898819
    +898823
    +898853
    +898867
    +898873
    +898889
    +898897
    +898921
    +898927
    +898951
    +898981
    +898987
    +899009
    +899051
    +899057
    +899069
    +899123
    +899149
    +899153
    +899159
    +899161
    +899177
    +899179
    +899183
    +899189
    +899209
    +899221
    +899233
    +899237
    +899263
    +899273
    +899291
    +899309
    +899321
    +899387
    +899401
    +899413
    +899429
    +899447
    +899467
    +899473
    +899477
    +899491
    +899519
    +899531
    +899537
    +899611
    +899617
    +899659
    +899671
    +899681
    +899687
    +899693
    +899711
    +899719
    +899749
    +899753
    +899761
    +899779
    +899791
    +899807
    +899831
    +899849
    +899851
    +899863
    +899881
    +899891
    +899893
    +899903
    +899917
    +899939
    +899971
    +899981
    +900001
    +900007
    +900019
    +900037
    +900061
    +900089
    +900091
    +900103
    +900121
    +900139
    +900143
    +900149
    +900157
    +900161
    +900169
    +900187
    +900217
    +900233
    +900241
    +900253
    +900259
    +900283
    +900287
    +900293
    +900307
    +900329
    +900331
    +900349
    +900397
    +900409
    +900443
    +900461
    +900481
    +900491
    +900511
    +900539
    +900551
    +900553
    +900563
    +900569
    +900577
    +900583
    +900587
    +900589
    +900593
    +900607
    +900623
    +900649
    +900659
    +900671
    +900673
    +900689
    +900701
    +900719
    +900737
    +900743
    +900751
    +900761
    +900763
    +900773
    +900797
    +900803
    +900817
    +900821
    +900863
    +900869
    +900917
    +900929
    +900931
    +900937
    +900959
    +900971
    +900973
    +900997
    +901007
    +901009
    +901013
    +901063
    +901067
    +901079
    +901093
    +901097
    +901111
    +901133
    +901141
    +901169
    +901171
    +901177
    +901183
    +901193
    +901207
    +901211
    +901213
    +901247
    +901249
    +901253
    +901273
    +901279
    +901309
    +901333
    +901339
    +901367
    +901399
    +901403
    +901423
    +901427
    +901429
    +901441
    +901447
    +901451
    +901457
    +901471
    +901489
    +901499
    +901501
    +901513
    +901517
    +901529
    +901547
    +901567
    +901591
    +901613
    +901643
    +901657
    +901679
    +901687
    +901709
    +901717
    +901739
    +901741
    +901751
    +901781
    +901787
    +901811
    +901819
    +901841
    +901861
    +901891
    +901907
    +901909
    +901919
    +901931
    +901937
    +901963
    +901973
    +901993
    +901997
    +902009
    +902017
    +902029
    +902039
    +902047
    +902053
    +902087
    +902089
    +902119
    +902137
    +902141
    +902179
    +902191
    +902201
    +902227
    +902261
    +902263
    +902281
    +902299
    +902303
    +902311
    +902333
    +902347
    +902351
    +902357
    +902389
    +902401
    +902413
    +902437
    +902449
    +902471
    +902477
    +902483
    +902501
    +902507
    +902521
    +902563
    +902569
    +902579
    +902591
    +902597
    +902599
    +902611
    +902639
    +902653
    +902659
    +902669
    +902677
    +902687
    +902719
    +902723
    +902753
    +902761
    +902767
    +902771
    +902777
    +902789
    +902807
    +902821
    +902827
    +902849
    +902873
    +902903
    +902933
    +902953
    +902963
    +902971
    +902977
    +902981
    +902987
    +903017
    +903029
    +903037
    +903073
    +903079
    +903103
    +903109
    +903143
    +903151
    +903163
    +903179
    +903197
    +903211
    +903223
    +903251
    +903257
    +903269
    +903311
    +903323
    +903337
    +903347
    +903359
    +903367
    +903389
    +903391
    +903403
    +903407
    +903421
    +903443
    +903449
    +903451
    +903457
    +903479
    +903493
    +903527
    +903541
    +903547
    +903563
    +903569
    +903607
    +903613
    +903641
    +903649
    +903673
    +903677
    +903691
    +903701
    +903709
    +903751
    +903757
    +903761
    +903781
    +903803
    +903827
    +903841
    +903871
    +903883
    +903899
    +903913
    +903919
    +903949
    +903967
    +903979
    +904019
    +904027
    +904049
    +904067
    +904069
    +904073
    +904087
    +904093
    +904097
    +904103
    +904117
    +904121
    +904147
    +904157
    +904181
    +904193
    +904201
    +904207
    +904217
    +904219
    +904261
    +904283
    +904289
    +904297
    +904303
    +904357
    +904361
    +904369
    +904399
    +904441
    +904459
    +904483
    +904489
    +904499
    +904511
    +904513
    +904517
    +904523
    +904531
    +904559
    +904573
    +904577
    +904601
    +904619
    +904627
    +904633
    +904637
    +904643
    +904661
    +904663
    +904667
    +904679
    +904681
    +904693
    +904697
    +904721
    +904727
    +904733
    +904759
    +904769
    +904777
    +904781
    +904789
    +904793
    +904801
    +904811
    +904823
    +904847
    +904861
    +904867
    +904873
    +904879
    +904901
    +904903
    +904907
    +904919
    +904931
    +904933
    +904987
    +904997
    +904999
    +905011
    +905053
    +905059
    +905071
    +905083
    +905087
    +905111
    +905123
    +905137
    +905143
    +905147
    +905161
    +905167
    +905171
    +905189
    +905197
    +905207
    +905209
    +905213
    +905227
    +905249
    +905269
    +905291
    +905297
    +905299
    +905329
    +905339
    +905347
    +905381
    +905413
    +905449
    +905453
    +905461
    +905477
    +905491
    +905497
    +905507
    +905551
    +905581
    +905587
    +905599
    +905617
    +905621
    +905629
    +905647
    +905651
    +905659
    +905677
    +905683
    +905687
    +905693
    +905701
    +905713
    +905719
    +905759
    +905761
    +905767
    +905783
    +905803
    +905819
    +905833
    +905843
    +905897
    +905909
    +905917
    +905923
    +905951
    +905959
    +905963
    +905999
    +906007
    +906011
    +906013
    +906023
    +906029
    +906043
    +906089
    +906107
    +906119
    +906121
    +906133
    +906179
    +906187
    +906197
    +906203
    +906211
    +906229
    +906233
    +906259
    +906263
    +906289
    +906293
    +906313
    +906317
    +906329
    +906331
    +906343
    +906349
    +906371
    +906377
    +906383
    +906391
    +906403
    +906421
    +906427
    +906431
    +906461
    +906473
    +906481
    +906487
    +906497
    +906517
    +906523
    +906539
    +906541
    +906557
    +906589
    +906601
    +906613
    +906617
    +906641
    +906649
    +906673
    +906679
    +906691
    +906701
    +906707
    +906713
    +906727
    +906749
    +906751
    +906757
    +906767
    +906779
    +906793
    +906809
    +906817
    +906823
    +906839
    +906847
    +906869
    +906881
    +906901
    +906911
    +906923
    +906929
    +906931
    +906943
    +906949
    +906973
    +907019
    +907021
    +907031
    +907063
    +907073
    +907099
    +907111
    +907133
    +907139
    +907141
    +907163
    +907169
    +907183
    +907199
    +907211
    +907213
    +907217
    +907223
    +907229
    +907237
    +907259
    +907267
    +907279
    +907297
    +907301
    +907321
    +907331
    +907363
    +907367
    +907369
    +907391
    +907393
    +907397
    +907399
    +907427
    +907433
    +907447
    +907457
    +907469
    +907471
    +907481
    +907493
    +907507
    +907513
    +907549
    +907561
    +907567
    +907583
    +907589
    +907637
    +907651
    +907657
    +907663
    +907667
    +907691
    +907693
    +907703
    +907717
    +907723
    +907727
    +907733
    +907757
    +907759
    +907793
    +907807
    +907811
    +907813
    +907831
    +907843
    +907849
    +907871
    +907891
    +907909
    +907913
    +907927
    +907957
    +907967
    +907969
    +907997
    +907999
    +908003
    +908041
    +908053
    +908057
    +908071
    +908081
    +908101
    +908113
    +908129
    +908137
    +908153
    +908179
    +908183
    +908197
    +908213
    +908221
    +908233
    +908249
    +908287
    +908317
    +908321
    +908353
    +908359
    +908363
    +908377
    +908381
    +908417
    +908419
    +908441
    +908449
    +908459
    +908471
    +908489
    +908491
    +908503
    +908513
    +908521
    +908527
    +908533
    +908539
    +908543
    +908549
    +908573
    +908581
    +908591
    +908597
    +908603
    +908617
    +908623
    +908627
    +908653
    +908669
    +908671
    +908711
    +908723
    +908731
    +908741
    +908749
    +908759
    +908771
    +908797
    +908807
    +908813
    +908819
    +908821
    +908849
    +908851
    +908857
    +908861
    +908863
    +908879
    +908881
    +908893
    +908909
    +908911
    +908927
    +908953
    +908959
    +908993
    +909019
    +909023
    +909031
    +909037
    +909043
    +909047
    +909061
    +909071
    +909089
    +909091
    +909107
    +909113
    +909119
    +909133
    +909151
    +909173
    +909203
    +909217
    +909239
    +909241
    +909247
    +909253
    +909281
    +909287
    +909289
    +909299
    +909301
    +909317
    +909319
    +909329
    +909331
    +909341
    +909343
    +909371
    +909379
    +909383
    +909401
    +909409
    +909437
    +909451
    +909457
    +909463
    +909481
    +909521
    +909529
    +909539
    +909541
    +909547
    +909577
    +909599
    +909611
    +909613
    +909631
    +909637
    +909679
    +909683
    +909691
    +909697
    +909731
    +909737
    +909743
    +909761
    +909767
    +909773
    +909787
    +909791
    +909803
    +909809
    +909829
    +909833
    +909859
    +909863
    +909877
    +909889
    +909899
    +909901
    +909907
    +909911
    +909917
    +909971
    +909973
    +909977
    +910003
    +910031
    +910051
    +910069
    +910093
    +910097
    +910099
    +910103
    +910109
    +910121
    +910127
    +910139
    +910141
    +910171
    +910177
    +910199
    +910201
    +910207
    +910213
    +910219
    +910229
    +910277
    +910279
    +910307
    +910361
    +910369
    +910421
    +910447
    +910451
    +910453
    +910457
    +910471
    +910519
    +910523
    +910561
    +910577
    +910583
    +910603
    +910619
    +910621
    +910627
    +910631
    +910643
    +910661
    +910691
    +910709
    +910711
    +910747
    +910751
    +910771
    +910781
    +910787
    +910799
    +910807
    +910817
    +910849
    +910853
    +910883
    +910909
    +910939
    +910957
    +910981
    +911003
    +911011
    +911023
    +911033
    +911039
    +911063
    +911077
    +911087
    +911089
    +911101
    +911111
    +911129
    +911147
    +911159
    +911161
    +911167
    +911171
    +911173
    +911179
    +911201
    +911219
    +911227
    +911231
    +911233
    +911249
    +911269
    +911291
    +911293
    +911303
    +911311
    +911321
    +911327
    +911341
    +911357
    +911359
    +911363
    +911371
    +911413
    +911419
    +911437
    +911453
    +911459
    +911503
    +911507
    +911527
    +911549
    +911593
    +911597
    +911621
    +911633
    +911657
    +911663
    +911671
    +911681
    +911683
    +911689
    +911707
    +911719
    +911723
    +911737
    +911749
    +911773
    +911777
    +911783
    +911819
    +911831
    +911837
    +911839
    +911851
    +911861
    +911873
    +911879
    +911893
    +911899
    +911903
    +911917
    +911947
    +911951
    +911957
    +911959
    +911969
    +912007
    +912031
    +912047
    +912049
    +912053
    +912061
    +912083
    +912089
    +912103
    +912167
    +912173
    +912187
    +912193
    +912211
    +912217
    +912227
    +912239
    +912251
    +912269
    +912287
    +912337
    +912343
    +912349
    +912367
    +912391
    +912397
    +912403
    +912409
    +912413
    +912449
    +912451
    +912463
    +912467
    +912469
    +912481
    +912487
    +912491
    +912497
    +912511
    +912521
    +912523
    +912533
    +912539
    +912559
    +912581
    +912631
    +912647
    +912649
    +912727
    +912763
    +912773
    +912797
    +912799
    +912809
    +912823
    +912829
    +912839
    +912851
    +912853
    +912859
    +912869
    +912871
    +912911
    +912929
    +912941
    +912953
    +912959
    +912971
    +912973
    +912979
    +912991
    +913013
    +913027
    +913037
    +913039
    +913063
    +913067
    +913103
    +913139
    +913151
    +913177
    +913183
    +913217
    +913247
    +913259
    +913279
    +913309
    +913321
    +913327
    +913331
    +913337
    +913373
    +913397
    +913417
    +913421
    +913433
    +913441
    +913447
    +913457
    +913483
    +913487
    +913513
    +913571
    +913573
    +913579
    +913589
    +913637
    +913639
    +913687
    +913709
    +913723
    +913739
    +913753
    +913771
    +913799
    +913811
    +913853
    +913873
    +913889
    +913907
    +913921
    +913933
    +913943
    +913981
    +913999
    +914021
    +914027
    +914041
    +914047
    +914117
    +914131
    +914161
    +914189
    +914191
    +914213
    +914219
    +914237
    +914239
    +914257
    +914269
    +914279
    +914293
    +914321
    +914327
    +914339
    +914351
    +914357
    +914359
    +914363
    +914369
    +914371
    +914429
    +914443
    +914449
    +914461
    +914467
    +914477
    +914491
    +914513
    +914519
    +914521
    +914533
    +914561
    +914569
    +914579
    +914581
    +914591
    +914597
    +914609
    +914611
    +914629
    +914647
    +914657
    +914701
    +914713
    +914723
    +914731
    +914737
    +914777
    +914783
    +914789
    +914791
    +914801
    +914813
    +914819
    +914827
    +914843
    +914857
    +914861
    +914867
    +914873
    +914887
    +914891
    +914897
    +914941
    +914951
    +914971
    +914981
    +915007
    +915017
    +915029
    +915041
    +915049
    +915053
    +915067
    +915071
    +915113
    +915139
    +915143
    +915157
    +915181
    +915191
    +915197
    +915199
    +915203
    +915221
    +915223
    +915247
    +915251
    +915253
    +915259
    +915283
    +915301
    +915311
    +915353
    +915367
    +915379
    +915391
    +915437
    +915451
    +915479
    +915487
    +915527
    +915533
    +915539
    +915547
    +915557
    +915587
    +915589
    +915601
    +915611
    +915613
    +915623
    +915631
    +915641
    +915659
    +915683
    +915697
    +915703
    +915727
    +915731
    +915737
    +915757
    +915763
    +915769
    +915799
    +915839
    +915851
    +915869
    +915881
    +915911
    +915917
    +915919
    +915947
    +915949
    +915961
    +915973
    +915991
    +916031
    +916033
    +916049
    +916057
    +916061
    +916073
    +916099
    +916103
    +916109
    +916121
    +916127
    +916129
    +916141
    +916169
    +916177
    +916183
    +916187
    +916189
    +916213
    +916217
    +916219
    +916259
    +916261
    +916273
    +916291
    +916319
    +916337
    +916339
    +916361
    +916367
    +916387
    +916411
    +916417
    +916441
    +916451
    +916457
    +916463
    +916469
    +916471
    +916477
    +916501
    +916507
    +916511
    +916537
    +916561
    +916571
    +916583
    +916613
    +916621
    +916633
    +916649
    +916651
    +916679
    +916703
    +916733
    +916771
    +916781
    +916787
    +916831
    +916837
    +916841
    +916859
    +916871
    +916879
    +916907
    +916913
    +916931
    +916933
    +916939
    +916961
    +916973
    +916999
    +917003
    +917039
    +917041
    +917051
    +917053
    +917083
    +917089
    +917093
    +917101
    +917113
    +917117
    +917123
    +917141
    +917153
    +917159
    +917173
    +917179
    +917209
    +917219
    +917227
    +917237
    +917239
    +917243
    +917251
    +917281
    +917291
    +917317
    +917327
    +917333
    +917353
    +917363
    +917381
    +917407
    +917443
    +917459
    +917461
    +917471
    +917503
    +917513
    +917519
    +917549
    +917557
    +917573
    +917591
    +917593
    +917611
    +917617
    +917629
    +917633
    +917641
    +917659
    +917669
    +917687
    +917689
    +917713
    +917729
    +917737
    +917753
    +917759
    +917767
    +917771
    +917773
    +917783
    +917789
    +917803
    +917809
    +917827
    +917831
    +917837
    +917843
    +917849
    +917869
    +917887
    +917893
    +917923
    +917927
    +917951
    +917971
    +917993
    +918011
    +918019
    +918041
    +918067
    +918079
    +918089
    +918103
    +918109
    +918131
    +918139
    +918143
    +918149
    +918157
    +918161
    +918173
    +918193
    +918199
    +918209
    +918223
    +918257
    +918259
    +918263
    +918283
    +918301
    +918319
    +918329
    +918341
    +918347
    +918353
    +918361
    +918371
    +918389
    +918397
    +918431
    +918433
    +918439
    +918443
    +918469
    +918481
    +918497
    +918529
    +918539
    +918563
    +918581
    +918583
    +918587
    +918613
    +918641
    +918647
    +918653
    +918677
    +918679
    +918683
    +918733
    +918737
    +918751
    +918763
    +918767
    +918779
    +918787
    +918793
    +918823
    +918829
    +918839
    +918857
    +918877
    +918889
    +918899
    +918913
    +918943
    +918947
    +918949
    +918959
    +918971
    +918989
    +919013
    +919019
    +919021
    +919031
    +919033
    +919063
    +919067
    +919081
    +919109
    +919111
    +919129
    +919147
    +919153
    +919169
    +919183
    +919189
    +919223
    +919229
    +919231
    +919249
    +919253
    +919267
    +919301
    +919313
    +919319
    +919337
    +919349
    +919351
    +919381
    +919393
    +919409
    +919417
    +919421
    +919423
    +919427
    +919447
    +919511
    +919519
    +919531
    +919559
    +919571
    +919591
    +919613
    +919621
    +919631
    +919679
    +919691
    +919693
    +919703
    +919729
    +919757
    +919759
    +919769
    +919781
    +919799
    +919811
    +919817
    +919823
    +919859
    +919871
    +919883
    +919901
    +919903
    +919913
    +919927
    +919937
    +919939
    +919949
    +919951
    +919969
    +919979
    +920011
    +920021
    +920039
    +920053
    +920107
    +920123
    +920137
    +920147
    +920149
    +920167
    +920197
    +920201
    +920203
    +920209
    +920219
    +920233
    +920263
    +920267
    +920273
    +920279
    +920281
    +920291
    +920323
    +920333
    +920357
    +920371
    +920377
    +920393
    +920399
    +920407
    +920411
    +920419
    +920441
    +920443
    +920467
    +920473
    +920477
    +920497
    +920509
    +920519
    +920539
    +920561
    +920609
    +920641
    +920651
    +920653
    +920677
    +920687
    +920701
    +920707
    +920729
    +920741
    +920743
    +920753
    +920761
    +920783
    +920789
    +920791
    +920807
    +920827
    +920833
    +920849
    +920863
    +920869
    +920891
    +920921
    +920947
    +920951
    +920957
    +920963
    +920971
    +920999
    +921001
    +921007
    +921013
    +921029
    +921031
    +921073
    +921079
    +921091
    +921121
    +921133
    +921143
    +921149
    +921157
    +921169
    +921191
    +921197
    +921199
    +921203
    +921223
    +921233
    +921241
    +921257
    +921259
    +921287
    +921293
    +921331
    +921353
    +921373
    +921379
    +921407
    +921409
    +921457
    +921463
    +921467
    +921491
    +921497
    +921499
    +921517
    +921523
    +921563
    +921581
    +921589
    +921601
    +921611
    +921629
    +921637
    +921643
    +921647
    +921667
    +921677
    +921703
    +921733
    +921737
    +921743
    +921749
    +921751
    +921761
    +921779
    +921787
    +921821
    +921839
    +921841
    +921871
    +921887
    +921889
    +921901
    +921911
    +921913
    +921919
    +921931
    +921959
    +921989
    +922021
    +922027
    +922037
    +922039
    +922043
    +922057
    +922067
    +922069
    +922073
    +922079
    +922081
    +922087
    +922099
    +922123
    +922169
    +922211
    +922217
    +922223
    +922237
    +922247
    +922261
    +922283
    +922289
    +922291
    +922303
    +922309
    +922321
    +922331
    +922333
    +922351
    +922357
    +922367
    +922391
    +922423
    +922451
    +922457
    +922463
    +922487
    +922489
    +922499
    +922511
    +922513
    +922517
    +922531
    +922549
    +922561
    +922601
    +922613
    +922619
    +922627
    +922631
    +922637
    +922639
    +922643
    +922667
    +922679
    +922681
    +922699
    +922717
    +922729
    +922739
    +922741
    +922781
    +922807
    +922813
    +922853
    +922861
    +922897
    +922907
    +922931
    +922973
    +922993
    +923017
    +923023
    +923029
    +923047
    +923051
    +923053
    +923107
    +923123
    +923129
    +923137
    +923141
    +923147
    +923171
    +923177
    +923179
    +923183
    +923201
    +923203
    +923227
    +923233
    +923239
    +923249
    +923309
    +923311
    +923333
    +923341
    +923347
    +923369
    +923371
    +923387
    +923399
    +923407
    +923411
    +923437
    +923441
    +923449
    +923453
    +923467
    +923471
    +923501
    +923509
    +923513
    +923539
    +923543
    +923551
    +923561
    +923567
    +923579
    +923581
    +923591
    +923599
    +923603
    +923617
    +923641
    +923653
    +923687
    +923693
    +923701
    +923711
    +923719
    +923743
    +923773
    +923789
    +923809
    +923833
    +923849
    +923851
    +923861
    +923869
    +923903
    +923917
    +923929
    +923939
    +923947
    +923953
    +923959
    +923963
    +923971
    +923977
    +923983
    +923987
    +924019
    +924023
    +924031
    +924037
    +924041
    +924043
    +924059
    +924073
    +924083
    +924097
    +924101
    +924109
    +924139
    +924151
    +924173
    +924191
    +924197
    +924241
    +924269
    +924281
    +924283
    +924299
    +924323
    +924337
    +924359
    +924361
    +924383
    +924397
    +924401
    +924403
    +924419
    +924421
    +924431
    +924437
    +924463
    +924493
    +924499
    +924503
    +924523
    +924527
    +924529
    +924551
    +924557
    +924601
    +924617
    +924641
    +924643
    +924659
    +924661
    +924683
    +924697
    +924709
    +924713
    +924719
    +924727
    +924731
    +924743
    +924751
    +924757
    +924769
    +924773
    +924779
    +924793
    +924809
    +924811
    +924827
    +924829
    +924841
    +924871
    +924877
    +924881
    +924907
    +924929
    +924961
    +924967
    +924997
    +925019
    +925027
    +925033
    +925039
    +925051
    +925063
    +925073
    +925079
    +925081
    +925087
    +925097
    +925103
    +925109
    +925117
    +925121
    +925147
    +925153
    +925159
    +925163
    +925181
    +925189
    +925193
    +925217
    +925237
    +925241
    +925271
    +925273
    +925279
    +925291
    +925307
    +925339
    +925349
    +925369
    +925373
    +925387
    +925391
    +925399
    +925409
    +925423
    +925447
    +925469
    +925487
    +925499
    +925501
    +925513
    +925517
    +925523
    +925559
    +925577
    +925579
    +925597
    +925607
    +925619
    +925621
    +925637
    +925649
    +925663
    +925669
    +925679
    +925697
    +925721
    +925733
    +925741
    +925783
    +925789
    +925823
    +925831
    +925843
    +925849
    +925891
    +925901
    +925913
    +925921
    +925937
    +925943
    +925949
    +925961
    +925979
    +925987
    +925997
    +926017
    +926027
    +926033
    +926077
    +926087
    +926089
    +926099
    +926111
    +926113
    +926129
    +926131
    +926153
    +926161
    +926171
    +926179
    +926183
    +926203
    +926227
    +926239
    +926251
    +926273
    +926293
    +926309
    +926327
    +926351
    +926353
    +926357
    +926377
    +926389
    +926399
    +926411
    +926423
    +926437
    +926461
    +926467
    +926489
    +926503
    +926507
    +926533
    +926537
    +926557
    +926561
    +926567
    +926581
    +926587
    +926617
    +926623
    +926633
    +926657
    +926659
    +926669
    +926671
    +926689
    +926701
    +926707
    +926741
    +926747
    +926767
    +926777
    +926797
    +926803
    +926819
    +926843
    +926851
    +926867
    +926879
    +926899
    +926903
    +926921
    +926957
    +926963
    +926971
    +926977
    +926983
    +927001
    +927007
    +927013
    +927049
    +927077
    +927083
    +927089
    +927097
    +927137
    +927149
    +927161
    +927167
    +927187
    +927191
    +927229
    +927233
    +927259
    +927287
    +927301
    +927313
    +927317
    +927323
    +927361
    +927373
    +927397
    +927403
    +927431
    +927439
    +927491
    +927497
    +927517
    +927529
    +927533
    +927541
    +927557
    +927569
    +927587
    +927629
    +927631
    +927643
    +927649
    +927653
    +927671
    +927677
    +927683
    +927709
    +927727
    +927743
    +927763
    +927769
    +927779
    +927791
    +927803
    +927821
    +927833
    +927841
    +927847
    +927853
    +927863
    +927869
    +927961
    +927967
    +927973
    +928001
    +928043
    +928051
    +928063
    +928079
    +928097
    +928099
    +928111
    +928139
    +928141
    +928153
    +928157
    +928159
    +928163
    +928177
    +928223
    +928231
    +928253
    +928267
    +928271
    +928273
    +928289
    +928307
    +928313
    +928331
    +928337
    +928351
    +928399
    +928409
    +928423
    +928427
    +928429
    +928453
    +928457
    +928463
    +928469
    +928471
    +928513
    +928547
    +928559
    +928561
    +928597
    +928607
    +928619
    +928621
    +928637
    +928643
    +928649
    +928651
    +928661
    +928679
    +928699
    +928703
    +928769
    +928771
    +928787
    +928793
    +928799
    +928813
    +928817
    +928819
    +928849
    +928859
    +928871
    +928883
    +928903
    +928913
    +928927
    +928933
    +928979
    +929003
    +929009
    +929011
    +929023
    +929029
    +929051
    +929057
    +929059
    +929063
    +929069
    +929077
    +929083
    +929087
    +929113
    +929129
    +929141
    +929153
    +929161
    +929171
    +929197
    +929207
    +929209
    +929239
    +929251
    +929261
    +929281
    +929293
    +929303
    +929311
    +929323
    +929333
    +929381
    +929389
    +929393
    +929399
    +929417
    +929419
    +929431
    +929459
    +929483
    +929497
    +929501
    +929507
    +929527
    +929549
    +929557
    +929561
    +929573
    +929581
    +929587
    +929609
    +929623
    +929627
    +929629
    +929639
    +929641
    +929647
    +929671
    +929693
    +929717
    +929737
    +929741
    +929743
    +929749
    +929777
    +929791
    +929807
    +929809
    +929813
    +929843
    +929861
    +929869
    +929881
    +929891
    +929897
    +929941
    +929953
    +929963
    +929977
    +929983
    +930011
    +930043
    +930071
    +930073
    +930077
    +930079
    +930089
    +930101
    +930113
    +930119
    +930157
    +930173
    +930179
    +930187
    +930191
    +930197
    +930199
    +930211
    +930229
    +930269
    +930277
    +930283
    +930287
    +930289
    +930301
    +930323
    +930337
    +930379
    +930389
    +930409
    +930437
    +930467
    +930469
    +930481
    +930491
    +930499
    +930509
    +930547
    +930551
    +930569
    +930571
    +930583
    +930593
    +930617
    +930619
    +930637
    +930653
    +930667
    +930689
    +930707
    +930719
    +930737
    +930749
    +930763
    +930773
    +930779
    +930817
    +930827
    +930841
    +930847
    +930859
    +930863
    +930889
    +930911
    +930931
    +930973
    +930977
    +930989
    +930991
    +931003
    +931013
    +931067
    +931087
    +931097
    +931123
    +931127
    +931129
    +931153
    +931163
    +931169
    +931181
    +931193
    +931199
    +931213
    +931237
    +931241
    +931267
    +931289
    +931303
    +931309
    +931313
    +931319
    +931351
    +931363
    +931387
    +931417
    +931421
    +931487
    +931499
    +931517
    +931529
    +931537
    +931543
    +931571
    +931573
    +931577
    +931597
    +931621
    +931639
    +931657
    +931691
    +931709
    +931727
    +931729
    +931739
    +931747
    +931751
    +931757
    +931781
    +931783
    +931789
    +931811
    +931837
    +931849
    +931859
    +931873
    +931877
    +931883
    +931901
    +931907
    +931913
    +931921
    +931933
    +931943
    +931949
    +931967
    +931981
    +931999
    +932003
    +932021
    +932039
    +932051
    +932081
    +932101
    +932117
    +932119
    +932131
    +932149
    +932153
    +932177
    +932189
    +932203
    +932207
    +932209
    +932219
    +932221
    +932227
    +932231
    +932257
    +932303
    +932317
    +932333
    +932341
    +932353
    +932357
    +932413
    +932417
    +932419
    +932431
    +932441
    +932447
    +932471
    +932473
    +932483
    +932497
    +932513
    +932521
    +932537
    +932549
    +932557
    +932563
    +932567
    +932579
    +932587
    +932593
    +932597
    +932609
    +932647
    +932651
    +932663
    +932677
    +932681
    +932683
    +932749
    +932761
    +932779
    +932783
    +932801
    +932803
    +932819
    +932839
    +932863
    +932879
    +932887
    +932917
    +932923
    +932927
    +932941
    +932947
    +932951
    +932963
    +932969
    +932983
    +932999
    +933001
    +933019
    +933047
    +933059
    +933061
    +933067
    +933073
    +933151
    +933157
    +933173
    +933199
    +933209
    +933217
    +933221
    +933241
    +933259
    +933263
    +933269
    +933293
    +933301
    +933313
    +933319
    +933329
    +933349
    +933389
    +933397
    +933403
    +933407
    +933421
    +933433
    +933463
    +933479
    +933497
    +933523
    +933551
    +933553
    +933563
    +933601
    +933607
    +933613
    +933643
    +933649
    +933671
    +933677
    +933703
    +933707
    +933739
    +933761
    +933781
    +933787
    +933797
    +933809
    +933811
    +933817
    +933839
    +933847
    +933851
    +933853
    +933883
    +933893
    +933923
    +933931
    +933943
    +933949
    +933953
    +933967
    +933973
    +933979
    +934001
    +934009
    +934033
    +934039
    +934049
    +934051
    +934057
    +934067
    +934069
    +934079
    +934111
    +934117
    +934121
    +934127
    +934151
    +934159
    +934187
    +934223
    +934229
    +934243
    +934253
    +934259
    +934277
    +934291
    +934301
    +934319
    +934343
    +934387
    +934393
    +934399
    +934403
    +934429
    +934441
    +934463
    +934469
    +934481
    +934487
    +934489
    +934499
    +934517
    +934523
    +934537
    +934543
    +934547
    +934561
    +934567
    +934579
    +934597
    +934603
    +934607
    +934613
    +934639
    +934669
    +934673
    +934693
    +934721
    +934723
    +934733
    +934753
    +934763
    +934771
    +934793
    +934799
    +934811
    +934831
    +934837
    +934853
    +934861
    +934883
    +934889
    +934891
    +934897
    +934907
    +934909
    +934919
    +934939
    +934943
    +934951
    +934961
    +934979
    +934981
    +935003
    +935021
    +935023
    +935059
    +935063
    +935071
    +935093
    +935107
    +935113
    +935147
    +935149
    +935167
    +935183
    +935189
    +935197
    +935201
    +935213
    +935243
    +935257
    +935261
    +935303
    +935339
    +935353
    +935359
    +935377
    +935381
    +935393
    +935399
    +935413
    +935423
    +935443
    +935447
    +935461
    +935489
    +935507
    +935513
    +935531
    +935537
    +935581
    +935587
    +935591
    +935593
    +935603
    +935621
    +935639
    +935651
    +935653
    +935677
    +935687
    +935689
    +935699
    +935707
    +935717
    +935719
    +935761
    +935771
    +935777
    +935791
    +935813
    +935819
    +935827
    +935839
    +935843
    +935861
    +935899
    +935903
    +935971
    +935999
    +936007
    +936029
    +936053
    +936097
    +936113
    +936119
    +936127
    +936151
    +936161
    +936179
    +936181
    +936197
    +936203
    +936223
    +936227
    +936233
    +936253
    +936259
    +936281
    +936283
    +936311
    +936319
    +936329
    +936361
    +936379
    +936391
    +936401
    +936407
    +936413
    +936437
    +936451
    +936469
    +936487
    +936493
    +936499
    +936511
    +936521
    +936527
    +936539
    +936557
    +936577
    +936587
    +936599
    +936619
    +936647
    +936659
    +936667
    +936673
    +936679
    +936697
    +936709
    +936713
    +936731
    +936737
    +936739
    +936769
    +936773
    +936779
    +936797
    +936811
    +936827
    +936869
    +936889
    +936907
    +936911
    +936917
    +936919
    +936937
    +936941
    +936953
    +936967
    +937003
    +937007
    +937009
    +937031
    +937033
    +937049
    +937067
    +937121
    +937127
    +937147
    +937151
    +937171
    +937187
    +937207
    +937229
    +937231
    +937241
    +937243
    +937253
    +937331
    +937337
    +937351
    +937373
    +937379
    +937421
    +937429
    +937459
    +937463
    +937477
    +937481
    +937501
    +937511
    +937537
    +937571
    +937577
    +937589
    +937591
    +937613
    +937627
    +937633
    +937637
    +937639
    +937661
    +937663
    +937667
    +937679
    +937681
    +937693
    +937709
    +937721
    +937747
    +937751
    +937777
    +937789
    +937801
    +937813
    +937819
    +937823
    +937841
    +937847
    +937877
    +937883
    +937891
    +937901
    +937903
    +937919
    +937927
    +937943
    +937949
    +937969
    +937991
    +938017
    +938023
    +938027
    +938033
    +938051
    +938053
    +938057
    +938059
    +938071
    +938083
    +938089
    +938099
    +938107
    +938117
    +938129
    +938183
    +938207
    +938219
    +938233
    +938243
    +938251
    +938257
    +938263
    +938279
    +938293
    +938309
    +938323
    +938341
    +938347
    +938351
    +938359
    +938369
    +938387
    +938393
    +938437
    +938447
    +938453
    +938459
    +938491
    +938507
    +938533
    +938537
    +938563
    +938569
    +938573
    +938591
    +938611
    +938617
    +938659
    +938677
    +938681
    +938713
    +938747
    +938761
    +938803
    +938807
    +938827
    +938831
    +938843
    +938857
    +938869
    +938879
    +938881
    +938921
    +938939
    +938947
    +938953
    +938963
    +938969
    +938981
    +938983
    +938989
    +939007
    +939011
    +939019
    +939061
    +939089
    +939091
    +939109
    +939119
    +939121
    +939157
    +939167
    +939179
    +939181
    +939193
    +939203
    +939229
    +939247
    +939287
    +939293
    +939299
    +939317
    +939347
    +939349
    +939359
    +939361
    +939373
    +939377
    +939391
    +939413
    +939431
    +939439
    +939443
    +939451
    +939469
    +939487
    +939511
    +939551
    +939581
    +939599
    +939611
    +939613
    +939623
    +939649
    +939661
    +939677
    +939707
    +939713
    +939737
    +939739
    +939749
    +939767
    +939769
    +939773
    +939791
    +939793
    +939823
    +939839
    +939847
    +939853
    +939871
    +939881
    +939901
    +939923
    +939931
    +939971
    +939973
    +939989
    +939997
    +940001
    +940003
    +940019
    +940031
    +940067
    +940073
    +940087
    +940097
    +940127
    +940157
    +940169
    +940183
    +940189
    +940201
    +940223
    +940229
    +940241
    +940249
    +940259
    +940271
    +940279
    +940297
    +940301
    +940319
    +940327
    +940349
    +940351
    +940361
    +940369
    +940399
    +940403
    +940421
    +940469
    +940477
    +940483
    +940501
    +940523
    +940529
    +940531
    +940543
    +940547
    +940549
    +940553
    +940573
    +940607
    +940619
    +940649
    +940669
    +940691
    +940703
    +940721
    +940727
    +940733
    +940739
    +940759
    +940781
    +940783
    +940787
    +940801
    +940813
    +940817
    +940829
    +940853
    +940871
    +940879
    +940889
    +940903
    +940913
    +940921
    +940931
    +940949
    +940957
    +940981
    +940993
    +941009
    +941011
    +941023
    +941027
    +941041
    +941093
    +941099
    +941117
    +941119
    +941123
    +941131
    +941153
    +941159
    +941167
    +941179
    +941201
    +941207
    +941209
    +941221
    +941249
    +941251
    +941263
    +941267
    +941299
    +941309
    +941323
    +941329
    +941351
    +941359
    +941383
    +941407
    +941429
    +941441
    +941449
    +941453
    +941461
    +941467
    +941471
    +941489
    +941491
    +941503
    +941509
    +941513
    +941519
    +941537
    +941557
    +941561
    +941573
    +941593
    +941599
    +941609
    +941617
    +941641
    +941653
    +941663
    +941669
    +941671
    +941683
    +941701
    +941723
    +941737
    +941741
    +941747
    +941753
    +941771
    +941791
    +941813
    +941839
    +941861
    +941879
    +941903
    +941911
    +941929
    +941933
    +941947
    +941971
    +941981
    +941989
    +941999
    +942013
    +942017
    +942031
    +942037
    +942041
    +942043
    +942049
    +942061
    +942079
    +942091
    +942101
    +942113
    +942143
    +942163
    +942167
    +942169
    +942187
    +942199
    +942217
    +942223
    +942247
    +942257
    +942269
    +942301
    +942311
    +942313
    +942317
    +942341
    +942367
    +942371
    +942401
    +942433
    +942437
    +942439
    +942449
    +942479
    +942509
    +942521
    +942527
    +942541
    +942569
    +942577
    +942583
    +942593
    +942607
    +942637
    +942653
    +942659
    +942661
    +942691
    +942709
    +942719
    +942727
    +942749
    +942763
    +942779
    +942787
    +942811
    +942827
    +942847
    +942853
    +942857
    +942859
    +942869
    +942883
    +942889
    +942899
    +942901
    +942917
    +942943
    +942979
    +942983
    +943003
    +943009
    +943013
    +943031
    +943043
    +943057
    +943073
    +943079
    +943081
    +943091
    +943097
    +943127
    +943139
    +943153
    +943157
    +943183
    +943199
    +943213
    +943219
    +943231
    +943249
    +943273
    +943277
    +943289
    +943301
    +943303
    +943307
    +943321
    +943343
    +943357
    +943363
    +943367
    +943373
    +943387
    +943403
    +943409
    +943421
    +943429
    +943471
    +943477
    +943499
    +943511
    +943541
    +943543
    +943567
    +943571
    +943589
    +943601
    +943603
    +943637
    +943651
    +943693
    +943699
    +943729
    +943741
    +943751
    +943757
    +943763
    +943769
    +943777
    +943781
    +943783
    +943799
    +943801
    +943819
    +943837
    +943841
    +943843
    +943849
    +943871
    +943903
    +943909
    +943913
    +943931
    +943951
    +943967
    +944003
    +944017
    +944029
    +944039
    +944071
    +944077
    +944123
    +944137
    +944143
    +944147
    +944149
    +944161
    +944179
    +944191
    +944233
    +944239
    +944257
    +944261
    +944263
    +944297
    +944309
    +944329
    +944369
    +944387
    +944389
    +944393
    +944399
    +944417
    +944429
    +944431
    +944453
    +944467
    +944473
    +944491
    +944497
    +944519
    +944521
    +944527
    +944533
    +944543
    +944551
    +944561
    +944563
    +944579
    +944591
    +944609
    +944621
    +944651
    +944659
    +944677
    +944687
    +944689
    +944701
    +944711
    +944717
    +944729
    +944731
    +944773
    +944777
    +944803
    +944821
    +944833
    +944857
    +944873
    +944887
    +944893
    +944897
    +944899
    +944929
    +944953
    +944963
    +944969
    +944987
    +945031
    +945037
    +945059
    +945089
    +945103
    +945143
    +945151
    +945179
    +945209
    +945211
    +945227
    +945233
    +945289
    +945293
    +945331
    +945341
    +945349
    +945359
    +945367
    +945377
    +945389
    +945391
    +945397
    +945409
    +945431
    +945457
    +945463
    +945473
    +945479
    +945481
    +945521
    +945547
    +945577
    +945587
    +945589
    +945601
    +945629
    +945631
    +945647
    +945671
    +945673
    +945677
    +945701
    +945731
    +945733
    +945739
    +945767
    +945787
    +945799
    +945809
    +945811
    +945817
    +945823
    +945851
    +945881
    +945883
    +945887
    +945899
    +945907
    +945929
    +945937
    +945941
    +945943
    +945949
    +945961
    +945983
    +946003
    +946021
    +946031
    +946037
    +946079
    +946081
    +946091
    +946093
    +946109
    +946111
    +946123
    +946133
    +946163
    +946177
    +946193
    +946207
    +946223
    +946249
    +946273
    +946291
    +946307
    +946327
    +946331
    +946367
    +946369
    +946391
    +946397
    +946411
    +946417
    +946453
    +946459
    +946469
    +946487
    +946489
    +946507
    +946511
    +946513
    +946549
    +946573
    +946579
    +946607
    +946661
    +946663
    +946667
    +946669
    +946681
    +946697
    +946717
    +946727
    +946733
    +946741
    +946753
    +946769
    +946783
    +946801
    +946819
    +946823
    +946853
    +946859
    +946861
    +946873
    +946877
    +946901
    +946919
    +946931
    +946943
    +946949
    +946961
    +946969
    +946987
    +946993
    +946997
    +947027
    +947033
    +947083
    +947119
    +947129
    +947137
    +947171
    +947183
    +947197
    +947203
    +947239
    +947263
    +947299
    +947327
    +947341
    +947351
    +947357
    +947369
    +947377
    +947381
    +947383
    +947389
    +947407
    +947411
    +947413
    +947417
    +947423
    +947431
    +947449
    +947483
    +947501
    +947509
    +947539
    +947561
    +947579
    +947603
    +947621
    +947627
    +947641
    +947647
    +947651
    +947659
    +947707
    +947711
    +947719
    +947729
    +947741
    +947743
    +947747
    +947753
    +947773
    +947783
    +947803
    +947819
    +947833
    +947851
    +947857
    +947861
    +947873
    +947893
    +947911
    +947917
    +947927
    +947959
    +947963
    +947987
    +948007
    +948019
    +948029
    +948041
    +948049
    +948053
    +948061
    +948067
    +948089
    +948091
    +948133
    +948139
    +948149
    +948151
    +948169
    +948173
    +948187
    +948247
    +948253
    +948263
    +948281
    +948287
    +948293
    +948317
    +948331
    +948349
    +948377
    +948391
    +948401
    +948403
    +948407
    +948427
    +948439
    +948443
    +948449
    +948457
    +948469
    +948487
    +948517
    +948533
    +948547
    +948551
    +948557
    +948581
    +948593
    +948659
    +948671
    +948707
    +948713
    +948721
    +948749
    +948767
    +948797
    +948799
    +948839
    +948847
    +948853
    +948877
    +948887
    +948901
    +948907
    +948929
    +948943
    +948947
    +948971
    +948973
    +948989
    +949001
    +949019
    +949021
    +949033
    +949037
    +949043
    +949051
    +949111
    +949121
    +949129
    +949147
    +949153
    +949159
    +949171
    +949211
    +949213
    +949241
    +949243
    +949253
    +949261
    +949303
    +949307
    +949381
    +949387
    +949391
    +949409
    +949423
    +949427
    +949439
    +949441
    +949451
    +949453
    +949471
    +949477
    +949513
    +949517
    +949523
    +949567
    +949583
    +949589
    +949607
    +949609
    +949621
    +949631
    +949633
    +949643
    +949649
    +949651
    +949667
    +949673
    +949687
    +949691
    +949699
    +949733
    +949759
    +949771
    +949777
    +949789
    +949811
    +949849
    +949853
    +949889
    +949891
    +949903
    +949931
    +949937
    +949939
    +949951
    +949957
    +949961
    +949967
    +949973
    +949979
    +949987
    +949997
    +950009
    +950023
    +950029
    +950039
    +950041
    +950071
    +950083
    +950099
    +950111
    +950149
    +950161
    +950177
    +950179
    +950207
    +950221
    +950227
    +950231
    +950233
    +950239
    +950251
    +950269
    +950281
    +950329
    +950333
    +950347
    +950357
    +950363
    +950393
    +950401
    +950423
    +950447
    +950459
    +950461
    +950473
    +950479
    +950483
    +950497
    +950501
    +950507
    +950519
    +950527
    +950531
    +950557
    +950569
    +950611
    +950617
    +950633
    +950639
    +950647
    +950671
    +950681
    +950689
    +950693
    +950699
    +950717
    +950723
    +950737
    +950743
    +950753
    +950783
    +950791
    +950809
    +950813
    +950819
    +950837
    +950839
    +950867
    +950869
    +950879
    +950921
    +950927
    +950933
    +950947
    +950953
    +950959
    +950993
    +951001
    +951019
    +951023
    +951029
    +951047
    +951053
    +951059
    +951061
    +951079
    +951089
    +951091
    +951101
    +951107
    +951109
    +951131
    +951151
    +951161
    +951193
    +951221
    +951259
    +951277
    +951281
    +951283
    +951299
    +951331
    +951341
    +951343
    +951361
    +951367
    +951373
    +951389
    +951407
    +951413
    +951427
    +951437
    +951449
    +951469
    +951479
    +951491
    +951497
    +951553
    +951557
    +951571
    +951581
    +951583
    +951589
    +951623
    +951637
    +951641
    +951647
    +951649
    +951659
    +951689
    +951697
    +951749
    +951781
    +951787
    +951791
    +951803
    +951829
    +951851
    +951859
    +951887
    +951893
    +951911
    +951941
    +951943
    +951959
    +951967
    +951997
    +952001
    +952009
    +952037
    +952057
    +952073
    +952087
    +952097
    +952111
    +952117
    +952123
    +952129
    +952141
    +952151
    +952163
    +952169
    +952183
    +952199
    +952207
    +952219
    +952229
    +952247
    +952253
    +952277
    +952279
    +952291
    +952297
    +952313
    +952349
    +952363
    +952379
    +952381
    +952397
    +952423
    +952429
    +952439
    +952481
    +952487
    +952507
    +952513
    +952541
    +952547
    +952559
    +952573
    +952583
    +952597
    +952619
    +952649
    +952657
    +952667
    +952669
    +952681
    +952687
    +952691
    +952709
    +952739
    +952741
    +952753
    +952771
    +952789
    +952811
    +952813
    +952823
    +952829
    +952843
    +952859
    +952873
    +952877
    +952883
    +952921
    +952927
    +952933
    +952937
    +952943
    +952957
    +952967
    +952979
    +952981
    +952997
    +953023
    +953039
    +953041
    +953053
    +953077
    +953081
    +953093
    +953111
    +953131
    +953149
    +953171
    +953179
    +953191
    +953221
    +953237
    +953243
    +953261
    +953273
    +953297
    +953321
    +953333
    +953341
    +953347
    +953399
    +953431
    +953437
    +953443
    +953473
    +953483
    +953497
    +953501
    +953503
    +953507
    +953521
    +953539
    +953543
    +953551
    +953567
    +953593
    +953621
    +953639
    +953647
    +953651
    +953671
    +953681
    +953699
    +953707
    +953731
    +953747
    +953773
    +953789
    +953791
    +953831
    +953851
    +953861
    +953873
    +953881
    +953917
    +953923
    +953929
    +953941
    +953969
    +953977
    +953983
    +953987
    +954001
    +954007
    +954011
    +954043
    +954067
    +954097
    +954103
    +954131
    +954133
    +954139
    +954157
    +954167
    +954181
    +954203
    +954209
    +954221
    +954229
    +954253
    +954257
    +954259
    +954263
    +954269
    +954277
    +954287
    +954307
    +954319
    +954323
    +954367
    +954377
    +954379
    +954391
    +954409
    +954433
    +954451
    +954461
    +954469
    +954491
    +954497
    +954509
    +954517
    +954539
    +954571
    +954599
    +954619
    +954623
    +954641
    +954649
    +954671
    +954677
    +954697
    +954713
    +954719
    +954727
    +954743
    +954757
    +954763
    +954827
    +954829
    +954847
    +954851
    +954853
    +954857
    +954869
    +954871
    +954911
    +954917
    +954923
    +954929
    +954971
    +954973
    +954977
    +954979
    +954991
    +955037
    +955039
    +955051
    +955061
    +955063
    +955091
    +955093
    +955103
    +955127
    +955139
    +955147
    +955153
    +955183
    +955193
    +955211
    +955217
    +955223
    +955243
    +955261
    +955267
    +955271
    +955277
    +955307
    +955309
    +955313
    +955319
    +955333
    +955337
    +955363
    +955379
    +955391
    +955433
    +955439
    +955441
    +955457
    +955469
    +955477
    +955481
    +955483
    +955501
    +955511
    +955541
    +955601
    +955607
    +955613
    +955649
    +955657
    +955693
    +955697
    +955709
    +955711
    +955727
    +955729
    +955769
    +955777
    +955781
    +955793
    +955807
    +955813
    +955819
    +955841
    +955853
    +955879
    +955883
    +955891
    +955901
    +955919
    +955937
    +955939
    +955951
    +955957
    +955963
    +955967
    +955987
    +955991
    +955993
    +956003
    +956051
    +956057
    +956083
    +956107
    +956113
    +956119
    +956143
    +956147
    +956177
    +956231
    +956237
    +956261
    +956269
    +956273
    +956281
    +956303
    +956311
    +956341
    +956353
    +956357
    +956377
    +956383
    +956387
    +956393
    +956399
    +956401
    +956429
    +956477
    +956503
    +956513
    +956521
    +956569
    +956587
    +956617
    +956633
    +956689
    +956699
    +956713
    +956723
    +956749
    +956759
    +956789
    +956801
    +956831
    +956843
    +956849
    +956861
    +956881
    +956903
    +956909
    +956929
    +956941
    +956951
    +956953
    +956987
    +956993
    +956999
    +957031
    +957037
    +957041
    +957043
    +957059
    +957071
    +957091
    +957097
    +957107
    +957109
    +957119
    +957133
    +957139
    +957161
    +957169
    +957181
    +957193
    +957211
    +957221
    +957241
    +957247
    +957263
    +957289
    +957317
    +957331
    +957337
    +957349
    +957361
    +957403
    +957409
    +957413
    +957419
    +957431
    +957433
    +957499
    +957529
    +957547
    +957553
    +957557
    +957563
    +957587
    +957599
    +957601
    +957611
    +957641
    +957643
    +957659
    +957701
    +957703
    +957709
    +957721
    +957731
    +957751
    +957769
    +957773
    +957811
    +957821
    +957823
    +957851
    +957871
    +957877
    +957889
    +957917
    +957937
    +957949
    +957953
    +957959
    +957977
    +957991
    +958007
    +958021
    +958039
    +958043
    +958049
    +958051
    +958057
    +958063
    +958121
    +958123
    +958141
    +958159
    +958163
    +958183
    +958193
    +958213
    +958259
    +958261
    +958289
    +958313
    +958319
    +958327
    +958333
    +958339
    +958343
    +958351
    +958357
    +958361
    +958367
    +958369
    +958381
    +958393
    +958423
    +958439
    +958459
    +958481
    +958487
    +958499
    +958501
    +958519
    +958523
    +958541
    +958543
    +958547
    +958549
    +958553
    +958577
    +958609
    +958627
    +958637
    +958667
    +958669
    +958673
    +958679
    +958687
    +958693
    +958729
    +958739
    +958777
    +958787
    +958807
    +958819
    +958829
    +958843
    +958849
    +958871
    +958877
    +958883
    +958897
    +958901
    +958921
    +958931
    +958933
    +958957
    +958963
    +958967
    +958973
    +959009
    +959083
    +959093
    +959099
    +959131
    +959143
    +959149
    +959159
    +959173
    +959183
    +959207
    +959209
    +959219
    +959227
    +959237
    +959263
    +959267
    +959269
    +959279
    +959323
    +959333
    +959339
    +959351
    +959363
    +959369
    +959377
    +959383
    +959389
    +959449
    +959461
    +959467
    +959471
    +959473
    +959477
    +959479
    +959489
    +959533
    +959561
    +959579
    +959597
    +959603
    +959617
    +959627
    +959659
    +959677
    +959681
    +959689
    +959719
    +959723
    +959737
    +959759
    +959773
    +959779
    +959801
    +959809
    +959831
    +959863
    +959867
    +959869
    +959873
    +959879
    +959887
    +959911
    +959921
    +959927
    +959941
    +959947
    +959953
    +959969
    +960017
    +960019
    +960031
    +960049
    +960053
    +960059
    +960077
    +960119
    +960121
    +960131
    +960137
    +960139
    +960151
    +960173
    +960191
    +960199
    +960217
    +960229
    +960251
    +960259
    +960293
    +960299
    +960329
    +960331
    +960341
    +960353
    +960373
    +960383
    +960389
    +960419
    +960467
    +960493
    +960497
    +960499
    +960521
    +960523
    +960527
    +960569
    +960581
    +960587
    +960593
    +960601
    +960637
    +960643
    +960647
    +960649
    +960667
    +960677
    +960691
    +960703
    +960709
    +960737
    +960763
    +960793
    +960803
    +960809
    +960829
    +960833
    +960863
    +960889
    +960931
    +960937
    +960941
    +960961
    +960977
    +960983
    +960989
    +960991
    +961003
    +961021
    +961033
    +961063
    +961067
    +961069
    +961073
    +961087
    +961091
    +961097
    +961099
    +961109
    +961117
    +961123
    +961133
    +961139
    +961141
    +961151
    +961157
    +961159
    +961183
    +961187
    +961189
    +961201
    +961241
    +961243
    +961273
    +961277
    +961283
    +961313
    +961319
    +961339
    +961393
    +961397
    +961399
    +961427
    +961447
    +961451
    +961453
    +961459
    +961487
    +961507
    +961511
    +961529
    +961531
    +961547
    +961549
    +961567
    +961601
    +961613
    +961619
    +961627
    +961633
    +961637
    +961643
    +961657
    +961661
    +961663
    +961679
    +961687
    +961691
    +961703
    +961729
    +961733
    +961739
    +961747
    +961757
    +961769
    +961777
    +961783
    +961789
    +961811
    +961813
    +961817
    +961841
    +961847
    +961853
    +961861
    +961871
    +961879
    +961927
    +961937
    +961943
    +961957
    +961973
    +961981
    +961991
    +961993
    +962009
    +962011
    +962033
    +962041
    +962051
    +962063
    +962077
    +962099
    +962119
    +962131
    +962161
    +962177
    +962197
    +962233
    +962237
    +962243
    +962257
    +962267
    +962303
    +962309
    +962341
    +962363
    +962413
    +962417
    +962431
    +962441
    +962447
    +962459
    +962461
    +962471
    +962477
    +962497
    +962503
    +962509
    +962537
    +962543
    +962561
    +962569
    +962587
    +962603
    +962609
    +962617
    +962623
    +962627
    +962653
    +962669
    +962671
    +962677
    +962681
    +962683
    +962737
    +962743
    +962747
    +962779
    +962783
    +962789
    +962791
    +962807
    +962837
    +962839
    +962861
    +962867
    +962869
    +962903
    +962909
    +962911
    +962921
    +962959
    +962963
    +962971
    +962993
    +963019
    +963031
    +963043
    +963047
    +963097
    +963103
    +963121
    +963143
    +963163
    +963173
    +963181
    +963187
    +963191
    +963211
    +963223
    +963227
    +963239
    +963241
    +963253
    +963283
    +963299
    +963301
    +963311
    +963323
    +963331
    +963341
    +963343
    +963349
    +963367
    +963379
    +963397
    +963419
    +963427
    +963461
    +963481
    +963491
    +963497
    +963499
    +963559
    +963581
    +963601
    +963607
    +963629
    +963643
    +963653
    +963659
    +963667
    +963689
    +963691
    +963701
    +963707
    +963709
    +963719
    +963731
    +963751
    +963761
    +963763
    +963779
    +963793
    +963799
    +963811
    +963817
    +963839
    +963841
    +963847
    +963863
    +963871
    +963877
    +963899
    +963901
    +963913
    +963943
    +963973
    +963979
    +964009
    +964021
    +964027
    +964039
    +964049
    +964081
    +964097
    +964133
    +964151
    +964153
    +964199
    +964207
    +964213
    +964217
    +964219
    +964253
    +964259
    +964261
    +964267
    +964283
    +964289
    +964297
    +964303
    +964309
    +964333
    +964339
    +964351
    +964357
    +964363
    +964373
    +964417
    +964423
    +964433
    +964463
    +964499
    +964501
    +964507
    +964517
    +964519
    +964531
    +964559
    +964571
    +964577
    +964583
    +964589
    +964609
    +964637
    +964661
    +964679
    +964693
    +964697
    +964703
    +964721
    +964753
    +964757
    +964783
    +964787
    +964793
    +964823
    +964829
    +964861
    +964871
    +964879
    +964883
    +964889
    +964897
    +964913
    +964927
    +964933
    +964939
    +964967
    +964969
    +964973
    +964981
    +965023
    +965047
    +965059
    +965087
    +965089
    +965101
    +965113
    +965117
    +965131
    +965147
    +965161
    +965171
    +965177
    +965179
    +965189
    +965191
    +965197
    +965201
    +965227
    +965233
    +965249
    +965267
    +965291
    +965303
    +965317
    +965329
    +965357
    +965369
    +965399
    +965401
    +965407
    +965411
    +965423
    +965429
    +965443
    +965453
    +965467
    +965483
    +965491
    +965507
    +965519
    +965533
    +965551
    +965567
    +965603
    +965611
    +965621
    +965623
    +965639
    +965647
    +965659
    +965677
    +965711
    +965749
    +965759
    +965773
    +965777
    +965779
    +965791
    +965801
    +965843
    +965851
    +965857
    +965893
    +965927
    +965953
    +965963
    +965969
    +965983
    +965989
    +966011
    +966013
    +966029
    +966041
    +966109
    +966113
    +966139
    +966149
    +966157
    +966191
    +966197
    +966209
    +966211
    +966221
    +966227
    +966233
    +966241
    +966257
    +966271
    +966293
    +966307
    +966313
    +966319
    +966323
    +966337
    +966347
    +966353
    +966373
    +966377
    +966379
    +966389
    +966401
    +966409
    +966419
    +966431
    +966439
    +966463
    +966481
    +966491
    +966499
    +966509
    +966521
    +966527
    +966547
    +966557
    +966583
    +966613
    +966617
    +966619
    +966631
    +966653
    +966659
    +966661
    +966677
    +966727
    +966751
    +966781
    +966803
    +966817
    +966863
    +966869
    +966871
    +966883
    +966893
    +966907
    +966913
    +966919
    +966923
    +966937
    +966961
    +966971
    +966991
    +966997
    +967003
    +967019
    +967049
    +967061
    +967111
    +967129
    +967139
    +967171
    +967201
    +967229
    +967259
    +967261
    +967289
    +967297
    +967319
    +967321
    +967327
    +967333
    +967349
    +967361
    +967363
    +967391
    +967397
    +967427
    +967429
    +967441
    +967451
    +967459
    +967481
    +967493
    +967501
    +967507
    +967511
    +967529
    +967567
    +967583
    +967607
    +967627
    +967663
    +967667
    +967693
    +967699
    +967709
    +967721
    +967739
    +967751
    +967753
    +967763
    +967781
    +967787
    +967819
    +967823
    +967831
    +967843
    +967847
    +967859
    +967873
    +967877
    +967903
    +967919
    +967931
    +967937
    +967951
    +967961
    +967979
    +967999
    +968003
    +968017
    +968021
    +968027
    +968041
    +968063
    +968089
    +968101
    +968111
    +968113
    +968117
    +968137
    +968141
    +968147
    +968159
    +968173
    +968197
    +968213
    +968237
    +968239
    +968251
    +968263
    +968267
    +968273
    +968291
    +968299
    +968311
    +968321
    +968329
    +968333
    +968353
    +968377
    +968381
    +968389
    +968419
    +968423
    +968431
    +968437
    +968459
    +968467
    +968479
    +968501
    +968503
    +968519
    +968521
    +968537
    +968557
    +968567
    +968573
    +968593
    +968641
    +968647
    +968659
    +968663
    +968689
    +968699
    +968713
    +968729
    +968731
    +968761
    +968801
    +968809
    +968819
    +968827
    +968831
    +968857
    +968879
    +968897
    +968909
    +968911
    +968917
    +968939
    +968959
    +968963
    +968971
    +969011
    +969037
    +969041
    +969049
    +969071
    +969083
    +969097
    +969109
    +969113
    +969131
    +969139
    +969167
    +969179
    +969181
    +969233
    +969239
    +969253
    +969257
    +969259
    +969271
    +969301
    +969341
    +969343
    +969347
    +969359
    +969377
    +969403
    +969407
    +969421
    +969431
    +969433
    +969443
    +969457
    +969461
    +969467
    +969481
    +969497
    +969503
    +969509
    +969533
    +969559
    +969569
    +969593
    +969599
    +969637
    +969641
    +969667
    +969671
    +969677
    +969679
    +969713
    +969719
    +969721
    +969743
    +969757
    +969763
    +969767
    +969791
    +969797
    +969809
    +969821
    +969851
    +969863
    +969869
    +969877
    +969889
    +969907
    +969911
    +969919
    +969923
    +969929
    +969977
    +969989
    +970027
    +970031
    +970043
    +970051
    +970061
    +970063
    +970069
    +970087
    +970091
    +970111
    +970133
    +970147
    +970201
    +970213
    +970217
    +970219
    +970231
    +970237
    +970247
    +970259
    +970261
    +970267
    +970279
    +970297
    +970303
    +970313
    +970351
    +970391
    +970421
    +970423
    +970433
    +970441
    +970447
    +970457
    +970469
    +970481
    +970493
    +970537
    +970549
    +970561
    +970573
    +970583
    +970603
    +970633
    +970643
    +970657
    +970667
    +970687
    +970699
    +970721
    +970747
    +970777
    +970787
    +970789
    +970793
    +970799
    +970813
    +970817
    +970829
    +970847
    +970859
    +970861
    +970867
    +970877
    +970883
    +970903
    +970909
    +970927
    +970939
    +970943
    +970961
    +970967
    +970969
    +970987
    +970997
    +970999
    +971021
    +971027
    +971029
    +971039
    +971051
    +971053
    +971063
    +971077
    +971093
    +971099
    +971111
    +971141
    +971143
    +971149
    +971153
    +971171
    +971177
    +971197
    +971207
    +971237
    +971251
    +971263
    +971273
    +971279
    +971281
    +971291
    +971309
    +971339
    +971353
    +971357
    +971371
    +971381
    +971387
    +971389
    +971401
    +971419
    +971429
    +971441
    +971473
    +971479
    +971483
    +971491
    +971501
    +971513
    +971521
    +971549
    +971561
    +971563
    +971569
    +971591
    +971639
    +971651
    +971653
    +971683
    +971693
    +971699
    +971713
    +971723
    +971753
    +971759
    +971767
    +971783
    +971821
    +971833
    +971851
    +971857
    +971863
    +971899
    +971903
    +971917
    +971921
    +971933
    +971939
    +971951
    +971959
    +971977
    +971981
    +971989
    +972001
    +972017
    +972029
    +972031
    +972047
    +972071
    +972079
    +972091
    +972113
    +972119
    +972121
    +972131
    +972133
    +972137
    +972161
    +972163
    +972197
    +972199
    +972221
    +972227
    +972229
    +972259
    +972263
    +972271
    +972277
    +972313
    +972319
    +972329
    +972337
    +972343
    +972347
    +972353
    +972373
    +972403
    +972407
    +972409
    +972427
    +972431
    +972443
    +972469
    +972473
    +972481
    +972493
    +972533
    +972557
    +972577
    +972581
    +972599
    +972611
    +972613
    +972623
    +972637
    +972649
    +972661
    +972679
    +972683
    +972701
    +972721
    +972787
    +972793
    +972799
    +972823
    +972827
    +972833
    +972847
    +972869
    +972887
    +972899
    +972901
    +972941
    +972943
    +972967
    +972977
    +972991
    +973001
    +973003
    +973031
    +973033
    +973051
    +973057
    +973067
    +973069
    +973073
    +973081
    +973099
    +973129
    +973151
    +973169
    +973177
    +973187
    +973213
    +973253
    +973277
    +973279
    +973283
    +973289
    +973321
    +973331
    +973333
    +973367
    +973373
    +973387
    +973397
    +973409
    +973411
    +973421
    +973439
    +973459
    +973487
    +973523
    +973529
    +973537
    +973547
    +973561
    +973591
    +973597
    +973631
    +973657
    +973669
    +973681
    +973691
    +973727
    +973757
    +973759
    +973781
    +973787
    +973789
    +973801
    +973813
    +973823
    +973837
    +973853
    +973891
    +973897
    +973901
    +973919
    +973957
    +974003
    +974009
    +974033
    +974041
    +974053
    +974063
    +974089
    +974107
    +974123
    +974137
    +974143
    +974147
    +974159
    +974161
    +974167
    +974177
    +974179
    +974189
    +974213
    +974249
    +974261
    +974269
    +974273
    +974279
    +974293
    +974317
    +974329
    +974359
    +974383
    +974387
    +974401
    +974411
    +974417
    +974419
    +974431
    +974437
    +974443
    +974459
    +974473
    +974489
    +974497
    +974507
    +974513
    +974531
    +974537
    +974539
    +974551
    +974557
    +974563
    +974581
    +974591
    +974599
    +974651
    +974653
    +974657
    +974707
    +974711
    +974713
    +974737
    +974747
    +974749
    +974761
    +974773
    +974803
    +974819
    +974821
    +974837
    +974849
    +974861
    +974863
    +974867
    +974873
    +974879
    +974887
    +974891
    +974923
    +974927
    +974957
    +974959
    +974969
    +974971
    +974977
    +974983
    +974989
    +974999
    +975011
    +975017
    +975049
    +975053
    +975071
    +975083
    +975089
    +975133
    +975151
    +975157
    +975181
    +975187
    +975193
    +975199
    +975217
    +975257
    +975259
    +975263
    +975277
    +975281
    +975287
    +975313
    +975323
    +975343
    +975367
    +975379
    +975383
    +975389
    +975421
    +975427
    +975433
    +975439
    +975463
    +975493
    +975497
    +975509
    +975521
    +975523
    +975551
    +975553
    +975581
    +975599
    +975619
    +975629
    +975643
    +975649
    +975661
    +975671
    +975691
    +975701
    +975731
    +975739
    +975743
    +975797
    +975803
    +975811
    +975823
    +975827
    +975847
    +975857
    +975869
    +975883
    +975899
    +975901
    +975907
    +975941
    +975943
    +975967
    +975977
    +975991
    +976009
    +976013
    +976033
    +976039
    +976091
    +976093
    +976103
    +976109
    +976117
    +976127
    +976147
    +976177
    +976187
    +976193
    +976211
    +976231
    +976253
    +976271
    +976279
    +976301
    +976303
    +976307
    +976309
    +976351
    +976369
    +976403
    +976411
    +976439
    +976447
    +976453
    +976457
    +976471
    +976477
    +976483
    +976489
    +976501
    +976513
    +976537
    +976553
    +976559
    +976561
    +976571
    +976601
    +976607
    +976621
    +976637
    +976639
    +976643
    +976669
    +976699
    +976709
    +976721
    +976727
    +976777
    +976799
    +976817
    +976823
    +976849
    +976853
    +976883
    +976909
    +976919
    +976933
    +976951
    +976957
    +976991
    +977021
    +977023
    +977047
    +977057
    +977069
    +977087
    +977107
    +977147
    +977149
    +977167
    +977183
    +977191
    +977203
    +977209
    +977233
    +977239
    +977243
    +977257
    +977269
    +977299
    +977323
    +977351
    +977357
    +977359
    +977363
    +977369
    +977407
    +977411
    +977413
    +977437
    +977447
    +977507
    +977513
    +977521
    +977539
    +977567
    +977591
    +977593
    +977609
    +977611
    +977629
    +977671
    +977681
    +977693
    +977719
    +977723
    +977747
    +977761
    +977791
    +977803
    +977813
    +977819
    +977831
    +977849
    +977861
    +977881
    +977897
    +977923
    +977927
    +977971
    +978001
    +978007
    +978011
    +978017
    +978031
    +978037
    +978041
    +978049
    +978053
    +978067
    +978071
    +978073
    +978077
    +978079
    +978091
    +978113
    +978149
    +978151
    +978157
    +978179
    +978181
    +978203
    +978209
    +978217
    +978223
    +978233
    +978239
    +978269
    +978277
    +978283
    +978287
    +978323
    +978337
    +978343
    +978347
    +978349
    +978359
    +978389
    +978403
    +978413
    +978427
    +978449
    +978457
    +978463
    +978473
    +978479
    +978491
    +978511
    +978521
    +978541
    +978569
    +978599
    +978611
    +978617
    +978619
    +978643
    +978647
    +978683
    +978689
    +978697
    +978713
    +978727
    +978743
    +978749
    +978773
    +978797
    +978799
    +978821
    +978839
    +978851
    +978853
    +978863
    +978871
    +978883
    +978907
    +978917
    +978931
    +978947
    +978973
    +978997
    +979001
    +979009
    +979031
    +979037
    +979061
    +979063
    +979093
    +979103
    +979109
    +979117
    +979159
    +979163
    +979171
    +979177
    +979189
    +979201
    +979207
    +979211
    +979219
    +979229
    +979261
    +979273
    +979283
    +979291
    +979313
    +979327
    +979333
    +979337
    +979343
    +979361
    +979369
    +979373
    +979379
    +979403
    +979423
    +979439
    +979457
    +979471
    +979481
    +979519
    +979529
    +979541
    +979543
    +979549
    +979553
    +979567
    +979651
    +979691
    +979709
    +979717
    +979747
    +979757
    +979787
    +979807
    +979819
    +979831
    +979873
    +979883
    +979889
    +979907
    +979919
    +979921
    +979949
    +979969
    +979987
    +980027
    +980047
    +980069
    +980071
    +980081
    +980107
    +980117
    +980131
    +980137
    +980149
    +980159
    +980173
    +980179
    +980197
    +980219
    +980249
    +980261
    +980293
    +980299
    +980321
    +980327
    +980363
    +980377
    +980393
    +980401
    +980417
    +980423
    +980431
    +980449
    +980459
    +980471
    +980489
    +980491
    +980503
    +980549
    +980557
    +980579
    +980587
    +980591
    +980593
    +980599
    +980621
    +980641
    +980677
    +980687
    +980689
    +980711
    +980717
    +980719
    +980729
    +980731
    +980773
    +980801
    +980803
    +980827
    +980831
    +980851
    +980887
    +980893
    +980897
    +980899
    +980909
    +980911
    +980921
    +980957
    +980963
    +980999
    +981011
    +981017
    +981023
    +981037
    +981049
    +981061
    +981067
    +981073
    +981077
    +981091
    +981133
    +981137
    +981139
    +981151
    +981173
    +981187
    +981199
    +981209
    +981221
    +981241
    +981263
    +981271
    +981283
    +981287
    +981289
    +981301
    +981311
    +981319
    +981373
    +981377
    +981391
    +981397
    +981419
    +981437
    +981439
    +981443
    +981451
    +981467
    +981473
    +981481
    +981493
    +981517
    +981523
    +981527
    +981569
    +981577
    +981587
    +981599
    +981601
    +981623
    +981637
    +981653
    +981683
    +981691
    +981697
    +981703
    +981707
    +981713
    +981731
    +981769
    +981797
    +981809
    +981811
    +981817
    +981823
    +981887
    +981889
    +981913
    +981919
    +981941
    +981947
    +981949
    +981961
    +981979
    +981983
    +982021
    +982057
    +982061
    +982063
    +982067
    +982087
    +982097
    +982099
    +982103
    +982117
    +982133
    +982147
    +982151
    +982171
    +982183
    +982187
    +982211
    +982213
    +982217
    +982231
    +982271
    +982273
    +982301
    +982321
    +982337
    +982339
    +982343
    +982351
    +982363
    +982381
    +982393
    +982403
    +982453
    +982489
    +982493
    +982559
    +982571
    +982573
    +982577
    +982589
    +982603
    +982613
    +982621
    +982633
    +982643
    +982687
    +982693
    +982697
    +982703
    +982741
    +982759
    +982769
    +982777
    +982783
    +982789
    +982801
    +982819
    +982829
    +982841
    +982843
    +982847
    +982867
    +982871
    +982903
    +982909
    +982931
    +982939
    +982967
    +982973
    +982981
    +983063
    +983069
    +983083
    +983113
    +983119
    +983123
    +983131
    +983141
    +983149
    +983153
    +983173
    +983179
    +983189
    +983197
    +983209
    +983233
    +983239
    +983243
    +983261
    +983267
    +983299
    +983317
    +983327
    +983329
    +983347
    +983363
    +983371
    +983377
    +983407
    +983429
    +983431
    +983441
    +983443
    +983447
    +983449
    +983461
    +983491
    +983513
    +983519
    +983527
    +983531
    +983533
    +983557
    +983579
    +983581
    +983597
    +983617
    +983659
    +983699
    +983701
    +983737
    +983771
    +983777
    +983783
    +983789
    +983791
    +983803
    +983809
    +983813
    +983819
    +983849
    +983861
    +983863
    +983881
    +983911
    +983923
    +983929
    +983951
    +983987
    +983993
    +984007
    +984017
    +984037
    +984047
    +984059
    +984083
    +984091
    +984119
    +984121
    +984127
    +984149
    +984167
    +984199
    +984211
    +984241
    +984253
    +984299
    +984301
    +984307
    +984323
    +984329
    +984337
    +984341
    +984349
    +984353
    +984359
    +984367
    +984383
    +984391
    +984397
    +984407
    +984413
    +984421
    +984427
    +984437
    +984457
    +984461
    +984481
    +984491
    +984497
    +984539
    +984541
    +984563
    +984583
    +984587
    +984593
    +984611
    +984617
    +984667
    +984689
    +984701
    +984703
    +984707
    +984733
    +984749
    +984757
    +984761
    +984817
    +984847
    +984853
    +984859
    +984877
    +984881
    +984911
    +984913
    +984917
    +984923
    +984931
    +984947
    +984959
    +985003
    +985007
    +985013
    +985027
    +985057
    +985063
    +985079
    +985097
    +985109
    +985121
    +985129
    +985151
    +985177
    +985181
    +985213
    +985219
    +985253
    +985277
    +985279
    +985291
    +985301
    +985307
    +985331
    +985339
    +985351
    +985379
    +985399
    +985403
    +985417
    +985433
    +985447
    +985451
    +985463
    +985471
    +985483
    +985487
    +985493
    +985499
    +985519
    +985529
    +985531
    +985547
    +985571
    +985597
    +985601
    +985613
    +985631
    +985639
    +985657
    +985667
    +985679
    +985703
    +985709
    +985723
    +985729
    +985741
    +985759
    +985781
    +985783
    +985799
    +985807
    +985819
    +985867
    +985871
    +985877
    +985903
    +985921
    +985937
    +985951
    +985969
    +985973
    +985979
    +985981
    +985991
    +985993
    +985997
    +986023
    +986047
    +986053
    +986071
    +986101
    +986113
    +986131
    +986137
    +986143
    +986147
    +986149
    +986177
    +986189
    +986191
    +986197
    +986207
    +986213
    +986239
    +986257
    +986267
    +986281
    +986287
    +986333
    +986339
    +986351
    +986369
    +986411
    +986417
    +986429
    +986437
    +986471
    +986477
    +986497
    +986507
    +986509
    +986519
    +986533
    +986543
    +986563
    +986567
    +986569
    +986581
    +986593
    +986597
    +986599
    +986617
    +986633
    +986641
    +986659
    +986693
    +986707
    +986717
    +986719
    +986729
    +986737
    +986749
    +986759
    +986767
    +986779
    +986801
    +986813
    +986819
    +986837
    +986849
    +986851
    +986857
    +986903
    +986927
    +986929
    +986933
    +986941
    +986959
    +986963
    +986981
    +986983
    +986989
    +987013
    +987023
    +987029
    +987043
    +987053
    +987061
    +987067
    +987079
    +987083
    +987089
    +987097
    +987101
    +987127
    +987143
    +987191
    +987193
    +987199
    +987209
    +987211
    +987227
    +987251
    +987293
    +987299
    +987313
    +987353
    +987361
    +987383
    +987391
    +987433
    +987457
    +987463
    +987473
    +987491
    +987509
    +987523
    +987533
    +987541
    +987559
    +987587
    +987593
    +987599
    +987607
    +987631
    +987659
    +987697
    +987713
    +987739
    +987793
    +987797
    +987803
    +987809
    +987821
    +987851
    +987869
    +987911
    +987913
    +987929
    +987941
    +987971
    +987979
    +987983
    +987991
    +987997
    +988007
    +988021
    +988033
    +988051
    +988061
    +988067
    +988069
    +988093
    +988109
    +988111
    +988129
    +988147
    +988157
    +988199
    +988213
    +988217
    +988219
    +988231
    +988237
    +988243
    +988271
    +988279
    +988297
    +988313
    +988319
    +988321
    +988343
    +988357
    +988367
    +988409
    +988417
    +988439
    +988453
    +988459
    +988483
    +988489
    +988501
    +988511
    +988541
    +988549
    +988571
    +988577
    +988579
    +988583
    +988591
    +988607
    +988643
    +988649
    +988651
    +988661
    +988681
    +988693
    +988711
    +988727
    +988733
    +988759
    +988763
    +988783
    +988789
    +988829
    +988837
    +988849
    +988859
    +988861
    +988877
    +988901
    +988909
    +988937
    +988951
    +988963
    +988979
    +989011
    +989029
    +989059
    +989071
    +989081
    +989099
    +989119
    +989123
    +989171
    +989173
    +989231
    +989239
    +989249
    +989251
    +989279
    +989293
    +989309
    +989321
    +989323
    +989327
    +989341
    +989347
    +989353
    +989377
    +989381
    +989411
    +989419
    +989423
    +989441
    +989467
    +989477
    +989479
    +989507
    +989533
    +989557
    +989561
    +989579
    +989581
    +989623
    +989629
    +989641
    +989647
    +989663
    +989671
    +989687
    +989719
    +989743
    +989749
    +989753
    +989761
    +989777
    +989783
    +989797
    +989803
    +989827
    +989831
    +989837
    +989839
    +989869
    +989873
    +989887
    +989909
    +989917
    +989921
    +989929
    +989939
    +989951
    +989959
    +989971
    +989977
    +989981
    +989999
    +990001
    +990013
    +990023
    +990037
    +990043
    +990053
    +990137
    +990151
    +990163
    +990169
    +990179
    +990181
    +990211
    +990239
    +990259
    +990277
    +990281
    +990287
    +990289
    +990293
    +990307
    +990313
    +990323
    +990329
    +990331
    +990349
    +990359
    +990361
    +990371
    +990377
    +990383
    +990389
    +990397
    +990463
    +990469
    +990487
    +990497
    +990503
    +990511
    +990523
    +990529
    +990547
    +990559
    +990589
    +990593
    +990599
    +990631
    +990637
    +990643
    +990673
    +990707
    +990719
    +990733
    +990761
    +990767
    +990797
    +990799
    +990809
    +990841
    +990851
    +990881
    +990887
    +990889
    +990893
    +990917
    +990923
    +990953
    +990961
    +990967
    +990973
    +990989
    +991009
    +991027
    +991031
    +991037
    +991043
    +991057
    +991063
    +991069
    +991073
    +991079
    +991091
    +991127
    +991129
    +991147
    +991171
    +991181
    +991187
    +991201
    +991217
    +991223
    +991229
    +991261
    +991273
    +991313
    +991327
    +991343
    +991357
    +991381
    +991387
    +991409
    +991427
    +991429
    +991447
    +991453
    +991483
    +991493
    +991499
    +991511
    +991531
    +991541
    +991547
    +991567
    +991579
    +991603
    +991607
    +991619
    +991621
    +991633
    +991643
    +991651
    +991663
    +991693
    +991703
    +991717
    +991723
    +991733
    +991741
    +991751
    +991777
    +991811
    +991817
    +991867
    +991871
    +991873
    +991883
    +991889
    +991901
    +991909
    +991927
    +991931
    +991943
    +991951
    +991957
    +991961
    +991973
    +991979
    +991981
    +991987
    +991999
    +992011
    +992021
    +992023
    +992051
    +992087
    +992111
    +992113
    +992129
    +992141
    +992153
    +992179
    +992183
    +992219
    +992231
    +992249
    +992263
    +992267
    +992269
    +992281
    +992309
    +992317
    +992357
    +992359
    +992363
    +992371
    +992393
    +992417
    +992429
    +992437
    +992441
    +992449
    +992461
    +992513
    +992521
    +992539
    +992549
    +992561
    +992591
    +992603
    +992609
    +992623
    +992633
    +992659
    +992689
    +992701
    +992707
    +992723
    +992737
    +992777
    +992801
    +992809
    +992819
    +992843
    +992857
    +992861
    +992863
    +992867
    +992891
    +992903
    +992917
    +992923
    +992941
    +992947
    +992963
    +992983
    +993001
    +993011
    +993037
    +993049
    +993053
    +993079
    +993103
    +993107
    +993121
    +993137
    +993169
    +993197
    +993199
    +993203
    +993211
    +993217
    +993233
    +993241
    +993247
    +993253
    +993269
    +993283
    +993287
    +993319
    +993323
    +993341
    +993367
    +993397
    +993401
    +993407
    +993431
    +993437
    +993451
    +993467
    +993479
    +993481
    +993493
    +993527
    +993541
    +993557
    +993589
    +993611
    +993617
    +993647
    +993679
    +993683
    +993689
    +993703
    +993763
    +993779
    +993781
    +993793
    +993821
    +993823
    +993827
    +993841
    +993851
    +993869
    +993887
    +993893
    +993907
    +993913
    +993919
    +993943
    +993961
    +993977
    +993983
    +993997
    +994013
    +994027
    +994039
    +994051
    +994067
    +994069
    +994073
    +994087
    +994093
    +994141
    +994163
    +994181
    +994183
    +994193
    +994199
    +994229
    +994237
    +994241
    +994247
    +994249
    +994271
    +994297
    +994303
    +994307
    +994309
    +994319
    +994321
    +994337
    +994339
    +994363
    +994369
    +994391
    +994393
    +994417
    +994447
    +994453
    +994457
    +994471
    +994489
    +994501
    +994549
    +994559
    +994561
    +994571
    +994579
    +994583
    +994603
    +994621
    +994657
    +994663
    +994667
    +994691
    +994699
    +994709
    +994711
    +994717
    +994723
    +994751
    +994769
    +994793
    +994811
    +994813
    +994817
    +994831
    +994837
    +994853
    +994867
    +994871
    +994879
    +994901
    +994907
    +994913
    +994927
    +994933
    +994949
    +994963
    +994991
    +994997
    +995009
    +995023
    +995051
    +995053
    +995081
    +995117
    +995119
    +995147
    +995167
    +995173
    +995219
    +995227
    +995237
    +995243
    +995273
    +995303
    +995327
    +995329
    +995339
    +995341
    +995347
    +995363
    +995369
    +995377
    +995381
    +995387
    +995399
    +995431
    +995443
    +995447
    +995461
    +995471
    +995513
    +995531
    +995539
    +995549
    +995551
    +995567
    +995573
    +995587
    +995591
    +995593
    +995611
    +995623
    +995641
    +995651
    +995663
    +995669
    +995677
    +995699
    +995713
    +995719
    +995737
    +995747
    +995783
    +995791
    +995801
    +995833
    +995881
    +995887
    +995903
    +995909
    +995927
    +995941
    +995957
    +995959
    +995983
    +995987
    +995989
    +996001
    +996011
    +996019
    +996049
    +996067
    +996103
    +996109
    +996119
    +996143
    +996157
    +996161
    +996167
    +996169
    +996173
    +996187
    +996197
    +996209
    +996211
    +996253
    +996257
    +996263
    +996271
    +996293
    +996301
    +996311
    +996323
    +996329
    +996361
    +996367
    +996403
    +996407
    +996409
    +996431
    +996461
    +996487
    +996511
    +996529
    +996539
    +996551
    +996563
    +996571
    +996599
    +996601
    +996617
    +996629
    +996631
    +996637
    +996647
    +996649
    +996689
    +996703
    +996739
    +996763
    +996781
    +996803
    +996811
    +996841
    +996847
    +996857
    +996859
    +996871
    +996881
    +996883
    +996887
    +996899
    +996953
    +996967
    +996973
    +996979
    +997001
    +997013
    +997019
    +997021
    +997037
    +997043
    +997057
    +997069
    +997081
    +997091
    +997097
    +997099
    +997103
    +997109
    +997111
    +997121
    +997123
    +997141
    +997147
    +997151
    +997153
    +997163
    +997201
    +997207
    +997219
    +997247
    +997259
    +997267
    +997273
    +997279
    +997307
    +997309
    +997319
    +997327
    +997333
    +997343
    +997357
    +997369
    +997379
    +997391
    +997427
    +997433
    +997439
    +997453
    +997463
    +997511
    +997541
    +997547
    +997553
    +997573
    +997583
    +997589
    +997597
    +997609
    +997627
    +997637
    +997649
    +997651
    +997663
    +997681
    +997693
    +997699
    +997727
    +997739
    +997741
    +997751
    +997769
    +997783
    +997793
    +997807
    +997811
    +997813
    +997877
    +997879
    +997889
    +997891
    +997897
    +997933
    +997949
    +997961
    +997963
    +997973
    +997991
    +998009
    +998017
    +998027
    +998029
    +998069
    +998071
    +998077
    +998083
    +998111
    +998117
    +998147
    +998161
    +998167
    +998197
    +998201
    +998213
    +998219
    +998237
    +998243
    +998273
    +998281
    +998287
    +998311
    +998329
    +998353
    +998377
    +998381
    +998399
    +998411
    +998419
    +998423
    +998429
    +998443
    +998471
    +998497
    +998513
    +998527
    +998537
    +998539
    +998551
    +998561
    +998617
    +998623
    +998629
    +998633
    +998651
    +998653
    +998681
    +998687
    +998689
    +998717
    +998737
    +998743
    +998749
    +998759
    +998779
    +998813
    +998819
    +998831
    +998839
    +998843
    +998857
    +998861
    +998897
    +998909
    +998917
    +998927
    +998941
    +998947
    +998951
    +998957
    +998969
    +998983
    +998989
    +999007
    +999023
    +999029
    +999043
    +999049
    +999067
    +999083
    +999091
    +999101
    +999133
    +999149
    +999169
    +999181
    +999199
    +999217
    +999221
    +999233
    +999239
    +999269
    +999287
    +999307
    +999329
    +999331
    +999359
    +999371
    +999377
    +999389
    +999431
    +999433
    +999437
    +999451
    +999491
    +999499
    +999521
    +999529
    +999541
    +999553
    +999563
    +999599
    +999611
    +999613
    +999623
    +999631
    +999653
    +999667
    +999671
    +999683
    +999721
    +999727
    +999749
    +999763
    +999769
    +999773
    +999809
    +999853
    +999863
    +999883
    +999907
    +999917
    +999931
    +999953
    +999959
    +999961
    +999979
    +999983
    +1000003
    +1000033
    +1000037
    +1000039
    +1000081
    +1000099
    +1000117
    +1000121
    +1000133
    +1000151
    +1000159
    +1000171
    +1000183
    +1000187
    +1000193
    +1000199
    +1000211
    +1000213
    +1000231
    +1000249
    +1000253
    +1000273
    +1000289
    +1000291
    +1000303
    +1000313
    +1000333
    +1000357
    +1000367
    +1000381
    +1000393
    +1000397
    +1000403
    +1000409
    +1000423
    +1000427
    +1000429
    +1000453
    +1000457
    +1000507
    +1000537
    +1000541
    +1000547
    +1000577
    +1000579
    +1000589
    +1000609
    +1000619
    +1000621
    +1000639
    +1000651
    +1000667
    +1000669
    +1000679
    +1000691
    +1000697
    +1000721
    +1000723
    +1000763
    +1000777
    +1000793
    +1000829
    +1000847
    +1000849
    +1000859
    +1000861
    +1000889
    +1000907
    +1000919
    +1000921
    +1000931
    +1000969
    +1000973
    +1000981
    +1000999
    +1001003
    +1001017
    +1001023
    +1001027
    +1001041
    +1001069
    +1001081
    +1001087
    +1001089
    +1001093
    +1001107
    +1001123
    +1001153
    +1001159
    +1001173
    +1001177
    +1001191
    +1001197
    +1001219
    +1001237
    +1001267
    +1001279
    +1001291
    +1001303
    +1001311
    +1001321
    +1001323
    +1001327
    +1001347
    +1001353
    +1001369
    +1001381
    +1001387
    +1001389
    +1001401
    +1001411
    +1001431
    +1001447
    +1001459
    +1001467
    +1001491
    +1001501
    +1001527
    +1001531
    +1001549
    +1001551
    +1001563
    +1001569
    +1001587
    +1001593
    +1001621
    +1001629
    +1001639
    +1001659
    +1001669
    +1001683
    +1001687
    +1001713
    +1001723
    +1001743
    +1001783
    +1001797
    +1001801
    +1001807
    +1001809
    +1001821
    +1001831
    +1001839
    +1001911
    +1001933
    +1001941
    +1001947
    +1001953
    +1001977
    +1001981
    +1001983
    +1001989
    +1002017
    +1002049
    +1002061
    +1002073
    +1002077
    +1002083
    +1002091
    +1002101
    +1002109
    +1002121
    +1002143
    +1002149
    +1002151
    +1002173
    +1002191
    +1002227
    +1002241
    +1002247
    +1002257
    +1002259
    +1002263
    +1002289
    +1002299
    +1002341
    +1002343
    +1002347
    +1002349
    +1002359
    +1002361
    +1002377
    +1002403
    +1002427
    +1002433
    +1002451
    +1002457
    +1002467
    +1002481
    +1002487
    +1002493
    +1002503
    +1002511
    +1002517
    +1002523
    +1002527
    +1002553
    +1002569
    +1002577
    +1002583
    +1002619
    +1002623
    +1002647
    +1002653
    +1002679
    +1002709
    +1002713
    +1002719
    +1002721
    +1002739
    +1002751
    +1002767
    +1002769
    +1002773
    +1002787
    +1002797
    +1002809
    +1002817
    +1002821
    +1002851
    +1002853
    +1002857
    +1002863
    +1002871
    +1002887
    +1002893
    +1002899
    +1002913
    +1002917
    +1002929
    +1002931
    +1002973
    +1002979
    +1003001
    +1003003
    +1003019
    +1003039
    +1003049
    +1003087
    +1003091
    +1003097
    +1003103
    +1003109
    +1003111
    +1003133
    +1003141
    +1003193
    +1003199
    +1003201
    +1003241
    +1003259
    +1003273
    +1003279
    +1003291
    +1003307
    +1003337
    +1003349
    +1003351
    +1003361
    +1003363
    +1003367
    +1003369
    +1003381
    +1003397
    +1003411
    +1003417
    +1003433
    +1003463
    +1003469
    +1003507
    +1003517
    +1003543
    +1003549
    +1003589
    +1003601
    +1003609
    +1003619
    +1003621
    +1003627
    +1003631
    +1003679
    +1003693
    +1003711
    +1003729
    +1003733
    +1003741
    +1003747
    +1003753
    +1003757
    +1003763
    +1003771
    +1003787
    +1003817
    +1003819
    +1003841
    +1003879
    +1003889
    +1003897
    +1003907
    +1003909
    +1003913
    +1003931
    +1003943
    +1003957
    +1003963
    +1004027
    +1004033
    +1004053
    +1004057
    +1004063
    +1004077
    +1004089
    +1004117
    +1004119
    +1004137
    +1004141
    +1004161
    +1004167
    +1004209
    +1004221
    +1004233
    +1004273
    +1004279
    +1004287
    +1004293
    +1004303
    +1004317
    +1004323
    +1004363
    +1004371
    +1004401
    +1004429
    +1004441
    +1004449
    +1004453
    +1004461
    +1004477
    +1004483
    +1004501
    +1004527
    +1004537
    +1004551
    +1004561
    +1004567
    +1004599
    +1004651
    +1004657
    +1004659
    +1004669
    +1004671
    +1004677
    +1004687
    +1004723
    +1004737
    +1004743
    +1004747
    +1004749
    +1004761
    +1004779
    +1004797
    +1004873
    +1004903
    +1004911
    +1004917
    +1004963
    +1004977
    +1004981
    +1004987
    +1005007
    +1005013
    +1005019
    +1005029
    +1005041
    +1005049
    +1005071
    +1005073
    +1005079
    +1005101
    +1005107
    +1005131
    +1005133
    +1005143
    +1005161
    +1005187
    +1005203
    +1005209
    +1005217
    +1005223
    +1005229
    +1005239
    +1005241
    +1005269
    +1005287
    +1005293
    +1005313
    +1005317
    +1005331
    +1005349
    +1005359
    +1005371
    +1005373
    +1005391
    +1005409
    +1005413
    +1005427
    +1005437
    +1005439
    +1005457
    +1005467
    +1005481
    +1005493
    +1005503
    +1005527
    +1005541
    +1005551
    +1005553
    +1005581
    +1005593
    +1005617
    +1005619
    +1005637
    +1005643
    +1005647
    +1005661
    +1005677
    +1005679
    +1005701
    +1005709
    +1005751
    +1005761
    +1005821
    +1005827
    +1005833
    +1005883
    +1005911
    +1005913
    +1005931
    +1005937
    +1005959
    +1005971
    +1005989
    +1006003
    +1006007
    +1006021
    +1006037
    +1006063
    +1006087
    +1006091
    +1006123
    +1006133
    +1006147
    +1006151
    +1006153
    +1006163
    +1006169
    +1006171
    +1006177
    +1006189
    +1006193
    +1006217
    +1006219
    +1006231
    +1006237
    +1006241
    +1006249
    +1006253
    +1006267
    +1006279
    +1006301
    +1006303
    +1006307
    +1006309
    +1006331
    +1006333
    +1006337
    +1006339
    +1006351
    +1006361
    +1006367
    +1006391
    +1006393
    +1006433
    +1006441
    +1006463
    +1006469
    +1006471
    +1006493
    +1006507
    +1006513
    +1006531
    +1006543
    +1006547
    +1006559
    +1006583
    +1006589
    +1006609
    +1006613
    +1006633
    +1006637
    +1006651
    +1006711
    +1006721
    +1006739
    +1006751
    +1006769
    +1006781
    +1006783
    +1006799
    +1006847
    +1006853
    +1006861
    +1006877
    +1006879
    +1006883
    +1006891
    +1006897
    +1006933
    +1006937
    +1006949
    +1006969
    +1006979
    +1006987
    +1006991
    +1007021
    +1007023
    +1007047
    +1007059
    +1007081
    +1007089
    +1007099
    +1007117
    +1007119
    +1007129
    +1007137
    +1007161
    +1007173
    +1007179
    +1007203
    +1007231
    +1007243
    +1007249
    +1007297
    +1007299
    +1007309
    +1007317
    +1007339
    +1007353
    +1007359
    +1007381
    +1007387
    +1007401
    +1007417
    +1007429
    +1007441
    +1007459
    +1007467
    +1007483
    +1007497
    +1007519
    +1007527
    +1007549
    +1007557
    +1007597
    +1007599
    +1007609
    +1007647
    +1007651
    +1007681
    +1007683
    +1007693
    +1007701
    +1007711
    +1007719
    +1007723
    +1007729
    +1007731
    +1007749
    +1007753
    +1007759
    +1007767
    +1007771
    +1007789
    +1007801
    +1007807
    +1007813
    +1007819
    +1007827
    +1007857
    +1007861
    +1007873
    +1007887
    +1007891
    +1007921
    +1007933
    +1007939
    +1007957
    +1007959
    +1007971
    +1007977
    +1008001
    +1008013
    +1008017
    +1008031
    +1008037
    +1008041
    +1008043
    +1008101
    +1008131
    +1008157
    +1008181
    +1008187
    +1008193
    +1008199
    +1008209
    +1008223
    +1008229
    +1008233
    +1008239
    +1008247
    +1008257
    +1008263
    +1008317
    +1008323
    +1008331
    +1008347
    +1008353
    +1008373
    +1008379
    +1008401
    +1008407
    +1008409
    +1008419
    +1008421
    +1008433
    +1008437
    +1008451
    +1008467
    +1008493
    +1008499
    +1008503
    +1008517
    +1008541
    +1008547
    +1008563
    +1008571
    +1008587
    +1008589
    +1008607
    +1008611
    +1008613
    +1008617
    +1008659
    +1008701
    +1008719
    +1008743
    +1008773
    +1008779
    +1008781
    +1008793
    +1008809
    +1008817
    +1008829
    +1008851
    +1008853
    +1008857
    +1008859
    +1008863
    +1008871
    +1008901
    +1008911
    +1008913
    +1008923
    +1008937
    +1008947
    +1008979
    +1008983
    +1008989
    +1008991
    +1009007
    +1009037
    +1009049
    +1009061
    +1009097
    +1009121
    +1009139
    +1009153
    +1009157
    +1009159
    +1009163
    +1009189
    +1009193
    +1009199
    +1009201
    +1009207
    +1009237
    +1009243
    +1009247
    +1009259
    +1009289
    +1009291
    +1009301
    +1009303
    +1009319
    +1009321
    +1009343
    +1009357
    +1009361
    +1009369
    +1009373
    +1009387
    +1009399
    +1009417
    +1009433
    +1009439
    +1009457
    +1009483
    +1009487
    +1009499
    +1009501
    +1009507
    +1009531
    +1009537
    +1009559
    +1009573
    +1009601
    +1009609
    +1009621
    +1009627
    +1009637
    +1009643
    +1009649
    +1009651
    +1009669
    +1009727
    +1009741
    +1009747
    +1009781
    +1009787
    +1009807
    +1009819
    +1009837
    +1009843
    +1009859
    +1009873
    +1009901
    +1009909
    +1009927
    +1009937
    +1009951
    +1009963
    +1009991
    +1009993
    +1009997
    +1010003
    +1010033
    +1010069
    +1010081
    +1010083
    +1010129
    +1010131
    +1010143
    +1010167
    +1010179
    +1010201
    +1010203
    +1010237
    +1010263
    +1010291
    +1010297
    +1010329
    +1010353
    +1010357
    +1010381
    +1010407
    +1010411
    +1010419
    +1010423
    +1010431
    +1010461
    +1010467
    +1010473
    +1010491
    +1010501
    +1010509
    +1010519
    +1010549
    +1010567
    +1010579
    +1010617
    +1010623
    +1010627
    +1010671
    +1010683
    +1010687
    +1010717
    +1010719
    +1010747
    +1010749
    +1010753
    +1010759
    +1010767
    +1010771
    +1010783
    +1010791
    +1010797
    +1010809
    +1010833
    +1010843
    +1010861
    +1010881
    +1010897
    +1010899
    +1010903
    +1010917
    +1010929
    +1010957
    +1010981
    +1010983
    +1010993
    +1011001
    +1011013
    +1011029
    +1011037
    +1011067
    +1011071
    +1011077
    +1011079
    +1011091
    +1011107
    +1011137
    +1011139
    +1011163
    +1011167
    +1011191
    +1011217
    +1011221
    +1011229
    +1011233
    +1011239
    +1011271
    +1011277
    +1011281
    +1011289
    +1011331
    +1011343
    +1011349
    +1011359
    +1011371
    +1011377
    +1011391
    +1011397
    +1011407
    +1011431
    +1011443
    +1011509
    +1011539
    +1011553
    +1011559
    +1011583
    +1011587
    +1011589
    +1011599
    +1011601
    +1011631
    +1011641
    +1011649
    +1011667
    +1011671
    +1011677
    +1011697
    +1011719
    +1011733
    +1011737
    +1011749
    +1011763
    +1011779
    +1011797
    +1011799
    +1011817
    +1011827
    +1011889
    +1011893
    +1011917
    +1011937
    +1011943
    +1011947
    +1011961
    +1011973
    +1011979
    +1012007
    +1012009
    +1012031
    +1012043
    +1012049
    +1012079
    +1012087
    +1012093
    +1012097
    +1012103
    +1012133
    +1012147
    +1012159
    +1012171
    +1012183
    +1012189
    +1012201
    +1012213
    +1012217
    +1012229
    +1012241
    +1012259
    +1012261
    +1012267
    +1012279
    +1012289
    +1012307
    +1012321
    +1012369
    +1012373
    +1012379
    +1012397
    +1012399
    +1012411
    +1012421
    +1012423
    +1012433
    +1012439
    +1012447
    +1012457
    +1012463
    +1012481
    +1012489
    +1012507
    +1012513
    +1012519
    +1012523
    +1012547
    +1012549
    +1012559
    +1012573
    +1012591
    +1012597
    +1012601
    +1012619
    +1012631
    +1012633
    +1012637
    +1012657
    +1012663
    +1012679
    +1012691
    +1012699
    +1012703
    +1012717
    +1012721
    +1012733
    +1012751
    +1012763
    +1012769
    +1012771
    +1012789
    +1012811
    +1012829
    +1012831
    +1012861
    +1012903
    +1012919
    +1012931
    +1012967
    +1012981
    +1012993
    +1012997
    +1013003
    +1013009
    +1013029
    +1013041
    +1013053
    +1013063
    +1013143
    +1013153
    +1013197
    +1013203
    +1013227
    +1013237
    +1013239
    +1013249
    +1013263
    +1013267
    +1013279
    +1013291
    +1013321
    +1013329
    +1013377
    +1013399
    +1013401
    +1013429
    +1013431
    +1013471
    +1013477
    +1013501
    +1013503
    +1013527
    +1013531
    +1013533
    +1013563
    +1013569
    +1013581
    +1013603
    +1013609
    +1013627
    +1013629
    +1013641
    +1013671
    +1013681
    +1013687
    +1013699
    +1013711
    +1013713
    +1013717
    +1013729
    +1013741
    +1013767
    +1013773
    +1013791
    +1013813
    +1013819
    +1013827
    +1013833
    +1013839
    +1013843
    +1013851
    +1013879
    +1013891
    +1013893
    +1013899
    +1013921
    +1013923
    +1013933
    +1013993
    +1014007
    +1014029
    +1014037
    +1014061
    +1014089
    +1014113
    +1014121
    +1014127
    +1014131
    +1014137
    +1014149
    +1014157
    +1014161
    +1014173
    +1014193
    +1014197
    +1014199
    +1014229
    +1014257
    +1014259
    +1014263
    +1014287
    +1014301
    +1014317
    +1014319
    +1014331
    +1014337
    +1014341
    +1014359
    +1014361
    +1014371
    +1014389
    +1014397
    +1014451
    +1014457
    +1014469
    +1014487
    +1014493
    +1014521
    +1014539
    +1014547
    +1014557
    +1014571
    +1014593
    +1014617
    +1014631
    +1014641
    +1014649
    +1014677
    +1014697
    +1014719
    +1014721
    +1014731
    +1014743
    +1014749
    +1014763
    +1014779
    +1014787
    +1014817
    +1014821
    +1014833
    +1014863
    +1014869
    +1014877
    +1014887
    +1014889
    +1014907
    +1014941
    +1014953
    +1014973
    +1014989
    +1015009
    +1015039
    +1015043
    +1015051
    +1015057
    +1015061
    +1015067
    +1015073
    +1015081
    +1015093
    +1015097
    +1015123
    +1015127
    +1015139
    +1015159
    +1015163
    +1015171
    +1015199
    +1015207
    +1015277
    +1015309
    +1015349
    +1015361
    +1015363
    +1015367
    +1015369
    +1015403
    +1015409
    +1015423
    +1015433
    +1015451
    +1015453
    +1015459
    +1015463
    +1015471
    +1015481
    +1015499
    +1015501
    +1015507
    +1015517
    +1015523
    +1015541
    +1015549
    +1015559
    +1015561
    +1015571
    +1015601
    +1015603
    +1015627
    +1015661
    +1015691
    +1015697
    +1015709
    +1015723
    +1015727
    +1015739
    +1015747
    +1015753
    +1015769
    +1015813
    +1015823
    +1015829
    +1015843
    +1015853
    +1015871
    +1015877
    +1015891
    +1015897
    +1015907
    +1015913
    +1015919
    +1015967
    +1015981
    +1015991
    +1016009
    +1016011
    +1016023
    +1016027
    +1016033
    +1016051
    +1016053
    +1016069
    +1016083
    +1016089
    +1016111
    +1016123
    +1016137
    +1016143
    +1016153
    +1016159
    +1016173
    +1016201
    +1016203
    +1016221
    +1016227
    +1016231
    +1016237
    +1016263
    +1016303
    +1016339
    +1016341
    +1016357
    +1016359
    +1016371
    +1016399
    +1016401
    +1016419
    +1016423
    +1016441
    +1016453
    +1016489
    +1016497
    +1016527
    +1016567
    +1016569
    +1016573
    +1016581
    +1016597
    +1016599
    +1016611
    +1016621
    +1016641
    +1016663
    +1016681
    +1016689
    +1016731
    +1016737
    +1016749
    +1016773
    +1016777
    +1016783
    +1016789
    +1016839
    +1016843
    +1016849
    +1016879
    +1016881
    +1016891
    +1016909
    +1016921
    +1016927
    +1016929
    +1016941
    +1016947
    +1016959
    +1016971
    +1017007
    +1017011
    +1017031
    +1017041
    +1017043
    +1017061
    +1017077
    +1017097
    +1017119
    +1017131
    +1017139
    +1017157
    +1017173
    +1017179
    +1017193
    +1017199
    +1017209
    +1017227
    +1017277
    +1017293
    +1017299
    +1017301
    +1017307
    +1017311
    +1017319
    +1017323
    +1017329
    +1017347
    +1017353
    +1017361
    +1017371
    +1017377
    +1017383
    +1017391
    +1017437
    +1017439
    +1017449
    +1017473
    +1017479
    +1017481
    +1017539
    +1017551
    +1017553
    +1017559
    +1017607
    +1017613
    +1017617
    +1017623
    +1017647
    +1017649
    +1017673
    +1017683
    +1017703
    +1017713
    +1017719
    +1017721
    +1017749
    +1017781
    +1017787
    +1017799
    +1017817
    +1017827
    +1017847
    +1017851
    +1017857
    +1017859
    +1017881
    +1017889
    +1017923
    +1017953
    +1017959
    +1017997
    +1018007
    +1018019
    +1018021
    +1018057
    +1018091
    +1018097
    +1018109
    +1018123
    +1018177
    +1018201
    +1018207
    +1018217
    +1018223
    +1018247
    +1018253
    +1018271
    +1018291
    +1018301
    +1018309
    +1018313
    +1018337
    +1018357
    +1018411
    +1018421
    +1018429
    +1018439
    +1018447
    +1018471
    +1018477
    +1018489
    +1018513
    +1018543
    +1018559
    +1018583
    +1018613
    +1018621
    +1018643
    +1018649
    +1018651
    +1018669
    +1018673
    +1018679
    +1018697
    +1018709
    +1018711
    +1018729
    +1018733
    +1018763
    +1018769
    +1018777
    +1018789
    +1018807
    +1018811
    +1018813
    +1018817
    +1018859
    +1018873
    +1018879
    +1018889
    +1018903
    +1018907
    +1018931
    +1018937
    +1018949
    +1018957
    +1018967
    +1018981
    +1018987
    +1018993
    +1018999
    +1019023
    +1019033
    +1019059
    +1019069
    +1019071
    +1019077
    +1019093
    +1019119
    +1019129
    +1019173
    +1019177
    +1019197
    +1019209
    +1019237
    +1019251
    +1019257
    +1019261
    +1019267
    +1019273
    +1019281
    +1019297
    +1019329
    +1019339
    +1019351
    +1019353
    +1019357
    +1019377
    +1019399
    +1019411
    +1019413
    +1019423
    +1019443
    +1019449
    +1019453
    +1019467
    +1019471
    +1019479
    +1019503
    +1019509
    +1019531
    +1019533
    +1019537
    +1019549
    +1019563
    +1019617
    +1019639
    +1019647
    +1019657
    +1019663
    +1019687
    +1019693
    +1019699
    +1019701
    +1019713
    +1019717
    +1019723
    +1019729
    +1019731
    +1019741
    +1019747
    +1019771
    +1019783
    +1019801
    +1019819
    +1019827
    +1019839
    +1019849
    +1019857
    +1019861
    +1019873
    +1019899
    +1019903
    +1019927
    +1019971
    +1020001
    +1020007
    +1020011
    +1020013
    +1020023
    +1020037
    +1020043
    +1020049
    +1020059
    +1020077
    +1020079
    +1020101
    +1020109
    +1020113
    +1020137
    +1020143
    +1020157
    +1020163
    +1020223
    +1020233
    +1020247
    +1020259
    +1020269
    +1020293
    +1020301
    +1020329
    +1020337
    +1020353
    +1020361
    +1020379
    +1020389
    +1020401
    +1020407
    +1020413
    +1020419
    +1020431
    +1020451
    +1020457
    +1020491
    +1020517
    +1020529
    +1020541
    +1020557
    +1020583
    +1020589
    +1020599
    +1020619
    +1020631
    +1020667
    +1020683
    +1020689
    +1020707
    +1020709
    +1020743
    +1020751
    +1020757
    +1020779
    +1020797
    +1020821
    +1020823
    +1020827
    +1020839
    +1020841
    +1020847
    +1020853
    +1020881
    +1020893
    +1020907
    +1020913
    +1020931
    +1020959
    +1020961
    +1020967
    +1020973
    +1020977
    +1020979
    +1020989
    +1020991
    +1020997
    +1021001
    +1021019
    +1021043
    +1021067
    +1021073
    +1021081
    +1021087
    +1021091
    +1021093
    +1021123
    +1021127
    +1021129
    +1021157
    +1021159
    +1021183
    +1021199
    +1021217
    +1021243
    +1021253
    +1021259
    +1021261
    +1021271
    +1021283
    +1021289
    +1021291
    +1021297
    +1021301
    +1021303
    +1021327
    +1021331
    +1021333
    +1021367
    +1021369
    +1021373
    +1021381
    +1021387
    +1021403
    +1021417
    +1021429
    +1021441
    +1021457
    +1021463
    +1021483
    +1021487
    +1021541
    +1021561
    +1021571
    +1021577
    +1021621
    +1021627
    +1021651
    +1021661
    +1021663
    +1021673
    +1021697
    +1021711
    +1021747
    +1021753
    +1021759
    +1021777
    +1021793
    +1021799
    +1021807
    +1021831
    +1021837
    +1021849
    +1021861
    +1021879
    +1021897
    +1021907
    +1021919
    +1021961
    +1021963
    +1021973
    +1022011
    +1022017
    +1022033
    +1022053
    +1022059
    +1022071
    +1022083
    +1022113
    +1022123
    +1022129
    +1022137
    +1022141
    +1022167
    +1022179
    +1022183
    +1022191
    +1022201
    +1022209
    +1022237
    +1022243
    +1022249
    +1022251
    +1022291
    +1022303
    +1022341
    +1022377
    +1022381
    +1022383
    +1022387
    +1022389
    +1022429
    +1022443
    +1022449
    +1022467
    +1022491
    +1022501
    +1022503
    +1022507
    +1022509
    +1022513
    +1022519
    +1022531
    +1022573
    +1022591
    +1022611
    +1022629
    +1022633
    +1022639
    +1022653
    +1022677
    +1022683
    +1022689
    +1022701
    +1022719
    +1022729
    +1022761
    +1022773
    +1022797
    +1022821
    +1022837
    +1022843
    +1022849
    +1022869
    +1022881
    +1022891
    +1022899
    +1022911
    +1022929
    +1022933
    +1022963
    +1022977
    +1022981
    +1023019
    +1023037
    +1023041
    +1023047
    +1023067
    +1023079
    +1023083
    +1023101
    +1023107
    +1023133
    +1023163
    +1023167
    +1023173
    +1023199
    +1023203
    +1023221
    +1023227
    +1023229
    +1023257
    +1023259
    +1023263
    +1023277
    +1023289
    +1023299
    +1023301
    +1023311
    +1023313
    +1023317
    +1023329
    +1023353
    +1023361
    +1023367
    +1023389
    +1023391
    +1023409
    +1023413
    +1023419
    +1023461
    +1023467
    +1023487
    +1023499
    +1023521
    +1023541
    +1023551
    +1023557
    +1023571
    +1023577
    +1023601
    +1023643
    +1023653
    +1023697
    +1023719
    +1023721
    +1023731
    +1023733
    +1023751
    +1023769
    +1023821
    +1023833
    +1023839
    +1023851
    +1023857
    +1023871
    +1023941
    +1023943
    +1023947
    +1023949
    +1023973
    +1023977
    +1023991
    +1024021
    +1024031
    +1024061
    +1024073
    +1024087
    +1024091
    +1024099
    +1024103
    +1024151
    +1024159
    +1024171
    +1024183
    +1024189
    +1024207
    +1024249
    +1024277
    +1024307
    +1024313
    +1024319
    +1024321
    +1024327
    +1024337
    +1024339
    +1024357
    +1024379
    +1024391
    +1024399
    +1024411
    +1024421
    +1024427
    +1024433
    +1024477
    +1024481
    +1024511
    +1024523
    +1024547
    +1024559
    +1024577
    +1024579
    +1024589
    +1024591
    +1024609
    +1024633
    +1024663
    +1024669
    +1024693
    +1024697
    +1024703
    +1024711
    +1024721
    +1024729
    +1024757
    +1024783
    +1024799
    +1024823
    +1024843
    +1024853
    +1024871
    +1024883
    +1024901
    +1024909
    +1024921
    +1024931
    +1024939
    +1024943
    +1024951
    +1024957
    +1024963
    +1024987
    +1024997
    +1025009
    +1025021
    +1025029
    +1025039
    +1025047
    +1025081
    +1025093
    +1025099
    +1025111
    +1025113
    +1025119
    +1025137
    +1025147
    +1025149
    +1025153
    +1025161
    +1025197
    +1025203
    +1025209
    +1025231
    +1025239
    +1025257
    +1025261
    +1025267
    +1025273
    +1025279
    +1025281
    +1025303
    +1025327
    +1025333
    +1025347
    +1025351
    +1025383
    +1025393
    +1025407
    +1025413
    +1025417
    +1025419
    +1025443
    +1025459
    +1025477
    +1025483
    +1025503
    +1025509
    +1025513
    +1025537
    +1025543
    +1025551
    +1025561
    +1025579
    +1025611
    +1025621
    +1025623
    +1025641
    +1025653
    +1025659
    +1025669
    +1025693
    +1025707
    +1025741
    +1025747
    +1025749
    +1025767
    +1025789
    +1025803
    +1025807
    +1025819
    +1025839
    +1025873
    +1025887
    +1025891
    +1025897
    +1025909
    +1025911
    +1025917
    +1025929
    +1025939
    +1025957
    +1026029
    +1026031
    +1026037
    +1026041
    +1026043
    +1026061
    +1026073
    +1026101
    +1026119
    +1026127
    +1026139
    +1026143
    +1026167
    +1026197
    +1026199
    +1026217
    +1026227
    +1026229
    +1026251
    +1026253
    +1026257
    +1026293
    +1026299
    +1026313
    +1026331
    +1026359
    +1026371
    +1026383
    +1026391
    +1026401
    +1026407
    +1026413
    +1026427
    +1026439
    +1026449
    +1026457
    +1026479
    +1026481
    +1026521
    +1026547
    +1026563
    +1026577
    +1026581
    +1026583
    +1026587
    +1026593
    +1026661
    +1026667
    +1026673
    +1026677
    +1026679
    +1026709
    +1026733
    +1026757
    +1026761
    +1026791
    +1026799
    +1026811
    +1026829
    +1026833
    +1026847
    +1026853
    +1026859
    +1026887
    +1026899
    +1026911
    +1026913
    +1026917
    +1026941
    +1026943
    +1026947
    +1026979
    +1026989
    +1027001
    +1027003
    +1027027
    +1027031
    +1027051
    +1027067
    +1027097
    +1027127
    +1027129
    +1027139
    +1027153
    +1027163
    +1027181
    +1027189
    +1027199
    +1027207
    +1027211
    +1027223
    +1027241
    +1027261
    +1027277
    +1027289
    +1027319
    +1027321
    +1027331
    +1027357
    +1027391
    +1027409
    +1027417
    +1027421
    +1027427
    +1027459
    +1027471
    +1027483
    +1027487
    +1027489
    +1027493
    +1027519
    +1027547
    +1027549
    +1027567
    +1027591
    +1027597
    +1027613
    +1027643
    +1027679
    +1027687
    +1027693
    +1027703
    +1027717
    +1027727
    +1027739
    +1027751
    +1027753
    +1027757
    +1027759
    +1027777
    +1027783
    +1027787
    +1027799
    +1027841
    +1027853
    +1027883
    +1027891
    +1027931
    +1027969
    +1027987
    +1028003
    +1028011
    +1028017
    +1028023
    +1028029
    +1028047
    +1028051
    +1028063
    +1028081
    +1028089
    +1028099
    +1028101
    +1028107
    +1028113
    +1028117
    +1028129
    +1028141
    +1028149
    +1028189
    +1028191
    +1028201
    +1028207
    +1028213
    +1028221
    +1028231
    +1028243
    +1028263
    +1028273
    +1028303
    +1028309
    +1028317
    +1028327
    +1028329
    +1028333
    +1028389
    +1028393
    +1028411
    +1028437
    +1028471
    +1028473
    +1028479
    +1028509
    +1028557
    +1028561
    +1028569
    +1028579
    +1028581
    +1028597
    +1028617
    +1028647
    +1028663
    +1028669
    +1028681
    +1028683
    +1028737
    +1028747
    +1028749
    +1028761
    +1028773
    +1028777
    +1028803
    +1028809
    +1028837
    +1028843
    +1028873
    +1028893
    +1028903
    +1028939
    +1028941
    +1028953
    +1028957
    +1028969
    +1028981
    +1028999
    +1029001
    +1029013
    +1029023
    +1029037
    +1029103
    +1029109
    +1029113
    +1029139
    +1029151
    +1029157
    +1029167
    +1029179
    +1029191
    +1029199
    +1029209
    +1029247
    +1029251
    +1029263
    +1029277
    +1029289
    +1029307
    +1029323
    +1029331
    +1029337
    +1029341
    +1029349
    +1029359
    +1029361
    +1029383
    +1029403
    +1029407
    +1029409
    +1029433
    +1029467
    +1029473
    +1029481
    +1029487
    +1029499
    +1029517
    +1029521
    +1029527
    +1029533
    +1029547
    +1029563
    +1029569
    +1029577
    +1029583
    +1029593
    +1029601
    +1029617
    +1029643
    +1029647
    +1029653
    +1029689
    +1029697
    +1029731
    +1029751
    +1029757
    +1029767
    +1029803
    +1029823
    +1029827
    +1029839
    +1029841
    +1029859
    +1029881
    +1029883
    +1029907
    +1029929
    +1029937
    +1029943
    +1029953
    +1029967
    +1029983
    +1029989
    +1030019
    +1030021
    +1030027
    +1030031
    +1030033
    +1030039
    +1030049
    +1030061
    +1030067
    +1030069
    +1030091
    +1030111
    +1030121
    +1030153
    +1030157
    +1030181
    +1030201
    +1030213
    +1030219
    +1030241
    +1030247
    +1030291
    +1030297
    +1030307
    +1030349
    +1030357
    +1030361
    +1030369
    +1030411
    +1030417
    +1030429
    +1030439
    +1030441
    +1030451
    +1030493
    +1030511
    +1030529
    +1030537
    +1030543
    +1030571
    +1030583
    +1030619
    +1030637
    +1030639
    +1030643
    +1030681
    +1030703
    +1030723
    +1030739
    +1030741
    +1030751
    +1030759
    +1030763
    +1030787
    +1030793
    +1030801
    +1030811
    +1030817
    +1030823
    +1030831
    +1030847
    +1030867
    +1030873
    +1030889
    +1030919
    +1030933
    +1030949
    +1030951
    +1030957
    +1030987
    +1030993
    +1031003
    +1031047
    +1031053
    +1031057
    +1031081
    +1031117
    +1031119
    +1031137
    +1031141
    +1031161
    +1031189
    +1031231
    +1031267
    +1031279
    +1031281
    +1031291
    +1031299
    +1031309
    +1031323
    +1031347
    +1031357
    +1031399
    +1031411
    +1031413
    +1031423
    +1031431
    +1031447
    +1031461
    +1031477
    +1031479
    +1031483
    +1031489
    +1031507
    +1031521
    +1031531
    +1031533
    +1031549
    +1031561
    +1031593
    +1031609
    +1031623
    +1031629
    +1031633
    +1031669
    +1031677
    +1031707
    +1031717
    +1031729
    +1031731
    +1031741
    +1031753
    +1031759
    +1031761
    +1031809
    +1031813
    +1031831
    +1031837
    +1031869
    +1031911
    +1031923
    +1031981
    +1031999
    +1032007
    +1032047
    +1032049
    +1032067
    +1032071
    +1032107
    +1032131
    +1032151
    +1032191
    +1032193
    +1032211
    +1032221
    +1032233
    +1032259
    +1032287
    +1032299
    +1032307
    +1032319
    +1032329
    +1032341
    +1032347
    +1032349
    +1032373
    +1032377
    +1032391
    +1032397
    +1032407
    +1032419
    +1032433
    +1032457
    +1032463
    +1032467
    +1032491
    +1032497
    +1032509
    +1032511
    +1032527
    +1032541
    +1032571
    +1032583
    +1032601
    +1032607
    +1032613
    +1032617
    +1032643
    +1032649
    +1032679
    +1032683
    +1032697
    +1032701
    +1032709
    +1032721
    +1032727
    +1032739
    +1032751
    +1032763
    +1032793
    +1032799
    +1032803
    +1032833
    +1032839
    +1032841
    +1032847
    +1032851
    +1032853
    +1032881
    +1032887
    +1032901
    +1032943
    +1032949
    +1032959
    +1032961
    +1033001
    +1033007
    +1033027
    +1033033
    +1033037
    +1033057
    +1033061
    +1033063
    +1033069
    +1033079
    +1033099
    +1033127
    +1033139
    +1033171
    +1033181
    +1033189
    +1033223
    +1033271
    +1033273
    +1033289
    +1033297
    +1033303
    +1033309
    +1033313
    +1033337
    +1033339
    +1033343
    +1033349
    +1033363
    +1033369
    +1033381
    +1033387
    +1033393
    +1033421
    +1033423
    +1033427
    +1033441
    +1033451
    +1033457
    +1033463
    +1033469
    +1033489
    +1033493
    +1033499
    +1033507
    +1033517
    +1033537
    +1033541
    +1033559
    +1033567
    +1033601
    +1033603
    +1033631
    +1033661
    +1033663
    +1033667
    +1033679
    +1033687
    +1033693
    +1033741
    +1033751
    +1033759
    +1033777
    +1033783
    +1033789
    +1033793
    +1033801
    +1033807
    +1033829
    +1033841
    +1033843
    +1033867
    +1033927
    +1033951
    +1033987
    +1034003
    +1034009
    +1034027
    +1034029
    +1034069
    +1034071
    +1034101
    +1034119
    +1034123
    +1034147
    +1034167
    +1034171
    +1034177
    +1034183
    +1034197
    +1034207
    +1034219
    +1034221
    +1034233
    +1034237
    +1034239
    +1034249
    +1034251
    +1034281
    +1034309
    +1034317
    +1034323
    +1034339
    +1034353
    +1034357
    +1034359
    +1034381
    +1034387
    +1034419
    +1034443
    +1034461
    +1034477
    +1034479
    +1034489
    +1034491
    +1034503
    +1034513
    +1034549
    +1034567
    +1034581
    +1034591
    +1034597
    +1034599
    +1034617
    +1034639
    +1034651
    +1034653
    +1034659
    +1034707
    +1034729
    +1034731
    +1034767
    +1034771
    +1034783
    +1034791
    +1034809
    +1034827
    +1034833
    +1034837
    +1034849
    +1034857
    +1034861
    +1034863
    +1034867
    +1034879
    +1034903
    +1034941
    +1034951
    +1034953
    +1034959
    +1034983
    +1034989
    +1034993
    +1035007
    +1035019
    +1035043
    +1035061
    +1035077
    +1035107
    +1035131
    +1035163
    +1035187
    +1035191
    +1035197
    +1035211
    +1035241
    +1035247
    +1035257
    +1035263
    +1035277
    +1035301
    +1035313
    +1035323
    +1035341
    +1035343
    +1035361
    +1035379
    +1035383
    +1035403
    +1035409
    +1035413
    +1035427
    +1035449
    +1035451
    +1035467
    +1035469
    +1035473
    +1035479
    +1035499
    +1035527
    +1035533
    +1035547
    +1035563
    +1035571
    +1035581
    +1035599
    +1035607
    +1035613
    +1035631
    +1035637
    +1035641
    +1035649
    +1035659
    +1035707
    +1035733
    +1035743
    +1035761
    +1035763
    +1035781
    +1035791
    +1035829
    +1035869
    +1035893
    +1035917
    +1035949
    +1035953
    +1035959
    +1035973
    +1035977
    +1036001
    +1036003
    +1036027
    +1036039
    +1036067
    +1036069
    +1036073
    +1036093
    +1036109
    +1036117
    +1036121
    +1036129
    +1036153
    +1036163
    +1036183
    +1036213
    +1036223
    +1036229
    +1036247
    +1036249
    +1036253
    +1036261
    +1036267
    +1036271
    +1036291
    +1036297
    +1036307
    +1036319
    +1036327
    +1036331
    +1036339
    +1036349
    +1036351
    +1036363
    +1036367
    +1036369
    +1036391
    +1036411
    +1036459
    +1036471
    +1036493
    +1036499
    +1036513
    +1036531
    +1036537
    +1036561
    +1036579
    +1036613
    +1036619
    +1036631
    +1036649
    +1036661
    +1036667
    +1036669
    +1036681
    +1036729
    +1036747
    +1036751
    +1036757
    +1036759
    +1036769
    +1036787
    +1036793
    +1036799
    +1036829
    +1036831
    +1036853
    +1036873
    +1036877
    +1036883
    +1036913
    +1036921
    +1036943
    +1036951
    +1036957
    +1036979
    +1036991
    +1036993
    +1037041
    +1037053
    +1037059
    +1037081
    +1037087
    +1037089
    +1037123
    +1037129
    +1037137
    +1037143
    +1037213
    +1037233
    +1037249
    +1037261
    +1037273
    +1037293
    +1037297
    +1037303
    +1037317
    +1037327
    +1037329
    +1037339
    +1037347
    +1037401
    +1037411
    +1037437
    +1037441
    +1037447
    +1037471
    +1037479
    +1037489
    +1037497
    +1037503
    +1037537
    +1037557
    +1037563
    +1037567
    +1037593
    +1037611
    +1037627
    +1037653
    +1037657
    +1037677
    +1037681
    +1037683
    +1037741
    +1037747
    +1037753
    +1037759
    +1037767
    +1037791
    +1037801
    +1037819
    +1037831
    +1037857
    +1037873
    +1037879
    +1037893
    +1037903
    +1037917
    +1037929
    +1037941
    +1037957
    +1037963
    +1037983
    +1038001
    +1038017
    +1038019
    +1038029
    +1038041
    +1038043
    +1038047
    +1038073
    +1038077
    +1038119
    +1038127
    +1038143
    +1038157
    +1038187
    +1038199
    +1038203
    +1038209
    +1038211
    +1038227
    +1038251
    +1038253
    +1038259
    +1038263
    +1038269
    +1038307
    +1038311
    +1038319
    +1038329
    +1038337
    +1038383
    +1038391
    +1038409
    +1038421
    +1038449
    +1038463
    +1038487
    +1038497
    +1038503
    +1038523
    +1038529
    +1038539
    +1038563
    +1038589
    +1038599
    +1038601
    +1038617
    +1038619
    +1038623
    +1038629
    +1038637
    +1038643
    +1038671
    +1038689
    +1038691
    +1038707
    +1038721
    +1038727
    +1038731
    +1038757
    +1038797
    +1038803
    +1038811
    +1038823
    +1038827
    +1038833
    +1038881
    +1038913
    +1038937
    +1038941
    +1038953
    +1039001
    +1039007
    +1039021
    +1039033
    +1039037
    +1039039
    +1039043
    +1039067
    +1039069
    +1039081
    +1039109
    +1039111
    +1039127
    +1039139
    +1039153
    +1039169
    +1039187
    +1039229
    +1039249
    +1039279
    +1039289
    +1039307
    +1039321
    +1039327
    +1039343
    +1039349
    +1039351
    +1039387
    +1039421
    +1039427
    +1039429
    +1039463
    +1039469
    +1039477
    +1039481
    +1039513
    +1039517
    +1039537
    +1039543
    +1039553
    +1039603
    +1039607
    +1039631
    +1039651
    +1039657
    +1039667
    +1039681
    +1039733
    +1039763
    +1039769
    +1039789
    +1039799
    +1039817
    +1039823
    +1039837
    +1039891
    +1039897
    +1039901
    +1039921
    +1039931
    +1039943
    +1039949
    +1039979
    +1039999
    +1040021
    +1040029
    +1040051
    +1040057
    +1040059
    +1040069
    +1040071
    +1040089
    +1040093
    +1040101
    +1040113
    +1040119
    +1040141
    +1040153
    +1040159
    +1040161
    +1040167
    +1040183
    +1040189
    +1040191
    +1040203
    +1040219
    +1040227
    +1040311
    +1040327
    +1040339
    +1040353
    +1040371
    +1040381
    +1040387
    +1040407
    +1040411
    +1040419
    +1040447
    +1040449
    +1040483
    +1040489
    +1040503
    +1040521
    +1040531
    +1040563
    +1040579
    +1040581
    +1040597
    +1040629
    +1040651
    +1040657
    +1040659
    +1040671
    +1040717
    +1040731
    +1040747
    +1040749
    +1040771
    +1040777
    +1040779
    +1040783
    +1040797
    +1040803
    +1040807
    +1040813
    +1040821
    +1040827
    +1040833
    +1040857
    +1040861
    +1040873
    +1040881
    +1040891
    +1040899
    +1040929
    +1040939
    +1040947
    +1040951
    +1040959
    +1040981
    +1040989
    +1041041
    +1041077
    +1041083
    +1041091
    +1041109
    +1041119
    +1041121
    +1041127
    +1041137
    +1041149
    +1041151
    +1041163
    +1041167
    +1041169
    +1041203
    +1041221
    +1041223
    +1041239
    +1041241
    +1041253
    +1041269
    +1041281
    +1041283
    +1041289
    +1041307
    +1041311
    +1041317
    +1041329
    +1041343
    +1041349
    +1041373
    +1041421
    +1041427
    +1041449
    +1041451
    +1041461
    +1041497
    +1041511
    +1041517
    +1041529
    +1041553
    +1041559
    +1041563
    +1041571
    +1041577
    +1041583
    +1041617
    +1041619
    +1041643
    +1041653
    +1041671
    +1041673
    +1041701
    +1041731
    +1041737
    +1041757
    +1041779
    +1041787
    +1041793
    +1041823
    +1041829
    +1041841
    +1041853
    +1041857
    +1041863
    +1041869
    +1041889
    +1041893
    +1041907
    +1041919
    +1041949
    +1041961
    +1041983
    +1041991
    +1042001
    +1042021
    +1042039
    +1042043
    +1042081
    +1042087
    +1042091
    +1042099
    +1042103
    +1042109
    +1042121
    +1042123
    +1042133
    +1042141
    +1042183
    +1042187
    +1042193
    +1042211
    +1042241
    +1042243
    +1042259
    +1042267
    +1042271
    +1042273
    +1042309
    +1042331
    +1042333
    +1042357
    +1042369
    +1042373
    +1042381
    +1042399
    +1042427
    +1042439
    +1042451
    +1042469
    +1042487
    +1042519
    +1042523
    +1042529
    +1042571
    +1042577
    +1042583
    +1042597
    +1042607
    +1042609
    +1042619
    +1042631
    +1042633
    +1042681
    +1042687
    +1042693
    +1042703
    +1042709
    +1042733
    +1042759
    +1042781
    +1042799
    +1042819
    +1042829
    +1042837
    +1042849
    +1042861
    +1042897
    +1042901
    +1042903
    +1042931
    +1042949
    +1042961
    +1042997
    +1043011
    +1043023
    +1043047
    +1043083
    +1043089
    +1043111
    +1043113
    +1043117
    +1043131
    +1043167
    +1043173
    +1043177
    +1043183
    +1043191
    +1043201
    +1043209
    +1043213
    +1043221
    +1043279
    +1043291
    +1043293
    +1043299
    +1043311
    +1043323
    +1043351
    +1043369
    +1043377
    +1043401
    +1043453
    +1043467
    +1043479
    +1043489
    +1043501
    +1043513
    +1043521
    +1043531
    +1043543
    +1043557
    +1043587
    +1043591
    +1043593
    +1043597
    +1043599
    +1043617
    +1043639
    +1043657
    +1043663
    +1043683
    +1043701
    +1043723
    +1043743
    +1043747
    +1043753
    +1043759
    +1043761
    +1043767
    +1043773
    +1043831
    +1043837
    +1043839
    +1043843
    +1043849
    +1043857
    +1043869
    +1043873
    +1043897
    +1043899
    +1043921
    +1043923
    +1043929
    +1043951
    +1043969
    +1043981
    +1044019
    +1044023
    +1044041
    +1044053
    +1044079
    +1044091
    +1044097
    +1044133
    +1044139
    +1044149
    +1044161
    +1044167
    +1044179
    +1044181
    +1044187
    +1044193
    +1044209
    +1044217
    +1044227
    +1044247
    +1044257
    +1044271
    +1044283
    +1044287
    +1044289
    +1044299
    +1044343
    +1044347
    +1044353
    +1044367
    +1044371
    +1044383
    +1044391
    +1044397
    +1044409
    +1044437
    +1044443
    +1044451
    +1044457
    +1044479
    +1044509
    +1044517
    +1044529
    +1044559
    +1044569
    +1044583
    +1044587
    +1044613
    +1044619
    +1044629
    +1044653
    +1044689
    +1044697
    +1044727
    +1044733
    +1044737
    +1044739
    +1044749
    +1044751
    +1044761
    +1044767
    +1044779
    +1044781
    +1044809
    +1044811
    +1044833
    +1044839
    +1044847
    +1044851
    +1044859
    +1044877
    +1044889
    +1044893
    +1044931
    +1044941
    +1044971
    +1044997
    +1045003
    +1045013
    +1045021
    +1045027
    +1045043
    +1045061
    +1045063
    +1045081
    +1045111
    +1045117
    +1045123
    +1045129
    +1045151
    +1045153
    +1045157
    +1045183
    +1045193
    +1045199
    +1045223
    +1045229
    +1045237
    +1045241
    +1045273
    +1045277
    +1045307
    +1045309
    +1045321
    +1045349
    +1045367
    +1045391
    +1045393
    +1045397
    +1045409
    +1045411
    +1045423
    +1045427
    +1045469
    +1045487
    +1045493
    +1045507
    +1045523
    +1045529
    +1045543
    +1045547
    +1045549
    +1045559
    +1045571
    +1045573
    +1045607
    +1045621
    +1045633
    +1045643
    +1045651
    +1045663
    +1045679
    +1045691
    +1045727
    +1045729
    +1045739
    +1045763
    +1045799
    +1045801
    +1045819
    +1045829
    +1045841
    +1045859
    +1045903
    +1045907
    +1045963
    +1045981
    +1045987
    +1045997
    +1046029
    +1046047
    +1046051
    +1046053
    +1046069
    +1046077
    +1046081
    +1046113
    +1046119
    +1046179
    +1046183
    +1046189
    +1046191
    +1046203
    +1046207
    +1046237
    +1046239
    +1046257
    +1046263
    +1046329
    +1046347
    +1046351
    +1046369
    +1046371
    +1046389
    +1046393
    +1046399
    +1046413
    +1046447
    +1046449
    +1046459
    +1046497
    +1046519
    +1046527
    +1046557
    +1046579
    +1046587
    +1046597
    +1046599
    +1046627
    +1046641
    +1046657
    +1046659
    +1046677
    +1046681
    +1046687
    +1046701
    +1046711
    +1046779
    +1046791
    +1046797
    +1046807
    +1046827
    +1046833
    +1046849
    +1046863
    +1046867
    +1046897
    +1046917
    +1046933
    +1046951
    +1046959
    +1046977
    +1046993
    +1046999
    +1047031
    +1047041
    +1047043
    +1047061
    +1047077
    +1047089
    +1047097
    +1047107
    +1047119
    +1047127
    +1047131
    +1047133
    +1047139
    +1047157
    +1047173
    +1047197
    +1047199
    +1047229
    +1047239
    +1047247
    +1047271
    +1047281
    +1047283
    +1047289
    +1047307
    +1047311
    +1047313
    +1047317
    +1047323
    +1047341
    +1047367
    +1047373
    +1047379
    +1047391
    +1047419
    +1047467
    +1047469
    +1047479
    +1047491
    +1047499
    +1047511
    +1047533
    +1047539
    +1047551
    +1047559
    +1047587
    +1047589
    +1047647
    +1047649
    +1047653
    +1047667
    +1047671
    +1047689
    +1047691
    +1047701
    +1047703
    +1047713
    +1047721
    +1047737
    +1047751
    +1047763
    +1047773
    +1047779
    +1047821
    +1047833
    +1047841
    +1047859
    +1047881
    +1047883
    +1047887
    +1047923
    +1047929
    +1047941
    +1047961
    +1047971
    +1047979
    +1047989
    +1047997
    +1048007
    +1048009
    +1048013
    +1048027
    +1048043
    +1048049
    +1048051
    +1048063
    +1048123
    +1048127
    +1048129
    +1048139
    +1048189
    +1048193
    +1048213
    +1048217
    +1048219
    +1048261
    +1048273
    +1048291
    +1048309
    +1048343
    +1048357
    +1048361
    +1048367
    +1048387
    +1048391
    +1048423
    +1048433
    +1048447
    +1048507
    +1048517
    +1048549
    +1048559
    +1048571
    +1048573
    +1048583
    +1048589
    +1048601
    +1048609
    +1048613
    +1048627
    +1048633
    +1048661
    +1048681
    +1048703
    +1048709
    +1048717
    +1048721
    +1048759
    +1048783
    +1048793
    +1048799
    +1048807
    +1048829
    +1048837
    +1048847
    +1048867
    +1048877
    +1048889
    +1048891
    +1048897
    +1048909
    +1048919
    +1048963
    +1048991
    +1049011
    +1049023
    +1049039
    +1049051
    +1049057
    +1049063
    +1049077
    +1049089
    +1049093
    +1049101
    +1049117
    +1049129
    +1049131
    +1049137
    +1049141
    +1049143
    +1049171
    +1049173
    +1049177
    +1049183
    +1049201
    +1049219
    +1049227
    +1049239
    +1049263
    +1049281
    +1049297
    +1049333
    +1049339
    +1049387
    +1049413
    +1049429
    +1049437
    +1049459
    +1049471
    +1049473
    +1049479
    +1049483
    +1049497
    +1049509
    +1049519
    +1049527
    +1049533
    +1049537
    +1049549
    +1049569
    +1049599
    +1049603
    +1049611
    +1049623
    +1049639
    +1049663
    +1049677
    +1049681
    +1049683
    +1049687
    +1049707
    +1049717
    +1049747
    +1049773
    +1049791
    +1049809
    +1049821
    +1049827
    +1049833
    +1049837
    +1049843
    +1049849
    +1049857
    +1049861
    +1049863
    +1049891
    +1049897
    +1049899
    +1049941
    +1049953
    +1049963
    +1049977
    +1049999
    +1050011
    +1050013
    +1050031
    +1050041
    +1050053
    +1050079
    +1050083
    +1050139
    +1050151
    +1050167
    +1050169
    +1050191
    +1050197
    +1050229
    +1050233
    +1050239
    +1050241
    +1050253
    +1050281
    +1050307
    +1050317
    +1050323
    +1050331
    +1050337
    +1050349
    +1050367
    +1050391
    +1050421
    +1050431
    +1050437
    +1050449
    +1050451
    +1050457
    +1050473
    +1050503
    +1050509
    +1050523
    +1050563
    +1050593
    +1050611
    +1050631
    +1050713
    +1050727
    +1050733
    +1050737
    +1050739
    +1050743
    +1050769
    +1050773
    +1050781
    +1050811
    +1050817
    +1050851
    +1050853
    +1050887
    +1050899
    +1050901
    +1050913
    +1050949
    +1050961
    +1050977
    +1050997
    +1051003
    +1051007
    +1051009
    +1051019
    +1051027
    +1051051
    +1051069
    +1051079
    +1051081
    +1051139
    +1051147
    +1051151
    +1051153
    +1051157
    +1051177
    +1051181
    +1051247
    +1051277
    +1051283
    +1051291
    +1051301
    +1051313
    +1051319
    +1051333
    +1051373
    +1051397
    +1051409
    +1051417
    +1051423
    +1051459
    +1051469
    +1051471
    +1051481
    +1051499
    +1051507
    +1051543
    +1051549
    +1051553
    +1051559
    +1051571
    +1051591
    +1051601
    +1051607
    +1051619
    +1051621
    +1051639
    +1051643
    +1051649
    +1051663
    +1051697
    +1051709
    +1051717
    +1051747
    +1051759
    +1051763
    +1051781
    +1051789
    +1051811
    +1051819
    +1051829
    +1051847
    +1051849
    +1051879
    +1051889
    +1051903
    +1051913
    +1051927
    +1051949
    +1051957
    +1051961
    +1051979
    +1051987
    +1051991
    +1052027
    +1052039
    +1052041
    +1052063
    +1052083
    +1052099
    +1052111
    +1052119
    +1052137
    +1052141
    +1052179
    +1052197
    +1052203
    +1052221
    +1052231
    +1052237
    +1052269
    +1052279
    +1052281
    +1052287
    +1052299
    +1052309
    +1052321
    +1052327
    +1052329
    +1052333
    +1052413
    +1052417
    +1052431
    +1052437
    +1052459
    +1052473
    +1052479
    +1052489
    +1052531
    +1052533
    +1052537
    +1052551
    +1052561
    +1052563
    +1052567
    +1052573
    +1052609
    +1052629
    +1052663
    +1052693
    +1052707
    +1052719
    +1052731
    +1052743
    +1052747
    +1052767
    +1052797
    +1052801
    +1052803
    +1052813
    +1052819
    +1052851
    +1052873
    +1052881
    +1052893
    +1052897
    +1052899
    +1052939
    +1052971
    +1052981
    +1052993
    +1053007
    +1053029
    +1053061
    +1053067
    +1053071
    +1053079
    +1053083
    +1053089
    +1053097
    +1053103
    +1053179
    +1053181
    +1053191
    +1053197
    +1053233
    +1053257
    +1053259
    +1053263
    +1053271
    +1053293
    +1053301
    +1053319
    +1053347
    +1053361
    +1053383
    +1053401
    +1053407
    +1053421
    +1053449
    +1053461
    +1053467
    +1053487
    +1053491
    +1053497
    +1053509
    +1053511
    +1053529
    +1053539
    +1053551
    +1053557
    +1053571
    +1053581
    +1053583
    +1053589
    +1053593
    +1053617
    +1053691
    +1053697
    +1053707
    +1053713
    +1053727
    +1053737
    +1053739
    +1053749
    +1053757
    +1053769
    +1053809
    +1053817
    +1053821
    +1053827
    +1053863
    +1053953
    +1053959
    +1053967
    +1053971
    +1053989
    +1053991
    +1054003
    +1054007
    +1054013
    +1054033
    +1054043
    +1054049
    +1054061
    +1054073
    +1054091
    +1054133
    +1054169
    +1054171
    +1054181
    +1054189
    +1054199
    +1054201
    +1054213
    +1054219
    +1054243
    +1054247
    +1054259
    +1054267
    +1054301
    +1054303
    +1054309
    +1054321
    +1054327
    +1054331
    +1054337
    +1054363
    +1054369
    +1054373
    +1054381
    +1054393
    +1054423
    +1054429
    +1054439
    +1054441
    +1054457
    +1054477
    +1054483
    +1054517
    +1054523
    +1054531
    +1054549
    +1054577
    +1054583
    +1054597
    +1054607
    +1054609
    +1054621
    +1054639
    +1054649
    +1054667
    +1054673
    +1054679
    +1054717
    +1054721
    +1054723
    +1054733
    +1054769
    +1054813
    +1054819
    +1054831
    +1054843
    +1054853
    +1054903
    +1054909
    +1054927
    +1054931
    +1054951
    +1054957
    +1054993
    +1055017
    +1055039
    +1055057
    +1055063
    +1055077
    +1055083
    +1055113
    +1055137
    +1055141
    +1055143
    +1055167
    +1055189
    +1055191
    +1055231
    +1055233
    +1055251
    +1055261
    +1055267
    +1055269
    +1055303
    +1055321
    +1055347
    +1055359
    +1055363
    +1055371
    +1055387
    +1055399
    +1055407
    +1055413
    +1055423
    +1055429
    +1055437
    +1055471
    +1055489
    +1055501
    +1055503
    +1055531
    +1055543
    +1055567
    +1055591
    +1055597
    +1055603
    +1055609
    +1055611
    +1055671
    +1055689
    +1055713
    +1055731
    +1055737
    +1055741
    +1055771
    +1055783
    +1055801
    +1055809
    +1055827
    +1055839
    +1055851
    +1055863
    +1055867
    +1055881
    +1055893
    +1055897
    +1055911
    +1055917
    +1055933
    +1055939
    +1055947
    +1055959
    +1055969
    +1055981
    +1056007
    +1056019
    +1056047
    +1056049
    +1056053
    +1056061
    +1056071
    +1056073
    +1056089
    +1056109
    +1056113
    +1056149
    +1056161
    +1056169
    +1056173
    +1056179
    +1056203
    +1056217
    +1056241
    +1056247
    +1056269
    +1056271
    +1056281
    +1056287
    +1056311
    +1056317
    +1056323
    +1056347
    +1056353
    +1056361
    +1056371
    +1056373
    +1056379
    +1056401
    +1056443
    +1056463
    +1056469
    +1056479
    +1056481
    +1056493
    +1056509
    +1056521
    +1056541
    +1056563
    +1056569
    +1056577
    +1056589
    +1056599
    +1056613
    +1056617
    +1056623
    +1056641
    +1056659
    +1056667
    +1056707
    +1056719
    +1056721
    +1056739
    +1056773
    +1056779
    +1056793
    +1056823
    +1056829
    +1056833
    +1056863
    +1056871
    +1056893
    +1056911
    +1056917
    +1056929
    +1056949
    +1056959
    +1056971
    +1057003
    +1057013
    +1057019
    +1057033
    +1057037
    +1057051
    +1057087
    +1057093
    +1057117
    +1057129
    +1057157
    +1057163
    +1057181
    +1057183
    +1057219
    +1057223
    +1057237
    +1057249
    +1057271
    +1057279
    +1057291
    +1057307
    +1057361
    +1057367
    +1057387
    +1057391
    +1057393
    +1057411
    +1057421
    +1057477
    +1057487
    +1057489
    +1057493
    +1057531
    +1057541
    +1057561
    +1057577
    +1057579
    +1057603
    +1057607
    +1057613
    +1057631
    +1057633
    +1057643
    +1057657
    +1057663
    +1057681
    +1057699
    +1057703
    +1057739
    +1057741
    +1057753
    +1057781
    +1057807
    +1057831
    +1057853
    +1057879
    +1057883
    +1057897
    +1057907
    +1057919
    +1057951
    +1057957
    +1057963
    +1057981
    +1057993
    +1058009
    +1058011
    +1058021
    +1058027
    +1058041
    +1058059
    +1058077
    +1058093
    +1058107
    +1058117
    +1058143
    +1058147
    +1058149
    +1058153
    +1058171
    +1058179
    +1058203
    +1058221
    +1058227
    +1058249
    +1058257
    +1058263
    +1058287
    +1058303
    +1058329
    +1058339
    +1058341
    +1058353
    +1058377
    +1058381
    +1058383
    +1058389
    +1058419
    +1058423
    +1058443
    +1058461
    +1058479
    +1058489
    +1058503
    +1058507
    +1058543
    +1058549
    +1058567
    +1058591
    +1058593
    +1058597
    +1058627
    +1058639
    +1058653
    +1058657
    +1058663
    +1058671
    +1058677
    +1058683
    +1058693
    +1058711
    +1058723
    +1058731
    +1058747
    +1058749
    +1058753
    +1058767
    +1058773
    +1058779
    +1058791
    +1058803
    +1058807
    +1058809
    +1058821
    +1058839
    +1058861
    +1058891
    +1058921
    +1058951
    +1058983
    +1058999
    +1059001
    +1059007
    +1059017
    +1059029
    +1059059
    +1059061
    +1059067
    +1059073
    +1059077
    +1059103
    +1059119
    +1059131
    +1059137
    +1059161
    +1059169
    +1059181
    +1059197
    +1059209
    +1059217
    +1059221
    +1059251
    +1059257
    +1059259
    +1059263
    +1059271
    +1059293
    +1059299
    +1059313
    +1059323
    +1059343
    +1059349
    +1059413
    +1059419
    +1059433
    +1059437
    +1059439
    +1059467
    +1059479
    +1059503
    +1059511
    +1059517
    +1059547
    +1059557
    +1059571
    +1059599
    +1059613
    +1059637
    +1059647
    +1059671
    +1059683
    +1059697
    +1059701
    +1059703
    +1059713
    +1059733
    +1059743
    +1059749
    +1059757
    +1059769
    +1059787
    +1059823
    +1059833
    +1059847
    +1059857
    +1059871
    +1059889
    +1059893
    +1059923
    +1059931
    +1059937
    +1059941
    +1060009
    +1060019
    +1060021
    +1060039
    +1060043
    +1060051
    +1060061
    +1060091
    +1060097
    +1060123
    +1060133
    +1060151
    +1060177
    +1060187
    +1060201
    +1060207
    +1060223
    +1060229
    +1060237
    +1060249
    +1060253
    +1060271
    +1060303
    +1060313
    +1060321
    +1060343
    +1060349
    +1060351
    +1060357
    +1060361
    +1060373
    +1060379
    +1060391
    +1060393
    +1060403
    +1060421
    +1060427
    +1060441
    +1060453
    +1060463
    +1060469
    +1060481
    +1060487
    +1060513
    +1060519
    +1060529
    +1060567
    +1060571
    +1060573
    +1060589
    +1060597
    +1060621
    +1060673
    +1060687
    +1060721
    +1060723
    +1060739
    +1060747
    +1060769
    +1060777
    +1060781
    +1060861
    +1060867
    +1060883
    +1060937
    +1060949
    +1060963
    +1060981
    +1060991
    +1060993
    +1061033
    +1061057
    +1061069
    +1061087
    +1061101
    +1061107
    +1061117
    +1061129
    +1061141
    +1061143
    +1061149
    +1061171
    +1061189
    +1061227
    +1061251
    +1061261
    +1061273
    +1061279
    +1061287
    +1061297
    +1061311
    +1061317
    +1061323
    +1061353
    +1061363
    +1061377
    +1061393
    +1061407
    +1061413
    +1061441
    +1061453
    +1061483
    +1061509
    +1061513
    +1061527
    +1061561
    +1061569
    +1061573
    +1061591
    +1061597
    +1061609
    +1061617
    +1061623
    +1061629
    +1061647
    +1061651
    +1061677
    +1061689
    +1061699
    +1061707
    +1061717
    +1061729
    +1061737
    +1061759
    +1061771
    +1061773
    +1061779
    +1061783
    +1061807
    +1061831
    +1061849
    +1061867
    +1061869
    +1061881
    +1061897
    +1061903
    +1061909
    +1061911
    +1061917
    +1061959
    +1061969
    +1061993
    +1062001
    +1062013
    +1062031
    +1062073
    +1062107
    +1062121
    +1062169
    +1062197
    +1062203
    +1062251
    +1062253
    +1062263
    +1062293
    +1062311
    +1062343
    +1062349
    +1062361
    +1062367
    +1062379
    +1062407
    +1062409
    +1062427
    +1062443
    +1062469
    +1062497
    +1062511
    +1062521
    +1062547
    +1062557
    +1062563
    +1062599
    +1062601
    +1062643
    +1062671
    +1062673
    +1062683
    +1062697
    +1062701
    +1062707
    +1062731
    +1062779
    +1062781
    +1062793
    +1062797
    +1062827
    +1062847
    +1062869
    +1062871
    +1062877
    +1062881
    +1062907
    +1062911
    +1062913
    +1062931
    +1062947
    +1062949
    +1062977
    +1062979
    +1062989
    +1063001
    +1063009
    +1063019
    +1063033
    +1063039
    +1063043
    +1063067
    +1063079
    +1063087
    +1063109
    +1063123
    +1063151
    +1063157
    +1063159
    +1063177
    +1063189
    +1063193
    +1063201
    +1063213
    +1063219
    +1063241
    +1063243
    +1063273
    +1063303
    +1063319
    +1063351
    +1063379
    +1063397
    +1063399
    +1063409
    +1063427
    +1063441
    +1063453
    +1063457
    +1063463
    +1063471
    +1063477
    +1063483
    +1063501
    +1063523
    +1063529
    +1063541
    +1063547
    +1063553
    +1063561
    +1063597
    +1063609
    +1063613
    +1063619
    +1063627
    +1063637
    +1063649
    +1063661
    +1063693
    +1063709
    +1063721
    +1063729
    +1063739
    +1063747
    +1063757
    +1063771
    +1063781
    +1063813
    +1063823
    +1063831
    +1063837
    +1063847
    +1063849
    +1063871
    +1063873
    +1063891
    +1063897
    +1063903
    +1063913
    +1063919
    +1063921
    +1063927
    +1063961
    +1063963
    +1063967
    +1063969
    +1063973
    +1063987
    +1063999
    +1064017
    +1064029
    +1064059
    +1064069
    +1064087
    +1064117
    +1064131
    +1064153
    +1064159
    +1064177
    +1064179
    +1064191
    +1064197
    +1064201
    +1064243
    +1064257
    +1064263
    +1064269
    +1064281
    +1064311
    +1064317
    +1064321
    +1064333
    +1064339
    +1064341
    +1064359
    +1064377
    +1064383
    +1064407
    +1064411
    +1064431
    +1064467
    +1064471
    +1064473
    +1064477
    +1064507
    +1064519
    +1064521
    +1064533
    +1064549
    +1064587
    +1064593
    +1064629
    +1064653
    +1064669
    +1064671
    +1064681
    +1064689
    +1064699
    +1064731
    +1064737
    +1064743
    +1064753
    +1064771
    +1064783
    +1064801
    +1064813
    +1064867
    +1064873
    +1064911
    +1064927
    +1064933
    +1064939
    +1064941
    +1064951
    +1064953
    +1064957
    +1064977
    +1064989
    +1065011
    +1065013
    +1065017
    +1065019
    +1065037
    +1065041
    +1065047
    +1065059
    +1065073
    +1065089
    +1065091
    +1065109
    +1065131
    +1065133
    +1065137
    +1065173
    +1065209
    +1065217
    +1065263
    +1065269
    +1065277
    +1065283
    +1065307
    +1065313
    +1065319
    +1065331
    +1065343
    +1065347
    +1065391
    +1065409
    +1065433
    +1065469
    +1065479
    +1065503
    +1065511
    +1065523
    +1065527
    +1065529
    +1065557
    +1065569
    +1065593
    +1065601
    +1065629
    +1065643
    +1065667
    +1065677
    +1065683
    +1065689
    +1065697
    +1065709
    +1065733
    +1065763
    +1065773
    +1065787
    +1065791
    +1065809
    +1065817
    +1065821
    +1065829
    +1065839
    +1065847
    +1065851
    +1065887
    +1065893
    +1065899
    +1065901
    +1065937
    +1065941
    +1065949
    +1065973
    +1065979
    +1066001
    +1066031
    +1066049
    +1066063
    +1066067
    +1066111
    +1066133
    +1066139
    +1066141
    +1066157
    +1066159
    +1066217
    +1066231
    +1066237
    +1066253
    +1066267
    +1066279
    +1066283
    +1066297
    +1066313
    +1066319
    +1066327
    +1066333
    +1066339
    +1066343
    +1066367
    +1066379
    +1066399
    +1066409
    +1066411
    +1066423
    +1066433
    +1066447
    +1066511
    +1066517
    +1066523
    +1066531
    +1066553
    +1066561
    +1066567
    +1066577
    +1066619
    +1066621
    +1066643
    +1066651
    +1066669
    +1066687
    +1066693
    +1066721
    +1066729
    +1066753
    +1066757
    +1066777
    +1066789
    +1066811
    +1066817
    +1066847
    +1066859
    +1066867
    +1066883
    +1066889
    +1066909
    +1066913
    +1066931
    +1066973
    +1066979
    +1066981
    +1066987
    +1066999
    +1067009
    +1067023
    +1067029
    +1067047
    +1067057
    +1067063
    +1067069
    +1067083
    +1067137
    +1067147
    +1067159
    +1067167
    +1067179
    +1067203
    +1067207
    +1067221
    +1067239
    +1067263
    +1067293
    +1067327
    +1067329
    +1067347
    +1067351
    +1067359
    +1067371
    +1067383
    +1067387
    +1067411
    +1067441
    +1067459
    +1067467
    +1067471
    +1067489
    +1067491
    +1067497
    +1067509
    +1067537
    +1067551
    +1067557
    +1067567
    +1067569
    +1067593
    +1067597
    +1067611
    +1067621
    +1067639
    +1067653
    +1067669
    +1067687
    +1067701
    +1067707
    +1067711
    +1067741
    +1067747
    +1067749
    +1067761
    +1067767
    +1067777
    +1067789
    +1067797
    +1067831
    +1067837
    +1067849
    +1067851
    +1067879
    +1067893
    +1067903
    +1067909
    +1067921
    +1067939
    +1067951
    +1067987
    +1067999
    +1068019
    +1068037
    +1068061
    +1068083
    +1068101
    +1068103
    +1068107
    +1068113
    +1068131
    +1068149
    +1068191
    +1068203
    +1068217
    +1068233
    +1068241
    +1068247
    +1068251
    +1068253
    +1068257
    +1068259
    +1068271
    +1068307
    +1068311
    +1068323
    +1068329
    +1068343
    +1068367
    +1068371
    +1068377
    +1068383
    +1068407
    +1068409
    +1068437
    +1068439
    +1068461
    +1068469
    +1068481
    +1068491
    +1068497
    +1068499
    +1068517
    +1068559
    +1068577
    +1068589
    +1068611
    +1068619
    +1068629
    +1068631
    +1068677
    +1068701
    +1068703
    +1068707
    +1068709
    +1068713
    +1068719
    +1068721
    +1068751
    +1068757
    +1068761
    +1068779
    +1068803
    +1068811
    +1068817
    +1068857
    +1068871
    +1068877
    +1068887
    +1068889
    +1068901
    +1068913
    +1068917
    +1068941
    +1068989
    +1069001
    +1069007
    +1069031
    +1069039
    +1069043
    +1069051
    +1069087
    +1069099
    +1069127
    +1069129
    +1069141
    +1069171
    +1069183
    +1069193
    +1069199
    +1069207
    +1069217
    +1069219
    +1069223
    +1069267
    +1069273
    +1069291
    +1069303
    +1069307
    +1069349
    +1069363
    +1069379
    +1069421
    +1069427
    +1069429
    +1069441
    +1069451
    +1069459
    +1069463
    +1069499
    +1069501
    +1069507
    +1069517
    +1069543
    +1069547
    +1069553
    +1069561
    +1069571
    +1069573
    +1069577
    +1069583
    +1069591
    +1069597
    +1069603
    +1069609
    +1069631
    +1069639
    +1069667
    +1069687
    +1069693
    +1069697
    +1069727
    +1069741
    +1069751
    +1069777
    +1069807
    +1069811
    +1069819
    +1069823
    +1069853
    +1069867
    +1069919
    +1069921
    +1069927
    +1069931
    +1069933
    +1069949
    +1069951
    +1069973
    +1069979
    +1069987
    +1070009
    +1070011
    +1070021
    +1070033
    +1070039
    +1070063
    +1070081
    +1070087
    +1070093
    +1070131
    +1070149
    +1070171
    +1070189
    +1070197
    +1070203
    +1070207
    +1070221
    +1070231
    +1070233
    +1070243
    +1070249
    +1070257
    +1070287
    +1070291
    +1070309
    +1070317
    +1070323
    +1070339
    +1070341
    +1070347
    +1070357
    +1070369
    +1070389
    +1070411
    +1070417
    +1070423
    +1070429
    +1070431
    +1070453
    +1070471
    +1070491
    +1070497
    +1070501
    +1070513
    +1070527
    +1070533
    +1070543
    +1070557
    +1070561
    +1070567
    +1070569
    +1070579
    +1070621
    +1070659
    +1070681
    +1070683
    +1070689
    +1070753
    +1070761
    +1070777
    +1070789
    +1070803
    +1070827
    +1070843
    +1070851
    +1070869
    +1070873
    +1070899
    +1070921
    +1070933
    +1070939
    +1070947
    +1070981
    +1070987
    +1071023
    +1071047
    +1071053
    +1071061
    +1071067
    +1071121
    +1071131
    +1071139
    +1071149
    +1071151
    +1071157
    +1071181
    +1071193
    +1071197
    +1071223
    +1071227
    +1071229
    +1071233
    +1071241
    +1071253
    +1071269
    +1071283
    +1071311
    +1071313
    +1071337
    +1071341
    +1071349
    +1071359
    +1071373
    +1071377
    +1071379
    +1071401
    +1071407
    +1071419
    +1071439
    +1071443
    +1071451
    +1071457
    +1071479
    +1071487
    +1071529
    +1071533
    +1071541
    +1071563
    +1071569
    +1071571
    +1071589
    +1071601
    +1071641
    +1071643
    +1071659
    +1071661
    +1071671
    +1071683
    +1071703
    +1071739
    +1071743
    +1071761
    +1071773
    +1071787
    +1071803
    +1071817
    +1071821
    +1071841
    +1071857
    +1071871
    +1071899
    +1071907
    +1071911
    +1071919
    +1071937
    +1071943
    +1071977
    +1071979
    +1071991
    +1072009
    +1072039
    +1072103
    +1072129
    +1072133
    +1072147
    +1072157
    +1072163
    +1072187
    +1072199
    +1072213
    +1072219
    +1072229
    +1072231
    +1072301
    +1072327
    +1072339
    +1072363
    +1072367
    +1072373
    +1072381
    +1072387
    +1072397
    +1072429
    +1072433
    +1072439
    +1072447
    +1072457
    +1072459
    +1072471
    +1072517
    +1072537
    +1072543
    +1072613
    +1072627
    +1072633
    +1072637
    +1072657
    +1072711
    +1072733
    +1072763
    +1072793
    +1072801
    +1072811
    +1072823
    +1072829
    +1072831
    +1072837
    +1072843
    +1072849
    +1072859
    +1072867
    +1072901
    +1072919
    +1072931
    +1072933
    +1072937
    +1072943
    +1072957
    +1072961
    +1072969
    +1072991
    +1072997
    +1072999
    +1073053
    +1073069
    +1073077
    +1073089
    +1073099
    +1073113
    +1073117
    +1073131
    +1073141
    +1073143
    +1073147
    +1073153
    +1073183
    +1073201
    +1073209
    +1073213
    +1073221
    +1073239
    +1073243
    +1073263
    +1073279
    +1073297
    +1073311
    +1073321
    +1073351
    +1073353
    +1073381
    +1073383
    +1073393
    +1073399
    +1073411
    +1073441
    +1073447
    +1073461
    +1073491
    +1073507
    +1073509
    +1073521
    +1073537
    +1073563
    +1073573
    +1073587
    +1073593
    +1073599
    +1073603
    +1073627
    +1073647
    +1073651
    +1073687
    +1073711
    +1073713
    +1073717
    +1073729
    +1073773
    +1073789
    +1073791
    +1073803
    +1073819
    +1073837
    +1073857
    +1073869
    +1073879
    +1073881
    +1073909
    +1073911
    +1073921
    +1073951
    +1073953
    +1073983
    +1074001
    +1074023
    +1074041
    +1074061
    +1074067
    +1074071
    +1074079
    +1074083
    +1074107
    +1074109
    +1074113
    +1074121
    +1074133
    +1074167
    +1074223
    +1074251
    +1074253
    +1074259
    +1074277
    +1074287
    +1074289
    +1074299
    +1074329
    +1074343
    +1074361
    +1074371
    +1074377
    +1074379
    +1074389
    +1074427
    +1074433
    +1074461
    +1074473
    +1074481
    +1074509
    +1074511
    +1074523
    +1074533
    +1074559
    +1074581
    +1074607
    +1074617
    +1074641
    +1074643
    +1074649
    +1074673
    +1074683
    +1074691
    +1074701
    +1074707
    +1074709
    +1074713
    +1074719
    +1074751
    +1074761
    +1074763
    +1074833
    +1074839
    +1074847
    +1074851
    +1074877
    +1074883
    +1074889
    +1074901
    +1074907
    +1074917
    +1074919
    +1074923
    +1074929
    +1074949
    +1074971
    +1074973
    +1074977
    +1074989
    +1074991
    +1075007
    +1075013
    +1075021
    +1075027
    +1075069
    +1075073
    +1075079
    +1075091
    +1075093
    +1075103
    +1075133
    +1075141
    +1075147
    +1075159
    +1075163
    +1075169
    +1075171
    +1075177
    +1075187
    +1075201
    +1075231
    +1075237
    +1075241
    +1075259
    +1075279
    +1075289
    +1075303
    +1075337
    +1075339
    +1075351
    +1075357
    +1075391
    +1075397
    +1075409
    +1075429
    +1075433
    +1075441
    +1075453
    +1075463
    +1075469
    +1075489
    +1075493
    +1075499
    +1075507
    +1075519
    +1075531
    +1075537
    +1075561
    +1075577
    +1075601
    +1075619
    +1075621
    +1075643
    +1075649
    +1075651
    +1075663
    +1075667
    +1075673
    +1075681
    +1075691
    +1075693
    +1075699
    +1075703
    +1075727
    +1075729
    +1075757
    +1075759
    +1075769
    +1075771
    +1075787
    +1075807
    +1075843
    +1075853
    +1075859
    +1075897
    +1075909
    +1075957
    +1075973
    +1076003
    +1076011
    +1076017
    +1076029
    +1076039
    +1076051
    +1076057
    +1076063
    +1076069
    +1076077
    +1076107
    +1076111
    +1076113
    +1076123
    +1076129
    +1076137
    +1076143
    +1076167
    +1076171
    +1076191
    +1076203
    +1076213
    +1076237
    +1076263
    +1076279
    +1076281
    +1076303
    +1076323
    +1076329
    +1076353
    +1076359
    +1076381
    +1076399
    +1076401
    +1076417
    +1076429
    +1076443
    +1076447
    +1076461
    +1076473
    +1076477
    +1076501
    +1076503
    +1076507
    +1076513
    +1076519
    +1076557
    +1076563
    +1076587
    +1076611
    +1076617
    +1076639
    +1076651
    +1076657
    +1076671
    +1076707
    +1076717
    +1076731
    +1076753
    +1076767
    +1076771
    +1076773
    +1076813
    +1076821
    +1076827
    +1076843
    +1076861
    +1076869
    +1076879
    +1076893
    +1076903
    +1076917
    +1076921
    +1076953
    +1076981
    +1077017
    +1077023
    +1077047
    +1077059
    +1077079
    +1077101
    +1077127
    +1077143
    +1077161
    +1077179
    +1077191
    +1077203
    +1077221
    +1077227
    +1077233
    +1077289
    +1077299
    +1077301
    +1077311
    +1077337
    +1077347
    +1077353
    +1077371
    +1077397
    +1077413
    +1077421
    +1077449
    +1077457
    +1077469
    +1077499
    +1077533
    +1077539
    +1077541
    +1077563
    +1077599
    +1077607
    +1077641
    +1077673
    +1077677
    +1077691
    +1077697
    +1077707
    +1077719
    +1077721
    +1077733
    +1077743
    +1077751
    +1077761
    +1077763
    +1077793
    +1077799
    +1077821
    +1077823
    +1077827
    +1077841
    +1077859
    +1077863
    +1077893
    +1077911
    +1077913
    +1077917
    +1077943
    +1077971
    +1077977
    +1077997
    +1078001
    +1078009
    +1078019
    +1078027
    +1078031
    +1078043
    +1078081
    +1078109
    +1078111
    +1078127
    +1078151
    +1078153
    +1078159
    +1078163
    +1078169
    +1078183
    +1078199
    +1078219
    +1078241
    +1078247
    +1078331
    +1078333
    +1078367
    +1078369
    +1078373
    +1078387
    +1078393
    +1078403
    +1078409
    +1078411
    +1078417
    +1078471
    +1078489
    +1078507
    +1078537
    +1078559
    +1078589
    +1078643
    +1078657
    +1078673
    +1078681
    +1078691
    +1078699
    +1078711
    +1078717
    +1078733
    +1078739
    +1078757
    +1078787
    +1078789
    +1078807
    +1078813
    +1078817
    +1078841
    +1078849
    +1078853
    +1078873
    +1078879
    +1078919
    +1078927
    +1078937
    +1078943
    +1078951
    +1078967
    +1078981
    +1078993
    +1079009
    +1079011
    +1079021
    +1079033
    +1079053
    +1079059
    +1079069
    +1079077
    +1079081
    +1079087
    +1079093
    +1079101
    +1079107
    +1079123
    +1079147
    +1079153
    +1079173
    +1079189
    +1079213
    +1079227
    +1079233
    +1079251
    +1079269
    +1079291
    +1079297
    +1079311
    +1079317
    +1079329
    +1079339
    +1079357
    +1079359
    +1079369
    +1079383
    +1079399
    +1079417
    +1079431
    +1079453
    +1079461
    +1079471
    +1079473
    +1079503
    +1079509
    +1079527
    +1079531
    +1079539
    +1079569
    +1079593
    +1079609
    +1079621
    +1079629
    +1079633
    +1079647
    +1079651
    +1079669
    +1079671
    +1079681
    +1079711
    +1079717
    +1079753
    +1079777
    +1079779
    +1079783
    +1079797
    +1079809
    +1079821
    +1079831
    +1079849
    +1079861
    +1079867
    +1079879
    +1079887
    +1079917
    +1079927
    +1079929
    +1079933
    +1079957
    +1079963
    +1079977
    +1079983
    +1079987
    +1079999
    +1080007
    +1080029
    +1080043
    +1080049
    +1080059
    +1080073
    +1080077
    +1080083
    +1080089
    +1080091
    +1080097
    +1080119
    +1080137
    +1080143
    +1080173
    +1080199
    +1080217
    +1080223
    +1080229
    +1080251
    +1080259
    +1080263
    +1080269
    +1080271
    +1080281
    +1080301
    +1080307
    +1080311
    +1080329
    +1080341
    +1080347
    +1080353
    +1080383
    +1080413
    +1080419
    +1080433
    +1080439
    +1080449
    +1080451
    +1080463
    +1080479
    +1080481
    +1080491
    +1080523
    +1080539
    +1080553
    +1080557
    +1080559
    +1080589
    +1080613
    +1080647
    +1080649
    +1080661
    +1080679
    +1080683
    +1080713
    +1080749
    +1080757
    +1080763
    +1080767
    +1080773
    +1080787
    +1080791
    +1080797
    +1080803
    +1080811
    +1080817
    +1080823
    +1080841
    +1080847
    +1080851
    +1080857
    +1080899
    +1080901
    +1080907
    +1080913
    +1080923
    +1080941
    +1080943
    +1080971
    +1080973
    +1080983
    +1081027
    +1081037
    +1081051
    +1081061
    +1081079
    +1081097
    +1081099
    +1081121
    +1081123
    +1081127
    +1081133
    +1081139
    +1081153
    +1081163
    +1081219
    +1081229
    +1081231
    +1081237
    +1081243
    +1081247
    +1081277
    +1081279
    +1081291
    +1081303
    +1081307
    +1081331
    +1081337
    +1081351
    +1081361
    +1081369
    +1081403
    +1081417
    +1081429
    +1081441
    +1081477
    +1081501
    +1081513
    +1081541
    +1081583
    +1081631
    +1081637
    +1081657
    +1081679
    +1081681
    +1081687
    +1081699
    +1081709
    +1081711
    +1081721
    +1081723
    +1081733
    +1081741
    +1081757
    +1081763
    +1081771
    +1081777
    +1081781
    +1081789
    +1081793
    +1081813
    +1081823
    +1081853
    +1081859
    +1081891
    +1081901
    +1081907
    +1081919
    +1081937
    +1081939
    +1081979
    +1081981
    +1082017
    +1082023
    +1082027
    +1082047
    +1082083
    +1082089
    +1082093
    +1082099
    +1082129
    +1082141
    +1082143
    +1082149
    +1082153
    +1082161
    +1082171
    +1082177
    +1082189
    +1082197
    +1082209
    +1082231
    +1082233
    +1082243
    +1082273
    +1082317
    +1082321
    +1082351
    +1082369
    +1082377
    +1082381
    +1082383
    +1082387
    +1082399
    +1082429
    +1082443
    +1082447
    +1082467
    +1082491
    +1082527
    +1082531
    +1082533
    +1082573
    +1082579
    +1082581
    +1082593
    +1082597
    +1082603
    +1082621
    +1082629
    +1082647
    +1082659
    +1082681
    +1082699
    +1082707
    +1082717
    +1082723
    +1082729
    +1082743
    +1082761
    +1082777
    +1082801
    +1082881
    +1082891
    +1082911
    +1082969
    +1082971
    +1082989
    +1082993
    +1082999
    +1083007
    +1083031
    +1083037
    +1083059
    +1083073
    +1083077
    +1083079
    +1083083
    +1083107
    +1083113
    +1083119
    +1083151
    +1083167
    +1083191
    +1083193
    +1083211
    +1083241
    +1083253
    +1083283
    +1083287
    +1083289
    +1083301
    +1083307
    +1083311
    +1083317
    +1083319
    +1083337
    +1083349
    +1083367
    +1083371
    +1083377
    +1083391
    +1083409
    +1083431
    +1083443
    +1083449
    +1083451
    +1083463
    +1083473
    +1083497
    +1083517
    +1083541
    +1083559
    +1083571
    +1083583
    +1083601
    +1083611
    +1083613
    +1083659
    +1083689
    +1083707
    +1083713
    +1083721
    +1083743
    +1083749
    +1083757
    +1083793
    +1083809
    +1083827
    +1083833
    +1083839
    +1083847
    +1083851
    +1083871
    +1083881
    +1083899
    +1083911
    +1083913
    +1083923
    +1083941
    +1083947
    +1083949
    +1083983
    +1084001
    +1084019
    +1084043
    +1084051
    +1084067
    +1084079
    +1084087
    +1084093
    +1084103
    +1084133
    +1084147
    +1084157
    +1084177
    +1084217
    +1084219
    +1084247
    +1084253
    +1084267
    +1084297
    +1084301
    +1084309
    +1084313
    +1084333
    +1084357
    +1084367
    +1084373
    +1084403
    +1084423
    +1084429
    +1084451
    +1084459
    +1084469
    +1084471
    +1084477
    +1084483
    +1084493
    +1084543
    +1084547
    +1084553
    +1084579
    +1084609
    +1084613
    +1084621
    +1084627
    +1084637
    +1084649
    +1084661
    +1084669
    +1084673
    +1084697
    +1084711
    +1084723
    +1084747
    +1084757
    +1084771
    +1084777
    +1084793
    +1084799
    +1084817
    +1084823
    +1084829
    +1084859
    +1084871
    +1084891
    +1084927
    +1084939
    +1084943
    +1084949
    +1084981
    +1084987
    +1084997
    +1085003
    +1085011
    +1085017
    +1085023
    +1085047
    +1085053
    +1085101
    +1085111
    +1085113
    +1085131
    +1085137
    +1085141
    +1085143
    +1085153
    +1085159
    +1085179
    +1085197
    +1085221
    +1085269
    +1085309
    +1085317
    +1085327
    +1085351
    +1085353
    +1085369
    +1085389
    +1085407
    +1085419
    +1085429
    +1085431
    +1085443
    +1085459
    +1085473
    +1085509
    +1085521
    +1085551
    +1085587
    +1085611
    +1085627
    +1085633
    +1085657
    +1085663
    +1085677
    +1085681
    +1085687
    +1085719
    +1085737
    +1085753
    +1085767
    +1085771
    +1085779
    +1085801
    +1085809
    +1085813
    +1085827
    +1085857
    +1085863
    +1085867
    +1085873
    +1085881
    +1085891
    +1085911
    +1085933
    +1085957
    +1085971
    +1085989
    +1086031
    +1086047
    +1086073
    +1086089
    +1086091
    +1086101
    +1086103
    +1086119
    +1086133
    +1086139
    +1086149
    +1086161
    +1086179
    +1086191
    +1086193
    +1086199
    +1086203
    +1086247
    +1086251
    +1086257
    +1086259
    +1086263
    +1086277
    +1086299
    +1086301
    +1086307
    +1086331
    +1086343
    +1086347
    +1086353
    +1086361
    +1086373
    +1086389
    +1086391
    +1086413
    +1086433
    +1086443
    +1086461
    +1086469
    +1086493
    +1086509
    +1086511
    +1086523
    +1086529
    +1086557
    +1086559
    +1086587
    +1086607
    +1086611
    +1086619
    +1086637
    +1086641
    +1086647
    +1086677
    +1086689
    +1086703
    +1086731
    +1086749
    +1086763
    +1086769
    +1086791
    +1086809
    +1086817
    +1086859
    +1086863
    +1086881
    +1086893
    +1086901
    +1086913
    +1086919
    +1086923
    +1086931
    +1086937
    +1086989
    +1086991
    +1087001
    +1087019
    +1087027
    +1087061
    +1087091
    +1087109
    +1087117
    +1087129
    +1087147
    +1087159
    +1087231
    +1087241
    +1087249
    +1087259
    +1087271
    +1087291
    +1087301
    +1087309
    +1087349
    +1087357
    +1087379
    +1087381
    +1087391
    +1087409
    +1087423
    +1087433
    +1087451
    +1087453
    +1087459
    +1087483
    +1087487
    +1087517
    +1087519
    +1087543
    +1087553
    +1087561
    +1087589
    +1087591
    +1087621
    +1087631
    +1087657
    +1087663
    +1087673
    +1087679
    +1087687
    +1087717
    +1087729
    +1087741
    +1087747
    +1087753
    +1087781
    +1087787
    +1087789
    +1087799
    +1087811
    +1087817
    +1087829
    +1087841
    +1087843
    +1087861
    +1087873
    +1087897
    +1087903
    +1087907
    +1087937
    +1087963
    +1087967
    +1087973
    +1087981
    +1087987
    +1088023
    +1088027
    +1088039
    +1088053
    +1088063
    +1088071
    +1088081
    +1088089
    +1088093
    +1088123
    +1088159
    +1088161
    +1088209
    +1088233
    +1088237
    +1088239
    +1088251
    +1088267
    +1088273
    +1088293
    +1088309
    +1088371
    +1088387
    +1088389
    +1088393
    +1088407
    +1088413
    +1088419
    +1088431
    +1088443
    +1088447
    +1088449
    +1088467
    +1088471
    +1088489
    +1088519
    +1088533
    +1088537
    +1088543
    +1088569
    +1088579
    +1088603
    +1088611
    +1088617
    +1088621
    +1088623
    +1088639
    +1088641
    +1088657
    +1088669
    +1088671
    +1088687
    +1088693
    +1088707
    +1088723
    +1088749
    +1088753
    +1088761
    +1088777
    +1088783
    +1088807
    +1088827
    +1088831
    +1088839
    +1088851
    +1088903
    +1088917
    +1088933
    +1088953
    +1088957
    +1088959
    +1088977
    +1088987
    +1088993
    +1089017
    +1089029
    +1089047
    +1089091
    +1089103
    +1089107
    +1089113
    +1089133
    +1089161
    +1089191
    +1089197
    +1089217
    +1089223
    +1089227
    +1089239
    +1089259
    +1089299
    +1089313
    +1089359
    +1089383
    +1089397
    +1089401
    +1089421
    +1089427
    +1089457
    +1089461
    +1089463
    +1089469
    +1089481
    +1089497
    +1089503
    +1089509
    +1089523
    +1089551
    +1089563
    +1089611
    +1089629
    +1089653
    +1089661
    +1089677
    +1089679
    +1089703
    +1089709
    +1089713
    +1089757
    +1089793
    +1089799
    +1089841
    +1089863
    +1089877
    +1089917
    +1089919
    +1089941
    +1089943
    +1089961
    +1089967
    +1090003
    +1090013
    +1090021
    +1090027
    +1090031
    +1090097
    +1090099
    +1090127
    +1090129
    +1090151
    +1090153
    +1090169
    +1090181
    +1090189
    +1090211
    +1090213
    +1090217
    +1090241
    +1090249
    +1090267
    +1090273
    +1090303
    +1090333
    +1090373
    +1090381
    +1090387
    +1090403
    +1090409
    +1090421
    +1090423
    +1090457
    +1090459
    +1090469
    +1090471
    +1090483
    +1090493
    +1090519
    +1090553
    +1090577
    +1090589
    +1090597
    +1090613
    +1090627
    +1090681
    +1090697
    +1090709
    +1090711
    +1090717
    +1090721
    +1090757
    +1090759
    +1090769
    +1090783
    +1090799
    +1090807
    +1090819
    +1090841
    +1090849
    +1090877
    +1090879
    +1090883
    +1090889
    +1090891
    +1090897
    +1090909
    +1090919
    +1090927
    +1090937
    +1090939
    +1090949
    +1090963
    +1090967
    +1090979
    +1090997
    +1091003
    +1091017
    +1091021
    +1091023
    +1091033
    +1091047
    +1091053
    +1091059
    +1091063
    +1091071
    +1091119
    +1091137
    +1091147
    +1091149
    +1091159
    +1091161
    +1091173
    +1091177
    +1091191
    +1091219
    +1091221
    +1091239
    +1091243
    +1091257
    +1091261
    +1091263
    +1091267
    +1091269
    +1091273
    +1091287
    +1091329
    +1091339
    +1091359
    +1091369
    +1091371
    +1091381
    +1091393
    +1091399
    +1091401
    +1091411
    +1091413
    +1091443
    +1091459
    +1091471
    +1091477
    +1091509
    +1091521
    +1091527
    +1091549
    +1091551
    +1091561
    +1091581
    +1091591
    +1091609
    +1091617
    +1091627
    +1091633
    +1091639
    +1091659
    +1091663
    +1091681
    +1091687
    +1091711
    +1091729
    +1091731
    +1091737
    +1091749
    +1091777
    +1091807
    +1091809
    +1091837
    +1091843
    +1091863
    +1091869
    +1091887
    +1091917
    +1091939
    +1091957
    +1091983
    +1092019
    +1092023
    +1092041
    +1092043
    +1092059
    +1092061
    +1092067
    +1092089
    +1092103
    +1092107
    +1092127
    +1092137
    +1092151
    +1092163
    +1092173
    +1092181
    +1092191
    +1092209
    +1092229
    +1092241
    +1092251
    +1092257
    +1092269
    +1092283
    +1092307
    +1092331
    +1092337
    +1092349
    +1092353
    +1092361
    +1092373
    +1092379
    +1092389
    +1092391
    +1092397
    +1092419
    +1092433
    +1092451
    +1092461
    +1092463
    +1092473
    +1092479
    +1092493
    +1092541
    +1092583
    +1092593
    +1092601
    +1092629
    +1092643
    +1092659
    +1092667
    +1092677
    +1092713
    +1092731
    +1092733
    +1092757
    +1092779
    +1092803
    +1092821
    +1092827
    +1092829
    +1092851
    +1092853
    +1092863
    +1092887
    +1092893
    +1092901
    +1092907
    +1092911
    +1092919
    +1092929
    +1092961
    +1092977
    +1092989
    +1092991
    +1092997
    +1093007
    +1093033
    +1093061
    +1093063
    +1093067
    +1093069
    +1093087
    +1093109
    +1093111
    +1093129
    +1093133
    +1093159
    +1093163
    +1093177
    +1093199
    +1093201
    +1093223
    +1093237
    +1093243
    +1093249
    +1093273
    +1093283
    +1093289
    +1093297
    +1093307
    +1093327
    +1093331
    +1093357
    +1093363
    +1093381
    +1093399
    +1093403
    +1093409
    +1093427
    +1093441
    +1093487
    +1093493
    +1093517
    +1093529
    +1093531
    +1093537
    +1093541
    +1093553
    +1093571
    +1093577
    +1093591
    +1093633
    +1093637
    +1093639
    +1093657
    +1093663
    +1093667
    +1093679
    +1093681
    +1093699
    +1093717
    +1093723
    +1093733
    +1093739
    +1093747
    +1093751
    +1093753
    +1093777
    +1093789
    +1093823
    +1093837
    +1093843
    +1093847
    +1093871
    +1093889
    +1093901
    +1093907
    +1093927
    +1093943
    +1093951
    +1093957
    +1093969
    +1093991
    +1093993
    +1093997
    +1093999
    +1094011
    +1094029
    +1094047
    +1094057
    +1094059
    +1094081
    +1094089
    +1094099
    +1094101
    +1094123
    +1094129
    +1094131
    +1094143
    +1094147
    +1094161
    +1094183
    +1094209
    +1094237
    +1094263
    +1094293
    +1094299
    +1094321
    +1094333
    +1094339
    +1094371
    +1094377
    +1094407
    +1094411
    +1094417
    +1094437
    +1094441
    +1094449
    +1094453
    +1094461
    +1094473
    +1094491
    +1094519
    +1094531
    +1094539
    +1094543
    +1094549
    +1094551
    +1094557
    +1094567
    +1094573
    +1094603
    +1094623
    +1094629
    +1094633
    +1094657
    +1094669
    +1094671
    +1094683
    +1094689
    +1094693
    +1094701
    +1094711
    +1094747
    +1094759
    +1094773
    +1094791
    +1094801
    +1094803
    +1094809
    +1094831
    +1094833
    +1094843
    +1094881
    +1094887
    +1094897
    +1094911
    +1094921
    +1094923
    +1094939
    +1094957
    +1094963
    +1094969
    +1094983
    +1094999
    +1095023
    +1095043
    +1095047
    +1095049
    +1095067
    +1095071
    +1095091
    +1095119
    +1095161
    +1095169
    +1095173
    +1095209
    +1095221
    +1095223
    +1095229
    +1095239
    +1095247
    +1095251
    +1095257
    +1095287
    +1095313
    +1095319
    +1095343
    +1095349
    +1095401
    +1095403
    +1095427
    +1095433
    +1095439
    +1095443
    +1095449
    +1095461
    +1095481
    +1095487
    +1095491
    +1095503
    +1095529
    +1095541
    +1095551
    +1095557
    +1095569
    +1095581
    +1095583
    +1095613
    +1095631
    +1095671
    +1095691
    +1095713
    +1095719
    +1095727
    +1095733
    +1095739
    +1095751
    +1095779
    +1095781
    +1095791
    +1095793
    +1095811
    +1095821
    +1095833
    +1095839
    +1095841
    +1095847
    +1095851
    +1095859
    +1095907
    +1095931
    +1095947
    +1095959
    +1095961
    +1095979
    +1095989
    +1096031
    +1096057
    +1096061
    +1096079
    +1096097
    +1096099
    +1096127
    +1096133
    +1096141
    +1096159
    +1096163
    +1096189
    +1096201
    +1096219
    +1096267
    +1096289
    +1096307
    +1096327
    +1096349
    +1096351
    +1096363
    +1096373
    +1096379
    +1096393
    +1096399
    +1096423
    +1096427
    +1096451
    +1096477
    +1096481
    +1096489
    +1096493
    +1096499
    +1096507
    +1096541
    +1096549
    +1096553
    +1096559
    +1096561
    +1096583
    +1096609
    +1096621
    +1096631
    +1096639
    +1096673
    +1096691
    +1096703
    +1096727
    +1096741
    +1096763
    +1096787
    +1096793
    +1096807
    +1096817
    +1096829
    +1096831
    +1096853
    +1096859
    +1096861
    +1096871
    +1096883
    +1096919
    +1096951
    +1096957
    +1096967
    +1096969
    +1096981
    +1096999
    +1097009
    +1097017
    +1097029
    +1097039
    +1097051
    +1097069
    +1097081
    +1097101
    +1097111
    +1097113
    +1097141
    +1097143
    +1097147
    +1097179
    +1097189
    +1097203
    +1097209
    +1097221
    +1097237
    +1097267
    +1097293
    +1097297
    +1097321
    +1097323
    +1097351
    +1097359
    +1097377
    +1097381
    +1097413
    +1097419
    +1097423
    +1097441
    +1097443
    +1097461
    +1097483
    +1097501
    +1097513
    +1097533
    +1097539
    +1097543
    +1097549
    +1097557
    +1097599
    +1097627
    +1097633
    +1097651
    +1097653
    +1097659
    +1097669
    +1097699
    +1097711
    +1097717
    +1097729
    +1097743
    +1097783
    +1097791
    +1097797
    +1097819
    +1097849
    +1097851
    +1097861
    +1097869
    +1097879
    +1097891
    +1097893
    +1097897
    +1097903
    +1097909
    +1097923
    +1097933
    +1097947
    +1097983
    +1098017
    +1098023
    +1098037
    +1098073
    +1098077
    +1098101
    +1098109
    +1098121
    +1098133
    +1098151
    +1098187
    +1098191
    +1098193
    +1098203
    +1098211
    +1098221
    +1098233
    +1098269
    +1098287
    +1098301
    +1098311
    +1098313
    +1098341
    +1098373
    +1098379
    +1098397
    +1098401
    +1098439
    +1098443
    +1098451
    +1098463
    +1098469
    +1098479
    +1098481
    +1098509
    +1098511
    +1098533
    +1098541
    +1098593
    +1098613
    +1098623
    +1098631
    +1098649
    +1098667
    +1098673
    +1098689
    +1098707
    +1098709
    +1098731
    +1098737
    +1098787
    +1098791
    +1098803
    +1098821
    +1098833
    +1098847
    +1098953
    +1098967
    +1098973
    +1098989
    +1099031
    +1099051
    +1099057
    +1099079
    +1099081
    +1099097
    +1099103
    +1099117
    +1099121
    +1099139
    +1099171
    +1099177
    +1099181
    +1099199
    +1099223
    +1099247
    +1099249
    +1099261
    +1099279
    +1099289
    +1099309
    +1099313
    +1099327
    +1099337
    +1099363
    +1099369
    +1099391
    +1099393
    +1099409
    +1099411
    +1099421
    +1099433
    +1099459
    +1099463
    +1099487
    +1099489
    +1099493
    +1099499
    +1099507
    +1099513
    +1099519
    +1099523
    +1099541
    +1099547
    +1099559
    +1099573
    +1099589
    +1099619
    +1099621
    +1099627
    +1099633
    +1099649
    +1099669
    +1099687
    +1099711
    +1099717
    +1099723
    +1099727
    +1099729
    +1099741
    +1099757
    +1099771
    +1099783
    +1099793
    +1099799
    +1099807
    +1099817
    +1099823
    +1099841
    +1099843
    +1099859
    +1099867
    +1099927
    +1099933
    +1099957
    +1099961
    +1099997
    +1100009
    +1100023
    +1100027
    +1100039
    +1100041
    +1100051
    +1100063
    +1100089
    +1100093
    +1100101
    +1100123
    +1100131
    +1100147
    +1100149
    +1100161
    +1100167
    +1100171
    +1100179
    +1100213
    +1100219
    +1100243
    +1100249
    +1100261
    +1100273
    +1100279
    +1100303
    +1100311
    +1100321
    +1100353
    +1100357
    +1100377
    +1100381
    +1100387
    +1100419
    +1100441
    +1100443
    +1100447
    +1100467
    +1100471
    +1100483
    +1100503
    +1100509
    +1100513
    +1100543
    +1100557
    +1100569
    +1100581
    +1100591
    +1100611
    +1100641
    +1100653
    +1100681
    +1100683
    +1100747
    +1100773
    +1100777
    +1100783
    +1100797
    +1100807
    +1100831
    +1100833
    +1100837
    +1100839
    +1100851
    +1100857
    +1100887
    +1100893
    +1100899
    +1100909
    +1100921
    +1100933
    +1100947
    +1100977
    +1101071
    +1101091
    +1101097
    +1101103
    +1101109
    +1101127
    +1101143
    +1101169
    +1101179
    +1101193
    +1101211
    +1101229
    +1101253
    +1101283
    +1101299
    +1101307
    +1101319
    +1101323
    +1101341
    +1101349
    +1101371
    +1101377
    +1101389
    +1101403
    +1101407
    +1101409
    +1101421
    +1101431
    +1101433
    +1101439
    +1101467
    +1101473
    +1101509
    +1101511
    +1101517
    +1101521
    +1101533
    +1101559
    +1101571
    +1101577
    +1101587
    +1101593
    +1101613
    +1101619
    +1101641
    +1101649
    +1101671
    +1101673
    +1101689
    +1101691
    +1101697
    +1101733
    +1101743
    +1101761
    +1101767
    +1101773
    +1101781
    +1101803
    +1101811
    +1101839
    +1101851
    +1101871
    +1101883
    +1101901
    +1101917
    +1101929
    +1101931
    +1101937
    +1101941
    +1101959
    +1101967
    +1102001
    +1102007
    +1102021
    +1102027
    +1102063
    +1102069
    +1102111
    +1102117
    +1102147
    +1102151
    +1102159
    +1102163
    +1102169
    +1102181
    +1102187
    +1102201
    +1102237
    +1102243
    +1102249
    +1102253
    +1102259
    +1102271
    +1102279
    +1102301
    +1102307
    +1102313
    +1102333
    +1102337
    +1102393
    +1102397
    +1102411
    +1102427
    +1102429
    +1102441
    +1102447
    +1102457
    +1102463
    +1102481
    +1102483
    +1102523
    +1102537
    +1102547
    +1102553
    +1102567
    +1102571
    +1102583
    +1102663
    +1102669
    +1102679
    +1102681
    +1102691
    +1102693
    +1102709
    +1102721
    +1102727
    +1102729
    +1102733
    +1102747
    +1102757
    +1102813
    +1102823
    +1102831
    +1102847
    +1102853
    +1102861
    +1102879
    +1102883
    +1102891
    +1102901
    +1102903
    +1102921
    +1102939
    +1102951
    +1102963
    +1102967
    +1102979
    +1102991
    +1102999
    +1103009
    +1103017
    +1103029
    +1103041
    +1103059
    +1103087
    +1103101
    +1103107
    +1103111
    +1103119
    +1103129
    +1103143
    +1103171
    +1103183
    +1103191
    +1103203
    +1103213
    +1103237
    +1103257
    +1103279
    +1103281
    +1103293
    +1103309
    +1103339
    +1103341
    +1103353
    +1103371
    +1103437
    +1103449
    +1103461
    +1103467
    +1103483
    +1103489
    +1103497
    +1103519
    +1103533
    +1103549
    +1103561
    +1103579
    +1103581
    +1103587
    +1103591
    +1103603
    +1103611
    +1103617
    +1103621
    +1103629
    +1103633
    +1103639
    +1103699
    +1103723
    +1103737
    +1103749
    +1103779
    +1103797
    +1103803
    +1103849
    +1103857
    +1103863
    +1103873
    +1103899
    +1103903
    +1103911
    +1103923
    +1103933
    +1103981
    +1103987
    +1103989
    +1104017
    +1104041
    +1104079
    +1104097
    +1104101
    +1104107
    +1104113
    +1104119
    +1104137
    +1104139
    +1104157
    +1104179
    +1104193
    +1104203
    +1104209
    +1104217
    +1104221
    +1104241
    +1104247
    +1104289
    +1104293
    +1104307
    +1104319
    +1104331
    +1104343
    +1104353
    +1104373
    +1104377
    +1104379
    +1104403
    +1104409
    +1104427
    +1104431
    +1104449
    +1104479
    +1104491
    +1104511
    +1104517
    +1104533
    +1104557
    +1104559
    +1104589
    +1104599
    +1104613
    +1104619
    +1104659
    +1104661
    +1104671
    +1104683
    +1104703
    +1104707
    +1104731
    +1104737
    +1104739
    +1104743
    +1104749
    +1104751
    +1104767
    +1104769
    +1104781
    +1104787
    +1104791
    +1104797
    +1104811
    +1104821
    +1104823
    +1104833
    +1104853
    +1104877
    +1104889
    +1104899
    +1104913
    +1104919
    +1104937
    +1104941
    +1104947
    +1104959
    +1105009
    +1105019
    +1105033
    +1105061
    +1105063
    +1105067
    +1105109
    +1105141
    +1105157
    +1105163
    +1105171
    +1105177
    +1105193
    +1105201
    +1105207
    +1105213
    +1105217
    +1105231
    +1105261
    +1105267
    +1105271
    +1105309
    +1105327
    +1105333
    +1105337
    +1105339
    +1105343
    +1105387
    +1105397
    +1105427
    +1105441
    +1105457
    +1105463
    +1105501
    +1105513
    +1105519
    +1105537
    +1105547
    +1105549
    +1105571
    +1105579
    +1105583
    +1105589
    +1105603
    +1105607
    +1105609
    +1105613
    +1105619
    +1105627
    +1105639
    +1105649
    +1105651
    +1105661
    +1105669
    +1105691
    +1105693
    +1105711
    +1105757
    +1105759
    +1105787
    +1105807
    +1105813
    +1105823
    +1105847
    +1105861
    +1105873
    +1105879
    +1105883
    +1105891
    +1105913
    +1105919
    +1105943
    +1105961
    +1105963
    +1105997
    +1105999
    +1106029
    +1106069
    +1106087
    +1106099
    +1106101
    +1106129
    +1106137
    +1106159
    +1106167
    +1106177
    +1106179
    +1106197
    +1106201
    +1106213
    +1106219
    +1106233
    +1106243
    +1106249
    +1106257
    +1106267
    +1106279
    +1106293
    +1106311
    +1106317
    +1106363
    +1106381
    +1106401
    +1106407
    +1106419
    +1106423
    +1106429
    +1106447
    +1106449
    +1106471
    +1106477
    +1106489
    +1106491
    +1106509
    +1106527
    +1106531
    +1106543
    +1106563
    +1106569
    +1106593
    +1106621
    +1106627
    +1106629
    +1106653
    +1106671
    +1106687
    +1106689
    +1106741
    +1106747
    +1106761
    +1106767
    +1106771
    +1106779
    +1106789
    +1106801
    +1106821
    +1106827
    +1106837
    +1106839
    +1106851
    +1106881
    +1106891
    +1106909
    +1106923
    +1106927
    +1106939
    +1106953
    +1106957
    +1106977
    +1106993
    +1106999
    +1107019
    +1107031
    +1107047
    +1107049
    +1107053
    +1107083
    +1107101
    +1107107
    +1107109
    +1107157
    +1107167
    +1107173
    +1107199
    +1107203
    +1107217
    +1107269
    +1107317
    +1107319
    +1107341
    +1107347
    +1107383
    +1107389
    +1107401
    +1107409
    +1107419
    +1107433
    +1107439
    +1107467
    +1107479
    +1107487
    +1107497
    +1107503
    +1107511
    +1107523
    +1107527
    +1107553
    +1107569
    +1107571
    +1107581
    +1107583
    +1107593
    +1107619
    +1107677
    +1107679
    +1107721
    +1107727
    +1107751
    +1107763
    +1107773
    +1107781
    +1107787
    +1107791
    +1107793
    +1107797
    +1107803
    +1107811
    +1107823
    +1107851
    +1107853
    +1107881
    +1107893
    +1107913
    +1107917
    +1107923
    +1107929
    +1107937
    +1107989
    +1108001
    +1108007
    +1108021
    +1108049
    +1108057
    +1108069
    +1108073
    +1108091
    +1108103
    +1108123
    +1108127
    +1108147
    +1108169
    +1108171
    +1108181
    +1108201
    +1108207
    +1108223
    +1108229
    +1108241
    +1108253
    +1108259
    +1108267
    +1108313
    +1108321
    +1108337
    +1108357
    +1108361
    +1108363
    +1108369
    +1108397
    +1108423
    +1108427
    +1108447
    +1108453
    +1108463
    +1108469
    +1108477
    +1108487
    +1108489
    +1108501
    +1108507
    +1108537
    +1108543
    +1108559
    +1108561
    +1108567
    +1108571
    +1108573
    +1108579
    +1108603
    +1108609
    +1108619
    +1108633
    +1108663
    +1108691
    +1108693
    +1108697
    +1108703
    +1108711
    +1108717
    +1108727
    +1108729
    +1108733
    +1108739
    +1108747
    +1108753
    +1108759
    +1108771
    +1108781
    +1108801
    +1108817
    +1108819
    +1108823
    +1108867
    +1108903
    +1108907
    +1108909
    +1108957
    +1108967
    +1108993
    +1108997
    +1108999
    +1109021
    +1109033
    +1109057
    +1109113
    +1109117
    +1109123
    +1109159
    +1109161
    +1109167
    +1109189
    +1109197
    +1109219
    +1109231
    +1109243
    +1109249
    +1109257
    +1109281
    +1109287
    +1109291
    +1109309
    +1109327
    +1109347
    +1109351
    +1109363
    +1109387
    +1109393
    +1109399
    +1109401
    +1109411
    +1109431
    +1109473
    +1109477
    +1109489
    +1109491
    +1109509
    +1109513
    +1109531
    +1109533
    +1109561
    +1109579
    +1109609
    +1109611
    +1109629
    +1109639
    +1109653
    +1109663
    +1109723
    +1109737
    +1109749
    +1109761
    +1109783
    +1109789
    +1109791
    +1109813
    +1109821
    +1109839
    +1109851
    +1109861
    +1109869
    +1109881
    +1109887
    +1109891
    +1109897
    +1109903
    +1109909
    +1109921
    +1109951
    +1109987
    +1110007
    +1110013
    +1110019
    +1110023
    +1110041
    +1110061
    +1110077
    +1110089
    +1110103
    +1110127
    +1110133
    +1110167
    +1110181
    +1110223
    +1110229
    +1110247
    +1110269
    +1110271
    +1110289
    +1110301
    +1110311
    +1110313
    +1110331
    +1110349
    +1110353
    +1110367
    +1110397
    +1110401
    +1110413
    +1110427
    +1110433
    +1110449
    +1110467
    +1110479
    +1110517
    +1110521
    +1110523
    +1110533
    +1110539
    +1110541
    +1110547
    +1110583
    +1110587
    +1110589
    +1110611
    +1110617
    +1110643
    +1110667
    +1110679
    +1110709
    +1110713
    +1110719
    +1110727
    +1110743
    +1110773
    +1110779
    +1110803
    +1110817
    +1110821
    +1110839
    +1110859
    +1110881
    +1110887
    +1110913
    +1110917
    +1110919
    +1110929
    +1110931
    +1110943
    +1110953
    +1110959
    +1110971
    +1110973
    +1110979
    +1110983
    +1110997
    +1111007
    +1111013
    +1111021
    +1111031
    +1111043
    +1111049
    +1111057
    +1111067
    +1111081
    +1111087
    +1111091
    +1111151
    +1111157
    +1111169
    +1111181
    +1111183
    +1111189
    +1111211
    +1111213
    +1111219
    +1111247
    +1111259
    +1111283
    +1111289
    +1111301
    +1111333
    +1111339
    +1111351
    +1111361
    +1111379
    +1111393
    +1111399
    +1111423
    +1111427
    +1111433
    +1111447
    +1111457
    +1111489
    +1111493
    +1111499
    +1111531
    +1111543
    +1111547
    +1111553
    +1111559
    +1111573
    +1111577
    +1111637
    +1111639
    +1111651
    +1111661
    +1111667
    +1111673
    +1111687
    +1111703
    +1111711
    +1111723
    +1111727
    +1111741
    +1111757
    +1111771
    +1111787
    +1111793
    +1111801
    +1111841
    +1111853
    +1111867
    +1111897
    +1111921
    +1111933
    +1111949
    +1111963
    +1111967
    +1111991
    +1112003
    +1112011
    +1112017
    +1112047
    +1112057
    +1112077
    +1112081
    +1112087
    +1112093
    +1112107
    +1112113
    +1112129
    +1112131
    +1112141
    +1112143
    +1112147
    +1112159
    +1112171
    +1112197
    +1112201
    +1112239
    +1112269
    +1112273
    +1112291
    +1112323
    +1112333
    +1112339
    +1112341
    +1112351
    +1112359
    +1112369
    +1112381
    +1112383
    +1112389
    +1112413
    +1112467
    +1112471
    +1112477
    +1112483
    +1112509
    +1112513
    +1112519
    +1112543
    +1112549
    +1112561
    +1112567
    +1112569
    +1112581
    +1112591
    +1112597
    +1112611
    +1112623
    +1112651
    +1112653
    +1112663
    +1112677
    +1112689
    +1112707
    +1112723
    +1112729
    +1112731
    +1112737
    +1112747
    +1112777
    +1112779
    +1112789
    +1112821
    +1112827
    +1112831
    +1112833
    +1112857
    +1112897
    +1112899
    +1112911
    +1112921
    +1112941
    +1112953
    +1112959
    +1112971
    +1112977
    +1112983
    +1113011
    +1113019
    +1113029
    +1113043
    +1113059
    +1113083
    +1113089
    +1113103
    +1113137
    +1113149
    +1113157
    +1113173
    +1113181
    +1113187
    +1113193
    +1113197
    +1113199
    +1113221
    +1113239
    +1113253
    +1113257
    +1113317
    +1113319
    +1113337
    +1113349
    +1113373
    +1113379
    +1113401
    +1113403
    +1113421
    +1113451
    +1113461
    +1113481
    +1113491
    +1113509
    +1113521
    +1113527
    +1113557
    +1113569
    +1113587
    +1113599
    +1113617
    +1113643
    +1113667
    +1113701
    +1113703
    +1113713
    +1113719
    +1113751
    +1113773
    +1113781
    +1113787
    +1113793
    +1113797
    +1113809
    +1113859
    +1113863
    +1113877
    +1113883
    +1113887
    +1113899
    +1113941
    +1113949
    +1113953
    +1113961
    +1113971
    +1113991
    +1113997
    +1114019
    +1114031
    +1114037
    +1114039
    +1114049
    +1114063
    +1114111
    +1114117
    +1114159
    +1114193
    +1114207
    +1114213
    +1114241
    +1114249
    +1114261
    +1114271
    +1114273
    +1114283
    +1114297
    +1114301
    +1114303
    +1114349
    +1114361
    +1114381
    +1114397
    +1114423
    +1114427
    +1114447
    +1114471
    +1114489
    +1114493
    +1114501
    +1114507
    +1114523
    +1114541
    +1114549
    +1114567
    +1114573
    +1114577
    +1114591
    +1114601
    +1114613
    +1114651
    +1114657
    +1114661
    +1114681
    +1114693
    +1114697
    +1114709
    +1114721
    +1114723
    +1114733
    +1114753
    +1114759
    +1114801
    +1114807
    +1114811
    +1114829
    +1114837
    +1114849
    +1114859
    +1114873
    +1114891
    +1114907
    +1114909
    +1114931
    +1114937
    +1114943
    +1114969
    +1114973
    +1114987
    +1114999
    +1115011
    +1115027
    +1115029
    +1115057
    +1115071
    +1115089
    +1115099
    +1115113
    +1115117
    +1115131
    +1115189
    +1115207
    +1115227
    +1115237
    +1115239
    +1115267
    +1115269
    +1115273
    +1115297
    +1115299
    +1115321
    +1115327
    +1115329
    +1115351
    +1115363
    +1115381
    +1115399
    +1115407
    +1115417
    +1115419
    +1115447
    +1115449
    +1115453
    +1115467
    +1115497
    +1115501
    +1115519
    +1115531
    +1115533
    +1115539
    +1115551
    +1115561
    +1115567
    +1115573
    +1115579
    +1115581
    +1115599
    +1115627
    +1115633
    +1115641
    +1115657
    +1115683
    +1115701
    +1115711
    +1115713
    +1115731
    +1115743
    +1115759
    +1115767
    +1115771
    +1115773
    +1115789
    +1115831
    +1115839
    +1115843
    +1115857
    +1115879
    +1115899
    +1115911
    +1115923
    +1115929
    +1115941
    +1115987
    +1115993
    +1116001
    +1116053
    +1116077
    +1116091
    +1116107
    +1116133
    +1116163
    +1116173
    +1116187
    +1116209
    +1116223
    +1116229
    +1116257
    +1116277
    +1116281
    +1116289
    +1116301
    +1116317
    +1116319
    +1116329
    +1116337
    +1116347
    +1116371
    +1116419
    +1116431
    +1116439
    +1116449
    +1116461
    +1116469
    +1116473
    +1116491
    +1116499
    +1116523
    +1116541
    +1116547
    +1116569
    +1116571
    +1116593
    +1116601
    +1116631
    +1116637
    +1116641
    +1116653
    +1116659
    +1116677
    +1116701
    +1116743
    +1116749
    +1116751
    +1116809
    +1116821
    +1116851
    +1116853
    +1116859
    +1116887
    +1116889
    +1116893
    +1116911
    +1116937
    +1116943
    +1116977
    +1116989
    +1117009
    +1117013
    +1117021
    +1117027
    +1117031
    +1117033
    +1117057
    +1117069
    +1117073
    +1117079
    +1117099
    +1117111
    +1117117
    +1117153
    +1117169
    +1117177
    +1117199
    +1117243
    +1117247
    +1117253
    +1117267
    +1117273
    +1117279
    +1117301
    +1117307
    +1117309
    +1117321
    +1117349
    +1117367
    +1117379
    +1117433
    +1117439
    +1117451
    +1117463
    +1117471
    +1117477
    +1117481
    +1117483
    +1117489
    +1117513
    +1117549
    +1117553
    +1117579
    +1117591
    +1117601
    +1117603
    +1117607
    +1117609
    +1117657
    +1117661
    +1117673
    +1117679
    +1117681
    +1117709
    +1117729
    +1117741
    +1117757
    +1117759
    +1117763
    +1117769
    +1117793
    +1117799
    +1117811
    +1117813
    +1117817
    +1117819
    +1117861
    +1117867
    +1117877
    +1117889
    +1117901
    +1117913
    +1117931
    +1117933
    +1117939
    +1117943
    +1117967
    +1117973
    +1117993
    +1118003
    +1118009
    +1118011
    +1118021
    +1118023
    +1118027
    +1118041
    +1118063
    +1118081
    +1118101
    +1118113
    +1118123
    +1118137
    +1118147
    +1118149
    +1118189
    +1118197
    +1118203
    +1118219
    +1118261
    +1118267
    +1118291
    +1118303
    +1118309
    +1118317
    +1118339
    +1118363
    +1118371
    +1118393
    +1118419
    +1118437
    +1118441
    +1118479
    +1118483
    +1118497
    +1118519
    +1118527
    +1118563
    +1118567
    +1118569
    +1118599
    +1118629
    +1118653
    +1118659
    +1118713
    +1118717
    +1118723
    +1118737
    +1118749
    +1118773
    +1118779
    +1118783
    +1118797
    +1118807
    +1118809
    +1118827
    +1118837
    +1118851
    +1118857
    +1118861
    +1118863
    +1118867
    +1118869
    +1118893
    +1118911
    +1118921
    +1118941
    +1118947
    +1118951
    +1118969
    +1118987
    +1118993
    +1119029
    +1119037
    +1119047
    +1119049
    +1119077
    +1119091
    +1119109
    +1119121
    +1119169
    +1119179
    +1119221
    +1119227
    +1119241
    +1119269
    +1119281
    +1119299
    +1119319
    +1119323
    +1119343
    +1119359
    +1119389
    +1119397
    +1119403
    +1119449
    +1119473
    +1119523
    +1119527
    +1119529
    +1119557
    +1119577
    +1119589
    +1119607
    +1119611
    +1119623
    +1119649
    +1119653
    +1119659
    +1119673
    +1119691
    +1119697
    +1119707
    +1119733
    +1119737
    +1119779
    +1119793
    +1119799
    +1119809
    +1119817
    +1119821
    +1119823
    +1119857
    +1119863
    +1119871
    +1119907
    +1119913
    +1119947
    +1119949
    +1119959
    +1120001
    +1120019
    +1120051
    +1120073
    +1120081
    +1120087
    +1120109
    +1120121
    +1120153
    +1120157
    +1120159
    +1120187
    +1120211
    +1120219
    +1120237
    +1120271
    +1120277
    +1120289
    +1120291
    +1120303
    +1120313
    +1120319
    +1120321
    +1120337
    +1120349
    +1120363
    +1120369
    +1120391
    +1120423
    +1120429
    +1120459
    +1120481
    +1120499
    +1120501
    +1120507
    +1120513
    +1120517
    +1120519
    +1120529
    +1120541
    +1120543
    +1120547
    +1120549
    +1120573
    +1120577
    +1120591
    +1120607
    +1120627
    +1120633
    +1120649
    +1120661
    +1120663
    +1120667
    +1120673
    +1120687
    +1120711
    +1120723
    +1120727
    +1120739
    +1120741
    +1120747
    +1120771
    +1120781
    +1120783
    +1120787
    +1120799
    +1120807
    +1120811
    +1120831
    +1120837
    +1120849
    +1120871
    +1120883
    +1120901
    +1120907
    +1120913
    +1120919
    +1120939
    +1120957
    +1120961
    +1120969
    +1120993
    +1121011
    +1121017
    +1121023
    +1121027
    +1121033
    +1121047
    +1121051
    +1121083
    +1121093
    +1121101
    +1121143
    +1121147
    +1121173
    +1121179
    +1121189
    +1121191
    +1121203
    +1121221
    +1121231
    +1121249
    +1121257
    +1121261
    +1121293
    +1121297
    +1121317
    +1121333
    +1121347
    +1121357
    +1121369
    +1121377
    +1121383
    +1121387
    +1121389
    +1121423
    +1121431
    +1121443
    +1121447
    +1121453
    +1121509
    +1121539
    +1121543
    +1121557
    +1121599
    +1121621
    +1121629
    +1121651
    +1121671
    +1121689
    +1121693
    +1121699
    +1121707
    +1121723
    +1121737
    +1121819
    +1121831
    +1121833
    +1121837
    +1121839
    +1121867
    +1121899
    +1121933
    +1121941
    +1121947
    +1121987
    +1121993
    +1122001
    +1122029
    +1122041
    +1122053
    +1122071
    +1122089
    +1122091
    +1122103
    +1122113
    +1122131
    +1122133
    +1122137
    +1122139
    +1122157
    +1122179
    +1122181
    +1122227
    +1122241
    +1122259
    +1122263
    +1122269
    +1122281
    +1122283
    +1122287
    +1122367
    +1122371
    +1122389
    +1122397
    +1122419
    +1122427
    +1122431
    +1122437
    +1122449
    +1122467
    +1122481
    +1122491
    +1122529
    +1122533
    +1122551
    +1122571
    +1122587
    +1122599
    +1122623
    +1122643
    +1122647
    +1122659
    +1122679
    +1122683
    +1122701
    +1122721
    +1122739
    +1122749
    +1122757
    +1122761
    +1122811
    +1122841
    +1122857
    +1122887
    +1122899
    +1122923
    +1122937
    +1122941
    +1122983
    +1122997
    +1123051
    +1123079
    +1123081
    +1123093
    +1123127
    +1123151
    +1123181
    +1123189
    +1123211
    +1123217
    +1123219
    +1123231
    +1123247
    +1123267
    +1123279
    +1123303
    +1123307
    +1123319
    +1123327
    +1123349
    +1123351
    +1123361
    +1123379
    +1123391
    +1123399
    +1123403
    +1123427
    +1123429
    +1123439
    +1123477
    +1123483
    +1123487
    +1123501
    +1123511
    +1123517
    +1123531
    +1123541
    +1123553
    +1123561
    +1123567
    +1123589
    +1123597
    +1123601
    +1123621
    +1123631
    +1123637
    +1123651
    +1123667
    +1123669
    +1123691
    +1123693
    +1123699
    +1123709
    +1123729
    +1123739
    +1123741
    +1123747
    +1123777
    +1123807
    +1123841
    +1123867
    +1123873
    +1123879
    +1123883
    +1123897
    +1123901
    +1123909
    +1123919
    +1123931
    +1123943
    +1123951
    +1123961
    +1123973
    +1123979
    +1123999
    +1124027
    +1124041
    +1124051
    +1124083
    +1124087
    +1124107
    +1124113
    +1124119
    +1124131
    +1124141
    +1124147
    +1124197
    +1124203
    +1124209
    +1124219
    +1124239
    +1124251
    +1124267
    +1124269
    +1124293
    +1124297
    +1124303
    +1124317
    +1124351
    +1124353
    +1124369
    +1124377
    +1124423
    +1124429
    +1124437
    +1124441
    +1124443
    +1124449
    +1124509
    +1124531
    +1124551
    +1124561
    +1124581
    +1124593
    +1124597
    +1124603
    +1124639
    +1124647
    +1124653
    +1124659
    +1124681
    +1124687
    +1124699
    +1124719
    +1124741
    +1124749
    +1124759
    +1124789
    +1124797
    +1124803
    +1124807
    +1124813
    +1124831
    +1124833
    +1124867
    +1124869
    +1124951
    +1124957
    +1124969
    +1124983
    +1124987
    +1124993
    +1125001
    +1125013
    +1125017
    +1125029
    +1125053
    +1125097
    +1125109
    +1125121
    +1125127
    +1125139
    +1125143
    +1125151
    +1125167
    +1125169
    +1125193
    +1125203
    +1125209
    +1125217
    +1125221
    +1125253
    +1125259
    +1125283
    +1125317
    +1125323
    +1125329
    +1125343
    +1125359
    +1125361
    +1125379
    +1125391
    +1125401
    +1125407
    +1125419
    +1125431
    +1125433
    +1125469
    +1125473
    +1125479
    +1125499
    +1125529
    +1125539
    +1125557
    +1125559
    +1125569
    +1125571
    +1125581
    +1125599
    +1125629
    +1125647
    +1125653
    +1125679
    +1125701
    +1125713
    +1125739
    +1125763
    +1125767
    +1125793
    +1125797
    +1125811
    +1125823
    +1125833
    +1125857
    +1125871
    +1125899
    +1125907
    +1125911
    +1125913
    +1125923
    +1125931
    +1125941
    +1125953
    +1125973
    +1125991
    +1126031
    +1126033
    +1126043
    +1126067
    +1126093
    +1126159
    +1126189
    +1126201
    +1126211
    +1126219
    +1126247
    +1126253
    +1126259
    +1126283
    +1126313
    +1126319
    +1126343
    +1126351
    +1126357
    +1126361
    +1126381
    +1126387
    +1126397
    +1126399
    +1126421
    +1126439
    +1126441
    +1126457
    +1126459
    +1126483
    +1126501
    +1126513
    +1126519
    +1126523
    +1126537
    +1126553
    +1126561
    +1126577
    +1126579
    +1126597
    +1126627
    +1126649
    +1126661
    +1126663
    +1126667
    +1126669
    +1126693
    +1126703
    +1126711
    +1126751
    +1126759
    +1126771
    +1126781
    +1126787
    +1126823
    +1126831
    +1126837
    +1126843
    +1126847
    +1126859
    +1126861
    +1126889
    +1126897
    +1126963
    +1126973
    +1126991
    +1126999
    +1127011
    +1127029
    +1127033
    +1127039
    +1127051
    +1127081
    +1127101
    +1127111
    +1127123
    +1127149
    +1127153
    +1127167
    +1127177
    +1127183
    +1127197
    +1127209
    +1127221
    +1127227
    +1127239
    +1127249
    +1127263
    +1127281
    +1127297
    +1127303
    +1127309
    +1127311
    +1127323
    +1127333
    +1127351
    +1127359
    +1127369
    +1127381
    +1127383
    +1127393
    +1127407
    +1127411
    +1127443
    +1127447
    +1127453
    +1127461
    +1127507
    +1127513
    +1127527
    +1127531
    +1127537
    +1127557
    +1127561
    +1127573
    +1127587
    +1127603
    +1127617
    +1127629
    +1127641
    +1127657
    +1127663
    +1127683
    +1127701
    +1127741
    +1127767
    +1127773
    +1127801
    +1127803
    +1127809
    +1127813
    +1127837
    +1127849
    +1127857
    +1127881
    +1127891
    +1127911
    +1127947
    +1127957
    +1127969
    +1127981
    +1127983
    +1127993
    +1128031
    +1128037
    +1128089
    +1128091
    +1128107
    +1128109
    +1128143
    +1128151
    +1128161
    +1128181
    +1128209
    +1128223
    +1128227
    +1128233
    +1128247
    +1128251
    +1128287
    +1128289
    +1128293
    +1128299
    +1128301
    +1128313
    +1128349
    +1128371
    +1128373
    +1128383
    +1128397
    +1128427
    +1128433
    +1128451
    +1128497
    +1128499
    +1128503
    +1128509
    +1128521
    +1128527
    +1128539
    +1128553
    +1128557
    +1128577
    +1128583
    +1128599
    +1128601
    +1128623
    +1128629
    +1128637
    +1128641
    +1128643
    +1128661
    +1128667
    +1128691
    +1128697
    +1128703
    +1128713
    +1128719
    +1128727
    +1128731
    +1128737
    +1128761
    +1128763
    +1128769
    +1128773
    +1128779
    +1128781
    +1128811
    +1128821
    +1128823
    +1128889
    +1128899
    +1128901
    +1128917
    +1128931
    +1128937
    +1128943
    +1128947
    +1128949
    +1128977
    +1128979
    +1128997
    +1129013
    +1129019
    +1129033
    +1129043
    +1129103
    +1129109
    +1129111
    +1129127
    +1129133
    +1129153
    +1129159
    +1129169
    +1129187
    +1129211
    +1129213
    +1129217
    +1129229
    +1129253
    +1129283
    +1129307
    +1129313
    +1129333
    +1129343
    +1129367
    +1129391
    +1129399
    +1129409
    +1129433
    +1129439
    +1129441
    +1129459
    +1129477
    +1129487
    +1129489
    +1129501
    +1129511
    +1129519
    +1129523
    +1129559
    +1129561
    +1129571
    +1129577
    +1129603
    +1129619
    +1129643
    +1129663
    +1129679
    +1129693
    +1129699
    +1129717
    +1129729
    +1129741
    +1129747
    +1129757
    +1129763
    +1129787
    +1129789
    +1129819
    +1129831
    +1129841
    +1129847
    +1129853
    +1129859
    +1129861
    +1129889
    +1129897
    +1129951
    +1129957
    +1129963
    +1129991
    +1130011
    +1130023
    +1130039
    +1130047
    +1130053
    +1130057
    +1130081
    +1130099
    +1130117
    +1130123
    +1130131
    +1130191
    +1130237
    +1130251
    +1130257
    +1130267
    +1130273
    +1130281
    +1130287
    +1130293
    +1130299
    +1130317
    +1130321
    +1130351
    +1130359
    +1130369
    +1130407
    +1130413
    +1130417
    +1130429
    +1130431
    +1130447
    +1130471
    +1130497
    +1130501
    +1130527
    +1130561
    +1130579
    +1130581
    +1130587
    +1130621
    +1130627
    +1130629
    +1130639
    +1130641
    +1130651
    +1130677
    +1130693
    +1130699
    +1130711
    +1130719
    +1130737
    +1130741
    +1130777
    +1130783
    +1130803
    +1130807
    +1130809
    +1130813
    +1130819
    +1130827
    +1130863
    +1130929
    +1130939
    +1130947
    +1130951
    +1130953
    +1130957
    +1130963
    +1130981
    +1131023
    +1131047
    +1131049
    +1131077
    +1131079
    +1131083
    +1131103
    +1131113
    +1131121
    +1131131
    +1131133
    +1131139
    +1131157
    +1131181
    +1131191
    +1131217
    +1131223
    +1131239
    +1131253
    +1131259
    +1131269
    +1131271
    +1131307
    +1131323
    +1131329
    +1131331
    +1131341
    +1131343
    +1131353
    +1131379
    +1131397
    +1131413
    +1131419
    +1131421
    +1131437
    +1131451
    +1131463
    +1131467
    +1131479
    +1131491
    +1131509
    +1131523
    +1131547
    +1131553
    +1131569
    +1131617
    +1131629
    +1131643
    +1131653
    +1131671
    +1131677
    +1131701
    +1131721
    +1131727
    +1131737
    +1131749
    +1131751
    +1131763
    +1131769
    +1131787
    +1131799
    +1131821
    +1131827
    +1131829
    +1131839
    +1131857
    +1131863
    +1131869
    +1131881
    +1131883
    +1131913
    +1131917
    +1131919
    +1131937
    +1131943
    +1131959
    +1131961
    +1131973
    +1131997
    +1132003
    +1132009
    +1132063
    +1132067
    +1132091
    +1132123
    +1132139
    +1132141
    +1132177
    +1132199
    +1132223
    +1132249
    +1132259
    +1132291
    +1132301
    +1132309
    +1132321
    +1132333
    +1132393
    +1132403
    +1132409
    +1132423
    +1132429
    +1132447
    +1132463
    +1132471
    +1132477
    +1132487
    +1132499
    +1132507
    +1132511
    +1132519
    +1132529
    +1132541
    +1132561
    +1132567
    +1132583
    +1132597
    +1132601
    +1132603
    +1132627
    +1132633
    +1132639
    +1132643
    +1132661
    +1132667
    +1132673
    +1132679
    +1132697
    +1132721
    +1132739
    +1132753
    +1132783
    +1132787
    +1132793
    +1132811
    +1132823
    +1132861
    +1132877
    +1132883
    +1132909
    +1132919
    +1132927
    +1132933
    +1132949
    +1132969
    +1132979
    +1132987
    +1132991
    +1132993
    +1132997
    +1133009
    +1133017
    +1133039
    +1133047
    +1133053
    +1133071
    +1133131
    +1133147
    +1133149
    +1133159
    +1133173
    +1133177
    +1133183
    +1133189
    +1133191
    +1133219
    +1133227
    +1133239
    +1133257
    +1133261
    +1133263
    +1133287
    +1133303
    +1133317
    +1133333
    +1133357
    +1133359
    +1133381
    +1133387
    +1133459
    +1133467
    +1133477
    +1133479
    +1133501
    +1133507
    +1133513
    +1133519
    +1133533
    +1133537
    +1133551
    +1133579
    +1133591
    +1133621
    +1133623
    +1133633
    +1133641
    +1133651
    +1133653
    +1133659
    +1133677
    +1133681
    +1133683
    +1133689
    +1133731
    +1133777
    +1133789
    +1133809
    +1133819
    +1133827
    +1133837
    +1133843
    +1133851
    +1133857
    +1133861
    +1133893
    +1133897
    +1133903
    +1133911
    +1133933
    +1133947
    +1133959
    +1133963
    +1133971
    +1133989
    +1134031
    +1134037
    +1134043
    +1134047
    +1134059
    +1134071
    +1134079
    +1134113
    +1134137
    +1134143
    +1134149
    +1134151
    +1134163
    +1134169
    +1134179
    +1134187
    +1134193
    +1134239
    +1134241
    +1134247
    +1134271
    +1134283
    +1134299
    +1134311
    +1134313
    +1134389
    +1134391
    +1134403
    +1134421
    +1134437
    +1134443
    +1134449
    +1134467
    +1134479
    +1134481
    +1134487
    +1134503
    +1134517
    +1134541
    +1134557
    +1134559
    +1134583
    +1134587
    +1134607
    +1134611
    +1134619
    +1134649
    +1134667
    +1134673
    +1134691
    +1134697
    +1134703
    +1134709
    +1134719
    +1134769
    +1134781
    +1134787
    +1134811
    +1134821
    +1134841
    +1134863
    +1134871
    +1134877
    +1134883
    +1134907
    +1134923
    +1134929
    +1134961
    +1134967
    +1134977
    +1134989
    +1135007
    +1135009
    +1135019
    +1135021
    +1135061
    +1135063
    +1135081
    +1135087
    +1135091
    +1135093
    +1135103
    +1135111
    +1135129
    +1135133
    +1135159
    +1135171
    +1135187
    +1135201
    +1135217
    +1135229
    +1135237
    +1135241
    +1135247
    +1135261
    +1135279
    +1135283
    +1135291
    +1135327
    +1135333
    +1135339
    +1135363
    +1135367
    +1135403
    +1135411
    +1135427
    +1135429
    +1135439
    +1135451
    +1135469
    +1135483
    +1135513
    +1135531
    +1135597
    +1135613
    +1135619
    +1135633
    +1135643
    +1135657
    +1135663
    +1135699
    +1135703
    +1135711
    +1135721
    +1135733
    +1135751
    +1135777
    +1135819
    +1135831
    +1135837
    +1135847
    +1135853
    +1135859
    +1135861
    +1135873
    +1135879
    +1135891
    +1135903
    +1135913
    +1135919
    +1135921
    +1135951
    +1135963
    +1135969
    +1135997
    +1135999
    +1136041
    +1136053
    +1136063
    +1136077
    +1136081
    +1136087
    +1136089
    +1136111
    +1136117
    +1136123
    +1136129
    +1136147
    +1136153
    +1136183
    +1136203
    +1136221
    +1136227
    +1136231
    +1136237
    +1136287
    +1136299
    +1136309
    +1136327
    +1136329
    +1136339
    +1136357
    +1136363
    +1136383
    +1136389
    +1136393
    +1136411
    +1136417
    +1136449
    +1136459
    +1136461
    +1136477
    +1136483
    +1136557
    +1136567
    +1136579
    +1136587
    +1136593
    +1136609
    +1136617
    +1136623
    +1136627
    +1136633
    +1136647
    +1136651
    +1136659
    +1136669
    +1136699
    +1136717
    +1136719
    +1136741
    +1136749
    +1136767
    +1136809
    +1136813
    +1136819
    +1136831
    +1136833
    +1136843
    +1136869
    +1136897
    +1136917
    +1136921
    +1136939
    +1136951
    +1136969
    +1136981
    +1136983
    +1136999
    +1137001
    +1137007
    +1137029
    +1137067
    +1137091
    +1137109
    +1137137
    +1137139
    +1137161
    +1137163
    +1137167
    +1137179
    +1137203
    +1137209
    +1137229
    +1137233
    +1137247
    +1137263
    +1137271
    +1137289
    +1137313
    +1137329
    +1137337
    +1137341
    +1137403
    +1137407
    +1137427
    +1137439
    +1137457
    +1137481
    +1137503
    +1137527
    +1137529
    +1137547
    +1137551
    +1137553
    +1137569
    +1137611
    +1137613
    +1137629
    +1137659
    +1137667
    +1137673
    +1137677
    +1137707
    +1137733
    +1137743
    +1137749
    +1137767
    +1137781
    +1137803
    +1137809
    +1137811
    +1137817
    +1137859
    +1137863
    +1137869
    +1137881
    +1137883
    +1137887
    +1137889
    +1137911
    +1137919
    +1137937
    +1137953
    +1137959
    +1137973
    +1137977
    +1137991
    +1138019
    +1138057
    +1138061
    +1138091
    +1138097
    +1138117
    +1138127
    +1138141
    +1138147
    +1138171
    +1138183
    +1138213
    +1138237
    +1138273
    +1138363
    +1138367
    +1138369
    +1138391
    +1138393
    +1138409
    +1138411
    +1138427
    +1138429
    +1138433
    +1138441
    +1138451
    +1138457
    +1138483
    +1138519
    +1138547
    +1138559
    +1138567
    +1138589
    +1138591
    +1138637
    +1138639
    +1138649
    +1138667
    +1138673
    +1138679
    +1138681
    +1138703
    +1138717
    +1138729
    +1138733
    +1138741
    +1138751
    +1138757
    +1138771
    +1138777
    +1138793
    +1138829
    +1138831
    +1138849
    +1138853
    +1138867
    +1138883
    +1138901
    +1138919
    +1138957
    +1138961
    +1138967
    +1138979
    +1138987
    +1138997
    +1138999
    +1139003
    +1139011
    +1139041
    +1139059
    +1139081
    +1139087
    +1139123
    +1139141
    +1139143
    +1139147
    +1139191
    +1139197
    +1139227
    +1139239
    +1139249
    +1139263
    +1139269
    +1139273
    +1139287
    +1139291
    +1139293
    +1139309
    +1139321
    +1139329
    +1139353
    +1139387
    +1139393
    +1139407
    +1139423
    +1139461
    +1139471
    +1139473
    +1139483
    +1139491
    +1139503
    +1139519
    +1139521
    +1139531
    +1139539
    +1139549
    +1139557
    +1139573
    +1139587
    +1139623
    +1139669
    +1139681
    +1139683
    +1139687
    +1139713
    +1139717
    +1139741
    +1139771
    +1139773
    +1139779
    +1139807
    +1139819
    +1139843
    +1139849
    +1139851
    +1139861
    +1139863
    +1139869
    +1139909
    +1139911
    +1139917
    +1139921
    +1139951
    +1139959
    +1139989
    +1139993
    +1140091
    +1140101
    +1140103
    +1140121
    +1140127
    +1140131
    +1140137
    +1140143
    +1140157
    +1140163
    +1140197
    +1140203
    +1140233
    +1140239
    +1140253
    +1140257
    +1140281
    +1140289
    +1140311
    +1140319
    +1140341
    +1140353
    +1140371
    +1140379
    +1140383
    +1140389
    +1140413
    +1140421
    +1140431
    +1140439
    +1140449
    +1140463
    +1140487
    +1140493
    +1140533
    +1140539
    +1140563
    +1140569
    +1140571
    +1140577
    +1140611
    +1140619
    +1140637
    +1140677
    +1140679
    +1140691
    +1140697
    +1140709
    +1140721
    +1140749
    +1140787
    +1140803
    +1140847
    +1140851
    +1140859
    +1140863
    +1140871
    +1140901
    +1140911
    +1140913
    +1140929
    +1140949
    +1140959
    +1140967
    +1140973
    +1140983
    +1140991
    +1141009
    +1141013
    +1141027
    +1141031
    +1141033
    +1141039
    +1141061
    +1141067
    +1141081
    +1141087
    +1141093
    +1141097
    +1141103
    +1141109
    +1141123
    +1141139
    +1141171
    +1141219
    +1141223
    +1141229
    +1141241
    +1141243
    +1141253
    +1141267
    +1141271
    +1141277
    +1141279
    +1141289
    +1141291
    +1141303
    +1141319
    +1141321
    +1141351
    +1141373
    +1141379
    +1141381
    +1141391
    +1141417
    +1141423
    +1141447
    +1141453
    +1141477
    +1141507
    +1141523
    +1141529
    +1141531
    +1141541
    +1141571
    +1141573
    +1141597
    +1141631
    +1141633
    +1141649
    +1141661
    +1141667
    +1141717
    +1141739
    +1141757
    +1141769
    +1141801
    +1141813
    +1141837
    +1141849
    +1141853
    +1141867
    +1141871
    +1141901
    +1141909
    +1141949
    +1141963
    +1141967
    +1141969
    +1141999
    +1142003
    +1142017
    +1142021
    +1142039
    +1142041
    +1142059
    +1142069
    +1142083
    +1142129
    +1142131
    +1142159
    +1142161
    +1142171
    +1142191
    +1142201
    +1142233
    +1142237
    +1142243
    +1142263
    +1142269
    +1142279
    +1142287
    +1142311
    +1142321
    +1142333
    +1142353
    +1142357
    +1142359
    +1142363
    +1142389
    +1142423
    +1142431
    +1142473
    +1142483
    +1142503
    +1142507
    +1142509
    +1142539
    +1142549
    +1142569
    +1142573
    +1142593
    +1142599
    +1142633
    +1142651
    +1142677
    +1142693
    +1142707
    +1142737
    +1142759
    +1142773
    +1142777
    +1142783
    +1142789
    +1142809
    +1142821
    +1142833
    +1142837
    +1142851
    +1142863
    +1142881
    +1142891
    +1142909
    +1142917
    +1142923
    +1142929
    +1142941
    +1142959
    +1142969
    +1142971
    +1143013
    +1143019
    +1143047
    +1143049
    +1143053
    +1143061
    +1143067
    +1143071
    +1143073
    +1143089
    +1143091
    +1143101
    +1143113
    +1143143
    +1143161
    +1143167
    +1143193
    +1143217
    +1143223
    +1143227
    +1143239
    +1143257
    +1143269
    +1143281
    +1143283
    +1143299
    +1143341
    +1143347
    +1143371
    +1143391
    +1143407
    +1143433
    +1143469
    +1143473
    +1143481
    +1143487
    +1143529
    +1143551
    +1143563
    +1143577
    +1143587
    +1143589
    +1143601
    +1143619
    +1143643
    +1143647
    +1143661
    +1143679
    +1143697
    +1143719
    +1143749
    +1143763
    +1143799
    +1143803
    +1143809
    +1143817
    +1143829
    +1143851
    +1143887
    +1143893
    +1143943
    +1143949
    +1143953
    +1143959
    +1143977
    +1144001
    +1144007
    +1144019
    +1144037
    +1144061
    +1144081
    +1144103
    +1144139
    +1144141
    +1144147
    +1144153
    +1144163
    +1144183
    +1144193
    +1144211
    +1144223
    +1144243
    +1144249
    +1144261
    +1144271
    +1144277
    +1144279
    +1144291
    +1144301
    +1144327
    +1144333
    +1144343
    +1144349
    +1144357
    +1144379
    +1144393
    +1144399
    +1144417
    +1144439
    +1144441
    +1144453
    +1144477
    +1144483
    +1144499
    +1144511
    +1144519
    +1144523
    +1144529
    +1144537
    +1144573
    +1144589
    +1144603
    +1144607
    +1144621
    +1144643
    +1144657
    +1144667
    +1144681
    +1144691
    +1144721
    +1144723
    +1144727
    +1144739
    +1144757
    +1144783
    +1144823
    +1144837
    +1144867
    +1144877
    +1144879
    +1144889
    +1144901
    +1144903
    +1144907
    +1144919
    +1144931
    +1144939
    +1144951
    +1144973
    +1144981
    +1144993
    +1145003
    +1145021
    +1145057
    +1145059
    +1145077
    +1145093
    +1145099
    +1145107
    +1145129
    +1145141
    +1145143
    +1145173
    +1145189
    +1145191
    +1145203
    +1145213
    +1145227
    +1145269
    +1145281
    +1145293
    +1145299
    +1145303
    +1145311
    +1145323
    +1145327
    +1145329
    +1145359
    +1145369
    +1145371
    +1145381
    +1145387
    +1145393
    +1145411
    +1145429
    +1145461
    +1145479
    +1145497
    +1145509
    +1145533
    +1145537
    +1145539
    +1145593
    +1145611
    +1145621
    +1145623
    +1145659
    +1145689
    +1145693
    +1145713
    +1145723
    +1145741
    +1145743
    +1145747
    +1145773
    +1145789
    +1145797
    +1145801
    +1145803
    +1145831
    +1145843
    +1145849
    +1145873
    +1145897
    +1145899
    +1145971
    +1145983
    +1145999
    +1146037
    +1146043
    +1146049
    +1146071
    +1146083
    +1146091
    +1146097
    +1146133
    +1146143
    +1146179
    +1146217
    +1146221
    +1146263
    +1146281
    +1146307
    +1146323
    +1146329
    +1146331
    +1146347
    +1146367
    +1146391
    +1146407
    +1146413
    +1146419
    +1146421
    +1146461
    +1146487
    +1146491
    +1146511
    +1146521
    +1146529
    +1146533
    +1146539
    +1146559
    +1146569
    +1146581
    +1146661
    +1146671
    +1146679
    +1146697
    +1146703
    +1146709
    +1146713
    +1146727
    +1146731
    +1146763
    +1146773
    +1146779
    +1146781
    +1146787
    +1146791
    +1146793
    +1146797
    +1146799
    +1146809
    +1146823
    +1146829
    +1146833
    +1146841
    +1146857
    +1146869
    +1146877
    +1146881
    +1146911
    +1146917
    +1146931
    +1146947
    +1146953
    +1146967
    +1146989
    +1147009
    +1147021
    +1147039
    +1147043
    +1147051
    +1147067
    +1147073
    +1147099
    +1147103
    +1147117
    +1147127
    +1147141
    +1147169
    +1147183
    +1147187
    +1147189
    +1147193
    +1147213
    +1147229
    +1147231
    +1147243
    +1147247
    +1147249
    +1147253
    +1147271
    +1147273
    +1147297
    +1147301
    +1147331
    +1147339
    +1147351
    +1147379
    +1147387
    +1147409
    +1147417
    +1147423
    +1147427
    +1147441
    +1147451
    +1147453
    +1147459
    +1147463
    +1147499
    +1147507
    +1147511
    +1147561
    +1147567
    +1147571
    +1147579
    +1147583
    +1147591
    +1147613
    +1147621
    +1147637
    +1147639
    +1147669
    +1147697
    +1147709
    +1147711
    +1147717
    +1147739
    +1147759
    +1147793
    +1147819
    +1147841
    +1147843
    +1147889
    +1147897
    +1147903
    +1147921
    +1147931
    +1147969
    +1147981
    +1147987
    +1147997
    +1148029
    +1148039
    +1148047
    +1148087
    +1148089
    +1148099
    +1148111
    +1148167
    +1148171
    +1148177
    +1148219
    +1148249
    +1148261
    +1148263
    +1148291
    +1148293
    +1148297
    +1148311
    +1148327
    +1148339
    +1148359
    +1148377
    +1148387
    +1148437
    +1148453
    +1148489
    +1148501
    +1148507
    +1148513
    +1148527
    +1148549
    +1148561
    +1148593
    +1148599
    +1148621
    +1148629
    +1148647
    +1148663
    +1148677
    +1148681
    +1148687
    +1148701
    +1148713
    +1148729
    +1148731
    +1148737
    +1148747
    +1148753
    +1148761
    +1148773
    +1148837
    +1148839
    +1148857
    +1148867
    +1148879
    +1148921
    +1148933
    +1148941
    +1148957
    +1148963
    +1148971
    +1148977
    +1148981
    +1148989
    +1148999
    +1149007
    +1149017
    +1149037
    +1149053
    +1149059
    +1149061
    +1149131
    +1149151
    +1149157
    +1149163
    +1149167
    +1149191
    +1149193
    +1149209
    +1149221
    +1149227
    +1149229
    +1149233
    +1149259
    +1149283
    +1149307
    +1149341
    +1149349
    +1149361
    +1149373
    +1149403
    +1149409
    +1149413
    +1149427
    +1149457
    +1149469
    +1149487
    +1149493
    +1149503
    +1149509
    +1149521
    +1149527
    +1149539
    +1149559
    +1149569
    +1149581
    +1149587
    +1149593
    +1149601
    +1149607
    +1149619
    +1149637
    +1149641
    +1149661
    +1149679
    +1149689
    +1149737
    +1149749
    +1149769
    +1149773
    +1149779
    +1149803
    +1149817
    +1149857
    +1149859
    +1149881
    +1149887
    +1149901
    +1149913
    +1149917
    +1149919
    +1149943
    +1149971
    +1149979
    +1149983
    +1149989
    +1149991
    +1150027
    +1150031
    +1150057
    +1150063
    +1150073
    +1150081
    +1150103
    +1150117
    +1150139
    +1150141
    +1150151
    +1150159
    +1150183
    +1150187
    +1150199
    +1150211
    +1150213
    +1150217
    +1150229
    +1150243
    +1150249
    +1150301
    +1150309
    +1150349
    +1150351
    +1150363
    +1150397
    +1150403
    +1150411
    +1150417
    +1150421
    +1150423
    +1150447
    +1150489
    +1150511
    +1150519
    +1150531
    +1150537
    +1150547
    +1150561
    +1150579
    +1150603
    +1150609
    +1150631
    +1150649
    +1150651
    +1150657
    +1150661
    +1150673
    +1150687
    +1150703
    +1150717
    +1150729
    +1150733
    +1150739
    +1150741
    +1150757
    +1150763
    +1150769
    +1150777
    +1150783
    +1150823
    +1150837
    +1150847
    +1150861
    +1150867
    +1150871
    +1150873
    +1150879
    +1150909
    +1150921
    +1150927
    +1150939
    +1150949
    +1150957
    +1150973
    +1150987
    +1151021
    +1151041
    +1151047
    +1151057
    +1151063
    +1151069
    +1151083
    +1151089
    +1151113
    +1151141
    +1151147
    +1151159
    +1151167
    +1151177
    +1151179
    +1151203
    +1151209
    +1151221
    +1151233
    +1151237
    +1151243
    +1151251
    +1151287
    +1151303
    +1151317
    +1151327
    +1151333
    +1151363
    +1151369
    +1151383
    +1151389
    +1151399
    +1151401
    +1151413
    +1151417
    +1151431
    +1151441
    +1151443
    +1151471
    +1151473
    +1151483
    +1151519
    +1151537
    +1151569
    +1151581
    +1151593
    +1151599
    +1151603
    +1151611
    +1151629
    +1151639
    +1151651
    +1151653
    +1151659
    +1151671
    +1151687
    +1151701
    +1151713
    +1151729
    +1151737
    +1151747
    +1151753
    +1151779
    +1151807
    +1151861
    +1151873
    +1151879
    +1151881
    +1151911
    +1151933
    +1151963
    +1151981
    +1151987
    +1151993
    +1151999
    +1152023
    +1152029
    +1152037
    +1152071
    +1152077
    +1152079
    +1152091
    +1152113
    +1152119
    +1152121
    +1152149
    +1152157
    +1152161
    +1152163
    +1152181
    +1152187
    +1152227
    +1152233
    +1152287
    +1152313
    +1152317
    +1152337
    +1152343
    +1152367
    +1152383
    +1152391
    +1152397
    +1152419
    +1152421
    +1152493
    +1152509
    +1152517
    +1152523
    +1152527
    +1152589
    +1152623
    +1152629
    +1152631
    +1152637
    +1152643
    +1152649
    +1152653
    +1152667
    +1152677
    +1152707
    +1152733
    +1152751
    +1152757
    +1152761
    +1152763
    +1152773
    +1152791
    +1152793
    +1152799
    +1152841
    +1152857
    +1152881
    +1152887
    +1152913
    +1152917
    +1152937
    +1152941
    +1152979
    +1152989
    +1152997
    +1153001
    +1153007
    +1153021
    +1153027
    +1153049
    +1153057
    +1153063
    +1153073
    +1153099
    +1153109
    +1153123
    +1153147
    +1153153
    +1153157
    +1153171
    +1153177
    +1153183
    +1153199
    +1153211
    +1153219
    +1153223
    +1153237
    +1153241
    +1153247
    +1153249
    +1153261
    +1153267
    +1153277
    +1153309
    +1153337
    +1153343
    +1153349
    +1153367
    +1153393
    +1153421
    +1153429
    +1153441
    +1153457
    +1153459
    +1153463
    +1153483
    +1153487
    +1153511
    +1153517
    +1153531
    +1153553
    +1153573
    +1153577
    +1153589
    +1153597
    +1153609
    +1153613
    +1153639
    +1153643
    +1153681
    +1153687
    +1153721
    +1153729
    +1153751
    +1153753
    +1153759
    +1153769
    +1153777
    +1153799
    +1153811
    +1153849
    +1153853
    +1153871
    +1153891
    +1153921
    +1153967
    +1153973
    +1154017
    +1154029
    +1154033
    +1154039
    +1154047
    +1154051
    +1154119
    +1154123
    +1154129
    +1154159
    +1154173
    +1154177
    +1154183
    +1154207
    +1154221
    +1154227
    +1154233
    +1154239
    +1154243
    +1154267
    +1154291
    +1154297
    +1154299
    +1154311
    +1154323
    +1154327
    +1154339
    +1154353
    +1154359
    +1154369
    +1154401
    +1154411
    +1154431
    +1154449
    +1154467
    +1154473
    +1154509
    +1154513
    +1154537
    +1154539
    +1154551
    +1154561
    +1154563
    +1154567
    +1154579
    +1154581
    +1154603
    +1154633
    +1154639
    +1154651
    +1154653
    +1154707
    +1154723
    +1154737
    +1154753
    +1154771
    +1154789
    +1154819
    +1154821
    +1154849
    +1154863
    +1154887
    +1154893
    +1154897
    +1154911
    +1154927
    +1154947
    +1154969
    +1154971
    +1154987
    +1155001
    +1155017
    +1155019
    +1155053
    +1155061
    +1155071
    +1155097
    +1155101
    +1155107
    +1155127
    +1155149
    +1155151
    +1155169
    +1155179
    +1155211
    +1155223
    +1155233
    +1155239
    +1155247
    +1155263
    +1155293
    +1155311
    +1155317
    +1155373
    +1155377
    +1155379
    +1155403
    +1155419
    +1155431
    +1155437
    +1155449
    +1155457
    +1155461
    +1155499
    +1155527
    +1155529
    +1155569
    +1155577
    +1155601
    +1155607
    +1155611
    +1155613
    +1155617
    +1155619
    +1155629
    +1155631
    +1155653
    +1155659
    +1155689
    +1155697
    +1155701
    +1155703
    +1155709
    +1155733
    +1155821
    +1155823
    +1155829
    +1155841
    +1155851
    +1155859
    +1155863
    +1155899
    +1155901
    +1155907
    +1155919
    +1155923
    +1155929
    +1155937
    +1155943
    +1155953
    +1155961
    +1155967
    +1155971
    +1155977
    +1155997
    +1156009
    +1156013
    +1156019
    +1156031
    +1156033
    +1156037
    +1156039
    +1156073
    +1156079
    +1156087
    +1156097
    +1156109
    +1156121
    +1156151
    +1156157
    +1156171
    +1156217
    +1156229
    +1156231
    +1156249
    +1156261
    +1156271
    +1156291
    +1156297
    +1156303
    +1156307
    +1156327
    +1156333
    +1156343
    +1156367
    +1156369
    +1156387
    +1156403
    +1156423
    +1156427
    +1156429
    +1156451
    +1156453
    +1156457
    +1156483
    +1156501
    +1156523
    +1156537
    +1156541
    +1156553
    +1156567
    +1156591
    +1156613
    +1156627
    +1156633
    +1156637
    +1156643
    +1156681
    +1156699
    +1156709
    +1156711
    +1156721
    +1156741
    +1156747
    +1156751
    +1156769
    +1156783
    +1156801
    +1156807
    +1156819
    +1156823
    +1156847
    +1156849
    +1156873
    +1156907
    +1156927
    +1156949
    +1156963
    +1156997
    +1157011
    +1157017
    +1157033
    +1157053
    +1157059
    +1157063
    +1157069
    +1157077
    +1157099
    +1157111
    +1157131
    +1157159
    +1157171
    +1157179
    +1157183
    +1157201
    +1157203
    +1157209
    +1157213
    +1157227
    +1157237
    +1157243
    +1157251
    +1157257
    +1157263
    +1157279
    +1157293
    +1157327
    +1157333
    +1157339
    +1157341
    +1157357
    +1157363
    +1157369
    +1157381
    +1157393
    +1157413
    +1157437
    +1157449
    +1157489
    +1157491
    +1157503
    +1157531
    +1157539
    +1157557
    +1157579
    +1157591
    +1157609
    +1157621
    +1157627
    +1157641
    +1157669
    +1157671
    +1157699
    +1157701
    +1157711
    +1157713
    +1157729
    +1157747
    +1157749
    +1157759
    +1157771
    +1157773
    +1157791
    +1157831
    +1157833
    +1157837
    +1157839
    +1157851
    +1157869
    +1157873
    +1157899
    +1157929
    +1157953
    +1157969
    +1157977
    +1157987
    +1158007
    +1158011
    +1158037
    +1158071
    +1158077
    +1158089
    +1158121
    +1158133
    +1158139
    +1158161
    +1158187
    +1158197
    +1158203
    +1158217
    +1158247
    +1158251
    +1158263
    +1158271
    +1158293
    +1158301
    +1158307
    +1158317
    +1158323
    +1158341
    +1158361
    +1158383
    +1158389
    +1158401
    +1158407
    +1158419
    +1158427
    +1158457
    +1158461
    +1158467
    +1158473
    +1158481
    +1158491
    +1158523
    +1158529
    +1158539
    +1158541
    +1158551
    +1158569
    +1158587
    +1158593
    +1158607
    +1158611
    +1158613
    +1158617
    +1158629
    +1158643
    +1158653
    +1158673
    +1158679
    +1158683
    +1158713
    +1158719
    +1158743
    +1158757
    +1158761
    +1158769
    +1158799
    +1158821
    +1158823
    +1158827
    +1158841
    +1158847
    +1158863
    +1158881
    +1158887
    +1158923
    +1158953
    +1158961
    +1158977
    +1158991
    +1159001
    +1159007
    +1159027
    +1159031
    +1159049
    +1159063
    +1159073
    +1159079
    +1159087
    +1159091
    +1159127
    +1159139
    +1159153
    +1159187
    +1159189
    +1159199
    +1159201
    +1159229
    +1159231
    +1159241
    +1159243
    +1159259
    +1159271
    +1159283
    +1159303
    +1159337
    +1159339
    +1159381
    +1159393
    +1159397
    +1159421
    +1159423
    +1159429
    +1159447
    +1159463
    +1159489
    +1159517
    +1159523
    +1159531
    +1159541
    +1159577
    +1159583
    +1159597
    +1159601
    +1159633
    +1159649
    +1159661
    +1159663
    +1159709
    +1159721
    +1159777
    +1159787
    +1159789
    +1159811
    +1159813
    +1159843
    +1159853
    +1159861
    +1159877
    +1159889
    +1159901
    +1159909
    +1159919
    +1159967
    +1159973
    +1159981
    +1159993
    +1159997
    +1160009
    +1160039
    +1160041
    +1160057
    +1160077
    +1160111
    +1160129
    +1160141
    +1160147
    +1160161
    +1160167
    +1160179
    +1160207
    +1160213
    +1160219
    +1160221
    +1160227
    +1160251
    +1160279
    +1160287
    +1160297
    +1160303
    +1160309
    +1160317
    +1160351
    +1160359
    +1160363
    +1160371
    +1160407
    +1160413
    +1160429
    +1160443
    +1160447
    +1160449
    +1160459
    +1160473
    +1160479
    +1160491
    +1160503
    +1160513
    +1160519
    +1160543
    +1160567
    +1160569
    +1160581
    +1160597
    +1160611
    +1160639
    +1160659
    +1160681
    +1160689
    +1160713
    +1160717
    +1160749
    +1160771
    +1160807
    +1160813
    +1160837
    +1160839
    +1160867
    +1160893
    +1160903
    +1160911
    +1160927
    +1160941
    +1160953
    +1160977
    +1160983
    +1160987
    +1160989
    +1161001
    +1161007
    +1161011
    +1161031
    +1161037
    +1161047
    +1161059
    +1161077
    +1161091
    +1161101
    +1161107
    +1161113
    +1161137
    +1161143
    +1161163
    +1161169
    +1161203
    +1161217
    +1161227
    +1161233
    +1161239
    +1161241
    +1161263
    +1161269
    +1161289
    +1161313
    +1161317
    +1161331
    +1161343
    +1161371
    +1161397
    +1161401
    +1161403
    +1161437
    +1161439
    +1161443
    +1161449
    +1161463
    +1161481
    +1161487
    +1161493
    +1161497
    +1161499
    +1161509
    +1161521
    +1161529
    +1161547
    +1161551
    +1161553
    +1161581
    +1161599
    +1161617
    +1161619
    +1161637
    +1161647
    +1161659
    +1161683
    +1161691
    +1161703
    +1161749
    +1161757
    +1161761
    +1161767
    +1161781
    +1161791
    +1161829
    +1161833
    +1161841
    +1161851
    +1161857
    +1161871
    +1161877
    +1161883
    +1161893
    +1161929
    +1161931
    +1161947
    +1161949
    +1161991
    +1161997
    +1162009
    +1162037
    +1162043
    +1162061
    +1162067
    +1162079
    +1162081
    +1162093
    +1162099
    +1162129
    +1162193
    +1162219
    +1162223
    +1162229
    +1162243
    +1162253
    +1162261
    +1162277
    +1162279
    +1162297
    +1162303
    +1162321
    +1162339
    +1162361
    +1162367
    +1162373
    +1162417
    +1162423
    +1162453
    +1162463
    +1162471
    +1162481
    +1162493
    +1162501
    +1162507
    +1162529
    +1162537
    +1162541
    +1162543
    +1162547
    +1162559
    +1162571
    +1162573
    +1162583
    +1162589
    +1162597
    +1162619
    +1162621
    +1162631
    +1162649
    +1162663
    +1162669
    +1162687
    +1162691
    +1162709
    +1162727
    +1162729
    +1162741
    +1162751
    +1162753
    +1162771
    +1162789
    +1162793
    +1162807
    +1162853
    +1162859
    +1162867
    +1162877
    +1162879
    +1162897
    +1162901
    +1162907
    +1162927
    +1162937
    +1162943
    +1162951
    +1162957
    +1162961
    +1162969
    +1162981
    +1162991
    +1163003
    +1163011
    +1163017
    +1163033
    +1163039
    +1163069
    +1163077
    +1163081
    +1163083
    +1163093
    +1163111
    +1163119
    +1163131
    +1163137
    +1163143
    +1163147
    +1163159
    +1163167
    +1163177
    +1163189
    +1163207
    +1163221
    +1163231
    +1163233
    +1163251
    +1163257
    +1163263
    +1163273
    +1163311
    +1163329
    +1163333
    +1163339
    +1163353
    +1163417
    +1163423
    +1163431
    +1163441
    +1163467
    +1163473
    +1163479
    +1163483
    +1163507
    +1163521
    +1163543
    +1163551
    +1163557
    +1163581
    +1163587
    +1163609
    +1163611
    +1163627
    +1163629
    +1163641
    +1163651
    +1163653
    +1163663
    +1163671
    +1163689
    +1163699
    +1163711
    +1163713
    +1163717
    +1163719
    +1163737
    +1163753
    +1163759
    +1163783
    +1163791
    +1163821
    +1163831
    +1163843
    +1163849
    +1163873
    +1163879
    +1163891
    +1163923
    +1163947
    +1163969
    +1163971
    +1163977
    +1163989
    +1163993
    +1164001
    +1164029
    +1164043
    +1164067
    +1164071
    +1164077
    +1164091
    +1164101
    +1164173
    +1164179
    +1164181
    +1164193
    +1164199
    +1164203
    +1164217
    +1164221
    +1164253
    +1164287
    +1164323
    +1164343
    +1164367
    +1164409
    +1164413
    +1164419
    +1164431
    +1164433
    +1164439
    +1164461
    +1164479
    +1164497
    +1164503
    +1164511
    +1164521
    +1164533
    +1164557
    +1164571
    +1164587
    +1164589
    +1164593
    +1164599
    +1164607
    +1164617
    +1164623
    +1164629
    +1164641
    +1164659
    +1164671
    +1164689
    +1164731
    +1164749
    +1164791
    +1164799
    +1164803
    +1164811
    +1164817
    +1164829
    +1164841
    +1164853
    +1164859
    +1164869
    +1164899
    +1164937
    +1164941
    +1164953
    +1164967
    +1164979
    +1164991
    +1164997
    +1165001
    +1165037
    +1165049
    +1165051
    +1165057
    +1165069
    +1165079
    +1165081
    +1165103
    +1165121
    +1165127
    +1165139
    +1165147
    +1165183
    +1165187
    +1165189
    +1165193
    +1165201
    +1165207
    +1165211
    +1165217
    +1165223
    +1165273
    +1165279
    +1165301
    +1165303
    +1165349
    +1165357
    +1165361
    +1165363
    +1165379
    +1165397
    +1165399
    +1165421
    +1165447
    +1165453
    +1165471
    +1165511
    +1165529
    +1165531
    +1165579
    +1165583
    +1165643
    +1165667
    +1165691
    +1165711
    +1165721
    +1165727
    +1165729
    +1165739
    +1165751
    +1165777
    +1165789
    +1165799
    +1165819
    +1165823
    +1165831
    +1165837
    +1165849
    +1165861
    +1165873
    +1165889
    +1165903
    +1165909
    +1165919
    +1165921
    +1165933
    +1165937
    +1165943
    +1165949
    +1165951
    +1165991
    +1165993
    +1166021
    +1166027
    +1166041
    +1166057
    +1166083
    +1166089
    +1166093
    +1166101
    +1166107
    +1166131
    +1166141
    +1166147
    +1166153
    +1166213
    +1166219
    +1166227
    +1166237
    +1166287
    +1166311
    +1166323
    +1166329
    +1166359
    +1166383
    +1166393
    +1166401
    +1166411
    +1166413
    +1166441
    +1166453
    +1166479
    +1166483
    +1166497
    +1166507
    +1166527
    +1166531
    +1166533
    +1166549
    +1166563
    +1166567
    +1166569
    +1166579
    +1166597
    +1166603
    +1166609
    +1166617
    +1166639
    +1166663
    +1166677
    +1166687
    +1166713
    +1166723
    +1166729
    +1166741
    +1166773
    +1166779
    +1166801
    +1166807
    +1166827
    +1166833
    +1166839
    +1166849
    +1166857
    +1166861
    +1166903
    +1166927
    +1166929
    +1166947
    +1166953
    +1166969
    +1166987
    +1167011
    +1167013
    +1167053
    +1167059
    +1167077
    +1167083
    +1167139
    +1167143
    +1167157
    +1167167
    +1167193
    +1167209
    +1167211
    +1167217
    +1167233
    +1167241
    +1167251
    +1167277
    +1167289
    +1167293
    +1167307
    +1167317
    +1167329
    +1167347
    +1167349
    +1167359
    +1167391
    +1167409
    +1167421
    +1167443
    +1167449
    +1167469
    +1167473
    +1167539
    +1167547
    +1167559
    +1167571
    +1167581
    +1167587
    +1167599
    +1167613
    +1167623
    +1167637
    +1167653
    +1167659
    +1167667
    +1167689
    +1167697
    +1167701
    +1167703
    +1167707
    +1167709
    +1167731
    +1167763
    +1167773
    +1167791
    +1167799
    +1167811
    +1167821
    +1167823
    +1167833
    +1167839
    +1167841
    +1167847
    +1167853
    +1167869
    +1167889
    +1167899
    +1167913
    +1167919
    +1167937
    +1167953
    +1167973
    +1168001
    +1168007
    +1168031
    +1168039
    +1168043
    +1168093
    +1168133
    +1168151
    +1168169
    +1168183
    +1168187
    +1168231
    +1168241
    +1168243
    +1168247
    +1168249
    +1168261
    +1168301
    +1168319
    +1168327
    +1168337
    +1168339
    +1168351
    +1168357
    +1168361
    +1168397
    +1168399
    +1168403
    +1168411
    +1168451
    +1168463
    +1168477
    +1168487
    +1168493
    +1168501
    +1168523
    +1168537
    +1168553
    +1168619
    +1168621
    +1168627
    +1168637
    +1168639
    +1168693
    +1168711
    +1168721
    +1168751
    +1168757
    +1168763
    +1168771
    +1168789
    +1168799
    +1168819
    +1168829
    +1168831
    +1168841
    +1168847
    +1168859
    +1168877
    +1168879
    +1168897
    +1168919
    +1168927
    +1168931
    +1168933
    +1168957
    +1168969
    +1168987
    +1168997
    +1169009
    +1169011
    +1169017
    +1169023
    +1169027
    +1169029
    +1169059
    +1169081
    +1169131
    +1169137
    +1169149
    +1169171
    +1169177
    +1169183
    +1169191
    +1169249
    +1169257
    +1169261
    +1169269
    +1169281
    +1169293
    +1169323
    +1169327
    +1169341
    +1169347
    +1169353
    +1169369
    +1169381
    +1169383
    +1169401
    +1169411
    +1169417
    +1169419
    +1169449
    +1169453
    +1169473
    +1169477
    +1169491
    +1169513
    +1169521
    +1169563
    +1169587
    +1169591
    +1169593
    +1169603
    +1169627
    +1169633
    +1169647
    +1169669
    +1169677
    +1169683
    +1169687
    +1169713
    +1169741
    +1169747
    +1169759
    +1169761
    +1169767
    +1169789
    +1169801
    +1169809
    +1169827
    +1169873
    +1169879
    +1169899
    +1169929
    +1169933
    +1169939
    +1170007
    +1170011
    +1170019
    +1170023
    +1170031
    +1170049
    +1170061
    +1170067
    +1170089
    +1170107
    +1170109
    +1170119
    +1170131
    +1170133
    +1170137
    +1170139
    +1170167
    +1170173
    +1170193
    +1170203
    +1170209
    +1170233
    +1170251
    +1170271
    +1170277
    +1170311
    +1170317
    +1170329
    +1170349
    +1170361
    +1170373
    +1170397
    +1170437
    +1170443
    +1170451
    +1170461
    +1170487
    +1170497
    +1170511
    +1170517
    +1170523
    +1170541
    +1170553
    +1170563
    +1170581
    +1170583
    +1170593
    +1170599
    +1170607
    +1170641
    +1170649
    +1170661
    +1170667
    +1170679
    +1170683
    +1170707
    +1170709
    +1170713
    +1170721
    +1170727
    +1170751
    +1170779
    +1170781
    +1170787
    +1170803
    +1170811
    +1170821
    +1170833
    +1170853
    +1170857
    +1170863
    +1170899
    +1170941
    +1170947
    +1170971
    +1170979
    +1171031
    +1171033
    +1171039
    +1171057
    +1171061
    +1171069
    +1171073
    +1171109
    +1171111
    +1171117
    +1171123
    +1171133
    +1171189
    +1171199
    +1171201
    +1171207
    +1171231
    +1171241
    +1171243
    +1171253
    +1171259
    +1171267
    +1171301
    +1171319
    +1171343
    +1171393
    +1171399
    +1171421
    +1171427
    +1171447
    +1171451
    +1171463
    +1171477
    +1171517
    +1171523
    +1171529
    +1171549
    +1171553
    +1171561
    +1171579
    +1171591
    +1171601
    +1171619
    +1171633
    +1171637
    +1171661
    +1171669
    +1171699
    +1171721
    +1171747
    +1171771
    +1171783
    +1171789
    +1171801
    +1171811
    +1171813
    +1171823
    +1171837
    +1171847
    +1171867
    +1171921
    +1171927
    +1171931
    +1171957
    +1171967
    +1171969
    +1171979
    +1171981
    +1171991
    +1171999
    +1172009
    +1172021
    +1172023
    +1172027
    +1172029
    +1172047
    +1172063
    +1172069
    +1172081
    +1172107
    +1172111
    +1172147
    +1172179
    +1172207
    +1172233
    +1172257
    +1172261
    +1172273
    +1172279
    +1172317
    +1172329
    +1172351
    +1172377
    +1172393
    +1172401
    +1172407
    +1172411
    +1172417
    +1172429
    +1172443
    +1172447
    +1172461
    +1172467
    +1172491
    +1172497
    +1172503
    +1172531
    +1172533
    +1172537
    +1172539
    +1172543
    +1172573
    +1172579
    +1172657
    +1172659
    +1172663
    +1172671
    +1172681
    +1172683
    +1172687
    +1172713
    +1172749
    +1172777
    +1172783
    +1172797
    +1172803
    +1172807
    +1172819
    +1172833
    +1172867
    +1172893
    +1172903
    +1172921
    +1172929
    +1172933
    +1172939
    +1172953
    +1172957
    +1172959
    +1172981
    +1172993
    +1173001
    +1173013
    +1173043
    +1173059
    +1173101
    +1173121
    +1173127
    +1173157
    +1173163
    +1173173
    +1173181
    +1173191
    +1173199
    +1173223
    +1173239
    +1173259
    +1173281
    +1173283
    +1173301
    +1173343
    +1173349
    +1173373
    +1173397
    +1173401
    +1173407
    +1173433
    +1173439
    +1173463
    +1173481
    +1173511
    +1173521
    +1173539
    +1173541
    +1173551
    +1173553
    +1173581
    +1173583
    +1173587
    +1173589
    +1173593
    +1173617
    +1173631
    +1173709
    +1173743
    +1173749
    +1173779
    +1173787
    +1173803
    +1173811
    +1173827
    +1173829
    +1173841
    +1173853
    +1173881
    +1173883
    +1173917
    +1173937
    +1173941
    +1173947
    +1173959
    +1173961
    +1173979
    +1173983
    +1174021
    +1174027
    +1174031
    +1174049
    +1174073
    +1174079
    +1174091
    +1174093
    +1174099
    +1174141
    +1174163
    +1174171
    +1174193
    +1174211
    +1174213
    +1174231
    +1174237
    +1174247
    +1174259
    +1174267
    +1174273
    +1174301
    +1174307
    +1174319
    +1174331
    +1174337
    +1174339
    +1174361
    +1174387
    +1174399
    +1174423
    +1174441
    +1174451
    +1174463
    +1174469
    +1174477
    +1174487
    +1174489
    +1174499
    +1174507
    +1174519
    +1174531
    +1174549
    +1174571
    +1174583
    +1174601
    +1174603
    +1174619
    +1174627
    +1174669
    +1174673
    +1174681
    +1174687
    +1174709
    +1174721
    +1174727
    +1174739
    +1174759
    +1174763
    +1174769
    +1174781
    +1174783
    +1174793
    +1174801
    +1174829
    +1174847
    +1174879
    +1174883
    +1174891
    +1174897
    +1174913
    +1174919
    +1174949
    +1174951
    +1174969
    +1174973
    +1175003
    +1175021
    +1175029
    +1175039
    +1175071
    +1175077
    +1175099
    +1175107
    +1175123
    +1175143
    +1175149
    +1175173
    +1175191
    +1175219
    +1175243
    +1175249
    +1175257
    +1175267
    +1175297
    +1175351
    +1175353
    +1175371
    +1175387
    +1175389
    +1175407
    +1175411
    +1175413
    +1175417
    +1175437
    +1175467
    +1175479
    +1175483
    +1175497
    +1175509
    +1175521
    +1175561
    +1175569
    +1175579
    +1175591
    +1175617
    +1175623
    +1175627
    +1175651
    +1175659
    +1175677
    +1175683
    +1175687
    +1175711
    +1175717
    +1175723
    +1175729
    +1175743
    +1175767
    +1175789
    +1175791
    +1175803
    +1175807
    +1175813
    +1175819
    +1175821
    +1175833
    +1175849
    +1175857
    +1175887
    +1175899
    +1175927
    +1175939
    +1175953
    +1175959
    +1175963
    +1175969
    +1175981
    +1175989
    +1176023
    +1176029
    +1176031
    +1176041
    +1176061
    +1176083
    +1176089
    +1176113
    +1176121
    +1176127
    +1176137
    +1176163
    +1176173
    +1176187
    +1176191
    +1176221
    +1176223
    +1176239
    +1176277
    +1176293
    +1176323
    +1176353
    +1176361
    +1176367
    +1176377
    +1176391
    +1176397
    +1176403
    +1176407
    +1176421
    +1176433
    +1176449
    +1176463
    +1176509
    +1176521
    +1176529
    +1176533
    +1176557
    +1176583
    +1176589
    +1176599
    +1176601
    +1176607
    +1176631
    +1176641
    +1176647
    +1176671
    +1176673
    +1176701
    +1176709
    +1176713
    +1176737
    +1176767
    +1176779
    +1176787
    +1176793
    +1176797
    +1176811
    +1176827
    +1176869
    +1176871
    +1176881
    +1176899
    +1176911
    +1176937
    +1176943
    +1176947
    +1176949
    +1176983
    +1177009
    +1177019
    +1177027
    +1177037
    +1177067
    +1177073
    +1177087
    +1177093
    +1177103
    +1177129
    +1177147
    +1177153
    +1177157
    +1177159
    +1177171
    +1177181
    +1177201
    +1177207
    +1177219
    +1177223
    +1177237
    +1177243
    +1177247
    +1177277
    +1177291
    +1177331
    +1177387
    +1177399
    +1177427
    +1177433
    +1177447
    +1177453
    +1177459
    +1177481
    +1177489
    +1177499
    +1177507
    +1177513
    +1177529
    +1177541
    +1177543
    +1177549
    +1177571
    +1177609
    +1177613
    +1177619
    +1177621
    +1177637
    +1177651
    +1177667
    +1177681
    +1177697
    +1177711
    +1177717
    +1177723
    +1177733
    +1177739
    +1177741
    +1177751
    +1177763
    +1177769
    +1177801
    +1177843
    +1177859
    +1177873
    +1177877
    +1177901
    +1177919
    +1177921
    +1177933
    +1177949
    +1177987
    +1177997
    +1178003
    +1178017
    +1178033
    +1178039
    +1178041
    +1178059
    +1178069
    +1178087
    +1178101
    +1178113
    +1178123
    +1178131
    +1178141
    +1178159
    +1178161
    +1178167
    +1178173
    +1178189
    +1178197
    +1178201
    +1178207
    +1178213
    +1178227
    +1178231
    +1178237
    +1178239
    +1178263
    +1178269
    +1178273
    +1178297
    +1178347
    +1178363
    +1178369
    +1178371
    +1178377
    +1178393
    +1178417
    +1178447
    +1178461
    +1178479
    +1178483
    +1178521
    +1178533
    +1178537
    +1178549
    +1178557
    +1178591
    +1178609
    +1178621
    +1178623
    +1178633
    +1178641
    +1178659
    +1178669
    +1178689
    +1178699
    +1178701
    +1178707
    +1178711
    +1178717
    +1178719
    +1178743
    +1178753
    +1178767
    +1178803
    +1178809
    +1178833
    +1178843
    +1178851
    +1178887
    +1178897
    +1178909
    +1178921
    +1178927
    +1178939
    +1178953
    +1178959
    +1178963
    +1178971
    +1178977
    +1178981
    +1178993
    +1179011
    +1179019
    +1179047
    +1179109
    +1179127
    +1179149
    +1179151
    +1179173
    +1179179
    +1179193
    +1179203
    +1179223
    +1179251
    +1179253
    +1179259
    +1179263
    +1179281
    +1179287
    +1179289
    +1179293
    +1179317
    +1179319
    +1179323
    +1179329
    +1179331
    +1179337
    +1179379
    +1179383
    +1179389
    +1179403
    +1179413
    +1179419
    +1179421
    +1179427
    +1179467
    +1179491
    +1179499
    +1179527
    +1179547
    +1179551
    +1179553
    +1179569
    +1179571
    +1179583
    +1179589
    +1179599
    +1179637
    +1179641
    +1179649
    +1179677
    +1179733
    +1179751
    +1179757
    +1179779
    +1179793
    +1179797
    +1179839
    +1179847
    +1179853
    +1179859
    +1179863
    +1179869
    +1179883
    +1179901
    +1179907
    +1179929
    +1179947
    +1179961
    +1179973
    +1179977
    +1179979
    +1179989
    +1179991
    +1180009
    +1180013
    +1180019
    +1180027
    +1180031
    +1180043
    +1180057
    +1180073
    +1180087
    +1180093
    +1180099
    +1180111
    +1180117
    +1180121
    +1180133
    +1180141
    +1180159
    +1180171
    +1180219
    +1180237
    +1180241
    +1180243
    +1180247
    +1180253
    +1180279
    +1180303
    +1180313
    +1180351
    +1180369
    +1180373
    +1180381
    +1180391
    +1180397
    +1180409
    +1180423
    +1180427
    +1180447
    +1180477
    +1180493
    +1180507
    +1180519
    +1180537
    +1180547
    +1180549
    +1180577
    +1180591
    +1180631
    +1180637
    +1180643
    +1180657
    +1180661
    +1180691
    +1180693
    +1180709
    +1180721
    +1180723
    +1180727
    +1180733
    +1180757
    +1180771
    +1180799
    +1180807
    +1180811
    +1180819
    +1180847
    +1180849
    +1180853
    +1180859
    +1180873
    +1180877
    +1180891
    +1180897
    +1180901
    +1180903
    +1180913
    +1180931
    +1180937
    +1180951
    +1180957
    +1180961
    +1180979
    +1180987
    +1180997
    +1181017
    +1181023
    +1181039
    +1181051
    +1181053
    +1181057
    +1181093
    +1181099
    +1181137
    +1181149
    +1181153
    +1181171
    +1181183
    +1181197
    +1181203
    +1181209
    +1181237
    +1181263
    +1181267
    +1181269
    +1181281
    +1181293
    +1181309
    +1181311
    +1181321
    +1181329
    +1181407
    +1181413
    +1181437
    +1181443
    +1181461
    +1181471
    +1181473
    +1181501
    +1181507
    +1181519
    +1181527
    +1181549
    +1181561
    +1181563
    +1181573
    +1181581
    +1181611
    +1181617
    +1181633
    +1181647
    +1181681
    +1181699
    +1181701
    +1181723
    +1181729
    +1181731
    +1181759
    +1181767
    +1181771
    +1181773
    +1181777
    +1181839
    +1181879
    +1181881
    +1181893
    +1181897
    +1181911
    +1181923
    +1181927
    +1181963
    +1181969
    +1181981
    +1181987
    +1182007
    +1182019
    +1182023
    +1182031
    +1182043
    +1182073
    +1182121
    +1182133
    +1182143
    +1182157
    +1182211
    +1182253
    +1182277
    +1182281
    +1182283
    +1182287
    +1182289
    +1182331
    +1182341
    +1182343
    +1182347
    +1182353
    +1182383
    +1182397
    +1182403
    +1182413
    +1182421
    +1182431
    +1182437
    +1182439
    +1182449
    +1182451
    +1182463
    +1182479
    +1182487
    +1182491
    +1182509
    +1182521
    +1182539
    +1182547
    +1182581
    +1182593
    +1182611
    +1182659
    +1182677
    +1182679
    +1182689
    +1182691
    +1182697
    +1182703
    +1182737
    +1182739
    +1182757
    +1182763
    +1182767
    +1182781
    +1182787
    +1182791
    +1182817
    +1182847
    +1182869
    +1182889
    +1182893
    +1182901
    +1182917
    +1182919
    +1182947
    +1182953
    +1182967
    +1182989
    +1183003
    +1183027
    +1183031
    +1183033
    +1183057
    +1183079
    +1183093
    +1183103
    +1183121
    +1183123
    +1183141
    +1183151
    +1183157
    +1183159
    +1183163
    +1183181
    +1183199
    +1183201
    +1183211
    +1183213
    +1183241
    +1183261
    +1183267
    +1183271
    +1183277
    +1183279
    +1183333
    +1183337
    +1183349
    +1183381
    +1183393
    +1183397
    +1183409
    +1183411
    +1183423
    +1183447
    +1183451
    +1183471
    +1183477
    +1183531
    +1183537
    +1183541
    +1183561
    +1183571
    +1183579
    +1183597
    +1183607
    +1183613
    +1183687
    +1183697
    +1183709
    +1183723
    +1183729
    +1183733
    +1183739
    +1183753
    +1183759
    +1183769
    +1183771
    +1183781
    +1183799
    +1183811
    +1183813
    +1183837
    +1183843
    +1183877
    +1183913
    +1183933
    +1183939
    +1183943
    +1183951
    +1183961
    +1183969
    +1183981
    +1183993
    +1183997
    +1184003
    +1184011
    +1184047
    +1184059
    +1184069
    +1184077
    +1184081
    +1184083
    +1184093
    +1184119
    +1184123
    +1184129
    +1184143
    +1184149
    +1184171
    +1184173
    +1184207
    +1184219
    +1184243
    +1184269
    +1184291
    +1184299
    +1184303
    +1184317
    +1184329
    +1184347
    +1184357
    +1184363
    +1184369
    +1184377
    +1184399
    +1184411
    +1184413
    +1184423
    +1184429
    +1184453
    +1184459
    +1184461
    +1184471
    +1184473
    +1184483
    +1184489
    +1184507
    +1184527
    +1184537
    +1184539
    +1184549
    +1184551
    +1184587
    +1184609
    +1184653
    +1184663
    +1184671
    +1184683
    +1184731
    +1184741
    +1184749
    +1184759
    +1184767
    +1184791
    +1184797
    +1184837
    +1184839
    +1184867
    +1184881
    +1184893
    +1184903
    +1184923
    +1184927
    +1184933
    +1184947
    +1184957
    +1184959
    +1184987
    +1184993
    +1185013
    +1185017
    +1185071
    +1185077
    +1185089
    +1185103
    +1185109
    +1185113
    +1185127
    +1185131
    +1185179
    +1185181
    +1185241
    +1185281
    +1185287
    +1185299
    +1185307
    +1185313
    +1185319
    +1185329
    +1185337
    +1185343
    +1185361
    +1185367
    +1185377
    +1185383
    +1185389
    +1185403
    +1185439
    +1185463
    +1185469
    +1185493
    +1185497
    +1185511
    +1185523
    +1185551
    +1185559
    +1185577
    +1185589
    +1185601
    +1185617
    +1185623
    +1185637
    +1185643
    +1185647
    +1185659
    +1185661
    +1185671
    +1185677
    +1185683
    +1185689
    +1185697
    +1185703
    +1185707
    +1185721
    +1185749
    +1185787
    +1185791
    +1185797
    +1185817
    +1185823
    +1185827
    +1185851
    +1185859
    +1185871
    +1185883
    +1185889
    +1185893
    +1185907
    +1185929
    +1185931
    +1185953
    +1185979
    +1185997
    +1186001
    +1186033
    +1186049
    +1186051
    +1186057
    +1186063
    +1186067
    +1186079
    +1186099
    +1186111
    +1186117
    +1186121
    +1186127
    +1186147
    +1186169
    +1186181
    +1186217
    +1186231
    +1186249
    +1186259
    +1186291
    +1186321
    +1186337
    +1186349
    +1186351
    +1186373
    +1186397
    +1186403
    +1186411
    +1186439
    +1186441
    +1186489
    +1186517
    +1186519
    +1186541
    +1186573
    +1186589
    +1186597
    +1186621
    +1186631
    +1186657
    +1186673
    +1186693
    +1186697
    +1186699
    +1186739
    +1186741
    +1186751
    +1186769
    +1186789
    +1186807
    +1186811
    +1186813
    +1186837
    +1186841
    +1186847
    +1186879
    +1186931
    +1186937
    +1186963
    +1186973
    +1186981
    +1187003
    +1187009
    +1187023
    +1187047
    +1187051
    +1187089
    +1187107
    +1187111
    +1187117
    +1187141
    +1187159
    +1187167
    +1187189
    +1187201
    +1187227
    +1187233
    +1187239
    +1187261
    +1187279
    +1187287
    +1187309
    +1187311
    +1187317
    +1187321
    +1187339
    +1187341
    +1187353
    +1187357
    +1187363
    +1187369
    +1187383
    +1187387
    +1187411
    +1187413
    +1187419
    +1187429
    +1187453
    +1187471
    +1187479
    +1187489
    +1187507
    +1187509
    +1187539
    +1187551
    +1187561
    +1187567
    +1187587
    +1187623
    +1187629
    +1187639
    +1187657
    +1187687
    +1187689
    +1187699
    +1187701
    +1187707
    +1187717
    +1187723
    +1187741
    +1187749
    +1187761
    +1187801
    +1187803
    +1187819
    +1187821
    +1187833
    +1187839
    +1187863
    +1187867
    +1187873
    +1187887
    +1187897
    +1187911
    +1187933
    +1187939
    +1187941
    +1187947
    +1187981
    +1187993
    +1187999
    +1188001
    +1188007
    +1188017
    +1188029
    +1188037
    +1188041
    +1188049
    +1188059
    +1188071
    +1188073
    +1188149
    +1188151
    +1188167
    +1188169
    +1188179
    +1188197
    +1188223
    +1188227
    +1188233
    +1188247
    +1188259
    +1188263
    +1188269
    +1188277
    +1188287
    +1188289
    +1188293
    +1188307
    +1188353
    +1188359
    +1188361
    +1188377
    +1188389
    +1188409
    +1188413
    +1188457
    +1188491
    +1188511
    +1188527
    +1188529
    +1188553
    +1188557
    +1188559
    +1188581
    +1188587
    +1188601
    +1188613
    +1188619
    +1188637
    +1188653
    +1188661
    +1188667
    +1188679
    +1188689
    +1188721
    +1188727
    +1188731
    +1188763
    +1188769
    +1188787
    +1188839
    +1188841
    +1188851
    +1188857
    +1188899
    +1188917
    +1188931
    +1188937
    +1188947
    +1188973
    +1188977
    +1188991
    +1189003
    +1189007
    +1189021
    +1189033
    +1189057
    +1189061
    +1189063
    +1189093
    +1189109
    +1189121
    +1189127
    +1189151
    +1189159
    +1189163
    +1189171
    +1189189
    +1189193
    +1189213
    +1189219
    +1189231
    +1189271
    +1189277
    +1189301
    +1189313
    +1189327
    +1189333
    +1189339
    +1189361
    +1189387
    +1189403
    +1189417
    +1189453
    +1189469
    +1189471
    +1189481
    +1189483
    +1189553
    +1189567
    +1189577
    +1189579
    +1189603
    +1189607
    +1189613
    +1189621
    +1189627
    +1189631
    +1189633
    +1189637
    +1189649
    +1189651
    +1189673
    +1189703
    +1189709
    +1189717
    +1189751
    +1189757
    +1189759
    +1189763
    +1189789
    +1189801
    +1189807
    +1189823
    +1189831
    +1189843
    +1189871
    +1189879
    +1189891
    +1189897
    +1189901
    +1189907
    +1189919
    +1189933
    +1189967
    +1189999
    +1190011
    +1190023
    +1190029
    +1190041
    +1190047
    +1190069
    +1190071
    +1190081
    +1190143
    +1190149
    +1190159
    +1190177
    +1190201
    +1190237
    +1190249
    +1190261
    +1190263
    +1190279
    +1190291
    +1190311
    +1190347
    +1190359
    +1190381
    +1190417
    +1190429
    +1190447
    +1190467
    +1190473
    +1190477
    +1190489
    +1190491
    +1190507
    +1190509
    +1190513
    +1190533
    +1190573
    +1190587
    +1190591
    +1190611
    +1190633
    +1190639
    +1190647
    +1190671
    +1190699
    +1190701
    +1190719
    +1190723
    +1190737
    +1190743
    +1190753
    +1190773
    +1190789
    +1190807
    +1190809
    +1190821
    +1190831
    +1190837
    +1190851
    +1190873
    +1190897
    +1190899
    +1190911
    +1190923
    +1190929
    +1190947
    +1190951
    +1190953
    +1190983
    +1191011
    +1191013
    +1191019
    +1191031
    +1191061
    +1191077
    +1191079
    +1191089
    +1191097
    +1191103
    +1191107
    +1191109
    +1191119
    +1191131
    +1191149
    +1191163
    +1191187
    +1191191
    +1191199
    +1191209
    +1191221
    +1191247
    +1191277
    +1191283
    +1191293
    +1191301
    +1191313
    +1191341
    +1191347
    +1191353
    +1191373
    +1191409
    +1191431
    +1191439
    +1191457
    +1191481
    +1191499
    +1191529
    +1191539
    +1191551
    +1191559
    +1191563
    +1191571
    +1191577
    +1191601
    +1191611
    +1191613
    +1191637
    +1191643
    +1191667
    +1191679
    +1191691
    +1191703
    +1191719
    +1191727
    +1191731
    +1191739
    +1191761
    +1191767
    +1191769
    +1191781
    +1191793
    +1191809
    +1191821
    +1191833
    +1191847
    +1191899
    +1191923
    +1191937
    +1191941
    +1191947
    +1191973
    +1191979
    +1191991
    +1192013
    +1192027
    +1192039
    +1192069
    +1192073
    +1192097
    +1192099
    +1192109
    +1192127
    +1192141
    +1192151
    +1192153
    +1192171
    +1192181
    +1192183
    +1192187
    +1192199
    +1192201
    +1192207
    +1192211
    +1192241
    +1192253
    +1192259
    +1192267
    +1192271
    +1192327
    +1192337
    +1192339
    +1192349
    +1192357
    +1192369
    +1192391
    +1192409
    +1192417
    +1192423
    +1192427
    +1192453
    +1192469
    +1192483
    +1192517
    +1192549
    +1192559
    +1192561
    +1192571
    +1192579
    +1192589
    +1192603
    +1192651
    +1192673
    +1192679
    +1192699
    +1192717
    +1192721
    +1192753
    +1192781
    +1192811
    +1192817
    +1192823
    +1192831
    +1192837
    +1192847
    +1192853
    +1192879
    +1192883
    +1192889
    +1192897
    +1192903
    +1192909
    +1192927
    +1192937
    +1192951
    +1192967
    +1192969
    +1193011
    +1193021
    +1193041
    +1193047
    +1193057
    +1193081
    +1193107
    +1193119
    +1193123
    +1193131
    +1193149
    +1193161
    +1193173
    +1193183
    +1193209
    +1193233
    +1193237
    +1193239
    +1193243
    +1193261
    +1193267
    +1193299
    +1193303
    +1193329
    +1193351
    +1193363
    +1193369
    +1193399
    +1193429
    +1193431
    +1193443
    +1193459
    +1193473
    +1193483
    +1193497
    +1193501
    +1193503
    +1193513
    +1193537
    +1193557
    +1193567
    +1193573
    +1193603
    +1193609
    +1193617
    +1193653
    +1193663
    +1193683
    +1193693
    +1193701
    +1193707
    +1193711
    +1193729
    +1193737
    +1193741
    +1193743
    +1193761
    +1193767
    +1193771
    +1193783
    +1193821
    +1193833
    +1193837
    +1193839
    +1193849
    +1193867
    +1193869
    +1193887
    +1193909
    +1193911
    +1193939
    +1193947
    +1193963
    +1193971
    +1193989
    +1193993
    +1194019
    +1194023
    +1194031
    +1194041
    +1194047
    +1194059
    +1194103
    +1194157
    +1194161
    +1194163
    +1194203
    +1194209
    +1194211
    +1194241
    +1194251
    +1194253
    +1194269
    +1194293
    +1194311
    +1194329
    +1194341
    +1194343
    +1194373
    +1194379
    +1194383
    +1194407
    +1194421
    +1194439
    +1194443
    +1194449
    +1194463
    +1194493
    +1194517
    +1194521
    +1194541
    +1194547
    +1194553
    +1194581
    +1194593
    +1194601
    +1194631
    +1194659
    +1194667
    +1194671
    +1194679
    +1194707
    +1194727
    +1194731
    +1194733
    +1194751
    +1194757
    +1194763
    +1194769
    +1194797
    +1194799
    +1194803
    +1194821
    +1194847
    +1194857
    +1194877
    +1194883
    +1194889
    +1194899
    +1194901
    +1194917
    +1194923
    +1194959
    +1194961
    +1194971
    +1194979
    +1194997
    +1195021
    +1195031
    +1195037
    +1195039
    +1195067
    +1195091
    +1195121
    +1195123
    +1195127
    +1195141
    +1195153
    +1195169
    +1195171
    +1195189
    +1195193
    +1195217
    +1195223
    +1195231
    +1195237
    +1195247
    +1195277
    +1195291
    +1195361
    +1195387
    +1195421
    +1195429
    +1195459
    +1195463
    +1195477
    +1195483
    +1195489
    +1195501
    +1195543
    +1195547
    +1195549
    +1195561
    +1195567
    +1195573
    +1195589
    +1195669
    +1195673
    +1195679
    +1195681
    +1195693
    +1195703
    +1195709
    +1195721
    +1195723
    +1195741
    +1195751
    +1195759
    +1195771
    +1195801
    +1195807
    +1195811
    +1195837
    +1195849
    +1195891
    +1195897
    +1195907
    +1195919
    +1195927
    +1195937
    +1195979
    +1195991
    +1196003
    +1196029
    +1196033
    +1196059
    +1196077
    +1196087
    +1196089
    +1196119
    +1196123
    +1196141
    +1196177
    +1196191
    +1196201
    +1196219
    +1196227
    +1196231
    +1196267
    +1196269
    +1196281
    +1196287
    +1196309
    +1196323
    +1196329
    +1196347
    +1196357
    +1196359
    +1196399
    +1196401
    +1196413
    +1196431
    +1196471
    +1196473
    +1196491
    +1196501
    +1196509
    +1196513
    +1196519
    +1196521
    +1196537
    +1196539
    +1196593
    +1196597
    +1196603
    +1196609
    +1196633
    +1196653
    +1196683
    +1196707
    +1196717
    +1196719
    +1196729
    +1196731
    +1196773
    +1196809
    +1196813
    +1196837
    +1196843
    +1196857
    +1196861
    +1196863
    +1196869
    +1196873
    +1196891
    +1196911
    +1196927
    +1196939
    +1196959
    +1196999
    +1197011
    +1197013
    +1197017
    +1197029
    +1197037
    +1197041
    +1197059
    +1197067
    +1197073
    +1197103
    +1197107
    +1197113
    +1197121
    +1197167
    +1197181
    +1197187
    +1197193
    +1197197
    +1197199
    +1197211
    +1197221
    +1197239
    +1197257
    +1197263
    +1197269
    +1197277
    +1197281
    +1197289
    +1197307
    +1197337
    +1197347
    +1197349
    +1197353
    +1197359
    +1197367
    +1197389
    +1197407
    +1197409
    +1197433
    +1197451
    +1197467
    +1197473
    +1197479
    +1197509
    +1197527
    +1197571
    +1197577
    +1197601
    +1197617
    +1197619
    +1197631
    +1197649
    +1197697
    +1197709
    +1197739
    +1197743
    +1197751
    +1197767
    +1197799
    +1197821
    +1197827
    +1197829
    +1197881
    +1197901
    +1197907
    +1197923
    +1197929
    +1197941
    +1197947
    +1197953
    +1197971
    +1197997
    +1198013
    +1198033
    +1198037
    +1198049
    +1198051
    +1198063
    +1198069
    +1198073
    +1198081
    +1198103
    +1198123
    +1198133
    +1198151
    +1198157
    +1198187
    +1198189
    +1198201
    +1198217
    +1198229
    +1198247
    +1198259
    +1198261
    +1198289
    +1198291
    +1198297
    +1198303
    +1198321
    +1198343
    +1198361
    +1198363
    +1198397
    +1198399
    +1198403
    +1198411
    +1198427
    +1198433
    +1198447
    +1198451
    +1198469
    +1198481
    +1198511
    +1198513
    +1198523
    +1198537
    +1198583
    +1198607
    +1198609
    +1198621
    +1198643
    +1198651
    +1198661
    +1198669
    +1198679
    +1198699
    +1198727
    +1198751
    +1198793
    +1198811
    +1198819
    +1198849
    +1198853
    +1198861
    +1198867
    +1198877
    +1198903
    +1198927
    +1198949
    +1198973
    +1198979
    +1198991
    +1198997
    +1198999
    +1199039
    +1199047
    +1199069
    +1199083
    +1199087
    +1199089
    +1199117
    +1199123
    +1199131
    +1199137
    +1199167
    +1199183
    +1199189
    +1199203
    +1199257
    +1199309
    +1199329
    +1199351
    +1199357
    +1199369
    +1199371
    +1199377
    +1199389
    +1199417
    +1199423
    +1199437
    +1199441
    +1199447
    +1199459
    +1199461
    +1199467
    +1199477
    +1199491
    +1199507
    +1199509
    +1199521
    +1199551
    +1199557
    +1199573
    +1199587
    +1199591
    +1199593
    +1199617
    +1199621
    +1199623
    +1199629
    +1199659
    +1199663
    +1199677
    +1199683
    +1199689
    +1199699
    +1199711
    +1199719
    +1199767
    +1199777
    +1199789
    +1199801
    +1199813
    +1199819
    +1199833
    +1199839
    +1199851
    +1199857
    +1199879
    +1199893
    +1199899
    +1199909
    +1199923
    +1199929
    +1199953
    +1199969
    +1199993
    +1199999
    +1200007
    +1200061
    +1200077
    +1200083
    +1200109
    +1200139
    +1200161
    +1200167
    +1200179
    +1200187
    +1200191
    +1200233
    +1200253
    +1200307
    +1200313
    +1200323
    +1200341
    +1200349
    +1200359
    +1200361
    +1200371
    +1200373
    +1200377
    +1200383
    +1200389
    +1200403
    +1200443
    +1200449
    +1200461
    +1200467
    +1200491
    +1200499
    +1200509
    +1200527
    +1200581
    +1200583
    +1200607
    +1200611
    +1200637
    +1200643
    +1200673
    +1200679
    +1200691
    +1200697
    +1200701
    +1200739
    +1200751
    +1200779
    +1200799
    +1200809
    +1200811
    +1200833
    +1200839
    +1200869
    +1200883
    +1200887
    +1200889
    +1200917
    +1200929
    +1200937
    +1200943
    +1200949
    +1200959
    +1200989
    +1201001
    +1201003
    +1201019
    +1201021
    +1201027
    +1201043
    +1201049
    +1201061
    +1201073
    +1201087
    +1201097
    +1201103
    +1201111
    +1201117
    +1201141
    +1201153
    +1201163
    +1201171
    +1201183
    +1201201
    +1201217
    +1201229
    +1201241
    +1201247
    +1201261
    +1201283
    +1201307
    +1201309
    +1201327
    +1201337
    +1201381
    +1201439
    +1201469
    +1201481
    +1201483
    +1201489
    +1201493
    +1201513
    +1201523
    +1201531
    +1201553
    +1201559
    +1201567
    +1201583
    +1201601
    +1201633
    +1201637
    +1201643
    +1201687
    +1201691
    +1201699
    +1201703
    +1201709
    +1201729
    +1201787
    +1201793
    +1201813
    +1201829
    +1201841
    +1201843
    +1201853
    +1201873
    +1201909
    +1201919
    +1201939
    +1201961
    +1201969
    +1201999
    +1202009
    +1202017
    +1202023
    +1202027
    +1202029
    +1202041
    +1202057
    +1202063
    +1202077
    +1202081
    +1202099
    +1202107
    +1202129
    +1202147
    +1202153
    +1202183
    +1202191
    +1202219
    +1202221
    +1202231
    +1202239
    +1202251
    +1202261
    +1202269
    +1202293
    +1202303
    +1202317
    +1202321
    +1202329
    +1202347
    +1202363
    +1202387
    +1202423
    +1202429
    +1202437
    +1202447
    +1202471
    +1202473
    +1202477
    +1202483
    +1202497
    +1202501
    +1202507
    +1202549
    +1202561
    +1202569
    +1202603
    +1202609
    +1202627
    +1202629
    +1202633
    +1202689
    +1202741
    +1202743
    +1202771
    +1202779
    +1202783
    +1202791
    +1202807
    +1202813
    +1202819
    +1202827
    +1202837
    +1202843
    +1202849
    +1202857
    +1202863
    +1202867
    +1202881
    +1202939
    +1202959
    +1202963
    +1202977
    +1202987
    +1203019
    +1203067
    +1203077
    +1203101
    +1203121
    +1203127
    +1203149
    +1203151
    +1203161
    +1203179
    +1203193
    +1203211
    +1203217
    +1203221
    +1203229
    +1203233
    +1203263
    +1203283
    +1203287
    +1203329
    +1203331
    +1203343
    +1203359
    +1203361
    +1203421
    +1203437
    +1203443
    +1203457
    +1203463
    +1203467
    +1203487
    +1203493
    +1203509
    +1203533
    +1203557
    +1203571
    +1203581
    +1203607
    +1203611
    +1203619
    +1203641
    +1203661
    +1203667
    +1203689
    +1203691
    +1203731
    +1203733
    +1203739
    +1203757
    +1203773
    +1203779
    +1203791
    +1203793
    +1203799
    +1203809
    +1203817
    +1203827
    +1203841
    +1203863
    +1203887
    +1203893
    +1203899
    +1203901
    +1203913
    +1203919
    +1203929
    +1203931
    +1203941
    +1203949
    +1203953
    +1203959
    +1203971
    +1204003
    +1204019
    +1204037
    +1204097
    +1204103
    +1204117
    +1204139
    +1204141
    +1204153
    +1204169
    +1204171
    +1204183
    +1204207
    +1204219
    +1204243
    +1204271
    +1204279
    +1204289
    +1204309
    +1204337
    +1204363
    +1204369
    +1204397
    +1204409
    +1204421
    +1204447
    +1204451
    +1204453
    +1204471
    +1204477
    +1204493
    +1204507
    +1204519
    +1204529
    +1204561
    +1204583
    +1204597
    +1204607
    +1204613
    +1204633
    +1204649
    +1204669
    +1204681
    +1204699
    +1204711
    +1204729
    +1204741
    +1204781
    +1204783
    +1204787
    +1204813
    +1204823
    +1204859
    +1204871
    +1204873
    +1204883
    +1204891
    +1204937
    +1204967
    +1204969
    +1204981
    +1205027
    +1205047
    +1205081
    +1205089
    +1205093
    +1205101
    +1205117
    +1205119
    +1205123
    +1205159
    +1205173
    +1205179
    +1205219
    +1205231
    +1205251
    +1205257
    +1205287
    +1205293
    +1205339
    +1205377
    +1205387
    +1205411
    +1205437
    +1205447
    +1205459
    +1205467
    +1205471
    +1205473
    +1205489
    +1205513
    +1205527
    +1205537
    +1205539
    +1205549
    +1205557
    +1205563
    +1205609
    +1205627
    +1205629
    +1205639
    +1205647
    +1205653
    +1205663
    +1205669
    +1205681
    +1205693
    +1205707
    +1205713
    +1205717
    +1205731
    +1205749
    +1205753
    +1205767
    +1205773
    +1205779
    +1205819
    +1205843
    +1205891
    +1205899
    +1205903
    +1205921
    +1205947
    +1205951
    +1205969
    +1205977
    +1205999
    +1206013
    +1206017
    +1206043
    +1206053
    +1206059
    +1206061
    +1206071
    +1206113
    +1206131
    +1206151
    +1206157
    +1206169
    +1206173
    +1206181
    +1206187
    +1206199
    +1206209
    +1206223
    +1206229
    +1206259
    +1206263
    +1206277
    +1206307
    +1206319
    +1206323
    +1206341
    +1206347
    +1206353
    +1206377
    +1206383
    +1206391
    +1206407
    +1206433
    +1206449
    +1206461
    +1206467
    +1206479
    +1206497
    +1206529
    +1206539
    +1206553
    +1206563
    +1206577
    +1206581
    +1206587
    +1206619
    +1206637
    +1206679
    +1206683
    +1206691
    +1206701
    +1206703
    +1206713
    +1206721
    +1206731
    +1206743
    +1206749
    +1206761
    +1206767
    +1206769
    +1206773
    +1206781
    +1206791
    +1206809
    +1206827
    +1206841
    +1206869
    +1206941
    +1206973
    +1206979
    +1207001
    +1207027
    +1207033
    +1207039
    +1207043
    +1207079
    +1207093
    +1207097
    +1207111
    +1207117
    +1207121
    +1207123
    +1207133
    +1207147
    +1207159
    +1207211
    +1207223
    +1207237
    +1207249
    +1207259
    +1207267
    +1207291
    +1207307
    +1207309
    +1207313
    +1207319
    +1207331
    +1207343
    +1207351
    +1207363
    +1207379
    +1207387
    +1207403
    +1207417
    +1207429
    +1207439
    +1207441
    +1207447
    +1207489
    +1207501
    +1207511
    +1207519
    +1207529
    +1207537
    +1207597
    +1207603
    +1207627
    +1207649
    +1207681
    +1207699
    +1207721
    +1207727
    +1207751
    +1207757
    +1207769
    +1207841
    +1207883
    +1207903
    +1207909
    +1207919
    +1207933
    +1207957
    +1207961
    +1207979
    +1207981
    +1208017
    +1208021
    +1208023
    +1208027
    +1208033
    +1208057
    +1208069
    +1208089
    +1208113
    +1208117
    +1208131
    +1208149
    +1208159
    +1208177
    +1208189
    +1208209
    +1208219
    +1208237
    +1208239
    +1208243
    +1208269
    +1208279
    +1208297
    +1208299
    +1208303
    +1208341
    +1208371
    +1208387
    +1208399
    +1208407
    +1208413
    +1208423
    +1208447
    +1208461
    +1208507
    +1208521
    +1208561
    +1208569
    +1208573
    +1208591
    +1208651
    +1208657
    +1208663
    +1208677
    +1208681
    +1208689
    +1208707
    +1208731
    +1208741
    +1208777
    +1208789
    +1208791
    +1208797
    +1208813
    +1208821
    +1208833
    +1208843
    +1208849
    +1208863
    +1208873
    +1208927
    +1208939
    +1208941
    +1208957
    +1209007
    +1209017
    +1209029
    +1209053
    +1209073
    +1209079
    +1209083
    +1209107
    +1209113
    +1209121
    +1209139
    +1209151
    +1209163
    +1209181
    +1209191
    +1209199
    +1209209
    +1209223
    +1209233
    +1209239
    +1209251
    +1209269
    +1209277
    +1209281
    +1209287
    +1209311
    +1209337
    +1209347
    +1209353
    +1209367
    +1209379
    +1209427
    +1209437
    +1209457
    +1209463
    +1209469
    +1209487
    +1209491
    +1209517
    +1209539
    +1209557
    +1209563
    +1209577
    +1209583
    +1209587
    +1209617
    +1209629
    +1209631
    +1209647
    +1209671
    +1209697
    +1209707
    +1209709
    +1209739
    +1209757
    +1209763
    +1209773
    +1209779
    +1209781
    +1209809
    +1209811
    +1209821
    +1209841
    +1209853
    +1209877
    +1209883
    +1209889
    +1209931
    +1209947
    +1209959
    +1209973
    +1209979
    +1210003
    +1210019
    +1210021
    +1210037
    +1210039
    +1210049
    +1210051
    +1210067
    +1210093
    +1210103
    +1210123
    +1210127
    +1210151
    +1210163
    +1210169
    +1210177
    +1210193
    +1210207
    +1210211
    +1210229
    +1210241
    +1210259
    +1210289
    +1210351
    +1210369
    +1210379
    +1210387
    +1210393
    +1210397
    +1210399
    +1210403
    +1210409
    +1210411
    +1210427
    +1210439
    +1210441
    +1210459
    +1210477
    +1210483
    +1210499
    +1210523
    +1210541
    +1210549
    +1210597
    +1210609
    +1210613
    +1210631
    +1210637
    +1210639
    +1210711
    +1210717
    +1210747
    +1210753
    +1210777
    +1210787
    +1210793
    +1210799
    +1210801
    +1210817
    +1210819
    +1210831
    +1210843
    +1210871
    +1210873
    +1210877
    +1210879
    +1210883
    +1210897
    +1210903
    +1210921
    +1210933
    +1210939
    +1210949
    +1210967
    +1210987
    +1210999
    +1211027
    +1211039
    +1211051
    +1211057
    +1211059
    +1211081
    +1211083
    +1211087
    +1211141
    +1211167
    +1211179
    +1211183
    +1211191
    +1211207
    +1211227
    +1211261
    +1211279
    +1211281
    +1211303
    +1211311
    +1211333
    +1211339
    +1211381
    +1211389
    +1211393
    +1211407
    +1211411
    +1211423
    +1211443
    +1211477
    +1211489
    +1211501
    +1211503
    +1211531
    +1211537
    +1211543
    +1211549
    +1211563
    +1211593
    +1211597
    +1211599
    +1211603
    +1211621
    +1211629
    +1211647
    +1211653
    +1211657
    +1211659
    +1211669
    +1211677
    +1211689
    +1211701
    +1211719
    +1211723
    +1211731
    +1211737
    +1211741
    +1211761
    +1211767
    +1211779
    +1211789
    +1211797
    +1211807
    +1211813
    +1211827
    +1211843
    +1211857
    +1211863
    +1211897
    +1211911
    +1211921
    +1211923
    +1211933
    +1211983
    +1211999
    +1212011
    +1212017
    +1212023
    +1212047
    +1212053
    +1212061
    +1212103
    +1212119
    +1212121
    +1212149
    +1212173
    +1212187
    +1212191
    +1212199
    +1212221
    +1212227
    +1212241
    +1212251
    +1212259
    +1212283
    +1212293
    +1212301
    +1212319
    +1212331
    +1212347
    +1212361
    +1212373
    +1212397
    +1212401
    +1212427
    +1212433
    +1212437
    +1212439
    +1212443
    +1212473
    +1212479
    +1212487
    +1212517
    +1212521
    +1212551
    +1212569
    +1212611
    +1212613
    +1212641
    +1212649
    +1212671
    +1212677
    +1212683
    +1212697
    +1212703
    +1212709
    +1212719
    +1212737
    +1212769
    +1212773
    +1212781
    +1212787
    +1212793
    +1212811
    +1212817
    +1212839
    +1212847
    +1212851
    +1212853
    +1212857
    +1212877
    +1212889
    +1212907
    +1212917
    +1212919
    +1212923
    +1212931
    +1212943
    +1212973
    +1212989
    +1213007
    +1213019
    +1213021
    +1213027
    +1213033
    +1213049
    +1213057
    +1213063
    +1213081
    +1213087
    +1213097
    +1213109
    +1213129
    +1213133
    +1213141
    +1213151
    +1213153
    +1213183
    +1213189
    +1213213
    +1213241
    +1213253
    +1213259
    +1213271
    +1213301
    +1213327
    +1213339
    +1213357
    +1213367
    +1213379
    +1213427
    +1213439
    +1213451
    +1213469
    +1213481
    +1213483
    +1213517
    +1213529
    +1213547
    +1213561
    +1213573
    +1213577
    +1213591
    +1213601
    +1213607
    +1213627
    +1213631
    +1213633
    +1213643
    +1213651
    +1213657
    +1213661
    +1213673
    +1213721
    +1213741
    +1213747
    +1213757
    +1213759
    +1213763
    +1213781
    +1213801
    +1213829
    +1213837
    +1213841
    +1213873
    +1213879
    +1213897
    +1213907
    +1213909
    +1213913
    +1213921
    +1213931
    +1213939
    +1213943
    +1213951
    +1213981
    +1214011
    +1214023
    +1214039
    +1214047
    +1214077
    +1214093
    +1214113
    +1214117
    +1214131
    +1214137
    +1214141
    +1214159
    +1214167
    +1214183
    +1214189
    +1214197
    +1214219
    +1214221
    +1214237
    +1214261
    +1214273
    +1214281
    +1214299
    +1214333
    +1214357
    +1214371
    +1214393
    +1214401
    +1214407
    +1214413
    +1214417
    +1214431
    +1214441
    +1214453
    +1214459
    +1214471
    +1214483
    +1214489
    +1214519
    +1214533
    +1214567
    +1214573
    +1214579
    +1214593
    +1214617
    +1214623
    +1214639
    +1214641
    +1214657
    +1214659
    +1214663
    +1214669
    +1214671
    +1214683
    +1214687
    +1214711
    +1214729
    +1214737
    +1214743
    +1214749
    +1214767
    +1214819
    +1214827
    +1214849
    +1214867
    +1214891
    +1214909
    +1214923
    +1214933
    +1214947
    +1214957
    +1214959
    +1214963
    +1214971
    +1214977
    +1214981
    +1215017
    +1215029
    +1215047
    +1215079
    +1215083
    +1215103
    +1215121
    +1215133
    +1215157
    +1215161
    +1215167
    +1215173
    +1215197
    +1215209
    +1215229
    +1215239
    +1215271
    +1215283
    +1215299
    +1215301
    +1215311
    +1215329
    +1215349
    +1215359
    +1215367
    +1215391
    +1215397
    +1215407
    +1215421
    +1215433
    +1215437
    +1215439
    +1215451
    +1215457
    +1215463
    +1215497
    +1215499
    +1215509
    +1215521
    +1215553
    +1215569
    +1215583
    +1215587
    +1215623
    +1215629
    +1215631
    +1215637
    +1215647
    +1215649
    +1215673
    +1215679
    +1215703
    +1215719
    +1215743
    +1215769
    +1215779
    +1215787
    +1215827
    +1215839
    +1215847
    +1215853
    +1215859
    +1215881
    +1215899
    +1215917
    +1215919
    +1215923
    +1216009
    +1216013
    +1216021
    +1216043
    +1216067
    +1216069
    +1216087
    +1216091
    +1216109
    +1216123
    +1216147
    +1216151
    +1216177
    +1216213
    +1216249
    +1216273
    +1216277
    +1216337
    +1216339
    +1216349
    +1216351
    +1216373
    +1216379
    +1216387
    +1216393
    +1216417
    +1216421
    +1216433
    +1216441
    +1216451
    +1216459
    +1216489
    +1216507
    +1216529
    +1216543
    +1216547
    +1216559
    +1216561
    +1216577
    +1216583
    +1216591
    +1216601
    +1216603
    +1216619
    +1216681
    +1216693
    +1216711
    +1216717
    +1216729
    +1216751
    +1216759
    +1216763
    +1216777
    +1216793
    +1216799
    +1216807
    +1216823
    +1216841
    +1216847
    +1216849
    +1216867
    +1216871
    +1216879
    +1216903
    +1216913
    +1216937
    +1216939
    +1216951
    +1216961
    +1216973
    +1216987
    +1216997
    +1217009
    +1217017
    +1217023
    +1217033
    +1217053
    +1217057
    +1217063
    +1217071
    +1217077
    +1217089
    +1217093
    +1217107
    +1217113
    +1217119
    +1217131
    +1217141
    +1217143
    +1217147
    +1217171
    +1217179
    +1217191
    +1217207
    +1217213
    +1217219
    +1217233
    +1217261
    +1217269
    +1217297
    +1217299
    +1217303
    +1217309
    +1217317
    +1217329
    +1217351
    +1217393
    +1217399
    +1217407
    +1217417
    +1217423
    +1217443
    +1217467
    +1217471
    +1217473
    +1217477
    +1217483
    +1217509
    +1217521
    +1217533
    +1217537
    +1217561
    +1217617
    +1217647
    +1217651
    +1217663
    +1217669
    +1217677
    +1217683
    +1217687
    +1217719
    +1217731
    +1217753
    +1217759
    +1217771
    +1217809
    +1217813
    +1217831
    +1217833
    +1217861
    +1217893
    +1217899
    +1217903
    +1217917
    +1217921
    +1217927
    +1217933
    +1217941
    +1217947
    +1217963
    +1217977
    +1217989
    +1218017
    +1218043
    +1218089
    +1218121
    +1218131
    +1218157
    +1218167
    +1218179
    +1218197
    +1218199
    +1218209
    +1218211
    +1218221
    +1218247
    +1218251
    +1218257
    +1218263
    +1218277
    +1218281
    +1218307
    +1218313
    +1218367
    +1218383
    +1218391
    +1218401
    +1218421
    +1218433
    +1218449
    +1218457
    +1218463
    +1218467
    +1218473
    +1218487
    +1218533
    +1218557
    +1218559
    +1218571
    +1218583
    +1218601
    +1218617
    +1218631
    +1218649
    +1218653
    +1218683
    +1218691
    +1218709
    +1218727
    +1218731
    +1218739
    +1218761
    +1218773
    +1218779
    +1218787
    +1218821
    +1218829
    +1218853
    +1218859
    +1218901
    +1218911
    +1218913
    +1218923
    +1218941
    +1218949
    +1218953
    +1218989
    +1218991
    +1219003
    +1219061
    +1219081
    +1219091
    +1219109
    +1219111
    +1219123
    +1219129
    +1219147
    +1219177
    +1219213
    +1219237
    +1219241
    +1219271
    +1219279
    +1219297
    +1219301
    +1219303
    +1219307
    +1219313
    +1219343
    +1219349
    +1219357
    +1219399
    +1219411
    +1219433
    +1219453
    +1219457
    +1219469
    +1219481
    +1219487
    +1219489
    +1219501
    +1219507
    +1219549
    +1219577
    +1219607
    +1219613
    +1219619
    +1219639
    +1219643
    +1219649
    +1219651
    +1219657
    +1219663
    +1219679
    +1219703
    +1219717
    +1219721
    +1219727
    +1219739
    +1219747
    +1219753
    +1219763
    +1219783
    +1219787
    +1219789
    +1219793
    +1219807
    +1219811
    +1219831
    +1219837
    +1219843
    +1219847
    +1219849
    +1219859
    +1219861
    +1219871
    +1219877
    +1219879
    +1219891
    +1219909
    +1219913
    +1219919
    +1219931
    +1219949
    +1219951
    +1219957
    +1219961
    +1219963
    +1219991
    +1220027
    +1220029
    +1220041
    +1220071
    +1220077
    +1220099
    +1220147
    +1220171
    +1220203
    +1220239
    +1220249
    +1220251
    +1220257
    +1220309
    +1220327
    +1220333
    +1220347
    +1220353
    +1220363
    +1220369
    +1220393
    +1220411
    +1220423
    +1220437
    +1220489
    +1220491
    +1220497
    +1220507
    +1220591
    +1220599
    +1220623
    +1220657
    +1220663
    +1220669
    +1220689
    +1220699
    +1220711
    +1220717
    +1220729
    +1220743
    +1220761
    +1220773
    +1220777
    +1220783
    +1220797
    +1220801
    +1220803
    +1220819
    +1220833
    +1220839
    +1220893
    +1220897
    +1220903
    +1220917
    +1220927
    +1220953
    +1220969
    +1220981
    +1220983
    +1220993
    +1221019
    +1221029
    +1221049
    +1221061
    +1221079
    +1221083
    +1221089
    +1221097
    +1221113
    +1221119
    +1221131
    +1221163
    +1221167
    +1221193
    +1221197
    +1221221
    +1221223
    +1221239
    +1221247
    +1221251
    +1221289
    +1221299
    +1221373
    +1221379
    +1221383
    +1221391
    +1221421
    +1221427
    +1221443
    +1221449
    +1221457
    +1221463
    +1221469
    +1221499
    +1221503
    +1221523
    +1221527
    +1221533
    +1221541
    +1221551
    +1221557
    +1221559
    +1221589
    +1221593
    +1221601
    +1221631
    +1221641
    +1221653
    +1221659
    +1221667
    +1221707
    +1221749
    +1221751
    +1221761
    +1221767
    +1221791
    +1221793
    +1221811
    +1221821
    +1221823
    +1221853
    +1221863
    +1221907
    +1221917
    +1221937
    +1221959
    +1221971
    +1222003
    +1222019
    +1222027
    +1222037
    +1222049
    +1222057
    +1222063
    +1222097
    +1222129
    +1222157
    +1222159
    +1222171
    +1222187
    +1222219
    +1222229
    +1222231
    +1222241
    +1222253
    +1222259
    +1222267
    +1222271
    +1222279
    +1222307
    +1222373
    +1222393
    +1222409
    +1222411
    +1222433
    +1222471
    +1222483
    +1222493
    +1222499
    +1222513
    +1222523
    +1222537
    +1222561
    +1222567
    +1222583
    +1222597
    +1222601
    +1222603
    +1222633
    +1222643
    +1222651
    +1222667
    +1222679
    +1222681
    +1222693
    +1222717
    +1222723
    +1222729
    +1222751
    +1222757
    +1222769
    +1222777
    +1222789
    +1222801
    +1222811
    +1222829
    +1222831
    +1222847
    +1222853
    +1222889
    +1222909
    +1222913
    +1222931
    +1222943
    +1222957
    +1222967
    +1222993
    +1223003
    +1223021
    +1223029
    +1223039
    +1223051
    +1223059
    +1223077
    +1223083
    +1223093
    +1223119
    +1223149
    +1223161
    +1223177
    +1223179
    +1223197
    +1223203
    +1223207
    +1223231
    +1223237
    +1223263
    +1223279
    +1223281
    +1223309
    +1223311
    +1223323
    +1223329
    +1223351
    +1223357
    +1223381
    +1223419
    +1223437
    +1223447
    +1223449
    +1223459
    +1223471
    +1223489
    +1223491
    +1223527
    +1223533
    +1223549
    +1223561
    +1223569
    +1223587
    +1223591
    +1223603
    +1223633
    +1223683
    +1223687
    +1223689
    +1223693
    +1223723
    +1223731
    +1223749
    +1223753
    +1223767
    +1223773
    +1223777
    +1223857
    +1223863
    +1223867
    +1223879
    +1223897
    +1223921
    +1223939
    +1223941
    +1223953
    +1223977
    +1223987
    +1223993
    +1224029
    +1224031
    +1224053
    +1224059
    +1224077
    +1224079
    +1224089
    +1224109
    +1224121
    +1224131
    +1224133
    +1224149
    +1224163
    +1224169
    +1224193
    +1224203
    +1224217
    +1224229
    +1224233
    +1224239
    +1224257
    +1224259
    +1224269
    +1224271
    +1224281
    +1224287
    +1224299
    +1224329
    +1224337
    +1224347
    +1224389
    +1224403
    +1224413
    +1224437
    +1224439
    +1224473
    +1224479
    +1224481
    +1224529
    +1224533
    +1224577
    +1224599
    +1224637
    +1224673
    +1224677
    +1224701
    +1224703
    +1224709
    +1224739
    +1224763
    +1224767
    +1224809
    +1224823
    +1224851
    +1224857
    +1224859
    +1224863
    +1224869
    +1224887
    +1224889
    +1224893
    +1224913
    +1224919
    +1224943
    +1224953
    +1224967
    +1224973
    +1224983
    +1224991
    +1225009
    +1225019
    +1225061
    +1225067
    +1225073
    +1225079
    +1225087
    +1225093
    +1225097
    +1225099
    +1225109
    +1225111
    +1225117
    +1225123
    +1225127
    +1225129
    +1225153
    +1225157
    +1225183
    +1225219
    +1225223
    +1225261
    +1225283
    +1225297
    +1225303
    +1225319
    +1225327
    +1225331
    +1225361
    +1225373
    +1225381
    +1225397
    +1225409
    +1225459
    +1225493
    +1225501
    +1225507
    +1225517
    +1225529
    +1225541
    +1225559
    +1225571
    +1225577
    +1225579
    +1225589
    +1225591
    +1225603
    +1225621
    +1225643
    +1225657
    +1225663
    +1225687
    +1225691
    +1225703
    +1225723
    +1225727
    +1225729
    +1225759
    +1225769
    +1225787
    +1225817
    +1225849
    +1225871
    +1225879
    +1225883
    +1225891
    +1225897
    +1225907
    +1225909
    +1225919
    +1225927
    +1225933
    +1225949
    +1225963
    +1225981
    +1225997
    +1225999
    +1226011
    +1226041
    +1226053
    +1226063
    +1226077
    +1226083
    +1226087
    +1226101
    +1226111
    +1226117
    +1226179
    +1226189
    +1226191
    +1226209
    +1226213
    +1226237
    +1226257
    +1226263
    +1226293
    +1226297
    +1226299
    +1226311
    +1226321
    +1226339
    +1226341
    +1226347
    +1226353
    +1226377
    +1226387
    +1226417
    +1226461
    +1226471
    +1226479
    +1226483
    +1226501
    +1226503
    +1226531
    +1226539
    +1226549
    +1226557
    +1226581
    +1226593
    +1226609
    +1226611
    +1226623
    +1226629
    +1226651
    +1226663
    +1226677
    +1226681
    +1226683
    +1226699
    +1226707
    +1226711
    +1226713
    +1226741
    +1226767
    +1226779
    +1226783
    +1226789
    +1226801
    +1226803
    +1226807
    +1226821
    +1226831
    +1226851
    +1226857
    +1226861
    +1226867
    +1226891
    +1226899
    +1226959
    +1226977
    +1226983
    +1226993
    +1227047
    +1227053
    +1227101
    +1227103
    +1227131
    +1227133
    +1227143
    +1227151
    +1227157
    +1227167
    +1227173
    +1227181
    +1227241
    +1227271
    +1227277
    +1227299
    +1227301
    +1227319
    +1227323
    +1227329
    +1227337
    +1227353
    +1227379
    +1227407
    +1227431
    +1227437
    +1227463
    +1227469
    +1227491
    +1227497
    +1227539
    +1227547
    +1227559
    +1227563
    +1227619
    +1227637
    +1227649
    +1227659
    +1227683
    +1227701
    +1227703
    +1227713
    +1227719
    +1227769
    +1227797
    +1227829
    +1227833
    +1227841
    +1227847
    +1227871
    +1227881
    +1227887
    +1227911
    +1227917
    +1227929
    +1227943
    +1227949
    +1227973
    +1227977
    +1227979
    +1227983
    +1228001
    +1228009
    +1228013
    +1228021
    +1228091
    +1228099
    +1228109
    +1228133
    +1228147
    +1228153
    +1228159
    +1228163
    +1228181
    +1228187
    +1228193
    +1228219
    +1228243
    +1228247
    +1228273
    +1228277
    +1228291
    +1228303
    +1228309
    +1228327
    +1228333
    +1228351
    +1228373
    +1228391
    +1228393
    +1228397
    +1228399
    +1228429
    +1228441
    +1228457
    +1228459
    +1228489
    +1228501
    +1228519
    +1228537
    +1228541
    +1228543
    +1228547
    +1228567
    +1228571
    +1228583
    +1228589
    +1228603
    +1228613
    +1228631
    +1228651
    +1228657
    +1228679
    +1228691
    +1228693
    +1228741
    +1228763
    +1228783
    +1228789
    +1228837
    +1228841
    +1228849
    +1228861
    +1228883
    +1228889
    +1228891
    +1228907
    +1228919
    +1228937
    +1228943
    +1228949
    +1228951
    +1228961
    +1228963
    +1228987
    +1228993
    +1229021
    +1229023
    +1229071
    +1229077
    +1229093
    +1229113
    +1229131
    +1229141
    +1229149
    +1229159
    +1229197
    +1229201
    +1229203
    +1229209
    +1229213
    +1229227
    +1229237
    +1229257
    +1229269
    +1229273
    +1229279
    +1229297
    +1229309
    +1229311
    +1229317
    +1229329
    +1229351
    +1229353
    +1229359
    +1229369
    +1229377
    +1229381
    +1229401
    +1229443
    +1229447
    +1229453
    +1229461
    +1229483
    +1229489
    +1229519
    +1229521
    +1229531
    +1229561
    +1229563
    +1229581
    +1229597
    +1229617
    +1229633
    +1229647
    +1229663
    +1229689
    +1229707
    +1229719
    +1229731
    +1229743
    +1229773
    +1229783
    +1229807
    +1229827
    +1229869
    +1229873
    +1229897
    +1229903
    +1229911
    +1229939
    +1229941
    +1229957
    +1229981
    +1229993
    +1229999
    +1230013
    +1230023
    +1230029
    +1230067
    +1230071
    +1230107
    +1230127
    +1230167
    +1230169
    +1230181
    +1230199
    +1230223
    +1230227
    +1230233
    +1230241
    +1230263
    +1230301
    +1230311
    +1230329
    +1230331
    +1230337
    +1230343
    +1230347
    +1230349
    +1230367
    +1230371
    +1230373
    +1230377
    +1230379
    +1230391
    +1230401
    +1230433
    +1230461
    +1230469
    +1230479
    +1230491
    +1230521
    +1230529
    +1230539
    +1230547
    +1230571
    +1230587
    +1230599
    +1230629
    +1230631
    +1230637
    +1230667
    +1230689
    +1230727
    +1230739
    +1230743
    +1230751
    +1230769
    +1230791
    +1230829
    +1230863
    +1230869
    +1230871
    +1230881
    +1230907
    +1230913
    +1230941
    +1230949
    +1230967
    +1230997
    +1231001
    +1231003
    +1231039
    +1231049
    +1231051
    +1231063
    +1231073
    +1231091
    +1231093
    +1231099
    +1231127
    +1231129
    +1231141
    +1231171
    +1231177
    +1231193
    +1231199
    +1231201
    +1231207
    +1231229
    +1231231
    +1231247
    +1231261
    +1231267
    +1231277
    +1231283
    +1231301
    +1231303
    +1231309
    +1231313
    +1231319
    +1231337
    +1231339
    +1231357
    +1231379
    +1231381
    +1231387
    +1231411
    +1231421
    +1231423
    +1231453
    +1231457
    +1231459
    +1231469
    +1231481
    +1231487
    +1231511
    +1231513
    +1231547
    +1231553
    +1231577
    +1231579
    +1231589
    +1231597
    +1231613
    +1231631
    +1231663
    +1231669
    +1231687
    +1231691
    +1231697
    +1231709
    +1231721
    +1231733
    +1231753
    +1231757
    +1231771
    +1231781
    +1231787
    +1231799
    +1231807
    +1231817
    +1231829
    +1231831
    +1231843
    +1231859
    +1231873
    +1231877
    +1231883
    +1231889
    +1231943
    +1231961
    +1231981
    +1231987
    +1231999
    +1232003
    +1232069
    +1232071
    +1232083
    +1232089
    +1232171
    +1232183
    +1232201
    +1232213
    +1232221
    +1232227
    +1232243
    +1232269
    +1232291
    +1232299
    +1232327
    +1232339
    +1232351
    +1232353
    +1232377
    +1232389
    +1232393
    +1232401
    +1232411
    +1232417
    +1232431
    +1232437
    +1232453
    +1232461
    +1232477
    +1232527
    +1232531
    +1232537
    +1232563
    +1232573
    +1232603
    +1232611
    +1232617
    +1232657
    +1232659
    +1232683
    +1232689
    +1232713
    +1232719
    +1232771
    +1232797
    +1232801
    +1232809
    +1232831
    +1232843
    +1232849
    +1232851
    +1232879
    +1232893
    +1232909
    +1232941
    +1232947
    +1232977
    +1232981
    +1232983
    +1232999
    +1233019
    +1233047
    +1233073
    +1233079
    +1233097
    +1233101
    +1233107
    +1233121
    +1233143
    +1233179
    +1233181
    +1233187
    +1233209
    +1233241
    +1233251
    +1233259
    +1233263
    +1233301
    +1233313
    +1233319
    +1233361
    +1233371
    +1233373
    +1233377
    +1233409
    +1233431
    +1233433
    +1233437
    +1233439
    +1233473
    +1233493
    +1233497
    +1233509
    +1233523
    +1233527
    +1233539
    +1233563
    +1233569
    +1233577
    +1233587
    +1233593
    +1233599
    +1233607
    +1233611
    +1233619
    +1233641
    +1233647
    +1233653
    +1233709
    +1233721
    +1233751
    +1233761
    +1233763
    +1233779
    +1233781
    +1233851
    +1233887
    +1233899
    +1233907
    +1233923
    +1233929
    +1233949
    +1233983
    +1234001
    +1234003
    +1234039
    +1234049
    +1234063
    +1234067
    +1234099
    +1234109
    +1234117
    +1234133
    +1234147
    +1234187
    +1234231
    +1234237
    +1234241
    +1234243
    +1234253
    +1234271
    +1234309
    +1234333
    +1234349
    +1234351
    +1234367
    +1234379
    +1234391
    +1234393
    +1234417
    +1234439
    +1234463
    +1234511
    +1234517
    +1234531
    +1234537
    +1234543
    +1234547
    +1234577
    +1234603
    +1234613
    +1234627
    +1234657
    +1234687
    +1234703
    +1234721
    +1234747
    +1234757
    +1234759
    +1234769
    +1234777
    +1234787
    +1234789
    +1234799
    +1234813
    +1234819
    +1234837
    +1234841
    +1234843
    +1234853
    +1234873
    +1234889
    +1234901
    +1234951
    +1234967
    +1234969
    +1234991
    +1235021
    +1235027
    +1235041
    +1235063
    +1235083
    +1235093
    +1235099
    +1235131
    +1235137
    +1235141
    +1235149
    +1235159
    +1235167
    +1235177
    +1235183
    +1235191
    +1235239
    +1235243
    +1235249
    +1235251
    +1235263
    +1235281
    +1235287
    +1235303
    +1235309
    +1235321
    +1235327
    +1235363
    +1235369
    +1235383
    +1235389
    +1235417
    +1235419
    +1235431
    +1235447
    +1235449
    +1235459
    +1235473
    +1235477
    +1235497
    +1235501
    +1235503
    +1235539
    +1235569
    +1235573
    +1235593
    +1235651
    +1235653
    +1235659
    +1235669
    +1235701
    +1235711
    +1235761
    +1235789
    +1235791
    +1235803
    +1235807
    +1235821
    +1235831
    +1235833
    +1235867
    +1235879
    +1235887
    +1235891
    +1235909
    +1235929
    +1235933
    +1235947
    +1235977
    +1235981
    +1235987
    +1235999
    +1236017
    +1236073
    +1236077
    +1236161
    +1236163
    +1236173
    +1236203
    +1236211
    +1236229
    +1236233
    +1236239
    +1236259
    +1236307
    +1236317
    +1236329
    +1236337
    +1236383
    +1236397
    +1236419
    +1236439
    +1236449
    +1236467
    +1236479
    +1236481
    +1236491
    +1236517
    +1236527
    +1236533
    +1236541
    +1236553
    +1236583
    +1236611
    +1236623
    +1236629
    +1236643
    +1236659
    +1236661
    +1236667
    +1236701
    +1236709
    +1236713
    +1236727
    +1236737
    +1236743
    +1236751
    +1236757
    +1236761
    +1236769
    +1236787
    +1236791
    +1236797
    +1236803
    +1236811
    +1236827
    +1236857
    +1236883
    +1236901
    +1236953
    +1236959
    +1236979
    +1237001
    +1237013
    +1237031
    +1237037
    +1237043
    +1237051
    +1237057
    +1237063
    +1237079
    +1237091
    +1237121
    +1237129
    +1237139
    +1237151
    +1237163
    +1237177
    +1237199
    +1237207
    +1237211
    +1237213
    +1237217
    +1237231
    +1237253
    +1237273
    +1237279
    +1237283
    +1237297
    +1237309
    +1237349
    +1237363
    +1237373
    +1237387
    +1237393
    +1237403
    +1237417
    +1237433
    +1237441
    +1237471
    +1237487
    +1237493
    +1237499
    +1237501
    +1237513
    +1237519
    +1237529
    +1237531
    +1237543
    +1237547
    +1237567
    +1237571
    +1237589
    +1237619
    +1237627
    +1237661
    +1237721
    +1237727
    +1237739
    +1237757
    +1237763
    +1237783
    +1237813
    +1237823
    +1237829
    +1237843
    +1237849
    +1237853
    +1237867
    +1237877
    +1237897
    +1237919
    +1237931
    +1237939
    +1237949
    +1237961
    +1237963
    +1237967
    +1237993
    +1238023
    +1238033
    +1238051
    +1238063
    +1238071
    +1238087
    +1238089
    +1238101
    +1238119
    +1238129
    +1238137
    +1238177
    +1238179
    +1238189
    +1238197
    +1238201
    +1238219
    +1238267
    +1238269
    +1238273
    +1238291
    +1238317
    +1238327
    +1238333
    +1238371
    +1238381
    +1238383
    +1238407
    +1238411
    +1238423
    +1238429
    +1238431
    +1238437
    +1238449
    +1238459
    +1238491
    +1238509
    +1238521
    +1238533
    +1238537
    +1238551
    +1238597
    +1238599
    +1238621
    +1238647
    +1238659
    +1238681
    +1238683
    +1238687
    +1238693
    +1238717
    +1238719
    +1238747
    +1238749
    +1238759
    +1238761
    +1238767
    +1238771
    +1238789
    +1238801
    +1238821
    +1238827
    +1238833
    +1238843
    +1238863
    +1238893
    +1238903
    +1238911
    +1238917
    +1238921
    +1238947
    +1238989
    +1238999
    +1239001
    +1239013
    +1239023
    +1239041
    +1239067
    +1239089
    +1239103
    +1239109
    +1239127
    +1239151
    +1239179
    +1239191
    +1239197
    +1239223
    +1239229
    +1239239
    +1239247
    +1239269
    +1239281
    +1239311
    +1239319
    +1239323
    +1239341
    +1239347
    +1239353
    +1239361
    +1239367
    +1239377
    +1239379
    +1239397
    +1239421
    +1239443
    +1239449
    +1239457
    +1239461
    +1239481
    +1239499
    +1239509
    +1239517
    +1239523
    +1239529
    +1239533
    +1239551
    +1239569
    +1239583
    +1239593
    +1239599
    +1239607
    +1239619
    +1239643
    +1239661
    +1239671
    +1239697
    +1239727
    +1239737
    +1239739
    +1239751
    +1239761
    +1239773
    +1239803
    +1239817
    +1239839
    +1239877
    +1239893
    +1239899
    +1239911
    +1239913
    +1239919
    +1239923
    +1239943
    +1239961
    +1239971
    +1239983
    +1239989
    +1240007
    +1240009
    +1240013
    +1240021
    +1240027
    +1240039
    +1240081
    +1240087
    +1240097
    +1240117
    +1240139
    +1240153
    +1240159
    +1240181
    +1240193
    +1240199
    +1240207
    +1240219
    +1240231
    +1240241
    +1240247
    +1240271
    +1240273
    +1240307
    +1240319
    +1240333
    +1240361
    +1240363
    +1240387
    +1240391
    +1240399
    +1240423
    +1240483
    +1240487
    +1240511
    +1240517
    +1240523
    +1240543
    +1240553
    +1240559
    +1240607
    +1240621
    +1240637
    +1240667
    +1240669
    +1240691
    +1240699
    +1240703
    +1240709
    +1240717
    +1240739
    +1240741
    +1240751
    +1240763
    +1240769
    +1240777
    +1240793
    +1240807
    +1240817
    +1240831
    +1240859
    +1240861
    +1240931
    +1240957
    +1240973
    +1240979
    +1240991
    +1240999
    +1241003
    +1241027
    +1241033
    +1241039
    +1241059
    +1241077
    +1241081
    +1241087
    +1241159
    +1241161
    +1241173
    +1241197
    +1241203
    +1241243
    +1241249
    +1241257
    +1241263
    +1241267
    +1241269
    +1241291
    +1241321
    +1241341
    +1241347
    +1241351
    +1241369
    +1241377
    +1241381
    +1241389
    +1241407
    +1241413
    +1241417
    +1241423
    +1241437
    +1241447
    +1241467
    +1241477
    +1241483
    +1241489
    +1241491
    +1241507
    +1241509
    +1241549
    +1241551
    +1241557
    +1241573
    +1241579
    +1241587
    +1241627
    +1241651
    +1241659
    +1241677
    +1241699
    +1241741
    +1241743
    +1241761
    +1241771
    +1241789
    +1241813
    +1241819
    +1241827
    +1241869
    +1241879
    +1241893
    +1241921
    +1241923
    +1241927
    +1241939
    +1241941
    +1241951
    +1241957
    +1241963
    +1241971
    +1241987
    +1242001
    +1242029
    +1242061
    +1242067
    +1242089
    +1242097
    +1242103
    +1242107
    +1242119
    +1242121
    +1242151
    +1242167
    +1242169
    +1242181
    +1242191
    +1242193
    +1242217
    +1242221
    +1242233
    +1242251
    +1242271
    +1242289
    +1242317
    +1242347
    +1242359
    +1242361
    +1242379
    +1242403
    +1242407
    +1242413
    +1242419
    +1242421
    +1242457
    +1242487
    +1242503
    +1242517
    +1242569
    +1242601
    +1242611
    +1242617
    +1242623
    +1242629
    +1242641
    +1242643
    +1242739
    +1242757
    +1242763
    +1242767
    +1242781
    +1242803
    +1242811
    +1242817
    +1242823
    +1242827
    +1242841
    +1242859
    +1242869
    +1242889
    +1242893
    +1242929
    +1242931
    +1242937
    +1242947
    +1242959
    +1242977
    +1242979
    +1242991
    +1243003
    +1243013
    +1243093
    +1243097
    +1243111
    +1243129
    +1243133
    +1243141
    +1243147
    +1243157
    +1243169
    +1243181
    +1243211
    +1243271
    +1243273
    +1243309
    +1243337
    +1243343
    +1243349
    +1243367
    +1243369
    +1243373
    +1243387
    +1243391
    +1243393
    +1243421
    +1243427
    +1243439
    +1243471
    +1243477
    +1243481
    +1243483
    +1243511
    +1243523
    +1243537
    +1243547
    +1243559
    +1243577
    +1243579
    +1243609
    +1243631
    +1243639
    +1243643
    +1243663
    +1243673
    +1243691
    +1243709
    +1243717
    +1243741
    +1243747
    +1243783
    +1243789
    +1243793
    +1243807
    +1243811
    +1243819
    +1243841
    +1243843
    +1243859
    +1243877
    +1243883
    +1243889
    +1243927
    +1243933
    +1243939
    +1243943
    +1243951
    +1243961
    +1243967
    +1243969
    +1243997
    +1244003
    +1244021
    +1244027
    +1244029
    +1244039
    +1244041
    +1244053
    +1244057
    +1244059
    +1244083
    +1244099
    +1244141
    +1244143
    +1244149
    +1244153
    +1244167
    +1244183
    +1244197
    +1244203
    +1244233
    +1244249
    +1244261
    +1244263
    +1244279
    +1244293
    +1244333
    +1244357
    +1244359
    +1244363
    +1244381
    +1244393
    +1244401
    +1244423
    +1244429
    +1244437
    +1244447
    +1244459
    +1244471
    +1244479
    +1244483
    +1244501
    +1244521
    +1244531
    +1244533
    +1244543
    +1244567
    +1244591
    +1244603
    +1244609
    +1244611
    +1244627
    +1244629
    +1244647
    +1244687
    +1244699
    +1244713
    +1244729
    +1244741
    +1244753
    +1244759
    +1244777
    +1244797
    +1244813
    +1244819
    +1244821
    +1244833
    +1244839
    +1244857
    +1244863
    +1244879
    +1244909
    +1244911
    +1244923
    +1244953
    +1244987
    +1244989
    +1244993
    +1245001
    +1245017
    +1245019
    +1245037
    +1245067
    +1245091
    +1245103
    +1245113
    +1245121
    +1245137
    +1245149
    +1245169
    +1245187
    +1245191
    +1245217
    +1245227
    +1245281
    +1245331
    +1245353
    +1245379
    +1245397
    +1245401
    +1245421
    +1245449
    +1245451
    +1245479
    +1245509
    +1245527
    +1245529
    +1245551
    +1245557
    +1245589
    +1245613
    +1245617
    +1245619
    +1245623
    +1245649
    +1245683
    +1245689
    +1245691
    +1245701
    +1245707
    +1245719
    +1245721
    +1245763
    +1245767
    +1245779
    +1245781
    +1245791
    +1245799
    +1245817
    +1245833
    +1245847
    +1245863
    +1245877
    +1245883
    +1245917
    +1245929
    +1245943
    +1245953
    +1245961
    +1245971
    +1245973
    +1246013
    +1246033
    +1246057
    +1246061
    +1246073
    +1246081
    +1246093
    +1246099
    +1246103
    +1246181
    +1246187
    +1246199
    +1246207
    +1246213
    +1246241
    +1246243
    +1246247
    +1246249
    +1246261
    +1246283
    +1246303
    +1246307
    +1246313
    +1246319
    +1246327
    +1246331
    +1246339
    +1246351
    +1246361
    +1246363
    +1246367
    +1246369
    +1246373
    +1246379
    +1246387
    +1246397
    +1246429
    +1246433
    +1246451
    +1246459
    +1246471
    +1246477
    +1246481
    +1246489
    +1246499
    +1246501
    +1246513
    +1246517
    +1246529
    +1246537
    +1246543
    +1246561
    +1246573
    +1246579
    +1246589
    +1246591
    +1246601
    +1246631
    +1246639
    +1246667
    +1246673
    +1246697
    +1246703
    +1246711
    +1246733
    +1246747
    +1246757
    +1246781
    +1246823
    +1246829
    +1246841
    +1246867
    +1246879
    +1246891
    +1246907
    +1246919
    +1246943
    +1246961
    +1246963
    +1246997
    +1247009
    +1247017
    +1247033
    +1247053
    +1247063
    +1247089
    +1247101
    +1247107
    +1247117
    +1247119
    +1247167
    +1247177
    +1247189
    +1247209
    +1247231
    +1247243
    +1247263
    +1247269
    +1247291
    +1247297
    +1247303
    +1247317
    +1247321
    +1247327
    +1247329
    +1247371
    +1247383
    +1247401
    +1247417
    +1247419
    +1247429
    +1247447
    +1247453
    +1247459
    +1247479
    +1247501
    +1247509
    +1247527
    +1247549
    +1247557
    +1247563
    +1247569
    +1247581
    +1247591
    +1247599
    +1247611
    +1247621
    +1247627
    +1247641
    +1247651
    +1247663
    +1247693
    +1247699
    +1247737
    +1247759
    +1247761
    +1247767
    +1247777
    +1247797
    +1247801
    +1247833
    +1247837
    +1247861
    +1247867
    +1247879
    +1247881
    +1247893
    +1247923
    +1247947
    +1247951
    +1247959
    +1247969
    +1248001
    +1248007
    +1248011
    +1248017
    +1248019
    +1248031
    +1248041
    +1248059
    +1248061
    +1248083
    +1248101
    +1248103
    +1248113
    +1248119
    +1248151
    +1248193
    +1248199
    +1248209
    +1248211
    +1248217
    +1248229
    +1248239
    +1248241
    +1248253
    +1248271
    +1248323
    +1248329
    +1248337
    +1248341
    +1248347
    +1248349
    +1248353
    +1248383
    +1248391
    +1248407
    +1248413
    +1248427
    +1248449
    +1248451
    +1248469
    +1248493
    +1248503
    +1248529
    +1248539
    +1248551
    +1248553
    +1248563
    +1248571
    +1248589
    +1248593
    +1248631
    +1248641
    +1248671
    +1248673
    +1248691
    +1248697
    +1248703
    +1248721
    +1248757
    +1248781
    +1248799
    +1248809
    +1248829
    +1248833
    +1248847
    +1248857
    +1248859
    +1248869
    +1248881
    +1248893
    +1248917
    +1248941
    +1248953
    +1248977
    +1248979
    +1248991
    +1249013
    +1249019
    +1249033
    +1249037
    +1249043
    +1249049
    +1249057
    +1249063
    +1249091
    +1249099
    +1249111
    +1249121
    +1249133
    +1249139
    +1249141
    +1249151
    +1249159
    +1249163
    +1249187
    +1249201
    +1249217
    +1249243
    +1249247
    +1249273
    +1249301
    +1249319
    +1249321
    +1249333
    +1249343
    +1249361
    +1249363
    +1249373
    +1249397
    +1249403
    +1249411
    +1249427
    +1249433
    +1249477
    +1249481
    +1249487
    +1249489
    +1249499
    +1249511
    +1249519
    +1249531
    +1249559
    +1249603
    +1249621
    +1249627
    +1249631
    +1249643
    +1249657
    +1249669
    +1249681
    +1249691
    +1249693
    +1249727
    +1249733
    +1249739
    +1249741
    +1249747
    +1249757
    +1249799
    +1249811
    +1249817
    +1249819
    +1249837
    +1249841
    +1249847
    +1249849
    +1249861
    +1249873
    +1249901
    +1249921
    +1249939
    +1249943
    +1249999
    +1250003
    +1250009
    +1250021
    +1250023
    +1250057
    +1250069
    +1250083
    +1250087
    +1250099
    +1250107
    +1250141
    +1250147
    +1250149
    +1250173
    +1250177
    +1250189
    +1250201
    +1250203
    +1250237
    +1250243
    +1250273
    +1250281
    +1250297
    +1250309
    +1250351
    +1250357
    +1250407
    +1250413
    +1250437
    +1250443
    +1250449
    +1250453
    +1250461
    +1250471
    +1250479
    +1250497
    +1250507
    +1250519
    +1250521
    +1250527
    +1250551
    +1250593
    +1250609
    +1250611
    +1250629
    +1250647
    +1250653
    +1250677
    +1250701
    +1250737
    +1250749
    +1250761
    +1250771
    +1250773
    +1250779
    +1250783
    +1250801
    +1250813
    +1250831
    +1250839
    +1250863
    +1250867
    +1250917
    +1250923
    +1250929
    +1250939
    +1250969
    +1250971
    +1250981
    +1250983
    +1251011
    +1251037
    +1251043
    +1251053
    +1251071
    +1251083
    +1251097
    +1251101
    +1251109
    +1251121
    +1251157
    +1251161
    +1251179
    +1251227
    +1251247
    +1251259
    +1251287
    +1251301
    +1251307
    +1251317
    +1251323
    +1251329
    +1251409
    +1251427
    +1251431
    +1251433
    +1251461
    +1251463
    +1251527
    +1251529
    +1251533
    +1251571
    +1251577
    +1251581
    +1251583
    +1251641
    +1251661
    +1251667
    +1251671
    +1251697
    +1251703
    +1251707
    +1251713
    +1251721
    +1251743
    +1251787
    +1251791
    +1251797
    +1251827
    +1251841
    +1251851
    +1251857
    +1251869
    +1251871
    +1251881
    +1251907
    +1251911
    +1251919
    +1251923
    +1251937
    +1251947
    +1251953
    +1251961
    +1251983
    +1252021
    +1252037
    +1252049
    +1252057
    +1252063
    +1252073
    +1252079
    +1252103
    +1252109
    +1252123
    +1252129
    +1252151
    +1252159
    +1252177
    +1252187
    +1252193
    +1252201
    +1252211
    +1252217
    +1252219
    +1252247
    +1252259
    +1252267
    +1252283
    +1252331
    +1252343
    +1252357
    +1252399
    +1252403
    +1252411
    +1252421
    +1252429
    +1252439
    +1252451
    +1252457
    +1252469
    +1252483
    +1252507
    +1252523
    +1252579
    +1252609
    +1252631
    +1252639
    +1252661
    +1252663
    +1252681
    +1252711
    +1252717
    +1252721
    +1252729
    +1252739
    +1252751
    +1252777
    +1252799
    +1252817
    +1252819
    +1252843
    +1252873
    +1252877
    +1252897
    +1252903
    +1252913
    +1252921
    +1252943
    +1252957
    +1252963
    +1252987
    +1252991
    +1252997
    +1253011
    +1253023
    +1253027
    +1253047
    +1253059
    +1253071
    +1253089
    +1253093
    +1253099
    +1253111
    +1253137
    +1253167
    +1253171
    +1253249
    +1253251
    +1253261
    +1253279
    +1253323
    +1253327
    +1253333
    +1253347
    +1253377
    +1253381
    +1253401
    +1253437
    +1253453
    +1253471
    +1253479
    +1253513
    +1253519
    +1253521
    +1253557
    +1253587
    +1253591
    +1253599
    +1253621
    +1253627
    +1253683
    +1253689
    +1253701
    +1253717
    +1253723
    +1253729
    +1253737
    +1253741
    +1253761
    +1253783
    +1253803
    +1253831
    +1253839
    +1253849
    +1253851
    +1253887
    +1253897
    +1253909
    +1253911
    +1253947
    +1253951
    +1253953
    +1253963
    +1253969
    +1253999
    +1254013
    +1254017
    +1254023
    +1254031
    +1254037
    +1254049
    +1254053
    +1254059
    +1254061
    +1254079
    +1254091
    +1254109
    +1254119
    +1254131
    +1254137
    +1254151
    +1254157
    +1254161
    +1254179
    +1254193
    +1254203
    +1254217
    +1254241
    +1254251
    +1254257
    +1254269
    +1254293
    +1254301
    +1254317
    +1254329
    +1254367
    +1254371
    +1254373
    +1254377
    +1254427
    +1254433
    +1254467
    +1254469
    +1254479
    +1254497
    +1254503
    +1254523
    +1254527
    +1254529
    +1254541
    +1254553
    +1254557
    +1254577
    +1254593
    +1254607
    +1254613
    +1254619
    +1254623
    +1254637
    +1254647
    +1254653
    +1254661
    +1254667
    +1254683
    +1254689
    +1254731
    +1254733
    +1254739
    +1254751
    +1254761
    +1254767
    +1254791
    +1254793
    +1254823
    +1254833
    +1254839
    +1254863
    +1254899
    +1254907
    +1254941
    +1254959
    +1254971
    +1254983
    +1254997
    +1255013
    +1255021
    +1255039
    +1255049
    +1255063
    +1255069
    +1255081
    +1255103
    +1255109
    +1255117
    +1255123
    +1255129
    +1255139
    +1255147
    +1255153
    +1255157
    +1255169
    +1255181
    +1255183
    +1255187
    +1255201
    +1255211
    +1255237
    +1255249
    +1255253
    +1255259
    +1255279
    +1255301
    +1255307
    +1255313
    +1255321
    +1255333
    +1255337
    +1255357
    +1255361
    +1255367
    +1255391
    +1255393
    +1255421
    +1255427
    +1255451
    +1255453
    +1255477
    +1255519
    +1255549
    +1255559
    +1255567
    +1255591
    +1255601
    +1255609
    +1255619
    +1255633
    +1255651
    +1255663
    +1255679
    +1255687
    +1255693
    +1255721
    +1255747
    +1255757
    +1255759
    +1255799
    +1255801
    +1255811
    +1255829
    +1255831
    +1255847
    +1255861
    +1255907
    +1255913
    +1255927
    +1255931
    +1255939
    +1255949
    +1255963
    +1255967
    +1255993
    +1255997
    +1256009
    +1256023
    +1256029
    +1256041
    +1256063
    +1256107
    +1256149
    +1256161
    +1256197
    +1256201
    +1256209
    +1256231
    +1256243
    +1256267
    +1256279
    +1256303
    +1256323
    +1256347
    +1256369
    +1256383
    +1256389
    +1256393
    +1256407
    +1256429
    +1256449
    +1256477
    +1256531
    +1256533
    +1256543
    +1256573
    +1256579
    +1256587
    +1256597
    +1256611
    +1256617
    +1256621
    +1256659
    +1256681
    +1256687
    +1256693
    +1256707
    +1256711
    +1256729
    +1256737
    +1256747
    +1256753
    +1256777
    +1256797
    +1256809
    +1256813
    +1256819
    +1256821
    +1256837
    +1256863
    +1256867
    +1256873
    +1256887
    +1256891
    +1256897
    +1256903
    +1256911
    +1256917
    +1256923
    +1256939
    +1256953
    +1256989
    +1256993
    +1257013
    +1257017
    +1257029
    +1257041
    +1257043
    +1257049
    +1257071
    +1257073
    +1257077
    +1257079
    +1257089
    +1257103
    +1257119
    +1257131
    +1257163
    +1257199
    +1257209
    +1257229
    +1257233
    +1257239
    +1257241
    +1257247
    +1257251
    +1257253
    +1257281
    +1257293
    +1257307
    +1257313
    +1257317
    +1257323
    +1257331
    +1257359
    +1257397
    +1257409
    +1257437
    +1257457
    +1257461
    +1257463
    +1257491
    +1257493
    +1257499
    +1257517
    +1257521
    +1257547
    +1257559
    +1257563
    +1257569
    +1257587
    +1257589
    +1257611
    +1257647
    +1257653
    +1257689
    +1257691
    +1257713
    +1257719
    +1257721
    +1257749
    +1257787
    +1257827
    +1257829
    +1257853
    +1257859
    +1257869
    +1257877
    +1257911
    +1257931
    +1257953
    +1257959
    +1257961
    +1257973
    +1257989
    +1258001
    +1258013
    +1258027
    +1258039
    +1258079
    +1258087
    +1258097
    +1258099
    +1258109
    +1258133
    +1258139
    +1258141
    +1258151
    +1258163
    +1258171
    +1258177
    +1258181
    +1258183
    +1258207
    +1258211
    +1258217
    +1258219
    +1258241
    +1258267
    +1258291
    +1258297
    +1258303
    +1258319
    +1258337
    +1258343
    +1258349
    +1258373
    +1258403
    +1258409
    +1258417
    +1258421
    +1258423
    +1258429
    +1258441
    +1258451
    +1258457
    +1258469
    +1258471
    +1258483
    +1258487
    +1258511
    +1258531
    +1258559
    +1258589
    +1258597
    +1258601
    +1258627
    +1258637
    +1258639
    +1258643
    +1258657
    +1258661
    +1258667
    +1258681
    +1258709
    +1258711
    +1258717
    +1258723
    +1258753
    +1258771
    +1258781
    +1258783
    +1258787
    +1258811
    +1258819
    +1258837
    +1258847
    +1258871
    +1258877
    +1258889
    +1258903
    +1258927
    +1258931
    +1258937
    +1258967
    +1258973
    +1258993
    +1259017
    +1259029
    +1259033
    +1259039
    +1259047
    +1259051
    +1259053
    +1259057
    +1259077
    +1259081
    +1259087
    +1259099
    +1259107
    +1259113
    +1259123
    +1259129
    +1259143
    +1259171
    +1259179
    +1259191
    +1259213
    +1259231
    +1259243
    +1259249
    +1259287
    +1259299
    +1259317
    +1259329
    +1259371
    +1259389
    +1259393
    +1259413
    +1259429
    +1259477
    +1259509
    +1259527
    +1259537
    +1259539
    +1259543
    +1259551
    +1259563
    +1259569
    +1259593
    +1259603
    +1259627
    +1259639
    +1259653
    +1259659
    +1259663
    +1259669
    +1259677
    +1259689
    +1259701
    +1259737
    +1259743
    +1259749
    +1259759
    +1259767
    +1259777
    +1259803
    +1259821
    +1259851
    +1259873
    +1259899
    +1259903
    +1259927
    +1259939
    +1259953
    +1259977
    +1259983
    +1260011
    +1260019
    +1260031
    +1260047
    +1260059
    +1260067
    +1260113
    +1260121
    +1260131
    +1260143
    +1260157
    +1260163
    +1260167
    +1260169
    +1260191
    +1260223
    +1260269
    +1260277
    +1260283
    +1260293
    +1260317
    +1260319
    +1260323
    +1260341
    +1260359
    +1260361
    +1260383
    +1260401
    +1260419
    +1260437
    +1260439
    +1260461
    +1260473
    +1260481
    +1260487
    +1260509
    +1260541
    +1260547
    +1260551
    +1260569
    +1260577
    +1260583
    +1260599
    +1260629
    +1260641
    +1260643
    +1260661
    +1260673
    +1260691
    +1260713
    +1260719
    +1260731
    +1260733
    +1260751
    +1260757
    +1260767
    +1260769
    +1260797
    +1260799
    +1260827
    +1260829
    +1260841
    +1260851
    +1260877
    +1260881
    +1260887
    +1260893
    +1260899
    +1260901
    +1260911
    +1260971
    +1260979
    +1260989
    +1260991
    +1261033
    +1261069
    +1261079
    +1261081
    +1261109
    +1261121
    +1261133
    +1261157
    +1261171
    +1261177
    +1261199
    +1261217
    +1261223
    +1261259
    +1261261
    +1261279
    +1261289
    +1261301
    +1261313
    +1261321
    +1261327
    +1261333
    +1261357
    +1261363
    +1261373
    +1261387
    +1261411
    +1261427
    +1261459
    +1261487
    +1261489
    +1261523
    +1261531
    +1261549
    +1261567
    +1261571
    +1261627
    +1261639
    +1261643
    +1261649
    +1261697
    +1261699
    +1261717
    +1261721
    +1261739
    +1261747
    +1261759
    +1261763
    +1261769
    +1261789
    +1261801
    +1261823
    +1261829
    +1261831
    +1261837
    +1261861
    +1261889
    +1261891
    +1261901
    +1261913
    +1261933
    +1261943
    +1261963
    +1261969
    +1261973
    +1262011
    +1262017
    +1262057
    +1262071
    +1262081
    +1262083
    +1262087
    +1262099
    +1262101
    +1262119
    +1262143
    +1262147
    +1262203
    +1262207
    +1262221
    +1262231
    +1262237
    +1262269
    +1262281
    +1262291
    +1262293
    +1262299
    +1262311
    +1262321
    +1262363
    +1262377
    +1262411
    +1262419
    +1262441
    +1262453
    +1262461
    +1262479
    +1262483
    +1262491
    +1262509
    +1262519
    +1262543
    +1262557
    +1262563
    +1262581
    +1262587
    +1262617
    +1262621
    +1262623
    +1262629
    +1262633
    +1262669
    +1262671
    +1262693
    +1262711
    +1262713
    +1262717
    +1262731
    +1262741
    +1262753
    +1262771
    +1262783
    +1262819
    +1262839
    +1262851
    +1262869
    +1262881
    +1262887
    +1262893
    +1262897
    +1262903
    +1262917
    +1262927
    +1262929
    +1262939
    +1262941
    +1262957
    +1263007
    +1263047
    +1263071
    +1263077
    +1263079
    +1263103
    +1263107
    +1263109
    +1263113
    +1263121
    +1263133
    +1263173
    +1263179
    +1263181
    +1263187
    +1263191
    +1263193
    +1263209
    +1263239
    +1263247
    +1263259
    +1263263
    +1263299
    +1263307
    +1263319
    +1263323
    +1263331
    +1263337
    +1263341
    +1263347
    +1263373
    +1263377
    +1263391
    +1263403
    +1263461
    +1263463
    +1263473
    +1263487
    +1263499
    +1263503
    +1263511
    +1263539
    +1263541
    +1263547
    +1263569
    +1263583
    +1263599
    +1263607
    +1263629
    +1263631
    +1263659
    +1263667
    +1263677
    +1263697
    +1263701
    +1263751
    +1263761
    +1263767
    +1263793
    +1263799
    +1263803
    +1263817
    +1263853
    +1263863
    +1263887
    +1263917
    +1263929
    +1263931
    +1263943
    +1263947
    +1263949
    +1263953
    +1263961
    +1263973
    +1263979
    +1264009
    +1264027
    +1264033
    +1264037
    +1264049
    +1264061
    +1264063
    +1264129
    +1264177
    +1264189
    +1264199
    +1264213
    +1264231
    +1264259
    +1264261
    +1264267
    +1264271
    +1264301
    +1264303
    +1264331
    +1264337
    +1264363
    +1264387
    +1264411
    +1264447
    +1264451
    +1264499
    +1264537
    +1264541
    +1264559
    +1264561
    +1264573
    +1264577
    +1264597
    +1264607
    +1264643
    +1264649
    +1264651
    +1264657
    +1264663
    +1264667
    +1264687
    +1264699
    +1264733
    +1264741
    +1264763
    +1264787
    +1264801
    +1264807
    +1264819
    +1264829
    +1264853
    +1264859
    +1264867
    +1264873
    +1264877
    +1264883
    +1264889
    +1264897
    +1264903
    +1264909
    +1264933
    +1264969
    +1264979
    +1264981
    +1264997
    +1265029
    +1265041
    +1265051
    +1265053
    +1265063
    +1265081
    +1265083
    +1265087
    +1265093
    +1265101
    +1265111
    +1265113
    +1265119
    +1265129
    +1265167
    +1265177
    +1265179
    +1265197
    +1265233
    +1265249
    +1265273
    +1265279
    +1265281
    +1265311
    +1265321
    +1265333
    +1265347
    +1265353
    +1265377
    +1265387
    +1265393
    +1265431
    +1265443
    +1265449
    +1265461
    +1265471
    +1265477
    +1265479
    +1265503
    +1265519
    +1265521
    +1265527
    +1265549
    +1265557
    +1265573
    +1265581
    +1265597
    +1265603
    +1265611
    +1265617
    +1265623
    +1265639
    +1265653
    +1265657
    +1265681
    +1265729
    +1265741
    +1265777
    +1265779
    +1265801
    +1265813
    +1265827
    +1265843
    +1265857
    +1265861
    +1265863
    +1265867
    +1265899
    +1265903
    +1265909
    +1265911
    +1265921
    +1265923
    +1265941
    +1265959
    +1265969
    +1265977
    +1265981
    +1265987
    +1265993
    +1266019
    +1266043
    +1266047
    +1266059
    +1266073
    +1266077
    +1266079
    +1266091
    +1266101
    +1266107
    +1266113
    +1266149
    +1266157
    +1266163
    +1266191
    +1266197
    +1266229
    +1266241
    +1266247
    +1266259
    +1266263
    +1266269
    +1266271
    +1266277
    +1266281
    +1266301
    +1266323
    +1266337
    +1266341
    +1266359
    +1266371
    +1266373
    +1266379
    +1266389
    +1266409
    +1266413
    +1266431
    +1266451
    +1266469
    +1266487
    +1266491
    +1266493
    +1266511
    +1266523
    +1266527
    +1266539
    +1266557
    +1266563
    +1266583
    +1266589
    +1266593
    +1266611
    +1266631
    +1266677
    +1266719
    +1266731
    +1266743
    +1266751
    +1266757
    +1266761
    +1266763
    +1266767
    +1266779
    +1266781
    +1266799
    +1266841
    +1266847
    +1266851
    +1266869
    +1266883
    +1266893
    +1266899
    +1266913
    +1266919
    +1266929
    +1266931
    +1266943
    +1266949
    +1266953
    +1267009
    +1267043
    +1267051
    +1267067
    +1267103
    +1267109
    +1267117
    +1267121
    +1267127
    +1267151
    +1267157
    +1267159
    +1267183
    +1267193
    +1267199
    +1267223
    +1267237
    +1267291
    +1267297
    +1267303
    +1267307
    +1267349
    +1267381
    +1267403
    +1267411
    +1267429
    +1267447
    +1267451
    +1267459
    +1267463
    +1267481
    +1267501
    +1267517
    +1267529
    +1267531
    +1267549
    +1267577
    +1267579
    +1267589
    +1267613
    +1267633
    +1267649
    +1267663
    +1267681
    +1267709
    +1267711
    +1267723
    +1267727
    +1267757
    +1267771
    +1267787
    +1267789
    +1267823
    +1267831
    +1267837
    +1267859
    +1267873
    +1267883
    +1267891
    +1267897
    +1267907
    +1267933
    +1267939
    +1267943
    +1267951
    +1267957
    +1267961
    +1267999
    +1268011
    +1268017
    +1268039
    +1268051
    +1268053
    +1268077
    +1268093
    +1268119
    +1268143
    +1268147
    +1268167
    +1268173
    +1268177
    +1268207
    +1268213
    +1268221
    +1268233
    +1268261
    +1268279
    +1268287
    +1268291
    +1268299
    +1268327
    +1268341
    +1268357
    +1268359
    +1268369
    +1268413
    +1268419
    +1268429
    +1268447
    +1268453
    +1268461
    +1268467
    +1268479
    +1268537
    +1268549
    +1268563
    +1268567
    +1268593
    +1268599
    +1268621
    +1268623
    +1268627
    +1268633
    +1268669
    +1268681
    +1268713
    +1268731
    +1268741
    +1268747
    +1268753
    +1268759
    +1268777
    +1268783
    +1268789
    +1268791
    +1268797
    +1268803
    +1268807
    +1268843
    +1268849
    +1268867
    +1268881
    +1268899
    +1268921
    +1268929
    +1268947
    +1268963
    +1269001
    +1269007
    +1269013
    +1269017
    +1269041
    +1269043
    +1269049
    +1269061
    +1269077
    +1269091
    +1269113
    +1269119
    +1269131
    +1269167
    +1269173
    +1269179
    +1269187
    +1269193
    +1269197
    +1269221
    +1269223
    +1269239
    +1269241
    +1269253
    +1269263
    +1269283
    +1269287
    +1269299
    +1269311
    +1269337
    +1269343
    +1269377
    +1269379
    +1269383
    +1269391
    +1269413
    +1269427
    +1269461
    +1269467
    +1269493
    +1269497
    +1269529
    +1269547
    +1269559
    +1269563
    +1269571
    +1269589
    +1269601
    +1269641
    +1269643
    +1269683
    +1269691
    +1269703
    +1269731
    +1269733
    +1269743
    +1269757
    +1269797
    +1269847
    +1269859
    +1269869
    +1269871
    +1269901
    +1269907
    +1269911
    +1269923
    +1269929
    +1269937
    +1269953
    +1269971
    +1270001
    +1270013
    +1270033
    +1270051
    +1270063
    +1270067
    +1270079
    +1270097
    +1270103
    +1270111
    +1270123
    +1270141
    +1270147
    +1270151
    +1270183
    +1270193
    +1270201
    +1270231
    +1270237
    +1270249
    +1270271
    +1270279
    +1270301
    +1270309
    +1270319
    +1270327
    +1270333
    +1270337
    +1270343
    +1270361
    +1270391
    +1270417
    +1270421
    +1270429
    +1270433
    +1270441
    +1270471
    +1270483
    +1270499
    +1270513
    +1270531
    +1270537
    +1270541
    +1270547
    +1270559
    +1270561
    +1270567
    +1270571
    +1270573
    +1270579
    +1270609
    +1270627
    +1270639
    +1270649
    +1270651
    +1270657
    +1270667
    +1270669
    +1270679
    +1270747
    +1270757
    +1270771
    +1270817
    +1270823
    +1270849
    +1270859
    +1270861
    +1270879
    +1270897
    +1270901
    +1270909
    +1270933
    +1270943
    +1270961
    +1270981
    +1271027
    +1271029
    +1271033
    +1271047
    +1271051
    +1271059
    +1271069
    +1271087
    +1271089
    +1271111
    +1271117
    +1271129
    +1271147
    +1271161
    +1271167
    +1271173
    +1271183
    +1271197
    +1271201
    +1271203
    +1271213
    +1271227
    +1271239
    +1271251
    +1271293
    +1271299
    +1271317
    +1271321
    +1271339
    +1271351
    +1271353
    +1271359
    +1271383
    +1271393
    +1271399
    +1271401
    +1271419
    +1271429
    +1271449
    +1271471
    +1271483
    +1271503
    +1271507
    +1271513
    +1271521
    +1271531
    +1271551
    +1271561
    +1271597
    +1271603
    +1271609
    +1271657
    +1271659
    +1271671
    +1271687
    +1271701
    +1271717
    +1271731
    +1271747
    +1271749
    +1271791
    +1271797
    +1271807
    +1271813
    +1271827
    +1271833
    +1271839
    +1271843
    +1271849
    +1271903
    +1271927
    +1271929
    +1271939
    +1271953
    +1271971
    +1271987
    +1271999
    +1272001
    +1272043
    +1272049
    +1272067
    +1272071
    +1272079
    +1272091
    +1272109
    +1272113
    +1272133
    +1272151
    +1272157
    +1272163
    +1272169
    +1272191
    +1272203
    +1272211
    +1272223
    +1272233
    +1272247
    +1272253
    +1272269
    +1272281
    +1272283
    +1272287
    +1272289
    +1272329
    +1272343
    +1272347
    +1272361
    +1272367
    +1272377
    +1272379
    +1272409
    +1272421
    +1272443
    +1272451
    +1272461
    +1272539
    +1272547
    +1272559
    +1272577
    +1272589
    +1272617
    +1272629
    +1272631
    +1272641
    +1272647
    +1272653
    +1272673
    +1272679
    +1272749
    +1272811
    +1272827
    +1272833
    +1272847
    +1272851
    +1272857
    +1272863
    +1272881
    +1272883
    +1272893
    +1272899
    +1272913
    +1272917
    +1272919
    +1272937
    +1272941
    +1272961
    +1272983
    +1272989
    +1272991
    +1273001
    +1273021
    +1273033
    +1273037
    +1273039
    +1273087
    +1273099
    +1273109
    +1273117
    +1273121
    +1273127
    +1273157
    +1273159
    +1273199
    +1273213
    +1273231
    +1273241
    +1273267
    +1273289
    +1273291
    +1273301
    +1273309
    +1273313
    +1273331
    +1273333
    +1273343
    +1273367
    +1273381
    +1273403
    +1273409
    +1273411
    +1273417
    +1273421
    +1273423
    +1273457
    +1273463
    +1273471
    +1273483
    +1273499
    +1273507
    +1273541
    +1273543
    +1273549
    +1273561
    +1273567
    +1273609
    +1273637
    +1273639
    +1273663
    +1273673
    +1273681
    +1273687
    +1273693
    +1273721
    +1273729
    +1273733
    +1273739
    +1273757
    +1273771
    +1273781
    +1273787
    +1273823
    +1273843
    +1273879
    +1273889
    +1273891
    +1273903
    +1273907
    +1273919
    +1273933
    +1273939
    +1273957
    +1273981
    +1274011
    +1274017
    +1274041
    +1274051
    +1274071
    +1274087
    +1274089
    +1274111
    +1274113
    +1274129
    +1274137
    +1274149
    +1274183
    +1274209
    +1274227
    +1274249
    +1274267
    +1274291
    +1274293
    +1274297
    +1274309
    +1274323
    +1274333
    +1274353
    +1274363
    +1274381
    +1274389
    +1274401
    +1274411
    +1274423
    +1274437
    +1274461
    +1274509
    +1274549
    +1274557
    +1274561
    +1274599
    +1274617
    +1274621
    +1274629
    +1274633
    +1274671
    +1274701
    +1274719
    +1274723
    +1274737
    +1274759
    +1274771
    +1274773
    +1274803
    +1274851
    +1274857
    +1274873
    +1274879
    +1274899
    +1274921
    +1274929
    +1274939
    +1274941
    +1274989
    +1275011
    +1275019
    +1275041
    +1275067
    +1275107
    +1275121
    +1275133
    +1275173
    +1275179
    +1275193
    +1275199
    +1275203
    +1275227
    +1275269
    +1275277
    +1275283
    +1275293
    +1275319
    +1275341
    +1275349
    +1275359
    +1275361
    +1275401
    +1275437
    +1275457
    +1275467
    +1275499
    +1275503
    +1275523
    +1275539
    +1275541
    +1275553
    +1275559
    +1275563
    +1275569
    +1275583
    +1275601
    +1275611
    +1275643
    +1275661
    +1275667
    +1275683
    +1275691
    +1275707
    +1275709
    +1275719
    +1275737
    +1275749
    +1275751
    +1275779
    +1275803
    +1275817
    +1275823
    +1275829
    +1275839
    +1275847
    +1275851
    +1275863
    +1275877
    +1275889
    +1275893
    +1275899
    +1275931
    +1275947
    +1275973
    +1275977
    +1275979
    +1276001
    +1276007
    +1276013
    +1276027
    +1276031
    +1276039
    +1276049
    +1276057
    +1276069
    +1276103
    +1276117
    +1276123
    +1276129
    +1276133
    +1276147
    +1276157
    +1276169
    +1276183
    +1276193
    +1276213
    +1276237
    +1276243
    +1276271
    +1276279
    +1276307
    +1276313
    +1276351
    +1276357
    +1276361
    +1276397
    +1276409
    +1276433
    +1276441
    +1276447
    +1276481
    +1276501
    +1276511
    +1276529
    +1276543
    +1276571
    +1276579
    +1276589
    +1276603
    +1276619
    +1276621
    +1276631
    +1276637
    +1276657
    +1276679
    +1276687
    +1276711
    +1276721
    +1276733
    +1276739
    +1276747
    +1276763
    +1276771
    +1276777
    +1276817
    +1276829
    +1276861
    +1276867
    +1276871
    +1276889
    +1276897
    +1276903
    +1276927
    +1276949
    +1276967
    +1276969
    +1276973
    +1276987
    +1276999
    +1277011
    +1277021
    +1277039
    +1277041
    +1277063
    +1277069
    +1277071
    +1277083
    +1277093
    +1277099
    +1277113
    +1277137
    +1277147
    +1277197
    +1277207
    +1277209
    +1277233
    +1277249
    +1277257
    +1277267
    +1277299
    +1277321
    +1277323
    +1277357
    +1277359
    +1277369
    +1277387
    +1277429
    +1277449
    +1277461
    +1277477
    +1277483
    +1277491
    +1277501
    +1277543
    +1277557
    +1277569
    +1277593
    +1277597
    +1277621
    +1277629
    +1277651
    +1277657
    +1277677
    +1277699
    +1277723
    +1277729
    +1277741
    +1277743
    +1277753
    +1277761
    +1277791
    +1277803
    +1277813
    +1277819
    +1277833
    +1277849
    +1277863
    +1277867
    +1277879
    +1277897
    +1277909
    +1277911
    +1277957
    +1277971
    +1277993
    +1278007
    +1278029
    +1278031
    +1278047
    +1278097
    +1278107
    +1278113
    +1278131
    +1278139
    +1278163
    +1278181
    +1278191
    +1278197
    +1278203
    +1278209
    +1278217
    +1278227
    +1278253
    +1278287
    +1278289
    +1278323
    +1278337
    +1278341
    +1278371
    +1278373
    +1278379
    +1278391
    +1278397
    +1278401
    +1278419
    +1278437
    +1278439
    +1278463
    +1278467
    +1278479
    +1278481
    +1278493
    +1278527
    +1278551
    +1278583
    +1278601
    +1278611
    +1278617
    +1278619
    +1278623
    +1278631
    +1278637
    +1278659
    +1278671
    +1278701
    +1278709
    +1278713
    +1278721
    +1278733
    +1278769
    +1278779
    +1278787
    +1278799
    +1278803
    +1278811
    +1278817
    +1278839
    +1278857
    +1278881
    +1278899
    +1278911
    +1278983
    +1278997
    +1279001
    +1279013
    +1279021
    +1279027
    +1279039
    +1279043
    +1279081
    +1279087
    +1279093
    +1279111
    +1279123
    +1279133
    +1279141
    +1279163
    +1279171
    +1279177
    +1279181
    +1279183
    +1279189
    +1279193
    +1279211
    +1279249
    +1279253
    +1279303
    +1279307
    +1279309
    +1279319
    +1279321
    +1279337
    +1279357
    +1279361
    +1279417
    +1279427
    +1279457
    +1279459
    +1279483
    +1279493
    +1279507
    +1279511
    +1279519
    +1279541
    +1279547
    +1279549
    +1279561
    +1279583
    +1279601
    +1279609
    +1279627
    +1279643
    +1279657
    +1279661
    +1279667
    +1279673
    +1279679
    +1279687
    +1279693
    +1279703
    +1279727
    +1279753
    +1279757
    +1279787
    +1279801
    +1279807
    +1279813
    +1279819
    +1279823
    +1279843
    +1279847
    +1279853
    +1279871
    +1279877
    +1279907
    +1279919
    +1279921
    +1279931
    +1279937
    +1279961
    +1279969
    +1279997
    +1280023
    +1280101
    +1280107
    +1280113
    +1280119
    +1280129
    +1280131
    +1280141
    +1280159
    +1280161
    +1280173
    +1280179
    +1280183
    +1280221
    +1280231
    +1280267
    +1280281
    +1280291
    +1280297
    +1280309
    +1280317
    +1280333
    +1280371
    +1280399
    +1280401
    +1280407
    +1280417
    +1280431
    +1280453
    +1280473
    +1280519
    +1280537
    +1280549
    +1280561
    +1280567
    +1280597
    +1280603
    +1280623
    +1280633
    +1280651
    +1280659
    +1280677
    +1280693
    +1280707
    +1280737
    +1280743
    +1280759
    +1280761
    +1280767
    +1280789
    +1280791
    +1280803
    +1280821
    +1280833
    +1280837
    +1280857
    +1280863
    +1280869
    +1280887
    +1280921
    +1280947
    +1280969
    +1280987
    +1280989
    +1281029
    +1281041
    +1281043
    +1281047
    +1281083
    +1281089
    +1281097
    +1281101
    +1281131
    +1281149
    +1281157
    +1281167
    +1281187
    +1281193
    +1281211
    +1281221
    +1281229
    +1281253
    +1281257
    +1281263
    +1281281
    +1281283
    +1281317
    +1281331
    +1281349
    +1281367
    +1281383
    +1281389
    +1281407
    +1281431
    +1281433
    +1281439
    +1281451
    +1281457
    +1281463
    +1281503
    +1281521
    +1281523
    +1281541
    +1281547
    +1281551
    +1281563
    +1281587
    +1281649
    +1281653
    +1281667
    +1281673
    +1281677
    +1281691
    +1281697
    +1281703
    +1281727
    +1281739
    +1281751
    +1281773
    +1281779
    +1281781
    +1281799
    +1281803
    +1281809
    +1281821
    +1281823
    +1281827
    +1281853
    +1281871
    +1281883
    +1281899
    +1281937
    +1281941
    +1281961
    +1281971
    +1281979
    +1281983
    +1282007
    +1282009
    +1282031
    +1282033
    +1282051
    +1282069
    +1282079
    +1282081
    +1282093
    +1282109
    +1282117
    +1282121
    +1282133
    +1282153
    +1282163
    +1282187
    +1282201
    +1282213
    +1282231
    +1282241
    +1282261
    +1282277
    +1282279
    +1282289
    +1282297
    +1282343
    +1282349
    +1282363
    +1282381
    +1282387
    +1282399
    +1282417
    +1282423
    +1282427
    +1282451
    +1282469
    +1282471
    +1282493
    +1282499
    +1282507
    +1282511
    +1282513
    +1282517
    +1282529
    +1282543
    +1282571
    +1282577
    +1282597
    +1282607
    +1282613
    +1282627
    +1282637
    +1282639
    +1282649
    +1282657
    +1282661
    +1282681
    +1282693
    +1282703
    +1282717
    +1282739
    +1282751
    +1282763
    +1282781
    +1282783
    +1282807
    +1282817
    +1282867
    +1282877
    +1282903
    +1282907
    +1282909
    +1282913
    +1282933
    +1282943
    +1282951
    +1282961
    +1282969
    +1282993
    +1283011
    +1283017
    +1283021
    +1283027
    +1283063
    +1283069
    +1283083
    +1283099
    +1283111
    +1283119
    +1283129
    +1283137
    +1283159
    +1283167
    +1283171
    +1283173
    +1283179
    +1283207
    +1283237
    +1283297
    +1283323
    +1283333
    +1283339
    +1283353
    +1283383
    +1283389
    +1283417
    +1283437
    +1283441
    +1283473
    +1283479
    +1283509
    +1283521
    +1283537
    +1283539
    +1283543
    +1283549
    +1283563
    +1283573
    +1283591
    +1283603
    +1283677
    +1283683
    +1283701
    +1283707
    +1283717
    +1283719
    +1283731
    +1283753
    +1283759
    +1283767
    +1283771
    +1283797
    +1283831
    +1283839
    +1283873
    +1283879
    +1283881
    +1283897
    +1283903
    +1283939
    +1283941
    +1283957
    +1283969
    +1283981
    +1283983
    +1284007
    +1284037
    +1284043
    +1284047
    +1284053
    +1284083
    +1284131
    +1284169
    +1284187
    +1284209
    +1284211
    +1284223
    +1284263
    +1284271
    +1284287
    +1284293
    +1284301
    +1284313
    +1284317
    +1284329
    +1284341
    +1284373
    +1284379
    +1284383
    +1284421
    +1284427
    +1284433
    +1284443
    +1284467
    +1284473
    +1284487
    +1284511
    +1284523
    +1284541
    +1284551
    +1284553
    +1284559
    +1284583
    +1284601
    +1284617
    +1284623
    +1284631
    +1284641
    +1284659
    +1284691
    +1284709
    +1284713
    +1284737
    +1284739
    +1284763
    +1284769
    +1284791
    +1284793
    +1284823
    +1284841
    +1284847
    +1284851
    +1284863
    +1284889
    +1284901
    +1284917
    +1284931
    +1284937
    +1284967
    +1284971
    +1284977
    +1284991
    +1285021
    +1285049
    +1285051
    +1285057
    +1285061
    +1285069
    +1285099
    +1285111
    +1285117
    +1285129
    +1285139
    +1285147
    +1285159
    +1285169
    +1285181
    +1285199
    +1285213
    +1285223
    +1285231
    +1285237
    +1285247
    +1285259
    +1285267
    +1285279
    +1285283
    +1285289
    +1285301
    +1285351
    +1285381
    +1285393
    +1285397
    +1285411
    +1285429
    +1285441
    +1285451
    +1285469
    +1285481
    +1285507
    +1285511
    +1285513
    +1285517
    +1285519
    +1285547
    +1285549
    +1285553
    +1285607
    +1285619
    +1285633
    +1285649
    +1285679
    +1285699
    +1285703
    +1285717
    +1285741
    +1285747
    +1285759
    +1285763
    +1285777
    +1285789
    +1285793
    +1285799
    +1285811
    +1285813
    +1285841
    +1285847
    +1285853
    +1285859
    +1285871
    +1285877
    +1285891
    +1285903
    +1285913
    +1285937
    +1285943
    +1285969
    +1285981
    +1285993
    +1286011
    +1286017
    +1286039
    +1286071
    +1286081
    +1286093
    +1286099
    +1286107
    +1286119
    +1286147
    +1286149
    +1286177
    +1286189
    +1286191
    +1286209
    +1286227
    +1286239
    +1286261
    +1286267
    +1286269
    +1286273
    +1286287
    +1286303
    +1286323
    +1286359
    +1286371
    +1286381
    +1286387
    +1286399
    +1286419
    +1286447
    +1286489
    +1286491
    +1286503
    +1286513
    +1286521
    +1286533
    +1286557
    +1286561
    +1286569
    +1286581
    +1286587
    +1286617
    +1286629
    +1286633
    +1286641
    +1286647
    +1286653
    +1286657
    +1286669
    +1286683
    +1286693
    +1286707
    +1286711
    +1286773
    +1286777
    +1286783
    +1286797
    +1286807
    +1286819
    +1286821
    +1286833
    +1286837
    +1286839
    +1286843
    +1286881
    +1286939
    +1286941
    +1286953
    +1286959
    +1286969
    +1286981
    +1286983
    +1287007
    +1287047
    +1287059
    +1287061
    +1287067
    +1287071
    +1287101
    +1287109
    +1287131
    +1287133
    +1287157
    +1287163
    +1287173
    +1287179
    +1287197
    +1287199
    +1287217
    +1287233
    +1287239
    +1287289
    +1287323
    +1287329
    +1287343
    +1287347
    +1287353
    +1287361
    +1287371
    +1287373
    +1287401
    +1287431
    +1287457
    +1287467
    +1287469
    +1287479
    +1287487
    +1287491
    +1287499
    +1287511
    +1287541
    +1287551
    +1287553
    +1287569
    +1287589
    +1287593
    +1287607
    +1287613
    +1287623
    +1287661
    +1287683
    +1287691
    +1287697
    +1287707
    +1287731
    +1287739
    +1287743
    +1287749
    +1287751
    +1287757
    +1287761
    +1287787
    +1287799
    +1287817
    +1287821
    +1287829
    +1287841
    +1287857
    +1287883
    +1287887
    +1287899
    +1287917
    +1287947
    +1287961
    +1287967
    +1287973
    +1287983
    +1287989
    +1287997
    +1288003
    +1288009
    +1288013
    +1288033
    +1288037
    +1288043
    +1288051
    +1288057
    +1288061
    +1288099
    +1288103
    +1288109
    +1288117
    +1288163
    +1288169
    +1288171
    +1288187
    +1288193
    +1288201
    +1288213
    +1288247
    +1288249
    +1288291
    +1288307
    +1288337
    +1288349
    +1288361
    +1288363
    +1288367
    +1288393
    +1288421
    +1288423
    +1288429
    +1288439
    +1288487
    +1288513
    +1288519
    +1288531
    +1288541
    +1288543
    +1288559
    +1288571
    +1288597
    +1288603
    +1288607
    +1288613
    +1288643
    +1288649
    +1288657
    +1288691
    +1288697
    +1288699
    +1288709
    +1288711
    +1288733
    +1288769
    +1288783
    +1288799
    +1288817
    +1288823
    +1288829
    +1288831
    +1288843
    +1288849
    +1288853
    +1288871
    +1288873
    +1288877
    +1288891
    +1288919
    +1288921
    +1288933
    +1288939
    +1288951
    +1288967
    +1288981
    +1288993
    +1288997
    +1289003
    +1289009
    +1289027
    +1289039
    +1289053
    +1289077
    +1289083
    +1289111
    +1289129
    +1289149
    +1289153
    +1289159
    +1289179
    +1289213
    +1289231
    +1289237
    +1289261
    +1289273
    +1289287
    +1289303
    +1289329
    +1289333
    +1289341
    +1289363
    +1289371
    +1289381
    +1289401
    +1289411
    +1289423
    +1289429
    +1289447
    +1289459
    +1289513
    +1289531
    +1289537
    +1289551
    +1289557
    +1289567
    +1289593
    +1289597
    +1289599
    +1289621
    +1289623
    +1289627
    +1289653
    +1289657
    +1289677
    +1289711
    +1289713
    +1289731
    +1289747
    +1289749
    +1289753
    +1289779
    +1289789
    +1289801
    +1289803
    +1289831
    +1289839
    +1289851
    +1289867
    +1289881
    +1289921
    +1289927
    +1289933
    +1289963
    +1289969
    +1289971
    +1290013
    +1290019
    +1290031
    +1290049
    +1290077
    +1290083
    +1290109
    +1290131
    +1290143
    +1290151
    +1290161
    +1290167
    +1290169
    +1290173
    +1290199
    +1290203
    +1290209
    +1290257
    +1290259
    +1290287
    +1290293
    +1290299
    +1290319
    +1290329
    +1290371
    +1290379
    +1290427
    +1290431
    +1290433
    +1290439
    +1290463
    +1290467
    +1290469
    +1290491
    +1290503
    +1290533
    +1290539
    +1290551
    +1290563
    +1290571
    +1290581
    +1290593
    +1290607
    +1290629
    +1290631
    +1290637
    +1290643
    +1290649
    +1290659
    +1290673
    +1290683
    +1290719
    +1290791
    +1290811
    +1290823
    +1290847
    +1290853
    +1290857
    +1290869
    +1290901
    +1290907
    +1290923
    +1290937
    +1290983
    +1291001
    +1291007
    +1291009
    +1291019
    +1291021
    +1291063
    +1291079
    +1291111
    +1291117
    +1291139
    +1291153
    +1291159
    +1291163
    +1291177
    +1291193
    +1291211
    +1291217
    +1291219
    +1291223
    +1291229
    +1291249
    +1291271
    +1291313
    +1291321
    +1291327
    +1291343
    +1291349
    +1291357
    +1291369
    +1291379
    +1291387
    +1291391
    +1291421
    +1291447
    +1291453
    +1291471
    +1291481
    +1291483
    +1291489
    +1291501
    +1291523
    +1291547
    +1291567
    +1291579
    +1291603
    +1291637
    +1291669
    +1291673
    +1291691
    +1291783
    +1291793
    +1291799
    +1291817
    +1291819
    +1291831
    +1291861
    +1291877
    +1291883
    +1291907
    +1291909
    +1291931
    +1291957
    +1291963
    +1291967
    +1291991
    +1291999
    +1292009
    +1292023
    +1292029
    +1292063
    +1292069
    +1292089
    +1292099
    +1292113
    +1292131
    +1292141
    +1292143
    +1292149
    +1292167
    +1292177
    +1292219
    +1292237
    +1292243
    +1292251
    +1292257
    +1292261
    +1292281
    +1292293
    +1292309
    +1292329
    +1292339
    +1292353
    +1292371
    +1292383
    +1292387
    +1292419
    +1292429
    +1292441
    +1292477
    +1292491
    +1292503
    +1292509
    +1292539
    +1292549
    +1292563
    +1292567
    +1292579
    +1292587
    +1292591
    +1292593
    +1292597
    +1292609
    +1292633
    +1292639
    +1292653
    +1292657
    +1292659
    +1292693
    +1292701
    +1292713
    +1292717
    +1292729
    +1292737
    +1292783
    +1292789
    +1292801
    +1292813
    +1292831
    +1292843
    +1292857
    +1292887
    +1292927
    +1292947
    +1292953
    +1292957
    +1292971
    +1292983
    +1292989
    +1292999
    +1293001
    +1293011
    +1293031
    +1293077
    +1293119
    +1293133
    +1293137
    +1293157
    +1293169
    +1293179
    +1293199
    +1293203
    +1293233
    +1293239
    +1293247
    +1293251
    +1293277
    +1293283
    +1293287
    +1293307
    +1293317
    +1293319
    +1293323
    +1293329
    +1293361
    +1293367
    +1293373
    +1293401
    +1293419
    +1293421
    +1293433
    +1293473
    +1293491
    +1293493
    +1293499
    +1293529
    +1293533
    +1293541
    +1293553
    +1293559
    +1293583
    +1293587
    +1293613
    +1293619
    +1293647
    +1293659
    +1293701
    +1293739
    +1293757
    +1293763
    +1293791
    +1293797
    +1293821
    +1293829
    +1293839
    +1293841
    +1293857
    +1293869
    +1293899
    +1293917
    +1293923
    +1293931
    +1293947
    +1293949
    +1293961
    +1293967
    +1293977
    +1293979
    +1293983
    +1294019
    +1294021
    +1294031
    +1294037
    +1294039
    +1294061
    +1294081
    +1294087
    +1294103
    +1294121
    +1294123
    +1294129
    +1294169
    +1294177
    +1294199
    +1294201
    +1294231
    +1294253
    +1294273
    +1294277
    +1294301
    +1294303
    +1294309
    +1294339
    +1294351
    +1294361
    +1294367
    +1294369
    +1294393
    +1294399
    +1294453
    +1294459
    +1294471
    +1294477
    +1294483
    +1294561
    +1294571
    +1294583
    +1294597
    +1294609
    +1294621
    +1294627
    +1294633
    +1294639
    +1294649
    +1294651
    +1294691
    +1294721
    +1294723
    +1294729
    +1294753
    +1294757
    +1294759
    +1294817
    +1294823
    +1294841
    +1294849
    +1294939
    +1294957
    +1294967
    +1294973
    +1294987
    +1294999
    +1295003
    +1295027
    +1295033
    +1295051
    +1295057
    +1295069
    +1295071
    +1295081
    +1295089
    +1295113
    +1295131
    +1295137
    +1295159
    +1295183
    +1295191
    +1295201
    +1295207
    +1295219
    +1295221
    +1295243
    +1295263
    +1295279
    +1295293
    +1295297
    +1295299
    +1295309
    +1295317
    +1295321
    +1295323
    +1295339
    +1295347
    +1295369
    +1295377
    +1295387
    +1295389
    +1295447
    +1295473
    +1295491
    +1295501
    +1295513
    +1295533
    +1295543
    +1295549
    +1295551
    +1295561
    +1295563
    +1295603
    +1295611
    +1295617
    +1295639
    +1295647
    +1295653
    +1295681
    +1295711
    +1295717
    +1295737
    +1295741
    +1295747
    +1295761
    +1295783
    +1295803
    +1295809
    +1295813
    +1295839
    +1295849
    +1295867
    +1295869
    +1295873
    +1295881
    +1295947
    +1295953
    +1295989
    +1295993
    +1296007
    +1296011
    +1296019
    +1296023
    +1296037
    +1296041
    +1296059
    +1296077
    +1296089
    +1296101
    +1296109
    +1296137
    +1296143
    +1296167
    +1296181
    +1296187
    +1296209
    +1296227
    +1296277
    +1296283
    +1296287
    +1296293
    +1296319
    +1296331
    +1296341
    +1296343
    +1296371
    +1296391
    +1296409
    +1296413
    +1296419
    +1296467
    +1296473
    +1296481
    +1296499
    +1296511
    +1296521
    +1296523
    +1296551
    +1296557
    +1296563
    +1296571
    +1296583
    +1296587
    +1296593
    +1296601
    +1296613
    +1296623
    +1296629
    +1296649
    +1296679
    +1296689
    +1296703
    +1296721
    +1296727
    +1296749
    +1296781
    +1296787
    +1296803
    +1296817
    +1296829
    +1296833
    +1296839
    +1296877
    +1296899
    +1296907
    +1296929
    +1296949
    +1296973
    +1296983
    +1297001
    +1297003
    +1297013
    +1297019
    +1297027
    +1297057
    +1297061
    +1297063
    +1297091
    +1297103
    +1297123
    +1297129
    +1297139
    +1297147
    +1297157
    +1297169
    +1297171
    +1297193
    +1297201
    +1297211
    +1297217
    +1297229
    +1297243
    +1297249
    +1297271
    +1297273
    +1297279
    +1297297
    +1297313
    +1297333
    +1297337
    +1297349
    +1297357
    +1297367
    +1297369
    +1297393
    +1297397
    +1297399
    +1297403
    +1297411
    +1297421
    +1297447
    +1297451
    +1297459
    +1297477
    +1297487
    +1297501
    +1297507
    +1297519
    +1297523
    +1297537
    +1297561
    +1297573
    +1297601
    +1297607
    +1297619
    +1297631
    +1297633
    +1297649
    +1297651
    +1297657
    +1297669
    +1297687
    +1297693
    +1297727
    +1297739
    +1297771
    +1297781
    +1297799
    +1297841
    +1297847
    +1297853
    +1297873
    +1297927
    +1297963
    +1297973
    +1297979
    +1297993
    +1298027
    +1298039
    +1298047
    +1298053
    +1298057
    +1298111
    +1298113
    +1298117
    +1298119
    +1298131
    +1298149
    +1298161
    +1298173
    +1298191
    +1298197
    +1298221
    +1298261
    +1298279
    +1298291
    +1298309
    +1298317
    +1298329
    +1298333
    +1298351
    +1298357
    +1298371
    +1298387
    +1298467
    +1298489
    +1298491
    +1298537
    +1298551
    +1298573
    +1298581
    +1298611
    +1298617
    +1298641
    +1298651
    +1298653
    +1298699
    +1298719
    +1298723
    +1298747
    +1298771
    +1298779
    +1298789
    +1298797
    +1298809
    +1298819
    +1298831
    +1298849
    +1298863
    +1298887
    +1298909
    +1298911
    +1298923
    +1298951
    +1298963
    +1298981
    +1298989
    +1299007
    +1299013
    +1299019
    +1299029
    +1299041
    +1299059
    +1299061
    +1299079
    +1299097
    +1299101
    +1299143
    +1299169
    +1299173
    +1299187
    +1299203
    +1299209
    +1299211
    +1299223
    +1299227
    +1299257
    +1299269
    +1299283
    +1299289
    +1299299
    +1299317
    +1299323
    +1299341
    +1299343
    +1299349
    +1299359
    +1299367
    +1299377
    +1299379
    +1299437
    +1299439
    +1299449
    +1299451
    +1299457
    +1299491
    +1299499
    +1299533
    +1299541
    +1299553
    +1299583
    +1299601
    +1299631
    +1299637
    +1299647
    +1299653
    +1299673
    +1299689
    +1299709
    diff --git a/control/BreakAndContinue.java b/control/BreakAndContinue.java
    index 1faaaa034..d6c39738c 100644
    --- a/control/BreakAndContinue.java
    +++ b/control/BreakAndContinue.java
    @@ -1,5 +1,5 @@
     // control/BreakAndContinue.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Break and continue keywords
    @@ -7,14 +7,14 @@
     
     public class BreakAndContinue {
       public static void main(String[] args) {
    -    for(int i = 0; i < 100; i++) { // [1]
    +    for(int i = 0; i < 100; i++) {        // [1]
           if(i == 74) break; // Out of for loop
           if(i % 9 != 0) continue; // Next iteration
           System.out.print(i + " ");
         }
         System.out.println();
         // Using for-in:
    -    for(int i : range(100)) { // [2]
    +    for(int i : range(100)) {             // [2]
           if(i == 74) break; // Out of for loop
           if(i % 9 != 0) continue; // Next iteration
           System.out.print(i + " ");
    @@ -22,7 +22,7 @@ public static void main(String[] args) {
         System.out.println();
         int i = 0;
         // An "infinite loop":
    -    while(true) { // [3]
    +    while(true) {                         // [3]
           i++;
           int j = i * 27;
           if(j == 1269) break; // Out of loop
    diff --git a/control/CommaOperator.java b/control/CommaOperator.java
    index eae2df824..995765188 100644
    --- a/control/CommaOperator.java
    +++ b/control/CommaOperator.java
    @@ -1,5 +1,5 @@
     // control/CommaOperator.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
    diff --git a/control/ForInFloat.java b/control/ForInFloat.java
    index cee845b57..c36236ef1 100644
    --- a/control/ForInFloat.java
    +++ b/control/ForInFloat.java
    @@ -1,5 +1,5 @@
     // control/ForInFloat.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    diff --git a/control/ForInInt.java b/control/ForInInt.java
    index f6b283a35..7adf5550d 100644
    --- a/control/ForInInt.java
    +++ b/control/ForInInt.java
    @@ -1,5 +1,5 @@
     // control/ForInInt.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import static onjava.Range.*;
    diff --git a/control/ForInString.java b/control/ForInString.java
    index 73e16538b..8b5ba601e 100644
    --- a/control/ForInString.java
    +++ b/control/ForInString.java
    @@ -1,5 +1,5 @@
     // control/ForInString.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
    diff --git a/control/IfElse.java b/control/IfElse.java
    index f40a07b7f..b2fd79de9 100644
    --- a/control/IfElse.java
    +++ b/control/IfElse.java
    @@ -1,5 +1,5 @@
     // control/IfElse.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
    @@ -8,7 +8,7 @@ public class IfElse {
       static void test(int testval, int target) {
         if(testval > target)
           result = +1;
    -    else if(testval < target) // [1]
    +    else if(testval < target)           // [1]
           result = -1;
         else
           result = 0; // Match
    diff --git a/control/LabeledFor.java b/control/LabeledFor.java
    index 2df79bad3..0cfe7bd95 100644
    --- a/control/LabeledFor.java
    +++ b/control/LabeledFor.java
    @@ -1,5 +1,5 @@
     // control/LabeledFor.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // For loops with "labeled break"/"labeled continue."
    diff --git a/control/LabeledWhile.java b/control/LabeledWhile.java
    index 961f5ff38..6c884cb80 100644
    --- a/control/LabeledWhile.java
    +++ b/control/LabeledWhile.java
    @@ -1,5 +1,5 @@
     // control/LabeledWhile.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // "While" with "labeled break" and "labeled continue."
    diff --git a/control/ListCharacters.java b/control/ListCharacters.java
    index 43efce9f5..dc4b7d2ca 100644
    --- a/control/ListCharacters.java
    +++ b/control/ListCharacters.java
    @@ -1,5 +1,5 @@
     // control/ListCharacters.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // List all the lowercase ASCII letters
    diff --git a/control/RandomBounds.java b/control/RandomBounds.java
    index 6befc6f45..e0903f372 100644
    --- a/control/RandomBounds.java
    +++ b/control/RandomBounds.java
    @@ -1,5 +1,5 @@
     // control/RandomBounds.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Does Math.random() produce 0.0 and 1.0?
    diff --git a/control/StringSwitch.java b/control/StringSwitch.java
    index 638cc4276..ac4694cf3 100644
    --- a/control/StringSwitch.java
    +++ b/control/StringSwitch.java
    @@ -1,5 +1,5 @@
     // control/StringSwitch.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
    diff --git a/control/TestWithReturn.java b/control/TestWithReturn.java
    index efe05c907..9b32ee845 100644
    --- a/control/TestWithReturn.java
    +++ b/control/TestWithReturn.java
    @@ -1,5 +1,5 @@
     // control/TestWithReturn.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
    diff --git a/control/TrueFalse.java b/control/TrueFalse.java
    index e87dade4f..ad2da1a79 100644
    --- a/control/TrueFalse.java
    +++ b/control/TrueFalse.java
    @@ -1,5 +1,5 @@
     // control/TrueFalse.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
    diff --git a/control/VowelsAndConsonants.java b/control/VowelsAndConsonants.java
    index d3a192d0d..2b8b3e959 100644
    --- a/control/VowelsAndConsonants.java
    +++ b/control/VowelsAndConsonants.java
    @@ -1,5 +1,5 @@
     // control/VowelsAndConsonants.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Demonstrates the switch statement
    diff --git a/control/WhileTest.java b/control/WhileTest.java
    index 075068cfe..a047c166c 100644
    --- a/control/WhileTest.java
    +++ b/control/WhileTest.java
    @@ -1,5 +1,5 @@
     // control/WhileTest.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Demonstrates the while loop
    diff --git a/enums/AlarmPoints.java b/enums/AlarmPoints.java
    index a87311373..484ee4f63 100644
    --- a/enums/AlarmPoints.java
    +++ b/enums/AlarmPoints.java
    @@ -1,5 +1,5 @@
     // enums/AlarmPoints.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package enums;
    diff --git a/enums/BigEnumSet.java b/enums/BigEnumSet.java
    index 52ac34458..8e2127b7a 100644
    --- a/enums/BigEnumSet.java
    +++ b/enums/BigEnumSet.java
    @@ -1,5 +1,5 @@
     // enums/BigEnumSet.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    diff --git a/enums/Burrito2.java b/enums/Burrito2.java
    index 8b92ab0da..5892eaf73 100644
    --- a/enums/Burrito2.java
    +++ b/enums/Burrito2.java
    @@ -1,5 +1,5 @@
     // enums/Burrito2.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // {java enums.Burrito2}
    @@ -11,8 +11,7 @@ public class Burrito2 {
       public Burrito2(SpicinessEnum degree) {
         this.degree = degree;
       }
    -  @Override
    -  public String toString() {
    +  @Override public String toString() {
         return "Burrito is "+ degree;
       }
       public static void main(String[] args) {
    diff --git a/enums/CarWash.java b/enums/CarWash.java
    index 95800e8fb..1b6fc856f 100644
    --- a/enums/CarWash.java
    +++ b/enums/CarWash.java
    @@ -1,5 +1,5 @@
     // enums/CarWash.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    @@ -7,44 +7,37 @@
     public class CarWash {
       public enum Cycle {
         UNDERBODY {
    -      @Override
    -      void action() {
    +      @Override void action() {
             System.out.println("Spraying the underbody");
           }
         },
         WHEELWASH {
    -      @Override
    -      void action() {
    +      @Override void action() {
             System.out.println("Washing the wheels");
           }
         },
         PREWASH {
    -      @Override
    -      void action() {
    +      @Override void action() {
             System.out.println("Loosening the dirt");
           }
         },
         BASIC {
    -      @Override
    -      void action() {
    +      @Override void action() {
             System.out.println("The basic wash");
           }
         },
         HOTWAX {
    -      @Override
    -      void action() {
    +      @Override void action() {
             System.out.println("Applying hot wax");
           }
         },
         RINSE {
    -      @Override
    -      void action() {
    +      @Override void action() {
             System.out.println("Rinsing");
           }
         },
         BLOWDRY {
    -      @Override
    -      void action() {
    +      @Override void action() {
             System.out.println("Blowing dry");
           }
         };
    @@ -59,8 +52,7 @@ public void washCar() {
         for(Cycle c : cycles)
           c.action();
       }
    -  @Override
    -  public String toString() {
    +  @Override public String toString() {
         return cycles.toString();
       }
       public static void main(String[] args) {
    diff --git a/enums/Competitor.java b/enums/Competitor.java
    index 09bf71413..5232d7d36 100644
    --- a/enums/Competitor.java
    +++ b/enums/Competitor.java
    @@ -1,5 +1,5 @@
     // enums/Competitor.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Switching one enum on another
    diff --git a/enums/ConstantSpecificMethod.java b/enums/ConstantSpecificMethod.java
    index 913aa2919..04ee956bb 100644
    --- a/enums/ConstantSpecificMethod.java
    +++ b/enums/ConstantSpecificMethod.java
    @@ -1,5 +1,5 @@
     // enums/ConstantSpecificMethod.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    @@ -7,22 +7,19 @@
     
     public enum ConstantSpecificMethod {
       DATE_TIME {
    -    @Override
    -    String getInfo() {
    +    @Override String getInfo() {
           return
             DateFormat.getDateInstance()
               .format(new Date());
         }
       },
       CLASSPATH {
    -    @Override
    -    String getInfo() {
    +    @Override String getInfo() {
           return System.getenv("CLASSPATH");
         }
       },
       VERSION {
    -    @Override
    -    String getInfo() {
    +    @Override String getInfo() {
           return System.getProperty("java.version");
         }
       };
    @@ -33,9 +30,8 @@ public static void main(String[] args) {
       }
     }
     /* Output:
    -May 9, 2017
    -C:\Users\Bruce\Documents\GitHub\on-
    -java\ExtractedExamples\\gradle\wrapper\gradle-
    -wrapper.jar
    -1.8.0_112
    +Jan 24, 2021
    +C:\Git\OnJava8\ExtractedExamples\\gradle\wrapper\gradle
    +-wrapper.jar
    +1.8.0_41
     */
    diff --git a/enums/EnumClass.java b/enums/EnumClass.java
    index 061f8abfa..a7ec9cea2 100644
    --- a/enums/EnumClass.java
    +++ b/enums/EnumClass.java
    @@ -1,5 +1,5 @@
     // enums/EnumClass.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Capabilities of the Enum class
    diff --git a/enums/EnumMaps.java b/enums/EnumMaps.java
    index f75c5cd46..2adeffcc9 100644
    --- a/enums/EnumMaps.java
    +++ b/enums/EnumMaps.java
    @@ -1,5 +1,5 @@
     // enums/EnumMaps.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Basics of EnumMaps
    diff --git a/enums/EnumSets.java b/enums/EnumSets.java
    index 0e749cadc..afb9fa7b1 100644
    --- a/enums/EnumSets.java
    +++ b/enums/EnumSets.java
    @@ -1,5 +1,5 @@
     // enums/EnumSets.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Operations on EnumSets
    diff --git a/enums/Input.java b/enums/Input.java
    index 3dc0ec440..c7be7babc 100644
    --- a/enums/Input.java
    +++ b/enums/Input.java
    @@ -1,5 +1,5 @@
     // enums/Input.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    @@ -8,14 +8,12 @@ public enum Input {
       NICKEL(5), DIME(10), QUARTER(25), DOLLAR(100),
       TOOTHPASTE(200), CHIPS(75), SODA(100), SOAP(50),
       ABORT_TRANSACTION {
    -    @Override
    -    public int amount() { // Disallow
    +    @Override public int amount() { // Disallow
           throw new RuntimeException("ABORT.amount()");
         }
       },
       STOP { // This must be the last instance.
    -    @Override
    -    public int amount() { // Disallow
    +    @Override public int amount() { // Disallow
           throw new
             RuntimeException("SHUT_DOWN.amount()");
         }
    diff --git a/enums/NonEnum.java b/enums/NonEnum.java
    index 344407307..cbd1e72b5 100644
    --- a/enums/NonEnum.java
    +++ b/enums/NonEnum.java
    @@ -1,5 +1,5 @@
     // enums/NonEnum.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
    diff --git a/enums/NotClasses.java b/enums/NotClasses.java
    index 681e807d3..efd83c8fb 100644
    --- a/enums/NotClasses.java
    +++ b/enums/NotClasses.java
    @@ -1,5 +1,5 @@
     // enums/NotClasses.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // {ExcludeFromGradle}
    @@ -7,20 +7,17 @@
     
     enum LikeClasses {
       WINKEN {
    -    @Override
    -    void behavior() {
    +    @Override void behavior() {
           System.out.println("Behavior1");
         }
       },
       BLINKEN {
    -    @Override
    -    void behavior() {
    +    @Override void behavior() {
           System.out.println("Behavior2");
         }
       },
       NOD {
    -    @Override
    -    void behavior() {
    +    @Override void behavior() {
           System.out.println("Behavior3");
         }
       };
    diff --git a/enums/Outcome.java b/enums/Outcome.java
    index 0e2a25d60..75b343b5f 100644
    --- a/enums/Outcome.java
    +++ b/enums/Outcome.java
    @@ -1,5 +1,5 @@
     // enums/Outcome.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package enums;
    diff --git a/enums/OverrideConstantSpecific.java b/enums/OverrideConstantSpecific.java
    index 28e3343be..a9ba41818 100644
    --- a/enums/OverrideConstantSpecific.java
    +++ b/enums/OverrideConstantSpecific.java
    @@ -1,13 +1,12 @@
     // enums/OverrideConstantSpecific.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
     public enum OverrideConstantSpecific {
       NUT, BOLT,
       WASHER {
    -    @Override
    -    void f() {
    +    @Override void f() {
           System.out.println("Overridden method");
         }
       };
    diff --git a/enums/OzWitch.java b/enums/OzWitch.java
    index c9eedb4fd..275961a12 100644
    --- a/enums/OzWitch.java
    +++ b/enums/OzWitch.java
    @@ -1,5 +1,5 @@
     // enums/OzWitch.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // The witches in the land of Oz
    diff --git a/enums/PostOffice.java b/enums/PostOffice.java
    index 056348206..c5faa8cb4 100644
    --- a/enums/PostOffice.java
    +++ b/enums/PostOffice.java
    @@ -1,5 +1,5 @@
     // enums/PostOffice.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Modeling a post office
    @@ -20,8 +20,9 @@ enum ReturnAddress {MISSING,OK1,OK2,OK3,OK4,OK5}
       ReturnAddress returnAddress;
       static long counter = 0;
       long id = counter++;
    -  @Override
    -  public String toString() { return "Mail " + id; }
    +  @Override public String toString() {
    +    return "Mail " + id;
    +  }
       public String details() {
         return toString() +
           ", General Delivery: " + generalDelivery +
    @@ -48,15 +49,12 @@ public static Mail randomMail() {
       Iterable generator(final int count) {
         return new Iterable() {
           int n = count;
    -      @Override
    -      public Iterator iterator() {
    +      @Override public Iterator iterator() {
             return new Iterator() {
    -          @Override
    -          public boolean hasNext() {
    +          @Override public boolean hasNext() {
                 return n-- > 0;
               }
    -          @Override
    -          public Mail next() {
    +          @Override public Mail next() {
                 return randomMail();
               }
               @Override
    @@ -72,8 +70,7 @@ public void remove() { // Not implemented
     public class PostOffice {
       enum MailHandler {
         GENERAL_DELIVERY {
    -      @Override
    -      boolean handle(Mail m) {
    +      @Override boolean handle(Mail m) {
             switch(m.generalDelivery) {
               case YES:
                 System.out.println(
    @@ -84,8 +81,7 @@ boolean handle(Mail m) {
           }
         },
         MACHINE_SCAN {
    -      @Override
    -      boolean handle(Mail m) {
    +      @Override boolean handle(Mail m) {
             switch(m.scannability) {
               case UNSCANNABLE: return false;
               default:
    @@ -100,8 +96,7 @@ boolean handle(Mail m) {
           }
         },
         VISUAL_INSPECTION {
    -      @Override
    -      boolean handle(Mail m) {
    +      @Override boolean handle(Mail m) {
             switch(m.readability) {
               case ILLEGIBLE: return false;
               default:
    @@ -116,8 +111,7 @@ boolean handle(Mail m) {
           }
         },
         RETURN_TO_SENDER {
    -      @Override
    -      boolean handle(Mail m) {
    +      @Override boolean handle(Mail m) {
             switch(m.returnAddress) {
               case MISSING: return false;
               default:
    diff --git a/enums/RandomTest.java b/enums/RandomTest.java
    index 92f2e481b..724009735 100644
    --- a/enums/RandomTest.java
    +++ b/enums/RandomTest.java
    @@ -1,5 +1,5 @@
     // enums/RandomTest.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import onjava.*;
    diff --git a/enums/Reflection.java b/enums/Reflection.java
    index 822a134e8..d9ac05a7b 100644
    --- a/enums/Reflection.java
    +++ b/enums/Reflection.java
    @@ -1,5 +1,5 @@
     // enums/Reflection.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Analyzing enums using reflection
    diff --git a/enums/RoShamBo.java b/enums/RoShamBo.java
    index 76b3d76fe..708584d98 100644
    --- a/enums/RoShamBo.java
    +++ b/enums/RoShamBo.java
    @@ -1,5 +1,5 @@
     // enums/RoShamBo.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Common tools for RoShamBo examples
    diff --git a/enums/RoShamBo1.java b/enums/RoShamBo1.java
    index abf52c9c9..bf77aad82 100644
    --- a/enums/RoShamBo1.java
    +++ b/enums/RoShamBo1.java
    @@ -1,5 +1,5 @@
     // enums/RoShamBo1.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Demonstration of multiple dispatching
    @@ -16,8 +16,7 @@ interface Item {
     }
     
     class Paper implements Item {
    -  @Override
    -  public Outcome compete(Item it) {
    +  @Override public Outcome compete(Item it) {
         return it.eval(this);
       }
       @Override
    @@ -26,13 +25,13 @@ public Outcome compete(Item it) {
       public Outcome eval(Scissors s) { return WIN; }
       @Override
       public Outcome eval(Rock r) { return LOSE; }
    -  @Override
    -  public String toString() { return "Paper"; }
    +  @Override public String toString() {
    +    return "Paper";
    +  }
     }
     
     class Scissors implements Item {
    -  @Override
    -  public Outcome compete(Item it) {
    +  @Override public Outcome compete(Item it) {
         return it.eval(this);
       }
       @Override
    @@ -41,13 +40,13 @@ public Outcome compete(Item it) {
       public Outcome eval(Scissors s) { return DRAW; }
       @Override
       public Outcome eval(Rock r) { return WIN; }
    -  @Override
    -  public String toString() { return "Scissors"; }
    +  @Override public String toString() {
    +    return "Scissors";
    +  }
     }
     
     class Rock implements Item {
    -  @Override
    -  public Outcome compete(Item it) {
    +  @Override public Outcome compete(Item it) {
         return it.eval(this);
       }
       @Override
    @@ -56,8 +55,9 @@ public Outcome compete(Item it) {
       public Outcome eval(Scissors s) { return LOSE; }
       @Override
       public Outcome eval(Rock r) { return DRAW; }
    -  @Override
    -  public String toString() { return "Rock"; }
    +  @Override public String toString() {
    +    return "Rock";
    +  }
     }
     
     public class RoShamBo1 {
    diff --git a/enums/RoShamBo2.java b/enums/RoShamBo2.java
    index ec8ab25b1..16786562a 100644
    --- a/enums/RoShamBo2.java
    +++ b/enums/RoShamBo2.java
    @@ -1,5 +1,5 @@
     // enums/RoShamBo2.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Switching one enum on another
    @@ -18,8 +18,7 @@ public enum RoShamBo2 implements Competitor {
         this.vSCISSORS = scissors;
         this.vROCK = rock;
       }
    -  @Override
    -  public Outcome compete(RoShamBo2 it) {
    +  @Override public Outcome compete(RoShamBo2 it) {
         switch(it) {
           default:
           case PAPER: return vPAPER;
    diff --git a/enums/RoShamBo3.java b/enums/RoShamBo3.java
    index ffcd2cf17..91683dce7 100644
    --- a/enums/RoShamBo3.java
    +++ b/enums/RoShamBo3.java
    @@ -1,5 +1,5 @@
     // enums/RoShamBo3.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Using constant-specific methods
    @@ -9,8 +9,7 @@
     
     public enum RoShamBo3 implements Competitor {
       PAPER {
    -    @Override
    -    public Outcome compete(RoShamBo3 it) {
    +    @Override public Outcome compete(RoShamBo3 it) {
           switch(it) {
             default: // To placate the compiler
             case PAPER: return DRAW;
    @@ -20,8 +19,7 @@ public Outcome compete(RoShamBo3 it) {
         }
       },
       SCISSORS {
    -    @Override
    -    public Outcome compete(RoShamBo3 it) {
    +    @Override public Outcome compete(RoShamBo3 it) {
           switch(it) {
             default:
             case PAPER: return WIN;
    @@ -31,8 +29,7 @@ public Outcome compete(RoShamBo3 it) {
         }
       },
       ROCK {
    -    @Override
    -    public Outcome compete(RoShamBo3 it) {
    +    @Override public Outcome compete(RoShamBo3 it) {
           switch(it) {
             default:
             case PAPER: return LOSE;
    diff --git a/enums/RoShamBo4.java b/enums/RoShamBo4.java
    index f0b473aef..2ad59aa96 100644
    --- a/enums/RoShamBo4.java
    +++ b/enums/RoShamBo4.java
    @@ -1,5 +1,5 @@
     // enums/RoShamBo4.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // {java enums.RoShamBo4}
    diff --git a/enums/RoShamBo5.java b/enums/RoShamBo5.java
    index 69885c017..8f6b996ec 100644
    --- a/enums/RoShamBo5.java
    +++ b/enums/RoShamBo5.java
    @@ -1,5 +1,5 @@
     // enums/RoShamBo5.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Multiple dispatching using an EnumMap of EnumMaps
    @@ -27,8 +27,7 @@ static void initRow(RoShamBo5 it,
         row.put(RoShamBo5.SCISSORS, vSCISSORS);
         row.put(RoShamBo5.ROCK, vROCK);
       }
    -  @Override
    -  public Outcome compete(RoShamBo5 it) {
    +  @Override public Outcome compete(RoShamBo5 it) {
         return table.get(this).get(it);
       }
       public static void main(String[] args) {
    diff --git a/enums/RoShamBo6.java b/enums/RoShamBo6.java
    index 164911d52..3d66d894d 100644
    --- a/enums/RoShamBo6.java
    +++ b/enums/RoShamBo6.java
    @@ -1,5 +1,5 @@
     // enums/RoShamBo6.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Enums using "tables" instead of multiple dispatch
    @@ -14,8 +14,7 @@ enum RoShamBo6 implements Competitor {
         { WIN, DRAW, LOSE }, // SCISSORS
         { LOSE, WIN, DRAW }, // ROCK
       };
    -  @Override
    -  public Outcome compete(RoShamBo6 other) {
    +  @Override public Outcome compete(RoShamBo6 other) {
         return table[this.ordinal()][other.ordinal()];
       }
       public static void main(String[] args) {
    diff --git a/enums/SecurityCategory.java b/enums/SecurityCategory.java
    index 884cb56a2..18dd0f62a 100644
    --- a/enums/SecurityCategory.java
    +++ b/enums/SecurityCategory.java
    @@ -1,5 +1,5 @@
     // enums/SecurityCategory.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // More succinct subcategorization of enums
    diff --git a/enums/SpaceShip.java b/enums/SpaceShip.java
    index 3623389e0..45a5485fb 100644
    --- a/enums/SpaceShip.java
    +++ b/enums/SpaceShip.java
    @@ -1,5 +1,5 @@
     // enums/SpaceShip.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.stream.*;
    @@ -7,8 +7,7 @@
     public enum SpaceShip {
       SCOUT, CARGO, TRANSPORT,
       CRUISER, BATTLESHIP, MOTHERSHIP;
    -  @Override
    -  public String toString() {
    +  @Override public String toString() {
         String id = name();
         String lower = id.substring(1).toLowerCase();
         return id.charAt(0) + lower;
    diff --git a/enums/SpicinessEnum.java b/enums/SpicinessEnum.java
    index eef6f89a4..02b54ee4d 100644
    --- a/enums/SpicinessEnum.java
    +++ b/enums/SpicinessEnum.java
    @@ -1,5 +1,5 @@
     // enums/SpicinessEnum.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package enums;
    diff --git a/enums/TrafficLight.java b/enums/TrafficLight.java
    index b018e02c7..a42089a7a 100644
    --- a/enums/TrafficLight.java
    +++ b/enums/TrafficLight.java
    @@ -1,5 +1,5 @@
     // enums/TrafficLight.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Enums in switch statements
    @@ -21,8 +21,7 @@ public void change() {
                        break;
         }
       }
    -  @Override
    -  public String toString() {
    +  @Override public String toString() {
         return "The traffic light is " + color;
       }
       public static void main(String[] args) {
    diff --git a/enums/UpcastEnum.java b/enums/UpcastEnum.java
    index a5df2a862..5665e2e3d 100644
    --- a/enums/UpcastEnum.java
    +++ b/enums/UpcastEnum.java
    @@ -1,5 +1,5 @@
     // enums/UpcastEnum.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // No values() method if you upcast an enum
    diff --git a/enums/VendingMachine.java b/enums/VendingMachine.java
    index bc7d7c19e..269dd0131 100644
    --- a/enums/VendingMachine.java
    +++ b/enums/VendingMachine.java
    @@ -1,5 +1,5 @@
     // enums/VendingMachine.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // {java VendingMachine VendingMachineInput.txt}
    @@ -37,8 +37,7 @@ public class VendingMachine {
       enum StateDuration { TRANSIENT } // Tagging enum
       enum State {
         RESTING {
    -      @Override
    -      void next(Input input) {
    +      @Override void next(Input input) {
             switch(Category.categorize(input)) {
               case MONEY:
                 amount += input.amount();
    @@ -51,8 +50,7 @@ void next(Input input) {
           }
         },
         ADDING_MONEY {
    -      @Override
    -      void next(Input input) {
    +      @Override void next(Input input) {
             switch(Category.categorize(input)) {
               case MONEY:
                 amount += input.amount();
    @@ -74,16 +72,14 @@ void next(Input input) {
           }
         },
         DISPENSING(StateDuration.TRANSIENT) {
    -      @Override
    -      void next() {
    +      @Override void next() {
             System.out.println("here is your " + selection);
             amount -= selection.amount();
             state = GIVING_CHANGE;
           }
         },
         GIVING_CHANGE(StateDuration.TRANSIENT) {
    -      @Override
    -      void next() {
    +      @Override void next() {
             if(amount > 0) {
               System.out.println("Your change: " + amount);
               amount = 0;
    @@ -125,8 +121,7 @@ public static void main(String[] args) {
     
     // For a basic sanity check:
     class RandomInputSupplier implements Supplier {
    -  @Override
    -  public Input get() {
    +  @Override public Input get() {
         return Input.randomSelection();
       }
     }
    @@ -146,8 +141,7 @@ class FileInputSupplier implements Supplier {
           throw new RuntimeException(e);
         }
       }
    -  @Override
    -  public Input get() {
    +  @Override public Input get() {
         if(!input.hasNext())
           return null;
         return Enum.valueOf(
    diff --git a/enums/cartoons/EnumImplementation.java b/enums/cartoons/EnumImplementation.java
    index 58902e3fc..5d1cb0d50 100644
    --- a/enums/cartoons/EnumImplementation.java
    +++ b/enums/cartoons/EnumImplementation.java
    @@ -1,5 +1,5 @@
     // enums/cartoons/EnumImplementation.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // An enum can implement an interface
    @@ -14,8 +14,7 @@ enum CartoonCharacter
       SILLY, BOUNCY, NUTTY, BOB;
       private Random rand =
         new Random(47);
    -  @Override
    -  public CartoonCharacter get() {
    +  @Override public CartoonCharacter get() {
         return values()[rand.nextInt(values().length)];
       }
     }
    diff --git a/enums/menu/Course.java b/enums/menu/Course.java
    index 96481f1eb..7cb54ef1a 100644
    --- a/enums/menu/Course.java
    +++ b/enums/menu/Course.java
    @@ -1,5 +1,5 @@
     // enums/menu/Course.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package enums.menu;
    diff --git a/enums/menu/Food.java b/enums/menu/Food.java
    index 4b97f69ec..5592f9126 100644
    --- a/enums/menu/Food.java
    +++ b/enums/menu/Food.java
    @@ -1,5 +1,5 @@
     // enums/menu/Food.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Subcategorization of enums within interfaces
    diff --git a/enums/menu/Meal.java b/enums/menu/Meal.java
    index 64bc496d6..48b7f723b 100644
    --- a/enums/menu/Meal.java
    +++ b/enums/menu/Meal.java
    @@ -1,5 +1,5 @@
     // enums/menu/Meal.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // {java enums.menu.Meal}
    diff --git a/enums/menu/Meal2.java b/enums/menu/Meal2.java
    index df1b90a58..d5aea179c 100644
    --- a/enums/menu/Meal2.java
    +++ b/enums/menu/Meal2.java
    @@ -1,5 +1,5 @@
     // enums/menu/Meal2.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // {java enums.menu.Meal2}
    diff --git a/enums/menu/TypeOfFood.java b/enums/menu/TypeOfFood.java
    index 5e59e78bb..d11fce81c 100644
    --- a/enums/menu/TypeOfFood.java
    +++ b/enums/menu/TypeOfFood.java
    @@ -1,5 +1,5 @@
     // enums/menu/TypeOfFood.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // {java enums.menu.TypeOfFood}
    diff --git a/equalshashcode/ComposedEquality.java b/equalshashcode/ComposedEquality.java
    index c224231ca..58ad001de 100644
    --- a/equalshashcode/ComposedEquality.java
    +++ b/equalshashcode/ComposedEquality.java
    @@ -1,5 +1,5 @@
     // equalshashcode/ComposedEquality.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    @@ -11,8 +11,7 @@ class Part {
         this.ss = ss;
         this.dd = dd;
       }
    -  @Override
    -  public boolean equals(Object rval) {
    +  @Override public boolean equals(Object rval) {
         return rval instanceof Part &&
           Objects.equals(ss, ((Part)rval).ss) &&
           Objects.equals(dd, ((Part)rval).dd);
    @@ -26,8 +25,7 @@ public ComposedEquality(int i, String s, double d) {
         part = new Part(s, d);
         System.out.println("made 'ComposedEquality'");
       }
    -  @Override
    -  public boolean equals(Object rval) {
    +  @Override public boolean equals(Object rval) {
         return rval instanceof ComposedEquality &&
           super.equals(rval) &&
           Objects.equals(part,
    diff --git a/equalshashcode/CountedString.java b/equalshashcode/CountedString.java
    index 5a6ec5fab..4b7c0aab7 100644
    --- a/equalshashcode/CountedString.java
    +++ b/equalshashcode/CountedString.java
    @@ -1,5 +1,5 @@
     // equalshashcode/CountedString.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Creating a good hashCode()
    @@ -19,13 +19,11 @@ public CountedString(String str) {
           if(s2.equals(s))
             id++;
       }
    -  @Override
    -  public String toString() {
    +  @Override public String toString() {
         return "String: " + s + " id: " + id +
           " hashCode(): " + hashCode();
       }
    -  @Override
    -  public int hashCode() {
    +  @Override public int hashCode() {
         // The very simple approach:
         // return s.hashCode() * id;
         // Using Joshua Bloch's recipe:
    @@ -34,8 +32,7 @@ public int hashCode() {
         result = 37 * result + id;
         return result;
       }
    -  @Override
    -  public boolean equals(Object o) {
    +  @Override public boolean equals(Object o) {
         return o instanceof CountedString &&
           Objects.equals(s, ((CountedString)o).s) &&
           Objects.equals(id, ((CountedString)o).id);
    diff --git a/equalshashcode/DefaultComparison.java b/equalshashcode/DefaultComparison.java
    index d855de369..1c5c03ab9 100644
    --- a/equalshashcode/DefaultComparison.java
    +++ b/equalshashcode/DefaultComparison.java
    @@ -1,5 +1,5 @@
     // equalshashcode/DefaultComparison.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
    diff --git a/equalshashcode/Equality.java b/equalshashcode/Equality.java
    index 6ab13e5e9..46661bc8a 100644
    --- a/equalshashcode/Equality.java
    +++ b/equalshashcode/Equality.java
    @@ -1,5 +1,5 @@
     // equalshashcode/Equality.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    @@ -14,8 +14,7 @@ public Equality(int i, String s, double d) {
         this.d = d;
         System.out.println("made 'Equality'");
       }
    -  @Override
    -  public boolean equals(Object rval) {
    +  @Override public boolean equals(Object rval) {
         if(rval == null)
           return false;
         if(rval == this)
    diff --git a/equalshashcode/EqualityFactory.java b/equalshashcode/EqualityFactory.java
    index 378b56b0d..1718cdba2 100644
    --- a/equalshashcode/EqualityFactory.java
    +++ b/equalshashcode/EqualityFactory.java
    @@ -1,5 +1,5 @@
     // equalshashcode/EqualityFactory.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    diff --git a/equalshashcode/Groundhog.java b/equalshashcode/Groundhog.java
    index 55c775633..bdc941114 100644
    --- a/equalshashcode/Groundhog.java
    +++ b/equalshashcode/Groundhog.java
    @@ -1,5 +1,5 @@
     // equalshashcode/Groundhog.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Looks plausible, but doesn't work as a HashMap key
    @@ -7,8 +7,7 @@
     public class Groundhog {
       protected int number;
       public Groundhog(int n) { number = n; }
    -  @Override
    -  public String toString() {
    +  @Override public String toString() {
         return "Groundhog #" + number;
       }
     }
    diff --git a/equalshashcode/Groundhog2.java b/equalshashcode/Groundhog2.java
    index 5348d1e52..124eaa9e8 100644
    --- a/equalshashcode/Groundhog2.java
    +++ b/equalshashcode/Groundhog2.java
    @@ -1,5 +1,5 @@
     // equalshashcode/Groundhog2.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // A class that's used as a key in a HashMap
    @@ -10,8 +10,7 @@ public class Groundhog2 extends Groundhog {
       public Groundhog2(int n) { super(n); }
       @Override
       public int hashCode() { return number; }
    -  @Override
    -  public boolean equals(Object o) {
    +  @Override public boolean equals(Object o) {
         return o instanceof Groundhog2 &&
           Objects.equals(
             number, ((Groundhog2)o).number);
    diff --git a/equalshashcode/IndividualTest.java b/equalshashcode/IndividualTest.java
    index d8f509743..33bb9b96d 100644
    --- a/equalshashcode/IndividualTest.java
    +++ b/equalshashcode/IndividualTest.java
    @@ -1,5 +1,5 @@
     // equalshashcode/IndividualTest.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import collections.MapOfList;
    diff --git a/equalshashcode/MapEntry.java b/equalshashcode/MapEntry.java
    index c6e28bf4e..fff73332a 100644
    --- a/equalshashcode/MapEntry.java
    +++ b/equalshashcode/MapEntry.java
    @@ -1,5 +1,5 @@
     // equalshashcode/MapEntry.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // A simple Map.Entry for sample Map implementations
    @@ -12,31 +12,25 @@ public MapEntry(K key, V value) {
         this.key = key;
         this.value = value;
       }
    -  @Override
    -  public K getKey() { return key; }
    -  @Override
    -  public V getValue() { return value; }
    -  @Override
    -  public V setValue(V v) {
    +  @Override public K getKey() { return key; }
    +  @Override public V getValue() { return value; }
    +  @Override public V setValue(V v) {
         V result = value;
         value = v;
         return result;
       }
    -  @Override
    -  public int hashCode() {
    +  @Override public int hashCode() {
         return Objects.hash(key, value);
       }
       @SuppressWarnings("unchecked")
    -  @Override
    -  public boolean equals(Object rval) {
    +  @Override public boolean equals(Object rval) {
         return rval instanceof MapEntry &&
           Objects.equals(key,
             ((MapEntry)rval).getKey()) &&
           Objects.equals(value,
             ((MapEntry)rval).getValue());
       }
    -  @Override
    -  public String toString() {
    +  @Override public String toString() {
         return key + "=" + value;
       }
     }
    diff --git a/equalshashcode/Prediction.java b/equalshashcode/Prediction.java
    index c8ff97773..ab945fc52 100644
    --- a/equalshashcode/Prediction.java
    +++ b/equalshashcode/Prediction.java
    @@ -1,5 +1,5 @@
     // equalshashcode/Prediction.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Predicting the weather
    @@ -7,8 +7,7 @@
     
     public class Prediction {
       private static Random rand = new Random(47);
    -  @Override
    -  public String toString() {
    +  @Override public String toString() {
         return rand.nextBoolean() ?
           "Six more weeks of Winter!" : "Early Spring!";
       }
    diff --git a/equalshashcode/SimpleHashMap.java b/equalshashcode/SimpleHashMap.java
    index f82022a19..b47806441 100644
    --- a/equalshashcode/SimpleHashMap.java
    +++ b/equalshashcode/SimpleHashMap.java
    @@ -1,5 +1,5 @@
     // equalshashcode/SimpleHashMap.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // A demonstration hashed Map
    @@ -16,8 +16,7 @@ class SimpleHashMap extends AbstractMap {
       @SuppressWarnings("unchecked")
       LinkedList>[] buckets =
         new LinkedList[SIZE];
    -  @Override
    -  public V put(K key, V value) {
    +  @Override public V put(K key, V value) {
         V oldValue = null;
         int index = Math.abs(key.hashCode()) % SIZE;
         if(buckets[index] == null)
    @@ -40,8 +39,7 @@ public V put(K key, V value) {
           buckets[index].add(pair);
         return oldValue;
       }
    -  @Override
    -  public V get(Object key) {
    +  @Override public V get(Object key) {
         int index = Math.abs(key.hashCode()) % SIZE;
         if(buckets[index] == null) return null;
         for(MapEntry iPair : buckets[index])
    @@ -49,8 +47,7 @@ public V get(Object key) {
             return iPair.getValue();
         return null;
       }
    -  @Override
    -  public Set> entrySet() {
    +  @Override public Set> entrySet() {
         Set> set= new HashSet<>();
         for(LinkedList> bucket : buckets) {
           if(bucket == null) continue;
    diff --git a/equalshashcode/SlowMap.java b/equalshashcode/SlowMap.java
    index 63f17092d..04d0a85d8 100644
    --- a/equalshashcode/SlowMap.java
    +++ b/equalshashcode/SlowMap.java
    @@ -1,5 +1,5 @@
     // equalshashcode/SlowMap.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // A Map implemented with ArrayLists
    @@ -9,8 +9,7 @@
     public class SlowMap extends AbstractMap {
       private List keys = new ArrayList<>();
       private List values = new ArrayList<>();
    -  @Override
    -  public V put(K key, V value) {
    +  @Override public V put(K key, V value) {
         V oldValue = get(key); // The old value or null
         if(!keys.contains(key)) {
           keys.add(key);
    @@ -25,8 +24,7 @@ public V get(Object key) { // key: type Object, not K
           return null;
         return values.get(keys.indexOf(key));
       }
    -  @Override
    -  public Set> entrySet() {
    +  @Override public Set> entrySet() {
         Set> set= new HashSet<>();
         Iterator ki = keys.iterator();
         Iterator vi = values.iterator();
    diff --git a/equalshashcode/SpringDetector.java b/equalshashcode/SpringDetector.java
    index 9b41bd3e2..d92f20b54 100644
    --- a/equalshashcode/SpringDetector.java
    +++ b/equalshashcode/SpringDetector.java
    @@ -1,5 +1,5 @@
     // equalshashcode/SpringDetector.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // What will the weather be?
    @@ -47,16 +47,16 @@ public static void main(String[] args) {
       }
     }
     /* Output:
    -Groundhog #3: Six more weeks of Winter!
    +Groundhog #5: Six more weeks of Winter!
    +Groundhog #2: Early Spring!
    +Groundhog #1: Six more weeks of Winter!
     Groundhog #0: Early Spring!
    -Groundhog #8: Six more weeks of Winter!
    -Groundhog #6: Early Spring!
    +Groundhog #8: Early Spring!
    +Groundhog #6: Six more weeks of Winter!
     Groundhog #4: Early Spring!
    -Groundhog #2: Six more weeks of Winter!
    -Groundhog #1: Early Spring!
    -Groundhog #9: Early Spring!
    -Groundhog #5: Six more weeks of Winter!
    +Groundhog #3: Early Spring!
     Groundhog #7: Six more weeks of Winter!
    +Groundhog #9: Six more weeks of Winter!
     Looking up prediction for Groundhog #3
     Key not found: Groundhog #3
     */
    diff --git a/equalshashcode/SpringDetector2.java b/equalshashcode/SpringDetector2.java
    index 1e136e477..fc0267562 100644
    --- a/equalshashcode/SpringDetector2.java
    +++ b/equalshashcode/SpringDetector2.java
    @@ -1,5 +1,5 @@
     // equalshashcode/SpringDetector2.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // A working key
    diff --git a/equalshashcode/StringHashCode.java b/equalshashcode/StringHashCode.java
    index 222fa612a..e8c2062be 100644
    --- a/equalshashcode/StringHashCode.java
    +++ b/equalshashcode/StringHashCode.java
    @@ -1,5 +1,5 @@
     // equalshashcode/StringHashCode.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
    diff --git a/equalshashcode/SubtypeEquality.java b/equalshashcode/SubtypeEquality.java
    index 90320c88e..8d86d6bad 100644
    --- a/equalshashcode/SubtypeEquality.java
    +++ b/equalshashcode/SubtypeEquality.java
    @@ -1,5 +1,5 @@
     // equalshashcode/SubtypeEquality.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    @@ -15,20 +15,17 @@ class Animal {
         this.name = name;
         this.size = size;
       }
    -  @Override
    -  public boolean equals(Object rval) {
    +  @Override public boolean equals(Object rval) {
         return rval instanceof Animal &&
           // Objects.equals(id, ((Animal)rval).id) && // [1]
           Objects.equals(name, ((Animal)rval).name) &&
           Objects.equals(size, ((Animal)rval).size);
       }
    -  @Override
    -  public int hashCode() {
    +  @Override public int hashCode() {
         return Objects.hash(name, size);
    -    // return Objects.hash(name, size, id);  // [2]
    +    // return Objects.hash(name, size, id);       // [2]
       }
    -  @Override
    -  public String toString() {
    +  @Override public String toString() {
         return String.format("%s[%d]: %s %s %x",
           getClass().getSimpleName(), id,
           name, size, hashCode());
    @@ -56,5 +53,5 @@ public static void main(String[] args) {
       }
     }
     /* Output:
    -Dog[0]: Ralph MEDIUM a752aeee
    +Dog[0]: Ralph MEDIUM 931523a9
     */
    diff --git a/equalshashcode/SubtypeEquality2.java b/equalshashcode/SubtypeEquality2.java
    index c0ac50573..a107409ff 100644
    --- a/equalshashcode/SubtypeEquality2.java
    +++ b/equalshashcode/SubtypeEquality2.java
    @@ -1,5 +1,5 @@
     // equalshashcode/SubtypeEquality2.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    @@ -8,8 +8,7 @@ class Dog2 extends Animal {
       Dog2(String name, Size size) {
         super(name, size);
       }
    -  @Override
    -  public boolean equals(Object rval) {
    +  @Override public boolean equals(Object rval) {
         return rval instanceof Dog2 &&
           super.equals(rval);
       }
    @@ -19,8 +18,7 @@ class Pig2 extends Animal {
       Pig2(String name, Size size) {
         super(name, size);
       }
    -  @Override
    -  public boolean equals(Object rval) {
    +  @Override public boolean equals(Object rval) {
         return rval instanceof Pig2 &&
           super.equals(rval);
       }
    @@ -35,6 +33,6 @@ public static void main(String[] args) {
       }
     }
     /* Output:
    -Dog2[0]: Ralph MEDIUM a752aeee
    -Pig2[1]: Ralph MEDIUM a752aeee
    +Dog2[0]: Ralph MEDIUM 931523a9
    +Pig2[1]: Ralph MEDIUM 931523a9
     */
    diff --git a/equalshashcode/SuccinctEquality.java b/equalshashcode/SuccinctEquality.java
    index 55a0d8de6..7564d5cc5 100644
    --- a/equalshashcode/SuccinctEquality.java
    +++ b/equalshashcode/SuccinctEquality.java
    @@ -1,5 +1,5 @@
     // equalshashcode/SuccinctEquality.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    @@ -9,8 +9,7 @@ public SuccinctEquality(int i, String s, double d) {
         super(i, s, d);
         System.out.println("made 'SuccinctEquality'");
       }
    -  @Override
    -  public boolean equals(Object rval) {
    +  @Override public boolean equals(Object rval) {
         return rval instanceof SuccinctEquality &&
           Objects.equals(i, ((SuccinctEquality)rval).i) &&
           Objects.equals(s, ((SuccinctEquality)rval).s) &&
    diff --git a/exceptions/AlwaysFinally.java b/exceptions/AlwaysFinally.java
    index bb2270f77..11d1e5dd6 100644
    --- a/exceptions/AlwaysFinally.java
    +++ b/exceptions/AlwaysFinally.java
    @@ -1,5 +1,5 @@
     // exceptions/AlwaysFinally.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Finally is always executed
    diff --git a/exceptions/AutoCloseableDetails.java b/exceptions/AutoCloseableDetails.java
    index 24a22e9d6..3c0a0d036 100644
    --- a/exceptions/AutoCloseableDetails.java
    +++ b/exceptions/AutoCloseableDetails.java
    @@ -1,5 +1,5 @@
     // exceptions/AutoCloseableDetails.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
    @@ -8,7 +8,7 @@ class Reporter implements AutoCloseable {
       Reporter() {
         System.out.println("Creating " + name);
       }
    -  public void close() {
    +  @Override public void close() {
         System.out.println("Closing " + name);
       }
     }
    diff --git a/exceptions/BodyException.java b/exceptions/BodyException.java
    index 3e907f8ab..25a952a63 100644
    --- a/exceptions/BodyException.java
    +++ b/exceptions/BodyException.java
    @@ -1,5 +1,5 @@
     // exceptions/BodyException.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
    diff --git a/exceptions/Cleanup.java b/exceptions/Cleanup.java
    index 3d072304f..0912783d0 100644
    --- a/exceptions/Cleanup.java
    +++ b/exceptions/Cleanup.java
    @@ -1,5 +1,5 @@
     // exceptions/Cleanup.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Guaranteeing proper cleanup of a resource
    diff --git a/exceptions/CleanupIdiom.java b/exceptions/CleanupIdiom.java
    index e8dd62c46..fdf6bd1c9 100644
    --- a/exceptions/CleanupIdiom.java
    +++ b/exceptions/CleanupIdiom.java
    @@ -1,5 +1,5 @@
     // exceptions/CleanupIdiom.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Disposable objects must be followed by a try-finally
    diff --git a/exceptions/CloseExceptions.java b/exceptions/CloseExceptions.java
    index 4309a888f..bc31496bc 100644
    --- a/exceptions/CloseExceptions.java
    +++ b/exceptions/CloseExceptions.java
    @@ -1,5 +1,5 @@
     // exceptions/CloseExceptions.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
    @@ -10,6 +10,7 @@ class Reporter2 implements AutoCloseable {
       Reporter2() {
         System.out.println("Creating " + name);
       }
    +  @Override
       public void close() throws CloseException {
         System.out.println("Closing " + name);
       }
    diff --git a/exceptions/ConstructorException.java b/exceptions/ConstructorException.java
    index 54eaaba35..24191d1ce 100644
    --- a/exceptions/ConstructorException.java
    +++ b/exceptions/ConstructorException.java
    @@ -1,5 +1,5 @@
     // exceptions/ConstructorException.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
    diff --git a/exceptions/DynamicFields.java b/exceptions/DynamicFields.java
    index da3b9617f..07f02b955 100644
    --- a/exceptions/DynamicFields.java
    +++ b/exceptions/DynamicFields.java
    @@ -1,5 +1,5 @@
     // exceptions/DynamicFields.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // A Class that dynamically adds fields to itself to
    @@ -14,8 +14,7 @@ public DynamicFields(int initialSize) {
         for(int i = 0; i < initialSize; i++)
           fields[i] = new Object[] { null, null };
       }
    -  @Override
    -  public String toString() {
    +  @Override public String toString() {
         StringBuilder result = new StringBuilder();
         for(Object[] obj : fields) {
           result.append(obj[0]);
    @@ -121,10 +120,10 @@ public static void main(String[] args) {
     df.getField("d") : A new value for d
     DynamicFieldsException
             at
    -DynamicFields.setField(DynamicFields.java:65)
    -        at DynamicFields.main(DynamicFields.java:97)
    +DynamicFields.setField(DynamicFields.java:64)
    +        at DynamicFields.main(DynamicFields.java:96)
     Caused by: java.lang.NullPointerException
             at
    -DynamicFields.setField(DynamicFields.java:67)
    +DynamicFields.setField(DynamicFields.java:66)
             ... 1 more
     */
    diff --git a/exceptions/ExceptionMethods.java b/exceptions/ExceptionMethods.java
    index bd6e82598..d94c0b298 100644
    --- a/exceptions/ExceptionMethods.java
    +++ b/exceptions/ExceptionMethods.java
    @@ -1,5 +1,5 @@
     // exceptions/ExceptionMethods.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Demonstrating the Exception Methods
    diff --git a/exceptions/ExceptionSilencer.java b/exceptions/ExceptionSilencer.java
    index e418e9de8..c56132efe 100644
    --- a/exceptions/ExceptionSilencer.java
    +++ b/exceptions/ExceptionSilencer.java
    @@ -1,5 +1,5 @@
     // exceptions/ExceptionSilencer.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
    diff --git a/exceptions/ExtraFeatures.java b/exceptions/ExtraFeatures.java
    index 8aa922afd..abf9d0bef 100644
    --- a/exceptions/ExtraFeatures.java
    +++ b/exceptions/ExtraFeatures.java
    @@ -1,5 +1,5 @@
     // exceptions/ExtraFeatures.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Further embellishment of exception classes
    @@ -13,8 +13,7 @@ class MyException2 extends Exception {
         this.x = x;
       }
       public int val() { return x; }
    -  @Override
    -  public String getMessage() {
    +  @Override public String getMessage() {
         return "Detail Message: "+ x
           + " "+ super.getMessage();
       }
    @@ -58,15 +57,15 @@ public static void main(String[] args) {
     /* Output:
     Throwing MyException2 from f()
     MyException2: Detail Message: 0 null
    -        at ExtraFeatures.f(ExtraFeatures.java:24)
    -        at ExtraFeatures.main(ExtraFeatures.java:38)
    +        at ExtraFeatures.f(ExtraFeatures.java:23)
    +        at ExtraFeatures.main(ExtraFeatures.java:37)
     Throwing MyException2 from g()
     MyException2: Detail Message: 0 Originated in g()
    -        at ExtraFeatures.g(ExtraFeatures.java:29)
    -        at ExtraFeatures.main(ExtraFeatures.java:43)
    +        at ExtraFeatures.g(ExtraFeatures.java:28)
    +        at ExtraFeatures.main(ExtraFeatures.java:42)
     Throwing MyException2 from h()
     MyException2: Detail Message: 47 Originated in h()
    -        at ExtraFeatures.h(ExtraFeatures.java:34)
    -        at ExtraFeatures.main(ExtraFeatures.java:48)
    +        at ExtraFeatures.h(ExtraFeatures.java:33)
    +        at ExtraFeatures.main(ExtraFeatures.java:47)
     e.val() = 47
     */
    diff --git a/exceptions/FinallyWorks.java b/exceptions/FinallyWorks.java
    index fc4fec0a4..9870849c3 100644
    --- a/exceptions/FinallyWorks.java
    +++ b/exceptions/FinallyWorks.java
    @@ -1,5 +1,5 @@
     // exceptions/FinallyWorks.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // The finally clause is always executed
    diff --git a/exceptions/FullConstructors.java b/exceptions/FullConstructors.java
    index f5b4c9ff2..bb10b0f1c 100644
    --- a/exceptions/FullConstructors.java
    +++ b/exceptions/FullConstructors.java
    @@ -1,5 +1,5 @@
     // exceptions/FullConstructors.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
    diff --git a/exceptions/Human.java b/exceptions/Human.java
    index 7ee7dcaae..b35f77954 100644
    --- a/exceptions/Human.java
    +++ b/exceptions/Human.java
    @@ -1,5 +1,5 @@
     // exceptions/Human.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Catching exception hierarchies
    diff --git a/exceptions/InheritingExceptions.java b/exceptions/InheritingExceptions.java
    index abb80c3b6..799134842 100644
    --- a/exceptions/InheritingExceptions.java
    +++ b/exceptions/InheritingExceptions.java
    @@ -1,5 +1,5 @@
     // exceptions/InheritingExceptions.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Creating your own exceptions
    diff --git a/exceptions/InputFile.java b/exceptions/InputFile.java
    index 5c269851d..d843a8347 100644
    --- a/exceptions/InputFile.java
    +++ b/exceptions/InputFile.java
    @@ -1,5 +1,5 @@
     // exceptions/InputFile.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Paying attention to exceptions in constructors
    diff --git a/exceptions/InputFile2.java b/exceptions/InputFile2.java
    index 74a68c3f1..4e8b8c49c 100644
    --- a/exceptions/InputFile2.java
    +++ b/exceptions/InputFile2.java
    @@ -1,5 +1,5 @@
     // exceptions/InputFile2.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.io.*;
    diff --git a/exceptions/LoggingExceptions.java b/exceptions/LoggingExceptions.java
    index 0120ee17f..67dcac911 100644
    --- a/exceptions/LoggingExceptions.java
    +++ b/exceptions/LoggingExceptions.java
    @@ -1,5 +1,5 @@
     // exceptions/LoggingExceptions.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // An exception that reports through a Logger
    @@ -33,13 +33,13 @@ public static void main(String[] args) {
     }
     /* Output:
     ___[ Error Output ]___
    -May 09, 2017 6:07:17 AM LoggingException 
    +Jan 24, 2021 8:48:54 AM LoggingException 
     SEVERE: LoggingException
             at
     LoggingExceptions.main(LoggingExceptions.java:20)
     
     Caught LoggingException
    -May 09, 2017 6:07:17 AM LoggingException 
    +Jan 24, 2021 8:48:54 AM LoggingException 
     SEVERE: LoggingException
             at
     LoggingExceptions.main(LoggingExceptions.java:25)
    diff --git a/exceptions/LoggingExceptions2.java b/exceptions/LoggingExceptions2.java
    index 21a921379..2d1c1683c 100644
    --- a/exceptions/LoggingExceptions2.java
    +++ b/exceptions/LoggingExceptions2.java
    @@ -1,5 +1,5 @@
     // exceptions/LoggingExceptions2.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Logging caught exceptions
    @@ -25,7 +25,7 @@ public static void main(String[] args) {
     }
     /* Output:
     ___[ Error Output ]___
    -May 09, 2017 6:07:17 AM LoggingExceptions2 logException
    +Jan 24, 2021 8:48:54 AM LoggingExceptions2 logException
     SEVERE: java.lang.NullPointerException
             at
     LoggingExceptions2.main(LoggingExceptions2.java:17)
    diff --git a/exceptions/LostMessage.java b/exceptions/LostMessage.java
    index 1446d9033..75c57e1c2 100644
    --- a/exceptions/LostMessage.java
    +++ b/exceptions/LostMessage.java
    @@ -1,19 +1,17 @@
     // exceptions/LostMessage.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // How an exception can be lost
     
     class VeryImportantException extends Exception {
    -  @Override
    -  public String toString() {
    +  @Override public String toString() {
         return "A very important exception!";
       }
     }
     
     class HoHumException extends Exception {
    -  @Override
    -  public String toString() {
    +  @Override public String toString() {
         return "A trivial exception";
       }
     }
    diff --git a/exceptions/MainException.java b/exceptions/MainException.java
    index 7a7e26387..a6378469d 100644
    --- a/exceptions/MainException.java
    +++ b/exceptions/MainException.java
    @@ -1,5 +1,5 @@
     // exceptions/MainException.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    diff --git a/exceptions/MessyExceptions.java b/exceptions/MessyExceptions.java
    index e8f7fc9df..46d63337e 100644
    --- a/exceptions/MessyExceptions.java
    +++ b/exceptions/MessyExceptions.java
    @@ -1,5 +1,5 @@
     // exceptions/MessyExceptions.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.io.*;
    diff --git a/exceptions/MultiCatch.java b/exceptions/MultiCatch.java
    index f97bde133..c54bab5ea 100644
    --- a/exceptions/MultiCatch.java
    +++ b/exceptions/MultiCatch.java
    @@ -1,5 +1,5 @@
     // exceptions/MultiCatch.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
    diff --git a/exceptions/MultiCatch2.java b/exceptions/MultiCatch2.java
    index 4629e93f8..7dfd32dfe 100644
    --- a/exceptions/MultiCatch2.java
    +++ b/exceptions/MultiCatch2.java
    @@ -1,5 +1,5 @@
     // exceptions/MultiCatch2.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
    diff --git a/exceptions/MultipleReturns.java b/exceptions/MultipleReturns.java
    index 3f667b335..cd8968cb6 100644
    --- a/exceptions/MultipleReturns.java
    +++ b/exceptions/MultipleReturns.java
    @@ -1,5 +1,5 @@
     // exceptions/MultipleReturns.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
    diff --git a/exceptions/NeverCaught.java b/exceptions/NeverCaught.java
    index c8bb0a2f7..bf8e101c2 100644
    --- a/exceptions/NeverCaught.java
    +++ b/exceptions/NeverCaught.java
    @@ -1,5 +1,5 @@
     // exceptions/NeverCaught.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Ignoring RuntimeExceptions
    diff --git a/exceptions/OnOffException1.java b/exceptions/OnOffException1.java
    index 3333d815d..28caacc87 100644
    --- a/exceptions/OnOffException1.java
    +++ b/exceptions/OnOffException1.java
    @@ -1,5 +1,5 @@
     // exceptions/OnOffException1.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     public class OnOffException1 extends Exception {}
    diff --git a/exceptions/OnOffException2.java b/exceptions/OnOffException2.java
    index 0bb5e1644..99d149dae 100644
    --- a/exceptions/OnOffException2.java
    +++ b/exceptions/OnOffException2.java
    @@ -1,5 +1,5 @@
     // exceptions/OnOffException2.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     public class OnOffException2 extends Exception {}
    diff --git a/exceptions/OnOffSwitch.java b/exceptions/OnOffSwitch.java
    index fe05fa351..f50273e0c 100644
    --- a/exceptions/OnOffSwitch.java
    +++ b/exceptions/OnOffSwitch.java
    @@ -1,5 +1,5 @@
     // exceptions/OnOffSwitch.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Why use finally?
    diff --git a/exceptions/PreciseRethrow.java b/exceptions/PreciseRethrow.java
    index f8849a3d4..1dc44e4ce 100644
    --- a/exceptions/PreciseRethrow.java
    +++ b/exceptions/PreciseRethrow.java
    @@ -1,5 +1,5 @@
     // exceptions/PreciseRethrow.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
    diff --git a/exceptions/RethrowNew.java b/exceptions/RethrowNew.java
    index daa4ad418..1725d0a25 100644
    --- a/exceptions/RethrowNew.java
    +++ b/exceptions/RethrowNew.java
    @@ -1,5 +1,5 @@
     // exceptions/RethrowNew.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Rethrow a different object from the one you caught
    diff --git a/exceptions/Rethrowing.java b/exceptions/Rethrowing.java
    index 5bf1a6357..7a9c7200a 100644
    --- a/exceptions/Rethrowing.java
    +++ b/exceptions/Rethrowing.java
    @@ -1,5 +1,5 @@
     // exceptions/Rethrowing.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Demonstrating fillInStackTrace()
    diff --git a/exceptions/SameHandler.java b/exceptions/SameHandler.java
    index 8c6805679..0e2b18252 100644
    --- a/exceptions/SameHandler.java
    +++ b/exceptions/SameHandler.java
    @@ -1,5 +1,5 @@
     // exceptions/SameHandler.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
    diff --git a/exceptions/StormyInning.java b/exceptions/StormyInning.java
    index 644c10ba8..b12d3a944 100644
    --- a/exceptions/StormyInning.java
    +++ b/exceptions/StormyInning.java
    @@ -1,5 +1,5 @@
     // exceptions/StormyInning.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Overridden methods can throw only the exceptions
    @@ -43,15 +43,12 @@ public StormyInning(String s)
       //- public void event() throws RainedOut {}
       // If the method doesn't already exist in the
       // base class, the exception is OK:
    -  @Override
    -  public void rainHard() throws RainedOut {}
    +  @Override public void rainHard() throws RainedOut {}
       // You can choose to not throw any exceptions,
       // even if the base version does:
    -  @Override
    -  public void event() {}
    +  @Override public void event() {}
       // Overridden methods can throw inherited exceptions:
    -  @Override
    -  public void atBat() throws PopFoul {}
    +  @Override public void atBat() throws PopFoul {}
       public static void main(String[] args) {
         try {
           StormyInning si = new StormyInning();
    diff --git a/exceptions/StreamsAreAutoCloseable.java b/exceptions/StreamsAreAutoCloseable.java
    index c55bf417b..e07600c1e 100644
    --- a/exceptions/StreamsAreAutoCloseable.java
    +++ b/exceptions/StreamsAreAutoCloseable.java
    @@ -1,5 +1,5 @@
     // exceptions/StreamsAreAutoCloseable.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.io.*;
    @@ -13,12 +13,12 @@ public class StreamsAreAutoCloseable {
           Stream in = Files.lines(
             Paths.get("StreamsAreAutoCloseable.java"));
           PrintWriter outfile = new PrintWriter(
    -        "Results.txt"); // [1]
    +        "Results.txt");                         // [1]
         ) {
           in.skip(5)
             .limit(1)
             .map(String::toLowerCase)
             .forEachOrdered(outfile::println);
    -    } // [2]
    +    }                                           // [2]
       }
     }
    diff --git a/exceptions/Switch.java b/exceptions/Switch.java
    index 7d491d004..6fb0ec780 100644
    --- a/exceptions/Switch.java
    +++ b/exceptions/Switch.java
    @@ -1,5 +1,5 @@
     // exceptions/Switch.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
    @@ -14,8 +14,7 @@ public void off() {
         state = false;
         System.out.println(this);
       }
    -  @Override
    -  public String toString() {
    +  @Override public String toString() {
         return state ? "on" : "off";
       }
     }
    diff --git a/exceptions/TryAnything.java b/exceptions/TryAnything.java
    index 9eeee07b1..faa446cd3 100644
    --- a/exceptions/TryAnything.java
    +++ b/exceptions/TryAnything.java
    @@ -1,5 +1,5 @@
     // exceptions/TryAnything.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // {WillNotCompile}
    diff --git a/exceptions/TryWithResources.java b/exceptions/TryWithResources.java
    index cdc83a5cf..0ded56154 100644
    --- a/exceptions/TryWithResources.java
    +++ b/exceptions/TryWithResources.java
    @@ -1,5 +1,5 @@
     // exceptions/TryWithResources.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.io.*;
    diff --git a/exceptions/TurnOffChecking.java b/exceptions/TurnOffChecking.java
    index 898431b64..63e67ae7e 100644
    --- a/exceptions/TurnOffChecking.java
    +++ b/exceptions/TurnOffChecking.java
    @@ -1,5 +1,5 @@
     // exceptions/TurnOffChecking.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // "Turning off" Checked exceptions
    diff --git a/exceptions/WhoCalled.java b/exceptions/WhoCalled.java
    index 4c4e01041..9bdfb5abf 100644
    --- a/exceptions/WhoCalled.java
    +++ b/exceptions/WhoCalled.java
    @@ -1,5 +1,5 @@
     // exceptions/WhoCalled.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Programmatic access to stack trace information
    diff --git a/exceptions/WithFinally.java b/exceptions/WithFinally.java
    index 9d3efc3a4..d392d6be8 100644
    --- a/exceptions/WithFinally.java
    +++ b/exceptions/WithFinally.java
    @@ -1,5 +1,5 @@
     // exceptions/WithFinally.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Finally Guarantees cleanup
    diff --git a/files/AddAndSubtractPaths.java b/files/AddAndSubtractPaths.java
    index f3984d19c..30cf4de18 100644
    --- a/files/AddAndSubtractPaths.java
    +++ b/files/AddAndSubtractPaths.java
    @@ -1,5 +1,5 @@
     // files/AddAndSubtractPaths.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.nio.file.*;
    @@ -52,36 +52,31 @@ public static void main(String[] args) {
       }
     }
     /* Output:
    -Windows 10
    -C:\Users\Bruce\Documents\GitHub
    -(1)r on-
    -java\ExtractedExamples\files\AddAndSubtractPaths.java
    -RealPath: C:\Users\Bruce\Documents\GitHub\on-
    -java\ExtractedExamples\files\AddAndSubtractPaths.java
    -(2)r on-java\ExtractedExamples\strings\..\files
    -RealPath: C:\Users\Bruce\Documents\GitHub\on-
    -java\ExtractedExamples\files
    -(3)r on-java\ExtractedExamples\files
    -RealPath: C:\Users\Bruce\Documents\GitHub\on-
    -java\ExtractedExamples\files
    +Windows 8.1
    +C:\Git
    +(1)r OnJava8\ExtractedExamples\files\AddAndSubtractPath
    +s.java
    +RealPath: C:\Git\OnJava8\ExtractedExamples\files\AddAnd
    +SubtractPaths.java
    +(2)r OnJava8\ExtractedExamples\strings\..\files
    +RealPath: C:\Git\OnJava8\ExtractedExamples\files
    +(3)r OnJava8\ExtractedExamples\files
    +RealPath: C:\Git\OnJava8\ExtractedExamples\files
     (4)  ..\..
    -RealPath: C:\Users\Bruce\Documents\GitHub\on-java
    +RealPath: C:\Git\OnJava8
     (5)  ..\..
    -RealPath: C:\Users\Bruce\Documents\GitHub\on-java
    -(6)r on-java
    -RealPath: C:\Users\Bruce\Documents\GitHub\on-java
    -(7)r on-java\ExtractedExamples\files\.\..\..
    -RealPath: C:\Users\Bruce\Documents\GitHub\on-java
    -(8)r on-java
    -RealPath: C:\Users\Bruce\Documents\GitHub\on-java
    -(9)r on-java\ExtractedExamples\files
    -RealPath: C:\Users\Bruce\Documents\GitHub\on-
    -java\ExtractedExamples\files
    -(10)r on-java\ExtractedExamples\strings
    -RealPath: C:\Users\Bruce\Documents\GitHub\on-
    -java\ExtractedExamples\strings
    +RealPath: C:\Git\OnJava8
    +(6)r OnJava8
    +RealPath: C:\Git\OnJava8
    +(7)r OnJava8\ExtractedExamples\files\.\..\..
    +RealPath: C:\Git\OnJava8
    +(8)r OnJava8
    +RealPath: C:\Git\OnJava8
    +(9)r OnJava8\ExtractedExamples\files
    +RealPath: C:\Git\OnJava8\ExtractedExamples\files
    +(10)r OnJava8\ExtractedExamples\strings
    +RealPath: C:\Git\OnJava8\ExtractedExamples\strings
     (11)  nonexistent
     java.nio.file.NoSuchFileException:
    -C:\Users\Bruce\Documents\GitHub\on-
    -java\ExtractedExamples\files\nonexistent
    +C:\Git\OnJava8\ExtractedExamples\files\nonexistent
     */
    diff --git a/files/Directories.java b/files/Directories.java
    index 10ad9beec..ffce7ecab 100644
    --- a/files/Directories.java
    +++ b/files/Directories.java
    @@ -1,5 +1,5 @@
     // files/Directories.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    @@ -59,7 +59,7 @@ static void populateTestDir() throws Exception {
     test\bag
     test\bar
     test\baz
    -test\DIR_5142667942049986036
    +test\DIR_8683707748599240459
     test\foo
     test\Hello.txt
     *********
    @@ -68,27 +68,27 @@ static void populateTestDir() throws Exception {
     test\bag\foo
     test\bag\foo\bar
     test\bag\foo\bar\baz
    -test\bag\foo\bar\baz\8279660869874696036.tmp
    +test\bag\foo\bar\baz\4316127347949967230.tmp
     test\bag\foo\bar\baz\File.txt
     test\bar
     test\bar\baz
     test\bar\baz\bag
     test\bar\baz\bag\foo
    -test\bar\baz\bag\foo\1274043134240426261.tmp
    +test\bar\baz\bag\foo\1223263495976065729.tmp
     test\bar\baz\bag\foo\File.txt
     test\baz
     test\baz\bag
     test\baz\bag\foo
     test\baz\bag\foo\bar
    -test\baz\bag\foo\bar\6130572530014544105.tmp
    +test\baz\bag\foo\bar\6666183168609095028.tmp
     test\baz\bag\foo\bar\File.txt
    -test\DIR_5142667942049986036
    -test\DIR_5142667942049986036\pre7704286843227113253.non
    +test\DIR_8683707748599240459
    +test\DIR_8683707748599240459\pre6366626804787365549.non
     test\foo
     test\foo\bar
     test\foo\bar\baz
     test\foo\bar\baz\bag
    -test\foo\bar\baz\bag\5412864507741775436.tmp
    +test\foo\bar\baz\bag\4712324129011589115.tmp
     test\foo\bar\baz\bag\File.txt
     test\Hello.txt
     */
    diff --git a/files/FileSystemDemo.java b/files/FileSystemDemo.java
    index 3d9024ca8..9f7d9b7df 100644
    --- a/files/FileSystemDemo.java
    +++ b/files/FileSystemDemo.java
    @@ -1,5 +1,5 @@
     // files/FileSystemDemo.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.nio.file.*;
    @@ -26,16 +26,20 @@ public static void main(String[] args) {
       }
     }
     /* Output:
    -Windows 10
    -File Store: SSD (C:)
    +Windows 8.1
    +File Store: (C:)
    +File Store: System Reserved (E:)
    +File Store: (F:)
     Root Directory: C:\
     Root Directory: D:\
    +Root Directory: E:\
    +Root Directory: F:\
     Separator: \
     UserPrincipalLookupService:
    -sun.nio.fs.WindowsFileSystem$LookupService$1@15db9742
    +sun.nio.fs.WindowsFileSystem$LookupService$1@19e0bfd
     isOpen: true
     isReadOnly: false
     FileSystemProvider:
    -sun.nio.fs.WindowsFileSystemProvider@6d06d69c
    +sun.nio.fs.WindowsFileSystemProvider@139a55
     File Attribute Views: [owner, dos, acl, basic, user]
     */
    diff --git a/files/Find.java b/files/Find.java
    index ac97ebdce..d27c69ed7 100644
    --- a/files/Find.java
    +++ b/files/Find.java
    @@ -1,5 +1,5 @@
     // files/Find.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // {ExcludeFromGradle}
    diff --git a/files/ListOfLines.java b/files/ListOfLines.java
    index 6f9ef467d..ef1a7c4ec 100644
    --- a/files/ListOfLines.java
    +++ b/files/ListOfLines.java
    @@ -1,5 +1,5 @@
     // files/ListOfLines.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    diff --git a/files/PartsOfPaths.java b/files/PartsOfPaths.java
    index 1170fc688..ee9865d6a 100644
    --- a/files/PartsOfPaths.java
    +++ b/files/PartsOfPaths.java
    @@ -1,5 +1,5 @@
     // files/PartsOfPaths.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.nio.file.*;
    @@ -23,21 +23,15 @@ public static void main(String[] args) {
       }
     }
     /* Output:
    -Windows 10
    -Users
    -Bruce
    -Documents
    -GitHub
    -on-java
    +Windows 8.1
    +Git
    +OnJava8
     ExtractedExamples
     files
     PartsOfPaths.java
     ends with '.java': false
    -Users: false : false
    -Bruce: false : false
    -Documents: false : false
    -GitHub: false : false
    -on-java: false : false
    +Git: false : false
    +OnJava8: false : false
     ExtractedExamples: false : false
     files: false : false
     PartsOfPaths.java: false : true
    diff --git a/files/PathAnalysis.java b/files/PathAnalysis.java
    index 117119cdd..ee2922f07 100644
    --- a/files/PathAnalysis.java
    +++ b/files/PathAnalysis.java
    @@ -1,5 +1,5 @@
     // files/PathAnalysis.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.nio.file.*;
    @@ -38,7 +38,7 @@ static void say(String id, Object result) {
       }
     }
     /* Output:
    -Windows 10
    +Windows 8.1
     Exists: true
     Directory: false
     Executable: true
    @@ -47,10 +47,10 @@ static void say(String id, Object result) {
     Writable: true
     notExists: false
     Hidden: false
    -size: 1631
    -FileStore: SSD (C:)
    -LastModified: : 2017-05-09T12:07:00.428366Z
    -Owner: MINDVIEWTOSHIBA\Bruce (User)
    +size: 1617
    +FileStore: (C:)
    +LastModified: : 2021-01-24T15:48:37.461504Z
    +Owner: GROOT\Bruce (User)
     ContentType: null
     SymbolicLink: false
     */
    diff --git a/files/PathInfo.java b/files/PathInfo.java
    index 96af9d938..019ca4594 100644
    --- a/files/PathInfo.java
    +++ b/files/PathInfo.java
    @@ -1,5 +1,5 @@
     // files/PathInfo.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.nio.file.*;
    @@ -44,7 +44,7 @@ public static void main(String[] args) {
       }
     }
     /* Output:
    -Windows 10
    +Windows 8.1
     toString: C:\path\to\nowhere\NoFile.txt
     Exists: false
     RegularFile: false
    @@ -63,40 +63,36 @@ public static void main(String[] args) {
     Parent: null
     Root: null
     ******************
    -toString: C:\Users\Bruce\Documents\GitHub\on-
    -java\ExtractedExamples\files\PathInfo.java
    +toString:
    +C:\Git\OnJava8\ExtractedExamples\files\PathInfo.java
     Exists: true
     RegularFile: true
     Directory: false
     Absolute: true
     FileName: PathInfo.java
    -Parent: C:\Users\Bruce\Documents\GitHub\on-
    -java\ExtractedExamples\files
    +Parent: C:\Git\OnJava8\ExtractedExamples\files
     Root: C:\
     ******************
    -toString: C:\Users\Bruce\Documents\GitHub\on-
    -java\ExtractedExamples\files
    +toString: C:\Git\OnJava8\ExtractedExamples\files
     Exists: true
     RegularFile: false
     Directory: true
     Absolute: true
     FileName: files
    -Parent: C:\Users\Bruce\Documents\GitHub\on-
    -java\ExtractedExamples
    +Parent: C:\Git\OnJava8\ExtractedExamples
     Root: C:\
     ******************
    -toString: C:\Users\Bruce\Documents\GitHub\on-
    -java\ExtractedExamples\files\PathInfo.java
    +toString:
    +C:\Git\OnJava8\ExtractedExamples\files\PathInfo.java
     Exists: true
     RegularFile: true
     Directory: false
     Absolute: true
     FileName: PathInfo.java
    -Parent: C:\Users\Bruce\Documents\GitHub\on-
    -java\ExtractedExamples\files
    +Parent: C:\Git\OnJava8\ExtractedExamples\files
     Root: C:\
     ******************
    -URI: file:///C:/Users/Bruce/Documents/GitHub/on-
    -java/ExtractedExamples/files/PathInfo.java
    +URI: file:///C:/Git/OnJava8/ExtractedExamples/files/Pat
    +hInfo.java
     true
     */
    diff --git a/files/PathWatcher.java b/files/PathWatcher.java
    index 162641d72..8a1f46107 100644
    --- a/files/PathWatcher.java
    +++ b/files/PathWatcher.java
    @@ -1,5 +1,5 @@
     // files/PathWatcher.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // {ExcludeFromGradle}
    diff --git a/files/ReadLineStream.java b/files/ReadLineStream.java
    index 64b0f562d..812ed1058 100644
    --- a/files/ReadLineStream.java
    +++ b/files/ReadLineStream.java
    @@ -1,5 +1,5 @@
     // files/ReadLineStream.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.nio.file.*;
    diff --git a/files/StreamInAndOut.java b/files/StreamInAndOut.java
    index ec17c7008..4f7297d55 100644
    --- a/files/StreamInAndOut.java
    +++ b/files/StreamInAndOut.java
    @@ -1,5 +1,5 @@
     // files/StreamInAndOut.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.io.*;
    diff --git a/files/TreeWatcher.java b/files/TreeWatcher.java
    index f0660888d..1162ff807 100644
    --- a/files/TreeWatcher.java
    +++ b/files/TreeWatcher.java
    @@ -1,5 +1,5 @@
     // files/TreeWatcher.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // {ExcludeFromGradle}
    diff --git a/files/Writing.java b/files/Writing.java
    index 68a04fbcd..82745e4d5 100644
    --- a/files/Writing.java
    +++ b/files/Writing.java
    @@ -1,5 +1,5 @@
     // files/Writing.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    diff --git a/functional/AnonymousClosure.java b/functional/AnonymousClosure.java
    index 497a1a526..6faa0925e 100644
    --- a/functional/AnonymousClosure.java
    +++ b/functional/AnonymousClosure.java
    @@ -1,5 +1,5 @@
     // functional/AnonymousClosure.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.function.*;
    diff --git a/functional/BiConsumerPermutations.java b/functional/BiConsumerPermutations.java
    index 75b7c32d5..091967fb1 100644
    --- a/functional/BiConsumerPermutations.java
    +++ b/functional/BiConsumerPermutations.java
    @@ -1,5 +1,5 @@
     // functional/BiConsumerPermutations.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.function.*;
    diff --git a/functional/ClassFunctionals.java b/functional/ClassFunctionals.java
    index e5101df4f..eb7548229 100644
    --- a/functional/ClassFunctionals.java
    +++ b/functional/ClassFunctionals.java
    @@ -1,5 +1,5 @@
     // functional/ClassFunctionals.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    diff --git a/functional/Closure1.java b/functional/Closure1.java
    index 2f504f42c..90bd9671d 100644
    --- a/functional/Closure1.java
    +++ b/functional/Closure1.java
    @@ -1,5 +1,5 @@
     // functional/Closure1.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.function.*;
    diff --git a/functional/Closure2.java b/functional/Closure2.java
    index 825cf4233..86129103d 100644
    --- a/functional/Closure2.java
    +++ b/functional/Closure2.java
    @@ -1,5 +1,5 @@
     // functional/Closure2.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.function.*;
    diff --git a/functional/Closure3.java b/functional/Closure3.java
    index 811179fb8..40728b5f3 100644
    --- a/functional/Closure3.java
    +++ b/functional/Closure3.java
    @@ -1,5 +1,5 @@
     // functional/Closure3.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // {WillNotCompile}
    diff --git a/functional/Closure4.java b/functional/Closure4.java
    index 148aaf649..06f34afbf 100644
    --- a/functional/Closure4.java
    +++ b/functional/Closure4.java
    @@ -1,5 +1,5 @@
     // functional/Closure4.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.function.*;
    diff --git a/functional/Closure5.java b/functional/Closure5.java
    index fb9aad779..dcd7a08f4 100644
    --- a/functional/Closure5.java
    +++ b/functional/Closure5.java
    @@ -1,5 +1,5 @@
     // functional/Closure5.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // {WillNotCompile}
    diff --git a/functional/Closure6.java b/functional/Closure6.java
    index 178f9b4a6..b102a67af 100644
    --- a/functional/Closure6.java
    +++ b/functional/Closure6.java
    @@ -1,5 +1,5 @@
     // functional/Closure6.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.function.*;
    diff --git a/functional/Closure7.java b/functional/Closure7.java
    index 9facdc062..098685296 100644
    --- a/functional/Closure7.java
    +++ b/functional/Closure7.java
    @@ -1,5 +1,5 @@
     // functional/Closure7.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // {WillNotCompile}
    diff --git a/functional/Closure8.java b/functional/Closure8.java
    index 7ec059b2a..8cfa1041b 100644
    --- a/functional/Closure8.java
    +++ b/functional/Closure8.java
    @@ -1,5 +1,5 @@
     // functional/Closure8.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    diff --git a/functional/Closure9.java b/functional/Closure9.java
    index 4eddb47a0..4679e474e 100644
    --- a/functional/Closure9.java
    +++ b/functional/Closure9.java
    @@ -1,5 +1,5 @@
     // functional/Closure9.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // {WillNotCompile}
    diff --git a/functional/ConsumeFunction.java b/functional/ConsumeFunction.java
    index ea84a24a1..328bd9fcf 100644
    --- a/functional/ConsumeFunction.java
    +++ b/functional/ConsumeFunction.java
    @@ -1,5 +1,5 @@
     // functional/ConsumeFunction.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.function.*;
    diff --git a/functional/CtorReference.java b/functional/CtorReference.java
    index 4c22bdf1c..ec74b00f7 100644
    --- a/functional/CtorReference.java
    +++ b/functional/CtorReference.java
    @@ -1,5 +1,5 @@
     // functional/CtorReference.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
    @@ -25,9 +25,9 @@ interface Make2Args {
     
     public class CtorReference {
       public static void main(String[] args) {
    -    MakeNoArgs mna = Dog::new; // [1]
    -    Make1Arg m1a = Dog::new;   // [2]
    -    Make2Args m2a = Dog::new;  // [3]
    +    MakeNoArgs mna = Dog::new;        // [1]
    +    Make1Arg m1a = Dog::new;          // [2]
    +    Make2Args m2a = Dog::new;         // [3]
     
         Dog dn = mna.make();
         Dog d1 = m1a.make("Comet");
    diff --git a/functional/CurriedIntAdd.java b/functional/CurriedIntAdd.java
    index e89ac8e28..6c430f70e 100644
    --- a/functional/CurriedIntAdd.java
    +++ b/functional/CurriedIntAdd.java
    @@ -1,5 +1,5 @@
     // functional/CurriedIntAdd.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.function.*;
    diff --git a/functional/Curry3Args.java b/functional/Curry3Args.java
    index 0fd376bc2..5a307480f 100644
    --- a/functional/Curry3Args.java
    +++ b/functional/Curry3Args.java
    @@ -1,5 +1,5 @@
     // functional/Curry3Args.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.function.*;
    diff --git a/functional/CurryingAndPartials.java b/functional/CurryingAndPartials.java
    index 0addb8115..d92912a72 100644
    --- a/functional/CurryingAndPartials.java
    +++ b/functional/CurryingAndPartials.java
    @@ -1,5 +1,5 @@
     // functional/CurryingAndPartials.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.function.*;
    @@ -12,12 +12,12 @@ static String uncurried(String a, String b) {
        public static void main(String[] args) {
           // Curried function:
           Function> sum =
    -         a -> b -> a + b; // [1]
    +         a -> b -> a + b;                         // [1]
     
           System.out.println(uncurried("Hi ", "Ho"));
     
           Function
    -        hi = sum.apply("Hi "); // [2]
    +        hi = sum.apply("Hi ");                    // [2]
           System.out.println(hi.apply("Ho"));
     
           // Partial application:
    diff --git a/functional/FunctionComposition.java b/functional/FunctionComposition.java
    index a183039d0..f20b115ca 100644
    --- a/functional/FunctionComposition.java
    +++ b/functional/FunctionComposition.java
    @@ -1,5 +1,5 @@
     // functional/FunctionComposition.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.function.*;
    diff --git a/functional/FunctionVariants.java b/functional/FunctionVariants.java
    index a62054620..0c4b42484 100644
    --- a/functional/FunctionVariants.java
    +++ b/functional/FunctionVariants.java
    @@ -1,5 +1,5 @@
     // functional/FunctionVariants.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.function.*;
    diff --git a/functional/FunctionWithWrapped.java b/functional/FunctionWithWrapped.java
    index b654da654..253f8820c 100644
    --- a/functional/FunctionWithWrapped.java
    +++ b/functional/FunctionWithWrapped.java
    @@ -1,5 +1,5 @@
     // functional/FunctionWithWrapped.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.function.*;
    diff --git a/functional/FunctionalAnnotation.java b/functional/FunctionalAnnotation.java
    index 84cec6498..29cc33056 100644
    --- a/functional/FunctionalAnnotation.java
    +++ b/functional/FunctionalAnnotation.java
    @@ -1,5 +1,5 @@
     // functional/FunctionalAnnotation.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
    diff --git a/functional/IntCall.java b/functional/IntCall.java
    index a8256a00c..910c2ac35 100644
    --- a/functional/IntCall.java
    +++ b/functional/IntCall.java
    @@ -1,5 +1,5 @@
     // functional/IntCall.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
    diff --git a/functional/LambdaExpressions.java b/functional/LambdaExpressions.java
    index fe7e3acb1..3c4a40b03 100644
    --- a/functional/LambdaExpressions.java
    +++ b/functional/LambdaExpressions.java
    @@ -1,5 +1,5 @@
     // functional/LambdaExpressions.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
    @@ -17,15 +17,15 @@ interface Multi {
     
     public class LambdaExpressions {
     
    -  static Body bod = h -> h + " No Parens!"; // [1]
    +  static Body bod = h -> h + " No Parens!";      // [1]
     
       static Body bod2 = (h) -> h + " More details"; // [2]
     
    -  static Description desc = () -> "Short info"; // [3]
    +  static Description desc = () -> "Short info";  // [3]
     
    -  static Multi mult = (h, n) -> h + n; // [4]
    +  static Multi mult = (h, n) -> h + n;           // [4]
     
    -  static Description moreLines = () -> { // [5]
    +  static Description moreLines = () -> {         // [5]
         System.out.println("moreLines()");
         return "from moreLines()";
       };
    diff --git a/functional/MethodConversion.java b/functional/MethodConversion.java
    index 008ecfc0c..15e780749 100644
    --- a/functional/MethodConversion.java
    +++ b/functional/MethodConversion.java
    @@ -1,5 +1,5 @@
     // functional/MethodConversion.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.function.*;
    diff --git a/functional/MethodReferences.java b/functional/MethodReferences.java
    index 63bc365d8..4cd593455 100644
    --- a/functional/MethodReferences.java
    +++ b/functional/MethodReferences.java
    @@ -1,47 +1,47 @@
     // functional/MethodReferences.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
     
    -interface Callable { // [1]
    +interface Callable {                        // [1]
       void call(String s);
     }
     
     class Describe {
    -  void show(String msg) { // [2]
    +  void show(String msg) {                   // [2]
         System.out.println(msg);
       }
     }
     
     public class MethodReferences {
    -  static void hello(String name) { // [3]
    +  static void hello(String name) {          // [3]
         System.out.println("Hello, " + name);
       }
       static class Description {
         String about;
         Description(String desc) { about = desc; }
    -    void help(String msg) { // [4]
    +    void help(String msg) {                 // [4]
           System.out.println(about + " " + msg);
         }
       }
       static class Helper {
    -    static void assist(String msg) { // [5]
    +    static void assist(String msg) {        // [5]
           System.out.println(msg);
         }
       }
       public static void main(String[] args) {
         Describe d = new Describe();
    -    Callable c = d::show; // [6]
    -    c.call("call()"); // [7]
    +    Callable c = d::show;                   // [6]
    +    c.call("call()");                       // [7]
     
    -    c = MethodReferences::hello; // [8]
    +    c = MethodReferences::hello;            // [8]
         c.call("Bob");
     
    -    c = new Description("valuable")::help; // [9]
    +    c = new Description("valuable")::help;  // [9]
         c.call("information");
     
    -    c = Helper::assist; // [10]
    +    c = Helper::assist;                     // [10]
         c.call("Help!");
       }
     }
    diff --git a/functional/MultiUnbound.java b/functional/MultiUnbound.java
    index 4209fb040..67defb7d5 100644
    --- a/functional/MultiUnbound.java
    +++ b/functional/MultiUnbound.java
    @@ -1,5 +1,5 @@
     // functional/MultiUnbound.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Unbound methods with multiple arguments
    diff --git a/functional/PredicateComposition.java b/functional/PredicateComposition.java
    index f95bbcbdd..40ddb6001 100644
    --- a/functional/PredicateComposition.java
    +++ b/functional/PredicateComposition.java
    @@ -1,5 +1,5 @@
     // functional/PredicateComposition.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.function.*;
    diff --git a/functional/ProduceFunction.java b/functional/ProduceFunction.java
    index 034716011..5f0b0940b 100644
    --- a/functional/ProduceFunction.java
    +++ b/functional/ProduceFunction.java
    @@ -1,15 +1,15 @@
     // functional/ProduceFunction.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.function.*;
     
     interface
    -FuncSS extends Function {} // [1]
    +FuncSS extends Function {}   // [1]
     
     public class ProduceFunction {
       static FuncSS produce() {
    -    return s -> s.toLowerCase(); // [2]
    +    return s -> s.toLowerCase();             // [2]
       }
       public static void main(String[] args) {
         FuncSS f = produce();
    diff --git a/functional/RecursiveFactorial.java b/functional/RecursiveFactorial.java
    index 2d6104413..5ddb0860c 100644
    --- a/functional/RecursiveFactorial.java
    +++ b/functional/RecursiveFactorial.java
    @@ -1,5 +1,5 @@
     // functional/RecursiveFactorial.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
    diff --git a/functional/RecursiveFibonacci.java b/functional/RecursiveFibonacci.java
    index 9be43dc62..4b58bb06c 100644
    --- a/functional/RecursiveFibonacci.java
    +++ b/functional/RecursiveFibonacci.java
    @@ -1,5 +1,5 @@
     // functional/RecursiveFibonacci.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
    diff --git a/functional/RunnableMethodReference.java b/functional/RunnableMethodReference.java
    index 5fb8cd002..e135d06f6 100644
    --- a/functional/RunnableMethodReference.java
    +++ b/functional/RunnableMethodReference.java
    @@ -1,5 +1,5 @@
     // functional/RunnableMethodReference.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Method references with interface Runnable
    diff --git a/functional/SharedStorage.java b/functional/SharedStorage.java
    index c2a41f66a..0a2489253 100644
    --- a/functional/SharedStorage.java
    +++ b/functional/SharedStorage.java
    @@ -1,5 +1,5 @@
     // functional/SharedStorage.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.function.*;
    diff --git a/functional/Strategize.java b/functional/Strategize.java
    index e46c91434..b4358ee7e 100644
    --- a/functional/Strategize.java
    +++ b/functional/Strategize.java
    @@ -1,5 +1,5 @@
     // functional/Strategize.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
    @@ -8,6 +8,7 @@ interface Strategy {
     }
     
     class Soft implements Strategy {
    +  @Override
       public String approach(String msg) {
         return msg.toLowerCase() + "?";
       }
    @@ -23,7 +24,7 @@ public class Strategize {
       Strategy strategy;
       String msg;
       Strategize(String msg) {
    -    strategy = new Soft(); // [1]
    +    strategy = new Soft();                // [1]
         this.msg = msg;
       }
       void communicate() {
    @@ -34,19 +35,19 @@ void changeStrategy(Strategy strategy) {
       }
       public static void main(String[] args) {
         Strategy[] strategies = {
    -      new Strategy() { // [2]
    +      new Strategy() {                    // [2]
             public String approach(String msg) {
               return msg.toUpperCase() + "!";
             }
           },
    -      msg -> msg.substring(0, 5), // [3]
    -      Unrelated::twice // [4]
    +      msg -> msg.substring(0, 5),         // [3]
    +      Unrelated::twice                    // [4]
         };
         Strategize s = new Strategize("Hello there");
         s.communicate();
         for(Strategy newStrategy : strategies) {
    -      s.changeStrategy(newStrategy); // [5]
    -      s.communicate(); // [6]
    +      s.changeStrategy(newStrategy);      // [5]
    +      s.communicate();                    // [6]
         }
       }
     }
    diff --git a/functional/TransformFunction.java b/functional/TransformFunction.java
    index 1a046eb12..dd3f7590b 100644
    --- a/functional/TransformFunction.java
    +++ b/functional/TransformFunction.java
    @@ -1,17 +1,15 @@
     // functional/TransformFunction.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.function.*;
     
     class I {
    -  @Override
    -  public String toString() { return "I"; }
    +  @Override public String toString() { return "I"; }
     }
     
     class O {
    -  @Override
    -  public String toString() { return "O"; }
    +  @Override public String toString() { return "O"; }
     }
     
     public class TransformFunction {
    diff --git a/functional/TriFunction.java b/functional/TriFunction.java
    index 760496214..40b91473a 100644
    --- a/functional/TriFunction.java
    +++ b/functional/TriFunction.java
    @@ -1,5 +1,5 @@
     // functional/TriFunction.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
    diff --git a/functional/TriFunctionTest.java b/functional/TriFunctionTest.java
    index fccf8b9a2..5af98922c 100644
    --- a/functional/TriFunctionTest.java
    +++ b/functional/TriFunctionTest.java
    @@ -1,5 +1,5 @@
     // functional/TriFunctionTest.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
    diff --git a/functional/UnboundMethodReference.java b/functional/UnboundMethodReference.java
    index da2c78729..6c02b8b91 100644
    --- a/functional/UnboundMethodReference.java
    +++ b/functional/UnboundMethodReference.java
    @@ -1,5 +1,5 @@
     // functional/UnboundMethodReference.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Method reference without an object
    @@ -18,10 +18,10 @@ interface TransformX {
     
     public class UnboundMethodReference {
       public static void main(String[] args) {
    -    // MakeString ms = X::f; // [1]
    +    // MakeString ms = X::f;                // [1]
         TransformX sp = X::f;
         X x = new X();
    -    System.out.println(sp.transform(x)); // [2]
    +    System.out.println(sp.transform(x));    // [2]
         System.out.println(x.f()); // Same effect
       }
     }
    diff --git a/generics/Amphibian.java b/generics/Amphibian.java
    index 5e76d8b18..0dc8647f5 100644
    --- a/generics/Amphibian.java
    +++ b/generics/Amphibian.java
    @@ -1,5 +1,5 @@
     // generics/Amphibian.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     public class Amphibian {}
    diff --git a/generics/Apply.java b/generics/Apply.java
    index c93786113..8e3a23c97 100644
    --- a/generics/Apply.java
    +++ b/generics/Apply.java
    @@ -1,5 +1,5 @@
     // generics/Apply.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.lang.reflect.*;
    diff --git a/generics/ApplyFunctional.java b/generics/ApplyFunctional.java
    index 4cce156e8..2275ca854 100644
    --- a/generics/ApplyFunctional.java
    +++ b/generics/ApplyFunctional.java
    @@ -1,5 +1,5 @@
     // generics/ApplyFunctional.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    diff --git a/generics/ApplyTest.java b/generics/ApplyTest.java
    index 62ef4eecf..2ae0618d4 100644
    --- a/generics/ApplyTest.java
    +++ b/generics/ApplyTest.java
    @@ -1,5 +1,5 @@
     // generics/ApplyTest.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    diff --git a/generics/ArrayMaker.java b/generics/ArrayMaker.java
    index f1bb6b9a4..b728267cd 100644
    --- a/generics/ArrayMaker.java
    +++ b/generics/ArrayMaker.java
    @@ -1,5 +1,5 @@
     // generics/ArrayMaker.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.lang.reflect.*;
    diff --git a/generics/ArrayOfGeneric.java b/generics/ArrayOfGeneric.java
    index 67e6cb97c..68f7a5bdf 100644
    --- a/generics/ArrayOfGeneric.java
    +++ b/generics/ArrayOfGeneric.java
    @@ -1,5 +1,5 @@
     // generics/ArrayOfGeneric.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
    diff --git a/generics/ArrayOfGenericReference.java b/generics/ArrayOfGenericReference.java
    index 1cb2f3455..3403e3c50 100644
    --- a/generics/ArrayOfGenericReference.java
    +++ b/generics/ArrayOfGenericReference.java
    @@ -1,5 +1,5 @@
     // generics/ArrayOfGenericReference.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
    diff --git a/generics/BankTeller.java b/generics/BankTeller.java
    index 68301996d..51bb12034 100644
    --- a/generics/BankTeller.java
    +++ b/generics/BankTeller.java
    @@ -1,5 +1,5 @@
     // generics/BankTeller.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // A very simple bank teller simulation
    @@ -9,8 +9,7 @@
     class Customer {
       private static long counter = 1;
       private final long id = counter++;
    -  @Override
    -  public String toString() {
    +  @Override public String toString() {
         return "Customer " + id;
       }
     }
    @@ -18,8 +17,7 @@ public String toString() {
     class Teller {
       private static long counter = 1;
       private final long id = counter++;
    -  @Override
    -  public String toString() {
    +  @Override public String toString() {
         return "Teller " + id;
       }
     }
    diff --git a/generics/BasicBounds.java b/generics/BasicBounds.java
    index 434d0fd8f..ca2c00dfa 100644
    --- a/generics/BasicBounds.java
    +++ b/generics/BasicBounds.java
    @@ -1,5 +1,5 @@
     // generics/BasicBounds.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
    @@ -48,8 +48,7 @@ class Bounded
     extends Coord implements HasColor, Weight {
       @Override
       public java.awt.Color getColor() { return null; }
    -  @Override
    -  public int weight() { return 0; }
    +  @Override public int weight() { return 0; }
     }
     
     public class BasicBounds {
    diff --git a/generics/BasicHolder.java b/generics/BasicHolder.java
    index 2b8b8a9b1..5a6bc5a4e 100644
    --- a/generics/BasicHolder.java
    +++ b/generics/BasicHolder.java
    @@ -1,5 +1,5 @@
     // generics/BasicHolder.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
    diff --git a/generics/BasicSupplierDemo.java b/generics/BasicSupplierDemo.java
    index 1ce95ca19..bf754154a 100644
    --- a/generics/BasicSupplierDemo.java
    +++ b/generics/BasicSupplierDemo.java
    @@ -1,5 +1,5 @@
     // generics/BasicSupplierDemo.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import onjava.*;
    diff --git a/generics/ByteSet.java b/generics/ByteSet.java
    index 19b27091a..860125b6a 100644
    --- a/generics/ByteSet.java
    +++ b/generics/ByteSet.java
    @@ -1,5 +1,5 @@
     // generics/ByteSet.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    diff --git a/generics/CRGWithBasicHolder.java b/generics/CRGWithBasicHolder.java
    index eb85868a4..f30f02da7 100644
    --- a/generics/CRGWithBasicHolder.java
    +++ b/generics/CRGWithBasicHolder.java
    @@ -1,5 +1,5 @@
     // generics/CRGWithBasicHolder.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
    diff --git a/generics/CaptureConversion.java b/generics/CaptureConversion.java
    index 163484682..831ee7e94 100644
    --- a/generics/CaptureConversion.java
    +++ b/generics/CaptureConversion.java
    @@ -1,5 +1,5 @@
     // generics/CaptureConversion.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
    diff --git a/generics/CheckedList.java b/generics/CheckedList.java
    index 6e330cf6b..26cae143a 100644
    --- a/generics/CheckedList.java
    +++ b/generics/CheckedList.java
    @@ -1,5 +1,5 @@
     // generics/CheckedList.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Using Collection.checkedList()
    diff --git a/generics/ClassCasting.java b/generics/ClassCasting.java
    index c6da592a6..9029b298e 100644
    --- a/generics/ClassCasting.java
    +++ b/generics/ClassCasting.java
    @@ -1,5 +1,5 @@
     // generics/ClassCasting.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.io.*;
    diff --git a/generics/ClassTypeCapture.java b/generics/ClassTypeCapture.java
    index ab193dfe6..cd4cb8375 100644
    --- a/generics/ClassTypeCapture.java
    +++ b/generics/ClassTypeCapture.java
    @@ -1,5 +1,5 @@
     // generics/ClassTypeCapture.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
    diff --git a/generics/ComparablePet.java b/generics/ComparablePet.java
    index 3646e66aa..951b6cc15 100644
    --- a/generics/ComparablePet.java
    +++ b/generics/ComparablePet.java
    @@ -1,5 +1,5 @@
     // generics/ComparablePet.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
    diff --git a/generics/CompilerIntelligence.java b/generics/CompilerIntelligence.java
    index 6e4cd0e81..6b1bc4155 100644
    --- a/generics/CompilerIntelligence.java
    +++ b/generics/CompilerIntelligence.java
    @@ -1,5 +1,5 @@
     // generics/CompilerIntelligence.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    diff --git a/generics/CountedObject.java b/generics/CountedObject.java
    index ab4caecdb..287b480fb 100644
    --- a/generics/CountedObject.java
    +++ b/generics/CountedObject.java
    @@ -1,5 +1,5 @@
     // generics/CountedObject.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
    @@ -7,8 +7,7 @@ public class CountedObject {
       private static long counter = 0;
       private final long id = counter++;
       public long id() { return id; }
    -  @Override
    -  public String toString() {
    +  @Override public String toString() {
         return "CountedObject " + id;
       }
     }
    diff --git a/generics/CovariantArrays.java b/generics/CovariantArrays.java
    index e202ca079..2a56b631e 100644
    --- a/generics/CovariantArrays.java
    +++ b/generics/CovariantArrays.java
    @@ -1,5 +1,5 @@
     // generics/CovariantArrays.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
    diff --git a/generics/CovariantReturnTypes.java b/generics/CovariantReturnTypes.java
    index 04178ad4b..870f21e4f 100644
    --- a/generics/CovariantReturnTypes.java
    +++ b/generics/CovariantReturnTypes.java
    @@ -1,5 +1,5 @@
     // generics/CovariantReturnTypes.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
    @@ -12,8 +12,7 @@ interface OrdinaryGetter {
     
     interface DerivedGetter extends OrdinaryGetter {
       // Overridden method return type can vary:
    -  @Override
    -  Derived get();
    +  @Override Derived get();
     }
     
     public class CovariantReturnTypes {
    diff --git a/generics/CreatorGeneric.java b/generics/CreatorGeneric.java
    index 7fd90df46..e9a349740 100644
    --- a/generics/CreatorGeneric.java
    +++ b/generics/CreatorGeneric.java
    @@ -1,5 +1,5 @@
     // generics/CreatorGeneric.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
    @@ -12,8 +12,7 @@ abstract class GenericWithCreate {
     class X {}
     
     class XCreator extends GenericWithCreate {
    -  @Override
    -  X create() { return new X(); }
    +  @Override X create() { return new X(); }
       void f() {
         System.out.println(
           element.getClass().getSimpleName());
    diff --git a/generics/CuriouslyRecurringGeneric.java b/generics/CuriouslyRecurringGeneric.java
    index ee1f3a615..53977f27b 100644
    --- a/generics/CuriouslyRecurringGeneric.java
    +++ b/generics/CuriouslyRecurringGeneric.java
    @@ -1,5 +1,5 @@
     // generics/CuriouslyRecurringGeneric.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
    diff --git a/generics/Diamond.java b/generics/Diamond.java
    index 32c3ff1ae..c7daa484d 100644
    --- a/generics/Diamond.java
    +++ b/generics/Diamond.java
    @@ -1,5 +1,5 @@
     // generics/Diamond.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
    diff --git a/generics/DogsAndRobotMethodReferences.java b/generics/DogsAndRobotMethodReferences.java
    index 7c3fa3575..612ef683e 100644
    --- a/generics/DogsAndRobotMethodReferences.java
    +++ b/generics/DogsAndRobotMethodReferences.java
    @@ -1,5 +1,5 @@
     // generics/DogsAndRobotMethodReferences.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // "Assisted Latent Typing"
    diff --git a/generics/DogsAndRobots.cpp b/generics/DogsAndRobots.cpp
    index 81ced5d99..a8b008f23 100644
    --- a/generics/DogsAndRobots.cpp
    +++ b/generics/DogsAndRobots.cpp
    @@ -1,5 +1,5 @@
     // generics/DogsAndRobots.cpp
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     #include 
    diff --git a/generics/DogsAndRobots.java b/generics/DogsAndRobots.java
    index b61511227..4bbb9b440 100644
    --- a/generics/DogsAndRobots.java
    +++ b/generics/DogsAndRobots.java
    @@ -1,5 +1,5 @@
     // generics/DogsAndRobots.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // No (direct) latent typing in Java
    @@ -14,7 +14,9 @@ public void reproduce() {}
     }
     
     class Robot implements Performs {
    +  @Override
       public void speak() { System.out.println("Click!"); }
    +  @Override
       public void sit() { System.out.println("Clank!"); }
       public void oilChange() {}
     }
    diff --git a/generics/DogsAndRobots.py b/generics/DogsAndRobots.py
    index c9ca6fef9..ed3bfd47d 100644
    --- a/generics/DogsAndRobots.py
    +++ b/generics/DogsAndRobots.py
    @@ -1,5 +1,5 @@
     # generics/DogsAndRobots.py
    -# (c)2020 MindView LLC: see Copyright.txt
    +# (c)2021 MindView LLC: see Copyright.txt
     # We make no guarantees that this code is fit for any purpose.
     # Visit http://OnJava8.com for more book information.
     
    diff --git a/generics/DynamicProxyMixin.java b/generics/DynamicProxyMixin.java
    index 38431e31d..906278fba 100644
    --- a/generics/DynamicProxyMixin.java
    +++ b/generics/DynamicProxyMixin.java
    @@ -1,5 +1,5 @@
     // generics/DynamicProxyMixin.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.lang.reflect.*;
    @@ -61,6 +61,6 @@ public static void main(String[] args) {
     }
     /* Output:
     Hello
    -1494331653339
    +1611503350927
     1
     */
    diff --git a/generics/EpicBattle.java b/generics/EpicBattle.java
    index 908a33437..716606608 100644
    --- a/generics/EpicBattle.java
    +++ b/generics/EpicBattle.java
    @@ -1,5 +1,5 @@
     // generics/EpicBattle.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Bounds in Java generics
    @@ -41,10 +41,8 @@ class SuperSleuth
     
     class SuperHearSmell
     implements SuperHearing, SuperSmell {
    -  @Override
    -  public void hearSubtleNoises() {}
    -  @Override
    -  public void trackBySmell() {}
    +  @Override public void hearSubtleNoises() {}
    +  @Override public void trackBySmell() {}
     }
     
     class DogPerson extends CanineHero {
    diff --git a/generics/Erased.java b/generics/Erased.java
    index 911839c39..304385afb 100644
    --- a/generics/Erased.java
    +++ b/generics/Erased.java
    @@ -1,5 +1,5 @@
     // generics/Erased.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // {WillNotCompile}
    diff --git a/generics/ErasedTypeEquivalence.java b/generics/ErasedTypeEquivalence.java
    index 6034b3048..0368a1828 100644
    --- a/generics/ErasedTypeEquivalence.java
    +++ b/generics/ErasedTypeEquivalence.java
    @@ -1,5 +1,5 @@
     // generics/ErasedTypeEquivalence.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    diff --git a/generics/ErasureAndInheritance.java b/generics/ErasureAndInheritance.java
    index 44a07b625..4a2e2591c 100644
    --- a/generics/ErasureAndInheritance.java
    +++ b/generics/ErasureAndInheritance.java
    @@ -1,5 +1,5 @@
     // generics/ErasureAndInheritance.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
    diff --git a/generics/FactoryConstraint.java b/generics/FactoryConstraint.java
    index f06510732..5e721168b 100644
    --- a/generics/FactoryConstraint.java
    +++ b/generics/FactoryConstraint.java
    @@ -1,5 +1,5 @@
     // generics/FactoryConstraint.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    @@ -8,8 +8,7 @@
     
     class IntegerFactory implements Supplier {
       private int i = 0;
    -  @Override
    -  public Integer get() {
    +  @Override public Integer get() {
         return ++i;
       }
     }
    @@ -17,8 +16,7 @@ public Integer get() {
     class Widget {
       private int id;
       Widget(int n) { id = n; }
    -  @Override
    -  public String toString() {
    +  @Override public String toString() {
         return "Widget " + id;
       }
       public static
    @@ -32,8 +30,9 @@ class Factory implements Supplier {
     class Fudge {
       private static int count = 1;
       private int n = count++;
    -  @Override
    -  public String toString() { return "Fudge " + n; }
    +  @Override public String toString() {
    +    return "Fudge " + n;
    +  }
     }
     
     class Foo2 {
    @@ -41,8 +40,9 @@ class Foo2 {
       Foo2(Supplier factory) {
         Suppliers.fill(x, factory, 5);
       }
    -  @Override
    -  public String toString() { return x.toString(); }
    +  @Override public String toString() {
    +    return x.toString();
    +  }
     }
     
     public class FactoryConstraint {
    diff --git a/generics/Fibonacci.java b/generics/Fibonacci.java
    index 115400617..c20bdf225 100644
    --- a/generics/Fibonacci.java
    +++ b/generics/Fibonacci.java
    @@ -1,5 +1,5 @@
     // generics/Fibonacci.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Generate a Fibonacci sequence
    diff --git a/generics/FilledList.java b/generics/FilledList.java
    index e24423cef..662d50f98 100644
    --- a/generics/FilledList.java
    +++ b/generics/FilledList.java
    @@ -1,5 +1,5 @@
     // generics/FilledList.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    diff --git a/generics/GenericArray.java b/generics/GenericArray.java
    index f0ffba3d2..39212feca 100644
    --- a/generics/GenericArray.java
    +++ b/generics/GenericArray.java
    @@ -1,5 +1,5 @@
     // generics/GenericArray.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
    diff --git a/generics/GenericArray2.java b/generics/GenericArray2.java
    index 7ef4179ec..ee7962623 100644
    --- a/generics/GenericArray2.java
    +++ b/generics/GenericArray2.java
    @@ -1,5 +1,5 @@
     // generics/GenericArray2.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
    diff --git a/generics/GenericArrayWithTypeToken.java b/generics/GenericArrayWithTypeToken.java
    index 6ea36a767..3005a540d 100644
    --- a/generics/GenericArrayWithTypeToken.java
    +++ b/generics/GenericArrayWithTypeToken.java
    @@ -1,5 +1,5 @@
     // generics/GenericArrayWithTypeToken.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.lang.reflect.*;
    diff --git a/generics/GenericCast.java b/generics/GenericCast.java
    index c3f82dac7..eb4fb651d 100644
    --- a/generics/GenericCast.java
    +++ b/generics/GenericCast.java
    @@ -1,5 +1,5 @@
     // generics/GenericCast.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    diff --git a/generics/GenericHolder.java b/generics/GenericHolder.java
    index 6d998a1cb..15cfbb9e1 100644
    --- a/generics/GenericHolder.java
    +++ b/generics/GenericHolder.java
    @@ -1,5 +1,5 @@
     // generics/GenericHolder.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
    diff --git a/generics/GenericHolder2.java b/generics/GenericHolder2.java
    index 9747f49b9..59c3e3569 100644
    --- a/generics/GenericHolder2.java
    +++ b/generics/GenericHolder2.java
    @@ -1,5 +1,5 @@
     // generics/GenericHolder2.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
    diff --git a/generics/GenericMethods.java b/generics/GenericMethods.java
    index 66f40e72d..3ec451f93 100644
    --- a/generics/GenericMethods.java
    +++ b/generics/GenericMethods.java
    @@ -1,5 +1,5 @@
     // generics/GenericMethods.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
    diff --git a/generics/GenericReading.java b/generics/GenericReading.java
    index 5709c7a92..a661798c5 100644
    --- a/generics/GenericReading.java
    +++ b/generics/GenericReading.java
    @@ -1,5 +1,5 @@
     // generics/GenericReading.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    diff --git a/generics/GenericVarargs.java b/generics/GenericVarargs.java
    index 3a6e348ca..3dfca7d44 100644
    --- a/generics/GenericVarargs.java
    +++ b/generics/GenericVarargs.java
    @@ -1,5 +1,5 @@
     // generics/GenericVarargs.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    diff --git a/generics/GenericsAndCovariance.java b/generics/GenericsAndCovariance.java
    index f16b837be..023bb8763 100644
    --- a/generics/GenericsAndCovariance.java
    +++ b/generics/GenericsAndCovariance.java
    @@ -1,5 +1,5 @@
     // generics/GenericsAndCovariance.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    diff --git a/generics/GenericsAndReturnTypes.java b/generics/GenericsAndReturnTypes.java
    index de661864b..3eebd91ac 100644
    --- a/generics/GenericsAndReturnTypes.java
    +++ b/generics/GenericsAndReturnTypes.java
    @@ -1,5 +1,5 @@
     // generics/GenericsAndReturnTypes.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
    diff --git a/generics/HasF.java b/generics/HasF.java
    index f967386e3..436c19585 100644
    --- a/generics/HasF.java
    +++ b/generics/HasF.java
    @@ -1,5 +1,5 @@
     // generics/HasF.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
    diff --git a/generics/HijackedInterface.java b/generics/HijackedInterface.java
    index 868e1d465..edf01b7b2 100644
    --- a/generics/HijackedInterface.java
    +++ b/generics/HijackedInterface.java
    @@ -1,5 +1,5 @@
     // generics/HijackedInterface.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // {WillNotCompile}
    diff --git a/generics/Holder.java b/generics/Holder.java
    index e4301dc66..50d22a3ca 100644
    --- a/generics/Holder.java
    +++ b/generics/Holder.java
    @@ -1,5 +1,5 @@
     // generics/Holder.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.Objects;
    @@ -10,13 +10,11 @@ public Holder() {}
       public Holder(T val) { value = val; }
       public void set(T val) { value = val; }
       public T get() { return value; }
    -  @Override
    -  public boolean equals(Object o) {
    +  @Override public boolean equals(Object o) {
         return o instanceof Holder &&
           Objects.equals(value, ((Holder)o).value);
       }
    -  @Override
    -  public int hashCode() {
    +  @Override public int hashCode() {
         return Objects.hashCode(value);
       }
       public static void main(String[] args) {
    diff --git a/generics/Holder1.java b/generics/Holder1.java
    index 0c222cb57..7af6f1c15 100644
    --- a/generics/Holder1.java
    +++ b/generics/Holder1.java
    @@ -1,5 +1,5 @@
     // generics/Holder1.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
    diff --git a/generics/InheritBounds.java b/generics/InheritBounds.java
    index fddd25431..7bd7d22b1 100644
    --- a/generics/InheritBounds.java
    +++ b/generics/InheritBounds.java
    @@ -1,5 +1,5 @@
     // generics/InheritBounds.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
    diff --git a/generics/InstantiateGenericType.cpp b/generics/InstantiateGenericType.cpp
    index 1799d05ba..c260c39d5 100644
    --- a/generics/InstantiateGenericType.cpp
    +++ b/generics/InstantiateGenericType.cpp
    @@ -1,5 +1,5 @@
     // generics/InstantiateGenericType.cpp
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // C++, not Java!
    diff --git a/generics/InstantiateGenericType.java b/generics/InstantiateGenericType.java
    index 9424c9a1d..93c8d62a9 100644
    --- a/generics/InstantiateGenericType.java
    +++ b/generics/InstantiateGenericType.java
    @@ -1,5 +1,5 @@
     // generics/InstantiateGenericType.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.function.*;
    @@ -10,11 +10,9 @@ class ClassAsFactory implements Supplier {
       ClassAsFactory(Class kind) {
         this.kind = kind;
       }
    -  @SuppressWarnings("deprecation")
    -  @Override
    -  public T get() {
    +  @Override public T get() {
         try {
    -      return kind.newInstance();
    +      return kind.getConstructor().newInstance();
         } catch(Exception e) {
           throw new RuntimeException(e);
         }
    @@ -22,8 +20,10 @@ public T get() {
     }
     
     class Employee {
    -  @Override
    -  public String toString() { return "Employee"; }
    +  public Employee() {}
    +  @Override public String toString() {
    +    return "Employee";
    +  }
     }
     
     public class InstantiateGenericType {
    @@ -42,5 +42,6 @@ public static void main(String[] args) {
     }
     /* Output:
     Employee
    -java.lang.InstantiationException: java.lang.Integer
    +java.lang.NoSuchMethodException:
    +java.lang.Integer.()
     */
    diff --git a/generics/IterableFibonacci.java b/generics/IterableFibonacci.java
    index b5ccf285a..2b56b102a 100644
    --- a/generics/IterableFibonacci.java
    +++ b/generics/IterableFibonacci.java
    @@ -1,5 +1,5 @@
     // generics/IterableFibonacci.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Adapt the Fibonacci class to make it Iterable
    @@ -9,13 +9,11 @@ public class IterableFibonacci
     extends Fibonacci implements Iterable {
       private int n;
       public IterableFibonacci(int count) { n = count; }
    -  @Override
    -  public Iterator iterator() {
    +  @Override public Iterator iterator() {
         return new Iterator() {
           @Override
           public boolean hasNext() { return n > 0; }
    -      @Override
    -      public Integer next() {
    +      @Override public Integer next() {
             n--;
             return IterableFibonacci.this.get();
           }
    diff --git a/generics/LatentReflection.java b/generics/LatentReflection.java
    index 0e9511a34..cfd9e751d 100644
    --- a/generics/LatentReflection.java
    +++ b/generics/LatentReflection.java
    @@ -1,5 +1,5 @@
     // generics/LatentReflection.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Using reflection for latent typing
    @@ -12,8 +12,7 @@ public void sit() {
         System.out.println("Pretending to sit");
       }
       public void pushInvisibleWalls() {}
    -  @Override
    -  public String toString() { return "Mime"; }
    +  @Override public String toString() { return "Mime"; }
     }
     
     // Does not implement Performs:
    diff --git a/generics/LinkedStack.java b/generics/LinkedStack.java
    index 5142bcc73..932df84f0 100644
    --- a/generics/LinkedStack.java
    +++ b/generics/LinkedStack.java
    @@ -1,5 +1,5 @@
     // generics/LinkedStack.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // A stack implemented with an internal linked structure
    diff --git a/generics/ListMaker.java b/generics/ListMaker.java
    index 582cbaea8..f127e2dde 100644
    --- a/generics/ListMaker.java
    +++ b/generics/ListMaker.java
    @@ -1,5 +1,5 @@
     // generics/ListMaker.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    diff --git a/generics/ListOfGenerics.java b/generics/ListOfGenerics.java
    index 10a480318..aa2f61873 100644
    --- a/generics/ListOfGenerics.java
    +++ b/generics/ListOfGenerics.java
    @@ -1,5 +1,5 @@
     // generics/ListOfGenerics.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    diff --git a/generics/ListOfInt.java b/generics/ListOfInt.java
    index f8ac8e11d..a47754950 100644
    --- a/generics/ListOfInt.java
    +++ b/generics/ListOfInt.java
    @@ -1,5 +1,5 @@
     // generics/ListOfInt.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Autoboxing compensates for the inability
    diff --git a/generics/LostInformation.java b/generics/LostInformation.java
    index e27430d2e..6ca203424 100644
    --- a/generics/LostInformation.java
    +++ b/generics/LostInformation.java
    @@ -1,5 +1,5 @@
     // generics/LostInformation.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    diff --git a/generics/Manipulation.java b/generics/Manipulation.java
    index f365cf199..f3857515c 100644
    --- a/generics/Manipulation.java
    +++ b/generics/Manipulation.java
    @@ -1,5 +1,5 @@
     // generics/Manipulation.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // {WillNotCompile}
    diff --git a/generics/Manipulator2.java b/generics/Manipulator2.java
    index 7c7c648bb..2d112dc60 100644
    --- a/generics/Manipulator2.java
    +++ b/generics/Manipulator2.java
    @@ -1,5 +1,5 @@
     // generics/Manipulator2.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
    diff --git a/generics/Manipulator3.java b/generics/Manipulator3.java
    index 2201d474c..a737a727b 100644
    --- a/generics/Manipulator3.java
    +++ b/generics/Manipulator3.java
    @@ -1,5 +1,5 @@
     // generics/Manipulator3.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
    diff --git a/generics/Mixins.cpp b/generics/Mixins.cpp
    index 89949d46b..defcac7d5 100644
    --- a/generics/Mixins.cpp
    +++ b/generics/Mixins.cpp
    @@ -1,5 +1,5 @@
     // generics/Mixins.cpp
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     #include 
    diff --git a/generics/Mixins.java b/generics/Mixins.java
    index af58b81e0..d64d07d6d 100644
    --- a/generics/Mixins.java
    +++ b/generics/Mixins.java
    @@ -1,5 +1,5 @@
     // generics/Mixins.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    @@ -42,12 +42,10 @@ class Mixin extends BasicImp
       private TimeStamped timeStamp = new TimeStampedImp();
       private SerialNumbered serialNumber =
         new SerialNumberedImp();
    -  @Override
    -  public long getStamp() {
    +  @Override public long getStamp() {
         return timeStamp.getStamp();
       }
    -  @Override
    -  public long getSerialNumber() {
    +  @Override public long getSerialNumber() {
         return serialNumber.getSerialNumber();
       }
     }
    @@ -66,6 +64,6 @@ public static void main(String[] args) {
       }
     }
     /* Output:
    -test string 1 1494331663026 1
    -test string 2 1494331663027 2
    +test string 1 1611503367257 1
    +test string 2 1611503367258 2
     */
    diff --git a/generics/MultipleInterfaceVariants.java b/generics/MultipleInterfaceVariants.java
    index 70a535a23..c8a58fdd0 100644
    --- a/generics/MultipleInterfaceVariants.java
    +++ b/generics/MultipleInterfaceVariants.java
    @@ -1,5 +1,5 @@
     // generics/MultipleInterfaceVariants.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // {WillNotCompile}
    diff --git a/generics/NeedCasting.java b/generics/NeedCasting.java
    index 8801f5d8b..e8604e335 100644
    --- a/generics/NeedCasting.java
    +++ b/generics/NeedCasting.java
    @@ -1,5 +1,5 @@
     // generics/NeedCasting.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.io.*;
    diff --git a/generics/NonCovariantGenerics.java b/generics/NonCovariantGenerics.java
    index c219a0d3a..9b56a1d95 100644
    --- a/generics/NonCovariantGenerics.java
    +++ b/generics/NonCovariantGenerics.java
    @@ -1,5 +1,5 @@
     // generics/NonCovariantGenerics.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // {WillNotCompile}
    diff --git a/generics/NotSelfBounded.java b/generics/NotSelfBounded.java
    index 76aa593cb..cdf78eb38 100644
    --- a/generics/NotSelfBounded.java
    +++ b/generics/NotSelfBounded.java
    @@ -1,5 +1,5 @@
     // generics/NotSelfBounded.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
    diff --git a/generics/ObjectHolder.java b/generics/ObjectHolder.java
    index f1dafd308..a363f4070 100644
    --- a/generics/ObjectHolder.java
    +++ b/generics/ObjectHolder.java
    @@ -1,5 +1,5 @@
     // generics/ObjectHolder.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
    diff --git a/generics/OrdinaryArguments.java b/generics/OrdinaryArguments.java
    index 6e50550d9..02f0d5e15 100644
    --- a/generics/OrdinaryArguments.java
    +++ b/generics/OrdinaryArguments.java
    @@ -1,5 +1,5 @@
     // generics/OrdinaryArguments.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
    diff --git a/generics/Performs.java b/generics/Performs.java
    index ace095235..b9379e21e 100644
    --- a/generics/Performs.java
    +++ b/generics/Performs.java
    @@ -1,5 +1,5 @@
     // generics/Performs.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
    diff --git a/generics/PlainGenericInheritance.java b/generics/PlainGenericInheritance.java
    index 93eb61c68..57e402768 100644
    --- a/generics/PlainGenericInheritance.java
    +++ b/generics/PlainGenericInheritance.java
    @@ -1,5 +1,5 @@
     // generics/PlainGenericInheritance.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
    diff --git a/generics/PrimitiveGenericTest.java b/generics/PrimitiveGenericTest.java
    index 793564379..b745a8f72 100644
    --- a/generics/PrimitiveGenericTest.java
    +++ b/generics/PrimitiveGenericTest.java
    @@ -1,5 +1,5 @@
     // generics/PrimitiveGenericTest.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import onjava.*;
    diff --git a/generics/RandomList.java b/generics/RandomList.java
    index d4f198bcf..470739f2b 100644
    --- a/generics/RandomList.java
    +++ b/generics/RandomList.java
    @@ -1,5 +1,5 @@
     // generics/RandomList.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    diff --git a/generics/RestrictedComparablePets.java b/generics/RestrictedComparablePets.java
    index 16146d7b5..7c87bb49c 100644
    --- a/generics/RestrictedComparablePets.java
    +++ b/generics/RestrictedComparablePets.java
    @@ -1,10 +1,11 @@
     // generics/RestrictedComparablePets.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
     class Hamster extends ComparablePet
     implements Comparable {
    +  @Override
       public int compareTo(ComparablePet arg) {
         return 0;
       }
    diff --git a/generics/ReturnGenericType.java b/generics/ReturnGenericType.java
    index bf46ae157..1e6dc005f 100644
    --- a/generics/ReturnGenericType.java
    +++ b/generics/ReturnGenericType.java
    @@ -1,5 +1,5 @@
     // generics/ReturnGenericType.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
    diff --git a/generics/SelfBounding.java b/generics/SelfBounding.java
    index c8ecf0ff4..c0c509c3e 100644
    --- a/generics/SelfBounding.java
    +++ b/generics/SelfBounding.java
    @@ -1,5 +1,5 @@
     // generics/SelfBounding.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
    diff --git a/generics/SelfBoundingAndCovariantArguments.java b/generics/SelfBoundingAndCovariantArguments.java
    index 34262b0ed..eefa864d1 100644
    --- a/generics/SelfBoundingAndCovariantArguments.java
    +++ b/generics/SelfBoundingAndCovariantArguments.java
    @@ -1,5 +1,5 @@
     // generics/SelfBoundingAndCovariantArguments.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
    diff --git a/generics/SelfBoundingMethods.java b/generics/SelfBoundingMethods.java
    index e6cb79493..aab5b7b77 100644
    --- a/generics/SelfBoundingMethods.java
    +++ b/generics/SelfBoundingMethods.java
    @@ -1,5 +1,5 @@
     // generics/SelfBoundingMethods.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
    diff --git a/generics/Shape.java b/generics/Shape.java
    index dd2458c2b..271220b22 100644
    --- a/generics/Shape.java
    +++ b/generics/Shape.java
    @@ -1,13 +1,12 @@
     // generics/Shape.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
     public class Shape {
       private static long counter = 0;
       private final long id = counter++;
    -  @Override
    -  public String toString() {
    +  @Override public String toString() {
         return getClass().getSimpleName() + " " + id;
       }
       public void rotate() {
    diff --git a/generics/SimpleDogsAndRobots.java b/generics/SimpleDogsAndRobots.java
    index b9cee77b9..ebe1c9438 100644
    --- a/generics/SimpleDogsAndRobots.java
    +++ b/generics/SimpleDogsAndRobots.java
    @@ -1,5 +1,5 @@
     // generics/SimpleDogsAndRobots.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Removing the generic; code still works
    diff --git a/generics/SimpleHolder.java b/generics/SimpleHolder.java
    index a73af0abe..5bc15f82b 100644
    --- a/generics/SimpleHolder.java
    +++ b/generics/SimpleHolder.java
    @@ -1,5 +1,5 @@
     // generics/SimpleHolder.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
    diff --git a/generics/SimpleQueue.java b/generics/SimpleQueue.java
    index 76fb4f3e7..18adc1bd7 100644
    --- a/generics/SimpleQueue.java
    +++ b/generics/SimpleQueue.java
    @@ -1,5 +1,5 @@
     // generics/SimpleQueue.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // A different kind of Iterable collection
    @@ -9,8 +9,7 @@ public class SimpleQueue implements Iterable {
       private LinkedList storage = new LinkedList<>();
       public void add(T t) { storage.offer(t); }
       public T get() { return storage.poll(); }
    -  @Override
    -  public Iterator iterator() {
    +  @Override public Iterator iterator() {
         return storage.iterator();
       }
     }
    diff --git a/generics/Square.java b/generics/Square.java
    index e3bcad934..5cca84a2c 100644
    --- a/generics/Square.java
    +++ b/generics/Square.java
    @@ -1,5 +1,5 @@
     // generics/Square.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     public class Square extends Shape {}
    diff --git a/generics/Store.java b/generics/Store.java
    index c165926a3..921470845 100644
    --- a/generics/Store.java
    +++ b/generics/Store.java
    @@ -1,5 +1,5 @@
     // generics/Store.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Building a complex model using generic collections
    @@ -17,8 +17,7 @@ class Product {
         this.price = price;
         System.out.println(toString());
       }
    -  @Override
    -  public String toString() {
    +  @Override public String toString() {
         return id + ": " + description +
           ", price: $" + price;
       }
    @@ -28,8 +27,7 @@ public void priceChange(double change) {
       public static Supplier generator =
         new Supplier() {
           private Random rand = new Random(47);
    -      @Override
    -      public Product get() {
    +      @Override public Product get() {
             return new Product(rand.nextInt(1000), "Test",
               Math.round(
                 rand.nextDouble() * 1000.0) + 0.99);
    @@ -62,8 +60,7 @@ public Store(
         for(int i = 0; i < nAisles; i++)
           add(new Aisle(nShelves, nProducts));
       }
    -  @Override
    -  public String toString() {
    +  @Override public String toString() {
         StringBuilder result = new StringBuilder();
         for(Aisle a : this)
           for(Shelf s : a)
    diff --git a/generics/SuperTypeWildcards.java b/generics/SuperTypeWildcards.java
    index f8672a4fc..e675bc74e 100644
    --- a/generics/SuperTypeWildcards.java
    +++ b/generics/SuperTypeWildcards.java
    @@ -1,5 +1,5 @@
     // generics/SuperTypeWildcards.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    diff --git a/generics/Templates.cpp b/generics/Templates.cpp
    index ab2a3b64a..e56fdda7c 100644
    --- a/generics/Templates.cpp
    +++ b/generics/Templates.cpp
    @@ -1,5 +1,5 @@
     // generics/Templates.cpp
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     #include 
    diff --git a/generics/ThrowGenericException.java b/generics/ThrowGenericException.java
    index 994c7f885..2a8ddb5e9 100644
    --- a/generics/ThrowGenericException.java
    +++ b/generics/ThrowGenericException.java
    @@ -1,5 +1,5 @@
     // generics/ThrowGenericException.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    diff --git a/generics/TupleList.java b/generics/TupleList.java
    index fe93330ba..896530b40 100644
    --- a/generics/TupleList.java
    +++ b/generics/TupleList.java
    @@ -1,5 +1,5 @@
     // generics/TupleList.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Combining generic types to make complex generic types
    @@ -18,6 +18,6 @@ public static void main(String[] args) {
       }
     }
     /* Output:
    -(Vehicle@7cca494b, Amphibian@7ba4f24f, hi, 47)
    -(Vehicle@3b9a45b3, Amphibian@7699a589, hi, 47)
    +(Vehicle@ec7777, Amphibian@107d329, hi, 47)
    +(Vehicle@1629346, Amphibian@4b9385, hi, 47)
     */
    diff --git a/generics/TupleTest.java b/generics/TupleTest.java
    index e207da405..0df194a2f 100644
    --- a/generics/TupleTest.java
    +++ b/generics/TupleTest.java
    @@ -1,5 +1,5 @@
     // generics/TupleTest.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import onjava.*;
    @@ -36,7 +36,7 @@ public static void main(String[] args) {
     }
     /* Output:
     (hi, 47)
    -(Amphibian@1540e19d, hi, 47)
    -(Vehicle@7f31245a, Amphibian@6d6f6e28, hi, 47)
    -(Vehicle@330bedb4, Amphibian@2503dbd3, hi, 47, 11.1)
    +(Amphibian@1c7c054, hi, 47)
    +(Vehicle@14991ad, Amphibian@d93b30, hi, 47)
    +(Vehicle@a14482, Amphibian@140e19d, hi, 47, 11.1)
     */
    diff --git a/generics/TupleTest2.java b/generics/TupleTest2.java
    index 3a0c8d148..f889d59f3 100644
    --- a/generics/TupleTest2.java
    +++ b/generics/TupleTest2.java
    @@ -1,5 +1,5 @@
     // generics/TupleTest2.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import onjava.*;
    @@ -36,7 +36,7 @@ public static void main(String[] args) {
     /* Output:
     (hi, 47)
     (hi, 47)
    -(Amphibian@14ae5a5, hi, 47)
    -(Vehicle@135fbaa4, Amphibian@45ee12a7, hi, 47)
    -(Vehicle@4b67cf4d, Amphibian@7ea987ac, hi, 47, 11.1)
    +(Amphibian@a298b7, hi, 47)
    +(Vehicle@16d3586, Amphibian@154617c, hi, 47)
    +(Vehicle@17327b6, Amphibian@14ae5a5, hi, 47, 11.1)
     */
    diff --git a/generics/UnboundedWildcards1.java b/generics/UnboundedWildcards1.java
    index 6b163a4c2..7aada9a6c 100644
    --- a/generics/UnboundedWildcards1.java
    +++ b/generics/UnboundedWildcards1.java
    @@ -1,5 +1,5 @@
     // generics/UnboundedWildcards1.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    diff --git a/generics/UnboundedWildcards2.java b/generics/UnboundedWildcards2.java
    index ee80d5552..f1e17630e 100644
    --- a/generics/UnboundedWildcards2.java
    +++ b/generics/UnboundedWildcards2.java
    @@ -1,5 +1,5 @@
     // generics/UnboundedWildcards2.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    diff --git a/generics/Unconstrained.java b/generics/Unconstrained.java
    index f683d53f3..66c6bebd6 100644
    --- a/generics/Unconstrained.java
    +++ b/generics/Unconstrained.java
    @@ -1,5 +1,5 @@
     // generics/Unconstrained.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
    diff --git a/generics/UseList.java b/generics/UseList.java
    index 924d3b560..3c9073aff 100644
    --- a/generics/UseList.java
    +++ b/generics/UseList.java
    @@ -1,5 +1,5 @@
     // generics/UseList.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // {WillNotCompile}
    diff --git a/generics/UseList2.java b/generics/UseList2.java
    index 83d3b5d35..bee17d0dc 100644
    --- a/generics/UseList2.java
    +++ b/generics/UseList2.java
    @@ -1,5 +1,5 @@
     // generics/UseList2.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    diff --git a/generics/Vehicle.java b/generics/Vehicle.java
    index 301a84e4d..dfe502c97 100644
    --- a/generics/Vehicle.java
    +++ b/generics/Vehicle.java
    @@ -1,5 +1,5 @@
     // generics/Vehicle.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     public class Vehicle {}
    diff --git a/generics/WatercolorSets.java b/generics/WatercolorSets.java
    index 7956778d9..2b285eaaa 100644
    --- a/generics/WatercolorSets.java
    +++ b/generics/WatercolorSets.java
    @@ -1,5 +1,5 @@
     // generics/WatercolorSets.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import generics.watercolors.*;
    @@ -36,19 +36,19 @@ public static void main(String[] args) {
     COBALT_BLUE_HUE, PERMANENT_GREEN, VIRIDIAN_HUE,
     SAP_GREEN, YELLOW_OCHRE, BURNT_SIENNA, RAW_UMBER,
     BURNT_UMBER]
    -union(set1, set2): [BURNT_SIENNA, BRILLIANT_RED,
    -YELLOW_OCHRE, MAGENTA, SAP_GREEN, CERULEAN_BLUE_HUE,
    -ULTRAMARINE, VIRIDIAN_HUE, VIOLET, RAW_UMBER,
    -ROSE_MADDER, PERMANENT_GREEN, BURNT_UMBER,
    -PHTHALO_BLUE, CRIMSON, COBALT_BLUE_HUE]
    -intersection(set1, set2): [PERMANENT_GREEN,
    -CERULEAN_BLUE_HUE, ULTRAMARINE, VIRIDIAN_HUE,
    -PHTHALO_BLUE, COBALT_BLUE_HUE]
    -difference(set1, subset): [BRILLIANT_RED, MAGENTA,
    -VIOLET, CRIMSON, ROSE_MADDER]
    -difference(set2, subset): [BURNT_SIENNA, YELLOW_OCHRE,
    -BURNT_UMBER, SAP_GREEN, RAW_UMBER]
    -complement(set1, set2): [BURNT_SIENNA, BRILLIANT_RED,
    -YELLOW_OCHRE, MAGENTA, SAP_GREEN, VIOLET, RAW_UMBER,
    -ROSE_MADDER, BURNT_UMBER, CRIMSON]
    +union(set1, set2): [MAGENTA, COBALT_BLUE_HUE, VIOLET,
    +VIRIDIAN_HUE, BURNT_SIENNA, ULTRAMARINE,
    +CERULEAN_BLUE_HUE, BURNT_UMBER, BRILLIANT_RED,
    +PHTHALO_BLUE, YELLOW_OCHRE, SAP_GREEN, CRIMSON,
    +ROSE_MADDER, RAW_UMBER, PERMANENT_GREEN]
    +intersection(set1, set2): [COBALT_BLUE_HUE,
    +VIRIDIAN_HUE, ULTRAMARINE, CERULEAN_BLUE_HUE,
    +PHTHALO_BLUE, PERMANENT_GREEN]
    +difference(set1, subset): [CRIMSON, MAGENTA, VIOLET,
    +ROSE_MADDER, BRILLIANT_RED]
    +difference(set2, subset): [BURNT_SIENNA, BURNT_UMBER,
    +YELLOW_OCHRE, RAW_UMBER, SAP_GREEN]
    +complement(set1, set2): [MAGENTA, VIOLET, BURNT_SIENNA,
    +BURNT_UMBER, BRILLIANT_RED, YELLOW_OCHRE, SAP_GREEN,
    +CRIMSON, ROSE_MADDER, RAW_UMBER]
     */
    diff --git a/generics/Wildcards.java b/generics/Wildcards.java
    index 65348ecbb..7c854bb43 100644
    --- a/generics/Wildcards.java
    +++ b/generics/Wildcards.java
    @@ -1,5 +1,5 @@
     // generics/Wildcards.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Exploring the meaning of wildcards
    diff --git a/generics/coffee/Americano.java b/generics/coffee/Americano.java
    index 96cd4a1fd..86c628288 100644
    --- a/generics/coffee/Americano.java
    +++ b/generics/coffee/Americano.java
    @@ -1,5 +1,5 @@
     // generics/coffee/Americano.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package generics.coffee;
    diff --git a/generics/coffee/Breve.java b/generics/coffee/Breve.java
    index 329c406b0..5afed481d 100644
    --- a/generics/coffee/Breve.java
    +++ b/generics/coffee/Breve.java
    @@ -1,5 +1,5 @@
     // generics/coffee/Breve.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package generics.coffee;
    diff --git a/generics/coffee/Cappuccino.java b/generics/coffee/Cappuccino.java
    index 3ce89b50f..f50486849 100644
    --- a/generics/coffee/Cappuccino.java
    +++ b/generics/coffee/Cappuccino.java
    @@ -1,5 +1,5 @@
     // generics/coffee/Cappuccino.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package generics.coffee;
    diff --git a/generics/coffee/Coffee.java b/generics/coffee/Coffee.java
    index c90d88c19..3c893cb48 100644
    --- a/generics/coffee/Coffee.java
    +++ b/generics/coffee/Coffee.java
    @@ -1,5 +1,5 @@
     // generics/coffee/Coffee.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package generics.coffee;
    @@ -7,8 +7,7 @@
     public class Coffee {
       private static long counter = 0;
       private final long id = counter++;
    -  @Override
    -  public String toString() {
    +  @Override public String toString() {
         return getClass().getSimpleName() + " " + id;
       }
     }
    diff --git a/generics/coffee/CoffeeSupplier.java b/generics/coffee/CoffeeSupplier.java
    index fe5dced89..5fb68a288 100644
    --- a/generics/coffee/CoffeeSupplier.java
    +++ b/generics/coffee/CoffeeSupplier.java
    @@ -1,5 +1,5 @@
     // generics/coffee/CoffeeSupplier.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // {java generics.coffee.CoffeeSupplier}
    @@ -18,8 +18,7 @@ public CoffeeSupplier() {}
       // For iteration:
       private int size = 0;
       public CoffeeSupplier(int sz) { size = sz; }
    -  @Override
    -  public Coffee get() {
    +  @Override public Coffee get() {
         try {
           return (Coffee)
             types[rand.nextInt(types.length)]
    @@ -36,8 +35,7 @@ class CoffeeIterator implements Iterator {
         int count = size;
         @Override
         public boolean hasNext() { return count > 0; }
    -    @Override
    -    public Coffee next() {
    +    @Override public Coffee next() {
           count--;
           return CoffeeSupplier.this.get();
         }
    @@ -46,8 +44,7 @@ public void remove() { // Not implemented
           throw new UnsupportedOperationException();
         }
       }
    -  @Override
    -  public Iterator iterator() {
    +  @Override public Iterator iterator() {
         return new CoffeeIterator();
       }
       public static void main(String[] args) {
    diff --git a/generics/coffee/Latte.java b/generics/coffee/Latte.java
    index d735cc876..bf4d25831 100644
    --- a/generics/coffee/Latte.java
    +++ b/generics/coffee/Latte.java
    @@ -1,5 +1,5 @@
     // generics/coffee/Latte.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package generics.coffee;
    diff --git a/generics/coffee/Mocha.java b/generics/coffee/Mocha.java
    index cc567be1e..e4eaa5a20 100644
    --- a/generics/coffee/Mocha.java
    +++ b/generics/coffee/Mocha.java
    @@ -1,5 +1,5 @@
     // generics/coffee/Mocha.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package generics.coffee;
    diff --git a/generics/decorator/Decoration.java b/generics/decorator/Decoration.java
    index 96611a75a..07651bb35 100644
    --- a/generics/decorator/Decoration.java
    +++ b/generics/decorator/Decoration.java
    @@ -1,5 +1,5 @@
     // generics/decorator/Decoration.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // {java generics.decorator.Decoration}
    diff --git a/generics/dogsandrobots.go b/generics/dogsandrobots.go
    index f65b9c18f..cba1e10c3 100644
    --- a/generics/dogsandrobots.go
    +++ b/generics/dogsandrobots.go
    @@ -1,5 +1,5 @@
     // generics/dogsandrobots.go
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package main
    diff --git a/generics/watercolors/Watercolors.java b/generics/watercolors/Watercolors.java
    index 0625e5326..33922ba10 100644
    --- a/generics/watercolors/Watercolors.java
    +++ b/generics/watercolors/Watercolors.java
    @@ -1,5 +1,5 @@
     // generics/watercolors/Watercolors.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package generics.watercolors;
    diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
    index 4d9ca1649..28ff446a2 100644
    --- a/gradle/wrapper/gradle-wrapper.properties
    +++ b/gradle/wrapper/gradle-wrapper.properties
    @@ -1,5 +1,5 @@
     distributionBase=GRADLE_USER_HOME
     distributionPath=wrapper/dists
    -distributionUrl=https\://services.gradle.org/distributions/gradle-6.7.1-bin.zip
    +distributionUrl=https\://services.gradle.org/distributions/gradle-6.8.1-bin.zip
     zipStoreBase=GRADLE_USER_HOME
     zipStorePath=wrapper/dists
    diff --git a/hiding/Cake.java b/hiding/Cake.java
    index d20e2cbf1..e4ee6698c 100644
    --- a/hiding/Cake.java
    +++ b/hiding/Cake.java
    @@ -1,5 +1,5 @@
     // hiding/Cake.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Accesses a class in a separate compilation unit
    diff --git a/hiding/ChocolateChip.java b/hiding/ChocolateChip.java
    index 1467fff42..dd98cc883 100644
    --- a/hiding/ChocolateChip.java
    +++ b/hiding/ChocolateChip.java
    @@ -1,5 +1,5 @@
     // hiding/ChocolateChip.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Can't use package-access member from another package
    diff --git a/hiding/ChocolateChip2.java b/hiding/ChocolateChip2.java
    index 03c9d1ab2..bc85fb95f 100644
    --- a/hiding/ChocolateChip2.java
    +++ b/hiding/ChocolateChip2.java
    @@ -1,5 +1,5 @@
     // hiding/ChocolateChip2.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import hiding.cookie2.*;
    diff --git a/hiding/CreatePackageAccessObject.java b/hiding/CreatePackageAccessObject.java
    index 8442b51f7..823d6b265 100644
    --- a/hiding/CreatePackageAccessObject.java
    +++ b/hiding/CreatePackageAccessObject.java
    @@ -1,5 +1,5 @@
     // hiding/CreatePackageAccessObject.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // {WillNotCompile}
    diff --git a/hiding/Dinner.java b/hiding/Dinner.java
    index 7a7b97d59..e027e6aa0 100644
    --- a/hiding/Dinner.java
    +++ b/hiding/Dinner.java
    @@ -1,5 +1,5 @@
     // hiding/Dinner.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Uses the library
    diff --git a/hiding/FullQualification.java b/hiding/FullQualification.java
    index 2fadb28cd..e0a74371e 100644
    --- a/hiding/FullQualification.java
    +++ b/hiding/FullQualification.java
    @@ -1,5 +1,5 @@
     // hiding/FullQualification.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
    diff --git a/hiding/IceCream.java b/hiding/IceCream.java
    index d91619a26..ad78cd7e4 100644
    --- a/hiding/IceCream.java
    +++ b/hiding/IceCream.java
    @@ -1,5 +1,5 @@
     // hiding/IceCream.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Demonstrates "private" keyword
    diff --git a/hiding/ImportedMyClass.java b/hiding/ImportedMyClass.java
    index a644f5d83..dfd0fc111 100644
    --- a/hiding/ImportedMyClass.java
    +++ b/hiding/ImportedMyClass.java
    @@ -1,5 +1,5 @@
     // hiding/ImportedMyClass.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import hiding.mypackage.*;
    diff --git a/hiding/LibTest.java b/hiding/LibTest.java
    index c439352a5..4c2e970f9 100644
    --- a/hiding/LibTest.java
    +++ b/hiding/LibTest.java
    @@ -1,5 +1,5 @@
     // hiding/LibTest.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Uses the library
    diff --git a/hiding/Lunch.java b/hiding/Lunch.java
    index eca4baf03..81b46791a 100644
    --- a/hiding/Lunch.java
    +++ b/hiding/Lunch.java
    @@ -1,5 +1,5 @@
     // hiding/Lunch.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Demonstrates class access specifiers. Make a class
    @@ -7,14 +7,14 @@
     
     class Soup1 {
       private Soup1() {}
    -  public static Soup1 makeSoup() { // [1]
    +  public static Soup1 makeSoup() {          // [1]
         return new Soup1();
       }
     }
     
     class Soup2 {
       private Soup2() {}
    -  private static Soup2 ps1 = new Soup2(); // [2]
    +  private static Soup2 ps1 = new Soup2();   // [2]
       public static Soup2 access() {
         return ps1;
       }
    diff --git a/hiding/OrganizedByAccess.java b/hiding/OrganizedByAccess.java
    index 46af158fc..9553a7805 100644
    --- a/hiding/OrganizedByAccess.java
    +++ b/hiding/OrganizedByAccess.java
    @@ -1,5 +1,5 @@
     // hiding/OrganizedByAccess.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
    diff --git a/hiding/Pie.java b/hiding/Pie.java
    index 1470fbc33..5cf3c12d7 100644
    --- a/hiding/Pie.java
    +++ b/hiding/Pie.java
    @@ -1,5 +1,5 @@
     // hiding/Pie.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // The other class
    diff --git a/hiding/QualifiedMyClass.java b/hiding/QualifiedMyClass.java
    index 58a097ccd..6b0beafcb 100644
    --- a/hiding/QualifiedMyClass.java
    +++ b/hiding/QualifiedMyClass.java
    @@ -1,5 +1,5 @@
     // hiding/QualifiedMyClass.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
    diff --git a/hiding/SingleImport.java b/hiding/SingleImport.java
    index 5168ebe88..4e7b26dc4 100644
    --- a/hiding/SingleImport.java
    +++ b/hiding/SingleImport.java
    @@ -1,5 +1,5 @@
     // hiding/SingleImport.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.ArrayList;
    diff --git a/hiding/cookie2/Cookie.java b/hiding/cookie2/Cookie.java
    index aff5bb172..faa9bd5a9 100644
    --- a/hiding/cookie2/Cookie.java
    +++ b/hiding/cookie2/Cookie.java
    @@ -1,5 +1,5 @@
     // hiding/cookie2/Cookie.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package hiding.cookie2;
    diff --git a/hiding/dessert/Cookie.java b/hiding/dessert/Cookie.java
    index 803e504c2..b6de1bdb9 100644
    --- a/hiding/dessert/Cookie.java
    +++ b/hiding/dessert/Cookie.java
    @@ -1,5 +1,5 @@
     // hiding/dessert/Cookie.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Creates a library
    diff --git a/hiding/mypackage/MyClass.java b/hiding/mypackage/MyClass.java
    index 5245d4796..c029f6646 100644
    --- a/hiding/mypackage/MyClass.java
    +++ b/hiding/mypackage/MyClass.java
    @@ -1,5 +1,5 @@
     // hiding/mypackage/MyClass.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package hiding.mypackage;
    diff --git a/hiding/packageaccess/PublicConstructor.java b/hiding/packageaccess/PublicConstructor.java
    index 533c28a0a..250090505 100644
    --- a/hiding/packageaccess/PublicConstructor.java
    +++ b/hiding/packageaccess/PublicConstructor.java
    @@ -1,5 +1,5 @@
     // hiding/packageaccess/PublicConstructor.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package hiding.packageaccess;
    diff --git a/housekeeping/Apricot.java b/housekeeping/Apricot.java
    index dae8f33de..81932eaba 100644
    --- a/housekeeping/Apricot.java
    +++ b/housekeeping/Apricot.java
    @@ -1,7 +1,8 @@
     // housekeeping/Apricot.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
    +
     public class Apricot {
       void pick() { /* ... */ }
       void pit() { pick(); /* ... */ }
    diff --git a/housekeeping/ArrayClassObj.java b/housekeeping/ArrayClassObj.java
    index 44e31b59e..440087080 100644
    --- a/housekeeping/ArrayClassObj.java
    +++ b/housekeeping/ArrayClassObj.java
    @@ -1,5 +1,5 @@
     // housekeeping/ArrayClassObj.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Creating an array of nonprimitive objects
    diff --git a/housekeeping/ArrayInit.java b/housekeeping/ArrayInit.java
    index 4186bd24e..f515f13b5 100644
    --- a/housekeeping/ArrayInit.java
    +++ b/housekeeping/ArrayInit.java
    @@ -1,5 +1,5 @@
     // housekeeping/ArrayInit.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Array initialization
    diff --git a/housekeeping/ArrayNew.java b/housekeeping/ArrayNew.java
    index 022cec168..8cba539a9 100644
    --- a/housekeeping/ArrayNew.java
    +++ b/housekeeping/ArrayNew.java
    @@ -1,5 +1,5 @@
     // housekeeping/ArrayNew.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Creating arrays with new
    diff --git a/housekeeping/ArraysOfPrimitives.java b/housekeeping/ArraysOfPrimitives.java
    index 165afe896..cfd0cf2f6 100644
    --- a/housekeeping/ArraysOfPrimitives.java
    +++ b/housekeeping/ArraysOfPrimitives.java
    @@ -1,5 +1,5 @@
     // housekeeping/ArraysOfPrimitives.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
    diff --git a/housekeeping/AutoboxingVarargs.java b/housekeeping/AutoboxingVarargs.java
    index c670fa670..76bb5a7b0 100644
    --- a/housekeeping/AutoboxingVarargs.java
    +++ b/housekeeping/AutoboxingVarargs.java
    @@ -1,5 +1,5 @@
     // housekeeping/AutoboxingVarargs.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
    diff --git a/housekeeping/BananaPeel.java b/housekeeping/BananaPeel.java
    index b3e01b273..30d1e8095 100644
    --- a/housekeeping/BananaPeel.java
    +++ b/housekeeping/BananaPeel.java
    @@ -1,5 +1,5 @@
     // housekeeping/BananaPeel.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
    diff --git a/housekeeping/Burrito.java b/housekeeping/Burrito.java
    index e3fd028bd..88bf16fc0 100644
    --- a/housekeeping/Burrito.java
    +++ b/housekeeping/Burrito.java
    @@ -1,5 +1,5 @@
     // housekeeping/Burrito.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
    diff --git a/housekeeping/Counter.java b/housekeeping/Counter.java
    index d0a58ecc6..ef5733e72 100644
    --- a/housekeeping/Counter.java
    +++ b/housekeeping/Counter.java
    @@ -1,5 +1,5 @@
     // housekeeping/Counter.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     public class Counter {
    diff --git a/housekeeping/DefaultConstructor.java b/housekeeping/DefaultConstructor.java
    index 22e3787dd..ac8971130 100644
    --- a/housekeeping/DefaultConstructor.java
    +++ b/housekeeping/DefaultConstructor.java
    @@ -1,5 +1,5 @@
     // housekeeping/DefaultConstructor.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
    diff --git a/housekeeping/Demotion.java b/housekeeping/Demotion.java
    index ad2c4e86b..5534bccb1 100644
    --- a/housekeeping/Demotion.java
    +++ b/housekeeping/Demotion.java
    @@ -1,5 +1,5 @@
     // housekeeping/Demotion.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Demotion of primitives
    diff --git a/housekeeping/DynamicArray.java b/housekeeping/DynamicArray.java
    index 726ec034a..d94536e30 100644
    --- a/housekeeping/DynamicArray.java
    +++ b/housekeeping/DynamicArray.java
    @@ -1,5 +1,5 @@
     // housekeeping/DynamicArray.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Array initialization
    diff --git a/housekeeping/EnumOrder.java b/housekeeping/EnumOrder.java
    index a3c962847..8927ae50f 100644
    --- a/housekeeping/EnumOrder.java
    +++ b/housekeeping/EnumOrder.java
    @@ -1,5 +1,5 @@
     // housekeeping/EnumOrder.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
    diff --git a/housekeeping/ExplicitStatic.java b/housekeeping/ExplicitStatic.java
    index 7d9cb31ad..034fbd417 100644
    --- a/housekeeping/ExplicitStatic.java
    +++ b/housekeeping/ExplicitStatic.java
    @@ -1,5 +1,5 @@
     // housekeeping/ExplicitStatic.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Explicit static initialization with "static" clause
    @@ -28,7 +28,7 @@ class Cups {
     public class ExplicitStatic {
       public static void main(String[] args) {
         System.out.println("Inside main()");
    -    Cups.cup1.f(99);  // [1]
    +    Cups.cup1.f(99);                  // [1]
       }
       // static Cups cups1 = new Cups();  // [2]
       // static Cups cups2 = new Cups();  // [2]
    diff --git a/housekeeping/Flower.java b/housekeeping/Flower.java
    index a62d7cbe5..ad90463c2 100644
    --- a/housekeeping/Flower.java
    +++ b/housekeeping/Flower.java
    @@ -1,5 +1,5 @@
     // housekeeping/Flower.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Calling constructors with "this"
    diff --git a/housekeeping/InitialValues.java b/housekeeping/InitialValues.java
    index dced4dd2e..90c82ce14 100644
    --- a/housekeeping/InitialValues.java
    +++ b/housekeeping/InitialValues.java
    @@ -1,5 +1,5 @@
     // housekeeping/InitialValues.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Shows default initial values
    diff --git a/housekeeping/InitialValues2.java b/housekeeping/InitialValues2.java
    index 1cb509744..678331e26 100644
    --- a/housekeeping/InitialValues2.java
    +++ b/housekeeping/InitialValues2.java
    @@ -1,5 +1,5 @@
     // housekeeping/InitialValues2.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Providing explicit initial values
    diff --git a/housekeeping/Leaf.java b/housekeeping/Leaf.java
    index f9c560b24..dc559c98d 100644
    --- a/housekeeping/Leaf.java
    +++ b/housekeeping/Leaf.java
    @@ -1,5 +1,5 @@
     // housekeeping/Leaf.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Simple use of the "this" keyword
    diff --git a/housekeeping/Measurement.java b/housekeeping/Measurement.java
    index 8a920779e..c97bfbd9f 100644
    --- a/housekeeping/Measurement.java
    +++ b/housekeeping/Measurement.java
    @@ -1,5 +1,5 @@
     // housekeeping/Measurement.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     class Depth {}
    diff --git a/housekeeping/MethodInit.java b/housekeeping/MethodInit.java
    index 84e15fcef..242866b16 100644
    --- a/housekeeping/MethodInit.java
    +++ b/housekeeping/MethodInit.java
    @@ -1,5 +1,5 @@
     // housekeeping/MethodInit.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     public class MethodInit {
    diff --git a/housekeeping/MethodInit2.java b/housekeeping/MethodInit2.java
    index 24750fb2d..d00d17900 100644
    --- a/housekeeping/MethodInit2.java
    +++ b/housekeeping/MethodInit2.java
    @@ -1,5 +1,5 @@
     // housekeeping/MethodInit2.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     public class MethodInit2 {
    diff --git a/housekeeping/MethodInit3.java b/housekeeping/MethodInit3.java
    index 2a6524aba..7b201f306 100644
    --- a/housekeeping/MethodInit3.java
    +++ b/housekeeping/MethodInit3.java
    @@ -1,5 +1,5 @@
     // housekeeping/MethodInit3.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     public class MethodInit3 {
    diff --git a/housekeeping/Mugs.java b/housekeeping/Mugs.java
    index e4ebba695..bdb6f1518 100644
    --- a/housekeeping/Mugs.java
    +++ b/housekeeping/Mugs.java
    @@ -1,5 +1,5 @@
     // housekeeping/Mugs.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Instance initialization
    @@ -13,7 +13,7 @@ class Mug {
     public class Mugs {
       Mug mug1;
       Mug mug2;
    -  { // [1]
    +  {                                         // [1]
         mug1 = new Mug(1);
         mug2 = new Mug(2);
         System.out.println("mug1 & mug2 initialized");
    diff --git a/housekeeping/NewVarArgs.java b/housekeeping/NewVarArgs.java
    index 291dd1346..640dda154 100644
    --- a/housekeeping/NewVarArgs.java
    +++ b/housekeeping/NewVarArgs.java
    @@ -1,5 +1,5 @@
     // housekeeping/NewVarArgs.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Using array syntax to create variable argument lists
    @@ -25,6 +25,6 @@ public static void main(String[] args) {
     47 3.14 11.11
     47 3.14 11.11
     one two three
    -A@15db9742 A@6d06d69c A@7852e922
    +A@19e0bfd A@139a55 A@1db9742
     1 2 3 4
     */
    diff --git a/housekeeping/NoSynthesis.java b/housekeeping/NoSynthesis.java
    index 217c20230..7cb90130d 100644
    --- a/housekeeping/NoSynthesis.java
    +++ b/housekeeping/NoSynthesis.java
    @@ -1,5 +1,5 @@
     // housekeeping/NoSynthesis.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
    diff --git a/housekeeping/OptionalTrailingArguments.java b/housekeeping/OptionalTrailingArguments.java
    index d7ee9fbbf..62b2a92f8 100644
    --- a/housekeeping/OptionalTrailingArguments.java
    +++ b/housekeeping/OptionalTrailingArguments.java
    @@ -1,5 +1,5 @@
     // housekeeping/OptionalTrailingArguments.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
    diff --git a/housekeeping/OrderOfInitialization.java b/housekeeping/OrderOfInitialization.java
    index c715ed7c5..dc175d315 100644
    --- a/housekeeping/OrderOfInitialization.java
    +++ b/housekeeping/OrderOfInitialization.java
    @@ -1,5 +1,5 @@
     // housekeeping/OrderOfInitialization.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Demonstrates initialization order
    diff --git a/housekeeping/Overloading.java b/housekeeping/Overloading.java
    index 99d21bf80..65f239529 100644
    --- a/housekeeping/Overloading.java
    +++ b/housekeeping/Overloading.java
    @@ -1,5 +1,5 @@
     // housekeeping/Overloading.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Both constructor and ordinary method overloading
    diff --git a/housekeeping/OverloadingOrder.java b/housekeeping/OverloadingOrder.java
    index 42f6466ec..e2cef3012 100644
    --- a/housekeeping/OverloadingOrder.java
    +++ b/housekeeping/OverloadingOrder.java
    @@ -1,5 +1,5 @@
     // housekeeping/OverloadingOrder.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Overloading based on the order of the arguments
    diff --git a/housekeeping/OverloadingVarargs.java b/housekeeping/OverloadingVarargs.java
    index c13b7406f..dea4785c5 100644
    --- a/housekeeping/OverloadingVarargs.java
    +++ b/housekeeping/OverloadingVarargs.java
    @@ -1,5 +1,5 @@
     // housekeeping/OverloadingVarargs.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
    diff --git a/housekeeping/OverloadingVarargs2.java b/housekeeping/OverloadingVarargs2.java
    index c3a098451..2c1755d41 100644
    --- a/housekeeping/OverloadingVarargs2.java
    +++ b/housekeeping/OverloadingVarargs2.java
    @@ -1,5 +1,5 @@
     // housekeeping/OverloadingVarargs2.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // {WillNotCompile}
    diff --git a/housekeeping/OverloadingVarargs3.java b/housekeeping/OverloadingVarargs3.java
    index 23e757ec5..c49f472ea 100644
    --- a/housekeeping/OverloadingVarargs3.java
    +++ b/housekeeping/OverloadingVarargs3.java
    @@ -1,5 +1,5 @@
     // housekeeping/OverloadingVarargs3.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
    diff --git a/housekeeping/PassingThis.java b/housekeeping/PassingThis.java
    index ce725eabf..5a6bb9396 100644
    --- a/housekeeping/PassingThis.java
    +++ b/housekeeping/PassingThis.java
    @@ -1,5 +1,5 @@
     // housekeeping/PassingThis.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
    diff --git a/housekeeping/PrimitiveOverloading.java b/housekeeping/PrimitiveOverloading.java
    index 1d8c1e2c6..9618eddfb 100644
    --- a/housekeeping/PrimitiveOverloading.java
    +++ b/housekeeping/PrimitiveOverloading.java
    @@ -1,5 +1,5 @@
     // housekeeping/PrimitiveOverloading.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Promotion of primitives and overloading
    diff --git a/housekeeping/SimpleConstructor.java b/housekeeping/SimpleConstructor.java
    index c6917c33d..ff28bd063 100644
    --- a/housekeeping/SimpleConstructor.java
    +++ b/housekeeping/SimpleConstructor.java
    @@ -1,5 +1,5 @@
     // housekeeping/SimpleConstructor.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Demonstration of a simple constructor
    diff --git a/housekeeping/SimpleConstructor2.java b/housekeeping/SimpleConstructor2.java
    index 4a191af78..ae6936efc 100644
    --- a/housekeeping/SimpleConstructor2.java
    +++ b/housekeeping/SimpleConstructor2.java
    @@ -1,5 +1,5 @@
     // housekeeping/SimpleConstructor2.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Constructors can have arguments
    diff --git a/housekeeping/SimpleEnumUse.java b/housekeeping/SimpleEnumUse.java
    index cc0de33b2..d1c69f024 100644
    --- a/housekeeping/SimpleEnumUse.java
    +++ b/housekeeping/SimpleEnumUse.java
    @@ -1,5 +1,5 @@
     // housekeeping/SimpleEnumUse.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
    diff --git a/housekeeping/Spiciness.java b/housekeeping/Spiciness.java
    index a134a822d..94ccfe85e 100644
    --- a/housekeeping/Spiciness.java
    +++ b/housekeeping/Spiciness.java
    @@ -1,5 +1,5 @@
     // housekeeping/Spiciness.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
    diff --git a/housekeeping/Spoon.java b/housekeeping/Spoon.java
    index fd3448159..bf9257689 100644
    --- a/housekeeping/Spoon.java
    +++ b/housekeeping/Spoon.java
    @@ -1,5 +1,5 @@
     // housekeeping/Spoon.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     public class Spoon {
    diff --git a/housekeeping/StaticInitialization.java b/housekeeping/StaticInitialization.java
    index 0cfe99aea..eaa743d84 100644
    --- a/housekeeping/StaticInitialization.java
    +++ b/housekeeping/StaticInitialization.java
    @@ -1,5 +1,5 @@
     // housekeeping/StaticInitialization.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Specifying initial values in a class definition
    diff --git a/housekeeping/TerminationCondition.java b/housekeeping/TerminationCondition.java
    index dc8d347b8..532053b7c 100644
    --- a/housekeeping/TerminationCondition.java
    +++ b/housekeeping/TerminationCondition.java
    @@ -1,5 +1,5 @@
     // housekeeping/TerminationCondition.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Using finalize() to detect an object that
    @@ -15,8 +15,7 @@ void checkIn() {
         checkedOut = false;
       }
       @SuppressWarnings("deprecation")
    -  @Override
    -  public void finalize() {
    +  @Override public void finalize() {
         if(checkedOut)
           System.out.println("Error: checked out");
         // Normally, you'll also do this:
    diff --git a/housekeeping/VarArgs.java b/housekeeping/VarArgs.java
    index 73a94c392..25f44d86e 100644
    --- a/housekeeping/VarArgs.java
    +++ b/housekeeping/VarArgs.java
    @@ -1,5 +1,5 @@
     // housekeeping/VarArgs.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Using array syntax to create variable argument lists
    @@ -22,5 +22,5 @@ public static void main(String[] args) {
     /* Output:
     47 3.14 11.11
     one two three
    -A@15db9742 A@6d06d69c A@7852e922
    +A@19e0bfd A@139a55 A@1db9742
     */
    diff --git a/housekeeping/VarargType.java b/housekeeping/VarargType.java
    index 5b25b0536..b6ea406bc 100644
    --- a/housekeeping/VarargType.java
    +++ b/housekeeping/VarargType.java
    @@ -1,5 +1,5 @@
     // housekeeping/VarargType.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
    diff --git a/innerclasses/AnonymousConstructor.java b/innerclasses/AnonymousConstructor.java
    index d8e08e7c9..10a6b6433 100644
    --- a/innerclasses/AnonymousConstructor.java
    +++ b/innerclasses/AnonymousConstructor.java
    @@ -1,5 +1,5 @@
     // innerclasses/AnonymousConstructor.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Creating a constructor for an anonymous inner class
    @@ -16,8 +16,7 @@ public static Base getBase(int i) {
         return new Base(i) {
           { System.out.println(
             "Inside instance initializer"); }
    -      @Override
    -      public void f() {
    +      @Override public void f() {
             System.out.println("In anonymous f()");
           }
         };
    diff --git a/innerclasses/BigEgg.java b/innerclasses/BigEgg.java
    index 7b2c36246..96cb06f3a 100644
    --- a/innerclasses/BigEgg.java
    +++ b/innerclasses/BigEgg.java
    @@ -1,5 +1,5 @@
     // innerclasses/BigEgg.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // An inner class cannot be overridden like a method
    diff --git a/innerclasses/BigEgg2.java b/innerclasses/BigEgg2.java
    index 1631008d2..847165f3c 100644
    --- a/innerclasses/BigEgg2.java
    +++ b/innerclasses/BigEgg2.java
    @@ -1,5 +1,5 @@
     // innerclasses/BigEgg2.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Proper inheritance of an inner class
    @@ -24,8 +24,7 @@ public class Yolk extends Egg2.Yolk {
         public Yolk() {
           System.out.println("BigEgg2.Yolk()");
         }
    -    @Override
    -    public void f() {
    +    @Override public void f() {
           System.out.println("BigEgg2.Yolk.f()");
         }
       }
    diff --git a/innerclasses/Callbacks.java b/innerclasses/Callbacks.java
    index d16593322..9031ea242 100644
    --- a/innerclasses/Callbacks.java
    +++ b/innerclasses/Callbacks.java
    @@ -1,5 +1,5 @@
     // innerclasses/Callbacks.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Using inner classes for callbacks
    @@ -13,8 +13,7 @@ interface Incrementable {
     // Very simple to just implement the interface:
     class Callee1 implements Incrementable {
       private int i = 0;
    -  @Override
    -  public void increment() {
    +  @Override public void increment() {
         i++;
         System.out.println(i);
       }
    @@ -31,15 +30,13 @@ public void increment() {
     // some other way, you must use an inner class:
     class Callee2 extends MyIncrement {
       private int i = 0;
    -  @Override
    -  public void increment() {
    +  @Override public void increment() {
         super.increment();
         i++;
         System.out.println(i);
       }
       private class Closure implements Incrementable {
    -    @Override
    -    public void increment() {
    +    @Override public void increment() {
           // Specify outer-class method, otherwise
           // you'll get an infinite recursion:
           Callee2.this.increment();
    diff --git a/innerclasses/ClassInInterface.java b/innerclasses/ClassInInterface.java
    index c3cc0589b..b06042743 100644
    --- a/innerclasses/ClassInInterface.java
    +++ b/innerclasses/ClassInInterface.java
    @@ -1,5 +1,5 @@
     // innerclasses/ClassInInterface.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // {java ClassInInterface$Test}
    @@ -7,8 +7,7 @@
     public interface ClassInInterface {
       void howdy();
       class Test implements ClassInInterface {
    -    @Override
    -    public void howdy() {
    +    @Override public void howdy() {
           System.out.println("Howdy!");
         }
         public static void main(String[] args) {
    diff --git a/innerclasses/Contents.java b/innerclasses/Contents.java
    index 0cebe1a0d..e31519124 100644
    --- a/innerclasses/Contents.java
    +++ b/innerclasses/Contents.java
    @@ -1,5 +1,5 @@
     // innerclasses/Contents.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     public interface Contents {
    diff --git a/innerclasses/Destination.java b/innerclasses/Destination.java
    index bf221526b..0702be02f 100644
    --- a/innerclasses/Destination.java
    +++ b/innerclasses/Destination.java
    @@ -1,5 +1,5 @@
     // innerclasses/Destination.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     public interface Destination {
    diff --git a/innerclasses/DotNew.java b/innerclasses/DotNew.java
    index 317400e80..3f77dc608 100644
    --- a/innerclasses/DotNew.java
    +++ b/innerclasses/DotNew.java
    @@ -1,5 +1,5 @@
     // innerclasses/DotNew.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Creating an inner class directly using .new syntax
    diff --git a/innerclasses/DotThis.java b/innerclasses/DotThis.java
    index b87cb1f4c..881ba9a9e 100644
    --- a/innerclasses/DotThis.java
    +++ b/innerclasses/DotThis.java
    @@ -1,5 +1,5 @@
     // innerclasses/DotThis.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Accessing the outer-class object
    diff --git a/innerclasses/GreenhouseController.java b/innerclasses/GreenhouseController.java
    index cf3ec6530..5ec13cab6 100644
    --- a/innerclasses/GreenhouseController.java
    +++ b/innerclasses/GreenhouseController.java
    @@ -1,5 +1,5 @@
     // innerclasses/GreenhouseController.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Configure and execute the greenhouse system
    diff --git a/innerclasses/GreenhouseControls.java b/innerclasses/GreenhouseControls.java
    index 57458d66f..4836f8c5e 100644
    --- a/innerclasses/GreenhouseControls.java
    +++ b/innerclasses/GreenhouseControls.java
    @@ -1,5 +1,5 @@
     // innerclasses/GreenhouseControls.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // This produces a specific application of the
    @@ -14,14 +14,12 @@ public class LightOn extends Event {
         public LightOn(long delayTime) {
           super(delayTime);
         }
    -    @Override
    -    public void action() {
    +    @Override public void action() {
           // Put hardware control code here to
           // physically turn on the light.
           light = true;
         }
    -    @Override
    -    public String toString() {
    +    @Override public String toString() {
           return "Light is on";
         }
       }
    @@ -29,14 +27,12 @@ public class LightOff extends Event {
         public LightOff(long delayTime) {
           super(delayTime);
         }
    -    @Override
    -    public void action() {
    +    @Override public void action() {
           // Put hardware control code here to
           // physically turn off the light.
           light = false;
         }
    -    @Override
    -    public String toString() {
    +    @Override public String toString() {
           return "Light is off";
         }
       }
    @@ -45,13 +41,11 @@ public class WaterOn extends Event {
         public WaterOn(long delayTime) {
           super(delayTime);
         }
    -    @Override
    -    public void action() {
    +    @Override public void action() {
           // Put hardware control code here.
           water = true;
         }
    -    @Override
    -    public String toString() {
    +    @Override public String toString() {
           return "Greenhouse water is on";
         }
       }
    @@ -59,13 +53,11 @@ public class WaterOff extends Event {
         public WaterOff(long delayTime) {
           super(delayTime);
         }
    -    @Override
    -    public void action() {
    +    @Override public void action() {
           // Put hardware control code here.
           water = false;
         }
    -    @Override
    -    public String toString() {
    +    @Override public String toString() {
           return "Greenhouse water is off";
         }
       }
    @@ -74,13 +66,11 @@ public class ThermostatNight extends Event {
         public ThermostatNight(long delayTime) {
           super(delayTime);
         }
    -    @Override
    -    public void action() {
    +    @Override public void action() {
           // Put hardware control code here.
           thermostat = "Night";
         }
    -    @Override
    -    public String toString() {
    +    @Override public String toString() {
           return "Thermostat on night setting";
         }
       }
    @@ -88,13 +78,11 @@ public class ThermostatDay extends Event {
         public ThermostatDay(long delayTime) {
           super(delayTime);
         }
    -    @Override
    -    public void action() {
    +    @Override public void action() {
           // Put hardware control code here.
           thermostat = "Day";
         }
    -    @Override
    -    public String toString() {
    +    @Override public String toString() {
           return "Thermostat on day setting";
         }
       }
    @@ -104,12 +92,10 @@ public class Bell extends Event {
         public Bell(long delayTime) {
           super(delayTime);
         }
    -    @Override
    -    public void action() {
    +    @Override public void action() {
           addEvent(new Bell(delayTime.toMillis()));
         }
    -    @Override
    -    public String toString() {
    +    @Override public String toString() {
           return "Bing!";
         }
       }
    @@ -122,8 +108,7 @@ public class Restart extends Event {
           for(Event e : eventList)
             addEvent(e);
         }
    -    @Override
    -    public void action() {
    +    @Override public void action() {
           for(Event e : eventList) {
             e.start(); // Rerun each event
             addEvent(e);
    @@ -131,8 +116,7 @@ public void action() {
           start(); // Rerun this Event
           addEvent(this);
         }
    -    @Override
    -    public String toString() {
    +    @Override public String toString() {
           return "Restarting system";
         }
       }
    @@ -142,8 +126,7 @@ public Terminate(long delayTime) {
         }
         @Override
         public void action() { System.exit(0); }
    -    @Override
    -    public String toString() {
    +    @Override public String toString() {
           return "Terminating";
         }
       }
    diff --git a/innerclasses/InheritInner.java b/innerclasses/InheritInner.java
    index ffc868946..5e89cbe11 100644
    --- a/innerclasses/InheritInner.java
    +++ b/innerclasses/InheritInner.java
    @@ -1,5 +1,5 @@
     // innerclasses/InheritInner.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Inheriting an inner class
    diff --git a/innerclasses/LocalInnerClass.java b/innerclasses/LocalInnerClass.java
    index 015108545..efc2ec555 100644
    --- a/innerclasses/LocalInnerClass.java
    +++ b/innerclasses/LocalInnerClass.java
    @@ -1,5 +1,5 @@
     // innerclasses/LocalInnerClass.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Holds a sequence of Objects
    @@ -17,8 +17,7 @@ class LocalCounter implements Counter {
             // Local inner class can have a constructor
             System.out.println("LocalCounter()");
           }
    -      @Override
    -      public int next() {
    +      @Override public int next() {
             System.out.print(name); // Access local final
             return count++;
           }
    @@ -33,8 +32,7 @@ Counter getCounter2(final String name) {
           {
             System.out.println("Counter()");
           }
    -      @Override
    -      public int next() {
    +      @Override public int next() {
             System.out.print(name); // Access local final
             return count++;
           }
    diff --git a/innerclasses/MultiImplementation.java b/innerclasses/MultiImplementation.java
    index 6eb6c494f..d5e4869af 100644
    --- a/innerclasses/MultiImplementation.java
    +++ b/innerclasses/MultiImplementation.java
    @@ -1,5 +1,5 @@
     // innerclasses/MultiImplementation.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // For concrete or abstract classes, inner classes
    diff --git a/innerclasses/MultiNestingAccess.java b/innerclasses/MultiNestingAccess.java
    index bf9e3cb02..a97ffcfed 100644
    --- a/innerclasses/MultiNestingAccess.java
    +++ b/innerclasses/MultiNestingAccess.java
    @@ -1,5 +1,5 @@
     // innerclasses/MultiNestingAccess.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Nested classes can access all members of all
    diff --git a/innerclasses/Parcel1.java b/innerclasses/Parcel1.java
    index 94464cbcd..270134080 100644
    --- a/innerclasses/Parcel1.java
    +++ b/innerclasses/Parcel1.java
    @@ -1,5 +1,5 @@
     // innerclasses/Parcel1.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Creating inner classes
    diff --git a/innerclasses/Parcel10.java b/innerclasses/Parcel10.java
    index 7150c1929..1d02fb7a1 100644
    --- a/innerclasses/Parcel10.java
    +++ b/innerclasses/Parcel10.java
    @@ -1,5 +1,5 @@
     // innerclasses/Parcel10.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Using "instance initialization" to perform
    diff --git a/innerclasses/Parcel11.java b/innerclasses/Parcel11.java
    index 720981f0e..ccedb3b40 100644
    --- a/innerclasses/Parcel11.java
    +++ b/innerclasses/Parcel11.java
    @@ -1,5 +1,5 @@
     // innerclasses/Parcel11.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Nested classes (static inner classes)
    @@ -8,8 +8,7 @@ public class Parcel11 {
       private static class
       ParcelContents implements Contents {
         private int i = 11;
    -    @Override
    -    public int value() { return i; }
    +    @Override public int value() { return i; }
       }
       protected static final class ParcelDestination
       implements Destination {
    diff --git a/innerclasses/Parcel2.java b/innerclasses/Parcel2.java
    index 1eca5cba2..e7e106d98 100644
    --- a/innerclasses/Parcel2.java
    +++ b/innerclasses/Parcel2.java
    @@ -1,5 +1,5 @@
     // innerclasses/Parcel2.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Returning a reference to an inner class
    diff --git a/innerclasses/Parcel3.java b/innerclasses/Parcel3.java
    index 2e0733e05..d35f9d6aa 100644
    --- a/innerclasses/Parcel3.java
    +++ b/innerclasses/Parcel3.java
    @@ -1,5 +1,5 @@
     // innerclasses/Parcel3.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Using .new to create instances of inner classes
    diff --git a/innerclasses/Parcel5.java b/innerclasses/Parcel5.java
    index 622b3fd08..79ea40a89 100644
    --- a/innerclasses/Parcel5.java
    +++ b/innerclasses/Parcel5.java
    @@ -1,5 +1,5 @@
     // innerclasses/Parcel5.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Nesting a class within a method
    diff --git a/innerclasses/Parcel6.java b/innerclasses/Parcel6.java
    index 7a2c866e7..4c4325ba9 100644
    --- a/innerclasses/Parcel6.java
    +++ b/innerclasses/Parcel6.java
    @@ -1,5 +1,5 @@
     // innerclasses/Parcel6.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Nesting a class within a scope
    diff --git a/innerclasses/Parcel7.java b/innerclasses/Parcel7.java
    index 3a4aefbb6..c98947d49 100644
    --- a/innerclasses/Parcel7.java
    +++ b/innerclasses/Parcel7.java
    @@ -1,5 +1,5 @@
     // innerclasses/Parcel7.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Returning an instance of an anonymous inner class
    @@ -8,8 +8,7 @@ public class Parcel7 {
       public Contents contents() {
         return new Contents() { // Insert class definition
           private int i = 11;
    -      @Override
    -      public int value() { return i; }
    +      @Override public int value() { return i; }
         }; // Semicolon required
       }
       public static void main(String[] args) {
    diff --git a/innerclasses/Parcel7b.java b/innerclasses/Parcel7b.java
    index bee95727e..31521df9e 100644
    --- a/innerclasses/Parcel7b.java
    +++ b/innerclasses/Parcel7b.java
    @@ -1,5 +1,5 @@
     // innerclasses/Parcel7b.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Expanded version of Parcel7.java
    @@ -7,8 +7,7 @@
     public class Parcel7b {
       class MyContents implements Contents {
         private int i = 11;
    -    @Override
    -    public int value() { return i; }
    +    @Override public int value() { return i; }
       }
       public Contents contents() {
         return new MyContents();
    diff --git a/innerclasses/Parcel8.java b/innerclasses/Parcel8.java
    index 1e615ac5a..4ee309935 100644
    --- a/innerclasses/Parcel8.java
    +++ b/innerclasses/Parcel8.java
    @@ -1,5 +1,5 @@
     // innerclasses/Parcel8.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Calling the base-class constructor
    @@ -7,12 +7,11 @@
     public class Parcel8 {
       public Wrapping wrapping(int x) {
         // Base constructor call:
    -    return new Wrapping(x) { // [1]
    -      @Override
    -      public int value() {
    +    return new Wrapping(x) {          // [1]
    +      @Override public int value() {
             return super.value() * 47;
           }
    -    }; // [2]
    +    };                                // [2]
       }
       public static void main(String[] args) {
         Parcel8 p = new Parcel8();
    diff --git a/innerclasses/Parcel9.java b/innerclasses/Parcel9.java
    index 775390f13..53053cd16 100644
    --- a/innerclasses/Parcel9.java
    +++ b/innerclasses/Parcel9.java
    @@ -1,5 +1,5 @@
     // innerclasses/Parcel9.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
    diff --git a/innerclasses/Sequence.java b/innerclasses/Sequence.java
    index b5a870b98..ad9869177 100644
    --- a/innerclasses/Sequence.java
    +++ b/innerclasses/Sequence.java
    @@ -1,5 +1,5 @@
     // innerclasses/Sequence.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Holds a sequence of Objects
    diff --git a/innerclasses/TestBed.java b/innerclasses/TestBed.java
    index d4bc16dda..35a7fade2 100644
    --- a/innerclasses/TestBed.java
    +++ b/innerclasses/TestBed.java
    @@ -1,5 +1,5 @@
     // innerclasses/TestBed.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Putting test code in a nested class
    diff --git a/innerclasses/TestParcel.java b/innerclasses/TestParcel.java
    index f1ec5d47f..76ec51bda 100644
    --- a/innerclasses/TestParcel.java
    +++ b/innerclasses/TestParcel.java
    @@ -1,13 +1,12 @@
     // innerclasses/TestParcel.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
     class Parcel4 {
       private class PContents implements Contents {
         private int i = 11;
    -    @Override
    -    public int value() { return i; }
    +    @Override public int value() { return i; }
       }
       protected final class
       PDestination implements Destination {
    diff --git a/innerclasses/Wrapping.java b/innerclasses/Wrapping.java
    index 651c07488..74e9e9ab8 100644
    --- a/innerclasses/Wrapping.java
    +++ b/innerclasses/Wrapping.java
    @@ -1,5 +1,5 @@
     // innerclasses/Wrapping.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     public class Wrapping {
    diff --git a/innerclasses/controller/Controller.java b/innerclasses/controller/Controller.java
    index 9a3625b36..de766961a 100644
    --- a/innerclasses/controller/Controller.java
    +++ b/innerclasses/controller/Controller.java
    @@ -1,5 +1,5 @@
     // innerclasses/controller/Controller.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // The reusable framework for control systems
    diff --git a/innerclasses/controller/Event.java b/innerclasses/controller/Event.java
    index 5523168f4..247e4c90b 100644
    --- a/innerclasses/controller/Event.java
    +++ b/innerclasses/controller/Event.java
    @@ -1,5 +1,5 @@
     // innerclasses/controller/Event.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // The common methods for any control event
    diff --git a/innerclasses/mui/MultiInterfaces.java b/innerclasses/mui/MultiInterfaces.java
    index 127a6c80b..ee69f61ab 100644
    --- a/innerclasses/mui/MultiInterfaces.java
    +++ b/innerclasses/mui/MultiInterfaces.java
    @@ -1,5 +1,5 @@
     // innerclasses/mui/MultiInterfaces.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Two ways a class can implement multiple interfaces
    diff --git a/interfaces/AbstractAccess.java b/interfaces/AbstractAccess.java
    index c2e43da3a..8645d9f36 100644
    --- a/interfaces/AbstractAccess.java
    +++ b/interfaces/AbstractAccess.java
    @@ -1,5 +1,5 @@
     // interfaces/AbstractAccess.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
    diff --git a/interfaces/AbstractWithoutAbstracts.java b/interfaces/AbstractWithoutAbstracts.java
    index 2e6b700c9..587248a02 100644
    --- a/interfaces/AbstractWithoutAbstracts.java
    +++ b/interfaces/AbstractWithoutAbstracts.java
    @@ -1,5 +1,5 @@
     // interfaces/AbstractWithoutAbstracts.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
    diff --git a/interfaces/AdaptedRandomDoubles.java b/interfaces/AdaptedRandomDoubles.java
    index 6c7866554..d965e5add 100644
    --- a/interfaces/AdaptedRandomDoubles.java
    +++ b/interfaces/AdaptedRandomDoubles.java
    @@ -1,5 +1,5 @@
     // interfaces/AdaptedRandomDoubles.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Creating an adapter with inheritance
    @@ -12,8 +12,7 @@ public class AdaptedRandomDoubles
       public AdaptedRandomDoubles(int count) {
         this.count = count;
       }
    -  @Override
    -  public int read(CharBuffer cb) {
    +  @Override public int read(CharBuffer cb) {
         if(count-- == 0)
           return -1;
         String result = Double.toString(next()) + " ";
    diff --git a/interfaces/Adventure.java b/interfaces/Adventure.java
    index 1a7135d13..4e0bbbde2 100644
    --- a/interfaces/Adventure.java
    +++ b/interfaces/Adventure.java
    @@ -1,5 +1,5 @@
     // interfaces/Adventure.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Multiple interfaces
    @@ -22,8 +22,8 @@ public void fight() {}
     
     class Hero extends ActionCharacter
         implements CanFight, CanSwim, CanFly {
    -  public void swim() {}
    -  public void fly() {}
    +  @Override public void swim() {}
    +  @Override public void fly() {}
     }
     
     public class Adventure {
    diff --git a/interfaces/AnImplementation.java b/interfaces/AnImplementation.java
    index 3ff13a30c..29ca8df57 100644
    --- a/interfaces/AnImplementation.java
    +++ b/interfaces/AnImplementation.java
    @@ -1,13 +1,13 @@
     // interfaces/AnImplementation.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
     public class AnImplementation implements AnInterface {
    -  public void firstMethod() {
    +  @Override public void firstMethod() {
         System.out.println("firstMethod");
       }
    -  public void secondMethod() {
    +  @Override public void secondMethod() {
         System.out.println("secondMethod");
       }
       public static void main(String[] args) {
    diff --git a/interfaces/AnInterface.java b/interfaces/AnInterface.java
    index 30f82b3a0..333dbe2b5 100644
    --- a/interfaces/AnInterface.java
    +++ b/interfaces/AnInterface.java
    @@ -1,5 +1,5 @@
     // interfaces/AnInterface.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
    diff --git a/interfaces/Applicator.java b/interfaces/Applicator.java
    index a6aa172f9..1082629a1 100644
    --- a/interfaces/Applicator.java
    +++ b/interfaces/Applicator.java
    @@ -1,5 +1,5 @@
     // interfaces/Applicator.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    diff --git a/interfaces/AttemptToUseBasic.java b/interfaces/AttemptToUseBasic.java
    index 0d2655279..d8e67f72b 100644
    --- a/interfaces/AttemptToUseBasic.java
    +++ b/interfaces/AttemptToUseBasic.java
    @@ -1,5 +1,5 @@
     // interfaces/AttemptToUseBasic.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // {WillNotCompile}
    diff --git a/interfaces/Basic.java b/interfaces/Basic.java
    index 19c1c75b2..943392b02 100644
    --- a/interfaces/Basic.java
    +++ b/interfaces/Basic.java
    @@ -1,5 +1,5 @@
     // interfaces/Basic.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
    diff --git a/interfaces/Basic2.java b/interfaces/Basic2.java
    index 4c8f0c93c..1c33a54f9 100644
    --- a/interfaces/Basic2.java
    +++ b/interfaces/Basic2.java
    @@ -1,5 +1,5 @@
     // interfaces/Basic2.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
    diff --git a/interfaces/Factories.java b/interfaces/Factories.java
    index 87e282513..8ab076014 100644
    --- a/interfaces/Factories.java
    +++ b/interfaces/Factories.java
    @@ -1,5 +1,5 @@
     // interfaces/Factories.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
    @@ -14,34 +14,32 @@ interface ServiceFactory {
     
     class Service1 implements Service {
       Service1() {} // Package access
    -  public void method1() {
    +  @Override public void method1() {
         System.out.println("Service1 method1");
       }
    -  public void method2() {
    +  @Override public void method2() {
         System.out.println("Service1 method2");
       }
     }
     
     class Service1Factory implements ServiceFactory {
    -  @Override
    -  public Service getService() {
    +  @Override public Service getService() {
         return new Service1();
       }
     }
     
     class Service2 implements Service {
       Service2() {} // Package access
    -  public void method1() {
    +  @Override public void method1() {
         System.out.println("Service2 method1");
       }
    -  public void method2() {
    +  @Override public void method2() {
         System.out.println("Service2 method2");
       }
     }
     
     class Service2Factory implements ServiceFactory {
    -  @Override
    -  public Service getService() {
    +  @Override public Service getService() {
         return new Service2();
       }
     }
    diff --git a/interfaces/Games.java b/interfaces/Games.java
    index 867efe0cc..3190d3b1e 100644
    --- a/interfaces/Games.java
    +++ b/interfaces/Games.java
    @@ -1,5 +1,5 @@
     // interfaces/Games.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // A Game framework using Factory Methods
    @@ -10,8 +10,7 @@ interface GameFactory { Game getGame(); }
     class Checkers implements Game {
       private int moves = 0;
       private static final int MOVES = 3;
    -  @Override
    -  public boolean move() {
    +  @Override public boolean move() {
         System.out.println("Checkers move " + moves);
         return ++moves != MOVES;
       }
    @@ -25,8 +24,7 @@ class CheckersFactory implements GameFactory {
     class Chess implements Game {
       private int moves = 0;
       private static final int MOVES = 4;
    -  @Override
    -  public boolean move() {
    +  @Override public boolean move() {
         System.out.println("Chess move " + moves);
         return ++moves != MOVES;
       }
    diff --git a/interfaces/HorrorShow.java b/interfaces/HorrorShow.java
    index b1c687dac..079fe2ce3 100644
    --- a/interfaces/HorrorShow.java
    +++ b/interfaces/HorrorShow.java
    @@ -1,5 +1,5 @@
     // interfaces/HorrorShow.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Extending an interface with inheritance
    @@ -17,10 +17,8 @@ interface Lethal {
     }
     
     class DragonZilla implements DangerousMonster {
    -  @Override
    -  public void menace() {}
    -  @Override
    -  public void destroy() {}
    +  @Override public void menace() {}
    +  @Override public void destroy() {}
     }
     
     interface Vampire extends DangerousMonster, Lethal {
    @@ -28,14 +26,10 @@ interface Vampire extends DangerousMonster, Lethal {
     }
     
     class VeryBadVampire implements Vampire {
    -  @Override
    -  public void menace() {}
    -  @Override
    -  public void destroy() {}
    -  @Override
    -  public void kill() {}
    -  @Override
    -  public void drinkBlood() {}
    +  @Override public void menace() {}
    +  @Override public void destroy() {}
    +  @Override public void kill() {}
    +  @Override public void drinkBlood() {}
     }
     
     public class HorrorShow {
    diff --git a/interfaces/Implementation2.java b/interfaces/Implementation2.java
    index 61c6efa01..07fb48324 100644
    --- a/interfaces/Implementation2.java
    +++ b/interfaces/Implementation2.java
    @@ -1,14 +1,14 @@
     // interfaces/Implementation2.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
     public class Implementation2
     implements InterfaceWithDefault {
    -  public void firstMethod() {
    +  @Override public void firstMethod() {
         System.out.println("firstMethod");
       }
    -  public void secondMethod() {
    +  @Override public void secondMethod() {
         System.out.println("secondMethod");
       }
       public static void main(String[] args) {
    diff --git a/interfaces/ImplementingAnInterface.java b/interfaces/ImplementingAnInterface.java
    index 6a13ebb63..1504667fe 100644
    --- a/interfaces/ImplementingAnInterface.java
    +++ b/interfaces/ImplementingAnInterface.java
    @@ -1,5 +1,5 @@
     // interfaces/ImplementingAnInterface.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
    @@ -9,6 +9,10 @@ interface Concept { // Package access
     }
     
     class Implementation implements Concept {
    -  public void idea1() { System.out.println("idea1"); }
    -  public void idea2() { System.out.println("idea2"); }
    +  @Override public void idea1() {
    +    System.out.println("idea1");
    +  }
    +  @Override public void idea2() {
    +    System.out.println("idea2");
    +  }
     }
    diff --git a/interfaces/Instantiable.java b/interfaces/Instantiable.java
    index 427b6ca39..80b689895 100644
    --- a/interfaces/Instantiable.java
    +++ b/interfaces/Instantiable.java
    @@ -1,5 +1,5 @@
     // interfaces/Instantiable.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
    @@ -9,10 +9,8 @@ abstract class Uninstantiable {
     }
     
     public class Instantiable extends Uninstantiable {
    -  @Override
    -  void f() { System.out.println("f()"); }
    -  @Override
    -  int g() { return 22; }
    +  @Override void f() { System.out.println("f()"); }
    +  @Override int g() { return 22; }
       public static void main(String[] args) {
         Uninstantiable ui = new Instantiable();
       }
    diff --git a/interfaces/InterfaceCollision.java b/interfaces/InterfaceCollision.java
    index 0f7de1ac6..a3a6612b1 100644
    --- a/interfaces/InterfaceCollision.java
    +++ b/interfaces/InterfaceCollision.java
    @@ -1,5 +1,5 @@
     // interfaces/InterfaceCollision.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
    @@ -22,8 +22,7 @@ class C3 extends C implements I2 {
     
     class C4 extends C implements I3 {
       // Identical, no problem:
    -  @Override
    -  public int f() { return 1; }
    +  @Override public int f() { return 1; }
     }
     
     // Methods differ only by return type:
    diff --git a/interfaces/InterfaceWithDefault.java b/interfaces/InterfaceWithDefault.java
    index a87f02db9..983beb4b4 100644
    --- a/interfaces/InterfaceWithDefault.java
    +++ b/interfaces/InterfaceWithDefault.java
    @@ -1,5 +1,5 @@
     // interfaces/InterfaceWithDefault.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
    diff --git a/interfaces/Jim.java b/interfaces/Jim.java
    index 515db6e52..a22f53dd3 100644
    --- a/interfaces/Jim.java
    +++ b/interfaces/Jim.java
    @@ -1,5 +1,5 @@
     // interfaces/Jim.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    @@ -17,8 +17,9 @@ default void jim() {
     }
     
     public class Jim implements Jim1, Jim2 {
    -  @Override
    -  public void jim() { Jim2.super.jim(); }
    +  @Override public void jim() {
    +    Jim2.super.jim();
    +  }
       public static void main(String[] args) {
         new Jim().jim();
       }
    diff --git a/interfaces/MICollision.java b/interfaces/MICollision.java
    index c96e5696b..a37d947ad 100644
    --- a/interfaces/MICollision.java
    +++ b/interfaces/MICollision.java
    @@ -1,5 +1,5 @@
     // interfaces/MICollision.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    diff --git a/interfaces/Machine.java b/interfaces/Machine.java
    index 2b1144aef..72e3fcbc9 100644
    --- a/interfaces/Machine.java
    +++ b/interfaces/Machine.java
    @@ -1,24 +1,24 @@
     // interfaces/Machine.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
     import onjava.Operations;
     
     class Bing implements Operations {
    -  public void execute() {
    +  @Override public void execute() {
         Operations.show("Bing");
       }
     }
     
     class Crack implements Operations {
    -  public void execute() {
    +  @Override public void execute() {
         Operations.show("Crack");
       }
     }
     
     class Twist implements Operations {
    -  public void execute() {
    +  @Override public void execute() {
         Operations.show("Twist");
       }
     }
    diff --git a/interfaces/Months.java b/interfaces/Months.java
    index 27317dd5d..d475340b1 100644
    --- a/interfaces/Months.java
    +++ b/interfaces/Months.java
    @@ -1,5 +1,5 @@
     // interfaces/Months.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Using interfaces to create groups of constants
    diff --git a/interfaces/MultipleInheritance.java b/interfaces/MultipleInheritance.java
    index 6ce9c91e0..e2b96777c 100644
    --- a/interfaces/MultipleInheritance.java
    +++ b/interfaces/MultipleInheritance.java
    @@ -1,5 +1,5 @@
     // interfaces/MultipleInheritance.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    diff --git a/interfaces/PureInterface.java b/interfaces/PureInterface.java
    index 37bf9f0bd..ef7732be1 100644
    --- a/interfaces/PureInterface.java
    +++ b/interfaces/PureInterface.java
    @@ -1,5 +1,5 @@
     // interfaces/PureInterface.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Interface only looked like this before Java 8
    diff --git a/interfaces/RandVals.java b/interfaces/RandVals.java
    index 0221c851d..449ae3f0e 100644
    --- a/interfaces/RandVals.java
    +++ b/interfaces/RandVals.java
    @@ -1,5 +1,5 @@
     // interfaces/RandVals.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Initializing interface fields with
    diff --git a/interfaces/RandomDoubles.java b/interfaces/RandomDoubles.java
    index 99154d953..afe18dc0a 100644
    --- a/interfaces/RandomDoubles.java
    +++ b/interfaces/RandomDoubles.java
    @@ -1,5 +1,5 @@
     // interfaces/RandomDoubles.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    diff --git a/interfaces/RandomStrings.java b/interfaces/RandomStrings.java
    index 82f982308..da45cf48e 100644
    --- a/interfaces/RandomStrings.java
    +++ b/interfaces/RandomStrings.java
    @@ -1,5 +1,5 @@
     // interfaces/RandomStrings.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Implementing an interface to conform to a method
    @@ -18,8 +18,7 @@ public class RandomStrings implements Readable {
       public RandomStrings(int count) {
         this.count = count;
       }
    -  @Override
    -  public int read(CharBuffer cb) {
    +  @Override public int read(CharBuffer cb) {
         if(count-- == 0)
           return -1; // Indicates end of input
         cb.append(CAPITALS[rand.nextInt(CAPITALS.length)]);
    diff --git a/interfaces/TestRandVals.java b/interfaces/TestRandVals.java
    index df3490b26..132d7af89 100644
    --- a/interfaces/TestRandVals.java
    +++ b/interfaces/TestRandVals.java
    @@ -1,5 +1,5 @@
     // interfaces/TestRandVals.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
    diff --git a/interfaces/filters/BandPass.java b/interfaces/filters/BandPass.java
    index 7d09ed285..e0e233904 100644
    --- a/interfaces/filters/BandPass.java
    +++ b/interfaces/filters/BandPass.java
    @@ -1,5 +1,5 @@
     // interfaces/filters/BandPass.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package interfaces.filters;
    diff --git a/interfaces/filters/Filter.java b/interfaces/filters/Filter.java
    index 72e29a9e9..e2d0ae6dc 100644
    --- a/interfaces/filters/Filter.java
    +++ b/interfaces/filters/Filter.java
    @@ -1,5 +1,5 @@
     // interfaces/filters/Filter.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package interfaces.filters;
    diff --git a/interfaces/filters/HighPass.java b/interfaces/filters/HighPass.java
    index 7bf047df5..8167e1b8b 100644
    --- a/interfaces/filters/HighPass.java
    +++ b/interfaces/filters/HighPass.java
    @@ -1,5 +1,5 @@
     // interfaces/filters/HighPass.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package interfaces.filters;
    diff --git a/interfaces/filters/LowPass.java b/interfaces/filters/LowPass.java
    index e9320a82a..77bedf515 100644
    --- a/interfaces/filters/LowPass.java
    +++ b/interfaces/filters/LowPass.java
    @@ -1,5 +1,5 @@
     // interfaces/filters/LowPass.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package interfaces.filters;
    diff --git a/interfaces/filters/Waveform.java b/interfaces/filters/Waveform.java
    index 406446770..8262fc102 100644
    --- a/interfaces/filters/Waveform.java
    +++ b/interfaces/filters/Waveform.java
    @@ -1,5 +1,5 @@
     // interfaces/filters/Waveform.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package interfaces.filters;
    @@ -7,8 +7,7 @@
     public class Waveform {
       private static long counter;
       private final long id = counter++;
    -  @Override
    -  public String toString() {
    +  @Override public String toString() {
         return "Waveform " + id;
       }
     }
    diff --git a/interfaces/interfaceprocessor/Applicator.java b/interfaces/interfaceprocessor/Applicator.java
    index 77d7a9a66..3b063a473 100644
    --- a/interfaces/interfaceprocessor/Applicator.java
    +++ b/interfaces/interfaceprocessor/Applicator.java
    @@ -1,5 +1,5 @@
     // interfaces/interfaceprocessor/Applicator.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package interfaces.interfaceprocessor;
    diff --git a/interfaces/interfaceprocessor/FilterProcessor.java b/interfaces/interfaceprocessor/FilterProcessor.java
    index 33689ed46..066be331a 100644
    --- a/interfaces/interfaceprocessor/FilterProcessor.java
    +++ b/interfaces/interfaceprocessor/FilterProcessor.java
    @@ -1,5 +1,5 @@
     // interfaces/interfaceprocessor/FilterProcessor.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // {java interfaces.interfaceprocessor.FilterProcessor}
    diff --git a/interfaces/interfaceprocessor/Processor.java b/interfaces/interfaceprocessor/Processor.java
    index 6315da300..343803194 100644
    --- a/interfaces/interfaceprocessor/Processor.java
    +++ b/interfaces/interfaceprocessor/Processor.java
    @@ -1,5 +1,5 @@
     // interfaces/interfaceprocessor/Processor.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package interfaces.interfaceprocessor;
    diff --git a/interfaces/interfaceprocessor/StringProcessor.java b/interfaces/interfaceprocessor/StringProcessor.java
    index 37cb49469..f97472b7c 100644
    --- a/interfaces/interfaceprocessor/StringProcessor.java
    +++ b/interfaces/interfaceprocessor/StringProcessor.java
    @@ -1,5 +1,5 @@
     // interfaces/interfaceprocessor/StringProcessor.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // {java interfaces.interfaceprocessor.StringProcessor}
    @@ -8,11 +8,11 @@
     
     interface StringProcessor extends Processor {
       @Override
    -  String process(Object input);  // [1]
    -  String S = // [2]
    +  String process(Object input);        // [1]
    +  String S =                           // [2]
       "If she weighs the same as a duck, " +
       "she's made of wood";
    -  static void main(String[] args) { // [3]
    +  static void main(String[] args) {    // [3]
         Applicator.apply(new Upcase(), S);
         Applicator.apply(new Downcase(), S);
         Applicator.apply(new Splitter(), S);
    diff --git a/interfaces/music4/Music4.java b/interfaces/music4/Music4.java
    index 710341494..a875d4c4e 100644
    --- a/interfaces/music4/Music4.java
    +++ b/interfaces/music4/Music4.java
    @@ -1,5 +1,5 @@
     // interfaces/music4/Music4.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Abstract classes and methods
    @@ -15,62 +15,51 @@ abstract class Instrument {
     }
     
     class Wind extends Instrument {
    -  @Override
    -  public void play(Note n) {
    +  @Override public void play(Note n) {
         System.out.println("Wind.play() " + n);
       }
    -  @Override
    -  public String what() { return "Wind"; }
    -  @Override
    -  public void adjust() {
    +  @Override public String what() { return "Wind"; }
    +  @Override public void adjust() {
         System.out.println("Adjusting Wind");
       }
     }
     
     class Percussion extends Instrument {
    -  @Override
    -  public void play(Note n) {
    +  @Override public void play(Note n) {
         System.out.println("Percussion.play() " + n);
       }
    -  @Override
    -  public String what() { return "Percussion"; }
    -  @Override
    -  public void adjust() {
    +  @Override public String what() {
    +    return "Percussion";
    +  }
    +  @Override public void adjust() {
         System.out.println("Adjusting Percussion");
       }
     }
     
     class Stringed extends Instrument {
    -  @Override
    -  public void play(Note n) {
    +  @Override public void play(Note n) {
         System.out.println("Stringed.play() " + n);
       }
    -  @Override
    -  public String what() { return "Stringed"; }
    -  @Override
    -  public void adjust() {
    +  @Override public String what() { return "Stringed"; }
    +  @Override public void adjust() {
         System.out.println("Adjusting Stringed");
       }
     }
     
     class Brass extends Wind {
    -  @Override
    -  public void play(Note n) {
    +  @Override public void play(Note n) {
         System.out.println("Brass.play() " + n);
       }
    -  @Override
    -  public void adjust() {
    +  @Override public void adjust() {
         System.out.println("Adjusting Brass");
       }
     }
     
     class Woodwind extends Wind {
    -  @Override
    -  public void play(Note n) {
    +  @Override public void play(Note n) {
         System.out.println("Woodwind.play() " + n);
       }
    -  @Override
    -  public String what() { return "Woodwind"; }
    +  @Override public String what() { return "Woodwind"; }
     }
     
     public class Music4 {
    diff --git a/interfaces/music5/Music5.java b/interfaces/music5/Music5.java
    index 2326bdbc9..775e656b8 100644
    --- a/interfaces/music5/Music5.java
    +++ b/interfaces/music5/Music5.java
    @@ -1,5 +1,5 @@
     // interfaces/music5/Music5.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // {java interfaces.music5.Music5}
    @@ -18,28 +18,33 @@ default void adjust() {
     }
     
     class Wind implements Instrument {
    -  @Override
    -  public String toString() { return "Wind"; }
    +  @Override public String toString() {
    +    return "Wind";
    +  }
     }
     
     class Percussion implements Instrument {
    -  @Override
    -  public String toString() { return "Percussion"; }
    +  @Override public String toString() {
    +    return "Percussion";
    +  }
     }
     
     class Stringed implements Instrument {
    -  @Override
    -  public String toString() { return "Stringed"; }
    +  @Override public String toString() {
    +    return "Stringed";
    +  }
     }
     
     class Brass extends Wind {
    -  @Override
    -  public String toString() { return "Brass"; }
    +  @Override public String toString() {
    +    return "Brass";
    +  }
     }
     
     class Woodwind extends Wind {
    -  @Override
    -  public String toString() { return "Woodwind"; }
    +  @Override public String toString() {
    +    return "Woodwind";
    +  }
     }
     
     public class Music5 {
    diff --git a/interfaces/nesting/NestingInterfaces.java b/interfaces/nesting/NestingInterfaces.java
    index 99b466bb0..fa4d482ce 100644
    --- a/interfaces/nesting/NestingInterfaces.java
    +++ b/interfaces/nesting/NestingInterfaces.java
    @@ -1,5 +1,5 @@
     // interfaces/nesting/NestingInterfaces.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // {java interfaces.nesting.NestingInterfaces}
    @@ -10,34 +10,28 @@ interface B {
         void f();
       }
       public class BImp implements B {
    -    @Override
    -    public void f() {}
    +    @Override public void f() {}
       }
       private class BImp2 implements B {
    -    @Override
    -    public void f() {}
    +    @Override public void f() {}
       }
       public interface C {
         void f();
       }
       class CImp implements C {
    -    @Override
    -    public void f() {}
    +    @Override public void f() {}
       }
       private class CImp2 implements C {
    -    @Override
    -    public void f() {}
    +    @Override public void f() {}
       }
       private interface D {
         void f();
       }
       private class DImp implements D {
    -    @Override
    -    public void f() {}
    +    @Override public void f() {}
       }
       public class DImp2 implements D {
    -    @Override
    -    public void f() {}
    +    @Override public void f() {}
       }
       public D getD() { return new DImp2(); }
       private D dRef;
    @@ -62,12 +56,10 @@ public interface H {
     
     public class NestingInterfaces {
       public class BImp implements A.B {
    -    @Override
    -    public void f() {}
    +    @Override public void f() {}
       }
       class CImp implements A.C {
    -    @Override
    -    public void f() {}
    +    @Override public void f() {}
       }
       // Cannot implement a private interface except
       // within that interface's defining class:
    @@ -75,19 +67,15 @@ public void f() {}
       //-  public void f() {}
       //- }
       class EImp implements E {
    -    @Override
    -    public void g() {}
    +    @Override public void g() {}
       }
       class EGImp implements E.G {
    -    @Override
    -    public void f() {}
    +    @Override public void f() {}
       }
       class EImp2 implements E {
    -    @Override
    -    public void g() {}
    +    @Override public void g() {}
         class EG implements E.G {
    -      @Override
    -      public void f() {}
    +      @Override public void f() {}
         }
       }
       public static void main(String[] args) {
    diff --git a/iostreams/BasicFileOutput.java b/iostreams/BasicFileOutput.java
    index 1da5c6fdc..c31cf7f21 100644
    --- a/iostreams/BasicFileOutput.java
    +++ b/iostreams/BasicFileOutput.java
    @@ -1,5 +1,5 @@
     // iostreams/BasicFileOutput.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // {VisuallyInspectOutput}
    diff --git a/iostreams/BufferedInputFile.java b/iostreams/BufferedInputFile.java
    index bfe6396f1..2c5c8ae7f 100644
    --- a/iostreams/BufferedInputFile.java
    +++ b/iostreams/BufferedInputFile.java
    @@ -1,5 +1,5 @@
     // iostreams/BufferedInputFile.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // {VisuallyInspectOutput}
    diff --git a/iostreams/FileOutputShortcut.java b/iostreams/FileOutputShortcut.java
    index 5a160ec00..54d3e0597 100644
    --- a/iostreams/FileOutputShortcut.java
    +++ b/iostreams/FileOutputShortcut.java
    @@ -1,5 +1,5 @@
     // iostreams/FileOutputShortcut.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // {VisuallyInspectOutput}
    diff --git a/iostreams/FormattedMemoryInput.java b/iostreams/FormattedMemoryInput.java
    index 055dd8826..f29e75128 100644
    --- a/iostreams/FormattedMemoryInput.java
    +++ b/iostreams/FormattedMemoryInput.java
    @@ -1,5 +1,5 @@
     // iostreams/FormattedMemoryInput.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // {VisuallyInspectOutput}
    diff --git a/iostreams/MemoryInput.java b/iostreams/MemoryInput.java
    index 1326965c6..db5f8d4f9 100644
    --- a/iostreams/MemoryInput.java
    +++ b/iostreams/MemoryInput.java
    @@ -1,5 +1,5 @@
     // iostreams/MemoryInput.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // {VisuallyInspectOutput}
    diff --git a/iostreams/StoringAndRecoveringData.java b/iostreams/StoringAndRecoveringData.java
    index 761f022eb..961f418d7 100644
    --- a/iostreams/StoringAndRecoveringData.java
    +++ b/iostreams/StoringAndRecoveringData.java
    @@ -1,5 +1,5 @@
     // iostreams/StoringAndRecoveringData.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.io.*;
    diff --git a/iostreams/TestEOF.java b/iostreams/TestEOF.java
    index 956cb1a03..a1c939667 100644
    --- a/iostreams/TestEOF.java
    +++ b/iostreams/TestEOF.java
    @@ -1,5 +1,5 @@
     // iostreams/TestEOF.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Testing for end of file
    diff --git a/iostreams/UsingRandomAccessFile.java b/iostreams/UsingRandomAccessFile.java
    index dde6d1ee8..98969a1d2 100644
    --- a/iostreams/UsingRandomAccessFile.java
    +++ b/iostreams/UsingRandomAccessFile.java
    @@ -1,5 +1,5 @@
     // iostreams/UsingRandomAccessFile.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.io.*;
    diff --git a/javadoc/Documentation1.java b/javadoc/Documentation1.java
    index 7838fbd95..790f69fd5 100644
    --- a/javadoc/Documentation1.java
    +++ b/javadoc/Documentation1.java
    @@ -1,5 +1,5 @@
     // javadoc/Documentation1.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     /** A class comment */
    diff --git a/javadoc/Documentation2.java b/javadoc/Documentation2.java
    index 237755f4c..397009e4c 100644
    --- a/javadoc/Documentation2.java
    +++ b/javadoc/Documentation2.java
    @@ -1,5 +1,5 @@
     // javadoc/Documentation2.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     /** 
    diff --git a/javadoc/Documentation3.java b/javadoc/Documentation3.java
    index a3063c3d1..df0c403bb 100644
    --- a/javadoc/Documentation3.java
    +++ b/javadoc/Documentation3.java
    @@ -1,5 +1,5 @@
     // javadoc/Documentation3.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     /** You can even insert a list:
    diff --git a/javadoc/HelloDateDoc.java b/javadoc/HelloDateDoc.java
    index 54b505a44..b6ebe8b47 100644
    --- a/javadoc/HelloDateDoc.java
    +++ b/javadoc/HelloDateDoc.java
    @@ -1,5 +1,5 @@
     // javadoc/HelloDateDoc.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    @@ -22,5 +22,5 @@ public static void main(String[] args) {
     }
     /* Output:
     Hello, it's:
    -Tue May 09 06:07:27 MDT 2017
    +Sun Jan 24 08:49:10 MST 2021
     */
    diff --git a/lowlevel/AtomicEvenProducer.java b/lowlevel/AtomicEvenProducer.java
    index 8c45b61c9..d45592c93 100644
    --- a/lowlevel/AtomicEvenProducer.java
    +++ b/lowlevel/AtomicEvenProducer.java
    @@ -1,5 +1,5 @@
     // lowlevel/AtomicEvenProducer.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Atomic classes: occasionally useful in regular code
    @@ -8,8 +8,7 @@
     public class AtomicEvenProducer extends IntGenerator {
       private AtomicInteger currentEvenValue =
         new AtomicInteger(0);
    -  @Override
    -  public int next() {
    +  @Override public int next() {
         return currentEvenValue.addAndGet(2);
       }
       public static void main(String[] args) {
    diff --git a/lowlevel/AtomicIntegerTest.java b/lowlevel/AtomicIntegerTest.java
    index 09db1ca83..a93134a8e 100644
    --- a/lowlevel/AtomicIntegerTest.java
    +++ b/lowlevel/AtomicIntegerTest.java
    @@ -1,5 +1,5 @@
     // lowlevel/AtomicIntegerTest.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.concurrent.*;
    @@ -10,6 +10,7 @@
     public class AtomicIntegerTest extends IntTestable {
       private AtomicInteger i = new AtomicInteger(0);
       public int getAsInt() { return i.get(); }
    +  @Override
       public void evenIncrement() { i.addAndGet(2); }
       public static void main(String[] args) {
         Atomicity.test(new AtomicIntegerTest());
    diff --git a/lowlevel/AtomicSerialNumbers.java b/lowlevel/AtomicSerialNumbers.java
    index 2e30e9c4a..ef1cdff51 100644
    --- a/lowlevel/AtomicSerialNumbers.java
    +++ b/lowlevel/AtomicSerialNumbers.java
    @@ -1,5 +1,5 @@
     // lowlevel/AtomicSerialNumbers.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.concurrent.atomic.*;
    @@ -8,7 +8,7 @@
     AtomicSerialNumbers extends SerialNumbers {
       private AtomicInteger serialNumber =
         new AtomicInteger();
    -  public int nextSerialNumber() {
    +  @Override public int nextSerialNumber() {
         return serialNumber.getAndIncrement();
       }
       public static void main(String[] args) {
    diff --git a/lowlevel/Atomicity.java b/lowlevel/Atomicity.java
    index 632631bf4..f8f01d641 100644
    --- a/lowlevel/Atomicity.java
    +++ b/lowlevel/Atomicity.java
    @@ -1,5 +1,5 @@
     // lowlevel/Atomicity.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.concurrent.*;
    diff --git a/lowlevel/AttemptLocking.java b/lowlevel/AttemptLocking.java
    index 9dbe2b28e..8632fd58b 100644
    --- a/lowlevel/AttemptLocking.java
    +++ b/lowlevel/AttemptLocking.java
    @@ -1,5 +1,5 @@
     // lowlevel/AttemptLocking.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Locks in the concurrent library allow you
    diff --git a/lowlevel/CaptureUncaughtException.java b/lowlevel/CaptureUncaughtException.java
    index 33261667d..90458aee5 100644
    --- a/lowlevel/CaptureUncaughtException.java
    +++ b/lowlevel/CaptureUncaughtException.java
    @@ -1,12 +1,11 @@
     // lowlevel/CaptureUncaughtException.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.concurrent.*;
     
     class ExceptionThread2 implements Runnable {
    -  @Override
    -  public void run() {
    +  @Override public void run() {
         Thread t = Thread.currentThread();
         System.out.println("run() by " + t.getName());
         System.out.println(
    @@ -24,8 +23,7 @@ public void uncaughtException(Thread t, Throwable e) {
     }
     
     class HandlerThreadFactory implements ThreadFactory {
    -  @Override
    -  public Thread newThread(Runnable r) {
    +  @Override public Thread newThread(Runnable r) {
         System.out.println(this + " creating new Thread");
         Thread t = new Thread(r);
         System.out.println("created " + t);
    @@ -47,10 +45,10 @@ public static void main(String[] args) {
       }
     }
     /* Output:
    -HandlerThreadFactory@4e25154f creating new Thread
    +HandlerThreadFactory@106d69c creating new Thread
     created Thread[Thread-0,5,main]
    -eh = MyUncaughtExceptionHandler@70dea4e
    +eh = MyUncaughtExceptionHandler@52e922
     run() by Thread-0
    -eh = MyUncaughtExceptionHandler@70dea4e
    +eh = MyUncaughtExceptionHandler@52e922
     caught java.lang.RuntimeException
     */
    diff --git a/lowlevel/CircularSet.java b/lowlevel/CircularSet.java
    index 225eaeca4..f0ab28334 100644
    --- a/lowlevel/CircularSet.java
    +++ b/lowlevel/CircularSet.java
    @@ -1,5 +1,5 @@
     // lowlevel/CircularSet.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Reuses storage so we don't run out of memory
    diff --git a/lowlevel/DelayQueueDemo.java b/lowlevel/DelayQueueDemo.java
    index c5575c681..bce53a85f 100644
    --- a/lowlevel/DelayQueueDemo.java
    +++ b/lowlevel/DelayQueueDemo.java
    @@ -1,5 +1,5 @@
     // lowlevel/DelayQueueDemo.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    @@ -20,24 +20,20 @@ class DelayedTask implements Runnable, Delayed {
           NANOSECONDS.convert(delta, MILLISECONDS);
         sequence.add(this);
       }
    -  @Override
    -  public long getDelay(TimeUnit unit) {
    +  @Override public long getDelay(TimeUnit unit) {
         return unit.convert(
           trigger - System.nanoTime(), NANOSECONDS);
       }
    -  @Override
    -  public int compareTo(Delayed arg) {
    +  @Override public int compareTo(Delayed arg) {
         DelayedTask that = (DelayedTask)arg;
         if(trigger < that.trigger) return -1;
         if(trigger > that.trigger) return 1;
         return 0;
       }
    -  @Override
    -  public void run() {
    +  @Override public void run() {
         System.out.print(this + " ");
       }
    -  @Override
    -  public String toString() {
    +  @Override public String toString() {
         return
           String.format("[%d] Task %d", delta, id);
       }
    @@ -46,8 +42,7 @@ public String summary() {
       }
       public static class EndTask extends DelayedTask {
         EndTask(int delay) { super(delay); }
    -    @Override
    -    public void run() {
    +    @Override public void run() {
           sequence.forEach(dt ->
             System.out.println(dt.summary()));
         }
    @@ -70,7 +65,7 @@ public class DelayQueueDemo {
       }
     }
     /* Output:
    -[128] Task 12 [429] Task 6 [551] Task 13 [555] Task 2
    +[128] Task 12 [429] Task 6 [555] Task 2 [551] Task 13
     [693] Task 3 [809] Task 15 [961] Task 5 [1258] Task 1
     [1258] Task 20 [1520] Task 19 [1861] Task 4 [1998] Task
     17 [2200] Task 8 [2207] Task 10 [2288] Task 11 [2522]
    diff --git a/lowlevel/EvenChecker.java b/lowlevel/EvenChecker.java
    index 5e27a39eb..4ba64637e 100644
    --- a/lowlevel/EvenChecker.java
    +++ b/lowlevel/EvenChecker.java
    @@ -1,5 +1,5 @@
     // lowlevel/EvenChecker.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    @@ -14,8 +14,7 @@ public EvenChecker(IntGenerator generator, int id) {
         this.generator = generator;
         this.id = id;
       }
    -  @Override
    -  public void run() {
    +  @Override public void run() {
         while(!generator.isCanceled()) {
           int val = generator.next();
           if(val % 2 != 0) {
    diff --git a/lowlevel/EvenProducer.java b/lowlevel/EvenProducer.java
    index 301577557..67774aa24 100644
    --- a/lowlevel/EvenProducer.java
    +++ b/lowlevel/EvenProducer.java
    @@ -1,5 +1,5 @@
     // lowlevel/EvenProducer.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // When threads collide
    @@ -7,9 +7,8 @@
     
     public class EvenProducer extends IntGenerator {
       private int currentEvenValue = 0;
    -  @Override
    -  public int next() {
    -    ++currentEvenValue; // [1]
    +  @Override public int next() {
    +    ++currentEvenValue;                   // [1]
         ++currentEvenValue;
         return currentEvenValue;
       }
    diff --git a/lowlevel/ExceptionThread.java b/lowlevel/ExceptionThread.java
    index 518b9f5f1..9fee108c9 100644
    --- a/lowlevel/ExceptionThread.java
    +++ b/lowlevel/ExceptionThread.java
    @@ -1,13 +1,12 @@
     // lowlevel/ExceptionThread.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // {ThrowsException}
     import java.util.concurrent.*;
     
     public class ExceptionThread implements Runnable {
    -  @Override
    -  public void run() {
    +  @Override public void run() {
         throw new RuntimeException();
       }
       public static void main(String[] args) {
    @@ -21,7 +20,7 @@ public static void main(String[] args) {
     ___[ Error Output ]___
     Exception in thread "pool-1-thread-1"
     java.lang.RuntimeException
    -        at ExceptionThread.run(ExceptionThread.java:8)
    +        at ExceptionThread.run(ExceptionThread.java:7)
             at java.util.concurrent.ThreadPoolExecutor.runW
     orker(ThreadPoolExecutor.java:1142)
             at java.util.concurrent.ThreadPoolExecutor$Work
    diff --git a/lowlevel/IntGenerator.java b/lowlevel/IntGenerator.java
    index e1dd0f629..a5078a955 100644
    --- a/lowlevel/IntGenerator.java
    +++ b/lowlevel/IntGenerator.java
    @@ -1,5 +1,5 @@
     // lowlevel/IntGenerator.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.concurrent.atomic.AtomicBoolean;
    diff --git a/lowlevel/IntTestable.java b/lowlevel/IntTestable.java
    index 1989ff4db..bd2f2abde 100644
    --- a/lowlevel/IntTestable.java
    +++ b/lowlevel/IntTestable.java
    @@ -1,5 +1,5 @@
     // lowlevel/IntTestable.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.function.*;
    @@ -7,8 +7,7 @@
     public abstract class
     IntTestable implements Runnable, IntSupplier {
       abstract void evenIncrement();
    -  @Override
    -  public void run() {
    +  @Override public void run() {
         while(true)
           evenIncrement();
       }
    diff --git a/lowlevel/MutexEvenProducer.java b/lowlevel/MutexEvenProducer.java
    index ae82df827..24ce0448a 100644
    --- a/lowlevel/MutexEvenProducer.java
    +++ b/lowlevel/MutexEvenProducer.java
    @@ -1,5 +1,5 @@
     // lowlevel/MutexEvenProducer.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Preventing thread collisions with mutexes
    @@ -9,8 +9,7 @@
     public class MutexEvenProducer extends IntGenerator {
       private int currentEvenValue = 0;
       private Lock lock = new ReentrantLock();
    -  @Override
    -  public int next() {
    +  @Override public int next() {
         lock.lock();
         try {
           ++currentEvenValue;
    diff --git a/lowlevel/NaiveExceptionHandling.java b/lowlevel/NaiveExceptionHandling.java
    index 3681337ef..efda2778e 100644
    --- a/lowlevel/NaiveExceptionHandling.java
    +++ b/lowlevel/NaiveExceptionHandling.java
    @@ -1,5 +1,5 @@
     // lowlevel/NaiveExceptionHandling.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // {ThrowsException}
    @@ -23,7 +23,7 @@ public static void main(String[] args) {
     ___[ Error Output ]___
     Exception in thread "pool-1-thread-1"
     java.lang.RuntimeException
    -        at ExceptionThread.run(ExceptionThread.java:8)
    +        at ExceptionThread.run(ExceptionThread.java:7)
             at java.util.concurrent.ThreadPoolExecutor.runW
     orker(ThreadPoolExecutor.java:1142)
             at java.util.concurrent.ThreadPoolExecutor$Work
    diff --git a/lowlevel/NotAtomic.java b/lowlevel/NotAtomic.java
    index c6c6c3211..00a1b0102 100644
    --- a/lowlevel/NotAtomic.java
    +++ b/lowlevel/NotAtomic.java
    @@ -1,5 +1,5 @@
     // lowlevel/NotAtomic.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // javap -c NotAtomic
    diff --git a/lowlevel/NumberOfProcessors.java b/lowlevel/NumberOfProcessors.java
    index 44abeb5dd..3c3abf81f 100644
    --- a/lowlevel/NumberOfProcessors.java
    +++ b/lowlevel/NumberOfProcessors.java
    @@ -1,5 +1,5 @@
     // lowlevel/NumberOfProcessors.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
    diff --git a/lowlevel/PriorityBlockingQueueDemo.java b/lowlevel/PriorityBlockingQueueDemo.java
    index 099a53497..4683ed841 100644
    --- a/lowlevel/PriorityBlockingQueueDemo.java
    +++ b/lowlevel/PriorityBlockingQueueDemo.java
    @@ -1,5 +1,5 @@
     // lowlevel/PriorityBlockingQueueDemo.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    @@ -19,13 +19,11 @@ class Prioritized implements Comparable  {
         this.priority = priority;
         sequence.add(this);
       }
    -  @Override
    -  public int compareTo(Prioritized arg) {
    +  @Override public int compareTo(Prioritized arg) {
         return priority < arg.priority ? 1 :
           (priority > arg.priority ? -1 : 0);
       }
    -  @Override
    -  public String toString() {
    +  @Override public String toString() {
         return String.format(
           "[%d] Prioritized %d", priority, id);
       }
    @@ -51,8 +49,7 @@ class Producer implements Runnable {
       Producer(Queue q) {
         queue = q;
       }
    -  @Override
    -  public void run() {
    +  @Override public void run() {
         rand.ints(10, 0, 20)
           .mapToObj(Prioritized::new)
           .peek(p -> new Nap(rand.nextDouble() / 10))
    @@ -68,8 +65,7 @@ class Consumer implements Runnable {
       Consumer(PriorityBlockingQueue q) {
         this.q = q;
       }
    -  @Override
    -  public void run() {
    +  @Override public void run() {
         while(true) {
           try {
             Prioritized pt = q.take();
    @@ -98,21 +94,21 @@ public static void main(String[] args) {
       }
     }
     /* Output:
    -[15] Prioritized 2
    -[17] Prioritized 1
    +[15] Prioritized 1
    +[17] Prioritized 0
     [17] Prioritized 5
     [16] Prioritized 6
     [14] Prioritized 9
    -[12] Prioritized 0
    +[12] Prioritized 2
     [11] Prioritized 4
     [11] Prioritized 12
     [13] Prioritized 13
     [12] Prioritized 16
    -[14] Prioritized 18
    +[14] Prioritized 17
     [15] Prioritized 23
     [18] Prioritized 26
     [16] Prioritized 29
    -[12] Prioritized 17
    +[12] Prioritized 18
     [11] Prioritized 30
     [11] Prioritized 24
     [10] Prioritized 15
    @@ -129,10 +125,10 @@ public static void main(String[] args) {
     [0] Prioritized 14
     [0] Prioritized 21
     [-1] Prioritized 28
    -(0:12)(2:15)(1:17)(3:1)(4:11)
    +(0:17)(1:15)(2:12)(3:1)(4:11)
     (5:17)(6:16)(7:3)(8:0)(9:14)
     (10:8)(11:8)(12:11)(13:13)(14:0)
    -(15:10)(16:12)(17:12)(18:14)(19:0)
    +(15:10)(16:12)(17:14)(18:12)(19:0)
     (20:2)(21:0)(22:10)(23:15)(24:11)
     (25:8)(26:18)(27:-1)(28:-1)(29:16)
     (30:11)(31:6)(32:-1)
    diff --git a/lowlevel/ReOrdering.java b/lowlevel/ReOrdering.java
    index 8209ac40f..77f07469e 100644
    --- a/lowlevel/ReOrdering.java
    +++ b/lowlevel/ReOrdering.java
    @@ -1,13 +1,12 @@
     // lowlevel/ReOrdering.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
     public class ReOrdering implements Runnable {
       int one, two, three, four, five, six;
       volatile int volaTile;
    -  @Override
    -  public void run() {
    +  @Override public void run() {
         one = 1;
         two = 2;
         three = 3;
    diff --git a/lowlevel/SafeReturn.java b/lowlevel/SafeReturn.java
    index 751c96be9..70d21454e 100644
    --- a/lowlevel/SafeReturn.java
    +++ b/lowlevel/SafeReturn.java
    @@ -1,5 +1,5 @@
     // lowlevel/SafeReturn.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.function.*;
    @@ -8,6 +8,7 @@
     public class SafeReturn extends IntTestable {
       private int i = 0;
       public synchronized int getAsInt() { return i; }
    +  @Override
       public synchronized void evenIncrement() {
         i++; i++;
       }
    diff --git a/lowlevel/SerialNumberChecker.java b/lowlevel/SerialNumberChecker.java
    index 9c2b92ad2..d539411ee 100644
    --- a/lowlevel/SerialNumberChecker.java
    +++ b/lowlevel/SerialNumberChecker.java
    @@ -1,5 +1,5 @@
     // lowlevel/SerialNumberChecker.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Test SerialNumbers implementations for thread-safety
    @@ -12,8 +12,7 @@ public class SerialNumberChecker implements Runnable {
       public SerialNumberChecker(SerialNumbers producer) {
         this.producer = producer;
       }
    -  @Override
    -  public void run() {
    +  @Override public void run() {
         while(true) {
           int serial = producer.nextSerialNumber();
           if(serials.contains(serial)) {
    diff --git a/lowlevel/SerialNumberTest.java b/lowlevel/SerialNumberTest.java
    index cdeddcd95..9c740d259 100644
    --- a/lowlevel/SerialNumberTest.java
    +++ b/lowlevel/SerialNumberTest.java
    @@ -1,5 +1,5 @@
     // lowlevel/SerialNumberTest.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
    @@ -9,5 +9,8 @@ public static void main(String[] args) {
       }
     }
     /* Output:
    -Duplicate: 148044
    +Duplicate: 33280
    +Duplicate: 33278
    +Duplicate: 33290
    +Duplicate: 33277
     */
    diff --git a/lowlevel/SerialNumbers.java b/lowlevel/SerialNumbers.java
    index 3f6101c73..aaaf74bda 100644
    --- a/lowlevel/SerialNumbers.java
    +++ b/lowlevel/SerialNumbers.java
    @@ -1,5 +1,5 @@
     // lowlevel/SerialNumbers.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
    diff --git a/lowlevel/SettingDefaultHandler.java b/lowlevel/SettingDefaultHandler.java
    index 56a046426..7fe2d5c8a 100644
    --- a/lowlevel/SettingDefaultHandler.java
    +++ b/lowlevel/SettingDefaultHandler.java
    @@ -1,5 +1,5 @@
     // lowlevel/SettingDefaultHandler.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.concurrent.*;
    diff --git a/lowlevel/SwallowedException.java b/lowlevel/SwallowedException.java
    index 60edd0d6c..7f70f0cb4 100644
    --- a/lowlevel/SwallowedException.java
    +++ b/lowlevel/SwallowedException.java
    @@ -1,5 +1,5 @@
     // lowlevel/SwallowedException.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.concurrent.*;
    diff --git a/lowlevel/SyncOnObject.java b/lowlevel/SyncOnObject.java
    index 846c5573a..d81ad9f4b 100644
    --- a/lowlevel/SyncOnObject.java
    +++ b/lowlevel/SyncOnObject.java
    @@ -1,5 +1,5 @@
     // lowlevel/SyncOnObject.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Synchronizing on another object
    diff --git a/lowlevel/SynchronizedComparison.java b/lowlevel/SynchronizedComparison.java
    index 6fbcd1f3d..274f1f0b3 100644
    --- a/lowlevel/SynchronizedComparison.java
    +++ b/lowlevel/SynchronizedComparison.java
    @@ -1,5 +1,5 @@
     // lowlevel/SynchronizedComparison.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Synchronizing blocks instead of entire methods
    @@ -13,22 +13,21 @@
     abstract class Guarded {
       AtomicLong callCount = new AtomicLong();
       public abstract void method();
    -  @Override
    -  public String toString() {
    +  @Override public String toString() {
         return getClass().getSimpleName() +
           ": " + callCount.get();
       }
     }
     
     class SynchronizedMethod extends Guarded {
    -  public synchronized void method() {
    +  @Override public synchronized void method() {
         new Nap(0.01);
         callCount.incrementAndGet();
       }
     }
     
     class CriticalSection extends Guarded {
    -  public void method() {
    +  @Override public void method() {
         new Nap(0.01);
         synchronized(this) {
           callCount.incrementAndGet();
    @@ -43,8 +42,7 @@ class Caller implements Runnable {
         new AtomicLong();
       private AtomicBoolean stop =
         new AtomicBoolean(false);
    -  @Override
    -  public void run() {
    +  @Override public void run() {
         new Timer().schedule(new TimerTask() {
           public void run() { stop.set(true); }
         }, 2500);
    @@ -76,14 +74,14 @@ public static void main(String[] args) {
       }
     }
     /* Output:
    --> 243
    --> 243
    --> 243
    --> 243
    -CriticalSection: 972
    --> 69
    --> 61
    --> 83
    --> 36
    -SynchronizedMethod: 249
    +-> 159
    +-> 159
    +-> 159
    +-> 159
    +CriticalSection: 636
    +-> 65
    +-> 21
    +-> 11
    +-> 68
    +SynchronizedMethod: 165
     */
    diff --git a/lowlevel/SynchronizedEvenProducer.java b/lowlevel/SynchronizedEvenProducer.java
    index 377aeecbb..7fb9b06f3 100644
    --- a/lowlevel/SynchronizedEvenProducer.java
    +++ b/lowlevel/SynchronizedEvenProducer.java
    @@ -1,5 +1,5 @@
     // lowlevel/SynchronizedEvenProducer.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Simplifying mutexes with the synchronized keyword
    @@ -8,8 +8,7 @@
     public class
     SynchronizedEvenProducer extends IntGenerator {
       private int currentEvenValue = 0;
    -  @Override
    -  public synchronized int next() {
    +  @Override public synchronized int next() {
         ++currentEvenValue;
         new Nap(0.01); // Cause failure faster
         ++currentEvenValue;
    diff --git a/lowlevel/SynchronizedSerialNumbers.java b/lowlevel/SynchronizedSerialNumbers.java
    index 1739d8401..c73cd48ee 100644
    --- a/lowlevel/SynchronizedSerialNumbers.java
    +++ b/lowlevel/SynchronizedSerialNumbers.java
    @@ -1,11 +1,12 @@
     // lowlevel/SynchronizedSerialNumbers.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
     public class
     SynchronizedSerialNumbers extends SerialNumbers {
       private int serialNumber = 0;
    +  @Override
       public synchronized int nextSerialNumber() {
         return serialNumber++;
       }
    diff --git a/lowlevel/TestAbort.java b/lowlevel/TestAbort.java
    index a9efe5285..ae2477e1d 100644
    --- a/lowlevel/TestAbort.java
    +++ b/lowlevel/TestAbort.java
    @@ -1,5 +1,5 @@
     // lowlevel/TestAbort.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import onjava.*;
    diff --git a/lowlevel/ThreadSize.java b/lowlevel/ThreadSize.java
    index 0f00023d3..ff6f91fb5 100644
    --- a/lowlevel/ThreadSize.java
    +++ b/lowlevel/ThreadSize.java
    @@ -1,5 +1,5 @@
     // lowlevel/ThreadSize.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // {ExcludeFromGradle} Takes a long time or hangs
    @@ -8,8 +8,7 @@
     
     public class ThreadSize {
       static class Dummy extends Thread {
    -    @Override
    -    public void run() { new Nap(1); }
    +    @Override public void run() { new Nap(1); }
       }
       public static void main(String[] args) {
         ExecutorService exec =
    diff --git a/lowlevel/UnsafeReturn.java b/lowlevel/UnsafeReturn.java
    index c2481fc0f..964cc3af4 100644
    --- a/lowlevel/UnsafeReturn.java
    +++ b/lowlevel/UnsafeReturn.java
    @@ -1,5 +1,5 @@
     // lowlevel/UnsafeReturn.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.function.*;
    @@ -8,6 +8,7 @@
     public class UnsafeReturn extends IntTestable {
       private int i = 0;
       public int getAsInt() { return i; }
    +  @Override
       public synchronized void evenIncrement() {
         i++; i++;
       }
    @@ -16,5 +17,5 @@ public static void main(String[] args) {
       }
     }
     /* Output:
    -failed with: 79
    +failed with: 39
     */
    diff --git a/lowlevel/WorkStealingPool.java b/lowlevel/WorkStealingPool.java
    index 984de7067..9848b019d 100644
    --- a/lowlevel/WorkStealingPool.java
    +++ b/lowlevel/WorkStealingPool.java
    @@ -1,13 +1,12 @@
     // lowlevel/WorkStealingPool.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.stream.*;
     import java.util.concurrent.*;
     
     class ShowThread implements Runnable {
    -  @Override
    -  public void run() {
    +  @Override public void run() {
         System.out.println(
           Thread.currentThread().getName());
       }
    @@ -28,14 +27,14 @@ public static void main(String[] args)
     }
     /* Output:
     8
    -ForkJoinPool-1-worker-2
     ForkJoinPool-1-worker-1
     ForkJoinPool-1-worker-2
    -ForkJoinPool-1-worker-3
    -ForkJoinPool-1-worker-2
     ForkJoinPool-1-worker-1
     ForkJoinPool-1-worker-3
    -ForkJoinPool-1-worker-1
    +ForkJoinPool-1-worker-4
     ForkJoinPool-1-worker-4
     ForkJoinPool-1-worker-2
    +ForkJoinPool-1-worker-3
    +ForkJoinPool-1-worker-5
    +ForkJoinPool-1-worker-1
     */
    diff --git a/newio/AvailableCharSets.java b/newio/AvailableCharSets.java
    index eda3b93c2..bb60164c9 100644
    --- a/newio/AvailableCharSets.java
    +++ b/newio/AvailableCharSets.java
    @@ -1,5 +1,5 @@
     // newio/AvailableCharSets.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Displays Charsets and aliases
    @@ -33,11 +33,9 @@ public static void main(String[] args) {
     Extended_UNIX_Code_Packed_Format_for_Japanese, euc_jp,
     eucjp, x-eucjp
     EUC-KR: ksc5601-1987, csEUCKR, ksc5601_1987, ksc5601,
    -5601,
    -euc_kr, ksc_5601, ks_c_5601-1987, euckr
    +5601, euc_kr, ksc_5601, ks_c_5601-1987, euckr
     GB18030: gb18030-2000
     GB2312: gb2312, euc-cn, x-EUC-CN, euccn, EUC_CN,
    -gb2312-80,
    -gb2312-1980
    +gb2312-80, gb2312-1980
                       ...
     */
    diff --git a/newio/BufferToText.java b/newio/BufferToText.java
    index 2f38c2c6a..147c8857b 100644
    --- a/newio/BufferToText.java
    +++ b/newio/BufferToText.java
    @@ -1,5 +1,5 @@
     // newio/BufferToText.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Converting text to and from ByteBuffers
    diff --git a/newio/ChannelCopy.java b/newio/ChannelCopy.java
    index 846961310..039cecd67 100644
    --- a/newio/ChannelCopy.java
    +++ b/newio/ChannelCopy.java
    @@ -1,5 +1,5 @@
     // newio/ChannelCopy.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Copying a file using channels and buffers
    diff --git a/newio/Endians.java b/newio/Endians.java
    index 11d660760..183019e36 100644
    --- a/newio/Endians.java
    +++ b/newio/Endians.java
    @@ -1,5 +1,5 @@
     // newio/Endians.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Endian differences and data storage
    diff --git a/newio/FileLocking.java b/newio/FileLocking.java
    index e8c74d2a9..7bd335244 100644
    --- a/newio/FileLocking.java
    +++ b/newio/FileLocking.java
    @@ -1,5 +1,5 @@
     // newio/FileLocking.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.nio.channels.*;
    diff --git a/newio/GetChannel.java b/newio/GetChannel.java
    index 16caa3400..1c16f1274 100644
    --- a/newio/GetChannel.java
    +++ b/newio/GetChannel.java
    @@ -1,5 +1,5 @@
     // newio/GetChannel.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Getting channels from streams
    diff --git a/newio/GetData.java b/newio/GetData.java
    index b2518b101..aafbdbad0 100644
    --- a/newio/GetData.java
    +++ b/newio/GetData.java
    @@ -1,5 +1,5 @@
     // newio/GetData.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Getting different representations from a ByteBuffer
    diff --git a/newio/IntBufferDemo.java b/newio/IntBufferDemo.java
    index 31ffaa8f8..ae88d9a84 100644
    --- a/newio/IntBufferDemo.java
    +++ b/newio/IntBufferDemo.java
    @@ -1,5 +1,5 @@
     // newio/IntBufferDemo.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Manipulating ints in a ByteBuffer with an IntBuffer
    diff --git a/newio/LargeMappedFiles.java b/newio/LargeMappedFiles.java
    index c4976e450..dba19f8b5 100644
    --- a/newio/LargeMappedFiles.java
    +++ b/newio/LargeMappedFiles.java
    @@ -1,5 +1,5 @@
     // newio/LargeMappedFiles.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Creating a very large file using mapping
    diff --git a/newio/LockingMappedFiles.java b/newio/LockingMappedFiles.java
    index 6fe8fee52..eec5a46ec 100644
    --- a/newio/LockingMappedFiles.java
    +++ b/newio/LockingMappedFiles.java
    @@ -1,5 +1,5 @@
     // newio/LockingMappedFiles.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Locking portions of a mapped file
    @@ -33,8 +33,7 @@ private static class LockAndModify extends Thread {
           buff = mbb.slice();
           start();
         }
    -    @Override
    -    public void run() {
    +    @Override public void run() {
           try {
             // Exclusive lock with no overlap:
             FileLock fl = fc.lock(start, end, false);
    diff --git a/newio/MappedIO.java b/newio/MappedIO.java
    index 93b4ddf3a..f098ae269 100644
    --- a/newio/MappedIO.java
    +++ b/newio/MappedIO.java
    @@ -1,5 +1,5 @@
     // newio/MappedIO.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // {ExcludeFromGradle} Runs too long under WSL2
    @@ -27,8 +27,7 @@ public void runTest() {
       }
       private static Tester[] tests = {
         new Tester("Stream Write") {
    -      @Override
    -      public void test() {
    +      @Override public void test() {
             try(
               DataOutputStream dos =
                 new DataOutputStream(
    @@ -44,8 +43,7 @@ public void test() {
           }
         },
         new Tester("Mapped Write") {
    -      @Override
    -      public void test() {
    +      @Override public void test() {
             try(
               FileChannel fc =
                 new RandomAccessFile("temp.tmp", "rw")
    @@ -62,8 +60,7 @@ public void test() {
           }
         },
         new Tester("Stream Read") {
    -      @Override
    -      public void test() {
    +      @Override public void test() {
             try(
               DataInputStream dis =
                 new DataInputStream(
    @@ -78,8 +75,7 @@ public void test() {
           }
         },
         new Tester("Mapped Read") {
    -      @Override
    -      public void test() {
    +      @Override public void test() {
             try(
               FileChannel fc = new FileInputStream(
                 new File("temp.tmp")).getChannel()
    @@ -95,8 +91,7 @@ public void test() {
           }
         },
         new Tester("Stream Read/Write") {
    -      @Override
    -      public void test() {
    +      @Override public void test() {
             try(
               RandomAccessFile raf =
                 new RandomAccessFile(
    @@ -113,8 +108,7 @@ public void test() {
           }
         },
         new Tester("Mapped Read/Write") {
    -      @Override
    -      public void test() {
    +      @Override public void test() {
             try(
               FileChannel fc = new RandomAccessFile(
                 new File("temp.tmp"), "rw").getChannel()
    diff --git a/newio/TransferTo.java b/newio/TransferTo.java
    index f3095b71e..cafc1dc18 100644
    --- a/newio/TransferTo.java
    +++ b/newio/TransferTo.java
    @@ -1,5 +1,5 @@
     // newio/TransferTo.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Using transferTo() between channels
    diff --git a/newio/UsingBuffers.java b/newio/UsingBuffers.java
    index 3f3a6bd14..213132a34 100644
    --- a/newio/UsingBuffers.java
    +++ b/newio/UsingBuffers.java
    @@ -1,5 +1,5 @@
     // newio/UsingBuffers.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.nio.*;
    diff --git a/newio/ViewBuffers.java b/newio/ViewBuffers.java
    index d7bb1adfb..0806f4df0 100644
    --- a/newio/ViewBuffers.java
    +++ b/newio/ViewBuffers.java
    @@ -1,5 +1,5 @@
     // newio/ViewBuffers.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.nio.*;
    diff --git a/newio/data.txt b/newio/data.txt
    new file mode 100644
    index 000000000..6dc5df604
    --- /dev/null
    +++ b/newio/data.txt
    @@ -0,0 +1 @@
    +Some text Some more
    \ No newline at end of file
    diff --git a/objects/HelloDate.java b/objects/HelloDate.java
    index 1f613e8e1..b408b1f48 100644
    --- a/objects/HelloDate.java
    +++ b/objects/HelloDate.java
    @@ -1,5 +1,5 @@
     // objects/HelloDate.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    diff --git a/objects/ShowProperties.java b/objects/ShowProperties.java
    index ac2bf41ee..f61e1aaca 100644
    --- a/objects/ShowProperties.java
    +++ b/objects/ShowProperties.java
    @@ -1,5 +1,5 @@
     // objects/ShowProperties.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
    @@ -13,14 +13,14 @@ public static void main(String[] args) {
     }
     /* Output: (First 20 Lines)
     -- listing properties --
    -java.runtime.name=Java(TM) SE Runtime Environment
    -sun.boot.library.path=C:\Program
    -Files\Java\jdk1.8.0_112\jr...
    -java.vm.version=25.112-b15
    +java.runtime.name=OpenJDK Runtime Environment
    +sun.boot.library.path=C:\Program Files\OpenJDK\java-
    +se-8u41...
    +java.vm.version=25.40-b25
     java.vm.vendor=Oracle Corporation
     java.vendor.url=http://java.oracle.com/
     path.separator=;
    -java.vm.name=Java HotSpot(TM) 64-Bit Server VM
    +java.vm.name=OpenJDK Client VM
     file.encoding.pkg=sun.io
     user.script=
     user.country=US
    @@ -28,12 +28,12 @@ public static void main(String[] args) {
     sun.os.patch.level=
     java.vm.specification.name=Java Virtual Machine
     Specification
    -user.dir=C:\Users\Bruce\Documents\GitHub\on-ja...
    -java.runtime.version=1.8.0_112-b15
    +user.dir=C:\Git\OnJava8\ExtractedExamples\objects
    +java.runtime.version=1.8.0_41-b04
     java.awt.graphicsenv=sun.awt.Win32GraphicsEnvironment
    -java.endorsed.dirs=C:\Program
    -Files\Java\jdk1.8.0_112\jr...
    -os.arch=amd64
    +java.endorsed.dirs=C:\Program Files\OpenJDK\java-
    +se-8u41...
    +os.arch=x86
     java.io.tmpdir=C:\Users\Bruce\AppData\Local\Temp\
                       ...
     */
    diff --git a/onjava/ArrayShow.java b/onjava/ArrayShow.java
    index 6edd148fa..1e87754b2 100644
    --- a/onjava/ArrayShow.java
    +++ b/onjava/ArrayShow.java
    @@ -1,5 +1,5 @@
     // onjava/ArrayShow.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package onjava;
    diff --git a/onjava/BasicSupplier.java b/onjava/BasicSupplier.java
    index d4bf3b3d8..838d37861 100644
    --- a/onjava/BasicSupplier.java
    +++ b/onjava/BasicSupplier.java
    @@ -1,5 +1,5 @@
     // onjava/BasicSupplier.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Supplier from a class with a no-arg constructor
    @@ -12,8 +12,7 @@ public class BasicSupplier implements Supplier {
       public BasicSupplier(Class type) {
         this.type = type;
       }
    -  @Override
    -  public T get() {
    +  @Override public T get() {
         try {
           // Assumes type is a public class:
           return type.getConstructor().newInstance();
    diff --git a/onjava/CollectionMethodDifferences.java b/onjava/CollectionMethodDifferences.java
    index 375d4e419..43262312b 100644
    --- a/onjava/CollectionMethodDifferences.java
    +++ b/onjava/CollectionMethodDifferences.java
    @@ -1,5 +1,5 @@
     // onjava/CollectionMethodDifferences.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // {java onjava.CollectionMethodDifferences}
    diff --git a/onjava/ConvertTo.java b/onjava/ConvertTo.java
    index cc8febd70..070723118 100644
    --- a/onjava/ConvertTo.java
    +++ b/onjava/ConvertTo.java
    @@ -1,5 +1,5 @@
     // onjava/ConvertTo.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package onjava;
    diff --git a/onjava/Count.java b/onjava/Count.java
    index 1f380f87c..e2382f57b 100644
    --- a/onjava/Count.java
    +++ b/onjava/Count.java
    @@ -1,5 +1,5 @@
     // onjava/Count.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Generate incremental values of different types
    @@ -12,8 +12,7 @@ public interface Count {
       class Boolean
       implements Supplier {
         private boolean b = true;
    -    @Override
    -    public java.lang.Boolean get() {
    +    @Override public java.lang.Boolean get() {
           b = !b;
           return java.lang.Boolean.valueOf(b);
         }
    @@ -66,8 +65,7 @@ public byte[] array(int sz) {
       class Character
       implements Supplier {
         private int i;
    -    @Override
    -    public java.lang.Character get() {
    +    @Override public java.lang.Character get() {
           i = (i + 1) % CHARS.length;
           return CHARS[i];
         }
    @@ -168,8 +166,7 @@ public long[] array(int sz) {
       class Float
       implements Supplier {
         private int i;
    -    @Override
    -    public java.lang.Float get() {
    +    @Override public java.lang.Float get() {
           return java.lang.Float.valueOf(i++);
         }
         public java.lang.Float get(int n) {
    @@ -193,8 +190,7 @@ public float[] array(int sz) {
       class Double
       implements Supplier {
         private int i;
    -    @Override
    -    public java.lang.Double get() {
    +    @Override public java.lang.Double get() {
           return java.lang.Double.valueOf(i++);
         }
         public java.lang.Double get(int n) {
    diff --git a/onjava/CountMap.java b/onjava/CountMap.java
    index e3759053c..e4f08e7a5 100644
    --- a/onjava/CountMap.java
    +++ b/onjava/CountMap.java
    @@ -1,5 +1,5 @@
     // onjava/CountMap.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Unlimited-length Map containing sample data
    @@ -21,31 +21,25 @@ private static String value(int key) {
       public CountMap(int size) {
         this.size = size < 0 ? 0 : size;
       }
    -  @Override
    -  public String get(Object key) {
    +  @Override public String get(Object key) {
         return value((Integer)key);
       }
       private static class Entry
       implements Map.Entry {
         int index;
         Entry(int index) { this.index = index; }
    -    @Override
    -    public boolean equals(Object o) {
    +    @Override   public boolean equals(Object o) {
           return o instanceof Entry &&
             Objects.equals(index, ((Entry)o).index);
         }
    -    @Override
    -    public Integer getKey() { return index; }
    -    @Override
    -    public String getValue() {
    +    @Override public Integer getKey() { return index; }
    +    @Override public String getValue() {
           return value(index);
         }
    -    @Override
    -    public String setValue(String value) {
    +    @Override public String setValue(String value) {
           throw new UnsupportedOperationException();
         }
    -    @Override
    -    public int hashCode() {
    +    @Override public int hashCode() {
           return Objects.hashCode(index);
         }
       }
    diff --git a/onjava/CountingIntegerList.java b/onjava/CountingIntegerList.java
    index 7d5d4f79b..d7f73a1b5 100644
    --- a/onjava/CountingIntegerList.java
    +++ b/onjava/CountingIntegerList.java
    @@ -1,5 +1,5 @@
     // onjava/CountingIntegerList.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // List of any length, containing sample data
    @@ -14,12 +14,10 @@ public class CountingIntegerList
       public CountingIntegerList(int size) {
         this.size = size < 0 ? 0 : size;
       }
    -  @Override
    -  public Integer get(int index) {
    +  @Override public Integer get(int index) {
         return index;
       }
    -  @Override
    -  public int size() { return size; }
    +  @Override public int size() { return size; }
       public static void main(String[] args) {
         List cil =
           new CountingIntegerList(30);
    diff --git a/onjava/Countries.java b/onjava/Countries.java
    index ec42b5922..13764b647 100644
    --- a/onjava/Countries.java
    +++ b/onjava/Countries.java
    @@ -1,5 +1,5 @@
     // onjava/Countries.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // "Flyweight" Maps and Lists of sample data
    @@ -218,23 +218,19 @@ private static class Entry
         implements Map.Entry {
           int index;
           Entry(int index) { this.index = index; }
    -      @Override
    -      public boolean equals(Object o) {
    +      @Override public boolean equals(Object o) {
             return o instanceof FlyweightMap &&
               Objects.equals(DATA[index][0], o);
           }
    -      @Override
    -      public int hashCode() {
    +      @Override public int hashCode() {
             return Objects.hashCode(DATA[index][0]);
           }
           @Override
           public String getKey() { return DATA[index][0]; }
    -      @Override
    -      public String getValue() {
    +      @Override public String getValue() {
             return DATA[index][1];
           }
    -      @Override
    -      public String setValue(String value) {
    +      @Override public String setValue(String value) {
             throw new UnsupportedOperationException();
           }
         }
    @@ -251,14 +247,12 @@ else if(size > DATA.length)
             else
               this.size = size;
           }
    -      @Override
    -      public int size() { return size; }
    +      @Override public int size() { return size; }
           private class Iter
           implements Iterator> {
             // Only one Entry object per Iterator:
             private Entry entry = new Entry(-1);
    -        @Override
    -        public boolean hasNext() {
    +        @Override public boolean hasNext() {
               return entry.index < size - 1;
             }
             @Override
    @@ -266,13 +260,11 @@ public Map.Entry next() {
               entry.index++;
               return entry;
             }
    -        @Override
    -        public void remove() {
    +        @Override public void remove() {
               throw new UnsupportedOperationException();
             }
           }
    -      @Override
    -      public
    +      @Override public
           Iterator> iterator() {
             return new Iter();
           }
    diff --git a/onjava/Enums.java b/onjava/Enums.java
    index 0440802f9..2af4b0840 100644
    --- a/onjava/Enums.java
    +++ b/onjava/Enums.java
    @@ -1,5 +1,5 @@
     // onjava/Enums.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package onjava;
    diff --git a/onjava/FillMap.java b/onjava/FillMap.java
    index eadc5495e..4f1650d52 100644
    --- a/onjava/FillMap.java
    +++ b/onjava/FillMap.java
    @@ -1,5 +1,5 @@
     // onjava/FillMap.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package onjava;
    diff --git a/onjava/HTMLColors.java b/onjava/HTMLColors.java
    index bdc3458f0..7a6421546 100644
    --- a/onjava/HTMLColors.java
    +++ b/onjava/HTMLColors.java
    @@ -1,5 +1,5 @@
     // onjava/HTMLColors.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Sample data for collection examples
    diff --git a/onjava/MouseClick.java b/onjava/MouseClick.java
    index 70d982f76..1bfa28e95 100644
    --- a/onjava/MouseClick.java
    +++ b/onjava/MouseClick.java
    @@ -1,5 +1,5 @@
     // onjava/MouseClick.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Helper interface to allow lambda expressions
    diff --git a/onjava/Nap.java b/onjava/Nap.java
    index 2b89745b1..264d7e69d 100644
    --- a/onjava/Nap.java
    +++ b/onjava/Nap.java
    @@ -1,5 +1,5 @@
     // onjava/Nap.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package onjava;
    diff --git a/onjava/Null.java b/onjava/Null.java
    index f3bb70d69..9dfae5f2f 100644
    --- a/onjava/Null.java
    +++ b/onjava/Null.java
    @@ -1,5 +1,5 @@
     // onjava/Null.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package onjava;
    diff --git a/onjava/OSExecute.java b/onjava/OSExecute.java
    index 25ac7f0ce..918f67e77 100644
    --- a/onjava/OSExecute.java
    +++ b/onjava/OSExecute.java
    @@ -1,5 +1,5 @@
     // onjava/OSExecute.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Run an operating system command
    diff --git a/onjava/OSExecuteException.java b/onjava/OSExecuteException.java
    index 17d803e15..1bf097b89 100644
    --- a/onjava/OSExecuteException.java
    +++ b/onjava/OSExecuteException.java
    @@ -1,5 +1,5 @@
     // onjava/OSExecuteException.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package onjava;
    diff --git a/onjava/Operations.java b/onjava/Operations.java
    index 33b644c65..0f935c365 100644
    --- a/onjava/Operations.java
    +++ b/onjava/Operations.java
    @@ -1,5 +1,5 @@
     // onjava/Operations.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package onjava;
    diff --git a/onjava/Pair.java b/onjava/Pair.java
    index 784ef8ac4..6dce28e3e 100644
    --- a/onjava/Pair.java
    +++ b/onjava/Pair.java
    @@ -1,5 +1,5 @@
     // onjava/Pair.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package onjava;
    diff --git a/onjava/ProcessFiles.java b/onjava/ProcessFiles.java
    index edcea73a0..af9d5e2e8 100644
    --- a/onjava/ProcessFiles.java
    +++ b/onjava/ProcessFiles.java
    @@ -1,5 +1,5 @@
     // onjava/ProcessFiles.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package onjava;
    diff --git a/onjava/Rand.java b/onjava/Rand.java
    index d21c0e2b2..1a589302e 100644
    --- a/onjava/Rand.java
    +++ b/onjava/Rand.java
    @@ -1,5 +1,5 @@
     // onjava/Rand.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Generate random values of different types
    @@ -13,8 +13,7 @@ public interface Rand {
       class Boolean
       implements Supplier {
         SplittableRandom r = new SplittableRandom(47);
    -    @Override
    -    public java.lang.Boolean get() {
    +    @Override public java.lang.Boolean get() {
           return r.nextBoolean();
         }
         public java.lang.Boolean get(int n) {
    @@ -35,8 +34,7 @@ public boolean[] array(int sz) {
       class Byte
       implements Supplier {
         SplittableRandom r = new SplittableRandom(47);
    -    @Override
    -    public java.lang.Byte get() {
    +    @Override public java.lang.Byte get() {
           return (byte)r.nextInt(MOD);
         }
         public java.lang.Byte get(int n) {
    @@ -57,8 +55,7 @@ public byte[] array(int sz) {
       class Character
       implements Supplier {
         SplittableRandom r = new SplittableRandom(47);
    -    @Override
    -    public java.lang.Character get() {
    +    @Override public java.lang.Character get() {
           return (char)r.nextInt('a', 'z' + 1);
         }
         public java.lang.Character get(int n) {
    @@ -79,8 +76,7 @@ public char[] array(int sz) {
       class Short
       implements Supplier {
         SplittableRandom r = new SplittableRandom(47);
    -    @Override
    -    public java.lang.Short get() {
    +    @Override public java.lang.Short get() {
           return (short)r.nextInt(MOD);
         }
         public java.lang.Short get(int n) {
    @@ -101,8 +97,7 @@ public short[] array(int sz) {
       class Integer
       implements Supplier {
         SplittableRandom r = new SplittableRandom(47);
    -    @Override
    -    public java.lang.Integer get() {
    +    @Override public java.lang.Integer get() {
           return r.nextInt(MOD);
         }
         public java.lang.Integer get(int n) {
    @@ -119,8 +114,7 @@ public java.lang.Integer[] array(int sz) {
       }
       class Pint implements IntSupplier {
         SplittableRandom r = new SplittableRandom(47);
    -    @Override
    -    public int getAsInt() {
    +    @Override public int getAsInt() {
           return r.nextInt(MOD);
         }
         public int get(int n) { return getAsInt(); }
    @@ -131,8 +125,7 @@ public int[] array(int sz) {
       class Long
       implements Supplier {
         SplittableRandom r = new SplittableRandom(47);
    -    @Override
    -    public java.lang.Long get() {
    +    @Override public java.lang.Long get() {
           return r.nextLong(MOD);
         }
         public java.lang.Long get(int n) {
    @@ -149,8 +142,7 @@ public java.lang.Long[] array(int sz) {
       }
       class Plong implements LongSupplier {
         SplittableRandom r = new SplittableRandom(47);
    -    @Override
    -    public long getAsLong() {
    +    @Override public long getAsLong() {
           return r.nextLong(MOD);
         }
         public long get(int n) { return getAsLong(); }
    @@ -161,8 +153,7 @@ public long[] array(int sz) {
       class Float
       implements Supplier {
         SplittableRandom r = new SplittableRandom(47);
    -    @Override
    -    public java.lang.Float get() {
    +    @Override public java.lang.Float get() {
           return (float)trim(r.nextDouble());
         }
         public java.lang.Float get(int n) {
    @@ -187,8 +178,7 @@ static double trim(double d) {
       class Double
       implements Supplier {
         SplittableRandom r = new SplittableRandom(47);
    -    @Override
    -    public java.lang.Double get() {
    +    @Override public java.lang.Double get() {
           return trim(r.nextDouble());
         }
         public java.lang.Double get(int n) {
    @@ -206,8 +196,7 @@ public java.lang.Double[] array(int sz) {
       }
       class Pdouble implements DoubleSupplier {
         SplittableRandom r = new SplittableRandom(47);
    -    @Override
    -    public double getAsDouble() {
    +    @Override public double getAsDouble() {
           return trim(r.nextDouble());
         }
         public double get(int n) {
    @@ -228,8 +217,7 @@ public String() {}
         public String(int strLength) {
           strlen = strLength;
         }
    -    @Override
    -    public java.lang.String get() {
    +    @Override public java.lang.String get() {
           return r.ints(strlen, 'a', 'z' + 1)
             .collect(StringBuilder::new,
                      StringBuilder::appendCodePoint,
    diff --git a/onjava/Range.java b/onjava/Range.java
    index e075c9ba9..ee43244f4 100644
    --- a/onjava/Range.java
    +++ b/onjava/Range.java
    @@ -1,5 +1,5 @@
     // onjava/Range.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Array creation methods that can be used without
    diff --git a/onjava/Repeat.java b/onjava/Repeat.java
    index 7ab61facf..11f4cacd8 100644
    --- a/onjava/Repeat.java
    +++ b/onjava/Repeat.java
    @@ -1,5 +1,5 @@
     // onjava/Repeat.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package onjava;
    diff --git a/onjava/RmDir.java b/onjava/RmDir.java
    index be7ea4940..fa6d1a5e9 100644
    --- a/onjava/RmDir.java
    +++ b/onjava/RmDir.java
    @@ -1,5 +1,5 @@
     // onjava/RmDir.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package onjava;
    @@ -12,15 +12,13 @@ public static void rmdir(Path dir)
       throws IOException {
         Files.walkFileTree(dir,
           new SimpleFileVisitor() {
    -      @Override
    -      public FileVisitResult
    +      @Override public FileVisitResult
           visitFile(Path file, BasicFileAttributes attrs)
           throws IOException {
             Files.delete(file);
             return FileVisitResult.CONTINUE;
           }
    -      @Override
    -      public FileVisitResult
    +      @Override public FileVisitResult
           postVisitDirectory(Path dir, IOException exc)
           throws IOException {
             Files.delete(dir);
    diff --git a/onjava/Sets.java b/onjava/Sets.java
    index 62258f155..542f5bb30 100644
    --- a/onjava/Sets.java
    +++ b/onjava/Sets.java
    @@ -1,5 +1,5 @@
     // onjava/Sets.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package onjava;
    diff --git a/onjava/Stack.java b/onjava/Stack.java
    index a51081768..97dc454fa 100644
    --- a/onjava/Stack.java
    +++ b/onjava/Stack.java
    @@ -1,5 +1,5 @@
     // onjava/Stack.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // A Stack class built with an ArrayDeque
    @@ -13,8 +13,7 @@ public class Stack {
       public T peek() { return storage.peek(); }
       public T pop() { return storage.pop(); }
       public boolean isEmpty() { return storage.isEmpty(); }
    -  @Override
    -  public String toString() {
    +  @Override public String toString() {
         return storage.toString();
       }
     }
    diff --git a/onjava/Suppliers.java b/onjava/Suppliers.java
    index 226a70cb5..05ceafab2 100644
    --- a/onjava/Suppliers.java
    +++ b/onjava/Suppliers.java
    @@ -1,5 +1,5 @@
     // onjava/Suppliers.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // A utility to use with Suppliers
    diff --git a/onjava/TimedAbort.java b/onjava/TimedAbort.java
    index 3715cf2ee..b9ebeaf89 100644
    --- a/onjava/TimedAbort.java
    +++ b/onjava/TimedAbort.java
    @@ -1,5 +1,5 @@
     // onjava/TimedAbort.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Terminate a program after t seconds
    diff --git a/onjava/Timer.java b/onjava/Timer.java
    index a695f79fa..44a24faed 100644
    --- a/onjava/Timer.java
    +++ b/onjava/Timer.java
    @@ -1,5 +1,5 @@
     // onjava/Timer.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package onjava;
    diff --git a/onjava/Tuple.java b/onjava/Tuple.java
    index 73cfaa3ce..d1d9b80cd 100644
    --- a/onjava/Tuple.java
    +++ b/onjava/Tuple.java
    @@ -1,5 +1,5 @@
     // onjava/Tuple.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Tuple library using type argument inference
    diff --git a/onjava/Tuple2.java b/onjava/Tuple2.java
    index 7ca8d1994..3e2874a90 100644
    --- a/onjava/Tuple2.java
    +++ b/onjava/Tuple2.java
    @@ -1,5 +1,5 @@
     // onjava/Tuple2.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package onjava;
    @@ -9,8 +9,7 @@ public class Tuple2 {
       public final B a2;
       public Tuple2(A a, B b) { a1 = a; a2 = b; }
       public String rep() { return  a1 + ", " + a2; }
    -  @Override
    -  public String toString() {
    +  @Override public String toString() {
         return "(" + rep() + ")";
       }
     }
    diff --git a/onjava/Tuple3.java b/onjava/Tuple3.java
    index 26780642c..117f4b668 100644
    --- a/onjava/Tuple3.java
    +++ b/onjava/Tuple3.java
    @@ -1,5 +1,5 @@
     // onjava/Tuple3.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package onjava;
    @@ -10,8 +10,7 @@ public Tuple3(A a, B b, C c) {
         super(a, b);
         a3 = c;
       }
    -  @Override
    -  public String rep() {
    +  @Override public String rep() {
         return super.rep() + ", " + a3;
       }
     }
    diff --git a/onjava/Tuple4.java b/onjava/Tuple4.java
    index 5ab51dc98..1a62db093 100644
    --- a/onjava/Tuple4.java
    +++ b/onjava/Tuple4.java
    @@ -1,5 +1,5 @@
     // onjava/Tuple4.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package onjava;
    @@ -11,8 +11,7 @@ public Tuple4(A a, B b, C c, D d) {
         super(a, b, c);
         a4 = d;
       }
    -  @Override
    -  public String rep() {
    +  @Override public String rep() {
         return super.rep() + ", " + a4;
       }
     }
    diff --git a/onjava/Tuple5.java b/onjava/Tuple5.java
    index 1df88bfdc..85a3d2d06 100644
    --- a/onjava/Tuple5.java
    +++ b/onjava/Tuple5.java
    @@ -1,5 +1,5 @@
     // onjava/Tuple5.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package onjava;
    @@ -11,8 +11,7 @@ public Tuple5(A a, B b, C c, D d, E e) {
         super(a, b, c, d);
         a5 = e;
       }
    -  @Override
    -  public String rep() {
    +  @Override public String rep() {
         return super.rep() + ", " + a5;
       }
     }
    diff --git a/onjava/TypeCounter.java b/onjava/TypeCounter.java
    index d8b262b72..6e89067bc 100644
    --- a/onjava/TypeCounter.java
    +++ b/onjava/TypeCounter.java
    @@ -1,5 +1,5 @@
     // onjava/TypeCounter.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Counts instances of a type family
    @@ -26,11 +26,11 @@ private void countClass(Class type) {
         put(type, quantity == null ? 1 : quantity + 1);
         Class superClass = type.getSuperclass();
         if(superClass != null &&
    -       baseType.isAssignableFrom(superClass))
    +       baseType.isAssignableFrom(superClass)) {
           countClass(superClass);
    +    }
       }
    -  @Override
    -  public String toString() {
    +  @Override public String toString() {
         String result = entrySet().stream()
           .map(pair -> String.format("%s=%s",
             pair.getKey().getSimpleName(),
    diff --git a/onjava/atunit/AtUnit.java b/onjava/atunit/AtUnit.java
    index b1688cbda..7288c2f4b 100644
    --- a/onjava/atunit/AtUnit.java
    +++ b/onjava/atunit/AtUnit.java
    @@ -1,5 +1,5 @@
     // onjava/atunit/AtUnit.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // An annotation-based unit-test framework
    @@ -33,8 +33,7 @@ public class AtUnit implements ProcessFiles.Strategy {
             System.out.println("  " + failed);
         }
       }
    -  @Override
    -  public void process(File cFile) {
    +  @Override public void process(File cFile) {
         try {
           String cName = ClassNameFinder.thisClass(
             Files.readAllBytes(cFile.toPath()));
    diff --git a/onjava/atunit/ClassNameFinder.java b/onjava/atunit/ClassNameFinder.java
    index 3fef7faff..315a44c5f 100644
    --- a/onjava/atunit/ClassNameFinder.java
    +++ b/onjava/atunit/ClassNameFinder.java
    @@ -1,5 +1,5 @@
     // onjava/atunit/ClassNameFinder.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // {java onjava.atunit.ClassNameFinder}
    diff --git a/onjava/atunit/Test.java b/onjava/atunit/Test.java
    index 314dce9b3..ff7b10b9d 100644
    --- a/onjava/atunit/Test.java
    +++ b/onjava/atunit/Test.java
    @@ -1,5 +1,5 @@
     // onjava/atunit/Test.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // The @Test tag
    diff --git a/onjava/atunit/TestObjectCleanup.java b/onjava/atunit/TestObjectCleanup.java
    index 522311778..c15a0e1a1 100644
    --- a/onjava/atunit/TestObjectCleanup.java
    +++ b/onjava/atunit/TestObjectCleanup.java
    @@ -1,5 +1,5 @@
     // onjava/atunit/TestObjectCleanup.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // The @Unit @TestObjectCleanup tag
    diff --git a/onjava/atunit/TestObjectCreate.java b/onjava/atunit/TestObjectCreate.java
    index f8b43a09d..58cf17f9c 100644
    --- a/onjava/atunit/TestObjectCreate.java
    +++ b/onjava/atunit/TestObjectCreate.java
    @@ -1,5 +1,5 @@
     // onjava/atunit/TestObjectCreate.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // The @Unit @TestObjectCreate tag
    diff --git a/onjava/atunit/TestProperty.java b/onjava/atunit/TestProperty.java
    index 4e09cf95d..bbb685adb 100644
    --- a/onjava/atunit/TestProperty.java
    +++ b/onjava/atunit/TestProperty.java
    @@ -1,5 +1,5 @@
     // onjava/atunit/TestProperty.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // The @Unit @TestProperty tag
    diff --git a/operators/AllOps.java b/operators/AllOps.java
    index bb94e8709..3a559a7d9 100644
    --- a/operators/AllOps.java
    +++ b/operators/AllOps.java
    @@ -1,5 +1,5 @@
     // operators/AllOps.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Tests all operators on all primitive data types
    diff --git a/operators/Assignment.java b/operators/Assignment.java
    index 7a573a392..c4b9a793e 100644
    --- a/operators/Assignment.java
    +++ b/operators/Assignment.java
    @@ -1,5 +1,5 @@
     // operators/Assignment.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Assignment with objects is a bit tricky
    diff --git a/operators/AutoInc.java b/operators/AutoInc.java
    index 835875de6..d018f90a8 100644
    --- a/operators/AutoInc.java
    +++ b/operators/AutoInc.java
    @@ -1,5 +1,5 @@
     // operators/AutoInc.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Demonstrates the ++ and -- operators
    diff --git a/operators/BitManipulation.java b/operators/BitManipulation.java
    index dc30c4428..80c64c93b 100644
    --- a/operators/BitManipulation.java
    +++ b/operators/BitManipulation.java
    @@ -1,5 +1,5 @@
     // operators/BitManipulation.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Using the bitwise operators
    diff --git a/operators/Bool.java b/operators/Bool.java
    index e9984adb7..42668315b 100644
    --- a/operators/Bool.java
    +++ b/operators/Bool.java
    @@ -1,5 +1,5 @@
     // operators/Bool.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Relational and logical operators
    diff --git a/operators/Casting.java b/operators/Casting.java
    index 337b24fd8..22b2b221c 100644
    --- a/operators/Casting.java
    +++ b/operators/Casting.java
    @@ -1,5 +1,5 @@
     // operators/Casting.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
    diff --git a/operators/CastingNumbers.java b/operators/CastingNumbers.java
    index a6c04c6ea..007dc4e2c 100644
    --- a/operators/CastingNumbers.java
    +++ b/operators/CastingNumbers.java
    @@ -1,5 +1,5 @@
     // operators/CastingNumbers.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // What happens when you cast a float
    diff --git a/operators/EqualsMethod.java b/operators/EqualsMethod.java
    index f55b1b579..7915f7def 100644
    --- a/operators/EqualsMethod.java
    +++ b/operators/EqualsMethod.java
    @@ -1,5 +1,5 @@
     // operators/EqualsMethod.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
    diff --git a/operators/EqualsMethod2.java b/operators/EqualsMethod2.java
    index 213930602..75ff42c5e 100644
    --- a/operators/EqualsMethod2.java
    +++ b/operators/EqualsMethod2.java
    @@ -1,5 +1,5 @@
     // operators/EqualsMethod2.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Default equals() does not compare contents
    diff --git a/operators/Equivalence.java b/operators/Equivalence.java
    index cef07d646..603ef6316 100644
    --- a/operators/Equivalence.java
    +++ b/operators/Equivalence.java
    @@ -1,5 +1,5 @@
     // operators/Equivalence.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
    diff --git a/operators/Exponents.java b/operators/Exponents.java
    index 924340dfb..8578aee51 100644
    --- a/operators/Exponents.java
    +++ b/operators/Exponents.java
    @@ -1,5 +1,5 @@
     // operators/Exponents.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // "e" means "10 to the power."
    diff --git a/operators/Literals.java b/operators/Literals.java
    index ad00e0b8f..3f2eef058 100644
    --- a/operators/Literals.java
    +++ b/operators/Literals.java
    @@ -1,5 +1,5 @@
     // operators/Literals.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
    diff --git a/operators/MathOps.java b/operators/MathOps.java
    index a9b089382..125b312b8 100644
    --- a/operators/MathOps.java
    +++ b/operators/MathOps.java
    @@ -1,5 +1,5 @@
     // operators/MathOps.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // The mathematical operators
    diff --git a/operators/Overflow.java b/operators/Overflow.java
    index 851c1456b..68e494490 100644
    --- a/operators/Overflow.java
    +++ b/operators/Overflow.java
    @@ -1,5 +1,5 @@
     // operators/Overflow.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Surprise! Java lets you overflow
    diff --git a/operators/PassObject.java b/operators/PassObject.java
    index af53ab566..698771a8d 100644
    --- a/operators/PassObject.java
    +++ b/operators/PassObject.java
    @@ -1,5 +1,5 @@
     // operators/PassObject.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Passing objects to methods might not be
    diff --git a/operators/Precedence.java b/operators/Precedence.java
    index f0f8140cd..e6dcc549c 100644
    --- a/operators/Precedence.java
    +++ b/operators/Precedence.java
    @@ -1,5 +1,5 @@
     // operators/Precedence.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
    diff --git a/operators/RoundingNumbers.java b/operators/RoundingNumbers.java
    index e46a20561..e7396c113 100644
    --- a/operators/RoundingNumbers.java
    +++ b/operators/RoundingNumbers.java
    @@ -1,5 +1,5 @@
     // operators/RoundingNumbers.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Rounding floats and doubles
    diff --git a/operators/ShortCircuit.java b/operators/ShortCircuit.java
    index 8fc96711e..8e611d469 100644
    --- a/operators/ShortCircuit.java
    +++ b/operators/ShortCircuit.java
    @@ -1,5 +1,5 @@
     // operators/ShortCircuit.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Short-circuiting behavior with logical operators
    diff --git a/operators/StringOperators.java b/operators/StringOperators.java
    index b1eb211fb..c83387f9e 100644
    --- a/operators/StringOperators.java
    +++ b/operators/StringOperators.java
    @@ -1,5 +1,5 @@
     // operators/StringOperators.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
    diff --git a/operators/TernaryIfElse.java b/operators/TernaryIfElse.java
    index d11d4e24c..51455aa74 100644
    --- a/operators/TernaryIfElse.java
    +++ b/operators/TernaryIfElse.java
    @@ -1,5 +1,5 @@
     // operators/TernaryIfElse.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
    diff --git a/operators/URShift.java b/operators/URShift.java
    index 8d24f94b5..d1bcc4f09 100644
    --- a/operators/URShift.java
    +++ b/operators/URShift.java
    @@ -1,5 +1,5 @@
     // operators/URShift.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Test of unsigned right shift
    diff --git a/operators/Underscores.java b/operators/Underscores.java
    index 4d78cd503..fa1394893 100644
    --- a/operators/Underscores.java
    +++ b/operators/Underscores.java
    @@ -1,5 +1,5 @@
     // operators/Underscores.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
    @@ -9,7 +9,7 @@ public static void main(String[] args) {
         System.out.println(d);
         int bin = 0b0010_1111_1010_1111_1010_1111_1010_1111;
         System.out.println(Integer.toBinaryString(bin));
    -    System.out.printf("%x%n", bin);  // [1]
    +    System.out.printf("%x%n", bin);               // [1]
         long hex = 0x7f_e9_b7_aa;
         System.out.printf("%x%n", hex);
       }
    diff --git a/patterns/BoxObserver.java b/patterns/BoxObserver.java
    index c6f9ec65d..db25c5ea2 100644
    --- a/patterns/BoxObserver.java
    +++ b/patterns/BoxObserver.java
    @@ -1,5 +1,5 @@
     // patterns/BoxObserver.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Demonstration of Observer pattern using
    @@ -72,8 +72,7 @@ static Color newColor() {
         addMouseListener((MouseClick)
           e -> notifier.notifyObservers(OCBox.this));
       }
    -  @Override
    -  public void paintComponent(Graphics g) {
    +  @Override public void paintComponent(Graphics g) {
         super.paintComponent(g);
         g.setColor(cColor);
         Dimension s = getSize();
    diff --git a/patterns/CommandPattern.java b/patterns/CommandPattern.java
    index f84533aa9..1a9612247 100644
    --- a/patterns/CommandPattern.java
    +++ b/patterns/CommandPattern.java
    @@ -1,5 +1,5 @@
     // patterns/CommandPattern.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    diff --git a/patterns/Facade.java b/patterns/Facade.java
    index 0c1accf27..e290cff43 100644
    --- a/patterns/Facade.java
    +++ b/patterns/Facade.java
    @@ -1,5 +1,5 @@
     // patterns/Facade.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
    diff --git a/patterns/PaperScissorsRock.java b/patterns/PaperScissorsRock.java
    index e7a7c44e8..54063d6c7 100644
    --- a/patterns/PaperScissorsRock.java
    +++ b/patterns/PaperScissorsRock.java
    @@ -1,5 +1,5 @@
     // patterns/PaperScissorsRock.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Demonstration of multiple dispatching
    @@ -19,66 +19,57 @@ interface Item {
     }
     
     class Paper implements Item {
    -  @Override
    -  public Outcome compete(Item it) {
    +  @Override public Outcome compete(Item it) {
         return it.eval(this);
       }
    -  @Override
    -  public Outcome eval(Paper p) {
    +  @Override public Outcome eval(Paper p) {
         return Outcome.DRAW;
       }
    -  @Override
    -  public Outcome eval(Scissors s) {
    +  @Override public Outcome eval(Scissors s) {
         return Outcome.WIN;
       }
    -  @Override
    -  public Outcome eval(Rock r) {
    +  @Override public Outcome eval(Rock r) {
         return Outcome.LOSE;
       }
    -  @Override
    -  public String toString() { return "Paper"; }
    +  @Override public String toString() {
    +    return "Paper";
    +  }
     }
     
     class Scissors implements Item {
    -  @Override
    -  public Outcome compete(Item it) {
    +  @Override public Outcome compete(Item it) {
         return it.eval(this);
       }
    -  @Override
    -  public Outcome eval(Paper p) {
    +  @Override public Outcome eval(Paper p) {
         return Outcome.LOSE;
       }
    -  @Override
    -  public Outcome eval(Scissors s) {
    +  @Override public Outcome eval(Scissors s) {
         return Outcome.DRAW;
       }
    -  @Override
    -  public Outcome eval(Rock r) {
    +  @Override public Outcome eval(Rock r) {
         return Outcome.WIN;
       }
    -  @Override
    -  public String toString() { return "Scissors"; }
    +  @Override public String toString() {
    +    return "Scissors";
    +  }
     }
     
     class Rock implements Item {
    -  @Override
    -  public Outcome compete(Item it) {
    +  @Override public Outcome compete(Item it) {
         return it.eval(this);
       }
    -  @Override
    -  public Outcome eval(Paper p) {
    +  @Override public Outcome eval(Paper p) {
         return Outcome.WIN;
       }
    -  @Override
    -  public Outcome eval(Scissors s) {
    +  @Override public Outcome eval(Scissors s) {
         return Outcome.LOSE;
       }
    -  @Override
    -  public Outcome eval(Rock r) {
    +  @Override public Outcome eval(Rock r) {
         return Outcome.DRAW;
       }
    -  @Override
    -  public String toString() { return "Rock"; }
    +  @Override public String toString() {
    +    return "Rock";
    +  }
     }
     
     class ItemFactory {
    diff --git a/patterns/ProxyDemo.java b/patterns/ProxyDemo.java
    index 58b0e3a8f..011fbe7ec 100644
    --- a/patterns/ProxyDemo.java
    +++ b/patterns/ProxyDemo.java
    @@ -1,5 +1,5 @@
     // patterns/ProxyDemo.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Simple demonstration of the Proxy pattern
    @@ -25,13 +25,13 @@ class Proxy implements ProxyBase {
     }
     
     class Implementation implements ProxyBase {
    -  public void f() {
    +  @Override public void f() {
         System.out.println("Implementation.f()");
       }
    -  public void g() {
    +  @Override public void g() {
         System.out.println("Implementation.g()");
       }
    -  public void h() {
    +  @Override public void h() {
         System.out.println("Implementation.h()");
       }
     }
    diff --git a/patterns/ShapeFactory1.java b/patterns/ShapeFactory1.java
    index dc6f86907..950c97c55 100644
    --- a/patterns/ShapeFactory1.java
    +++ b/patterns/ShapeFactory1.java
    @@ -1,5 +1,5 @@
     // patterns/ShapeFactory1.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // A simple static factory method
    @@ -8,7 +8,7 @@
     import patterns.shapes.*;
     
     public class ShapeFactory1 implements FactoryMethod {
    -  public Shape create(String type) {
    +  @Override public Shape create(String type) {
         switch(type) {
           case "Circle": return new Circle();
           case "Square": return new Square();
    diff --git a/patterns/ShapeFactory2.java b/patterns/ShapeFactory2.java
    index 238811052..e8206ba2f 100644
    --- a/patterns/ShapeFactory2.java
    +++ b/patterns/ShapeFactory2.java
    @@ -1,5 +1,5 @@
     // patterns/ShapeFactory2.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    @@ -20,7 +20,7 @@ static Constructor load(String id) {
           throw new BadShapeCreation(id);
         }
       }
    -  public Shape create(String id) {
    +  @Override public Shape create(String id) {
         try {
           return (Shape)factories
             .computeIfAbsent(id, ShapeFactory2::load)
    diff --git a/patterns/ShapeFactory3.java b/patterns/ShapeFactory3.java
    index b735a81d0..fdf7b2700 100644
    --- a/patterns/ShapeFactory3.java
    +++ b/patterns/ShapeFactory3.java
    @@ -1,5 +1,5 @@
     // patterns/ShapeFactory3.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Polymorphic factory methods
    @@ -18,7 +18,7 @@ class RandomShapes implements Supplier {
       RandomShapes(PolymorphicFactory... factories) {
         this.factories = factories;
       }
    -  public Shape get() {
    +  @Override public Shape get() {
         return factories[
           rand.nextInt(factories.length)].create();
       }
    diff --git a/patterns/SingletonPattern.java b/patterns/SingletonPattern.java
    index c2ca1a5f5..2ff8de0d5 100644
    --- a/patterns/SingletonPattern.java
    +++ b/patterns/SingletonPattern.java
    @@ -1,5 +1,5 @@
     // patterns/SingletonPattern.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
    @@ -21,9 +21,11 @@ final class Singleton {
         private ResourceImpl(int i) {
           this.i = i;
         }
    +    @Override
         public synchronized int getValue() {
           return i;
         }
    +    @Override
         public synchronized void setValue(int x) {
           i = x;
         }
    diff --git a/patterns/StateDemo.java b/patterns/StateDemo.java
    index 9efab5b4e..0a564bfa2 100644
    --- a/patterns/StateDemo.java
    +++ b/patterns/StateDemo.java
    @@ -1,5 +1,5 @@
     // patterns/StateDemo.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Simple demonstration of the State pattern
    @@ -30,16 +30,13 @@ public void changeImp(StateBase newImp) {
     }
     
     class Implementation1 implements StateBase {
    -  @Override
    -  public void f() {
    +  @Override public void f() {
         System.out.println("Implementation1.f()");
       }
    -  @Override
    -  public void g() {
    +  @Override public void g() {
         System.out.println("Implementation1.g()");
       }
    -  @Override
    -  public void h() {
    +  @Override public void h() {
         System.out.println("Implementation1.h()");
       }
       @Override
    @@ -47,16 +44,13 @@ public void changeImp(StateBase newImp) {}
     }
     
     class Implementation2 implements StateBase {
    -  @Override
    -  public void f() {
    +  @Override public void f() {
         System.out.println("Implementation2.f()");
       }
    -  @Override
    -  public void g() {
    +  @Override public void g() {
         System.out.println("Implementation2.g()");
       }
    -  @Override
    -  public void h() {
    +  @Override public void h() {
         System.out.println("Implementation2.h()");
       }
       @Override
    diff --git a/patterns/TemplateMethod.java b/patterns/TemplateMethod.java
    index eff6d2790..2df6a3d4c 100644
    --- a/patterns/TemplateMethod.java
    +++ b/patterns/TemplateMethod.java
    @@ -1,5 +1,5 @@
     // patterns/TemplateMethod.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Simple demonstration of Template Method
    @@ -20,12 +20,10 @@ private void templateMethod() {
     
     // Create a new "application":
     class MyApp extends ApplicationFramework {
    -  @Override
    -  void customize1() {
    +  @Override void customize1() {
         System.out.print("Hello ");
       }
    -  @Override
    -  void customize2() {
    +  @Override void customize2() {
         System.out.println("World!");
       }
     }
    diff --git a/patterns/abstractfactory/GameEnvironment.java b/patterns/abstractfactory/GameEnvironment.java
    index 8c0abf7b3..a990562da 100644
    --- a/patterns/abstractfactory/GameEnvironment.java
    +++ b/patterns/abstractfactory/GameEnvironment.java
    @@ -1,5 +1,5 @@
     // patterns/abstractfactory/GameEnvironment.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // An example of the Abstract Factory pattern
    @@ -32,15 +32,13 @@ public void interactWith(Obstacle ob) {
     }
     
     class Puzzle implements Obstacle {
    -  @Override
    -  public void action() {
    +  @Override public void action() {
         System.out.println("Puzzle");
       }
     }
     
     class NastyWeapon implements Obstacle {
    -  @Override
    -  public void action() {
    +  @Override public void action() {
         System.out.println("NastyWeapon");
       }
     }
    diff --git a/patterns/adapt/Adapter.java b/patterns/adapt/Adapter.java
    index 5bfcd6bf5..0e847f365 100644
    --- a/patterns/adapt/Adapter.java
    +++ b/patterns/adapt/Adapter.java
    @@ -1,5 +1,5 @@
     // patterns/adapt/Adapter.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Variations on the Adapter pattern
    @@ -20,8 +20,7 @@ class ProxyAdapter implements WhatIWant {
       ProxyAdapter(WhatIHave wih) {
         whatIHave = wih;
       }
    -  @Override
    -  public void f() {
    +  @Override public void f() {
         // Implement behavior using
         // methods in WhatIHave:
         whatIHave.g();
    @@ -45,8 +44,7 @@ public void op(WhatIHave wih) {
     // Approach 3: build adapter into WhatIHave:
     class WhatIHave2 extends WhatIHave
     implements WhatIWant {
    -  @Override
    -  public void f() {
    +  @Override public void f() {
         g();
         h();
       }
    @@ -55,8 +53,7 @@ public void f() {
     // Approach 4: use an inner class:
     class WhatIHave3 extends WhatIHave {
       private class InnerAdapter implements WhatIWant{
    -    @Override
    -    public void f() {
    +    @Override public void f() {
           g();
           h();
         }
    diff --git a/patterns/chain/ChainOfResponsibility.java b/patterns/chain/ChainOfResponsibility.java
    index b733e71cc..737c3c205 100644
    --- a/patterns/chain/ChainOfResponsibility.java
    +++ b/patterns/chain/ChainOfResponsibility.java
    @@ -1,5 +1,5 @@
     // patterns/chain/ChainOfResponsibility.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Using the Functional interface
    diff --git a/patterns/doubledispatch/Aluminum.java b/patterns/doubledispatch/Aluminum.java
    index 5037fac56..f48a2077c 100644
    --- a/patterns/doubledispatch/Aluminum.java
    +++ b/patterns/doubledispatch/Aluminum.java
    @@ -1,5 +1,5 @@
     // patterns/doubledispatch/Aluminum.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Aluminum for double dispatching
    diff --git a/patterns/doubledispatch/Cardboard.java b/patterns/doubledispatch/Cardboard.java
    index 5046ddaa2..2150328f7 100644
    --- a/patterns/doubledispatch/Cardboard.java
    +++ b/patterns/doubledispatch/Cardboard.java
    @@ -1,5 +1,5 @@
     // patterns/doubledispatch/Cardboard.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Cardboard for double dispatching
    diff --git a/patterns/doubledispatch/DoubleDispatch.java b/patterns/doubledispatch/DoubleDispatch.java
    index 91bee562e..f65d26805 100644
    --- a/patterns/doubledispatch/DoubleDispatch.java
    +++ b/patterns/doubledispatch/DoubleDispatch.java
    @@ -1,5 +1,5 @@
     // patterns/doubledispatch/DoubleDispatch.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Using multiple dispatching to handle more
    @@ -10,29 +10,25 @@
     import java.util.*;
     
     class AluminumBin extends TypedBin {
    -  @Override
    -  public boolean add(Aluminum a) {
    +  @Override public boolean add(Aluminum a) {
         return addIt(a);
       }
     }
     
     class PaperBin extends TypedBin {
    -  @Override
    -  public boolean add(Paper a) {
    +  @Override public boolean add(Paper a) {
         return addIt(a);
       }
     }
     
     class GlassBin extends TypedBin {
    -  @Override
    -  public boolean add(Glass a) {
    +  @Override public boolean add(Glass a) {
         return addIt(a);
       }
     }
     
     class CardboardBin extends TypedBin {
    -  @Override
    -  public boolean add(Cardboard a) {
    +  @Override public boolean add(Cardboard a) {
         return addIt(a);
       }
     }
    diff --git a/patterns/doubledispatch/Glass.java b/patterns/doubledispatch/Glass.java
    index 79cf7fa26..0092652f0 100644
    --- a/patterns/doubledispatch/Glass.java
    +++ b/patterns/doubledispatch/Glass.java
    @@ -1,5 +1,5 @@
     // patterns/doubledispatch/Glass.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Glass for double dispatching
    diff --git a/patterns/doubledispatch/Paper.java b/patterns/doubledispatch/Paper.java
    index b542dfd64..67bb0fe3d 100644
    --- a/patterns/doubledispatch/Paper.java
    +++ b/patterns/doubledispatch/Paper.java
    @@ -1,5 +1,5 @@
     // patterns/doubledispatch/Paper.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Paper for double dispatching
    diff --git a/patterns/doubledispatch/TypedBin.java b/patterns/doubledispatch/TypedBin.java
    index 265874cc4..c730eda2d 100644
    --- a/patterns/doubledispatch/TypedBin.java
    +++ b/patterns/doubledispatch/TypedBin.java
    @@ -1,5 +1,5 @@
     // patterns/doubledispatch/TypedBin.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // A List that can grab the right type
    diff --git a/patterns/doubledispatch/TypedBinMember.java b/patterns/doubledispatch/TypedBinMember.java
    index c7ce960a9..17fe20641 100644
    --- a/patterns/doubledispatch/TypedBinMember.java
    +++ b/patterns/doubledispatch/TypedBinMember.java
    @@ -1,5 +1,5 @@
     // patterns/doubledispatch/TypedBinMember.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // An interface for adding the double dispatching
    diff --git a/patterns/dynatrash/DynaTrash.java b/patterns/dynatrash/DynaTrash.java
    index 6ce33d8f0..8e8d6ac27 100644
    --- a/patterns/dynatrash/DynaTrash.java
    +++ b/patterns/dynatrash/DynaTrash.java
    @@ -1,5 +1,5 @@
     // patterns/dynatrash/DynaTrash.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Using a Map of Lists and RTTI to automatically
    @@ -61,11 +61,11 @@ public static void main(String[] args) {
     weight of patterns.trash.Paper = 80.0
     weight of patterns.trash.Paper = 66.0
     ...________...________...________...________...
    -weight of patterns.trash.Aluminum = 81.0
    -weight of patterns.trash.Aluminum = 36.0
    -weight of patterns.trash.Aluminum = 93.0
    -weight of patterns.trash.Aluminum = 36.0
    -Total value = 860.0499778985977
    +weight of patterns.trash.Glass = 93.0
    +weight of patterns.trash.Glass = 36.0
    +weight of patterns.trash.Glass = 12.0
    +weight of patterns.trash.Glass = 60.0
    +Total value = 150.1900027245283
     weight of patterns.trash.Cardboard = 96.0
     weight of patterns.trash.Cardboard = 44.0
     weight of patterns.trash.Cardboard = 12.0
    diff --git a/patterns/observer/ObservedFlower.java b/patterns/observer/ObservedFlower.java
    index 009da63e3..a8c9bd006 100644
    --- a/patterns/observer/ObservedFlower.java
    +++ b/patterns/observer/ObservedFlower.java
    @@ -1,5 +1,5 @@
     // patterns/observer/ObservedFlower.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Demonstration of "Observer" pattern
    @@ -26,8 +26,7 @@ public void close() { // Closes its petals
         alreadyOpen = false;
       }
       class OpenNotifier extends Observable {
    -    @Override
    -    public void notifyObservers() {
    +    @Override public void notifyObservers() {
           if(isOpen && !alreadyOpen) {
             setChanged();
             super.notifyObservers();
    @@ -36,8 +35,7 @@ public void notifyObservers() {
         }
       }
       class CloseNotifier extends Observable{
    -    @Override
    -    public void notifyObservers() {
    +    @Override public void notifyObservers() {
           if(!isOpen && !alreadyClosed) {
             setChanged();
             super.notifyObservers();
    diff --git a/patterns/recyclea/RecycleA.java b/patterns/recyclea/RecycleA.java
    index a73f39e7f..184bc4b3a 100644
    --- a/patterns/recyclea/RecycleA.java
    +++ b/patterns/recyclea/RecycleA.java
    @@ -1,5 +1,5 @@
     // patterns/recyclea/RecycleA.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Recycling with RTTI
    @@ -34,8 +34,7 @@ static void sumValue(List bin) {
     class Aluminum extends Trash {
       static double val  = 1.67f;
       Aluminum(double wt) { super(wt); }
    -  @Override
    -  double value() { return val; }
    +  @Override double value() { return val; }
       static void value(double newval) {
         val = newval;
       }
    @@ -44,8 +43,7 @@ static void value(double newval) {
     class Paper extends Trash {
       static double val = 0.10f;
       Paper(double wt) { super(wt); }
    -  @Override
    -  double value() { return val; }
    +  @Override double value() { return val; }
       static void value(double newval) {
         val = newval;
       }
    @@ -54,8 +52,7 @@ static void value(double newval) {
     class Glass extends Trash {
       static double val = 0.23f;
       Glass(double wt) { super(wt); }
    -  @Override
    -  double value() { return val; }
    +  @Override double value() { return val; }
       static void value(double newval) {
         val = newval;
       }
    diff --git a/patterns/recycleb/RecycleB.java b/patterns/recycleb/RecycleB.java
    index 1ca38314d..25cb6d90e 100644
    --- a/patterns/recycleb/RecycleB.java
    +++ b/patterns/recycleb/RecycleB.java
    @@ -1,5 +1,5 @@
     // patterns/recycleb/RecycleB.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // {java patterns.recycleb.RecycleB}
    diff --git a/patterns/recyclec/RecycleC.java b/patterns/recyclec/RecycleC.java
    index 239e8e793..75dd4e5e2 100644
    --- a/patterns/recyclec/RecycleC.java
    +++ b/patterns/recyclec/RecycleC.java
    @@ -1,5 +1,5 @@
     // patterns/recyclec/RecycleC.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Adding more objects to the recycling problem
    @@ -26,14 +26,14 @@ boolean grab(Trash t) {
     }
     
     class TbinList
    -extends ArrayList> { // [1]
    +extends ArrayList> {        // [1]
       boolean sort(T t) {
         for(Tbin ts : this)
           if(ts.grab(t))
             return true;
         return false; // bin not found for t
       }
    -  void sortBin(Tbin bin) { // [2]
    +  void sortBin(Tbin bin) {                 // [2]
         for(T aBin : bin)
           if(!sort(aBin))
             System.err.println("Bin not found");
    @@ -50,10 +50,10 @@ public static void main(String[] args) {
         trashBins.add(new Tbin<>(Aluminum.class));
         trashBins.add(new Tbin<>(Paper.class));
         trashBins.add(new Tbin<>(Glass.class));
    -    // add one line here: [*3*]
    +    // add one line here:                     // [3]
         trashBins.add(new Tbin<>(Cardboard.class));
     
    -    trashBins.sortBin(bin); // [4]
    +    trashBins.sortBin(bin);                   // [4]
     
         trashBins.forEach(Trash::sumValue);
         Trash.sumValue(bin);
    diff --git a/patterns/shapes/BadShapeCreation.java b/patterns/shapes/BadShapeCreation.java
    index 2ebda8e52..52edcb692 100644
    --- a/patterns/shapes/BadShapeCreation.java
    +++ b/patterns/shapes/BadShapeCreation.java
    @@ -1,5 +1,5 @@
     // patterns/shapes/BadShapeCreation.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package patterns.shapes;
    diff --git a/patterns/shapes/Circle.java b/patterns/shapes/Circle.java
    index 461d55e29..3c05e664a 100644
    --- a/patterns/shapes/Circle.java
    +++ b/patterns/shapes/Circle.java
    @@ -1,5 +1,5 @@
     // patterns/shapes/Circle.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package patterns.shapes;
    diff --git a/patterns/shapes/FactoryMethod.java b/patterns/shapes/FactoryMethod.java
    index c3b22b1ff..9a4174a83 100644
    --- a/patterns/shapes/FactoryMethod.java
    +++ b/patterns/shapes/FactoryMethod.java
    @@ -1,5 +1,5 @@
     // patterns/shapes/FactoryMethod.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package patterns.shapes;
    diff --git a/patterns/shapes/FactoryTest.java b/patterns/shapes/FactoryTest.java
    index 301bb1abd..506d90360 100644
    --- a/patterns/shapes/FactoryTest.java
    +++ b/patterns/shapes/FactoryTest.java
    @@ -1,5 +1,5 @@
     // patterns/shapes/FactoryTest.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package patterns.shapes;
    diff --git a/patterns/shapes/Shape.java b/patterns/shapes/Shape.java
    index 12fdf3e77..38ce61440 100644
    --- a/patterns/shapes/Shape.java
    +++ b/patterns/shapes/Shape.java
    @@ -1,5 +1,5 @@
     // patterns/shapes/Shape.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package patterns.shapes;
    @@ -7,8 +7,7 @@
     public class Shape {
       private static int counter = 0;
       private int id = counter++;
    -  @Override
    -  public String toString() {
    +  @Override public String toString() {
         return
           getClass().getSimpleName() + "[" + id + "]";
       }
    diff --git a/patterns/shapes/Square.java b/patterns/shapes/Square.java
    index 610dd3e4c..91f879fa9 100644
    --- a/patterns/shapes/Square.java
    +++ b/patterns/shapes/Square.java
    @@ -1,5 +1,5 @@
     // patterns/shapes/Square.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package patterns.shapes;
    diff --git a/patterns/shapes/Triangle.java b/patterns/shapes/Triangle.java
    index 9fed3d93c..c54af659c 100644
    --- a/patterns/shapes/Triangle.java
    +++ b/patterns/shapes/Triangle.java
    @@ -1,5 +1,5 @@
     // patterns/shapes/Triangle.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package patterns.shapes;
    diff --git a/patterns/state/StateMachineDemo.java b/patterns/state/StateMachineDemo.java
    index 29f8a8761..0046a684b 100644
    --- a/patterns/state/StateMachineDemo.java
    +++ b/patterns/state/StateMachineDemo.java
    @@ -1,5 +1,5 @@
     // patterns/state/StateMachineDemo.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // The StateMachine pattern and Template method
    @@ -24,24 +24,21 @@ protected final void runAll() {
     // A different subclass for each state:
     
     class Wash implements State {
    -  @Override
    -  public void run() {
    +  @Override public void run() {
         System.out.println("Washing");
         new Nap(0.5);
       }
     }
     
     class Spin implements State {
    -  @Override
    -  public void run() {
    +  @Override public void run() {
         System.out.println("Spinning");
         new Nap(0.5);
       }
     }
     
     class Rinse implements State {
    -  @Override
    -  public void run() {
    +  @Override public void run() {
         System.out.println("Rinsing");
         new Nap(0.5);
       }
    @@ -55,8 +52,7 @@ class Washer extends StateMachine {
         new Rinse(), new Spin(),
       };
       Washer() { runAll(); }
    -  @Override
    -  public boolean changeState() {
    +  @Override public boolean changeState() {
         if(i < states.length) {
           // Change the state by setting the
           // surrogate reference to a new object:
    diff --git a/patterns/strategy/StrategyPattern.java b/patterns/strategy/StrategyPattern.java
    index 52561b4b1..32f989629 100644
    --- a/patterns/strategy/StrategyPattern.java
    +++ b/patterns/strategy/StrategyPattern.java
    @@ -1,5 +1,5 @@
     // patterns/strategy/StrategyPattern.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // {java patterns.strategy.StrategyPattern}
    diff --git a/patterns/strategy/StrategyPattern2.java b/patterns/strategy/StrategyPattern2.java
    index 09465f3a5..d63c6e710 100644
    --- a/patterns/strategy/StrategyPattern2.java
    +++ b/patterns/strategy/StrategyPattern2.java
    @@ -1,5 +1,5 @@
     // patterns/strategy/StrategyPattern2.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // {java patterns.strategy.StrategyPattern2}
    diff --git a/patterns/trash/Aluminum.java b/patterns/trash/Aluminum.java
    index 0065e964a..085d7047f 100644
    --- a/patterns/trash/Aluminum.java
    +++ b/patterns/trash/Aluminum.java
    @@ -1,5 +1,5 @@
     // patterns/trash/Aluminum.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package patterns.trash;
    @@ -7,8 +7,7 @@
     public class Aluminum extends Trash {
       private static double val = 1.67f;
       public Aluminum(double wt) { super(wt); }
    -  @Override
    -  public double value() { return val; }
    +  @Override public double value() { return val; }
       public static void value(double newVal) {
         val = newVal;
       }
    diff --git a/patterns/trash/Cardboard.java b/patterns/trash/Cardboard.java
    index 0b54d135f..f1998630a 100644
    --- a/patterns/trash/Cardboard.java
    +++ b/patterns/trash/Cardboard.java
    @@ -1,5 +1,5 @@
     // patterns/trash/Cardboard.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package patterns.trash;
    @@ -7,8 +7,7 @@
     public class Cardboard extends Trash {
       private static double val = 0.23f;
       public Cardboard(double wt) { super(wt); }
    -  @Override
    -  public double value() { return val; }
    +  @Override public double value() { return val; }
       public static void value(double newVal) {
         val = newVal;
       }
    diff --git a/patterns/trash/Fillable.java b/patterns/trash/Fillable.java
    index a61cb1112..6c00f6ea9 100644
    --- a/patterns/trash/Fillable.java
    +++ b/patterns/trash/Fillable.java
    @@ -1,5 +1,5 @@
     // patterns/trash/Fillable.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Any object that can be filled with Trash
    diff --git a/patterns/trash/FillableList.java b/patterns/trash/FillableList.java
    index 989a33ec5..05d83ff66 100644
    --- a/patterns/trash/FillableList.java
    +++ b/patterns/trash/FillableList.java
    @@ -1,5 +1,5 @@
     // patterns/trash/FillableList.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Adapter that makes a List Fillable
    @@ -12,6 +12,5 @@ public class FillableList
       public FillableList(List vv) {
         v = vv;
       }
    -  @Override
    -  public void addTrash(T t) { v.add(t); }
    +  @Override public void addTrash(T t) { v.add(t); }
     }
    diff --git a/patterns/trash/Glass.java b/patterns/trash/Glass.java
    index f7563dc42..faf73762b 100644
    --- a/patterns/trash/Glass.java
    +++ b/patterns/trash/Glass.java
    @@ -1,5 +1,5 @@
     // patterns/trash/Glass.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package patterns.trash;
    @@ -7,8 +7,7 @@
     public class Glass extends Trash {
       private static double val = 0.23f;
       public Glass(double wt) { super(wt); }
    -  @Override
    -  public double value() { return val; }
    +  @Override public double value() { return val; }
       public static void value(double newVal) {
         val = newVal;
       }
    diff --git a/patterns/trash/Paper.java b/patterns/trash/Paper.java
    index 2f0b36664..dd79e8eae 100644
    --- a/patterns/trash/Paper.java
    +++ b/patterns/trash/Paper.java
    @@ -1,5 +1,5 @@
     // patterns/trash/Paper.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package patterns.trash;
    @@ -7,8 +7,7 @@
     public class Paper extends Trash {
       private static double val = 0.10f;
       public Paper(double wt) { super(wt); }
    -  @Override
    -  public double value() { return val; }
    +  @Override public double value() { return val; }
       public static void value(double newVal) {
         val = newVal;
       }
    diff --git a/patterns/trash/ParseTrash.java b/patterns/trash/ParseTrash.java
    index fc0c04168..7e69fea36 100644
    --- a/patterns/trash/ParseTrash.java
    +++ b/patterns/trash/ParseTrash.java
    @@ -1,5 +1,5 @@
     // patterns/trash/ParseTrash.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Open a file and parse its contents into
    diff --git a/patterns/trash/Trash.java b/patterns/trash/Trash.java
    index 7d01de8c8..4920e0ba4 100644
    --- a/patterns/trash/Trash.java
    +++ b/patterns/trash/Trash.java
    @@ -1,5 +1,5 @@
     // patterns/trash/Trash.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Base class for Trash recycling examples
    @@ -28,8 +28,7 @@ void sumValue(List bin) {
         });
         System.out.println("Total value = " + val);
       }
    -  @Override
    -  public String toString() {
    +  @Override public String toString() {
         // Print correct subclass name:
         return getClass().getName() +
           " w:" + weight() + " v:" +
    diff --git a/patterns/trashvisitor/Aluminum.java b/patterns/trashvisitor/Aluminum.java
    index 85d5fa145..9bb9c9e4d 100644
    --- a/patterns/trashvisitor/Aluminum.java
    +++ b/patterns/trashvisitor/Aluminum.java
    @@ -1,5 +1,5 @@
     // patterns/trashvisitor/Aluminum.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Aluminum for the visitor pattern
    @@ -9,8 +9,7 @@
     public class Aluminum extends patterns.trash.Aluminum
         implements Visitable {
       public Aluminum(double wt) { super(wt); }
    -  @Override
    -  public void accept(Visitor v) {
    +  @Override public void accept(Visitor v) {
         v.visit(this);
       }
     }
    diff --git a/patterns/trashvisitor/Cardboard.java b/patterns/trashvisitor/Cardboard.java
    index 978202ef1..50c3b1c9f 100644
    --- a/patterns/trashvisitor/Cardboard.java
    +++ b/patterns/trashvisitor/Cardboard.java
    @@ -1,5 +1,5 @@
     // patterns/trashvisitor/Cardboard.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Cardboard for the visitor pattern
    @@ -9,8 +9,7 @@
     public class Cardboard extends patterns.trash.Cardboard
         implements Visitable {
       public Cardboard(double wt) { super(wt); }
    -  @Override
    -  public void accept(Visitor v) {
    +  @Override public void accept(Visitor v) {
         v.visit(this);
       }
     }
    diff --git a/patterns/trashvisitor/Glass.java b/patterns/trashvisitor/Glass.java
    index fbcf4949f..71f1de037 100644
    --- a/patterns/trashvisitor/Glass.java
    +++ b/patterns/trashvisitor/Glass.java
    @@ -1,5 +1,5 @@
     // patterns/trashvisitor/Glass.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Glass for the visitor pattern
    @@ -9,8 +9,7 @@
     public class Glass extends patterns.trash.Glass
         implements Visitable {
       public Glass(double wt) { super(wt); }
    -  @Override
    -  public void accept(Visitor v) {
    +  @Override public void accept(Visitor v) {
         v.visit(this);
       }
     }
    diff --git a/patterns/trashvisitor/Paper.java b/patterns/trashvisitor/Paper.java
    index 6e9999f1d..ad209ffdf 100644
    --- a/patterns/trashvisitor/Paper.java
    +++ b/patterns/trashvisitor/Paper.java
    @@ -1,5 +1,5 @@
     // patterns/trashvisitor/Paper.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Paper for the visitor pattern
    @@ -9,8 +9,7 @@
     public class Paper extends patterns.trash.Paper
         implements Visitable {
       public Paper(double wt) { super(wt); }
    -  @Override
    -  public void accept(Visitor v) {
    +  @Override public void accept(Visitor v) {
         v.visit(this);
       }
     }
    diff --git a/patterns/trashvisitor/TrashVisitor.java b/patterns/trashvisitor/TrashVisitor.java
    index 8f9566236..c794d82f7 100644
    --- a/patterns/trashvisitor/TrashVisitor.java
    +++ b/patterns/trashvisitor/TrashVisitor.java
    @@ -1,5 +1,5 @@
     // patterns/trashvisitor/TrashVisitor.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // {java patterns.trashvisitor.TrashVisitor}
    @@ -17,32 +17,27 @@ class PriceVisitor implements Visitor {
       public static void show(String s) {
         System.out.println(s);
       }
    -  @Override
    -  public void visit(Aluminum al) {
    +  @Override public void visit(Aluminum al) {
         double v = al.weight() * al.value();
         show("value of Aluminum= " + v);
         alSum += v;
       }
    -  @Override
    -  public void visit(Paper p) {
    +  @Override public void visit(Paper p) {
         double v = p.weight() * p.value();
         show("value of Paper= " + v);
         pSum += v;
       }
    -  @Override
    -  public void visit(Glass g) {
    +  @Override public void visit(Glass g) {
         double v = g.weight() * g.value();
         show("value of Glass= " + v);
         gSum += v;
       }
    -  @Override
    -  public void visit(Cardboard c) {
    +  @Override public void visit(Cardboard c) {
         double v = c.weight() * c.value();
         show("value of Cardboard = " + v);
         cSum += v;
       }
    -  @Override
    -  public void total() {
    +  @Override public void total() {
         show(
           "Total Aluminum: $" + alSum + "\n" +
           "Total Paper: $" + pSum + "\n" +
    @@ -59,28 +54,23 @@ class WeightVisitor implements Visitor {
       public static void show(String s) {
         System.out.println(s);
       }
    -  @Override
    -  public void visit(Aluminum al) {
    +  @Override public void visit(Aluminum al) {
         alSum += al.weight();
         show("Aluminum weight = " + al.weight());
       }
    -  @Override
    -  public void visit(Paper p) {
    +  @Override public void visit(Paper p) {
         pSum += p.weight();
         show("Paper weight = " + p.weight());
       }
    -  @Override
    -  public void visit(Glass g) {
    +  @Override public void visit(Glass g) {
         gSum += g.weight();
         show("Glass weight = " + g.weight());
       }
    -  @Override
    -  public void visit(Cardboard c) {
    +  @Override public void visit(Cardboard c) {
         cSum += c.weight();
         show("Cardboard weight = " + c.weight());
       }
    -  @Override
    -  public void total() {
    +  @Override public void total() {
         show("Total weight Aluminum:" + alSum);
         show("Total weight Paper:" + pSum);
         show("Total weight Glass:" + gSum);
    diff --git a/patterns/trashvisitor/Visitable.java b/patterns/trashvisitor/Visitable.java
    index f1f9f1da1..54563d435 100644
    --- a/patterns/trashvisitor/Visitable.java
    +++ b/patterns/trashvisitor/Visitable.java
    @@ -1,5 +1,5 @@
     // patterns/trashvisitor/Visitable.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // An interface to add visitor functionality to the
    diff --git a/patterns/trashvisitor/Visitor.java b/patterns/trashvisitor/Visitor.java
    index 07ef4622d..3f9bfe460 100644
    --- a/patterns/trashvisitor/Visitor.java
    +++ b/patterns/trashvisitor/Visitor.java
    @@ -1,5 +1,5 @@
     // patterns/trashvisitor/Visitor.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // The base interface for visitors
    diff --git a/patterns/visitor/BeeAndFlowers.java b/patterns/visitor/BeeAndFlowers.java
    index aa86ebfc5..a1d400459 100644
    --- a/patterns/visitor/BeeAndFlowers.java
    +++ b/patterns/visitor/BeeAndFlowers.java
    @@ -1,5 +1,5 @@
     // patterns/visitor/BeeAndFlowers.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Demonstration of "visitor" pattern
    @@ -38,34 +38,27 @@ class Chrysanthemum implements Flower {
     // Add the ability to produce a String:
     class StringVal implements Visitor {
       String s;
    -  @Override
    -  public String toString() { return s; }
    -  @Override
    -  public void visit(Gladiolus g) {
    +  @Override public String toString() { return s; }
    +  @Override public void visit(Gladiolus g) {
         s = "Gladiolus";
       }
    -  @Override
    -  public void visit(Renuculus r) {
    +  @Override public void visit(Renuculus r) {
         s = "Renuculus";
       }
    -  @Override
    -  public void visit(Chrysanthemum c) {
    +  @Override public void visit(Chrysanthemum c) {
         s = "Chrysanthemum";
       }
     }
     
     // Add the ability to do "Bee" activities:
     class Bee implements Visitor {
    -  @Override
    -  public void visit(Gladiolus g) {
    +  @Override public void visit(Gladiolus g) {
         System.out.println("Bee and Gladiolus");
       }
    -  @Override
    -  public void visit(Renuculus r) {
    +  @Override public void visit(Renuculus r) {
         System.out.println("Bee and Renuculus");
       }
    -  @Override
    -  public void visit(Chrysanthemum c) {
    +  @Override public void visit(Chrysanthemum c) {
         System.out.println("Bee and Chrysanthemum");
       }
     }
    diff --git a/polymorphism/CovariantReturn.java b/polymorphism/CovariantReturn.java
    index e88fe5908..5b46602aa 100644
    --- a/polymorphism/CovariantReturn.java
    +++ b/polymorphism/CovariantReturn.java
    @@ -1,16 +1,18 @@
     // polymorphism/CovariantReturn.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
     class Grain {
    -  @Override
    -  public String toString() { return "Grain"; }
    +  @Override public String toString() {
    +    return "Grain";
    +  }
     }
     
     class Wheat extends Grain {
    -  @Override
    -  public String toString() { return "Wheat"; }
    +  @Override public String toString() {
    +    return "Wheat";
    +  }
     }
     
     class Mill {
    @@ -18,8 +20,9 @@ class Mill {
     }
     
     class WheatMill extends Mill {
    -  @Override
    -  Wheat process() { return new Wheat(); }
    +  @Override Wheat process() {
    +    return new Wheat();
    +  }
     }
     
     public class CovariantReturn {
    diff --git a/polymorphism/FieldAccess.java b/polymorphism/FieldAccess.java
    index 95e47c5e2..e6b39229f 100644
    --- a/polymorphism/FieldAccess.java
    +++ b/polymorphism/FieldAccess.java
    @@ -1,5 +1,5 @@
     // polymorphism/FieldAccess.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Direct field access is determined at compile time
    @@ -11,8 +11,7 @@ class Super {
     
     class Sub extends Super {
       public int field = 1;
    -  @Override
    -  public int getField() { return field; }
    +  @Override public int getField() { return field; }
       public int getSuperField() { return super.field; }
     }
     
    diff --git a/polymorphism/Frog.java b/polymorphism/Frog.java
    index 9226910d5..eb0669f25 100644
    --- a/polymorphism/Frog.java
    +++ b/polymorphism/Frog.java
    @@ -1,5 +1,5 @@
     // polymorphism/Frog.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Cleanup and inheritance
    @@ -49,8 +49,7 @@ class Animal extends LivingCreature {
       private Description t =
         new Description("Animal not Vegetable");
       Animal() { System.out.println("Animal()"); }
    -  @Override
    -  protected void dispose() {
    +  @Override protected void dispose() {
         System.out.println("Animal dispose");
         t.dispose();
         p.dispose();
    @@ -66,8 +65,7 @@ class Amphibian extends Animal {
       Amphibian() {
         System.out.println("Amphibian()");
       }
    -  @Override
    -  protected void dispose() {
    +  @Override protected void dispose() {
         System.out.println("Amphibian dispose");
         t.dispose();
         p.dispose();
    @@ -80,8 +78,7 @@ public class Frog extends Amphibian {
         new Characteristic("Croaks");
       private Description t = new Description("Eats Bugs");
       public Frog() { System.out.println("Frog()"); }
    -  @Override
    -  protected void dispose() {
    +  @Override protected void dispose() {
         System.out.println("Frog dispose");
         t.dispose();
         p.dispose();
    diff --git a/polymorphism/PolyConstructors.java b/polymorphism/PolyConstructors.java
    index 3a99f08b2..8a6d6ed5c 100644
    --- a/polymorphism/PolyConstructors.java
    +++ b/polymorphism/PolyConstructors.java
    @@ -1,5 +1,5 @@
     // polymorphism/PolyConstructors.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Constructors and polymorphism
    @@ -21,8 +21,7 @@ class RoundGlyph extends Glyph {
         System.out.println(
           "RoundGlyph.RoundGlyph(), radius = " + radius);
       }
    -  @Override
    -  void draw() {
    +  @Override void draw() {
         System.out.println(
           "RoundGlyph.draw(), radius = " + radius);
       }
    diff --git a/polymorphism/PrivateOverride.java b/polymorphism/PrivateOverride.java
    index 9873e03da..59aba4ed2 100644
    --- a/polymorphism/PrivateOverride.java
    +++ b/polymorphism/PrivateOverride.java
    @@ -1,5 +1,5 @@
     // polymorphism/PrivateOverride.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Trying to override a private method
    diff --git a/polymorphism/PrivateOverride2.java b/polymorphism/PrivateOverride2.java
    index 664672bc4..d53d9a256 100644
    --- a/polymorphism/PrivateOverride2.java
    +++ b/polymorphism/PrivateOverride2.java
    @@ -1,5 +1,5 @@
     // polymorphism/PrivateOverride2.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Detecting a mistaken override using @Override
    @@ -17,6 +17,7 @@ public static void main(String[] args) {
     }
     
     class Derived2 extends PrivateOverride2 {
    -  @Override
    -  public void f() { System.out.println("public f()"); }
    +  @Override public void f() {
    +    System.out.println("public f()");
    +  }
     }
    diff --git a/polymorphism/RTTI.java b/polymorphism/RTTI.java
    index 39c9029b9..fe56a6b26 100644
    --- a/polymorphism/RTTI.java
    +++ b/polymorphism/RTTI.java
    @@ -1,5 +1,5 @@
     // polymorphism/RTTI.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Downcasting & Runtime type information (RTTI)
    @@ -11,10 +11,8 @@ public void g() {}
     }
     
     class MoreUseful extends Useful {
    -  @Override
    -  public void f() {}
    -  @Override
    -  public void g() {}
    +  @Override public void f() {}
    +  @Override public void g() {}
       public void u() {}
       public void v() {}
       public void w() {}
    @@ -39,5 +37,5 @@ public static void main(String[] args) {
     Exception in thread "main"
     java.lang.ClassCastException: Useful cannot be cast to
     MoreUseful
    -        at RTTI.main(RTTI.java:31)
    +        at RTTI.main(RTTI.java:29)
     */
    diff --git a/polymorphism/ReferenceCounting.java b/polymorphism/ReferenceCounting.java
    index b378117f1..634cd8c6c 100644
    --- a/polymorphism/ReferenceCounting.java
    +++ b/polymorphism/ReferenceCounting.java
    @@ -1,5 +1,5 @@
     // polymorphism/ReferenceCounting.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Cleaning up shared member objects
    @@ -16,8 +16,7 @@ protected void dispose() {
         if(--refcount == 0)
           System.out.println("Disposing " + this);
       }
    -  @Override
    -  public String toString() {
    +  @Override public String toString() {
         return "Shared " + id;
       }
     }
    @@ -35,8 +34,7 @@ protected void dispose() {
         System.out.println("disposing " + this);
         shared.dispose();
       }
    -  @Override
    -  public String toString() {
    +  @Override public String toString() {
         return "Composing " + id;
       }
     }
    diff --git a/polymorphism/Sandwich.java b/polymorphism/Sandwich.java
    index 97f80d53e..ef39bcbae 100644
    --- a/polymorphism/Sandwich.java
    +++ b/polymorphism/Sandwich.java
    @@ -1,5 +1,5 @@
     // polymorphism/Sandwich.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Order of constructor calls
    diff --git a/polymorphism/Shapes.java b/polymorphism/Shapes.java
    index 4d051e707..17d82061e 100644
    --- a/polymorphism/Shapes.java
    +++ b/polymorphism/Shapes.java
    @@ -1,5 +1,5 @@
     // polymorphism/Shapes.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Polymorphism in Java
    diff --git a/polymorphism/StaticPolymorphism.java b/polymorphism/StaticPolymorphism.java
    index 1ebe733b2..2a7309f7e 100644
    --- a/polymorphism/StaticPolymorphism.java
    +++ b/polymorphism/StaticPolymorphism.java
    @@ -1,5 +1,5 @@
     // polymorphism/StaticPolymorphism.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Static methods are not polymorphic
    @@ -17,8 +17,7 @@ class StaticSub extends StaticSuper {
       public static String staticGet() {
         return "Derived staticGet()";
       }
    -  @Override
    -  public String dynamicGet() {
    +  @Override public String dynamicGet() {
         return "Derived dynamicGet()";
       }
     }
    diff --git a/polymorphism/Transmogrify.java b/polymorphism/Transmogrify.java
    index 09877d530..4dbcdeb4b 100644
    --- a/polymorphism/Transmogrify.java
    +++ b/polymorphism/Transmogrify.java
    @@ -1,5 +1,5 @@
     // polymorphism/Transmogrify.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Dynamically changing the behavior of an object
    @@ -10,15 +10,13 @@ public void act() {}
     }
     
     class HappyActor extends Actor {
    -  @Override
    -  public void act() {
    +  @Override public void act() {
         System.out.println("HappyActor");
       }
     }
     
     class SadActor extends Actor {
    -  @Override
    -  public void act() {
    +  @Override public void act() {
         System.out.println("SadActor");
       }
     }
    diff --git a/polymorphism/music/Instrument.java b/polymorphism/music/Instrument.java
    index fb6c77e37..907b3566f 100644
    --- a/polymorphism/music/Instrument.java
    +++ b/polymorphism/music/Instrument.java
    @@ -1,5 +1,5 @@
     // polymorphism/music/Instrument.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package polymorphism.music;
    diff --git a/polymorphism/music/Music.java b/polymorphism/music/Music.java
    index 8e903ec0a..fb92e0099 100644
    --- a/polymorphism/music/Music.java
    +++ b/polymorphism/music/Music.java
    @@ -1,5 +1,5 @@
     // polymorphism/music/Music.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Inheritance & upcasting
    diff --git a/polymorphism/music/Music2.java b/polymorphism/music/Music2.java
    index a5bff54be..790adcf5d 100644
    --- a/polymorphism/music/Music2.java
    +++ b/polymorphism/music/Music2.java
    @@ -1,5 +1,5 @@
     // polymorphism/music/Music2.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Overloading instead of upcasting
    @@ -7,15 +7,13 @@
     package polymorphism.music;
     
     class Stringed extends Instrument {
    -  @Override
    -  public void play(Note n) {
    +  @Override public void play(Note n) {
         System.out.println("Stringed.play() " + n);
       }
     }
     
     class Brass extends Instrument {
    -  @Override
    -  public void play(Note n) {
    +  @Override public void play(Note n) {
         System.out.println("Brass.play() " + n);
       }
     }
    diff --git a/polymorphism/music/Note.java b/polymorphism/music/Note.java
    index 414367a96..6963bc15a 100644
    --- a/polymorphism/music/Note.java
    +++ b/polymorphism/music/Note.java
    @@ -1,5 +1,5 @@
     // polymorphism/music/Note.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Notes to play on musical instruments
    diff --git a/polymorphism/music/Wind.java b/polymorphism/music/Wind.java
    index c38ac4970..6e48f513b 100644
    --- a/polymorphism/music/Wind.java
    +++ b/polymorphism/music/Wind.java
    @@ -1,5 +1,5 @@
     // polymorphism/music/Wind.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package polymorphism.music;
    @@ -8,8 +8,7 @@
     // because they have the same interface:
     public class Wind extends Instrument {
       // Redefine interface method:
    -  @Override
    -  public void play(Note n) {
    +  @Override public void play(Note n) {
         System.out.println("Wind.play() " + n);
       }
     }
    diff --git a/polymorphism/music3/Music3.java b/polymorphism/music3/Music3.java
    index da3eb3647..97938dd01 100644
    --- a/polymorphism/music3/Music3.java
    +++ b/polymorphism/music3/Music3.java
    @@ -1,5 +1,5 @@
     // polymorphism/music3/Music3.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // An extensible program
    @@ -18,62 +18,49 @@ void adjust() {
     }
     
     class Wind extends Instrument {
    -  @Override
    -  void play(Note n) {
    +  @Override void play(Note n) {
         System.out.println("Wind.play() " + n);
       }
    -  @Override
    -  String what() { return "Wind"; }
    -  @Override
    -  void adjust() {
    +  @Override String what() { return "Wind"; }
    +  @Override void adjust() {
         System.out.println("Adjusting Wind");
       }
     }
     
     class Percussion extends Instrument {
    -  @Override
    -  void play(Note n) {
    +  @Override void play(Note n) {
         System.out.println("Percussion.play() " + n);
       }
    -  @Override
    -  String what() { return "Percussion"; }
    -  @Override
    -  void adjust() {
    +  @Override String what() { return "Percussion"; }
    +  @Override void adjust() {
         System.out.println("Adjusting Percussion");
       }
     }
     
     class Stringed extends Instrument {
    -  @Override
    -  void play(Note n) {
    +  @Override void play(Note n) {
         System.out.println("Stringed.play() " + n);
       }
    -  @Override
    -  String what() { return "Stringed"; }
    -  @Override
    -  void adjust() {
    +  @Override String what() { return "Stringed"; }
    +  @Override void adjust() {
         System.out.println("Adjusting Stringed");
       }
     }
     
     class Brass extends Wind {
    -  @Override
    -  void play(Note n) {
    +  @Override void play(Note n) {
         System.out.println("Brass.play() " + n);
       }
    -  @Override
    -  void adjust() {
    +  @Override void adjust() {
         System.out.println("Adjusting Brass");
       }
     }
     
     class Woodwind extends Wind {
    -  @Override
    -  void play(Note n) {
    +  @Override void play(Note n) {
         System.out.println("Woodwind.play() " + n);
       }
    -  @Override
    -  String what() { return "Woodwind"; }
    +  @Override String what() { return "Woodwind"; }
     }
     
     public class Music3 {
    diff --git a/polymorphism/shape/Circle.java b/polymorphism/shape/Circle.java
    index fc8579506..9b97edaed 100644
    --- a/polymorphism/shape/Circle.java
    +++ b/polymorphism/shape/Circle.java
    @@ -1,16 +1,14 @@
     // polymorphism/shape/Circle.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package polymorphism.shape;
     
     public class Circle extends Shape {
    -  @Override
    -  public void draw() {
    +  @Override public void draw() {
         System.out.println("Circle.draw()");
       }
    -  @Override
    -  public void erase() {
    +  @Override public void erase() {
         System.out.println("Circle.erase()");
       }
     }
    diff --git a/polymorphism/shape/RandomShapes.java b/polymorphism/shape/RandomShapes.java
    index c1419f4e1..03120f5ea 100644
    --- a/polymorphism/shape/RandomShapes.java
    +++ b/polymorphism/shape/RandomShapes.java
    @@ -1,5 +1,5 @@
     // polymorphism/shape/RandomShapes.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // A "factory" that randomly creates shapes
    diff --git a/polymorphism/shape/Shape.java b/polymorphism/shape/Shape.java
    index 4be93c866..d78c6dd9e 100644
    --- a/polymorphism/shape/Shape.java
    +++ b/polymorphism/shape/Shape.java
    @@ -1,5 +1,5 @@
     // polymorphism/shape/Shape.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package polymorphism.shape;
    diff --git a/polymorphism/shape/Square.java b/polymorphism/shape/Square.java
    index 4938335b3..fb4802b10 100644
    --- a/polymorphism/shape/Square.java
    +++ b/polymorphism/shape/Square.java
    @@ -1,16 +1,14 @@
     // polymorphism/shape/Square.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package polymorphism.shape;
     
     public class Square extends Shape {
    -  @Override
    -  public void draw() {
    +  @Override public void draw() {
         System.out.println("Square.draw()");
       }
    -  @Override
    -  public void erase() {
    +  @Override public void erase() {
         System.out.println("Square.erase()");
       }
     }
    diff --git a/polymorphism/shape/Triangle.java b/polymorphism/shape/Triangle.java
    index db7394a3c..baebbf870 100644
    --- a/polymorphism/shape/Triangle.java
    +++ b/polymorphism/shape/Triangle.java
    @@ -1,16 +1,14 @@
     // polymorphism/shape/Triangle.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package polymorphism.shape;
     
     public class Triangle extends Shape {
    -  @Override
    -  public void draw() {
    +  @Override public void draw() {
         System.out.println("Triangle.draw()");
       }
    -  @Override
    -  public void erase() {
    +  @Override public void erase() {
         System.out.println("Triangle.erase()");
       }
     }
    diff --git a/references/AddingClone.java b/references/AddingClone.java
    index 4f03cf06d..298b78bf3 100644
    --- a/references/AddingClone.java
    +++ b/references/AddingClone.java
    @@ -1,5 +1,5 @@
     // references/AddingClone.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // You must go through a few gyrations
    @@ -11,12 +11,10 @@ class Int2 implements Cloneable {
       private int i;
       Int2(int ii) { i = ii; }
       public void increment() { i++; }
    -  @Override
    -  public String toString() {
    +  @Override public String toString() {
         return Integer.toString(i);
       }
    -  @Override
    -  public Int2 clone() {
    +  @Override public Int2 clone() {
         try {
           return (Int2)super.clone();
         } catch(CloneNotSupportedException e) {
    diff --git a/references/Alias1.java b/references/Alias1.java
    index 1af594ec4..e3cd047b7 100644
    --- a/references/Alias1.java
    +++ b/references/Alias1.java
    @@ -1,5 +1,5 @@
     // references/Alias1.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Aliasing two references to one object
    @@ -9,11 +9,11 @@ public class Alias1 {
       public Alias1(int ii) { i = ii; }
       public static void main(String[] args) {
         Alias1 x = new Alias1(7);
    -    Alias1 y = x; // Assign the reference (1)
    +    Alias1 y = x; // Assign the reference    // [1]
         System.out.println("x: " + x.i);
         System.out.println("y: " + y.i);
         System.out.println("Incrementing x");
    -    x.i++; // [2]
    +    x.i++;                                   // [2]
         System.out.println("x: " + x.i);
         System.out.println("y: " + y.i);
       }
    diff --git a/references/Alias2.java b/references/Alias2.java
    index aa37e1a23..789724697 100644
    --- a/references/Alias2.java
    +++ b/references/Alias2.java
    @@ -1,5 +1,5 @@
     // references/Alias2.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Method calls implicitly alias their arguments
    diff --git a/references/CheckCloneable.java b/references/CheckCloneable.java
    index 137937a94..0293b5cef 100644
    --- a/references/CheckCloneable.java
    +++ b/references/CheckCloneable.java
    @@ -1,5 +1,5 @@
     // references/CheckCloneable.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Check to see if a reference can be cloned
    @@ -46,8 +46,7 @@ private BackOn duplicate(BackOn b) {
         // copy. A dummy copy, just to make a point:
         return new BackOn();
       }
    -  @Override
    -  public Object clone() {
    +  @Override public Object clone() {
         // Doesn't call NoMore.clone():
         return duplicate(this);
       }
    diff --git a/references/CloneArrayList.java b/references/CloneArrayList.java
    index 601673c2c..811dd419c 100644
    --- a/references/CloneArrayList.java
    +++ b/references/CloneArrayList.java
    @@ -1,5 +1,5 @@
     // references/CloneArrayList.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // The clone() operation works for only a few
    @@ -11,8 +11,7 @@ class Int {
       private int i;
       Int(int ii) { i = ii; }
       public void increment() { i++; }
    -  @Override
    -  public String toString() {
    +  @Override public String toString() {
         return Integer.toString(i);
       }
     }
    diff --git a/references/Compete.java b/references/Compete.java
    index 9e77f3a7f..9a37c00af 100644
    --- a/references/Compete.java
    +++ b/references/Compete.java
    @@ -1,5 +1,5 @@
     // references/Compete.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.io.*;
    @@ -11,8 +11,7 @@ class Thing2 implements Serializable {
     }
     
     class Thing3 implements Cloneable {
    -  @Override
    -  public Thing3 clone() {
    +  @Override public Thing3 clone() {
         try {
           return (Thing3)super.clone();
         } catch(CloneNotSupportedException e) {
    @@ -23,8 +22,7 @@ public Thing3 clone() {
     
     class Thing4 implements Cloneable {
       private Thing3 t3 = new Thing3();
    -  @Override
    -  public Thing4 clone() {
    +  @Override public Thing4 clone() {
         Thing4 t4 = null;
         try {
           t4 = (Thing4)super.clone();
    @@ -84,6 +82,6 @@ public class Compete {
       }
     }
     /* Output:
    -Duplication via serialization: 516 Milliseconds
    -Duplication via cloning: 71 Milliseconds
    +Duplication via serialization: 385 Milliseconds
    +Duplication via cloning: 38 Milliseconds
     */
    diff --git a/references/CopyConstructor.java b/references/CopyConstructor.java
    index 2617f48b0..6ffb5303b 100644
    --- a/references/CopyConstructor.java
    +++ b/references/CopyConstructor.java
    @@ -1,5 +1,5 @@
     // references/CopyConstructor.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // A constructor to copy an object of the same
    @@ -112,12 +112,12 @@ public void evaluate() {
     public class CopyConstructor {
       public static void ripen(Tomato t) {
         // Use the "copy constructor":
    -    t = new Tomato(t); // [1]
    +    t = new Tomato(t);                           // [1]
         System.out.println("In ripen, t is a " +
           t.getClass().getName());
       }
       public static void slice(Fruit f) {
    -    f = new Fruit(f); // [2] Hmmm... will this work?
    +    f = new Fruit(f); // Hmmm... will this work? // [2]
         System.out.println("In slice, f is a " +
           f.getClass().getName());
       }
    diff --git a/references/DepthReading.java b/references/DepthReading.java
    index 00d9dfda6..46c14fd69 100644
    --- a/references/DepthReading.java
    +++ b/references/DepthReading.java
    @@ -1,5 +1,5 @@
     // references/DepthReading.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Cloning a composed object
    @@ -10,8 +10,7 @@ public class DepthReading implements Cloneable {
       public DepthReading(double depth) {
         this.depth = depth;
       }
    -  @Override
    -  public DepthReading clone() {
    +  @Override public DepthReading clone() {
         try {
           return (DepthReading)super.clone();
         } catch(CloneNotSupportedException e) {
    @@ -22,8 +21,7 @@ public DepthReading clone() {
       public void setDepth(double depth) {
         this.depth = depth;
       }
    -  @Override
    -  public String toString() {
    +  @Override public String toString() {
         return String.valueOf(depth);
       }
     }
    diff --git a/references/HorrorFlick.java b/references/HorrorFlick.java
    index 709d15bf3..e4a8656d9 100644
    --- a/references/HorrorFlick.java
    +++ b/references/HorrorFlick.java
    @@ -1,5 +1,5 @@
     // references/HorrorFlick.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Insert Cloneability at any level of inheritance
    @@ -9,8 +9,7 @@ class Person {}
     class Hero extends Person {}
     
     class Scientist extends Person implements Cloneable {
    -  @Override
    -  public Scientist clone() {
    +  @Override public Scientist clone() {
         try {
           return (Scientist)super.clone();
         } catch(CloneNotSupportedException e) {
    diff --git a/references/Immutable1.java b/references/Immutable1.java
    index 55ac1f6aa..8c2240ab5 100644
    --- a/references/Immutable1.java
    +++ b/references/Immutable1.java
    @@ -1,5 +1,5 @@
     // references/Immutable1.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Immutable objects are immune to aliasing
    diff --git a/references/Immutable2.java b/references/Immutable2.java
    index a565f86a6..aa23cadad 100644
    --- a/references/Immutable2.java
    +++ b/references/Immutable2.java
    @@ -1,5 +1,5 @@
     // references/Immutable2.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // A companion class to modify immutable objects
    diff --git a/references/ImmutableInteger.java b/references/ImmutableInteger.java
    index 906aa7ef0..a42ddf1ef 100644
    --- a/references/ImmutableInteger.java
    +++ b/references/ImmutableInteger.java
    @@ -1,5 +1,5 @@
     // references/ImmutableInteger.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // The Integer class cannot be changed
    diff --git a/references/ImmutableStrings.java b/references/ImmutableStrings.java
    index ad954e3f3..9ca8f72c7 100644
    --- a/references/ImmutableStrings.java
    +++ b/references/ImmutableStrings.java
    @@ -1,5 +1,5 @@
     // references/ImmutableStrings.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Demonstrating StringBuilder
    diff --git a/references/LocalCopy.java b/references/LocalCopy.java
    index 9c01c09e8..f19f63a62 100644
    --- a/references/LocalCopy.java
    +++ b/references/LocalCopy.java
    @@ -1,5 +1,5 @@
     // references/LocalCopy.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Creating local copies with clone()
    @@ -7,8 +7,7 @@
     class Duplo implements Cloneable {
       private int n;
       Duplo(int n) { this.n = n; }
    -  @Override
    -  public Duplo clone() { // [1]
    +  @Override public Duplo clone() {              // [1]
         try {
           return (Duplo)super.clone();
         } catch(CloneNotSupportedException e) {
    @@ -18,8 +17,7 @@ public Duplo clone() { // [1]
       public int getValue() { return n; }
       public void setValue(int n) { this.n = n; }
       public void increment() { n++; }
    -  @Override
    -  public String toString() {
    +  @Override public String toString() {
         return Integer.toString(n);
       }
     }
    @@ -31,7 +29,7 @@ public static Duplo g(Duplo v) {
         return v;
       }
       public static Duplo f(Duplo v) {
    -    v = v.clone(); // [2] Local copy
    +    v = v.clone(); // Local copy                // [2]
         v.increment();
         return v;
       }
    diff --git a/references/MutableInteger.java b/references/MutableInteger.java
    index dfe0cc7b7..9642777e6 100644
    --- a/references/MutableInteger.java
    +++ b/references/MutableInteger.java
    @@ -1,5 +1,5 @@
     // references/MutableInteger.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // A changeable wrapper class
    @@ -12,8 +12,7 @@ class IntValue {
       public int getValue() { return n; }
       public void setValue(int n) { this.n = n; }
       public void increment() { n++; }
    -  @Override
    -  public String toString() {
    +  @Override public String toString() {
         return Integer.toString(n);
       }
     }
    diff --git a/references/OceanReading.java b/references/OceanReading.java
    index b89f1b046..754a13b8d 100644
    --- a/references/OceanReading.java
    +++ b/references/OceanReading.java
    @@ -1,5 +1,5 @@
     // references/OceanReading.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Cloning a composed object
    @@ -13,8 +13,7 @@ public class OceanReading implements Cloneable {
         temperature = new TemperatureReading(tdata);
         depth = new DepthReading(ddata);
       }
    -  @Override
    -  public OceanReading clone() {
    +  @Override public OceanReading clone() {
         OceanReading or = null;
         try {
           or = (OceanReading)super.clone();
    @@ -40,8 +39,7 @@ public DepthReading getDepthReading() {
       public void setDepthReading(DepthReading dr) {
         this.depth = dr;
       }
    -  @Override
    -  public String toString() {
    +  @Override public String toString() {
         return "temperature: " + temperature +
           ", depth: " + depth;
       }
    diff --git a/references/PassReferences.java b/references/PassReferences.java
    index 2a1630087..1bd397438 100644
    --- a/references/PassReferences.java
    +++ b/references/PassReferences.java
    @@ -1,5 +1,5 @@
     // references/PassReferences.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
    @@ -14,6 +14,6 @@ public static void main(String[] args) {
       }
     }
     /* Output:
    -p inside main(): PassReferences@15db9742
    -h inside f(): PassReferences@15db9742
    +p inside main(): PassReferences@19e0bfd
    +h inside f(): PassReferences@19e0bfd
     */
    diff --git a/references/SimplerMutableInteger.java b/references/SimplerMutableInteger.java
    index 191068ca6..1da86b7be 100644
    --- a/references/SimplerMutableInteger.java
    +++ b/references/SimplerMutableInteger.java
    @@ -1,5 +1,5 @@
     // references/SimplerMutableInteger.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // A trivial wrapper class
    diff --git a/references/Snake.java b/references/Snake.java
    index 004f7e765..f45ec7950 100644
    --- a/references/Snake.java
    +++ b/references/Snake.java
    @@ -1,5 +1,5 @@
     // references/Snake.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Tests cloning to see if reference
    @@ -19,15 +19,13 @@ public void increment() {
         if(next != null)
           next.increment();
       }
    -  @Override
    -  public String toString() {
    +  @Override public String toString() {
         String s = ":" + c;
         if(next != null)
           s += next.toString();
         return s;
       }
    -  @Override
    -  public Snake clone() {
    +  @Override public Snake clone() {
         try {
           return (Snake)super.clone();
         } catch(CloneNotSupportedException e) {
    diff --git a/references/Stringer.java b/references/Stringer.java
    index 72663bb57..0a4d0dd8a 100644
    --- a/references/Stringer.java
    +++ b/references/Stringer.java
    @@ -1,5 +1,5 @@
     // references/Stringer.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
    diff --git a/references/TemperatureReading.java b/references/TemperatureReading.java
    index 9b77cfb24..8f9afff6d 100644
    --- a/references/TemperatureReading.java
    +++ b/references/TemperatureReading.java
    @@ -1,5 +1,5 @@
     // references/TemperatureReading.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Cloning a composed object
    @@ -12,8 +12,7 @@ public TemperatureReading(double temperature) {
         time = System.currentTimeMillis();
         this.temperature = temperature;
       }
    -  @Override
    -  public TemperatureReading clone() {
    +  @Override public TemperatureReading clone() {
         try {
           return (TemperatureReading)super.clone();
         } catch(CloneNotSupportedException e) {
    @@ -26,8 +25,7 @@ public double getTemperature() {
       public void setTemperature(double temp) {
         this.temperature = temp;
       }
    -  @Override
    -  public String toString() {
    +  @Override public String toString() {
         return String.valueOf(temperature);
       }
     }
    diff --git a/references/tests/DeepCopyTest.java b/references/tests/DeepCopyTest.java
    index b65a8d89d..5a7fcb6d5 100644
    --- a/references/tests/DeepCopyTest.java
    +++ b/references/tests/DeepCopyTest.java
    @@ -1,5 +1,5 @@
     // references/tests/DeepCopyTest.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package references;
    diff --git a/reuse/Bath.java b/reuse/Bath.java
    index 38e5e8195..51fbe2649 100644
    --- a/reuse/Bath.java
    +++ b/reuse/Bath.java
    @@ -1,5 +1,5 @@
     // reuse/Bath.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Constructor initialization with composition
    @@ -10,8 +10,7 @@ class Soap {
         System.out.println("Soap()");
         s = "Constructed";
       }
    -  @Override
    -  public String toString() { return s; }
    +  @Override public String toString() { return s; }
     }
     
     public class Bath {
    @@ -30,8 +29,7 @@ public Bath() {
       }
       // Instance initialization:
       { i = 47; }
    -  @Override
    -  public String toString() {
    +  @Override public String toString() {
         if(s4 == null) // Delayed initialization:
           s4 = "Joy";
         return
    diff --git a/reuse/Beetle.java b/reuse/Beetle.java
    index 0a41bc176..089f85e07 100644
    --- a/reuse/Beetle.java
    +++ b/reuse/Beetle.java
    @@ -1,5 +1,5 @@
     // reuse/Beetle.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // The full process of initialization
    diff --git a/reuse/BlankFinal.java b/reuse/BlankFinal.java
    index 93818a06a..fd96fe9b8 100644
    --- a/reuse/BlankFinal.java
    +++ b/reuse/BlankFinal.java
    @@ -1,5 +1,5 @@
     // reuse/BlankFinal.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // "Blank" final fields
    diff --git a/reuse/CADSystem.java b/reuse/CADSystem.java
    index 55fbe0d85..c2af7deac 100644
    --- a/reuse/CADSystem.java
    +++ b/reuse/CADSystem.java
    @@ -1,5 +1,5 @@
     // reuse/CADSystem.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Ensuring proper cleanup
    @@ -20,8 +20,7 @@ class Circle extends Shape {
         super(i);
         System.out.println("Drawing Circle");
       }
    -  @Override
    -  void dispose() {
    +  @Override void dispose() {
         System.out.println("Erasing Circle");
         super.dispose();
       }
    @@ -32,8 +31,7 @@ class Triangle extends Shape {
         super(i);
         System.out.println("Drawing Triangle");
       }
    -  @Override
    -  void dispose() {
    +  @Override void dispose() {
         System.out.println("Erasing Triangle");
         super.dispose();
       }
    @@ -48,8 +46,7 @@ class Line extends Shape {
         System.out.println(
           "Drawing Line: " + start + ", " + end);
       }
    -  @Override
    -  void dispose() {
    +  @Override void dispose() {
         System.out.println(
           "Erasing Line: " + start + ", " + end);
         super.dispose();
    @@ -68,8 +65,7 @@ public CADSystem(int i) {
         t = new Triangle(1);
         System.out.println("Combined constructor");
       }
    -  @Override
    -  public void dispose() {
    +  @Override public void dispose() {
         System.out.println("CADSystem.dispose()");
         // The order of cleanup is the reverse
         // of the order of initialization:
    diff --git a/reuse/Car.java b/reuse/Car.java
    index 1bc4377b5..46021e7ad 100644
    --- a/reuse/Car.java
    +++ b/reuse/Car.java
    @@ -1,5 +1,5 @@
     // reuse/Car.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Composition with public objects
    diff --git a/reuse/Cartoon.java b/reuse/Cartoon.java
    index 48741bafb..4b2634570 100644
    --- a/reuse/Cartoon.java
    +++ b/reuse/Cartoon.java
    @@ -1,5 +1,5 @@
     // reuse/Cartoon.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Constructor calls during inheritance
    diff --git a/reuse/Chess.java b/reuse/Chess.java
    index 30f2685bc..2bd41b001 100644
    --- a/reuse/Chess.java
    +++ b/reuse/Chess.java
    @@ -1,5 +1,5 @@
     // reuse/Chess.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Inheritance, constructors and arguments
    diff --git a/reuse/DerivedSpaceShip.java b/reuse/DerivedSpaceShip.java
    index dfbe20ac3..5df55f543 100644
    --- a/reuse/DerivedSpaceShip.java
    +++ b/reuse/DerivedSpaceShip.java
    @@ -1,5 +1,5 @@
     // reuse/DerivedSpaceShip.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
    @@ -9,8 +9,9 @@
       public DerivedSpaceShip(String name) {
         this.name = name;
       }
    -  @Override
    -  public String toString() { return name; }
    +  @Override public String toString() {
    +    return name;
    +  }
       public static void main(String[] args) {
         DerivedSpaceShip protector =
             new DerivedSpaceShip("NSEA Protector");
    diff --git a/reuse/Detergent.java b/reuse/Detergent.java
    index 99f4e7cc3..2f25309d1 100644
    --- a/reuse/Detergent.java
    +++ b/reuse/Detergent.java
    @@ -1,5 +1,5 @@
     // reuse/Detergent.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Inheritance syntax & properties
    @@ -10,8 +10,7 @@ class Cleanser {
       public void dilute() { append(" dilute()"); }
       public void apply() { append(" apply()"); }
       public void scrub() { append(" scrub()"); }
    -  @Override
    -  public String toString() { return s; }
    +  @Override public String toString() { return s; }
       public static void main(String[] args) {
         Cleanser x = new Cleanser();
         x.dilute(); x.apply(); x.scrub();
    @@ -21,8 +20,7 @@ public static void main(String[] args) {
     
     public class Detergent extends Cleanser {
       // Change a method:
    -  @Override
    -  public void scrub() {
    +  @Override public void scrub() {
         append(" Detergent.scrub()");
         super.scrub(); // Call base-class version
       }
    diff --git a/reuse/FinalArguments.java b/reuse/FinalArguments.java
    index 46efed7e1..2c8e649d7 100644
    --- a/reuse/FinalArguments.java
    +++ b/reuse/FinalArguments.java
    @@ -1,5 +1,5 @@
     // reuse/FinalArguments.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Using "final" with method arguments
    diff --git a/reuse/FinalData.java b/reuse/FinalData.java
    index 4376f5c3f..97539e636 100644
    --- a/reuse/FinalData.java
    +++ b/reuse/FinalData.java
    @@ -1,5 +1,5 @@
     // reuse/FinalData.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // The effect of final on fields
    @@ -27,8 +27,7 @@ public class FinalData {
       private static final Value VAL_3 = new Value(33);
       // Arrays:
       private final int[] a = { 1, 2, 3, 4, 5, 6 };
    -  @Override
    -  public String toString() {
    +  @Override public String toString() {
         return id + ": " + "i4 = " + i4
           + ", INT_5 = " + INT_5;
       }
    diff --git a/reuse/FinalOverridingIllusion.java b/reuse/FinalOverridingIllusion.java
    index e5c19ece5..a74df7bef 100644
    --- a/reuse/FinalOverridingIllusion.java
    +++ b/reuse/FinalOverridingIllusion.java
    @@ -1,5 +1,5 @@
     // reuse/FinalOverridingIllusion.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // It only looks like you can override
    diff --git a/reuse/Hide.java b/reuse/Hide.java
    index f718e4b08..e4122091b 100644
    --- a/reuse/Hide.java
    +++ b/reuse/Hide.java
    @@ -1,5 +1,5 @@
     // reuse/Hide.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Overloading a base-class method name in a derived
    diff --git a/reuse/Jurassic.java b/reuse/Jurassic.java
    index 04b7d61c5..7d85e4fb7 100644
    --- a/reuse/Jurassic.java
    +++ b/reuse/Jurassic.java
    @@ -1,5 +1,5 @@
     // reuse/Jurassic.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Making an entire class final
    diff --git a/reuse/Lisa.java b/reuse/Lisa.java
    index 85ec5cc90..68cccf0a7 100644
    --- a/reuse/Lisa.java
    +++ b/reuse/Lisa.java
    @@ -1,5 +1,5 @@
     // reuse/Lisa.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // {WillNotCompile}
    diff --git a/reuse/Orc.java b/reuse/Orc.java
    index c3ba40a8e..c1f984208 100644
    --- a/reuse/Orc.java
    +++ b/reuse/Orc.java
    @@ -1,5 +1,5 @@
     // reuse/Orc.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // The protected keyword
    @@ -8,8 +8,7 @@ class Villain {
       private String name;
       protected void set(String nm) { name = nm; }
       Villain(String name) { this.name = name; }
    -  @Override
    -  public String toString() {
    +  @Override public String toString() {
         return "I'm a Villain and my name is " + name;
       }
     }
    @@ -24,8 +23,7 @@ public void change(String name, int orcNumber) {
         set(name); // Available because it's protected
         this.orcNumber = orcNumber;
       }
    -  @Override
    -  public String toString() {
    +  @Override public String toString() {
         return "Orc " + orcNumber + ": " + super.toString();
       }
       public static void main(String[] args) {
    diff --git a/reuse/PlaceSetting.java b/reuse/PlaceSetting.java
    index b57d6383a..ec2486a80 100644
    --- a/reuse/PlaceSetting.java
    +++ b/reuse/PlaceSetting.java
    @@ -1,5 +1,5 @@
     // reuse/PlaceSetting.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Combining composition & inheritance
    diff --git a/reuse/SpaceShipControls.java b/reuse/SpaceShipControls.java
    index 6fde70867..fba9aaff5 100644
    --- a/reuse/SpaceShipControls.java
    +++ b/reuse/SpaceShipControls.java
    @@ -1,5 +1,5 @@
     // reuse/SpaceShipControls.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
    diff --git a/reuse/SpaceShipDelegation.java b/reuse/SpaceShipDelegation.java
    index c31316b29..aeeca9fc2 100644
    --- a/reuse/SpaceShipDelegation.java
    +++ b/reuse/SpaceShipDelegation.java
    @@ -1,5 +1,5 @@
     // reuse/SpaceShipDelegation.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
    diff --git a/reuse/SprinklerSystem.java b/reuse/SprinklerSystem.java
    index e0ccbe661..6cc174ff7 100644
    --- a/reuse/SprinklerSystem.java
    +++ b/reuse/SprinklerSystem.java
    @@ -1,5 +1,5 @@
     // reuse/SprinklerSystem.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Composition for code reuse
    @@ -10,8 +10,7 @@ class WaterSource {
         System.out.println("WaterSource()");
         s = "Constructed";
       }
    -  @Override
    -  public String toString() { return s; }
    +  @Override public String toString() { return s; }
     }
     
     public class SprinklerSystem {
    @@ -19,15 +18,14 @@ public class SprinklerSystem {
       private WaterSource source = new WaterSource();
       private int i;
       private float f;
    -  @Override
    -  public String toString() {
    +  @Override public String toString() {
         return
           "valve1 = " + valve1 + " " +
           "valve2 = " + valve2 + " " +
           "valve3 = " + valve3 + " " +
           "valve4 = " + valve4 + "\n" +
           "i = " + i + " " + "f = " + f + " " +
    -      "source = " + source; // [1]
    +      "source = " + source;                      // [1]
       }
       public static void main(String[] args) {
         SprinklerSystem sprinklers = new SprinklerSystem();
    diff --git a/reuse/Wind.java b/reuse/Wind.java
    index 3e9a05f6b..ef1c79d17 100644
    --- a/reuse/Wind.java
    +++ b/reuse/Wind.java
    @@ -1,5 +1,5 @@
     // reuse/Wind.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Inheritance & upcasting
    diff --git a/serialization/APerson.java b/serialization/APerson.java
    index 1f67eb1cb..6eb667ae9 100644
    --- a/serialization/APerson.java
    +++ b/serialization/APerson.java
    @@ -1,5 +1,5 @@
     // serialization/APerson.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Use the XOM library to write and read XML
    @@ -32,8 +32,7 @@ public APerson(Element person) {
         last = person
           .getFirstChildElement("last").getValue();
       }
    -  @Override
    -  public String toString() {
    +  @Override public String toString() {
         return first + " " + last;
       }
       // Make it human-readable:
    diff --git a/serialization/AStoreCADState.java b/serialization/AStoreCADState.java
    index 0ce8858a0..f9c9e79f9 100644
    --- a/serialization/AStoreCADState.java
    +++ b/serialization/AStoreCADState.java
    @@ -1,5 +1,5 @@
     // serialization/AStoreCADState.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Saving the state of a fictitious CAD system
    @@ -20,7 +20,7 @@ abstract class Shape implements Serializable {
         yPos = yVal;
         dimension = dim;
       }
    -  public String toString() {
    +  @Override public String toString() {
         return getClass() + "color[" + getColor() +
           "] xPos[" + xPos + "] yPos[" + yPos +
           "] dim[" + dimension + "]\n";
    @@ -43,10 +43,10 @@ class Circle extends Shape {
       Circle(int xVal, int yVal, int dim) {
         super(xVal, yVal, dim);
       }
    -  public void setColor(Color newColor) {
    +  @Override public void setColor(Color newColor) {
         color = newColor;
       }
    -  public Color getColor() { return color; }
    +  @Override public Color getColor() { return color; }
     }
     
     class Square extends Shape {
    @@ -54,10 +54,10 @@ class Square extends Shape {
       Square(int xVal, int yVal, int dim) {
         super(xVal, yVal, dim);
       }
    -  public void setColor(Color newColor) {
    +  @Override public void setColor(Color newColor) {
         color = newColor;
       }
    -  public Color getColor() { return color; }
    +  @Override public Color getColor() { return color; }
     }
     
     class Line extends Shape {
    @@ -73,10 +73,10 @@ class Line extends Shape {
       Line(int xVal, int yVal, int dim) {
         super(xVal, yVal, dim);
       }
    -  public void setColor(Color newColor) {
    +  @Override public void setColor(Color newColor) {
         color = newColor;
       }
    -  public Color getColor() { return color; }
    +  @Override public Color getColor() { return color; }
     }
     
     public class AStoreCADState {
    diff --git a/serialization/Alien.java b/serialization/Alien.java
    index d0b0f5bfb..b0ba09a4e 100644
    --- a/serialization/Alien.java
    +++ b/serialization/Alien.java
    @@ -1,5 +1,5 @@
     // serialization/Alien.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // A serializable class
    diff --git a/serialization/Blip3.java b/serialization/Blip3.java
    index 6741298c0..3d66f5730 100644
    --- a/serialization/Blip3.java
    +++ b/serialization/Blip3.java
    @@ -1,5 +1,5 @@
     // serialization/Blip3.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Reconstructing an externalizable object
    @@ -18,18 +18,15 @@ public Blip3(String x, int a) {
         i = a;
         // s & i initialized only in non-no-arg constructor.
       }
    -  @Override
    -  public String toString() { return s + i; }
    -  @Override
    -  public void writeExternal(ObjectOutput out)
    +  @Override public String toString() { return s + i; }
    +  @Override public void writeExternal(ObjectOutput out)
       throws IOException {
         System.out.println("Blip3.writeExternal");
         // You must do this:
         out.writeObject(s);
         out.writeInt(i);
       }
    -  @Override
    -  public void readExternal(ObjectInput in)
    +  @Override public void readExternal(ObjectInput in)
       throws IOException, ClassNotFoundException {
         System.out.println("Blip3.readExternal");
         // You must do this:
    diff --git a/serialization/Blips.java b/serialization/Blips.java
    index 88116d844..0ae46686f 100644
    --- a/serialization/Blips.java
    +++ b/serialization/Blips.java
    @@ -1,5 +1,5 @@
     // serialization/Blips.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Simple use of Externalizable & a pitfall
    diff --git a/serialization/FreezeAlien.java b/serialization/FreezeAlien.java
    index 0fe8e8314..3ff390b88 100644
    --- a/serialization/FreezeAlien.java
    +++ b/serialization/FreezeAlien.java
    @@ -1,5 +1,5 @@
     // serialization/FreezeAlien.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Create a serialized output file
    diff --git a/serialization/Logon.java b/serialization/Logon.java
    index 3b9109681..c8f6d9c58 100644
    --- a/serialization/Logon.java
    +++ b/serialization/Logon.java
    @@ -1,5 +1,5 @@
     // serialization/Logon.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Demonstrates the "transient" keyword
    @@ -16,8 +16,7 @@ public Logon(String name, String pwd) {
         username = name;
         password = pwd;
       }
    -  @Override
    -  public String toString() {
    +  @Override public String toString() {
         return "logon info: \n   username: " +
           username + "\n   date: " + date +
           "\n   password: " + password;
    @@ -52,11 +51,11 @@ public static void main(String[] args) {
     /* Output:
     logon a = logon info:
        username: Hulk
    -   date: Tue May 09 06:07:47 MDT 2017
    +   date: Sun Jan 24 08:49:30 MST 2021
        password: myLittlePony
    -Recovering object at Tue May 09 06:07:49 MDT 2017
    +Recovering object at Sun Jan 24 08:49:31 MST 2021
     logon a = logon info:
        username: Hulk
    -   date: Tue May 09 06:07:47 MDT 2017
    +   date: Sun Jan 24 08:49:30 MST 2021
        password: null
     */
    diff --git a/serialization/MyWorld.java b/serialization/MyWorld.java
    index 99e39de34..f642530fa 100644
    --- a/serialization/MyWorld.java
    +++ b/serialization/MyWorld.java
    @@ -1,5 +1,5 @@
     // serialization/MyWorld.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.io.*;
    @@ -14,8 +14,7 @@ class Animal implements Serializable {
         name = nm;
         preferredHouse = h;
       }
    -  @Override
    -  public String toString() {
    +  @Override public String toString() {
         return name + "[" + super.toString() +
           "], " + preferredHouse + "\n";
       }
    @@ -77,24 +76,20 @@ public static void main(String[] args) {
       }
     }
     /* Output:
    -animals: [Bosco the dog[Animal@15db9742],
    -House@6d06d69c
    -, Ralph the hamster[Animal@7852e922], House@6d06d69c
    -, Molly the cat[Animal@4e25154f], House@6d06d69c
    +animals: [Bosco the dog[Animal@19e0bfd], House@139a55
    +, Ralph the hamster[Animal@1db9742], House@139a55
    +, Molly the cat[Animal@106d69c], House@139a55
     ]
    -animals1: [Bosco the dog[Animal@7ba4f24f],
    -House@3b9a45b3
    -, Ralph the hamster[Animal@7699a589], House@3b9a45b3
    -, Molly the cat[Animal@58372a00], House@3b9a45b3
    +animals1: [Bosco the dog[Animal@1ee12a7], House@10bedb4
    +, Ralph the hamster[Animal@103dbd3], House@10bedb4
    +, Molly the cat[Animal@167cf4d], House@10bedb4
     ]
    -animals2: [Bosco the dog[Animal@7ba4f24f],
    -House@3b9a45b3
    -, Ralph the hamster[Animal@7699a589], House@3b9a45b3
    -, Molly the cat[Animal@58372a00], House@3b9a45b3
    +animals2: [Bosco the dog[Animal@1ee12a7], House@10bedb4
    +, Ralph the hamster[Animal@103dbd3], House@10bedb4
    +, Molly the cat[Animal@167cf4d], House@10bedb4
     ]
    -animals3: [Bosco the dog[Animal@4dd8dc3],
    -House@6d03e736
    -, Ralph the hamster[Animal@568db2f2], House@6d03e736
    -, Molly the cat[Animal@378bf509], House@6d03e736
    +animals3: [Bosco the dog[Animal@a987ac], House@a3a380
    +, Ralph the hamster[Animal@1453f44], House@a3a380
    +, Molly the cat[Animal@ad8086], House@a3a380
     ]
     */
    diff --git a/serialization/People.java b/serialization/People.java
    index 0e588749a..b30456669 100644
    --- a/serialization/People.java
    +++ b/serialization/People.java
    @@ -1,5 +1,5 @@
     // serialization/People.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // nu.xom.Node comes from http://www.xom.nu
    diff --git a/serialization/RecoverCADState.java b/serialization/RecoverCADState.java
    index 612f501cf..188ac9769 100644
    --- a/serialization/RecoverCADState.java
    +++ b/serialization/RecoverCADState.java
    @@ -1,5 +1,5 @@
     // serialization/RecoverCADState.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Restoring the state of the fictitious CAD system
    diff --git a/serialization/SerialCtl.java b/serialization/SerialCtl.java
    index ed891633d..dd1d41a1f 100644
    --- a/serialization/SerialCtl.java
    +++ b/serialization/SerialCtl.java
    @@ -1,5 +1,5 @@
     // serialization/SerialCtl.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Controlling serialization by adding your own
    @@ -13,8 +13,9 @@ public SerialCtl(String aa, String bb) {
         a = "Not Transient: " + aa;
         b = "Transient: " + bb;
       }
    -  @Override
    -  public String toString() { return a + "\n" + b; }
    +  @Override public String toString() {
    +    return a + "\n" + b;
    +  }
       private void writeObject(ObjectOutputStream stream)
       throws IOException {
         stream.defaultWriteObject();
    diff --git a/serialization/Worm.java b/serialization/Worm.java
    index 666beb87b..08e3d684d 100644
    --- a/serialization/Worm.java
    +++ b/serialization/Worm.java
    @@ -1,5 +1,5 @@
     // serialization/Worm.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Demonstrates object serialization
    @@ -9,8 +9,7 @@
     class Data implements Serializable {
       private int n;
       Data(int n) { this.n = n; }
    -  @Override
    -  public String toString() {
    +  @Override public String toString() {
         return Integer.toString(n);
       }
     }
    @@ -34,8 +33,7 @@ public Worm(int i, char x) {
       public Worm() {
         System.out.println("No-arg constructor");
       }
    -  @Override
    -  public String toString() {
    +  @Override public String toString() {
         StringBuilder result = new StringBuilder(":");
         result.append(c);
         result.append("(");
    diff --git a/serialization/xfiles/ThawAlien.java b/serialization/xfiles/ThawAlien.java
    index 1de6ce6af..850abd40d 100644
    --- a/serialization/xfiles/ThawAlien.java
    +++ b/serialization/xfiles/ThawAlien.java
    @@ -1,5 +1,5 @@
     // serialization/xfiles/ThawAlien.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Recover a serialized file
    diff --git a/standardio/ChangeSystemOut.java b/standardio/ChangeSystemOut.java
    index 2b37acb86..e0a06bb7a 100644
    --- a/standardio/ChangeSystemOut.java
    +++ b/standardio/ChangeSystemOut.java
    @@ -1,5 +1,5 @@
     // standardio/ChangeSystemOut.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Turn System.out into a PrintWriter
    diff --git a/standardio/Echo.java b/standardio/Echo.java
    index d1a6103e9..1119d6ce6 100644
    --- a/standardio/Echo.java
    +++ b/standardio/Echo.java
    @@ -1,5 +1,5 @@
     // standardio/Echo.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // How to read from standard input
    diff --git a/standardio/OSExecuteDemo.java b/standardio/OSExecuteDemo.java
    index cc2fd4b04..608efe81b 100644
    --- a/standardio/OSExecuteDemo.java
    +++ b/standardio/OSExecuteDemo.java
    @@ -1,5 +1,5 @@
     // standardio/OSExecuteDemo.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Demonstrates standard I/O redirection
    diff --git a/standardio/Redirecting.java b/standardio/Redirecting.java
    index c2986a2bd..c89ef6303 100644
    --- a/standardio/Redirecting.java
    +++ b/standardio/Redirecting.java
    @@ -1,5 +1,5 @@
     // standardio/Redirecting.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Demonstrates standard I/O redirection
    diff --git a/staticchecking/DogsAndRobots.cpp b/staticchecking/DogsAndRobots.cpp
    index 03b69a969..e7c1cbbc7 100644
    --- a/staticchecking/DogsAndRobots.cpp
    +++ b/staticchecking/DogsAndRobots.cpp
    @@ -1,5 +1,5 @@
     // staticchecking/DogsAndRobots.cpp
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     #include 
    diff --git a/staticchecking/DogsAndRobots.py b/staticchecking/DogsAndRobots.py
    index a6b239dab..df423de0b 100644
    --- a/staticchecking/DogsAndRobots.py
    +++ b/staticchecking/DogsAndRobots.py
    @@ -1,5 +1,5 @@
     # staticchecking/DogsAndRobots.py
    -# (c)2020 MindView LLC: see Copyright.txt
    +# (c)2021 MindView LLC: see Copyright.txt
     # We make no guarantees that this code is fit for any purpose.
     # Visit http://OnJava8.com for more book information.
     
    diff --git a/staticchecking/NoBasePetSpeak.py b/staticchecking/NoBasePetSpeak.py
    index cbe6c82b6..13590f221 100644
    --- a/staticchecking/NoBasePetSpeak.py
    +++ b/staticchecking/NoBasePetSpeak.py
    @@ -1,5 +1,5 @@
     # staticchecking/NoBasePetSpeak.py
    -# (c)2020 MindView LLC: see Copyright.txt
    +# (c)2021 MindView LLC: see Copyright.txt
     # We make no guarantees that this code is fit for any purpose.
     # Visit http://OnJava8.com for more book information.
     #- Speaking pets without base classes
    diff --git a/staticchecking/PetSpeak.py b/staticchecking/PetSpeak.py
    index e3734e2fc..8699a6c83 100644
    --- a/staticchecking/PetSpeak.py
    +++ b/staticchecking/PetSpeak.py
    @@ -1,5 +1,5 @@
     # staticchecking/PetSpeak.py
    -# (c)2020 MindView LLC: see Copyright.txt
    +# (c)2021 MindView LLC: see Copyright.txt
     # We make no guarantees that this code is fit for any purpose.
     # Visit http://OnJava8.com for more book information.
     #- Speaking pets in Python
    diff --git a/staticchecking/dogsandrobots.go b/staticchecking/dogsandrobots.go
    index d3dd10cb6..6f353bd83 100644
    --- a/staticchecking/dogsandrobots.go
    +++ b/staticchecking/dogsandrobots.go
    @@ -1,5 +1,5 @@
     // staticchecking/dogsandrobots.go
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package main
    diff --git a/staticchecking/dr/DogsAndRobots.java b/staticchecking/dr/DogsAndRobots.java
    index 9bede8045..3297a663a 100644
    --- a/staticchecking/dr/DogsAndRobots.java
    +++ b/staticchecking/dr/DogsAndRobots.java
    @@ -1,5 +1,5 @@
     // staticchecking/dr/DogsAndRobots.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // {java staticchecking.dr.DogsAndRobots}
    @@ -8,14 +8,14 @@
     interface Speaks { void talk(); }
     
     class Dog implements Speaks {
    -  public void talk() {
    +  @Override public void talk() {
         System.out.println("Woof!");
       }
       public void reproduce() { }
     }
     
     class Robot implements Speaks {
    -  public void talk() {
    +  @Override public void talk() {
         System.out.println("Click!");
       }
       public void oilChange() { }
    diff --git a/staticchecking/drc/DogAndRobotCollections.java b/staticchecking/drc/DogAndRobotCollections.java
    index 16a82ed54..fdcbed71e 100644
    --- a/staticchecking/drc/DogAndRobotCollections.java
    +++ b/staticchecking/drc/DogAndRobotCollections.java
    @@ -1,5 +1,5 @@
     // staticchecking/drc/DogAndRobotCollections.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // {java staticchecking.drc.DogAndRobotCollections}
    diff --git a/staticchecking/latent/Latent.java b/staticchecking/latent/Latent.java
    index 29e53713e..04a374fb2 100644
    --- a/staticchecking/latent/Latent.java
    +++ b/staticchecking/latent/Latent.java
    @@ -1,5 +1,5 @@
     // staticchecking/latent/Latent.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // {java staticchecking.latent.Latent}
    @@ -22,6 +22,7 @@ public void oilChange() {}
     
     class Mime {
       public void walkAgainstTheWind() {}
    +  @Override
       public String toString() { return "Mime"; }
     }
     
    diff --git a/staticchecking/petspeak.go b/staticchecking/petspeak.go
    index 1d5c5e462..497178a4a 100644
    --- a/staticchecking/petspeak.go
    +++ b/staticchecking/petspeak.go
    @@ -1,5 +1,5 @@
     // staticchecking/petspeak.go
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package main
    diff --git a/staticchecking/petspeak/PetSpeak.java b/staticchecking/petspeak/PetSpeak.java
    index 0b850c3b4..86a3db3d7 100644
    --- a/staticchecking/petspeak/PetSpeak.java
    +++ b/staticchecking/petspeak/PetSpeak.java
    @@ -1,5 +1,5 @@
     // staticchecking/petspeak/PetSpeak.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Speaking pets in Java
    @@ -11,13 +11,13 @@ interface Pet {
     }
     
     class Cat implements Pet {
    -  public void speak() {
    +  @Override public void speak() {
         System.out.println("meow!");
       }
     }
     
     class Dog implements Pet {
    -  public void speak() {
    +  @Override public void speak() {
         System.out.println("woof!");
       }
     }
    diff --git a/streams/ArrayStreams.java b/streams/ArrayStreams.java
    index dfed6e83b..74c164606 100644
    --- a/streams/ArrayStreams.java
    +++ b/streams/ArrayStreams.java
    @@ -1,5 +1,5 @@
     // streams/ArrayStreams.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    diff --git a/streams/Bubble.java b/streams/Bubble.java
    index 5650e5ae2..86c99297d 100644
    --- a/streams/Bubble.java
    +++ b/streams/Bubble.java
    @@ -1,5 +1,5 @@
     // streams/Bubble.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.function.*;
    @@ -7,8 +7,7 @@
     public class Bubble {
       public final int i;
       public Bubble(int n) { i = n; }
    -  @Override
    -  public String toString() {
    +  @Override public String toString() {
         return "Bubble(" + i + ")";
       }
       private static int count = 0;
    diff --git a/streams/Bubbles.java b/streams/Bubbles.java
    index 1b3bd2b9d..21efc8a44 100644
    --- a/streams/Bubbles.java
    +++ b/streams/Bubbles.java
    @@ -1,5 +1,5 @@
     // streams/Bubbles.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.stream.*;
    diff --git a/streams/CollectionToStream.java b/streams/CollectionToStream.java
    index 93236ef1f..7b7c69cea 100644
    --- a/streams/CollectionToStream.java
    +++ b/streams/CollectionToStream.java
    @@ -1,5 +1,5 @@
     // streams/CollectionToStream.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    diff --git a/streams/CreatingOptionals.java b/streams/CreatingOptionals.java
    index 7e886ddc2..4f30cf52c 100644
    --- a/streams/CreatingOptionals.java
    +++ b/streams/CreatingOptionals.java
    @@ -1,5 +1,5 @@
     // streams/CreatingOptionals.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    diff --git a/streams/Duplicator.java b/streams/Duplicator.java
    index 267279c7b..9e9f87eec 100644
    --- a/streams/Duplicator.java
    +++ b/streams/Duplicator.java
    @@ -1,5 +1,5 @@
     // streams/Duplicator.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.stream.*;
    diff --git a/streams/Fibonacci.java b/streams/Fibonacci.java
    index fa53c6879..0fb47d3f3 100644
    --- a/streams/Fibonacci.java
    +++ b/streams/Fibonacci.java
    @@ -1,5 +1,5 @@
     // streams/Fibonacci.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.stream.*;
    diff --git a/streams/FileToWords.java b/streams/FileToWords.java
    index 7f7174cbe..1e90d7a4b 100644
    --- a/streams/FileToWords.java
    +++ b/streams/FileToWords.java
    @@ -1,5 +1,5 @@
     // streams/FileToWords.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.nio.file.*;
    diff --git a/streams/FileToWordsBuilder.java b/streams/FileToWordsBuilder.java
    index d5ac62be5..5e830b8bb 100644
    --- a/streams/FileToWordsBuilder.java
    +++ b/streams/FileToWordsBuilder.java
    @@ -1,5 +1,5 @@
     // streams/FileToWordsBuilder.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.io.*;
    diff --git a/streams/FileToWordsRegexp.java b/streams/FileToWordsRegexp.java
    index dfff507e1..f01c853aa 100644
    --- a/streams/FileToWordsRegexp.java
    +++ b/streams/FileToWordsRegexp.java
    @@ -1,5 +1,5 @@
     // streams/FileToWordsRegexp.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.io.*;
    diff --git a/streams/FileToWordsTest.java b/streams/FileToWordsTest.java
    index a81f72096..7c95bebd5 100644
    --- a/streams/FileToWordsTest.java
    +++ b/streams/FileToWordsTest.java
    @@ -1,5 +1,5 @@
     // streams/FileToWordsTest.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.stream.*;
    diff --git a/streams/FlatMap.java b/streams/FlatMap.java
    index e2b3137fa..8e5fe8d69 100644
    --- a/streams/FlatMap.java
    +++ b/streams/FlatMap.java
    @@ -1,5 +1,5 @@
     // streams/FlatMap.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.stream.*;
    diff --git a/streams/ForEach.java b/streams/ForEach.java
    index f0abe2558..a8ed8edea 100644
    --- a/streams/ForEach.java
    +++ b/streams/ForEach.java
    @@ -1,5 +1,5 @@
     // streams/ForEach.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    @@ -23,6 +23,6 @@ public static void main(String[] args) {
     }
     /* Output:
     258 555 693 861 961 429 868 200 522 207 288 128 551 589
    -551 861 429 589 200 522 555 693 258 128 868 288 961 207
    +551 589 861 555 288 128 429 207 693 200 258 522 868 961
     258 555 693 861 961 429 868 200 522 207 288 128 551 589
     */
    diff --git a/streams/FunctionMap.java b/streams/FunctionMap.java
    index 3c7c90e79..9b2fc4744 100644
    --- a/streams/FunctionMap.java
    +++ b/streams/FunctionMap.java
    @@ -1,5 +1,5 @@
     // streams/FunctionMap.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    diff --git a/streams/FunctionMap2.java b/streams/FunctionMap2.java
    index 4d9f29726..130cd7292 100644
    --- a/streams/FunctionMap2.java
    +++ b/streams/FunctionMap2.java
    @@ -1,5 +1,5 @@
     // streams/FunctionMap2.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Different input and output types
    @@ -9,8 +9,7 @@
     class Numbered {
       final int n;
       Numbered(int n) { this.n = n; }
    -  @Override
    -  public String toString() {
    +  @Override public String toString() {
         return "Numbered(" + n + ")";
       }
     }
    diff --git a/streams/FunctionMap3.java b/streams/FunctionMap3.java
    index 74236af31..6214fa327 100644
    --- a/streams/FunctionMap3.java
    +++ b/streams/FunctionMap3.java
    @@ -1,5 +1,5 @@
     // streams/FunctionMap3.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Producing numeric output streams
    diff --git a/streams/Generator.java b/streams/Generator.java
    index c9aba7404..f83741216 100644
    --- a/streams/Generator.java
    +++ b/streams/Generator.java
    @@ -1,5 +1,5 @@
     // streams/Generator.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    @@ -10,7 +10,7 @@ public class Generator implements Supplier {
       Random rand = new Random(47);
       char[] letters =
         "ABCDEFGHIJKLMNOPQRSTUVWXYZ".toCharArray();
    -  public String get() {
    +  @Override public String get() {
         return "" + letters[rand.nextInt(letters.length)];
       }
       public static void main(String[] args) {
    diff --git a/streams/ImperativeRandoms.java b/streams/ImperativeRandoms.java
    index f9baaca5b..a11a072e4 100644
    --- a/streams/ImperativeRandoms.java
    +++ b/streams/ImperativeRandoms.java
    @@ -1,5 +1,5 @@
     // streams/ImperativeRandoms.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    diff --git a/streams/Informational.java b/streams/Informational.java
    index dd80585c3..bc33ca4d3 100644
    --- a/streams/Informational.java
    +++ b/streams/Informational.java
    @@ -1,5 +1,5 @@
     // streams/Informational.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.stream.*;
    diff --git a/streams/LastElement.java b/streams/LastElement.java
    index 398b0488d..74a745526 100644
    --- a/streams/LastElement.java
    +++ b/streams/LastElement.java
    @@ -1,5 +1,5 @@
     // streams/LastElement.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    diff --git a/streams/Looping.java b/streams/Looping.java
    index 715ad052e..bfb49d031 100644
    --- a/streams/Looping.java
    +++ b/streams/Looping.java
    @@ -1,5 +1,5 @@
     // streams/Looping.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import static onjava.Repeat.*;
    diff --git a/streams/Machine2.java b/streams/Machine2.java
    index 3d407185c..e7b425ea7 100644
    --- a/streams/Machine2.java
    +++ b/streams/Machine2.java
    @@ -1,5 +1,5 @@
     // streams/Machine2.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    diff --git a/streams/MapCollector.java b/streams/MapCollector.java
    index 95811e4b1..5ab66f715 100644
    --- a/streams/MapCollector.java
    +++ b/streams/MapCollector.java
    @@ -1,5 +1,5 @@
     // streams/MapCollector.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    @@ -14,8 +14,7 @@ class Pair {
       }
       public Character getC() { return c; }
       public Integer getI() { return i; }
    -  @Override
    -  public String toString() {
    +  @Override public String toString() {
         return "Pair(" + c + ", " + i + ")";
       }
     }
    diff --git a/streams/Matching.java b/streams/Matching.java
    index f5c01bc6d..4aa6280f5 100644
    --- a/streams/Matching.java
    +++ b/streams/Matching.java
    @@ -1,5 +1,5 @@
     // streams/Matching.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Demonstrates short-circuiting of *Match() operations
    diff --git a/streams/NumericStreamInfo.java b/streams/NumericStreamInfo.java
    index 0d04b6ef3..3cc6c88e3 100644
    --- a/streams/NumericStreamInfo.java
    +++ b/streams/NumericStreamInfo.java
    @@ -1,5 +1,5 @@
     // streams/NumericStreamInfo.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.stream.*;
    diff --git a/streams/OptionalBasics.java b/streams/OptionalBasics.java
    index 625c450ab..525611d21 100644
    --- a/streams/OptionalBasics.java
    +++ b/streams/OptionalBasics.java
    @@ -1,5 +1,5 @@
     // streams/OptionalBasics.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    diff --git a/streams/OptionalFilter.java b/streams/OptionalFilter.java
    index a2095ec3b..72e2011c0 100644
    --- a/streams/OptionalFilter.java
    +++ b/streams/OptionalFilter.java
    @@ -1,5 +1,5 @@
     // streams/OptionalFilter.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    diff --git a/streams/OptionalFlatMap.java b/streams/OptionalFlatMap.java
    index 52e8e81e8..fe5bcdddf 100644
    --- a/streams/OptionalFlatMap.java
    +++ b/streams/OptionalFlatMap.java
    @@ -1,5 +1,5 @@
     // streams/OptionalFlatMap.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    diff --git a/streams/OptionalMap.java b/streams/OptionalMap.java
    index 83ae4396b..50a385ed1 100644
    --- a/streams/OptionalMap.java
    +++ b/streams/OptionalMap.java
    @@ -1,5 +1,5 @@
     // streams/OptionalMap.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    diff --git a/streams/Optionals.java b/streams/Optionals.java
    index 4d0d96cbd..c4512b4bf 100644
    --- a/streams/Optionals.java
    +++ b/streams/Optionals.java
    @@ -1,5 +1,5 @@
     // streams/Optionals.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    diff --git a/streams/OptionalsFromEmptyStreams.java b/streams/OptionalsFromEmptyStreams.java
    index 771a84c0b..be206bf8d 100644
    --- a/streams/OptionalsFromEmptyStreams.java
    +++ b/streams/OptionalsFromEmptyStreams.java
    @@ -1,5 +1,5 @@
     // streams/OptionalsFromEmptyStreams.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    diff --git a/streams/Peeking.java b/streams/Peeking.java
    index d88005150..75dcb3467 100644
    --- a/streams/Peeking.java
    +++ b/streams/Peeking.java
    @@ -1,5 +1,5 @@
     // streams/Peeking.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
    diff --git a/streams/Prime.java b/streams/Prime.java
    index e14459d1a..34e802294 100644
    --- a/streams/Prime.java
    +++ b/streams/Prime.java
    @@ -1,5 +1,5 @@
     // streams/Prime.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.stream.*;
    diff --git a/streams/RandInts.java b/streams/RandInts.java
    index 8adfc60e2..8e6c2bb2d 100644
    --- a/streams/RandInts.java
    +++ b/streams/RandInts.java
    @@ -1,5 +1,5 @@
     // streams/RandInts.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package streams;
    diff --git a/streams/RandomGenerators.java b/streams/RandomGenerators.java
    index 904216ac6..78d6f231a 100644
    --- a/streams/RandomGenerators.java
    +++ b/streams/RandomGenerators.java
    @@ -1,5 +1,5 @@
     // streams/RandomGenerators.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    diff --git a/streams/RandomWords.java b/streams/RandomWords.java
    index 3bf2e51bb..6f2df4edc 100644
    --- a/streams/RandomWords.java
    +++ b/streams/RandomWords.java
    @@ -1,5 +1,5 @@
     // streams/RandomWords.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    @@ -20,11 +20,10 @@ public class RandomWords implements Supplier {
             words.add(word.toLowerCase());
         }
       }
    -  public String get() {
    +  @Override public String get() {
         return words.get(rand.nextInt(words.size()));
       }
    -  @Override
    -  public String toString() {
    +  @Override public String toString() {
         return words.stream()
           .collect(Collectors.joining(" "));
       }
    diff --git a/streams/Randoms.java b/streams/Randoms.java
    index f2b5f6a8a..52e05df05 100644
    --- a/streams/Randoms.java
    +++ b/streams/Randoms.java
    @@ -1,5 +1,5 @@
     // streams/Randoms.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    diff --git a/streams/Ranges.java b/streams/Ranges.java
    index d8fc681ac..1a4da9018 100644
    --- a/streams/Ranges.java
    +++ b/streams/Ranges.java
    @@ -1,5 +1,5 @@
     // streams/Ranges.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import static java.util.stream.IntStream.*;
    diff --git a/streams/Reduce.java b/streams/Reduce.java
    index 0e9f07ba9..9d513f496 100644
    --- a/streams/Reduce.java
    +++ b/streams/Reduce.java
    @@ -1,5 +1,5 @@
     // streams/Reduce.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    @@ -8,8 +8,7 @@
     class Frobnitz {
       int size;
       Frobnitz(int sz) { size = sz; }
    -  @Override
    -  public String toString() {
    +  @Override public String toString() {
         return "Frobnitz(" + size + ")";
       }
       // Generator:
    diff --git a/streams/SelectElement.java b/streams/SelectElement.java
    index 86846e404..a6b504498 100644
    --- a/streams/SelectElement.java
    +++ b/streams/SelectElement.java
    @@ -1,5 +1,5 @@
     // streams/SelectElement.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    diff --git a/streams/Signal.java b/streams/Signal.java
    index 9dc2a9f41..4b14200f4 100644
    --- a/streams/Signal.java
    +++ b/streams/Signal.java
    @@ -1,5 +1,5 @@
     // streams/Signal.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    @@ -10,8 +10,7 @@ public class Signal {
       private final String msg;
       public Signal(String msg) { this.msg = msg; }
       public String getMsg() { return msg; }
    -  @Override
    -  public String toString() {
    +  @Override public String toString() {
         return "Signal(" + msg + ")";
       }
       static Random rand = new Random(47);
    diff --git a/streams/SortedComparator.java b/streams/SortedComparator.java
    index 070d60a7c..4d60a6486 100644
    --- a/streams/SortedComparator.java
    +++ b/streams/SortedComparator.java
    @@ -1,5 +1,5 @@
     // streams/SortedComparator.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    diff --git a/streams/SpecialCollector.java b/streams/SpecialCollector.java
    index 9526a73ea..36068bf7b 100644
    --- a/streams/SpecialCollector.java
    +++ b/streams/SpecialCollector.java
    @@ -1,5 +1,5 @@
     // streams/SpecialCollector.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    diff --git a/streams/StreamOf.java b/streams/StreamOf.java
    index c143388a3..7ae3adefc 100644
    --- a/streams/StreamOf.java
    +++ b/streams/StreamOf.java
    @@ -1,5 +1,5 @@
     // streams/StreamOf.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.stream.*;
    diff --git a/streams/StreamOfOptionals.java b/streams/StreamOfOptionals.java
    index f725df578..4b0b048b0 100644
    --- a/streams/StreamOfOptionals.java
    +++ b/streams/StreamOfOptionals.java
    @@ -1,5 +1,5 @@
     // streams/StreamOfOptionals.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    diff --git a/streams/StreamOfRandoms.java b/streams/StreamOfRandoms.java
    index 66bf2bc7d..6b83b83ba 100644
    --- a/streams/StreamOfRandoms.java
    +++ b/streams/StreamOfRandoms.java
    @@ -1,5 +1,5 @@
     // streams/StreamOfRandoms.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    diff --git a/streams/StreamOfStreams.java b/streams/StreamOfStreams.java
    index 973d83a6b..d282a6724 100644
    --- a/streams/StreamOfStreams.java
    +++ b/streams/StreamOfStreams.java
    @@ -1,5 +1,5 @@
     // streams/StreamOfStreams.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.stream.*;
    diff --git a/streams/TreeSetOfWords.java b/streams/TreeSetOfWords.java
    index feaa56a2a..93405f74e 100644
    --- a/streams/TreeSetOfWords.java
    +++ b/streams/TreeSetOfWords.java
    @@ -1,5 +1,5 @@
     // streams/TreeSetOfWords.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    diff --git a/strings/ArrayListDisplay.java b/strings/ArrayListDisplay.java
    index 7b83296f0..586f013a2 100644
    --- a/strings/ArrayListDisplay.java
    +++ b/strings/ArrayListDisplay.java
    @@ -1,5 +1,5 @@
     // strings/ArrayListDisplay.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    diff --git a/strings/BetterRead.java b/strings/BetterRead.java
    index a3b7aaa2d..02c55c397 100644
    --- a/strings/BetterRead.java
    +++ b/strings/BetterRead.java
    @@ -1,5 +1,5 @@
     // strings/BetterRead.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    diff --git a/strings/Concatenation.java b/strings/Concatenation.java
    index 685f4dbb6..33e703a85 100644
    --- a/strings/Concatenation.java
    +++ b/strings/Concatenation.java
    @@ -1,5 +1,5 @@
     // strings/Concatenation.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
    diff --git a/strings/Conversion.java b/strings/Conversion.java
    index f839e81a2..c417c875c 100644
    --- a/strings/Conversion.java
    +++ b/strings/Conversion.java
    @@ -1,5 +1,5 @@
     // strings/Conversion.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.math.*;
    @@ -104,8 +104,8 @@ public static void main(String[] args) {
     h: 1ef462c
     y = new Conversion()
     b: true
    -s: Conversion@15db9742
    -h: 15db9742
    +s: Conversion@19e0bfd
    +h: 19e0bfd
     z = false
     b: false
     s: false
    diff --git a/strings/DatabaseException.java b/strings/DatabaseException.java
    index e84412546..5a7a9bd98 100644
    --- a/strings/DatabaseException.java
    +++ b/strings/DatabaseException.java
    @@ -1,5 +1,5 @@
     // strings/DatabaseException.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
    diff --git a/strings/Finding.java b/strings/Finding.java
    index f8d7cbbce..096b080d4 100644
    --- a/strings/Finding.java
    +++ b/strings/Finding.java
    @@ -1,5 +1,5 @@
     // strings/Finding.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.regex.*;
    diff --git a/strings/Groups.java b/strings/Groups.java
    index 298caf627..b98fcddcc 100644
    --- a/strings/Groups.java
    +++ b/strings/Groups.java
    @@ -1,5 +1,5 @@
     // strings/Groups.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.regex.*;
    diff --git a/strings/Hex.java b/strings/Hex.java
    index 0fbcea8e4..47f05b80f 100644
    --- a/strings/Hex.java
    +++ b/strings/Hex.java
    @@ -1,5 +1,5 @@
     // strings/Hex.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // {java onjava.Hex}
    diff --git a/strings/Immutable.java b/strings/Immutable.java
    index 4c8b529e7..365c3ebe3 100644
    --- a/strings/Immutable.java
    +++ b/strings/Immutable.java
    @@ -1,5 +1,5 @@
     // strings/Immutable.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
    diff --git a/strings/InfiniteRecursion.java b/strings/InfiniteRecursion.java
    index 6941490a5..cc523ec88 100644
    --- a/strings/InfiniteRecursion.java
    +++ b/strings/InfiniteRecursion.java
    @@ -1,5 +1,5 @@
     // strings/InfiniteRecursion.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Accidental recursion
    @@ -9,8 +9,7 @@
     import java.util.stream.*;
     
     public class InfiniteRecursion {
    -  @Override
    -  public String toString() {
    +  @Override public String toString() {
         return
           " InfiniteRecursion address: " + this + "\n";
       }
    diff --git a/strings/IntegerMatch.java b/strings/IntegerMatch.java
    index 5a3a38ac8..c951a2cf9 100644
    --- a/strings/IntegerMatch.java
    +++ b/strings/IntegerMatch.java
    @@ -1,5 +1,5 @@
     // strings/IntegerMatch.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
    diff --git a/strings/JGrep.java b/strings/JGrep.java
    index 49cec9547..946e8ff63 100644
    --- a/strings/JGrep.java
    +++ b/strings/JGrep.java
    @@ -1,5 +1,5 @@
     // strings/JGrep.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // A very simple version of the "grep" program
    diff --git a/strings/ReFlags.java b/strings/ReFlags.java
    index 856806eee..a407b6c97 100644
    --- a/strings/ReFlags.java
    +++ b/strings/ReFlags.java
    @@ -1,5 +1,5 @@
     // strings/ReFlags.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.regex.*;
    diff --git a/strings/ReceiptBuilder.java b/strings/ReceiptBuilder.java
    index 234ca1e67..e58e8bb64 100644
    --- a/strings/ReceiptBuilder.java
    +++ b/strings/ReceiptBuilder.java
    @@ -1,5 +1,5 @@
     // strings/ReceiptBuilder.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    diff --git a/strings/Replacing.java b/strings/Replacing.java
    index dbc21afe2..90394c32e 100644
    --- a/strings/Replacing.java
    +++ b/strings/Replacing.java
    @@ -1,5 +1,5 @@
     // strings/Replacing.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
    diff --git a/strings/ReplacingStringTokenizer.java b/strings/ReplacingStringTokenizer.java
    index 60fad1848..9c2bee8ad 100644
    --- a/strings/ReplacingStringTokenizer.java
    +++ b/strings/ReplacingStringTokenizer.java
    @@ -1,5 +1,5 @@
     // strings/ReplacingStringTokenizer.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    diff --git a/strings/Resetting.java b/strings/Resetting.java
    index f15653903..67c4c8cd5 100644
    --- a/strings/Resetting.java
    +++ b/strings/Resetting.java
    @@ -1,5 +1,5 @@
     // strings/Resetting.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.regex.*;
    diff --git a/strings/Rudolph.java b/strings/Rudolph.java
    index 7a338510a..b90813c7d 100644
    --- a/strings/Rudolph.java
    +++ b/strings/Rudolph.java
    @@ -1,5 +1,5 @@
     // strings/Rudolph.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
    diff --git a/strings/ScannerDelimiter.java b/strings/ScannerDelimiter.java
    index a06ed990d..7ac41a4c3 100644
    --- a/strings/ScannerDelimiter.java
    +++ b/strings/ScannerDelimiter.java
    @@ -1,5 +1,5 @@
     // strings/ScannerDelimiter.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    diff --git a/strings/SimpleFormat.java b/strings/SimpleFormat.java
    index a3a6e52fe..106f92572 100644
    --- a/strings/SimpleFormat.java
    +++ b/strings/SimpleFormat.java
    @@ -1,5 +1,5 @@
     // strings/SimpleFormat.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
    diff --git a/strings/SimpleRead.java b/strings/SimpleRead.java
    index e85a058a5..15533b973 100644
    --- a/strings/SimpleRead.java
    +++ b/strings/SimpleRead.java
    @@ -1,5 +1,5 @@
     // strings/SimpleRead.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.io.*;
    diff --git a/strings/SplitDemo.java b/strings/SplitDemo.java
    index 657453922..3d5eb6719 100644
    --- a/strings/SplitDemo.java
    +++ b/strings/SplitDemo.java
    @@ -1,5 +1,5 @@
     // strings/SplitDemo.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.regex.*;
    diff --git a/strings/Splitting.java b/strings/Splitting.java
    index 0afe3a402..f22ea1a37 100644
    --- a/strings/Splitting.java
    +++ b/strings/Splitting.java
    @@ -1,5 +1,5 @@
     // strings/Splitting.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    diff --git a/strings/StartEnd.java b/strings/StartEnd.java
    index 03caf520c..072dde8de 100644
    --- a/strings/StartEnd.java
    +++ b/strings/StartEnd.java
    @@ -1,5 +1,5 @@
     // strings/StartEnd.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.regex.*;
    diff --git a/strings/TestRegularExpression.java b/strings/TestRegularExpression.java
    index fe79ce8b2..d20af088f 100644
    --- a/strings/TestRegularExpression.java
    +++ b/strings/TestRegularExpression.java
    @@ -1,5 +1,5 @@
     // strings/TestRegularExpression.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Simple regular expression demonstration
    diff --git a/strings/TheReplacements.java b/strings/TheReplacements.java
    index 2319552fe..cd543ab59 100644
    --- a/strings/TheReplacements.java
    +++ b/strings/TheReplacements.java
    @@ -1,5 +1,5 @@
     // strings/TheReplacements.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.regex.*;
    diff --git a/strings/ThreatAnalyzer.java b/strings/ThreatAnalyzer.java
    index fc145c86e..28c500054 100644
    --- a/strings/ThreatAnalyzer.java
    +++ b/strings/ThreatAnalyzer.java
    @@ -1,5 +1,5 @@
     // strings/ThreatAnalyzer.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.regex.*;
    diff --git a/strings/Turtle.java b/strings/Turtle.java
    index 68977bfc2..f3121b755 100644
    --- a/strings/Turtle.java
    +++ b/strings/Turtle.java
    @@ -1,5 +1,5 @@
     // strings/Turtle.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.io.*;
    diff --git a/strings/UsingStringBuilder.java b/strings/UsingStringBuilder.java
    index 0ff324102..a5511ff63 100644
    --- a/strings/UsingStringBuilder.java
    +++ b/strings/UsingStringBuilder.java
    @@ -1,5 +1,5 @@
     // strings/UsingStringBuilder.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    diff --git a/strings/WhitherStringBuilder.java b/strings/WhitherStringBuilder.java
    index 0c46cae3b..f39d3f11f 100644
    --- a/strings/WhitherStringBuilder.java
    +++ b/strings/WhitherStringBuilder.java
    @@ -1,5 +1,5 @@
     // strings/WhitherStringBuilder.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
    diff --git a/typeinfo/AnonymousImplementation.java b/typeinfo/AnonymousImplementation.java
    index 34fa7832c..7cff12823 100644
    --- a/typeinfo/AnonymousImplementation.java
    +++ b/typeinfo/AnonymousImplementation.java
    @@ -1,5 +1,5 @@
     // typeinfo/AnonymousImplementation.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Anonymous inner classes can't hide from reflection
    @@ -8,7 +8,7 @@
     class AnonymousA {
       public static A makeA() {
         return new A() {
    -      public void f() {
    +      @Override public void f() {
             System.out.println("public C.f()");
           }
           public void g() {
    diff --git a/typeinfo/BoundedClassReferences.java b/typeinfo/BoundedClassReferences.java
    index ed0945e60..58d7eb009 100644
    --- a/typeinfo/BoundedClassReferences.java
    +++ b/typeinfo/BoundedClassReferences.java
    @@ -1,5 +1,5 @@
     // typeinfo/BoundedClassReferences.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
    diff --git a/typeinfo/ClassCasts.java b/typeinfo/ClassCasts.java
    index fd0e17cf6..5f36ba4b3 100644
    --- a/typeinfo/ClassCasts.java
    +++ b/typeinfo/ClassCasts.java
    @@ -1,5 +1,5 @@
     // typeinfo/ClassCasts.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
    diff --git a/typeinfo/ClassInitialization.java b/typeinfo/ClassInitialization.java
    index ba1d50e81..3814949d8 100644
    --- a/typeinfo/ClassInitialization.java
    +++ b/typeinfo/ClassInitialization.java
    @@ -1,5 +1,5 @@
     // typeinfo/ClassInitialization.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    @@ -35,9 +35,9 @@ public class ClassInitialization {
         System.out.println("After creating Initable ref");
         // Does not trigger initialization:
         System.out.println(Initable.STATIC_FINAL);
    -    // Does trigger initialization:
    +    // Triggers initialization:
         System.out.println(Initable.STATIC_FINAL2);
    -    // Does trigger initialization:
    +    // Triggers initialization:
         System.out.println(Initable2.staticNonFinal);
         Class initable3 = Class.forName("Initable3");
         System.out.println("After creating Initable3 ref");
    diff --git a/typeinfo/DynamicSupplier.java b/typeinfo/DynamicSupplier.java
    index 271af6399..1bcf039a7 100644
    --- a/typeinfo/DynamicSupplier.java
    +++ b/typeinfo/DynamicSupplier.java
    @@ -1,15 +1,19 @@
     // typeinfo/DynamicSupplier.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.function.*;
     import java.util.stream.*;
     
    -class CountedInteger {
    +class ID {
       private static long counter;
       private final long id = counter++;
    -  @Override
    -  public String toString() { return Long.toString(id); }
    +  @Override public String toString() {
    +    return Long.toString(id);
    +  }
    +  // A public default constructor is required
    +  // to call getConstructor().newInstance():
    +  public ID() {}
     }
     
     public class DynamicSupplier implements Supplier {
    @@ -17,17 +21,16 @@ public class DynamicSupplier implements Supplier {
       public DynamicSupplier(Class type) {
         this.type = type;
       }
    -  @SuppressWarnings("deprecation")
    -  public T get() {
    +  @Override public T get() {
         try {
    -      return type.newInstance();
    +      return type.getConstructor().newInstance();
         } catch(Exception e) {
           throw new RuntimeException(e);
         }
       }
       public static void main(String[] args) {
         Stream.generate(
    -      new DynamicSupplier<>(CountedInteger.class))
    +      new DynamicSupplier<>(ID.class))
           .skip(10)
           .limit(5)
           .forEach(System.out::println);
    diff --git a/typeinfo/FamilyVsExactType.java b/typeinfo/FamilyVsExactType.java
    index 5981bbe63..10e1b3804 100644
    --- a/typeinfo/FamilyVsExactType.java
    +++ b/typeinfo/FamilyVsExactType.java
    @@ -1,5 +1,5 @@
     // typeinfo/FamilyVsExactType.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // The difference between instanceof and class
    diff --git a/typeinfo/GenericClassReferences.java b/typeinfo/GenericClassReferences.java
    index 81ba7f7d0..9925fb199 100644
    --- a/typeinfo/GenericClassReferences.java
    +++ b/typeinfo/GenericClassReferences.java
    @@ -1,14 +1,14 @@
     // typeinfo/GenericClassReferences.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
     public class GenericClassReferences {
       public static void main(String[] args) {
         Class intClass = int.class;
    +    intClass = double.class;
         Class genericIntClass = int.class;
         genericIntClass = Integer.class; // Same thing
    -    intClass = double.class;
         // genericIntClass = double.class; // Illegal
       }
     }
    diff --git a/typeinfo/HiddenImplementation.java b/typeinfo/HiddenImplementation.java
    index 7b41f6575..88dcb2386 100644
    --- a/typeinfo/HiddenImplementation.java
    +++ b/typeinfo/HiddenImplementation.java
    @@ -1,5 +1,5 @@
     // typeinfo/HiddenImplementation.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Sneaking around package hiding
    diff --git a/typeinfo/ID2.java b/typeinfo/ID2.java
    new file mode 100644
    index 000000000..8463a4fe9
    --- /dev/null
    +++ b/typeinfo/ID2.java
    @@ -0,0 +1,27 @@
    +// typeinfo/ID2.java
    +// (c)2021 MindView LLC: see Copyright.txt
    +// We make no guarantees that this code is fit for any purpose.
    +// Visit http://OnJava8.com for more book information.
    +import java.util.stream.*;
    +
    +public class ID2 {
    +  private static long counter;
    +  private final long id = counter++;
    +  @Override public String toString() {
    +    return Long.toString(id);
    +  }
    +  public static void main(String[] args) {
    +    Stream.generate(
    +      new DynamicSupplier<>(ID2.class))
    +      .skip(10)
    +      .limit(5)
    +      .forEach(System.out::println);
    +  }
    +}
    +/* Output:
    +10
    +11
    +12
    +13
    +14
    +*/
    diff --git a/typeinfo/InnerImplementation.java b/typeinfo/InnerImplementation.java
    index 2b6541fa5..1c15b7518 100644
    --- a/typeinfo/InnerImplementation.java
    +++ b/typeinfo/InnerImplementation.java
    @@ -1,5 +1,5 @@
     // typeinfo/InnerImplementation.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Private inner classes can't hide from reflection
    @@ -7,7 +7,7 @@
     
     class InnerA {
       private static class C implements A {
    -    public void f() {
    +    @Override public void f() {
           System.out.println("public C.f()");
         }
         public void g() {
    diff --git a/typeinfo/InterfaceViolation.java b/typeinfo/InterfaceViolation.java
    index 06b13f65c..84300720e 100644
    --- a/typeinfo/InterfaceViolation.java
    +++ b/typeinfo/InterfaceViolation.java
    @@ -1,12 +1,12 @@
     // typeinfo/InterfaceViolation.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Sneaking around an interface
     import typeinfo.interfacea.*;
     
     class B implements A {
    -  public void f() {}
    +  @Override public void f() {}
       public void g() {}
     }
     
    diff --git a/typeinfo/ModifyingPrivateFields.java b/typeinfo/ModifyingPrivateFields.java
    index fa1a175d8..0d68972e4 100644
    --- a/typeinfo/ModifyingPrivateFields.java
    +++ b/typeinfo/ModifyingPrivateFields.java
    @@ -1,5 +1,5 @@
     // typeinfo/ModifyingPrivateFields.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.lang.reflect.*;
    @@ -8,8 +8,7 @@ class WithPrivateFinalField {
       private int i = 1;
       private final String s = "I'm totally safe";
       private String s2 = "Am I safe?";
    -  @Override
    -  public String toString() {
    +  @Override public String toString() {
         return "i = " + i + ", " + s + ", " + s2;
       }
     }
    diff --git a/typeinfo/NullRobot.java b/typeinfo/NullRobot.java
    index d174ca946..a3d0ed6b3 100644
    --- a/typeinfo/NullRobot.java
    +++ b/typeinfo/NullRobot.java
    @@ -1,5 +1,5 @@
     // typeinfo/NullRobot.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Using a dynamic proxy to create an Optional
    @@ -20,13 +20,11 @@ private class NRobot implements Null, Robot {
         public String name() { return nullName; }
         @Override
         public String model() { return nullName; }
    -    @Override
    -    public List operations() {
    +    @Override public List operations() {
           return Collections.emptyList();
         }
       }
    -  @Override
    -  public Object
    +  @Override public Object
       invoke(Object proxy, Method method, Object[] args)
       throws Throwable {
         return method.invoke(proxied, args);
    @@ -43,8 +41,8 @@ public class NullRobot {
       }
       public static void main(String[] args) {
         Stream.of(
    -      new SnowRemovalRobot("SnowBee"),
    -      newNullRobot(SnowRemovalRobot.class)
    +      new SnowRobot("SnowBee"),
    +      newNullRobot(SnowRobot.class)
         ).forEach(Robot::test);
       }
     }
    @@ -58,6 +56,6 @@ public static void main(String[] args) {
     SnowBee can clear the roof
     SnowBee clearing roof
     [Null Robot]
    -Robot name: SnowRemovalRobot NullRobot
    -Robot model: SnowRemovalRobot NullRobot
    +Robot name: SnowRobot NullRobot
    +Robot model: SnowRobot NullRobot
     */
    diff --git a/typeinfo/Operation.java b/typeinfo/Operation.java
    index dc8722301..d3013aca9 100644
    --- a/typeinfo/Operation.java
    +++ b/typeinfo/Operation.java
    @@ -1,5 +1,5 @@
     // typeinfo/Operation.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.function.*;
    diff --git a/typeinfo/Person.java b/typeinfo/Person.java
    index 7a9807c0c..77dc091e0 100644
    --- a/typeinfo/Person.java
    +++ b/typeinfo/Person.java
    @@ -1,5 +1,5 @@
     // typeinfo/Person.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Using Optional with regular classes
    @@ -25,8 +25,7 @@ class Person {
       }
       Person(String last) { this(null, last, null); }
       Person() { this(null, null, null); }
    -  @Override
    -  public String toString() {
    +  @Override public String toString() {
         if(empty)
           return "";
         return (first.orElse("") +
    diff --git a/typeinfo/PetCount.java b/typeinfo/PetCount.java
    deleted file mode 100644
    index 53438d29a..000000000
    --- a/typeinfo/PetCount.java
    +++ /dev/null
    @@ -1,65 +0,0 @@
    -// typeinfo/PetCount.java
    -// (c)2020 MindView LLC: see Copyright.txt
    -// We make no guarantees that this code is fit for any purpose.
    -// Visit http://OnJava8.com for more book information.
    -// Using instanceof
    -import typeinfo.pets.*;
    -import java.util.*;
    -
    -public class PetCount {
    -  static class Counter extends HashMap {
    -    public void count(String type) {
    -      Integer quantity = get(type);
    -      if(quantity == null)
    -        put(type, 1);
    -      else
    -        put(type, quantity + 1);
    -    }
    -  }
    -  public static void
    -  countPets(PetCreator creator) {
    -    Counter counter = new Counter();
    -    for(Pet pet : Pets.array(20)) {
    -      // List each individual pet:
    -      System.out.print(
    -        pet.getClass().getSimpleName() + " ");
    -      if(pet instanceof Pet)
    -        counter.count("Pet");
    -      if(pet instanceof Dog)
    -        counter.count("Dog");
    -      if(pet instanceof Mutt)
    -        counter.count("Mutt");
    -      if(pet instanceof Pug)
    -        counter.count("Pug");
    -      if(pet instanceof Cat)
    -        counter.count("Cat");
    -      if(pet instanceof EgyptianMau)
    -        counter.count("EgyptianMau");
    -      if(pet instanceof Manx)
    -        counter.count("Manx");
    -      if(pet instanceof Cymric)
    -        counter.count("Cymric");
    -      if(pet instanceof Rodent)
    -        counter.count("Rodent");
    -      if(pet instanceof Rat)
    -        counter.count("Rat");
    -      if(pet instanceof Mouse)
    -        counter.count("Mouse");
    -      if(pet instanceof Hamster)
    -        counter.count("Hamster");
    -    }
    -    // Show the counts:
    -    System.out.println();
    -    System.out.println(counter);
    -  }
    -  public static void main(String[] args) {
    -    countPets(new ForNameCreator());
    -  }
    -}
    -/* Output:
    -Rat Manx Cymric Mutt Pug Cymric Pug Manx Cymric Rat
    -EgyptianMau Hamster EgyptianMau Mutt Mutt Cymric Mouse
    -Pug Mouse Cymric
    -{EgyptianMau=2, Pug=3, Rat=2, Cymric=5, Mouse=2, Cat=9,
    -Manx=7, Rodent=5, Mutt=3, Dog=6, Pet=20, Hamster=1}
    -*/
    diff --git a/typeinfo/PetCounter.java b/typeinfo/PetCounter.java
    new file mode 100644
    index 000000000..bc0642f5e
    --- /dev/null
    +++ b/typeinfo/PetCounter.java
    @@ -0,0 +1,64 @@
    +// typeinfo/PetCounter.java
    +// (c)2021 MindView LLC: see Copyright.txt
    +// We make no guarantees that this code is fit for any purpose.
    +// Visit http://OnJava8.com for more book information.
    +// Using instanceof
    +import typeinfo.pets.*;
    +import java.util.*;
    +
    +public class PetCounter {
    +  static class Counter extends HashMap {
    +    public void count(String type) {
    +      Integer quantity = get(type);
    +      if(quantity == null)
    +        put(type, 1);
    +      else
    +        put(type, quantity + 1);
    +    }
    +  }
    +  private Counter counter = new Counter();
    +  private void countPet(Pet pet) {
    +    System.out.print(
    +      pet.getClass().getSimpleName() + " ");
    +    if(pet instanceof Pet)
    +      counter.count("Pet");
    +    if(pet instanceof Dog)
    +      counter.count("Dog");
    +    if(pet instanceof Mutt)
    +      counter.count("Mutt");
    +    if(pet instanceof Pug)
    +      counter.count("Pug");
    +    if(pet instanceof Cat)
    +      counter.count("Cat");
    +    if(pet instanceof EgyptianMau)
    +      counter.count("EgyptianMau");
    +    if(pet instanceof Manx)
    +      counter.count("Manx");
    +    if(pet instanceof Cymric)
    +      counter.count("Cymric");
    +    if(pet instanceof Rodent)
    +      counter.count("Rodent");
    +    if(pet instanceof Rat)
    +      counter.count("Rat");
    +    if(pet instanceof Mouse)
    +      counter.count("Mouse");
    +    if(pet instanceof Hamster)
    +      counter.count("Hamster");
    +  }
    +  public void count(Creator creator) {
    +    creator.stream().limit(20)
    +      .forEach(pet -> countPet(pet));
    +    System.out.println();
    +    System.out.println(counter);
    +  }
    +  public static void main(String[] args) {
    +    new PetCounter().count(new ForNamePetCreator());
    +  }
    +}
    +/* Output:
    +Rat Manx Cymric Mutt Pug Cymric Pug Manx Cymric Rat
    +EgyptianMau Hamster EgyptianMau Mutt Mutt Cymric Mouse
    +Pug Mouse Cymric
    +{EgyptianMau=2, Pug=3, Rat=2, Cymric=5, Mouse=2, Cat=9,
    +Manx=7, Rodent=5, Mutt=3, Dog=6, Pet=20, Hamster=1}
    +*/
    diff --git a/typeinfo/PetCount2.java b/typeinfo/PetCounter2.java
    similarity index 75%
    rename from typeinfo/PetCount2.java
    rename to typeinfo/PetCounter2.java
    index c65e01388..1293a1075 100644
    --- a/typeinfo/PetCount2.java
    +++ b/typeinfo/PetCounter2.java
    @@ -1,12 +1,12 @@
    -// typeinfo/PetCount2.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// typeinfo/PetCounter2.java
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import typeinfo.pets.*;
     
    -public class PetCount2 {
    +public class PetCounter2 {
       public static void main(String[] args) {
    -    PetCount.countPets(Pets.CREATOR);
    +    new PetCounter().count(new PetCreator());
       }
     }
     /* Output:
    diff --git a/typeinfo/PetCount3.java b/typeinfo/PetCounter3.java
    similarity index 75%
    rename from typeinfo/PetCount3.java
    rename to typeinfo/PetCounter3.java
    index 5b08fb660..ed4c51bd6 100644
    --- a/typeinfo/PetCount3.java
    +++ b/typeinfo/PetCounter3.java
    @@ -1,5 +1,5 @@
    -// typeinfo/PetCount3.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// typeinfo/PetCounter3.java
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Using isInstance()
    @@ -8,12 +8,12 @@
     import onjava.*;
     import typeinfo.pets.*;
     
    -public class PetCount3 {
    +public class PetCounter3 {
       static class Counter extends
    -  LinkedHashMap, Integer> {
    +  HashMap, Integer> {
         Counter() {
    -      super(LiteralPetCreator.ALL_TYPES.stream()
    -        .map(lpc -> Pair.make(lpc, 0))
    +      super(PetCreator.ALL_TYPES.stream()
    +        .map(type -> Pair.make(type, 0))
             .collect(
               Collectors.toMap(Pair::key, Pair::value)));
         }
    @@ -24,8 +24,7 @@ public void count(Pet pet) {
             .forEach(pair ->
               put(pair.getKey(), pair.getValue() + 1));
         }
    -    @Override
    -    public String toString() {
    +    @Override public String toString() {
           String result = entrySet().stream()
             .map(pair -> String.format("%s=%s",
               pair.getKey().getSimpleName(),
    @@ -36,7 +35,7 @@ public String toString() {
       }
       public static void main(String[] args) {
         Counter petCount = new Counter();
    -    Pets.stream()
    +    new PetCreator().stream()
           .limit(20)
           .peek(petCount::count)
           .forEach(p -> System.out.print(
    @@ -48,6 +47,7 @@ public static void main(String[] args) {
     Rat Manx Cymric Mutt Pug Cymric Pug Manx Cymric Rat
     EgyptianMau Hamster EgyptianMau Mutt Mutt Cymric Mouse
     Pug Mouse Cymric
    -{Rat=2, Pug=3, Mutt=3, Mouse=2, Cat=9, Dog=6, Cymric=5,
    -EgyptianMau=2, Rodent=5, Hamster=1, Manx=7, Pet=20}
    +{EgyptianMau=2, Mouse=2, Pet=20, Cymric=5, Rat=2,
    +Dog=6, Mutt=3, Hamster=1, Cat=9, Manx=7, Rodent=5,
    +Pug=3}
     */
    diff --git a/typeinfo/PetCount4.java b/typeinfo/PetCounter4.java
    similarity index 70%
    rename from typeinfo/PetCount4.java
    rename to typeinfo/PetCounter4.java
    index 1ea4873ac..a7058c927 100644
    --- a/typeinfo/PetCount4.java
    +++ b/typeinfo/PetCounter4.java
    @@ -1,14 +1,14 @@
    -// typeinfo/PetCount4.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// typeinfo/PetCounter4.java
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import typeinfo.pets.*;
     import onjava.*;
     
    -public class PetCount4 {
    +public class PetCounter4 {
       public static void main(String[] args) {
         TypeCounter counter = new TypeCounter(Pet.class);
    -    Pets.stream()
    +    new PetCreator().stream()
           .limit(20)
           .peek(counter::count)
           .forEach(p -> System.out.print(
    @@ -20,7 +20,7 @@ public static void main(String[] args) {
     Rat Manx Cymric Mutt Pug Cymric Pug Manx Cymric Rat
     EgyptianMau Hamster EgyptianMau Mutt Mutt Cymric Mouse
     Pug Mouse Cymric
    -{Dog=6, Manx=7, Cat=9, Rodent=5, Hamster=1, Rat=2,
    -Pug=3, Mutt=3, Cymric=5, EgyptianMau=2, Pet=20,
    -Mouse=2}
    +{Rodent=5, Mouse=2, Hamster=1, Cymric=5, Dog=6,
    +EgyptianMau=2, Pet=20, Rat=2, Pug=3, Manx=7, Cat=9,
    +Mutt=3}
     */
    diff --git a/typeinfo/Position.java b/typeinfo/Position.java
    index ca81643b0..44df82691 100644
    --- a/typeinfo/Position.java
    +++ b/typeinfo/Position.java
    @@ -1,5 +1,5 @@
     // typeinfo/Position.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    @@ -28,8 +28,7 @@ public void setPerson(Person newPerson) {
         person = Optional.ofNullable(newPerson)
           .orElse(new Person());
       }
    -  @Override
    -  public String toString() {
    +  @Override public String toString() {
         return "Position: " + title +
           ", Employee: " + person;
       }
    diff --git a/typeinfo/RegisteredFactories.java b/typeinfo/RegisteredFactories.java
    index 7708cc4ee..bc7d05457 100644
    --- a/typeinfo/RegisteredFactories.java
    +++ b/typeinfo/RegisteredFactories.java
    @@ -1,5 +1,5 @@
     // typeinfo/RegisteredFactories.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Registering Factories in the base class
    @@ -8,8 +8,7 @@
     import java.util.stream.*;
     
     class Part implements Supplier {
    -  @Override
    -  public String toString() {
    +  @Override public String toString() {
         return getClass().getSimpleName();
       }
       static List> prototypes =
    @@ -23,7 +22,7 @@ public String toString() {
           new GeneratorBelt()
         );
       private static Random rand = new Random(47);
    -  public Part get() {
    +  @Override public Part get() {
         int n = rand.nextInt(prototypes.size());
         return prototypes.get(n).get();
       }
    @@ -42,8 +41,7 @@ class AirFilter extends Filter {
     }
     
     class CabinAirFilter extends Filter {
    -  @Override
    -  public CabinAirFilter get() {
    +  @Override public CabinAirFilter get() {
         return new CabinAirFilter();
       }
     }
    @@ -61,15 +59,13 @@ class FanBelt extends Belt {
     }
     
     class GeneratorBelt extends Belt {
    -  @Override
    -  public GeneratorBelt get() {
    +  @Override public GeneratorBelt get() {
         return new GeneratorBelt();
       }
     }
     
     class PowerSteeringBelt extends Belt {
    -  @Override
    -  public PowerSteeringBelt get() {
    +  @Override public PowerSteeringBelt get() {
         return new PowerSteeringBelt();
       }
     }
    diff --git a/typeinfo/Robot.java b/typeinfo/Robot.java
    index 803ee9fe2..ed7adc3f9 100644
    --- a/typeinfo/Robot.java
    +++ b/typeinfo/Robot.java
    @@ -1,5 +1,5 @@
     // typeinfo/Robot.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import onjava.*;
    diff --git a/typeinfo/SelectingMethods.java b/typeinfo/SelectingMethods.java
    index d87e928bc..eb679194b 100644
    --- a/typeinfo/SelectingMethods.java
    +++ b/typeinfo/SelectingMethods.java
    @@ -1,5 +1,5 @@
     // typeinfo/SelectingMethods.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Looking for particular methods in a dynamic proxy
    @@ -10,8 +10,7 @@ class MethodSelector implements InvocationHandler {
       MethodSelector(Object proxied) {
         this.proxied = proxied;
       }
    -  @Override
    -  public Object
    +  @Override public Object
       invoke(Object proxy, Method method, Object[] args)
       throws Throwable {
         if(method.getName().equals("interesting"))
    @@ -29,20 +28,16 @@ interface SomeMethods {
     }
     
     class Implementation implements SomeMethods {
    -  @Override
    -  public void boring1() {
    +  @Override public void boring1() {
         System.out.println("boring1");
       }
    -  @Override
    -  public void boring2() {
    +  @Override public void boring2() {
         System.out.println("boring2");
       }
    -  @Override
    -  public void interesting(String arg) {
    +  @Override public void interesting(String arg) {
         System.out.println("interesting " + arg);
       }
    -  @Override
    -  public void boring3() {
    +  @Override public void boring3() {
         System.out.println("boring3");
       }
     }
    diff --git a/typeinfo/Shapes.java b/typeinfo/Shapes.java
    index 34a2bc561..ec9296504 100644
    --- a/typeinfo/Shapes.java
    +++ b/typeinfo/Shapes.java
    @@ -1,28 +1,32 @@
     // typeinfo/Shapes.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.stream.*;
     
     abstract class Shape {
    -  void draw() { System.out.println(this + ".draw()"); }
    -  @Override
    -  public abstract String toString();
    +  void draw() {
    +    System.out.println(this + ".draw()");
    +  }
    +  @Override public abstract String toString();
     }
     
     class Circle extends Shape {
    -  @Override
    -  public String toString() { return "Circle"; }
    +  @Override public String toString() {
    +    return "Circle";
    +  }
     }
     
     class Square extends Shape {
    -  @Override
    -  public String toString() { return "Square"; }
    +  @Override public String toString() {
    +    return "Square";
    +  }
     }
     
     class Triangle extends Shape {
    -  @Override
    -  public String toString() { return "Triangle"; }
    +  @Override public String toString() {
    +    return "Triangle";
    +  }
     }
     
     public class Shapes {
    diff --git a/typeinfo/ShowMethods.java b/typeinfo/ShowMethods.java
    index be1b635b0..ad4f16eb5 100644
    --- a/typeinfo/ShowMethods.java
    +++ b/typeinfo/ShowMethods.java
    @@ -1,5 +1,5 @@
     // typeinfo/ShowMethods.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Using reflection to show all the methods of a class,
    @@ -56,11 +56,11 @@ public static void main(String[] args) {
     }
     /* Output:
     public static void main(String[])
    -public final void wait() throws InterruptedException
     public final void wait(long,int) throws
     InterruptedException
     public final native void wait(long) throws
     InterruptedException
    +public final void wait() throws InterruptedException
     public boolean equals(Object)
     public String toString()
     public native int hashCode()
    diff --git a/typeinfo/SimpleDynamicProxy.java b/typeinfo/SimpleDynamicProxy.java
    index bece57f8a..544b780b2 100644
    --- a/typeinfo/SimpleDynamicProxy.java
    +++ b/typeinfo/SimpleDynamicProxy.java
    @@ -1,5 +1,5 @@
     // typeinfo/SimpleDynamicProxy.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.lang.reflect.*;
    @@ -9,8 +9,7 @@ class DynamicProxyHandler implements InvocationHandler {
       DynamicProxyHandler(Object proxied) {
         this.proxied = proxied;
       }
    -  @Override
    -  public Object
    +  @Override public Object
       invoke(Object proxy, Method method, Object[] args)
       throws Throwable {
         System.out.println(
    @@ -47,7 +46,7 @@ public static void main(String[] args) {
     doSomething
     **** proxy: class $Proxy0, method: public abstract void
     Interface.somethingElse(java.lang.String), args:
    -[Ljava.lang.Object;@6bc7c054
    +[Ljava.lang.Object;@1b84c92
       bonobo
     somethingElse bonobo
     */
    diff --git a/typeinfo/SimpleProxyDemo.java b/typeinfo/SimpleProxyDemo.java
    index 24c3c2c25..1e5eea41e 100644
    --- a/typeinfo/SimpleProxyDemo.java
    +++ b/typeinfo/SimpleProxyDemo.java
    @@ -1,5 +1,5 @@
     // typeinfo/SimpleProxyDemo.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
    @@ -9,12 +9,10 @@ interface Interface {
     }
     
     class RealObject implements Interface {
    -  @Override
    -  public void doSomething() {
    +  @Override public void doSomething() {
         System.out.println("doSomething");
       }
    -  @Override
    -  public void somethingElse(String arg) {
    +  @Override public void somethingElse(String arg) {
         System.out.println("somethingElse " + arg);
       }
     }
    @@ -24,13 +22,11 @@ class SimpleProxy implements Interface {
       SimpleProxy(Interface proxied) {
         this.proxied = proxied;
       }
    -  @Override
    -  public void doSomething() {
    +  @Override public void doSomething() {
         System.out.println("SimpleProxy doSomething");
         proxied.doSomething();
       }
    -  @Override
    -  public void somethingElse(String arg) {
    +  @Override public void somethingElse(String arg) {
         System.out.println(
           "SimpleProxy somethingElse " + arg);
         proxied.somethingElse(arg);
    diff --git a/typeinfo/SnowRemovalRobot.java b/typeinfo/SnowRobot.java
    similarity index 73%
    rename from typeinfo/SnowRemovalRobot.java
    rename to typeinfo/SnowRobot.java
    index af5b46cd9..b28b1f7fb 100644
    --- a/typeinfo/SnowRemovalRobot.java
    +++ b/typeinfo/SnowRobot.java
    @@ -1,18 +1,18 @@
    -// typeinfo/SnowRemovalRobot.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// typeinfo/SnowRobot.java
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
     
    -public class SnowRemovalRobot implements Robot {
    +public class SnowRobot implements Robot {
       private String name;
    -  public SnowRemovalRobot(String name) {
    +  public SnowRobot(String name) {
         this.name = name;
       }
    -  @Override
    -  public String name() { return name; }
    -  @Override
    -  public String model() { return "SnowBot Series 11"; }
    +  @Override public String name() { return name; }
    +  @Override public String model() {
    +    return "SnowBot Series 11";
    +  }
       private List ops = Arrays.asList(
         new Operation(
           () -> name + " can shovel snow",
    @@ -25,9 +25,10 @@ public SnowRemovalRobot(String name) {
           () -> name + " can clear the roof",
           () -> System.out.println(
             name + " clearing roof")));
    +  @Override
       public List operations() { return ops; }
       public static void main(String[] args) {
    -    Robot.test(new SnowRemovalRobot("Slusher"));
    +    Robot.test(new SnowRobot("Slusher"));
       }
     }
     /* Output:
    diff --git a/typeinfo/Staff.java b/typeinfo/Staff.java
    index 569e598f7..204280343 100644
    --- a/typeinfo/Staff.java
    +++ b/typeinfo/Staff.java
    @@ -1,5 +1,5 @@
     // typeinfo/Staff.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import java.util.*;
    diff --git a/typeinfo/SweetShop.java b/typeinfo/SweetShop.java
    index f85b8c3f9..a046b281c 100644
    --- a/typeinfo/SweetShop.java
    +++ b/typeinfo/SweetShop.java
    @@ -1,5 +1,5 @@
     // typeinfo/SweetShop.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Examination of the way the class loader works
    diff --git a/typeinfo/WildcardClassReferences.java b/typeinfo/WildcardClassReferences.java
    index 32d75e868..066b15d5d 100644
    --- a/typeinfo/WildcardClassReferences.java
    +++ b/typeinfo/WildcardClassReferences.java
    @@ -1,5 +1,5 @@
     // typeinfo/WildcardClassReferences.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     
    diff --git a/typeinfo/interfacea/A.java b/typeinfo/interfacea/A.java
    index 2ebb99d32..359fb98ef 100644
    --- a/typeinfo/interfacea/A.java
    +++ b/typeinfo/interfacea/A.java
    @@ -1,5 +1,5 @@
     // typeinfo/interfacea/A.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package typeinfo.interfacea;
    diff --git a/typeinfo/packageaccess/HiddenC.java b/typeinfo/packageaccess/HiddenC.java
    index 9fb8ffde9..53277281e 100644
    --- a/typeinfo/packageaccess/HiddenC.java
    +++ b/typeinfo/packageaccess/HiddenC.java
    @@ -1,13 +1,12 @@
     // typeinfo/packageaccess/HiddenC.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package typeinfo.packageaccess;
     import typeinfo.interfacea.*;
     
     class C implements A {
    -  @Override
    -  public void f() {
    +  @Override public void f() {
         System.out.println("public C.f()");
       }
       public void g() {
    diff --git a/typeinfo/pets/Cat.java b/typeinfo/pets/Cat.java
    index 75781fd7f..68594e746 100644
    --- a/typeinfo/pets/Cat.java
    +++ b/typeinfo/pets/Cat.java
    @@ -1,5 +1,5 @@
     // typeinfo/pets/Cat.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package typeinfo.pets;
    diff --git a/typeinfo/pets/Creator.java b/typeinfo/pets/Creator.java
    new file mode 100644
    index 000000000..e3703e76c
    --- /dev/null
    +++ b/typeinfo/pets/Creator.java
    @@ -0,0 +1,38 @@
    +// typeinfo/pets/Creator.java
    +// (c)2021 MindView LLC: see Copyright.txt
    +// We make no guarantees that this code is fit for any purpose.
    +// Visit http://OnJava8.com for more book information.
    +// Creates random Pets
    +package typeinfo.pets;
    +import java.util.*;
    +import java.util.function.*;
    +import java.util.stream.*;
    +import java.lang.reflect.InvocationTargetException;
    +
    +public abstract class Creator implements Supplier {
    +  private Random rand = new Random(47);
    +  // The different types of Pet to create:
    +  public abstract List> types();
    +  @Override public Pet get() { // Create one random Pet
    +    int n = rand.nextInt(types().size());
    +    try {
    +      return types().get(n)
    +        .getConstructor().newInstance();
    +    } catch(InstantiationException |
    +            NoSuchMethodException |
    +            InvocationTargetException |
    +            IllegalAccessException e) {
    +      throw new RuntimeException(e);
    +    }
    +  }
    +  public Stream stream() {
    +    return Stream.generate(this);
    +  }
    +  public Pet[] array(int size) {
    +    return stream().limit(size).toArray(Pet[]::new);
    +  }
    +  public List list(int size) {
    +    return stream().limit(size)
    +      .collect(Collectors.toCollection(ArrayList::new));
    +  }
    +}
    diff --git a/typeinfo/pets/Cymric.java b/typeinfo/pets/Cymric.java
    index fd86fa953..4835e4a25 100644
    --- a/typeinfo/pets/Cymric.java
    +++ b/typeinfo/pets/Cymric.java
    @@ -1,5 +1,5 @@
     // typeinfo/pets/Cymric.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package typeinfo.pets;
    diff --git a/typeinfo/pets/Dog.java b/typeinfo/pets/Dog.java
    index 68f43a322..2e5b9a8ab 100644
    --- a/typeinfo/pets/Dog.java
    +++ b/typeinfo/pets/Dog.java
    @@ -1,5 +1,5 @@
     // typeinfo/pets/Dog.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package typeinfo.pets;
    diff --git a/typeinfo/pets/EgyptianMau.java b/typeinfo/pets/EgyptianMau.java
    index adbdfbb18..e728de938 100644
    --- a/typeinfo/pets/EgyptianMau.java
    +++ b/typeinfo/pets/EgyptianMau.java
    @@ -1,5 +1,5 @@
     // typeinfo/pets/EgyptianMau.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package typeinfo.pets;
    diff --git a/typeinfo/pets/ForNameCreator.java b/typeinfo/pets/ForNamePetCreator.java
    similarity index 82%
    rename from typeinfo/pets/ForNameCreator.java
    rename to typeinfo/pets/ForNamePetCreator.java
    index 29351efa0..6e35740d2 100644
    --- a/typeinfo/pets/ForNameCreator.java
    +++ b/typeinfo/pets/ForNamePetCreator.java
    @@ -1,11 +1,11 @@
    -// typeinfo/pets/ForNameCreator.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// typeinfo/pets/ForNamePetCreator.java
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package typeinfo.pets;
     import java.util.*;
     
    -public class ForNameCreator extends PetCreator {
    +public class ForNamePetCreator extends Creator {
       private static List> types =
         new ArrayList<>();
       // Types you want randomly created:
    @@ -30,8 +30,7 @@ private static void loader() {
         }
       }
       static { loader(); }
    -  @Override
    -  public List> types() {
    +  @Override public List> types() {
         return types;
       }
     }
    diff --git a/typeinfo/pets/Hamster.java b/typeinfo/pets/Hamster.java
    index 8408ef623..9763b30b4 100644
    --- a/typeinfo/pets/Hamster.java
    +++ b/typeinfo/pets/Hamster.java
    @@ -1,5 +1,5 @@
     // typeinfo/pets/Hamster.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package typeinfo.pets;
    diff --git a/typeinfo/pets/Individual.java b/typeinfo/pets/Individual.java
    index e3c87dacb..1783621db 100644
    --- a/typeinfo/pets/Individual.java
    +++ b/typeinfo/pets/Individual.java
    @@ -1,5 +1,5 @@
     // typeinfo/pets/Individual.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package typeinfo.pets;
    @@ -13,23 +13,19 @@
       public Individual(String name) { this.name = name; }
       // 'name' is optional:
       public Individual() {}
    -  @Override
    -  public String toString() {
    +  @Override public String toString() {
         return getClass().getSimpleName() +
           (name == null ? "" : " " + name);
       }
       public long id() { return id; }
    -  @Override
    -  public boolean equals(Object o) {
    +  @Override public boolean equals(Object o) {
         return o instanceof Individual &&
           Objects.equals(id, ((Individual)o).id);
       }
    -  @Override
    -  public int hashCode() {
    +  @Override public int hashCode() {
         return Objects.hash(name, id);
       }
    -  @Override
    -  public int compareTo(Individual arg) {
    +  @Override public int compareTo(Individual arg) {
         // Compare by class name first:
         String first = getClass().getSimpleName();
         String argFirst = arg.getClass().getSimpleName();
    diff --git a/typeinfo/pets/LiteralPetCreator.java b/typeinfo/pets/LiteralPetCreator.java
    deleted file mode 100644
    index 398baac8c..000000000
    --- a/typeinfo/pets/LiteralPetCreator.java
    +++ /dev/null
    @@ -1,39 +0,0 @@
    -// typeinfo/pets/LiteralPetCreator.java
    -// (c)2020 MindView LLC: see Copyright.txt
    -// We make no guarantees that this code is fit for any purpose.
    -// Visit http://OnJava8.com for more book information.
    -// Using class literals
    -// {java typeinfo.pets.LiteralPetCreator}
    -package typeinfo.pets;
    -import java.util.*;
    -
    -public class LiteralPetCreator extends PetCreator {
    -  // No try block needed.
    -  @SuppressWarnings("unchecked")
    -  public static
    -  final List> ALL_TYPES =
    -    Collections.unmodifiableList(Arrays.asList(
    -      Pet.class, Dog.class, Cat.class, Rodent.class,
    -      Mutt.class, Pug.class, EgyptianMau.class,
    -      Manx.class, Cymric.class, Rat.class,
    -      Mouse.class, Hamster.class));
    -  // Types for random creation:
    -  private static final
    -  List> TYPES =
    -    ALL_TYPES.subList(ALL_TYPES.indexOf(Mutt.class),
    -      ALL_TYPES.size());
    -  @Override
    -  public List> types() {
    -    return TYPES;
    -  }
    -  public static void main(String[] args) {
    -    System.out.println(TYPES);
    -  }
    -}
    -/* Output:
    -[class typeinfo.pets.Mutt, class typeinfo.pets.Pug,
    -class typeinfo.pets.EgyptianMau, class
    -typeinfo.pets.Manx, class typeinfo.pets.Cymric, class
    -typeinfo.pets.Rat, class typeinfo.pets.Mouse, class
    -typeinfo.pets.Hamster]
    -*/
    diff --git a/typeinfo/pets/Manx.java b/typeinfo/pets/Manx.java
    index 6a5534b13..bf949bc0e 100644
    --- a/typeinfo/pets/Manx.java
    +++ b/typeinfo/pets/Manx.java
    @@ -1,5 +1,5 @@
     // typeinfo/pets/Manx.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package typeinfo.pets;
    diff --git a/typeinfo/pets/Mouse.java b/typeinfo/pets/Mouse.java
    index bbb97cda0..07a7aac8f 100644
    --- a/typeinfo/pets/Mouse.java
    +++ b/typeinfo/pets/Mouse.java
    @@ -1,5 +1,5 @@
     // typeinfo/pets/Mouse.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package typeinfo.pets;
    diff --git a/typeinfo/pets/Mutt.java b/typeinfo/pets/Mutt.java
    index f51814b93..be99e73b2 100644
    --- a/typeinfo/pets/Mutt.java
    +++ b/typeinfo/pets/Mutt.java
    @@ -1,5 +1,5 @@
     // typeinfo/pets/Mutt.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package typeinfo.pets;
    diff --git a/typeinfo/pets/Person.java b/typeinfo/pets/Person.java
    index 4dcfff2ce..f2055e649 100644
    --- a/typeinfo/pets/Person.java
    +++ b/typeinfo/pets/Person.java
    @@ -1,5 +1,5 @@
     // typeinfo/pets/Person.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package typeinfo.pets;
    diff --git a/typeinfo/pets/Pet.java b/typeinfo/pets/Pet.java
    index dcbfd4ab7..b4c934aca 100644
    --- a/typeinfo/pets/Pet.java
    +++ b/typeinfo/pets/Pet.java
    @@ -1,5 +1,5 @@
     // typeinfo/pets/Pet.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package typeinfo.pets;
    diff --git a/typeinfo/pets/PetCreator.java b/typeinfo/pets/PetCreator.java
    index 76909aa9a..3541160b4 100644
    --- a/typeinfo/pets/PetCreator.java
    +++ b/typeinfo/pets/PetCreator.java
    @@ -1,28 +1,42 @@
     // typeinfo/pets/PetCreator.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
    -// Creates random sequences of Pets
    +// Using class literals
    +// {java typeinfo.pets.PetCreator}
     package typeinfo.pets;
     import java.util.*;
    -import java.util.function.*;
    -import java.lang.reflect.InvocationTargetException;
     
    -public abstract
    -class PetCreator implements Supplier {
    -  private Random rand = new Random(47);
    -  // The List of the different types of Pet to create:
    -  public abstract List> types();
    -  public Pet get() { // Create one random Pet
    -    int n = rand.nextInt(types().size());
    -    try {
    -      return types().get(n)
    -             .getConstructor().newInstance();
    -    } catch(InstantiationException |
    -            NoSuchMethodException |
    -            InvocationTargetException |
    -            IllegalAccessException e) {
    -      throw new RuntimeException(e);
    -    }
    +public class PetCreator extends Creator {
    +  // No try block needed.
    +  public static final
    +  List> ALL_TYPES =
    +    Collections.unmodifiableList(Arrays.asList(
    +      Pet.class, Dog.class, Cat.class, Rodent.class,
    +      Mutt.class, Pug.class, EgyptianMau.class,
    +      Manx.class, Cymric.class, Rat.class,
    +      Mouse.class, Hamster.class));
    +  // Types for random creation:
    +  private static final
    +  List> TYPES =
    +    ALL_TYPES.subList(
    +      ALL_TYPES.indexOf(Mutt.class),
    +      ALL_TYPES.size());
    +  @Override
    +  public List> types() {
    +    return TYPES;
    +  }
    +  public static void main(String[] args) {
    +    System.out.println(TYPES);
    +    List pets = new PetCreator().list(7);
    +    System.out.println(pets);
       }
     }
    +/* Output:
    +[class typeinfo.pets.Mutt, class typeinfo.pets.Pug,
    +class typeinfo.pets.EgyptianMau, class
    +typeinfo.pets.Manx, class typeinfo.pets.Cymric, class
    +typeinfo.pets.Rat, class typeinfo.pets.Mouse, class
    +typeinfo.pets.Hamster]
    +[Rat, Manx, Cymric, Mutt, Pug, Cymric, Pug]
    +*/
    diff --git a/typeinfo/pets/Pets.java b/typeinfo/pets/Pets.java
    deleted file mode 100644
    index be3037a16..000000000
    --- a/typeinfo/pets/Pets.java
    +++ /dev/null
    @@ -1,30 +0,0 @@
    -// typeinfo/pets/Pets.java
    -// (c)2020 MindView LLC: see Copyright.txt
    -// We make no guarantees that this code is fit for any purpose.
    -// Visit http://OnJava8.com for more book information.
    -// Facade to produce a default PetCreator
    -package typeinfo.pets;
    -import java.util.*;
    -import java.util.stream.*;
    -
    -public class Pets {
    -  public static final PetCreator CREATOR =
    -    new LiteralPetCreator();
    -  public static Pet get() {
    -    return CREATOR.get();
    -  }
    -  public static Pet[] array(int size) {
    -    Pet[] result = new Pet[size];
    -    for(int i = 0; i < size; i++)
    -      result[i] = CREATOR.get();
    -    return result;
    -  }
    -  public static List list(int size) {
    -    List result = new ArrayList<>();
    -    Collections.addAll(result, array(size));
    -    return result;
    -  }
    -  public static Stream stream() {
    -    return Stream.generate(CREATOR);
    -  }
    -}
    diff --git a/typeinfo/pets/Pug.java b/typeinfo/pets/Pug.java
    index 9d8ab4670..83da95189 100644
    --- a/typeinfo/pets/Pug.java
    +++ b/typeinfo/pets/Pug.java
    @@ -1,5 +1,5 @@
     // typeinfo/pets/Pug.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package typeinfo.pets;
    diff --git a/typeinfo/pets/Rat.java b/typeinfo/pets/Rat.java
    index 2ce5534b8..68a346fb2 100644
    --- a/typeinfo/pets/Rat.java
    +++ b/typeinfo/pets/Rat.java
    @@ -1,5 +1,5 @@
     // typeinfo/pets/Rat.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package typeinfo.pets;
    diff --git a/typeinfo/pets/Rodent.java b/typeinfo/pets/Rodent.java
    index 7b998d0aa..cab79e752 100644
    --- a/typeinfo/pets/Rodent.java
    +++ b/typeinfo/pets/Rodent.java
    @@ -1,5 +1,5 @@
     // typeinfo/pets/Rodent.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package typeinfo.pets;
    diff --git a/typeinfo/toys/GenericToyTest.java b/typeinfo/toys/GenericToyTest.java
    index 7dc016cdc..930fbc779 100644
    --- a/typeinfo/toys/GenericToyTest.java
    +++ b/typeinfo/toys/GenericToyTest.java
    @@ -1,5 +1,5 @@
     // typeinfo/toys/GenericToyTest.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Testing class Class
    @@ -7,17 +7,16 @@
     package typeinfo.toys;
     
     public class GenericToyTest {
    -  @SuppressWarnings("deprecation")
       public static void
       main(String[] args) throws Exception {
    -    Class ftClass = FancyToy.class;
    +    Class ftc = FancyToy.class;
         // Produces exact type:
    -    FancyToy fancyToy = ftClass.newInstance();
    -    Class up =
    -      ftClass.getSuperclass();
    +    FancyToy fancyToy =
    +      ftc.getConstructor().newInstance();
    +    Class up = ftc.getSuperclass();
         // This won't compile:
    -    // Class up2 = ftClass.getSuperclass();
    +    // Class up2 = ftc.getSuperclass();
         // Only produces Object:
    -    Object obj = up.newInstance();
    +    Object obj = up.getConstructor().newInstance();
       }
     }
    diff --git a/typeinfo/toys/ToyTest.java b/typeinfo/toys/ToyTest.java
    index e4e5e92db..f67261f42 100644
    --- a/typeinfo/toys/ToyTest.java
    +++ b/typeinfo/toys/ToyTest.java
    @@ -1,5 +1,5 @@
     // typeinfo/toys/ToyTest.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Testing class Class
    @@ -14,13 +14,13 @@ interface Shoots {}
     class Toy {
       // Comment out the following no-arg
       // constructor to see NoSuchMethodError
    -  Toy() {}
    -  Toy(int i) {}
    +  public Toy() {}
    +  public Toy(int i) {}
     }
     
     class FancyToy extends Toy
     implements HasBatteries, Waterproof, Shoots {
    -  FancyToy() { super(1); }
    +  public FancyToy() { super(1); }
     }
     
     public class ToyTest {
    @@ -47,7 +47,7 @@ public static void main(String[] args) {
         Class up = c.getSuperclass();
         Object obj = null;
         try {
    -      // Requires no-arg constructor:
    +      // Requires public no-arg constructor:
           obj = up.newInstance();
         } catch(Exception e) {
           throw new
    diff --git a/validating/Assert1.java b/validating/Assert1.java
    index 013a72f6f..53dbfda30 100644
    --- a/validating/Assert1.java
    +++ b/validating/Assert1.java
    @@ -1,5 +1,5 @@
     // validating/Assert1.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Non-informative style of assert
    diff --git a/validating/Assert2.java b/validating/Assert2.java
    index 61b4827d7..cdc9f89dd 100644
    --- a/validating/Assert2.java
    +++ b/validating/Assert2.java
    @@ -1,5 +1,5 @@
     // validating/Assert2.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Assert with an information-expression
    diff --git a/validating/BadMicroBenchmark.java b/validating/BadMicroBenchmark.java
    index 2634e67c9..5e1ddbd7c 100644
    --- a/validating/BadMicroBenchmark.java
    +++ b/validating/BadMicroBenchmark.java
    @@ -1,5 +1,5 @@
     // validating/BadMicroBenchmark.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // {ExcludeFromTravisCI}
    @@ -24,6 +24,5 @@ public static void main(String[] args) {
       }
     }
     /* Output:
    -setAll: 272
    -parallelSetAll: 301
    +Insufficient memory
     */
    diff --git a/validating/BadMicroBenchmark2.java b/validating/BadMicroBenchmark2.java
    index 123036a0c..aab204bfb 100644
    --- a/validating/BadMicroBenchmark2.java
    +++ b/validating/BadMicroBenchmark2.java
    @@ -1,5 +1,5 @@
     // validating/BadMicroBenchmark2.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Relying on a common resource
    @@ -28,8 +28,8 @@ public static void main(String[] args) {
       }
     }
     /* Output:
    -parallelSetAll: 1147
    -setAll: 174
    -parallelSetAll: 86
    -setAll: 39
    +parallelSetAll: 1008
    +setAll: 294
    +parallelSetAll: 78
    +setAll: 88
     */
    diff --git a/validating/CircularQueue.java b/validating/CircularQueue.java
    index 405e44101..b42509cf9 100644
    --- a/validating/CircularQueue.java
    +++ b/validating/CircularQueue.java
    @@ -1,5 +1,5 @@
     // validating/CircularQueue.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Demonstration of Design by Contract (DbC)
    diff --git a/validating/CircularQueueException.java b/validating/CircularQueueException.java
    index 142b8ece2..c30710df0 100644
    --- a/validating/CircularQueueException.java
    +++ b/validating/CircularQueueException.java
    @@ -1,5 +1,5 @@
     // validating/CircularQueueException.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package validating;
    diff --git a/validating/CountedList.java b/validating/CountedList.java
    index 6c780f216..30de1acc5 100644
    --- a/validating/CountedList.java
    +++ b/validating/CountedList.java
    @@ -1,5 +1,5 @@
     // validating/CountedList.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Keeps track of how many of itself are created.
    diff --git a/validating/GuavaAssertions.java b/validating/GuavaAssertions.java
    index a499f079b..85c724f6f 100644
    --- a/validating/GuavaAssertions.java
    +++ b/validating/GuavaAssertions.java
    @@ -1,5 +1,5 @@
     // validating/GuavaAssertions.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Assertions that are always enabled.
    diff --git a/validating/GuavaPreconditions.java b/validating/GuavaPreconditions.java
    index 3cfc66ae9..f8f9c702a 100644
    --- a/validating/GuavaPreconditions.java
    +++ b/validating/GuavaPreconditions.java
    @@ -1,5 +1,5 @@
     // validating/GuavaPreconditions.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Demonstrating Guava Preconditions
    diff --git a/validating/Inverter1.java b/validating/Inverter1.java
    index 8ef828d6e..78ec38dc1 100644
    --- a/validating/Inverter1.java
    +++ b/validating/Inverter1.java
    @@ -1,9 +1,10 @@
     // validating/Inverter1.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package validating;
     
     public class Inverter1 implements StringInverter {
    +  @Override
       public String invert(String str) { return str; }
     }
    diff --git a/validating/Inverter2.java b/validating/Inverter2.java
    index 3fb862fd4..5ea22f6fd 100644
    --- a/validating/Inverter2.java
    +++ b/validating/Inverter2.java
    @@ -1,12 +1,12 @@
     // validating/Inverter2.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package validating;
     import static java.lang.Character.*;
     
     public class Inverter2 implements StringInverter {
    -  public String invert(String str) {
    +  @Override public String invert(String str) {
         String result = "";
         for(int i = 0; i < str.length(); i++) {
           char c = str.charAt(i);
    diff --git a/validating/Inverter3.java b/validating/Inverter3.java
    index 4bd53c82a..eecf815e3 100644
    --- a/validating/Inverter3.java
    +++ b/validating/Inverter3.java
    @@ -1,12 +1,12 @@
     // validating/Inverter3.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package validating;
     import static java.lang.Character.*;
     
     public class Inverter3 implements StringInverter {
    -  public String invert(String str) {
    +  @Override public String invert(String str) {
         if(str.length() > 30)
           throw new RuntimeException("argument too long!");
         String result = "";
    diff --git a/validating/Inverter4.java b/validating/Inverter4.java
    index 0b7870594..4bb15f12f 100644
    --- a/validating/Inverter4.java
    +++ b/validating/Inverter4.java
    @@ -1,5 +1,5 @@
     // validating/Inverter4.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package validating;
    @@ -9,7 +9,7 @@ public class Inverter4 implements StringInverter {
       static final String ALLOWED =
         "abcdefghijklmnopqrstuvwxyz ,." +
         "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    -  public String invert(String str) {
    +  @Override public String invert(String str) {
         if(str.length() > 30)
           throw new RuntimeException("argument too long!");
         String result = "";
    diff --git a/validating/LoaderAssertions.java b/validating/LoaderAssertions.java
    index 52cac3471..aa150ad7e 100644
    --- a/validating/LoaderAssertions.java
    +++ b/validating/LoaderAssertions.java
    @@ -1,5 +1,5 @@
     // validating/LoaderAssertions.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Using the class loader to enable assertions
    diff --git a/validating/NonNullConstruction.java b/validating/NonNullConstruction.java
    index a95483dd4..4caa3de54 100644
    --- a/validating/NonNullConstruction.java
    +++ b/validating/NonNullConstruction.java
    @@ -1,5 +1,5 @@
     // validating/NonNullConstruction.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import static com.google.common.base.Preconditions.*;
    diff --git a/validating/SLF4JLevels.java b/validating/SLF4JLevels.java
    index c851e7c31..d56821a52 100644
    --- a/validating/SLF4JLevels.java
    +++ b/validating/SLF4JLevels.java
    @@ -1,5 +1,5 @@
     // validating/SLF4JLevels.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import org.slf4j.*;
    @@ -16,14 +16,14 @@ public static void main(String[] args) {
       }
     }
     /* Output:
    -2017-05-09T06:07:52.846
    +2021-01-24T08:49:37.658
     [main] TRACE SLF4JLevels - Hello
    -2017-05-09T06:07:52.849
    +2021-01-24T08:49:37.661
     [main] DEBUG SLF4JLevels - Logging
    -2017-05-09T06:07:52.849
    +2021-01-24T08:49:37.661
     [main] INFO  SLF4JLevels - Using
    -2017-05-09T06:07:52.850
    +2021-01-24T08:49:37.661
     [main] WARN  SLF4JLevels - the SLF4J
    -2017-05-09T06:07:52.851
    +2021-01-24T08:49:37.661
     [main] ERROR SLF4JLevels - Facade
     */
    diff --git a/validating/SLF4JLogging.java b/validating/SLF4JLogging.java
    index f2e94d6e5..f8eeb696c 100644
    --- a/validating/SLF4JLogging.java
    +++ b/validating/SLF4JLogging.java
    @@ -1,5 +1,5 @@
     // validating/SLF4JLogging.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import org.slf4j.*;
    @@ -12,6 +12,6 @@ public static void main(String[] args) {
       }
     }
     /* Output:
    -2017-05-09T06:07:53.418
    +2021-01-24T08:49:38.496
     [main] INFO  SLF4JLogging - hello logging
     */
    diff --git a/validating/SimpleDebugging.java b/validating/SimpleDebugging.java
    index 863e7de39..721820e74 100644
    --- a/validating/SimpleDebugging.java
    +++ b/validating/SimpleDebugging.java
    @@ -1,5 +1,5 @@
     // validating/SimpleDebugging.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // {ThrowsException}
    diff --git a/validating/StringInverter.java b/validating/StringInverter.java
    index 34c933a73..542788935 100644
    --- a/validating/StringInverter.java
    +++ b/validating/StringInverter.java
    @@ -1,5 +1,5 @@
     // validating/StringInverter.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package validating;
    diff --git a/validating/jmh/JMH1.java b/validating/jmh/JMH1.java
    index 79eb749ab..63657c3fa 100644
    --- a/validating/jmh/JMH1.java
    +++ b/validating/jmh/JMH1.java
    @@ -1,5 +1,5 @@
     // validating/jmh/JMH1.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package validating.jmh;
    diff --git a/validating/jmh/JMH2.java b/validating/jmh/JMH2.java
    index ae7b56f9d..5010b00ed 100644
    --- a/validating/jmh/JMH2.java
    +++ b/validating/jmh/JMH2.java
    @@ -1,5 +1,5 @@
     // validating/jmh/JMH2.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package validating.jmh;
    diff --git a/validating/jmh/JMH3.java b/validating/jmh/JMH3.java
    index 8ce9bb0c1..7bf22de11 100644
    --- a/validating/jmh/JMH3.java
    +++ b/validating/jmh/JMH3.java
    @@ -1,5 +1,5 @@
     // validating/jmh/JMH3.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package validating.jmh;
    diff --git a/validating/tests/CircularQueueTest.java b/validating/tests/CircularQueueTest.java
    index 8da6dc276..920b459be 100644
    --- a/validating/tests/CircularQueueTest.java
    +++ b/validating/tests/CircularQueueTest.java
    @@ -1,5 +1,5 @@
     // validating/tests/CircularQueueTest.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package validating;
    diff --git a/validating/tests/CountedListTest.java b/validating/tests/CountedListTest.java
    index a9dc0c717..74a29b376 100644
    --- a/validating/tests/CountedListTest.java
    +++ b/validating/tests/CountedListTest.java
    @@ -1,5 +1,5 @@
     // validating/tests/CountedListTest.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Simple use of JUnit to test CountedList.
    diff --git a/validating/tests/DynamicStringInverterTests.java b/validating/tests/DynamicStringInverterTests.java
    index dc980971a..338b65fb0 100644
    --- a/validating/tests/DynamicStringInverterTests.java
    +++ b/validating/tests/DynamicStringInverterTests.java
    @@ -1,5 +1,5 @@
     // validating/tests/DynamicStringInverterTests.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package validating;
    diff --git a/validating/tests/StringInverterTests.java b/validating/tests/StringInverterTests.java
    index e32873b87..01ada920e 100644
    --- a/validating/tests/StringInverterTests.java
    +++ b/validating/tests/StringInverterTests.java
    @@ -1,5 +1,5 @@
     // validating/tests/StringInverterTests.java
    -// (c)2020 MindView LLC: see Copyright.txt
    +// (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     package validating;
    
    From 4b98623f523bb2c0440de6345b3365288748b1bc Mon Sep 17 00:00:00 2001
    From: Bruce Eckel 
    Date: Sun, 31 Jan 2021 15:52:55 -0700
    Subject: [PATCH 300/320] Update build.gradle
    
    Experiment
    ---
     build.gradle | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/build.gradle b/build.gradle
    index b4feb13d5..3e35bffb1 100644
    --- a/build.gradle
    +++ b/build.gradle
    @@ -17,7 +17,7 @@ subprojects {
         apply from: "$rootProject.projectDir/gradle/jmh.gradle"
         // apply from: "$rootProject.projectDir/gradle/checkstyle.gradle"
         apply from: "$rootProject.projectDir/gradle/findbugs.gradle"
    -    apply plugin: 'com.mindviewinc.tagging'
    +    // apply plugin: 'com.mindviewinc.tagging'
     }
     
     apply from: 'gradle/subprojects.gradle'
    
    From cf109e7860d50fcfdc23512a189d98fbc391f04e Mon Sep 17 00:00:00 2001
    From: Bruce Eckel 
    Date: Sun, 31 Jan 2021 16:03:09 -0700
    Subject: [PATCH 301/320] Update build.gradle
    
    ---
     build.gradle | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/build.gradle b/build.gradle
    index 3e35bffb1..b4feb13d5 100644
    --- a/build.gradle
    +++ b/build.gradle
    @@ -17,7 +17,7 @@ subprojects {
         apply from: "$rootProject.projectDir/gradle/jmh.gradle"
         // apply from: "$rootProject.projectDir/gradle/checkstyle.gradle"
         apply from: "$rootProject.projectDir/gradle/findbugs.gradle"
    -    // apply plugin: 'com.mindviewinc.tagging'
    +    apply plugin: 'com.mindviewinc.tagging'
     }
     
     apply from: 'gradle/subprojects.gradle'
    
    From 03691ccbc0ef8f96c7af033ebe233caee6e04f8c Mon Sep 17 00:00:00 2001
    From: Bruce Eckel 
    Date: Sun, 31 Jan 2021 16:12:26 -0700
    Subject: [PATCH 302/320] Update README.md
    
    ---
     README.md | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/README.md b/README.md
    index 985dbbe42..b2ad92597 100644
    --- a/README.md
    +++ b/README.md
    @@ -1,6 +1,6 @@
     # Example Source Code for the Book "On Java 8" by Bruce Eckel
     
    -Download release from [here](https://github.com/BruceEckel/OnJava8-Examples/releases/tag/v1.0).
    +Download the latest release from [here](https://github.com/BruceEckel/OnJava8-Examples/releases/).
     
     To compile and run these programs, you only need JDK 8 installed.
     Invoking `gradlew` will automatically download and install Gradle.
    
    From 68e98a30751aa9ae68c872325e92214bbc6c271a Mon Sep 17 00:00:00 2001
    From: Bruce Eckel 
    Date: Sun, 31 Jan 2021 17:50:14 -0700
    Subject: [PATCH 303/320] Fixed onjava/Range.java, added TestRange.java
    
    ---
     concurrent/PSP2.txt                |  4 ++--
     housekeeping/Overloading.java      |  2 +-
     interfaces/InterfaceCollision.java |  4 ++--
     onjava/Range.java                  | 32 +++++++++++++-----------------
     onjava/TestRange.java              | 29 +++++++++++++++++++++++++++
     5 files changed, 48 insertions(+), 23 deletions(-)
     create mode 100644 onjava/TestRange.java
    
    diff --git a/concurrent/PSP2.txt b/concurrent/PSP2.txt
    index 4b372a616..224433884 100644
    --- a/concurrent/PSP2.txt
    +++ b/concurrent/PSP2.txt
    @@ -5,7 +5,7 @@
     4: main
     5: main
     6: main
    +6: ForkJoinPool.commonPool-worker-9
     7: main
    -8: main
    +8: ForkJoinPool.commonPool-worker-9
     9: main
    -10: ForkJoinPool.commonPool-worker-5
    diff --git a/housekeeping/Overloading.java b/housekeeping/Overloading.java
    index 65f239529..55307f4fa 100644
    --- a/housekeeping/Overloading.java
    +++ b/housekeeping/Overloading.java
    @@ -32,7 +32,7 @@ public static void main(String[] args) {
           t.info();
           t.info("overloaded method");
         }
    -    // Overloaded constructor:
    +    // Calls overloaded constructor:
         new Tree();
       }
     }
    diff --git a/interfaces/InterfaceCollision.java b/interfaces/InterfaceCollision.java
    index a3a6612b1..e00fb8a84 100644
    --- a/interfaces/InterfaceCollision.java
    +++ b/interfaces/InterfaceCollision.java
    @@ -12,12 +12,12 @@ class C2 implements I1, I2 {
       @Override
       public void f() {}
       @Override
    -  public int f(int i) { return 1; } // overloaded
    +  public int f(int i) { return 1; } // Overloaded
     }
     
     class C3 extends C implements I2 {
       @Override
    -  public int f(int i) { return 1; } // overloaded
    +  public int f(int i) { return 1; } // Overloaded
     }
     
     class C4 extends C implements I3 {
    diff --git a/onjava/Range.java b/onjava/Range.java
    index ee43244f4..82041db5e 100644
    --- a/onjava/Range.java
    +++ b/onjava/Range.java
    @@ -2,33 +2,29 @@
     // (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
    -// Array creation methods that can be used without
    -// qualifiers, using static imports:
    +// Create arrays initialized with integer values.
     package onjava;
     
     public class Range {
    -  // Produce a sequence [0..n)
    -  public static int[] range(int n) {
    -    int[] result = new int[n];
    -    for(int i = 0; i < n; i++)
    -      result[i] = i;
    -    return result;
    -  }
    -  // Produce a sequence [start..end)
    -  public static int[] range(int start, int end) {
    -    int sz = end - start;
    -    int[] result = new int[sz];
    -    for(int i = 0; i < sz; i++)
    -      result[i] = start + i;
    -    return result;
    -  }
       // Produce sequence [start..end) incrementing by step
       public static
       int[] range(int start, int end, int step) {
    -    int sz = (end - start)/step;
    +    if (step == 0)
    +      throw new
    +        IllegalArgumentException("Step cannot be zero");
    +    int sz = Math.max(0, step >= 0 ?
    +        (end + step - 1 - start) / step
    +      : (end + step + 1 - start) / step);
         int[] result = new int[sz];
         for(int i = 0; i < sz; i++)
           result[i] = start + (i * step);
         return result;
    +  }  // Produce a sequence [start..end)
    +  public static int[] range(int start, int end) {
    +    return range(start, end, 1);
    +  }
    +  // Produce a sequence [0..n)
    +  public static int[] range(int n) {
    +    return range(0, n);
       }
     }
    diff --git a/onjava/TestRange.java b/onjava/TestRange.java
    new file mode 100644
    index 000000000..cd132d791
    --- /dev/null
    +++ b/onjava/TestRange.java
    @@ -0,0 +1,29 @@
    +// onjava/TestRange.java
    +// (c)2021 MindView LLC: see Copyright.txt
    +// We make no guarantees that this code is fit for any purpose.
    +// Visit http://OnJava8.com for more book information.
    +// Basic test of Range.java
    +import static onjava.Range.*;
    +import java.util.Arrays;
    +
    +public class TestRange {
    +  private static void show(int[] rng) {
    +    System.out.println(Arrays.toString(rng));
    +  }
    +  public static void main(String[] args) {
    +    show(range(10, 21, 3));
    +    show(range(21, 10, -3));
    +    show(range(-5, 5, -3));
    +    show(range(-5, 5, 3));
    +    show(range(10, 21));
    +    show(range(10));
    +  }
    +}
    +/* Output:
    +[10, 13, 16, 19]
    +[21, 18, 15, 12]
    +[]
    +[-5, -2, 1, 4]
    +[10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20]
    +[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    +*/
    
    From f5929969b128fe1832ec90701cfc4f5f1a7b2cdf Mon Sep 17 00:00:00 2001
    From: Bruce Eckel 
    Date: Thu, 4 Feb 2021 07:21:51 -0700
    Subject: [PATCH 304/320] Rewrote Operators: Testing Object Equivalence
    
    ---
     concurrent/PSP2.txt              | 15 +++++-----
     operators/AllOps.java            |  2 +-
     operators/AutoInc.java           |  2 +-
     operators/DoubleEquivalence.java | 47 ++++++++++++++++++++++++++++++
     operators/EqualsMethod.java      | 26 +++++++++++++++--
     operators/EqualsMethod2.java     | 21 --------------
     operators/Equivalence.java       | 49 ++++++++++++++++++++++++++++----
     7 files changed, 123 insertions(+), 39 deletions(-)
     create mode 100644 operators/DoubleEquivalence.java
     delete mode 100644 operators/EqualsMethod2.java
    
    diff --git a/concurrent/PSP2.txt b/concurrent/PSP2.txt
    index 224433884..491bd153f 100644
    --- a/concurrent/PSP2.txt
    +++ b/concurrent/PSP2.txt
    @@ -1,11 +1,12 @@
     0: main
     1: main
    -2: main
    +1: ForkJoinPool.commonPool-worker-3
    +1: ForkJoinPool.commonPool-worker-5
    +3: ForkJoinPool.commonPool-worker-5
     3: main
    -4: main
    +5: ForkJoinPool.commonPool-worker-5
     5: main
    -6: main
    -6: ForkJoinPool.commonPool-worker-9
    -7: main
    -8: ForkJoinPool.commonPool-worker-9
    -9: main
    +7: ForkJoinPool.commonPool-worker-5
    +8: main
    +8: ForkJoinPool.commonPool-worker-3
    +10: ForkJoinPool.commonPool-worker-5
    diff --git a/operators/AllOps.java b/operators/AllOps.java
    index 3a559a7d9..d48e82af1 100644
    --- a/operators/AllOps.java
    +++ b/operators/AllOps.java
    @@ -6,7 +6,7 @@
     // to show which ones are accepted by the Java compiler
     
     public class AllOps {
    -  // To accept the results of a boolean test:
    +  // To accept the results of a Boolean test:
       void f(boolean b) {}
       void boolTest(boolean x, boolean y) {
         // Arithmetic operators:
    diff --git a/operators/AutoInc.java b/operators/AutoInc.java
    index d018f90a8..bcb090935 100644
    --- a/operators/AutoInc.java
    +++ b/operators/AutoInc.java
    @@ -2,7 +2,7 @@
     // (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
    -// Demonstrates the ++ and -- operators
    +// The ++ and -- operators
     
     public class AutoInc {
       public static void main(String[] args) {
    diff --git a/operators/DoubleEquivalence.java b/operators/DoubleEquivalence.java
    new file mode 100644
    index 000000000..e00160381
    --- /dev/null
    +++ b/operators/DoubleEquivalence.java
    @@ -0,0 +1,47 @@
    +// operators/DoubleEquivalence.java
    +// (c)2021 MindView LLC: see Copyright.txt
    +// We make no guarantees that this code is fit for any purpose.
    +// Visit http://OnJava8.com for more book information.
    +
    +public class DoubleEquivalence {
    +  static void show(String desc, Double n1, Double n2) {
    +    System.out.println(desc + ":");
    +    System.out.printf(
    +      "%e==%e %b %b%n", n1, n2, n1 == n2, n1.equals(n2));
    +  }
    +  @SuppressWarnings("deprecation")
    +  public static void test(double x1, double x2) {
    +    // x1.equals(x2) // Won't compile
    +    System.out.printf("%e==%e %b%n", x1, x2, x1 == x2);
    +    Double d1 = x1;
    +    Double d2 = x2;
    +    show("Automatic", d1, d2);
    +    Double r1 = new Double(x1);
    +    Double r2 = new Double(x2);
    +    show("new Double()", r1, r2);
    +    Double v1 = Double.valueOf(x1);
    +    Double v2 = Double.valueOf(x2);
    +    show("Double.valueOf()", v1, v2);
    +  }
    +  public static void main(String[] args) {
    +    test(0, Double.MIN_VALUE);
    +    test(Double.MAX_VALUE,
    +      Double.MAX_VALUE - Double.MIN_VALUE * 1_000_000);
    +  }
    +}
    +/* Output:
    +0.000000e+00==4.900000e-324 false
    +Automatic:
    +0.000000e+00==4.900000e-324 false false
    +new Double():
    +0.000000e+00==4.900000e-324 false false
    +Double.valueOf():
    +0.000000e+00==4.900000e-324 false false
    +1.797693e+308==1.797693e+308 true
    +Automatic:
    +1.797693e+308==1.797693e+308 false true
    +new Double():
    +1.797693e+308==1.797693e+308 false true
    +Double.valueOf():
    +1.797693e+308==1.797693e+308 false true
    +*/
    diff --git a/operators/EqualsMethod.java b/operators/EqualsMethod.java
    index 7915f7def..2f281aeb5 100644
    --- a/operators/EqualsMethod.java
    +++ b/operators/EqualsMethod.java
    @@ -2,14 +2,34 @@
     // (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
    +// Default equals() does not compare contents
    +
    +class ValA {
    +  int i;
    +}
    +
    +class ValB {
    +  int i;
    +  // Works for this example, not a complete equals():
    +  public boolean equals(Object o) {
    +    ValB rval = (ValB)o;  // Cast o to be a ValB
    +    return i == rval.i;
    +  }
    +}
     
     public class EqualsMethod {
       public static void main(String[] args) {
    -    Integer n1 = 47;
    -    Integer n2 = 47;
    -    System.out.println(n1.equals(n2));
    +    ValA va1 = new ValA();
    +    ValA va2 = new ValA();
    +    va1.i = va2.i = 100;
    +    System.out.println(va1.equals(va2));
    +    ValB vb1 = new ValB();
    +    ValB vb2 = new ValB();
    +    vb1.i = vb2.i = 100;
    +    System.out.println(vb1.equals(vb2));
       }
     }
     /* Output:
    +false
     true
     */
    diff --git a/operators/EqualsMethod2.java b/operators/EqualsMethod2.java
    deleted file mode 100644
    index 75ff42c5e..000000000
    --- a/operators/EqualsMethod2.java
    +++ /dev/null
    @@ -1,21 +0,0 @@
    -// operators/EqualsMethod2.java
    -// (c)2021 MindView LLC: see Copyright.txt
    -// We make no guarantees that this code is fit for any purpose.
    -// Visit http://OnJava8.com for more book information.
    -// Default equals() does not compare contents
    -
    -class Value {
    -  int i;
    -}
    -
    -public class EqualsMethod2 {
    -  public static void main(String[] args) {
    -    Value v1 = new Value();
    -    Value v2 = new Value();
    -    v1.i = v2.i = 100;
    -    System.out.println(v1.equals(v2));
    -  }
    -}
    -/* Output:
    -false
    -*/
    diff --git a/operators/Equivalence.java b/operators/Equivalence.java
    index 603ef6316..25f7f3e70 100644
    --- a/operators/Equivalence.java
    +++ b/operators/Equivalence.java
    @@ -4,14 +4,51 @@
     // Visit http://OnJava8.com for more book information.
     
     public class Equivalence {
    +  static void show(String desc, Integer n1, Integer n2) {
    +    System.out.println(desc + ":");
    +    System.out.printf(
    +      "%d==%d %b %b%n", n1, n2, n1 == n2, n1.equals(n2));
    +  }
    +  @SuppressWarnings("deprecation")
    +  public static void test(int value) {
    +    Integer i1 = value;                             // [1]
    +    Integer i2 = value;
    +    show("Automatic", i1, i2);
    +    // Old way, deprecated in Java 9 and on:
    +    Integer r1 = new Integer(value);                // [2]
    +    Integer r2 = new Integer(value);
    +    show("new Integer()", r1, r2);
    +    // Preferred in Java 9 and on:
    +    Integer v1 = Integer.valueOf(value);            // [3]
    +    Integer v2 = Integer.valueOf(value);
    +    show("Integer.valueOf()", v1, v2);
    +    // Primitives can't use equals():
    +    int x = value;                                  // [4]
    +    int y = value;
    +    // x.equals(y); // Doesn't compile
    +    System.out.println("Primitive int:");
    +    System.out.printf("%d==%d %b%n", x, y, x == y);
    +  }
       public static void main(String[] args) {
    -    Integer n1 = 47;
    -    Integer n2 = 47;
    -    System.out.println(n1 == n2);
    -    System.out.println(n1 != n2);
    +    test(127);
    +    test(128);
       }
     }
     /* Output:
    -true
    -false
    +Automatic:
    +127==127 true true
    +new Integer():
    +127==127 false true
    +Integer.valueOf():
    +127==127 true true
    +Primitive int:
    +127==127 true
    +Automatic:
    +128==128 false true
    +new Integer():
    +128==128 false true
    +Integer.valueOf():
    +128==128 false true
    +Primitive int:
    +128==128 true
     */
    
    From d97d374947cfefc2a2577507e4ff47824977baaf Mon Sep 17 00:00:00 2001
    From: Bruce Eckel 
    Date: Sun, 7 Feb 2021 10:33:13 -0700
    Subject: [PATCH 305/320] Update DoubleEquivalence.java
    
    ---
     operators/DoubleEquivalence.java | 2 ++
     1 file changed, 2 insertions(+)
    
    diff --git a/operators/DoubleEquivalence.java b/operators/DoubleEquivalence.java
    index e00160381..5f06e25f5 100644
    --- a/operators/DoubleEquivalence.java
    +++ b/operators/DoubleEquivalence.java
    @@ -25,6 +25,7 @@ public static void test(double x1, double x2) {
       }
       public static void main(String[] args) {
         test(0, Double.MIN_VALUE);
    +    System.out.println("------------------------");
         test(Double.MAX_VALUE,
           Double.MAX_VALUE - Double.MIN_VALUE * 1_000_000);
       }
    @@ -37,6 +38,7 @@ public static void main(String[] args) {
     0.000000e+00==4.900000e-324 false false
     Double.valueOf():
     0.000000e+00==4.900000e-324 false false
    +------------------------
     1.797693e+308==1.797693e+308 true
     Automatic:
     1.797693e+308==1.797693e+308 false true
    
    From 129df0b75273d0375d96484918f6a2c20c144295 Mon Sep 17 00:00:00 2001
    From: Bruce Eckel 
    Date: Wed, 10 Feb 2021 12:04:53 -0700
    Subject: [PATCH 306/320] Update settings.gradle
    
    ---
     settings.gradle | 4 +---
     1 file changed, 1 insertion(+), 3 deletions(-)
    
    diff --git a/settings.gradle b/settings.gradle
    index 376ca1053..9ab61dfbe 100644
    --- a/settings.gradle
    +++ b/settings.gradle
    @@ -1,8 +1,6 @@
     def isSubproject = { File file ->
         file.isDirectory() &&
    -    !file.name.contains('.git') &&
    -    !file.name.contains('.gradle') &&
    -    !file.name.contains('.idea') &&
    +    !file.name.startsWith('.') &&
         !file.name.contains('build') &&
         !file.name.contains('gradle') &&
         !file.name.contains('test')
    
    From ede3954d8680e09467b1be5baf96fa1ee2989cc5 Mon Sep 17 00:00:00 2001
    From: Bruce Eckel 
    Date: Thu, 4 Mar 2021 16:15:04 -0700
    Subject: [PATCH 307/320] March 2021 Book Update
    
    See notes in "Foreword to the Leanpub Edition"
    ---
     collections/AdapterMethodIdiom.java           |   2 +-
     collections/CollectionSequence.java           |   2 +-
     collections/CrossCollectionIteration.java     |   2 +-
     collections/CrossCollectionIteration2.java    |   2 +-
     collections/InterfaceVsIterator.java          |   2 +-
     collections/LinkedListFeatures.java           |   2 +-
     collections/ListFeatures.java                 |   2 +-
     collections/ListIteration.java                |   2 +-
     collections/MapOfList.java                    |   2 +-
     collections/MultiIterableClass.java           |   2 +-
     collections/NonCollectionSequence.java        |   2 +-
     collections/PetMap.java                       |   2 +-
     collections/SimpleIteration.java              |   2 +-
     collectiontopics/CollectionMethods.java       |   3 +-
     concurrent/PSP2.txt                           | 518 +++++++++++++++++-
     enums/PostOffice.java                         |  22 +-
     enums/menu/Food.java                          |   2 +-
     enums/menu/Meal2.java                         |   2 +-
     equalshashcode/IndividualTest.java            |   2 +-
     generics/CheckedList.java                     |   6 +-
     generics/DogsAndRobotMethodReferences.java    |   2 +-
     generics/DogsAndRobots.java                   |   2 +-
     generics/GenericHolder.java                   |   2 +-
     gradle/subprojects.gradle                     |   6 +-
     housekeeping/Flower.java                      |   4 +-
     housekeeping/OverloadingOrder.java            |   2 +-
     housekeeping/SimpleConstructor2.java          |   2 +-
     javadoc/Documentation3.java                   |   2 +
     onjava/BasicSupplier.java                     |   2 +-
     onjava/Countries.java                         |   2 +-
     onjava/MouseClick.java                        |   2 +-
     onjava/atunit/AtUnit.java                     |   6 +-
     patterns/BoxObserver.java                     |  77 ++-
     patterns/CleanTheFloor.java                   |  42 ++
     patterns/CommandPattern.java                  |  21 +-
     patterns/Macro.java                           |  25 +
     patterns/PaperScissorsRock.java               |   2 +-
     patterns/ProxyDemo.java                       |   8 +-
     patterns/Resource.java                        |   9 +
     patterns/ShapeFactory1.java                   |   2 +-
     patterns/ShapeFactory2.java                   |   4 +-
     patterns/ShapeFactory3.java                   |   9 +-
     patterns/Single.java                          |  18 +
     patterns/SingletonPattern.java                |  75 ++-
     patterns/SingletonPattern2.java               |  16 +
     patterns/SingletonPattern3.java               |  33 ++
     patterns/StateDemo.java                       |  51 +-
     patterns/TemplateMethod.java                  |  28 +-
     patterns/TestSingle.java                      |  20 +
     patterns/TypeMap.java                         |  21 +
     patterns/abstractfactory/GameEnvironment.java |  24 +-
     patterns/adapt/Adapter.java                   |   2 +-
     patterns/chain/ChainOfResponsibility.java     |  53 +-
     patterns/chain/Result.java                    |  21 +
     patterns/doubledispatch/Aluminum.java         |   4 +-
     patterns/doubledispatch/Cardboard.java        |   4 +-
     patterns/doubledispatch/DoubleDispatch.java   |  86 +--
     patterns/doubledispatch/Glass.java            |   4 +-
     patterns/doubledispatch/Paper.java            |   4 +-
     patterns/doubledispatch/TypedBin.java         |  15 +-
     patterns/doubledispatch/TypedBinMember.java   |   7 +-
     patterns/dynatrash/DynaTrash.java             |  74 ---
     patterns/observer/ObservedFlower.java         | 120 ++--
     patterns/recyclea/RecycleA.java               | 140 ++---
     patterns/recycleb/RecycleB.java               |  72 ++-
     patterns/recyclec/RecycleC.java               | 126 +++--
     patterns/state/StateMachineDemo.java          |  26 +-
     patterns/strategy/StrategyPattern.java        |  12 +-
     patterns/strategy/StrategyPattern2.java       |   4 +
     patterns/trash/Aluminum.java                  |  10 +-
     patterns/trash/Bins.java                      |  35 ++
     patterns/trash/Cardboard.java                 |  10 +-
     patterns/trash/ClassToListOfTrashMap.java     |  20 +
     patterns/trash/DynaFactory.java               |  44 ++
     patterns/trash/Fillable.java                  |   2 +-
     patterns/trash/FillableList.java              |  12 +-
     patterns/trash/Glass.java                     |  10 +-
     patterns/trash/GroupingBy.java                |  41 ++
     patterns/trash/Paper.java                     |  10 +-
     patterns/trash/ParseTrash.java                |  89 ++-
     patterns/trash/Price.java                     |  13 +
     patterns/trash/Trash.dat                      |  46 +-
     patterns/trash/Trash.java                     |  91 +--
     patterns/trash/TrashInfo.java                 |  18 +
     patterns/trash/TrashValue.java                |  21 +
     patterns/trash/TrashVisitor.java              | 104 ++++
     patterns/trash/TypeMapTrash.java              |  52 ++
     patterns/trash/Visitor.java                   |  31 ++
     patterns/trashvisitor/Aluminum.java           |  15 -
     patterns/trashvisitor/Cardboard.java          |  15 -
     patterns/trashvisitor/Glass.java              |  15 -
     patterns/trashvisitor/Paper.java              |  15 -
     patterns/trashvisitor/TrashVisitor.java       | 117 ----
     patterns/trashvisitor/Visitable.java          |  12 -
     patterns/trashvisitor/Visitor.java            |  14 -
     patterns/visitor/BeeAndFlowers.java           |  30 +-
     polymorphism/{RTTI.java => Reflect.java}      |   9 +-
     references/CopyConstructor.java               |   8 +-
     .../AnonymousImplementation.java              |   4 +-
     .../BoundedClassReferences.java               |   2 +-
     {typeinfo => reflection}/ClassCasts.java      |   2 +-
     .../ClassInitialization.java                  |   2 +-
     {typeinfo => reflection}/DynamicSupplier.java |   2 +-
     .../FamilyVsExactType.java                    |  10 +-
     .../GenericClassReferences.java               |   2 +-
     .../HiddenImplementation.java                 |   8 +-
     {typeinfo => reflection}/ID2.java             |   2 +-
     .../InnerImplementation.java                  |   6 +-
     .../InterfaceViolation.java                   |   4 +-
     .../ModifyingPrivateFields.java               |   2 +-
     {typeinfo => reflection}/NullRobot.java       |   2 +-
     {typeinfo => reflection}/Operation.java       |   2 +-
     {typeinfo => reflection}/Person.java          |   2 +-
     {typeinfo => reflection}/PetCounter.java      |   4 +-
     {typeinfo => reflection}/PetCounter2.java     |   4 +-
     {typeinfo => reflection}/PetCounter3.java     |   4 +-
     {typeinfo => reflection}/PetCounter4.java     |   4 +-
     {typeinfo => reflection}/Position.java        |   2 +-
     .../RegisteredFactories.java                  |   2 +-
     {typeinfo => reflection}/Robot.java           |   2 +-
     .../SelectingMethods.java                     |   2 +-
     {typeinfo => reflection}/Shapes.java          |   2 +-
     {typeinfo => reflection}/ShowMethods.java     |   2 +-
     .../SimpleDynamicProxy.java                   |   2 +-
     {typeinfo => reflection}/SimpleProxyDemo.java |   2 +-
     {typeinfo => reflection}/SnowRobot.java       |   2 +-
     {typeinfo => reflection}/Staff.java           |   2 +-
     {typeinfo => reflection}/SweetShop.java       |   2 +-
     .../WildcardClassReferences.java              |   2 +-
     {typeinfo => reflection}/interfacea/A.java    |   4 +-
     .../packageaccess/HiddenC.java                |   6 +-
     {typeinfo => reflection}/pets/Cat.java        |   4 +-
     {typeinfo => reflection}/pets/Creator.java    |   4 +-
     {typeinfo => reflection}/pets/Cymric.java     |   4 +-
     {typeinfo => reflection}/pets/Dog.java        |   4 +-
     .../pets/EgyptianMau.java                     |   4 +-
     .../pets/ForNamePetCreator.java               |  20 +-
     {typeinfo => reflection}/pets/Hamster.java    |   4 +-
     {typeinfo => reflection}/pets/Individual.java |   4 +-
     {typeinfo => reflection}/pets/Manx.java       |   4 +-
     {typeinfo => reflection}/pets/Mouse.java      |   4 +-
     {typeinfo => reflection}/pets/Mutt.java       |   4 +-
     {typeinfo => reflection}/pets/Person.java     |   4 +-
     {typeinfo => reflection}/pets/Pet.java        |   4 +-
     {typeinfo => reflection}/pets/PetCreator.java |  16 +-
     {typeinfo => reflection}/pets/Pug.java        |   4 +-
     {typeinfo => reflection}/pets/Rat.java        |   4 +-
     {typeinfo => reflection}/pets/Rodent.java     |   4 +-
     .../toys/GenericToyTest.java                  |   6 +-
     {typeinfo => reflection}/toys/ToyTest.java    |  32 +-
     reuse/Bath.java                               |   8 +-
     serialization/AStoreCADState.java             |  22 +-
     serialization/Blip3.java                      |   2 +-
     serialization/RecoverCADState.java            |  20 +-
     serialization/Worm.java                       |   2 +-
     155 files changed, 1856 insertions(+), 1217 deletions(-)
     create mode 100644 patterns/CleanTheFloor.java
     create mode 100644 patterns/Macro.java
     create mode 100644 patterns/Resource.java
     create mode 100644 patterns/Single.java
     create mode 100644 patterns/SingletonPattern2.java
     create mode 100644 patterns/SingletonPattern3.java
     create mode 100644 patterns/TestSingle.java
     create mode 100644 patterns/TypeMap.java
     create mode 100644 patterns/chain/Result.java
     delete mode 100644 patterns/dynatrash/DynaTrash.java
     create mode 100644 patterns/trash/Bins.java
     create mode 100644 patterns/trash/ClassToListOfTrashMap.java
     create mode 100644 patterns/trash/DynaFactory.java
     create mode 100644 patterns/trash/GroupingBy.java
     create mode 100644 patterns/trash/Price.java
     create mode 100644 patterns/trash/TrashInfo.java
     create mode 100644 patterns/trash/TrashValue.java
     create mode 100644 patterns/trash/TrashVisitor.java
     create mode 100644 patterns/trash/TypeMapTrash.java
     create mode 100644 patterns/trash/Visitor.java
     delete mode 100644 patterns/trashvisitor/Aluminum.java
     delete mode 100644 patterns/trashvisitor/Cardboard.java
     delete mode 100644 patterns/trashvisitor/Glass.java
     delete mode 100644 patterns/trashvisitor/Paper.java
     delete mode 100644 patterns/trashvisitor/TrashVisitor.java
     delete mode 100644 patterns/trashvisitor/Visitable.java
     delete mode 100644 patterns/trashvisitor/Visitor.java
     rename polymorphism/{RTTI.java => Reflect.java} (81%)
     rename {typeinfo => reflection}/AnonymousImplementation.java (94%)
     rename {typeinfo => reflection}/BoundedClassReferences.java (90%)
     rename {typeinfo => reflection}/ClassCasts.java (93%)
     rename {typeinfo => reflection}/ClassInitialization.java (97%)
     rename {typeinfo => reflection}/DynamicSupplier.java (96%)
     rename {typeinfo => reflection}/FamilyVsExactType.java (90%)
     rename {typeinfo => reflection}/GenericClassReferences.java (91%)
     rename {typeinfo => reflection}/HiddenImplementation.java (88%)
     rename {typeinfo => reflection}/ID2.java (96%)
     rename {typeinfo => reflection}/InnerImplementation.java (90%)
     rename {typeinfo => reflection}/InterfaceViolation.java (88%)
     rename {typeinfo => reflection}/ModifyingPrivateFields.java (97%)
     rename {typeinfo => reflection}/NullRobot.java (98%)
     rename {typeinfo => reflection}/Operation.java (93%)
     rename {typeinfo => reflection}/Person.java (98%)
     rename {typeinfo => reflection}/PetCounter.java (97%)
     rename {typeinfo => reflection}/PetCounter2.java (90%)
     rename {typeinfo => reflection}/PetCounter3.java (96%)
     rename {typeinfo => reflection}/PetCounter4.java (92%)
     rename {typeinfo => reflection}/Position.java (98%)
     rename {typeinfo => reflection}/RegisteredFactories.java (98%)
     rename {typeinfo => reflection}/Robot.java (96%)
     rename {typeinfo => reflection}/SelectingMethods.java (97%)
     rename {typeinfo => reflection}/Shapes.java (96%)
     rename {typeinfo => reflection}/ShowMethods.java (98%)
     rename {typeinfo => reflection}/SimpleDynamicProxy.java (97%)
     rename {typeinfo => reflection}/SimpleProxyDemo.java (97%)
     rename {typeinfo => reflection}/SnowRobot.java (97%)
     rename {typeinfo => reflection}/Staff.java (98%)
     rename {typeinfo => reflection}/SweetShop.java (97%)
     rename {typeinfo => reflection}/WildcardClassReferences.java (87%)
     rename {typeinfo => reflection}/interfacea/A.java (75%)
     rename {typeinfo => reflection}/packageaccess/HiddenC.java (84%)
     rename {typeinfo => reflection}/pets/Cat.java (83%)
     rename {typeinfo => reflection}/pets/Creator.java (95%)
     rename {typeinfo => reflection}/pets/Cymric.java (83%)
     rename {typeinfo => reflection}/pets/Dog.java (83%)
     rename {typeinfo => reflection}/pets/EgyptianMau.java (82%)
     rename {typeinfo => reflection}/pets/ForNamePetCreator.java (71%)
     rename {typeinfo => reflection}/pets/Hamster.java (83%)
     rename {typeinfo => reflection}/pets/Individual.java (95%)
     rename {typeinfo => reflection}/pets/Manx.java (83%)
     rename {typeinfo => reflection}/pets/Mouse.java (83%)
     rename {typeinfo => reflection}/pets/Mutt.java (83%)
     rename {typeinfo => reflection}/pets/Person.java (81%)
     rename {typeinfo => reflection}/pets/Pet.java (83%)
     rename {typeinfo => reflection}/pets/PetCreator.java (75%)
     rename {typeinfo => reflection}/pets/Pug.java (83%)
     rename {typeinfo => reflection}/pets/Rat.java (83%)
     rename {typeinfo => reflection}/pets/Rodent.java (83%)
     rename {typeinfo => reflection}/toys/GenericToyTest.java (85%)
     rename {typeinfo => reflection}/toys/ToyTest.java (67%)
    
    diff --git a/collections/AdapterMethodIdiom.java b/collections/AdapterMethodIdiom.java
    index 47fe3e8be..ffb8fbf5b 100644
    --- a/collections/AdapterMethodIdiom.java
    +++ b/collections/AdapterMethodIdiom.java
    @@ -33,7 +33,7 @@ public void remove() { // Not implemented
     public class AdapterMethodIdiom {
       public static void main(String[] args) {
         ReversibleArrayList ral =
    -      new ReversibleArrayList(
    +      new ReversibleArrayList<>(
             Arrays.asList("To be or not to be".split(" ")));
         // Grabs the ordinary iterator via iterator():
         for(String s : ral)
    diff --git a/collections/CollectionSequence.java b/collections/CollectionSequence.java
    index 65f93254e..ea0e45740 100644
    --- a/collections/CollectionSequence.java
    +++ b/collections/CollectionSequence.java
    @@ -2,7 +2,7 @@
     // (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
    -import typeinfo.pets.*;
    +import reflection.pets.*;
     import java.util.*;
     
     public class CollectionSequence
    diff --git a/collections/CrossCollectionIteration.java b/collections/CrossCollectionIteration.java
    index 6be887668..2aaf7e95a 100644
    --- a/collections/CrossCollectionIteration.java
    +++ b/collections/CrossCollectionIteration.java
    @@ -2,7 +2,7 @@
     // (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
    -import typeinfo.pets.*;
    +import reflection.pets.*;
     import java.util.*;
     
     public class CrossCollectionIteration {
    diff --git a/collections/CrossCollectionIteration2.java b/collections/CrossCollectionIteration2.java
    index de7fe2809..e8aa755d0 100644
    --- a/collections/CrossCollectionIteration2.java
    +++ b/collections/CrossCollectionIteration2.java
    @@ -2,7 +2,7 @@
     // (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
    -import typeinfo.pets.*;
    +import reflection.pets.*;
     import java.util.*;
     
     public class CrossCollectionIteration2 {
    diff --git a/collections/InterfaceVsIterator.java b/collections/InterfaceVsIterator.java
    index 5e3c147be..fdb50a588 100644
    --- a/collections/InterfaceVsIterator.java
    +++ b/collections/InterfaceVsIterator.java
    @@ -2,7 +2,7 @@
     // (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
    -import typeinfo.pets.*;
    +import reflection.pets.*;
     import java.util.*;
     
     public class InterfaceVsIterator {
    diff --git a/collections/LinkedListFeatures.java b/collections/LinkedListFeatures.java
    index 3552fa10e..489c699f2 100644
    --- a/collections/LinkedListFeatures.java
    +++ b/collections/LinkedListFeatures.java
    @@ -2,7 +2,7 @@
     // (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
    -import typeinfo.pets.*;
    +import reflection.pets.*;
     import java.util.*;
     
     public class LinkedListFeatures {
    diff --git a/collections/ListFeatures.java b/collections/ListFeatures.java
    index cf1e7b01e..12fb6b4f1 100644
    --- a/collections/ListFeatures.java
    +++ b/collections/ListFeatures.java
    @@ -2,7 +2,7 @@
     // (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
    -import typeinfo.pets.*;
    +import reflection.pets.*;
     import java.util.*;
     
     public class ListFeatures {
    diff --git a/collections/ListIteration.java b/collections/ListIteration.java
    index ce49b5295..4967f5260 100644
    --- a/collections/ListIteration.java
    +++ b/collections/ListIteration.java
    @@ -2,7 +2,7 @@
     // (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
    -import typeinfo.pets.*;
    +import reflection.pets.*;
     import java.util.*;
     
     public class ListIteration {
    diff --git a/collections/MapOfList.java b/collections/MapOfList.java
    index d3b385add..d7357a6ed 100644
    --- a/collections/MapOfList.java
    +++ b/collections/MapOfList.java
    @@ -4,7 +4,7 @@
     // Visit http://OnJava8.com for more book information.
     // {java collections.MapOfList}
     package collections;
    -import typeinfo.pets.*;
    +import reflection.pets.*;
     import java.util.*;
     
     public class MapOfList {
    diff --git a/collections/MultiIterableClass.java b/collections/MultiIterableClass.java
    index e55d811e3..3c5e7ae26 100644
    --- a/collections/MultiIterableClass.java
    +++ b/collections/MultiIterableClass.java
    @@ -29,7 +29,7 @@ public Iterable randomized() {
         return new Iterable() {
           public Iterator iterator() {
             List shuffled =
    -          new ArrayList(Arrays.asList(words));
    +          new ArrayList<>(Arrays.asList(words));
             Collections.shuffle(shuffled, new Random(47));
             return shuffled.iterator();
           }
    diff --git a/collections/NonCollectionSequence.java b/collections/NonCollectionSequence.java
    index 8a6c8bb55..dc8678274 100644
    --- a/collections/NonCollectionSequence.java
    +++ b/collections/NonCollectionSequence.java
    @@ -2,7 +2,7 @@
     // (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
    -import typeinfo.pets.*;
    +import reflection.pets.*;
     import java.util.*;
     
     class PetSequence {
    diff --git a/collections/PetMap.java b/collections/PetMap.java
    index 44885c803..dc64bf574 100644
    --- a/collections/PetMap.java
    +++ b/collections/PetMap.java
    @@ -2,7 +2,7 @@
     // (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
    -import typeinfo.pets.*;
    +import reflection.pets.*;
     import java.util.*;
     
     public class PetMap {
    diff --git a/collections/SimpleIteration.java b/collections/SimpleIteration.java
    index 234a716b1..089774963 100644
    --- a/collections/SimpleIteration.java
    +++ b/collections/SimpleIteration.java
    @@ -2,7 +2,7 @@
     // (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
    -import typeinfo.pets.*;
    +import reflection.pets.*;
     import java.util.*;
     
     public class SimpleIteration {
    diff --git a/collectiontopics/CollectionMethods.java b/collectiontopics/CollectionMethods.java
    index 21c12bb5a..08660e62e 100644
    --- a/collectiontopics/CollectionMethods.java
    +++ b/collectiontopics/CollectionMethods.java
    @@ -56,8 +56,7 @@ public static void main(String[] args) {
         // c2 and c3 (an intersection of sets):
         c2.retainAll(c3);
         show(c2);
    -    // Throw away all the elements
    -    // in c2 that also appear in c3:
    +    // Discard all c2 elements that also appear in c3:
         c2.removeAll(c3);
         System.out.println(
           "c2.isEmpty() = " +  c2.isEmpty());
    diff --git a/concurrent/PSP2.txt b/concurrent/PSP2.txt
    index 491bd153f..f9ed83610 100644
    --- a/concurrent/PSP2.txt
    +++ b/concurrent/PSP2.txt
    @@ -1,12 +1,512 @@
    +0: ForkJoinPool.commonPool-worker-1
     0: main
    -1: main
    -1: ForkJoinPool.commonPool-worker-3
    -1: ForkJoinPool.commonPool-worker-5
    -3: ForkJoinPool.commonPool-worker-5
    +2: main
    +2: ForkJoinPool.commonPool-worker-1
     3: main
    -5: ForkJoinPool.commonPool-worker-5
    +4: ForkJoinPool.commonPool-worker-1
     5: main
    -7: ForkJoinPool.commonPool-worker-5
    -8: main
    -8: ForkJoinPool.commonPool-worker-3
    -10: ForkJoinPool.commonPool-worker-5
    +6: ForkJoinPool.commonPool-worker-1
    +7: main
    +9: ForkJoinPool.commonPool-worker-1
    +9: main
    +11: ForkJoinPool.commonPool-worker-1
    +11: main
    +12: ForkJoinPool.commonPool-worker-1
    +13: main
    +15: ForkJoinPool.commonPool-worker-1
    +15: main
    +17: main
    +18: main
    +19: main
    +20: main
    +21: main
    +17: ForkJoinPool.commonPool-worker-1
    +23: main
    +23: ForkJoinPool.commonPool-worker-1
    +24: main
    +25: ForkJoinPool.commonPool-worker-1
    +26: main
    +27: ForkJoinPool.commonPool-worker-1
    +28: main
    +29: ForkJoinPool.commonPool-worker-1
    +30: main
    +32: main
    +32: ForkJoinPool.commonPool-worker-1
    +33: main
    +35: ForkJoinPool.commonPool-worker-1
    +36: ForkJoinPool.commonPool-worker-1
    +37: ForkJoinPool.commonPool-worker-1
    +38: ForkJoinPool.commonPool-worker-1
    +35: main
    +39: ForkJoinPool.commonPool-worker-1
    +41: ForkJoinPool.commonPool-worker-1
    +40: main
    +42: ForkJoinPool.commonPool-worker-1
    +43: main
    +44: ForkJoinPool.commonPool-worker-1
    +45: main
    +46: ForkJoinPool.commonPool-worker-1
    +47: main
    +49: main
    +50: main
    +50: ForkJoinPool.commonPool-worker-1
    +51: main
    +52: ForkJoinPool.commonPool-worker-1
    +53: main
    +55: ForkJoinPool.commonPool-worker-1
    +55: main
    +56: ForkJoinPool.commonPool-worker-1
    +58: ForkJoinPool.commonPool-worker-1
    +57: main
    +59: ForkJoinPool.commonPool-worker-1
    +60: main
    +61: ForkJoinPool.commonPool-worker-1
    +62: main
    +63: ForkJoinPool.commonPool-worker-1
    +64: main
    +65: ForkJoinPool.commonPool-worker-1
    +66: main
    +67: ForkJoinPool.commonPool-worker-1
    +68: main
    +69: ForkJoinPool.commonPool-worker-1
    +71: ForkJoinPool.commonPool-worker-1
    +72: ForkJoinPool.commonPool-worker-1
    +70: main
    +73: ForkJoinPool.commonPool-worker-1
    +75: ForkJoinPool.commonPool-worker-1
    +76: ForkJoinPool.commonPool-worker-1
    +74: main
    +77: ForkJoinPool.commonPool-worker-1
    +78: ForkJoinPool.commonPool-worker-1
    +79: main
    +80: ForkJoinPool.commonPool-worker-1
    +81: main
    +82: ForkJoinPool.commonPool-worker-1
    +83: main
    +84: ForkJoinPool.commonPool-worker-1
    +85: main
    +86: ForkJoinPool.commonPool-worker-1
    +87: main
    +89: ForkJoinPool.commonPool-worker-1
    +90: ForkJoinPool.commonPool-worker-1
    +89: main
    +91: ForkJoinPool.commonPool-worker-1
    +92: main
    +93: ForkJoinPool.commonPool-worker-1
    +94: main
    +95: ForkJoinPool.commonPool-worker-1
    +96: main
    +98: main
    +97: ForkJoinPool.commonPool-worker-1
    +99: main
    +100: ForkJoinPool.commonPool-worker-1
    +101: main
    +103: ForkJoinPool.commonPool-worker-1
    +103: main
    +104: ForkJoinPool.commonPool-worker-1
    +106: ForkJoinPool.commonPool-worker-1
    +107: ForkJoinPool.commonPool-worker-1
    +106: main
    +108: ForkJoinPool.commonPool-worker-1
    +110: ForkJoinPool.commonPool-worker-1
    +108: ForkJoinPool.commonPool-worker-2
    +111: ForkJoinPool.commonPool-worker-1
    +110: main
    +113: ForkJoinPool.commonPool-worker-1
    +112: ForkJoinPool.commonPool-worker-2
    +115: ForkJoinPool.commonPool-worker-1
    +116: main
    +116: ForkJoinPool.commonPool-worker-2
    +117: ForkJoinPool.commonPool-worker-1
    +118: main
    +119: ForkJoinPool.commonPool-worker-2
    +120: ForkJoinPool.commonPool-worker-1
    +121: main
    +123: ForkJoinPool.commonPool-worker-1
    +124: main
    +124: ForkJoinPool.commonPool-worker-2
    +126: main
    +126: ForkJoinPool.commonPool-worker-1
    +127: ForkJoinPool.commonPool-worker-2
    +128: main
    +130: ForkJoinPool.commonPool-worker-1
    +130: ForkJoinPool.commonPool-worker-2
    +131: main
    +133: ForkJoinPool.commonPool-worker-1
    +134: ForkJoinPool.commonPool-worker-2
    +134: main
    +136: ForkJoinPool.commonPool-worker-1
    +137: main
    +137: ForkJoinPool.commonPool-worker-2
    +138: ForkJoinPool.commonPool-worker-1
    +140: main
    +140: ForkJoinPool.commonPool-worker-2
    +141: ForkJoinPool.commonPool-worker-1
    +143: main
    +143: ForkJoinPool.commonPool-worker-2
    +145: ForkJoinPool.commonPool-worker-1
    +146: main
    +146: ForkJoinPool.commonPool-worker-2
    +148: ForkJoinPool.commonPool-worker-1
    +149: main
    +149: ForkJoinPool.commonPool-worker-2
    +151: ForkJoinPool.commonPool-worker-1
    +152: ForkJoinPool.commonPool-worker-2
    +154: ForkJoinPool.commonPool-worker-1
    +154: ForkJoinPool.commonPool-worker-2
    +152: main
    +156: ForkJoinPool.commonPool-worker-1
    +156: ForkJoinPool.commonPool-worker-2
    +159: ForkJoinPool.commonPool-worker-1
    +159: ForkJoinPool.commonPool-worker-2
    +161: ForkJoinPool.commonPool-worker-1
    +159: main
    +162: ForkJoinPool.commonPool-worker-1
    +161: ForkJoinPool.commonPool-worker-2
    +164: ForkJoinPool.commonPool-worker-1
    +163: main
    +166: ForkJoinPool.commonPool-worker-1
    +168: ForkJoinPool.commonPool-worker-1
    +168: main
    +169: ForkJoinPool.commonPool-worker-1
    +170: main
    +167: ForkJoinPool.commonPool-worker-2
    +171: ForkJoinPool.commonPool-worker-1
    +172: main
    +168: ForkJoinPool.commonPool-worker-3
    +174: ForkJoinPool.commonPool-worker-1
    +175: main
    +178: ForkJoinPool.commonPool-worker-1
    +178: main
    +178: ForkJoinPool.commonPool-worker-3
    +175: ForkJoinPool.commonPool-worker-2
    +179: ForkJoinPool.commonPool-worker-1
    +181: main
    +183: ForkJoinPool.commonPool-worker-1
    +183: ForkJoinPool.commonPool-worker-2
    +184: main
    +184: ForkJoinPool.commonPool-worker-3
    +185: ForkJoinPool.commonPool-worker-1
    +187: main
    +187: ForkJoinPool.commonPool-worker-2
    +189: ForkJoinPool.commonPool-worker-1
    +191: main
    +189: ForkJoinPool.commonPool-worker-3
    +191: ForkJoinPool.commonPool-worker-2
    +193: main
    +193: ForkJoinPool.commonPool-worker-1
    +195: ForkJoinPool.commonPool-worker-3
    +195: ForkJoinPool.commonPool-worker-2
    +197: main
    +199: ForkJoinPool.commonPool-worker-3
    +199: ForkJoinPool.commonPool-worker-2
    +197: ForkJoinPool.commonPool-worker-1
    +200: main
    +202: ForkJoinPool.commonPool-worker-3
    +203: ForkJoinPool.commonPool-worker-2
    +204: ForkJoinPool.commonPool-worker-1
    +204: main
    +205: ForkJoinPool.commonPool-worker-3
    +207: ForkJoinPool.commonPool-worker-2
    +208: ForkJoinPool.commonPool-worker-1
    +208: main
    +209: ForkJoinPool.commonPool-worker-3
    +211: ForkJoinPool.commonPool-worker-2
    +211: ForkJoinPool.commonPool-worker-1
    +213: main
    +213: ForkJoinPool.commonPool-worker-3
    +215: ForkJoinPool.commonPool-worker-2
    +215: ForkJoinPool.commonPool-worker-1
    +217: main
    +217: ForkJoinPool.commonPool-worker-3
    +219: ForkJoinPool.commonPool-worker-2
    +220: ForkJoinPool.commonPool-worker-1
    +221: main
    +221: ForkJoinPool.commonPool-worker-3
    +224: ForkJoinPool.commonPool-worker-1
    +225: main
    +225: ForkJoinPool.commonPool-worker-3
    +223: ForkJoinPool.commonPool-worker-2
    +227: ForkJoinPool.commonPool-worker-1
    +227: main
    +229: ForkJoinPool.commonPool-worker-3
    +229: ForkJoinPool.commonPool-worker-2
    +231: ForkJoinPool.commonPool-worker-1
    +231: main
    +233: ForkJoinPool.commonPool-worker-3
    +233: ForkJoinPool.commonPool-worker-2
    +235: ForkJoinPool.commonPool-worker-1
    +236: main
    +237: ForkJoinPool.commonPool-worker-3
    +237: ForkJoinPool.commonPool-worker-2
    +239: ForkJoinPool.commonPool-worker-1
    +241: main
    +241: ForkJoinPool.commonPool-worker-2
    +241: ForkJoinPool.commonPool-worker-3
    +243: ForkJoinPool.commonPool-worker-1
    +244: main
    +244: ForkJoinPool.commonPool-worker-2
    +245: ForkJoinPool.commonPool-worker-3
    +247: ForkJoinPool.commonPool-worker-1
    +249: ForkJoinPool.commonPool-worker-3
    +251: ForkJoinPool.commonPool-worker-3
    +250: ForkJoinPool.commonPool-worker-1
    +251: ForkJoinPool.commonPool-worker-2
    +253: ForkJoinPool.commonPool-worker-3
    +254: ForkJoinPool.commonPool-worker-1
    +254: ForkJoinPool.commonPool-worker-2
    +251: main
    +255: ForkJoinPool.commonPool-worker-3
    +257: ForkJoinPool.commonPool-worker-1
    +257: ForkJoinPool.commonPool-worker-2
    +259: ForkJoinPool.commonPool-worker-3
    +261: ForkJoinPool.commonPool-worker-1
    +261: ForkJoinPool.commonPool-worker-2
    +262: ForkJoinPool.commonPool-worker-3
    +263: ForkJoinPool.commonPool-worker-1
    +264: ForkJoinPool.commonPool-worker-2
    +265: ForkJoinPool.commonPool-worker-3
    +267: ForkJoinPool.commonPool-worker-1
    +267: ForkJoinPool.commonPool-worker-2
    +261: main
    +268: ForkJoinPool.commonPool-worker-3
    +269: ForkJoinPool.commonPool-worker-1
    +270: ForkJoinPool.commonPool-worker-2
    +272: ForkJoinPool.commonPool-worker-3
    +273: ForkJoinPool.commonPool-worker-1
    +276: ForkJoinPool.commonPool-worker-3
    +276: ForkJoinPool.commonPool-worker-1
    +274: ForkJoinPool.commonPool-worker-2
    +277: ForkJoinPool.commonPool-worker-3
    +279: ForkJoinPool.commonPool-worker-1
    +279: ForkJoinPool.commonPool-worker-2
    +275: main
    +281: ForkJoinPool.commonPool-worker-1
    +280: ForkJoinPool.commonPool-worker-3
    +282: ForkJoinPool.commonPool-worker-2
    +285: ForkJoinPool.commonPool-worker-1
    +286: ForkJoinPool.commonPool-worker-3
    +286: ForkJoinPool.commonPool-worker-2
    +288: ForkJoinPool.commonPool-worker-1
    +289: ForkJoinPool.commonPool-worker-3
    +289: ForkJoinPool.commonPool-worker-2
    +286: main
    +291: ForkJoinPool.commonPool-worker-1
    +292: ForkJoinPool.commonPool-worker-3
    +293: ForkJoinPool.commonPool-worker-2
    +293: main
    +296: ForkJoinPool.commonPool-worker-3
    +296: ForkJoinPool.commonPool-worker-2
    +297: main
    +297: ForkJoinPool.commonPool-worker-1
    +299: ForkJoinPool.commonPool-worker-3
    +299: ForkJoinPool.commonPool-worker-2
    +301: main
    +301: ForkJoinPool.commonPool-worker-1
    +303: ForkJoinPool.commonPool-worker-3
    +303: ForkJoinPool.commonPool-worker-2
    +305: main
    +305: ForkJoinPool.commonPool-worker-1
    +307: ForkJoinPool.commonPool-worker-3
    +307: ForkJoinPool.commonPool-worker-2
    +309: main
    +309: ForkJoinPool.commonPool-worker-1
    +311: ForkJoinPool.commonPool-worker-3
    +311: ForkJoinPool.commonPool-worker-2
    +313: main
    +313: ForkJoinPool.commonPool-worker-1
    +315: ForkJoinPool.commonPool-worker-3
    +315: ForkJoinPool.commonPool-worker-2
    +317: ForkJoinPool.commonPool-worker-1
    +319: ForkJoinPool.commonPool-worker-3
    +319: ForkJoinPool.commonPool-worker-2
    +320: ForkJoinPool.commonPool-worker-1
    +322: ForkJoinPool.commonPool-worker-3
    +317: main
    +323: ForkJoinPool.commonPool-worker-1
    +322: ForkJoinPool.commonPool-worker-2
    +324: ForkJoinPool.commonPool-worker-3
    +328: main
    +328: ForkJoinPool.commonPool-worker-3
    +328: ForkJoinPool.commonPool-worker-2
    +330: ForkJoinPool.commonPool-worker-3
    +329: main
    +331: ForkJoinPool.commonPool-worker-2
    +332: ForkJoinPool.commonPool-worker-3
    +334: ForkJoinPool.commonPool-worker-2
    +335: main
    +335: ForkJoinPool.commonPool-worker-3
    +337: ForkJoinPool.commonPool-worker-2
    +338: main
    +338: ForkJoinPool.commonPool-worker-3
    +340: ForkJoinPool.commonPool-worker-2
    +341: main
    +341: ForkJoinPool.commonPool-worker-3
    +343: ForkJoinPool.commonPool-worker-2
    +343: main
    +344: ForkJoinPool.commonPool-worker-3
    +346: ForkJoinPool.commonPool-worker-2
    +347: main
    +347: ForkJoinPool.commonPool-worker-3
    +349: ForkJoinPool.commonPool-worker-2
    +350: main
    +350: ForkJoinPool.commonPool-worker-3
    +351: ForkJoinPool.commonPool-worker-2
    +353: main
    +353: ForkJoinPool.commonPool-worker-3
    +355: ForkJoinPool.commonPool-worker-2
    +356: main
    +356: ForkJoinPool.commonPool-worker-3
    +358: ForkJoinPool.commonPool-worker-2
    +359: main
    +359: ForkJoinPool.commonPool-worker-3
    +361: ForkJoinPool.commonPool-worker-2
    +362: main
    +362: ForkJoinPool.commonPool-worker-3
    +365: main
    +364: ForkJoinPool.commonPool-worker-2
    +365: ForkJoinPool.commonPool-worker-3
    +366: main
    +368: ForkJoinPool.commonPool-worker-2
    +369: main
    +369: ForkJoinPool.commonPool-worker-3
    +372: ForkJoinPool.commonPool-worker-3
    +371: ForkJoinPool.commonPool-worker-2
    +372: main
    +374: ForkJoinPool.commonPool-worker-3
    +374: ForkJoinPool.commonPool-worker-2
    +376: ForkJoinPool.commonPool-worker-3
    +377: ForkJoinPool.commonPool-worker-2
    +378: ForkJoinPool.commonPool-worker-3
    +376: main
    +379: ForkJoinPool.commonPool-worker-2
    +380: ForkJoinPool.commonPool-worker-3
    +382: ForkJoinPool.commonPool-worker-2
    +383: ForkJoinPool.commonPool-worker-3
    +384: ForkJoinPool.commonPool-worker-2
    +385: ForkJoinPool.commonPool-worker-3
    +383: main
    +386: ForkJoinPool.commonPool-worker-2
    +387: ForkJoinPool.commonPool-worker-3
    +390: ForkJoinPool.commonPool-worker-2
    +390: ForkJoinPool.commonPool-worker-3
    +392: ForkJoinPool.commonPool-worker-2
    +392: ForkJoinPool.commonPool-worker-3
    +390: main
    +394: ForkJoinPool.commonPool-worker-2
    +394: ForkJoinPool.commonPool-worker-3
    +397: ForkJoinPool.commonPool-worker-2
    +397: ForkJoinPool.commonPool-worker-3
    +399: ForkJoinPool.commonPool-worker-2
    +397: main
    +400: ForkJoinPool.commonPool-worker-3
    +401: ForkJoinPool.commonPool-worker-3
    +401: ForkJoinPool.commonPool-worker-2
    +404: ForkJoinPool.commonPool-worker-3
    +404: ForkJoinPool.commonPool-worker-2
    +403: main
    +406: ForkJoinPool.commonPool-worker-3
    +406: ForkJoinPool.commonPool-worker-2
    +408: main
    +409: ForkJoinPool.commonPool-worker-3
    +409: ForkJoinPool.commonPool-worker-2
    +411: main
    +412: ForkJoinPool.commonPool-worker-3
    +412: ForkJoinPool.commonPool-worker-2
    +414: main
    +414: ForkJoinPool.commonPool-worker-3
    +415: ForkJoinPool.commonPool-worker-2
    +418: ForkJoinPool.commonPool-worker-3
    +418: ForkJoinPool.commonPool-worker-2
    +419: ForkJoinPool.commonPool-worker-3
    +420: ForkJoinPool.commonPool-worker-2
    +421: ForkJoinPool.commonPool-worker-3
    +422: ForkJoinPool.commonPool-worker-2
    +423: ForkJoinPool.commonPool-worker-3
    +424: ForkJoinPool.commonPool-worker-2
    +425: ForkJoinPool.commonPool-worker-3
    +426: ForkJoinPool.commonPool-worker-2
    +427: ForkJoinPool.commonPool-worker-3
    +428: ForkJoinPool.commonPool-worker-2
    +430: ForkJoinPool.commonPool-worker-2
    +430: ForkJoinPool.commonPool-worker-3
    +432: ForkJoinPool.commonPool-worker-3
    +432: ForkJoinPool.commonPool-worker-2
    +433: ForkJoinPool.commonPool-worker-3
    +434: ForkJoinPool.commonPool-worker-2
    +435: ForkJoinPool.commonPool-worker-3
    +436: ForkJoinPool.commonPool-worker-2
    +437: ForkJoinPool.commonPool-worker-3
    +438: ForkJoinPool.commonPool-worker-2
    +439: ForkJoinPool.commonPool-worker-3
    +440: ForkJoinPool.commonPool-worker-2
    +441: ForkJoinPool.commonPool-worker-3
    +442: ForkJoinPool.commonPool-worker-2
    +443: ForkJoinPool.commonPool-worker-3
    +444: ForkJoinPool.commonPool-worker-2
    +445: ForkJoinPool.commonPool-worker-3
    +446: ForkJoinPool.commonPool-worker-2
    +447: ForkJoinPool.commonPool-worker-3
    +448: ForkJoinPool.commonPool-worker-2
    +449: ForkJoinPool.commonPool-worker-3
    +450: ForkJoinPool.commonPool-worker-2
    +451: ForkJoinPool.commonPool-worker-3
    +452: ForkJoinPool.commonPool-worker-2
    +453: ForkJoinPool.commonPool-worker-3
    +454: ForkJoinPool.commonPool-worker-2
    +456: ForkJoinPool.commonPool-worker-2
    +455: ForkJoinPool.commonPool-worker-3
    +458: ForkJoinPool.commonPool-worker-3
    +457: ForkJoinPool.commonPool-worker-2
    +459: ForkJoinPool.commonPool-worker-3
    +460: ForkJoinPool.commonPool-worker-2
    +461: ForkJoinPool.commonPool-worker-3
    +462: ForkJoinPool.commonPool-worker-2
    +463: ForkJoinPool.commonPool-worker-3
    +464: ForkJoinPool.commonPool-worker-2
    +465: ForkJoinPool.commonPool-worker-3
    +466: ForkJoinPool.commonPool-worker-2
    +467: ForkJoinPool.commonPool-worker-3
    +468: ForkJoinPool.commonPool-worker-2
    +469: ForkJoinPool.commonPool-worker-3
    +470: ForkJoinPool.commonPool-worker-2
    +471: ForkJoinPool.commonPool-worker-3
    +472: ForkJoinPool.commonPool-worker-2
    +473: ForkJoinPool.commonPool-worker-3
    +474: ForkJoinPool.commonPool-worker-2
    +475: ForkJoinPool.commonPool-worker-3
    +476: ForkJoinPool.commonPool-worker-2
    +477: ForkJoinPool.commonPool-worker-3
    +478: ForkJoinPool.commonPool-worker-2
    +479: ForkJoinPool.commonPool-worker-3
    +480: ForkJoinPool.commonPool-worker-2
    +482: ForkJoinPool.commonPool-worker-2
    +481: ForkJoinPool.commonPool-worker-3
    +484: ForkJoinPool.commonPool-worker-3
    +484: ForkJoinPool.commonPool-worker-2
    +327: ForkJoinPool.commonPool-worker-1
    +485: ForkJoinPool.commonPool-worker-3
    +486: ForkJoinPool.commonPool-worker-2
    +488: ForkJoinPool.commonPool-worker-3
    +488: ForkJoinPool.commonPool-worker-1
    +489: ForkJoinPool.commonPool-worker-2
    +490: ForkJoinPool.commonPool-worker-3
    +491: ForkJoinPool.commonPool-worker-1
    +492: ForkJoinPool.commonPool-worker-2
    +495: ForkJoinPool.commonPool-worker-2
    +493: ForkJoinPool.commonPool-worker-3
    +496: ForkJoinPool.commonPool-worker-2
    +497: ForkJoinPool.commonPool-worker-3
    +499: ForkJoinPool.commonPool-worker-3
    +500: ForkJoinPool.commonPool-worker-3
    +501: ForkJoinPool.commonPool-worker-3
    +502: ForkJoinPool.commonPool-worker-3
    +503: ForkJoinPool.commonPool-worker-3
    +504: ForkJoinPool.commonPool-worker-3
    +505: ForkJoinPool.commonPool-worker-3
    +506: ForkJoinPool.commonPool-worker-3
    +507: ForkJoinPool.commonPool-worker-3
    +508: ForkJoinPool.commonPool-worker-3
    +509: ForkJoinPool.commonPool-worker-3
    +510: ForkJoinPool.commonPool-worker-3
    +511: ForkJoinPool.commonPool-worker-3
    diff --git a/enums/PostOffice.java b/enums/PostOffice.java
    index c5faa8cb4..2aef48f95 100644
    --- a/enums/PostOffice.java
    +++ b/enums/PostOffice.java
    @@ -26,7 +26,7 @@ enum ReturnAddress {MISSING,OK1,OK2,OK3,OK4,OK5}
       public String details() {
         return toString() +
           ", General Delivery: " + generalDelivery +
    -      ", Address Scanability: " + scannability +
    +      ", Address Scannability: " + scannability +
           ", Address Readability: " + readability +
           ", Address Address: " + address +
           ", Return address: " + returnAddress;
    @@ -138,52 +138,52 @@ public static void main(String[] args) {
       }
     }
     /* Output:
    -Mail 0, General Delivery: NO2, Address Scanability:
    +Mail 0, General Delivery: NO2, Address Scannability:
     UNSCANNABLE, Address Readability: YES3, Address
     Address: OK1, Return address: OK1
     Delivering Mail 0 normally
     *****
    -Mail 1, General Delivery: NO5, Address Scanability:
    +Mail 1, General Delivery: NO5, Address Scannability:
     YES3, Address Readability: ILLEGIBLE, Address Address:
     OK5, Return address: OK1
     Delivering Mail 1 automatically
     *****
    -Mail 2, General Delivery: YES, Address Scanability:
    +Mail 2, General Delivery: YES, Address Scannability:
     YES3, Address Readability: YES1, Address Address: OK1,
     Return address: OK5
     Using general delivery for Mail 2
     *****
    -Mail 3, General Delivery: NO4, Address Scanability:
    +Mail 3, General Delivery: NO4, Address Scannability:
     YES3, Address Readability: YES1, Address Address:
     INCORRECT, Return address: OK4
     Returning Mail 3 to sender
     *****
    -Mail 4, General Delivery: NO4, Address Scanability:
    +Mail 4, General Delivery: NO4, Address Scannability:
     UNSCANNABLE, Address Readability: YES1, Address
     Address: INCORRECT, Return address: OK2
     Returning Mail 4 to sender
     *****
    -Mail 5, General Delivery: NO3, Address Scanability:
    +Mail 5, General Delivery: NO3, Address Scannability:
     YES1, Address Readability: ILLEGIBLE, Address Address:
     OK4, Return address: OK2
     Delivering Mail 5 automatically
     *****
    -Mail 6, General Delivery: YES, Address Scanability:
    +Mail 6, General Delivery: YES, Address Scannability:
     YES4, Address Readability: ILLEGIBLE, Address Address:
     OK4, Return address: OK4
     Using general delivery for Mail 6
     *****
    -Mail 7, General Delivery: YES, Address Scanability:
    +Mail 7, General Delivery: YES, Address Scannability:
     YES3, Address Readability: YES4, Address Address: OK2,
     Return address: MISSING
     Using general delivery for Mail 7
     *****
    -Mail 8, General Delivery: NO3, Address Scanability:
    +Mail 8, General Delivery: NO3, Address Scannability:
     YES1, Address Readability: YES3, Address Address:
     INCORRECT, Return address: MISSING
     Mail 8 is a dead letter
     *****
    -Mail 9, General Delivery: NO1, Address Scanability:
    +Mail 9, General Delivery: NO1, Address Scannability:
     UNSCANNABLE, Address Readability: YES2, Address
     Address: OK1, Return address: OK4
     Delivering Mail 9 normally
    diff --git a/enums/menu/Food.java b/enums/menu/Food.java
    index 5592f9126..51f4a8a07 100644
    --- a/enums/menu/Food.java
    +++ b/enums/menu/Food.java
    @@ -11,7 +11,7 @@ enum Appetizer implements Food {
       }
       enum MainCourse implements Food {
         LASAGNE, BURRITO, PAD_THAI,
    -    LENTILS, HUMMOUS, VINDALOO;
    +    LENTILS, HUMMUS, VINDALOO;
       }
       enum Dessert implements Food {
         TIRAMISU, GELATO, BLACK_FOREST_CAKE,
    diff --git a/enums/menu/Meal2.java b/enums/menu/Meal2.java
    index d5aea179c..0064926e0 100644
    --- a/enums/menu/Meal2.java
    +++ b/enums/menu/Meal2.java
    @@ -21,7 +21,7 @@ enum Appetizer implements Food {
         }
         enum MainCourse implements Food {
           LASAGNE, BURRITO, PAD_THAI,
    -      LENTILS, HUMMOUS, VINDALOO;
    +      LENTILS, HUMMUS, VINDALOO;
         }
         enum Dessert implements Food {
           TIRAMISU, GELATO, BLACK_FOREST_CAKE,
    diff --git a/equalshashcode/IndividualTest.java b/equalshashcode/IndividualTest.java
    index 33bb9b96d..0be8de2d9 100644
    --- a/equalshashcode/IndividualTest.java
    +++ b/equalshashcode/IndividualTest.java
    @@ -3,7 +3,7 @@
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     import collections.MapOfList;
    -import typeinfo.pets.*;
    +import reflection.pets.*;
     import java.util.*;
     
     public class IndividualTest {
    diff --git a/generics/CheckedList.java b/generics/CheckedList.java
    index 26cae143a..71ebe3d0a 100644
    --- a/generics/CheckedList.java
    +++ b/generics/CheckedList.java
    @@ -3,7 +3,7 @@
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // Using Collection.checkedList()
    -import typeinfo.pets.*;
    +import reflection.pets.*;
     import java.util.*;
     
     public class CheckedList {
    @@ -30,6 +30,6 @@ public static void main(String[] args) {
     }
     /* Output:
     Expected: java.lang.ClassCastException: Attempt to
    -insert class typeinfo.pets.Cat element into collection
    -with element type class typeinfo.pets.Dog
    +insert class reflection.pets.Cat element into collection
    +with element type class reflection.pets.Dog
     */
    diff --git a/generics/DogsAndRobotMethodReferences.java b/generics/DogsAndRobotMethodReferences.java
    index 612ef683e..2e9d003e5 100644
    --- a/generics/DogsAndRobotMethodReferences.java
    +++ b/generics/DogsAndRobotMethodReferences.java
    @@ -3,7 +3,7 @@
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // "Assisted Latent Typing"
    -import typeinfo.pets.*;
    +import reflection.pets.*;
     import java.util.function.*;
     
     class PerformingDogA extends Dog {
    diff --git a/generics/DogsAndRobots.java b/generics/DogsAndRobots.java
    index 4bbb9b440..228e363d3 100644
    --- a/generics/DogsAndRobots.java
    +++ b/generics/DogsAndRobots.java
    @@ -3,7 +3,7 @@
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
     // No (direct) latent typing in Java
    -import typeinfo.pets.*;
    +import reflection.pets.*;
     
     class PerformingDog extends Dog implements Performs {
       @Override
    diff --git a/generics/GenericHolder.java b/generics/GenericHolder.java
    index 15cfbb9e1..b04aa17a8 100644
    --- a/generics/GenericHolder.java
    +++ b/generics/GenericHolder.java
    @@ -10,7 +10,7 @@ public GenericHolder() {}
       public T get() { return a; }
       public static void main(String[] args) {
         GenericHolder h3 =
    -      new GenericHolder();
    +      new GenericHolder<>();
         h3.set(new Automobile()); // type checked
         Automobile a = h3.get(); // No cast needed
         //- h3.set("Not an Automobile"); // Error
    diff --git a/gradle/subprojects.gradle b/gradle/subprojects.gradle
    index e9d857d87..e4fb9764a 100644
    --- a/gradle/subprojects.gradle
    +++ b/gradle/subprojects.gradle
    @@ -6,7 +6,7 @@ project(':validating') {
     
     project(':equalshashcode') {
         dependencies {
    -        compile project(':typeinfo')
    +        compile project(':reflection')
             compile project(':collections')
         }
     }
    @@ -48,13 +48,13 @@ project(':hiding') {
     
     project(':generics') {
         dependencies {
    -        compile project(':typeinfo')
    +        compile project(':reflection')
         }
     }
     
     project(':collections') {
         dependencies {
    -        compile project(':typeinfo')
    +        compile project(':reflection')
         }
     }
     
    diff --git a/housekeeping/Flower.java b/housekeeping/Flower.java
    index ad90463c2..fa519d1d6 100644
    --- a/housekeeping/Flower.java
    +++ b/housekeeping/Flower.java
    @@ -26,7 +26,7 @@ public class Flower {
       }
       Flower() {
         this("hi", 47);
    -    System.out.println("no-arg constructor");
    +    System.out.println("Zero-argument constructor");
       }
       void printPetalCount() {
         //- this(11); // Not inside non-constructor!
    @@ -41,6 +41,6 @@ public static void main(String[] args) {
     /* Output:
     Constructor w/ int arg only, petalCount= 47
     String & int args
    -no-arg constructor
    +Zero-argument constructor
     petalCount = 47 s = hi
     */
    diff --git a/housekeeping/OverloadingOrder.java b/housekeeping/OverloadingOrder.java
    index e2cef3012..434768d77 100644
    --- a/housekeeping/OverloadingOrder.java
    +++ b/housekeeping/OverloadingOrder.java
    @@ -2,7 +2,7 @@
     // (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
    -// Overloading based on the order of the arguments
    +// Overloading based on parameter order
     
     public class OverloadingOrder {
       static void f(String s, int i) {
    diff --git a/housekeeping/SimpleConstructor2.java b/housekeeping/SimpleConstructor2.java
    index ae6936efc..2a002daf6 100644
    --- a/housekeeping/SimpleConstructor2.java
    +++ b/housekeeping/SimpleConstructor2.java
    @@ -2,7 +2,7 @@
     // (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
    -// Constructors can have arguments
    +// Constructors can have parameters
     
     class Rock2 {
       Rock2(int i) {
    diff --git a/javadoc/Documentation3.java b/javadoc/Documentation3.java
    index df0c403bb..c48351ea5 100644
    --- a/javadoc/Documentation3.java
    +++ b/javadoc/Documentation3.java
    @@ -2,6 +2,7 @@
     // (c)2021 MindView LLC: see Copyright.txt
     // We make no guarantees that this code is fit for any purpose.
     // Visit http://OnJava8.com for more book information.
    +
     /** You can even insert a list:
      * 
      *
    1. Item one @@ -9,4 +10,5 @@ *
    2. Item three *
    */ + public class Documentation3 {} diff --git a/onjava/BasicSupplier.java b/onjava/BasicSupplier.java index 838d37861..45bb58111 100644 --- a/onjava/BasicSupplier.java +++ b/onjava/BasicSupplier.java @@ -2,7 +2,7 @@ // (c)2021 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. -// Supplier from a class with a no-arg constructor +// Supplier from a class with a zero-argument constructor package onjava; import java.util.function.*; import java.lang.reflect.InvocationTargetException; diff --git a/onjava/Countries.java b/onjava/Countries.java index 13764b647..666dda293 100644 --- a/onjava/Countries.java +++ b/onjava/Countries.java @@ -130,7 +130,7 @@ public class Countries { {"MOLDOVA","Chisinau"}, {"RUSSIA","Moscow"}, {"TAJIKISTAN","Dushanbe"}, - {"TURKMENISTAN","Ashkabad"}, + {"TURKMENISTAN","Ashkhabad"}, {"UKRAINE","Kyiv"}, {"UZBEKISTAN","Tashkent"}, // Europe diff --git a/onjava/MouseClick.java b/onjava/MouseClick.java index 1bfa28e95..ea7e530da 100644 --- a/onjava/MouseClick.java +++ b/onjava/MouseClick.java @@ -2,7 +2,7 @@ // (c)2021 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. -// Helper interface to allow lambda expressions +// Helper interface to allow lambda expressions. package onjava; import java.awt.event.*; diff --git a/onjava/atunit/AtUnit.java b/onjava/atunit/AtUnit.java index 7288c2f4b..976010884 100644 --- a/onjava/atunit/AtUnit.java +++ b/onjava/atunit/AtUnit.java @@ -63,11 +63,11 @@ public class AtUnit implements ProcessFiles.Strategy { .getDeclaredConstructor() .getModifiers())) { System.out.println("Error: " + testClass + - " no-arg constructor must be public"); + " zero-argument constructor must be public"); System.exit(1); } } catch(NoSuchMethodException e) { - // Synthesized no-arg constructor; OK + // Synthesized zero-argument constructor; OK } System.out.println(testClass.getName()); } @@ -159,7 +159,7 @@ Method checkForCleanupMethod(Method m) { throw new RuntimeException("Couldn't run " + "@TestObject (creator) method."); } - } else { // Use the no-arg constructor: + } else { // Use the zero-argument constructor: try { return testClass .getConstructor().newInstance(); diff --git a/patterns/BoxObserver.java b/patterns/BoxObserver.java index db25c5ea2..b48120bc1 100644 --- a/patterns/BoxObserver.java +++ b/patterns/BoxObserver.java @@ -2,7 +2,7 @@ // (c)2021 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. -// Demonstration of Observer pattern using +// Demonstration of the Observer pattern using // Java's built-in observer classes. // {ExcludeFromGradle} // Won't work under WSL2 import javax.swing.*; @@ -12,46 +12,34 @@ import onjava.*; import onjava.MouseClick; -// You must inherit a new type of Observable: @SuppressWarnings("deprecation") -class BoxObservable extends Observable { - @Override - public void notifyObservers(Object b) { - // Otherwise it won't propagate changes: - setChanged(); - super.notifyObservers(b); - } -} - -@SuppressWarnings("deprecation") -public class BoxObserver extends JFrame { - Observable notifier = new BoxObservable(); - public BoxObserver(int grid) { +class Boxes extends JFrame { + Observable notifier = new Observable() { + @Override + public void notifyObservers(Object b) { + setChanged(); + super.notifyObservers(b); + } + }; + public Boxes(int grid) { setTitle("Demonstrates Observer pattern"); Container cp = getContentPane(); cp.setLayout(new GridLayout(grid, grid)); for(int x = 0; x < grid; x++) for(int y = 0; y < grid; y++) - cp.add(new OCBox(x, y, notifier)); - } - public static void main(String[] args) { - // For automated test runs: - // new TimedAbort(4); - int grid = 8; - if(args.length > 0) - grid = Integer.parseInt(args[0]); - JFrame f = new BoxObserver(grid); - f.setSize(500, 400); - f.setVisible(true); - f.setDefaultCloseOperation(DISPOSE_ON_CLOSE); + cp.add(new Box(x, y, notifier)); + setSize(500, 400); + setVisible(true); + setDefaultCloseOperation(DISPOSE_ON_CLOSE); } } @SuppressWarnings("deprecation") -class OCBox extends JPanel implements Observer { - Observable notifier; - int x, y; // Locations in grid - Color cColor = newColor(); +class Box extends JPanel implements Observer { + int x, y; // Location in grid + Color color = COLORS[ + (int)(Math.random() * COLORS.length) + ]; static final Color[] COLORS = { Color.black, Color.blue, Color.cyan, Color.darkGray, Color.gray, Color.green, @@ -59,35 +47,38 @@ class OCBox extends JPanel implements Observer { Color.orange, Color.pink, Color.red, Color.white, Color.yellow }; - static Color newColor() { - return COLORS[ - (int)(Math.random() * COLORS.length) - ]; - } - OCBox(int x, int y, Observable notifier) { + Box(int x, int y, Observable notifier) { this.x = x; this.y = y; notifier.addObserver(this); - this.notifier = notifier; addMouseListener((MouseClick) - e -> notifier.notifyObservers(OCBox.this)); + e -> notifier.notifyObservers(Box.this)); } @Override public void paintComponent(Graphics g) { super.paintComponent(g); - g.setColor(cColor); + g.setColor(color); Dimension s = getSize(); g.fillRect(0, 0, s.width, s.height); } @Override public void update(Observable o, Object arg) { - OCBox clicked = (OCBox)arg; + Box clicked = (Box)arg; if(nextTo(clicked)) { - cColor = clicked.cColor; + color = clicked.color; repaint(); } } - private boolean nextTo(OCBox b) { + private boolean nextTo(Box b) { return Math.abs(x - b.x) <= 1 && Math.abs(y - b.y) <= 1; } } + +public class BoxObserver { + public static void main(String[] args) { + int grid = 8; + if(args.length > 0) + grid = Integer.parseInt(args[0]); + new Boxes(grid); + } +} diff --git a/patterns/CleanTheFloor.java b/patterns/CleanTheFloor.java new file mode 100644 index 000000000..8196f44bd --- /dev/null +++ b/patterns/CleanTheFloor.java @@ -0,0 +1,42 @@ +// patterns/CleanTheFloor.java +// (c)2021 MindView LLC: see Copyright.txt +// We make no guarantees that this code is fit for any purpose. +// Visit http://OnJava8.com for more book information. +// State with different compositional interface. + +class FloorCleaner { + private Attachment attachment = new Vacuum(); + public void change(Attachment newAttachment) { + attachment = newAttachment; + } + public void clean() { attachment.action(); } +} + +interface Attachment { + void action(); +} + +class Vacuum implements Attachment { + @Override public void action() { + System.out.println("Vacuuming"); + } +} + +class Mop implements Attachment { + @Override public void action() { + System.out.println("Mopping"); + } +} + +public class CleanTheFloor { + public static void main(String[] args) { + FloorCleaner floorCleaner = new FloorCleaner(); + floorCleaner.clean(); + floorCleaner.change(new Mop()); + floorCleaner.clean(); + } +} +/* Output: +Vacuuming +Mopping +*/ diff --git a/patterns/CommandPattern.java b/patterns/CommandPattern.java index 1a9612247..05bc61202 100644 --- a/patterns/CommandPattern.java +++ b/patterns/CommandPattern.java @@ -4,16 +4,23 @@ // Visit http://OnJava8.com for more book information. import java.util.*; +class Command { + public final String msg; + public Command(String msg) { + this.msg = msg; + } +} + public class CommandPattern { + public static void show(Command cmd) { + System.out.println(cmd.msg); + } public static void main(String[] args) { - List macro = Arrays.asList( - () -> System.out.print("Hello "), - () -> System.out.print("World! "), - () -> System.out.print("I'm the command pattern!") - ); - macro.forEach(Runnable::run); + show(new Command("First Command")); + show(new Command("Second Command")); } } /* Output: -Hello World! I'm the command pattern! +First Command +Second Command */ diff --git a/patterns/Macro.java b/patterns/Macro.java new file mode 100644 index 000000000..586b128ea --- /dev/null +++ b/patterns/Macro.java @@ -0,0 +1,25 @@ +// patterns/Macro.java +// (c)2021 MindView LLC: see Copyright.txt +// We make no guarantees that this code is fit for any purpose. +// Visit http://OnJava8.com for more book information. +import java.util.*; + +public class Macro { + public static void main(String[] args) { + List macro = new ArrayList<>( + Arrays.asList( + () -> System.out.print("Hello "), + () -> System.out.println("World! ") + )); + macro.forEach(Runnable::run); + macro.add( + () -> System.out.print("I'm the command pattern!") + ); + macro.forEach(Runnable::run); + } +} +/* Output: +Hello World! +Hello World! +I'm the command pattern! +*/ diff --git a/patterns/PaperScissorsRock.java b/patterns/PaperScissorsRock.java index 54063d6c7..ce48dd4d5 100644 --- a/patterns/PaperScissorsRock.java +++ b/patterns/PaperScissorsRock.java @@ -2,7 +2,7 @@ // (c)2021 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. -// Demonstration of multiple dispatching +// Demonstration of multiple dispatching. import java.util.*; import java.util.function.*; import java.util.stream.*; diff --git a/patterns/ProxyDemo.java b/patterns/ProxyDemo.java index 011fbe7ec..31f45aedb 100644 --- a/patterns/ProxyDemo.java +++ b/patterns/ProxyDemo.java @@ -2,7 +2,7 @@ // (c)2021 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. -// Simple demonstration of the Proxy pattern +// Basic demonstration of the Proxy pattern. interface ProxyBase { void f(); @@ -11,10 +11,8 @@ interface ProxyBase { } class Proxy implements ProxyBase { - private ProxyBase implementation; - Proxy() { - implementation = new Implementation(); - } + private ProxyBase implementation = + new Implementation(); // Pass method calls to the implementation: @Override public void f() { implementation.f(); } diff --git a/patterns/Resource.java b/patterns/Resource.java new file mode 100644 index 000000000..1a8ceda50 --- /dev/null +++ b/patterns/Resource.java @@ -0,0 +1,9 @@ +// patterns/Resource.java +// (c)2021 MindView LLC: see Copyright.txt +// We make no guarantees that this code is fit for any purpose. +// Visit http://OnJava8.com for more book information. + +public interface Resource { + T get(); + void set(T x); +} diff --git a/patterns/ShapeFactory1.java b/patterns/ShapeFactory1.java index 950c97c55..a47b75b7d 100644 --- a/patterns/ShapeFactory1.java +++ b/patterns/ShapeFactory1.java @@ -2,7 +2,7 @@ // (c)2021 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. -// A simple static factory method +// A basic static factory method. import java.util.*; import java.util.stream.*; import patterns.shapes.*; diff --git a/patterns/ShapeFactory2.java b/patterns/ShapeFactory2.java index e8206ba2f..552e36306 100644 --- a/patterns/ShapeFactory2.java +++ b/patterns/ShapeFactory2.java @@ -8,9 +8,9 @@ import patterns.shapes.*; public class ShapeFactory2 implements FactoryMethod { - Map factories = + private Map factories = new HashMap<>(); - static Constructor load(String id) { + private static Constructor load(String id) { System.out.println("loading " + id); try { return Class.forName("patterns.shapes." + id) diff --git a/patterns/ShapeFactory3.java b/patterns/ShapeFactory3.java index fdf7b2700..6571c5362 100644 --- a/patterns/ShapeFactory3.java +++ b/patterns/ShapeFactory3.java @@ -2,7 +2,7 @@ // (c)2021 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. -// Polymorphic factory methods +// Polymorphic factory methods. import java.util.*; import java.util.function.*; import java.util.stream.*; @@ -19,14 +19,15 @@ class RandomShapes implements Supplier { this.factories = factories; } @Override public Shape get() { - return factories[ - rand.nextInt(factories.length)].create(); + return + factories[rand.nextInt(factories.length)] + .create(); } } public class ShapeFactory3 { public static void main(String[] args) { - RandomShapes rs = new RandomShapes( + RandomShapes rs = new RandomShapes( // [1] Circle::new, Square::new, Triangle::new ); Stream.generate(rs) diff --git a/patterns/Single.java b/patterns/Single.java new file mode 100644 index 000000000..6bdb2d6e8 --- /dev/null +++ b/patterns/Single.java @@ -0,0 +1,18 @@ +// patterns/Single.java +// (c)2021 MindView LLC: see Copyright.txt +// We make no guarantees that this code is fit for any purpose. +// Visit http://OnJava8.com for more book information. + +@SuppressWarnings("unchecked") +public final class Single { + private static Object single; // [1] + public Single(T val) { + if(single != null) + throw new RuntimeException( + "Attempt to reassign Single<" + + val.getClass().getSimpleName() + ">" + ); + single = val; + } + public T get() { return (T)single; } +} diff --git a/patterns/SingletonPattern.java b/patterns/SingletonPattern.java index 2ff8de0d5..3ed313e6c 100644 --- a/patterns/SingletonPattern.java +++ b/patterns/SingletonPattern.java @@ -3,58 +3,45 @@ // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. -interface Resource { - int getValue(); - void setValue(int x); -} - -// This isn't inherited from a Cloneable -// base class and cloneability isn't added so -// making it final prevents cloneability from -// being added through inheritance. This also -// implements thread-safe lazy initialization: - -final class Singleton { - private static final class - ResourceImpl implements Resource { - private int i; - private ResourceImpl(int i) { - this.i = i; - } - @Override - public synchronized int getValue() { - return i; - } - @Override - public synchronized void setValue(int x) { - i = x; - } +final class IntegerSingleton + implements Resource { + private static IntegerSingleton value = + new IntegerSingleton(); + private Integer i = Integer.valueOf(0); + private IntegerSingleton() { + System.out.println("IntegerSingleton()"); } - private static class ResourceHolder { - private static Resource resource = - new ResourceImpl(47); - } - public static Resource getResource() { - return ResourceHolder.resource; + public static IntegerSingleton instance() { + return value; } + @Override public synchronized + Integer get() { return i; } + @Override public synchronized + void set(Integer x) { i = x; } } public class SingletonPattern { + public static void show(Resource r) { + T val = r.get(); + System.out.println(val); + } + public static void put(Resource r, T val) { + r.set(val); + } public static void main(String[] args) { - Resource r = Singleton.getResource(); - System.out.println(r.getValue()); - Resource s2 = Singleton.getResource(); - s2.setValue(9); - System.out.println(r.getValue()); - try { - // Can't do this: compile-time error. - // Singleton s3 = (Singleton)s2.clone(); - } catch(Exception e) { - throw new RuntimeException(e); - } + System.out.println("Inside main()"); + Resource ir = + IntegerSingleton.instance(); + Resource ir2 = + IntegerSingleton.instance(); + show(ir); + put(ir2, Integer.valueOf(9)); + show(ir); } } /* Output: -47 +Inside main() +IntegerSingleton() +0 9 */ diff --git a/patterns/SingletonPattern2.java b/patterns/SingletonPattern2.java new file mode 100644 index 000000000..c02fa9f20 --- /dev/null +++ b/patterns/SingletonPattern2.java @@ -0,0 +1,16 @@ +// patterns/SingletonPattern2.java +// (c)2021 MindView LLC: see Copyright.txt +// We make no guarantees that this code is fit for any purpose. +// Visit http://OnJava8.com for more book information. + +public class SingletonPattern2 { + public static void main(String[] args) { + Single pi = + new Single<>(Double.valueOf(3.14159)); + Double x = pi.get(); + System.out.println(x); + } +} +/* Output: +3.14159 +*/ diff --git a/patterns/SingletonPattern3.java b/patterns/SingletonPattern3.java new file mode 100644 index 000000000..7aee59f08 --- /dev/null +++ b/patterns/SingletonPattern3.java @@ -0,0 +1,33 @@ +// patterns/SingletonPattern3.java +// (c)2021 MindView LLC: see Copyright.txt +// We make no guarantees that this code is fit for any purpose. +// Visit http://OnJava8.com for more book information. + +class MyString { + private String s; + public MyString(String s) { + this.s = s; + } + public synchronized + void change(String s) { + this.s = s; + } + @Override public synchronized + String toString() { + return s; + } +} + +public class SingletonPattern3 { + public static void main(String[] args) { + Single x = + new Single<>(new MyString("Hello")); + System.out.println(x.get()); + x.get().change("World!"); + System.out.println(x.get()); + } +} +/* Output: +Hello +World! +*/ diff --git a/patterns/StateDemo.java b/patterns/StateDemo.java index 0a564bfa2..e96bac6ff 100644 --- a/patterns/StateDemo.java +++ b/patterns/StateDemo.java @@ -2,34 +2,24 @@ // (c)2021 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. -// Simple demonstration of the State pattern +// Basic demonstration of the State pattern. -interface StateBase { - void f(); - void g(); - void h(); - void changeImp(StateBase newImp); -} - -class State implements StateBase { - private StateBase implementation; - State(StateBase imp) { +class State { + private State implementation; + protected State() {} + public State(State imp) { implementation = imp; } - @Override - public void changeImp(StateBase newImp) { + public void change(State newImp) { implementation = newImp; } - // Pass method calls to the implementation: - @Override + // Forward method calls to the implementation: public void f() { implementation.f(); } - @Override public void g() { implementation.g(); } - @Override public void h() { implementation.h(); } } -class Implementation1 implements StateBase { +class Implementation1 extends State { @Override public void f() { System.out.println("Implementation1.f()"); } @@ -39,11 +29,9 @@ class Implementation1 implements StateBase { @Override public void h() { System.out.println("Implementation1.h()"); } - @Override - public void changeImp(StateBase newImp) {} } -class Implementation2 implements StateBase { +class Implementation2 extends State { @Override public void f() { System.out.println("Implementation2.f()"); } @@ -53,28 +41,27 @@ class Implementation2 implements StateBase { @Override public void h() { System.out.println("Implementation2.h()"); } - @Override - public void changeImp(StateBase newImp) {} } public class StateDemo { - static void test(StateBase b) { - b.f(); - b.g(); - b.h(); + static void test(State s) { + s.f(); + s.g(); + s.h(); } public static void main(String[] args) { - StateBase b = - new State(new Implementation1()); - test(b); - b.changeImp(new Implementation2()); - test(b); + State s = new State(new Implementation1()); + test(s); + System.out.println("Changing implementation"); + s.change(new Implementation2()); + test(s); } } /* Output: Implementation1.f() Implementation1.g() Implementation1.h() +Changing implementation Implementation2.f() Implementation2.g() Implementation2.h() diff --git a/patterns/TemplateMethod.java b/patterns/TemplateMethod.java index 2df6a3d4c..e9774e183 100644 --- a/patterns/TemplateMethod.java +++ b/patterns/TemplateMethod.java @@ -2,29 +2,29 @@ // (c)2021 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. -// Simple demonstration of Template Method +// Basic Template Method pattern. import java.util.stream.*; abstract class ApplicationFramework { ApplicationFramework() { templateMethod(); } - abstract void customize1(); - abstract void customize2(); + abstract void customize1(int n); + abstract void customize2(int n); // "private" means automatically "final": private void templateMethod() { IntStream.range(0, 5).forEach( - n -> { customize1(); customize2(); }); + n -> { customize1(n); customize2(n); }); } } -// Create a new "application": +// Create a new application: class MyApp extends ApplicationFramework { - @Override void customize1() { - System.out.print("Hello "); + @Override void customize1(int n) { + System.out.print("customize1 " + n); } - @Override void customize2() { - System.out.println("World!"); + @Override void customize2(int n) { + System.out.println(" customize2 " + n); } } @@ -34,9 +34,9 @@ public static void main(String[] args) { } } /* Output: -Hello World! -Hello World! -Hello World! -Hello World! -Hello World! +customize1 0 customize2 0 +customize1 1 customize2 1 +customize1 2 customize2 2 +customize1 3 customize2 3 +customize1 4 customize2 4 */ diff --git a/patterns/TestSingle.java b/patterns/TestSingle.java new file mode 100644 index 000000000..209f06477 --- /dev/null +++ b/patterns/TestSingle.java @@ -0,0 +1,20 @@ +// patterns/TestSingle.java +// (c)2021 MindView LLC: see Copyright.txt +// We make no guarantees that this code is fit for any purpose. +// Visit http://OnJava8.com for more book information. + +public class TestSingle { + public static void main(String[] args) { + Single ss = new Single<>("hello"); + System.out.println(ss.get()); + try { + Single ss2 = new Single<>("world"); + } catch(Exception e) { + System.out.println(e.getMessage()); + } + } +} +/* Output: +hello +Attempt to reassign Single +*/ diff --git a/patterns/TypeMap.java b/patterns/TypeMap.java new file mode 100644 index 000000000..db2f393a7 --- /dev/null +++ b/patterns/TypeMap.java @@ -0,0 +1,21 @@ +// patterns/TypeMap.java +// (c)2021 MindView LLC: see Copyright.txt +// We make no guarantees that this code is fit for any purpose. +// Visit http://OnJava8.com for more book information. +// Generic TypeMap works for any types. +package patterns; +import java.util.*; +import java.util.stream.*; + +public class TypeMap { + public final Map> map = + new HashMap<>(); + public void add(T o) { + Class type = o.getClass(); + map.computeIfAbsent(type, + k -> new ArrayList()).add(o); + } + public Stream> values() { + return map.values().stream(); + } +} diff --git a/patterns/abstractfactory/GameEnvironment.java b/patterns/abstractfactory/GameEnvironment.java index a990562da..51b42d553 100644 --- a/patterns/abstractfactory/GameEnvironment.java +++ b/patterns/abstractfactory/GameEnvironment.java @@ -2,7 +2,7 @@ // (c)2021 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. -// An example of the Abstract Factory pattern +// An example of the Abstract Factory pattern. // {java patterns.abstractfactory.GameEnvironment} package patterns.abstractfactory; import java.util.function.*; @@ -23,10 +23,10 @@ public void interactWith(Obstacle ob) { } } -class KungFuGuy implements Player { +class Fighter implements Player { @Override public void interactWith(Obstacle ob) { - System.out.print("KungFuGuy now battles a "); + System.out.print("Fighter now battles a "); ob.action(); } } @@ -37,9 +37,9 @@ class Puzzle implements Obstacle { } } -class NastyWeapon implements Obstacle { +class Weapon implements Obstacle { @Override public void action() { - System.out.println("NastyWeapon"); + System.out.println("Weapon"); } } @@ -58,11 +58,11 @@ class KittiesAndPuzzles } } -class KillAndDismember +class Melee extends GameElementFactory { - KillAndDismember() { - player = KungFuGuy::new; - obstacle = NastyWeapon::new; + Melee() { + player = Fighter::new; + obstacle = Weapon::new; } } @@ -80,15 +80,15 @@ public void play() { public static void main(String[] args) { GameElementFactory kp = new KittiesAndPuzzles(), - kd = new KillAndDismember(); + ml = new Melee(); GameEnvironment g1 = new GameEnvironment(kp), - g2 = new GameEnvironment(kd); + g2 = new GameEnvironment(ml); g1.play(); g2.play(); } } /* Output: Kitty has encountered a Puzzle -KungFuGuy now battles a NastyWeapon +Fighter now battles a Weapon */ diff --git a/patterns/adapt/Adapter.java b/patterns/adapt/Adapter.java index 0e847f365..0b3a0919f 100644 --- a/patterns/adapt/Adapter.java +++ b/patterns/adapt/Adapter.java @@ -2,7 +2,7 @@ // (c)2021 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. -// Variations on the Adapter pattern +// Variations on the Adapter pattern. // {java patterns.adapt.Adapter} package patterns.adapt; diff --git a/patterns/chain/ChainOfResponsibility.java b/patterns/chain/ChainOfResponsibility.java index 737c3c205..b291c3e00 100644 --- a/patterns/chain/ChainOfResponsibility.java +++ b/patterns/chain/ChainOfResponsibility.java @@ -2,55 +2,32 @@ // (c)2021 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. -// Using the Functional interface // {java patterns.chain.ChainOfResponsibility} package patterns.chain; import java.util.*; import java.util.function.*; -class Result { - boolean success; - List line; - Result(List data) { - success = true; - line = data; - } - Result() { - success = false; - line = Collections.emptyList(); - } -} - -class Fail extends Result {} - interface Algorithm { Result algorithm(List line); } class FindMinima { - public static Result leastSquares(List line) { - System.out.println("LeastSquares.algorithm"); - boolean weSucceed = false; - if(weSucceed) // Actual test/calculation here - return new Result(Arrays.asList(1.1, 2.2)); + public static Result test( + boolean success, String id, double d1, double d2) { + System.out.println(id); + if(success) // Actual test/calculation here + return new Result(Arrays.asList(d1, d2)); else // Try the next one in the chain: - return new Fail(); + return Result.fail; + } + public static Result leastSquares(List line) { + return test(false, "LeastSquares", 1.1, 2.2); } public static Result perturbation(List line) { - System.out.println("Perturbation.algorithm"); - boolean weSucceed = false; - if(weSucceed) // Actual test/calculation here - return new Result(Arrays.asList(3.3, 4.4)); - else - return new Fail(); + return test(false, "Perturbation", 3.3, 4.4); } public static Result bisection(List line) { - System.out.println("Bisection.algorithm"); - boolean weSucceed = true; - if(weSucceed) // Actual test/calculation here - return new Result(Arrays.asList(5.5, 6.6)); - else - return new Fail(); + return test(true, "Bisection", 5.5, 6.6); } static List, Result>> algorithms = Arrays.asList( @@ -65,7 +42,7 @@ public static Result minima(List line) { if(result.success) return result; } - return new Fail(); + return Result.fail; } } @@ -83,8 +60,8 @@ public static void main(String[] args) { } } /* Output: -LeastSquares.algorithm -Perturbation.algorithm -Bisection.algorithm +LeastSquares +Perturbation +Bisection [5.5, 6.6] */ diff --git a/patterns/chain/Result.java b/patterns/chain/Result.java new file mode 100644 index 000000000..dc459b399 --- /dev/null +++ b/patterns/chain/Result.java @@ -0,0 +1,21 @@ +// patterns/chain/Result.java +// (c)2021 MindView LLC: see Copyright.txt +// We make no guarantees that this code is fit for any purpose. +// Visit http://OnJava8.com for more book information. +// Carries the result or indicates failure. +package patterns.chain; +import java.util.*; + +public class Result { + public final boolean success; + public final List line; + public Result(List data) { + success = true; + line = data; + } + private Result() { + success = false; + line = Collections.emptyList(); + } + public static final Result fail = new Result(); +} diff --git a/patterns/doubledispatch/Aluminum.java b/patterns/doubledispatch/Aluminum.java index f48a2077c..9f5678b11 100644 --- a/patterns/doubledispatch/Aluminum.java +++ b/patterns/doubledispatch/Aluminum.java @@ -2,13 +2,13 @@ // (c)2021 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. -// Aluminum for double dispatching +// Aluminum with double dispatching. package patterns.doubledispatch; import patterns.trash.*; import java.util.*; public class Aluminum extends patterns.trash.Aluminum - implements TypedBinMember { +implements TypedBinMember { public Aluminum(double wt) { super(wt); } @Override public boolean addToBin(List tbins) { diff --git a/patterns/doubledispatch/Cardboard.java b/patterns/doubledispatch/Cardboard.java index 2150328f7..390292322 100644 --- a/patterns/doubledispatch/Cardboard.java +++ b/patterns/doubledispatch/Cardboard.java @@ -2,13 +2,13 @@ // (c)2021 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. -// Cardboard for double dispatching +// Cardboard with double dispatching. package patterns.doubledispatch; import patterns.trash.*; import java.util.*; public class Cardboard extends patterns.trash.Cardboard - implements TypedBinMember { +implements TypedBinMember { public Cardboard(double wt) { super(wt); } @Override public boolean addToBin(List tbins) { diff --git a/patterns/doubledispatch/DoubleDispatch.java b/patterns/doubledispatch/DoubleDispatch.java index f65d26805..d1ddfe253 100644 --- a/patterns/doubledispatch/DoubleDispatch.java +++ b/patterns/doubledispatch/DoubleDispatch.java @@ -3,90 +3,104 @@ // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Using multiple dispatching to handle more -// than one unknown type during a method call +// than one unknown type during a method call. // {java patterns.doubledispatch.DoubleDispatch} package patterns.doubledispatch; import patterns.trash.*; import java.util.*; class AluminumBin extends TypedBin { + public AluminumBin() { super("Aluminum"); } @Override public boolean add(Aluminum a) { return addIt(a); } } class PaperBin extends TypedBin { + public PaperBin() { super("Paper"); } @Override public boolean add(Paper a) { return addIt(a); } } class GlassBin extends TypedBin { + public GlassBin() { super("Glass"); } @Override public boolean add(Glass a) { return addIt(a); } } class CardboardBin extends TypedBin { + public CardboardBin() { super("Cardboard"); } @Override public boolean add(Cardboard a) { return addIt(a); } } class TrashBinSet { - private List binSet = Arrays.asList( - new AluminumBin(), - new PaperBin(), - new GlassBin(), - new CardboardBin() - ); + public final List binSet = + Arrays.asList( + new AluminumBin(), new PaperBin(), + new GlassBin(), new CardboardBin() + ); @SuppressWarnings("unchecked") public void sortIntoBins(List bin) { bin.forEach( aBin -> { TypedBinMember t = (TypedBinMember)aBin; if(!t.addToBin(binSet)) - System.err.println("Couldn't add " + t); + throw new RuntimeException( + "sortIntoBins() couldn't add " + t); }); } - public List binSet() { return binSet; } } public class DoubleDispatch { public static void main(String[] args) { List bin = new ArrayList<>(); - TrashBinSet bins = new TrashBinSet(); - // ParseTrash still works, without changes: ParseTrash.fillBin("doubledispatch", bin); + TrashBinSet bins = new TrashBinSet(); // Sort from the master bin into the // individually-typed bins: bins.sortIntoBins(bin); - // Perform sumValue for each bin... - bins.binSet() - .forEach(tb -> Trash.sumValue(tb.v)); - // ... and for the master bin - Trash.sumValue(bin); + // Sum value of each bin... + bins.binSet.forEach(tb -> + TrashValue.sum(tb.bin(), tb.type)); + // ... and for the master bin: + TrashValue.sum(bin, "Trash"); } } -/* Output: (First and Last 10 Lines) -Loading patterns.doubledispatch.Glass +/* Output: +Loading patterns.doubledispatch.Cardboard Loading patterns.doubledispatch.Paper Loading patterns.doubledispatch.Aluminum -Loading patterns.doubledispatch.Cardboard -weight of patterns.doubledispatch.Aluminum = 89.0 -weight of patterns.doubledispatch.Aluminum = 76.0 -weight of patterns.doubledispatch.Aluminum = 25.0 -weight of patterns.doubledispatch.Aluminum = 34.0 -weight of patterns.doubledispatch.Aluminum = 27.0 -weight of patterns.doubledispatch.Aluminum = 18.0 -...________...________...________...________... -weight of patterns.doubledispatch.Aluminum = 93.0 -weight of patterns.doubledispatch.Glass = 93.0 -weight of patterns.doubledispatch.Paper = 80.0 -weight of patterns.doubledispatch.Glass = 36.0 -weight of patterns.doubledispatch.Glass = 12.0 -weight of patterns.doubledispatch.Glass = 60.0 -weight of patterns.doubledispatch.Paper = 66.0 -weight of patterns.doubledispatch.Aluminum = 36.0 -weight of patterns.doubledispatch.Cardboard = 22.0 -Total value = 1086.0599818825722 +Loading patterns.doubledispatch.Glass +Aluminum weight: 1.80 * price: 1.67 = 3.01 +Aluminum weight: 3.40 * price: 1.67 = 5.68 +Aluminum weight: 2.70 * price: 1.67 = 4.51 +Total Aluminum value = 13.19 +Paper weight: 8.00 * price: 0.10 = 0.80 +Paper weight: 6.60 * price: 0.10 = 0.66 +Paper weight: 9.10 * price: 0.10 = 0.91 +Total Paper value = 2.37 +Glass weight: 5.40 * price: 0.23 = 1.24 +Glass weight: 4.30 * price: 0.23 = 0.99 +Glass weight: 3.60 * price: 0.23 = 0.83 +Total Glass value = 3.06 +Cardboard weight: 4.40 * price: 0.11 = 0.48 +Cardboard weight: 2.20 * price: 0.11 = 0.24 +Cardboard weight: 1.20 * price: 0.11 = 0.13 +Total Cardboard value = 0.86 +Cardboard weight: 4.40 * price: 0.11 = 0.48 +Paper weight: 8.00 * price: 0.10 = 0.80 +Aluminum weight: 1.80 * price: 1.67 = 3.01 +Glass weight: 5.40 * price: 0.23 = 1.24 +Aluminum weight: 3.40 * price: 1.67 = 5.68 +Cardboard weight: 2.20 * price: 0.11 = 0.24 +Glass weight: 4.30 * price: 0.23 = 0.99 +Cardboard weight: 1.20 * price: 0.11 = 0.13 +Paper weight: 6.60 * price: 0.10 = 0.66 +Aluminum weight: 2.70 * price: 1.67 = 4.51 +Paper weight: 9.10 * price: 0.10 = 0.91 +Glass weight: 3.60 * price: 0.23 = 0.83 +Total Trash value = 19.48 */ diff --git a/patterns/doubledispatch/Glass.java b/patterns/doubledispatch/Glass.java index 0092652f0..c0800cdf2 100644 --- a/patterns/doubledispatch/Glass.java +++ b/patterns/doubledispatch/Glass.java @@ -2,13 +2,13 @@ // (c)2021 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. -// Glass for double dispatching +// Glass with double dispatching. package patterns.doubledispatch; import patterns.trash.*; import java.util.*; public class Glass extends patterns.trash.Glass - implements TypedBinMember { +implements TypedBinMember { public Glass(double wt) { super(wt); } @Override public boolean addToBin(List tbins) { diff --git a/patterns/doubledispatch/Paper.java b/patterns/doubledispatch/Paper.java index 67bb0fe3d..de25cab37 100644 --- a/patterns/doubledispatch/Paper.java +++ b/patterns/doubledispatch/Paper.java @@ -2,13 +2,13 @@ // (c)2021 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. -// Paper for double dispatching +// Paper with double dispatching. package patterns.doubledispatch; import patterns.trash.*; import java.util.*; public class Paper extends patterns.trash.Paper - implements TypedBinMember { +implements TypedBinMember { public Paper(double wt) { super(wt); } @Override public boolean addToBin(List tbins) { diff --git a/patterns/doubledispatch/TypedBin.java b/patterns/doubledispatch/TypedBin.java index c730eda2d..8484552c4 100644 --- a/patterns/doubledispatch/TypedBin.java +++ b/patterns/doubledispatch/TypedBin.java @@ -2,15 +2,24 @@ // (c)2021 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. -// A List that can grab the right type +// A List that can grab the right type. package patterns.doubledispatch; import patterns.trash.*; import java.util.*; public class TypedBin { - List v = new ArrayList<>(); + private List typedBin = + new ArrayList<>(); + public final String type; + public TypedBin(String type) { + this.type = type; + } + public List bin() { + // Returns a copy of typedBin: + return new ArrayList(typedBin); + } protected boolean addIt(Trash t) { - v.add(t); + typedBin.add(t); return true; } public boolean add(Aluminum a) { diff --git a/patterns/doubledispatch/TypedBinMember.java b/patterns/doubledispatch/TypedBinMember.java index 17fe20641..109745b4f 100644 --- a/patterns/doubledispatch/TypedBinMember.java +++ b/patterns/doubledispatch/TypedBinMember.java @@ -2,13 +2,12 @@ // (c)2021 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. -// An interface for adding the double dispatching -// method to the trash hierarchy without -// modifying the original hierarchy +// Adapts the double-dispatching +// method into the trash hierarchy without +// modifying the original hierarchy. package patterns.doubledispatch; import java.util.*; public interface TypedBinMember { - // The new method: boolean addToBin(List bins); } diff --git a/patterns/dynatrash/DynaTrash.java b/patterns/dynatrash/DynaTrash.java deleted file mode 100644 index 8e8d6ac27..000000000 --- a/patterns/dynatrash/DynaTrash.java +++ /dev/null @@ -1,74 +0,0 @@ -// patterns/dynatrash/DynaTrash.java -// (c)2021 MindView LLC: see Copyright.txt -// We make no guarantees that this code is fit for any purpose. -// Visit http://OnJava8.com for more book information. -// Using a Map of Lists and RTTI to automatically -// sort trash into Lists. This solution, despite -// the use of RTTI, is extensible. -// {java patterns.dynatrash.DynaTrash} -package patterns.dynatrash; -import patterns.trash.*; -import java.util.*; -import java.util.stream.*; - -// Generic TypeMap works in any situation: -class TypeMap { - private Map> t = new HashMap<>(); - public void add(T o) { - Class type = o.getClass(); - if(t.containsKey(type)) - t.get(type).add(o); - else { - List v = new ArrayList<>(); - v.add(o); - t.put(type,v); - } - } - public Stream> values() { - return t.values().stream(); - } -} - -// Adapter class for callbacks -// from ParseTrash.fillBin(): -class TypeMapAdapter implements Fillable { - TypeMap map; - TypeMapAdapter(TypeMap tm) { - map = tm; - } - @Override - public void addTrash(Trash t) { map.add(t); } -} - -public class DynaTrash { - @SuppressWarnings("unchecked") - public static void main(String[] args) { - TypeMap bin = new TypeMap<>(); - ParseTrash.fillBin( - "trash", new TypeMapAdapter(bin)); - bin.values().forEach(Trash::sumValue); - } -} -/* Output: (First and Last 10 Lines) -Loading patterns.trash.Glass -Loading patterns.trash.Paper -Loading patterns.trash.Aluminum -Loading patterns.trash.Cardboard -weight of patterns.trash.Paper = 22.0 -weight of patterns.trash.Paper = 11.0 -weight of patterns.trash.Paper = 88.0 -weight of patterns.trash.Paper = 91.0 -weight of patterns.trash.Paper = 80.0 -weight of patterns.trash.Paper = 66.0 -...________...________...________...________... -weight of patterns.trash.Glass = 93.0 -weight of patterns.trash.Glass = 36.0 -weight of patterns.trash.Glass = 12.0 -weight of patterns.trash.Glass = 60.0 -Total value = 150.1900027245283 -weight of patterns.trash.Cardboard = 96.0 -weight of patterns.trash.Cardboard = 44.0 -weight of patterns.trash.Cardboard = 12.0 -weight of patterns.trash.Cardboard = 22.0 -Total value = 40.02000072598457 -*/ diff --git a/patterns/observer/ObservedFlower.java b/patterns/observer/ObservedFlower.java index a8c9bd006..acfb0f656 100644 --- a/patterns/observer/ObservedFlower.java +++ b/patterns/observer/ObservedFlower.java @@ -2,30 +2,18 @@ // (c)2021 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. -// Demonstration of "Observer" pattern +// Demonstration of the Observer pattern. // {java patterns.observer.ObservedFlower} package patterns.observer; import java.util.*; +import java.util.function.*; @SuppressWarnings("deprecation") class Flower { - private boolean isOpen; - private boolean alreadyOpen; - private boolean alreadyClosed; - Flower() { isOpen = false; } - OpenNotifier opening = new OpenNotifier(); - CloseNotifier closing = new CloseNotifier(); - public void open() { // Opens its petals - isOpen = true; - opening.notifyObservers(); - alreadyClosed = false; - } - public void close() { // Closes its petals - isOpen = false; - closing.notifyObservers(); - alreadyOpen = false; - } - class OpenNotifier extends Observable { + private boolean isOpen = false; + private boolean alreadyOpen = false; + private boolean alreadyClosed = false; + Observable opening = new Observable() { @Override public void notifyObservers() { if(isOpen && !alreadyOpen) { setChanged(); @@ -33,8 +21,8 @@ class OpenNotifier extends Observable { alreadyOpen = true; } } - } - class CloseNotifier extends Observable{ + }; + Observable closing = new Observable() { @Override public void notifyObservers() { if(!isOpen && !alreadyClosed) { setChanged(); @@ -42,38 +30,43 @@ class CloseNotifier extends Observable{ alreadyClosed = true; } } + }; + public void open() { // Opens its petals + isOpen = true; + opening.notifyObservers(); + alreadyClosed = false; + } + public void close() { // Closes its petals + isOpen = false; + closing.notifyObservers(); + alreadyOpen = false; } } @SuppressWarnings("deprecation") class Bee { - private String name; - Bee(String nm) { name = nm; } + private String id; + Bee(String name) { id = name; } // Observe openings: - public Observer openObserver() { - return (ob, a) -> System.out.println( - "Bee " + name + "'s breakfast time!"); - } + public final Observer whenOpened = (ob, a) -> + System.out.println( + "Bee " + id + "'s breakfast time!"); // Observe closings: - public Observer closeObserver() { - return (ob, a) -> System.out.println( - "Bee " + name + "'s bed time!"); - } + public final Observer whenClosed = (ob, a) -> + System.out.println( + "Bee " + id + "'s bed time!"); } @SuppressWarnings("deprecation") class Hummingbird { - private String name; - Hummingbird(String nm) { name = nm; } - public Observer openObserver() { - return (ob, a) -> System.out.println( - "Hummingbird " + name + - "'s breakfast time!"); - } - public Observer closeObserver() { - return (ob, a) -> System.out.println( - "Hummingbird " + name + "'s bed time!"); - } + private String id; + Hummingbird(String name) { id = name; } + public final Observer whenOpened = (ob, a) -> + System.out.println("Hummingbird " + + id + "'s breakfast time!"); + public final Observer whenClosed = (ob, a) -> + System.out.println("Hummingbird " + + id + "'s bed time!"); } public class ObservedFlower { @@ -85,39 +78,46 @@ public static void main(String[] args) { Hummingbird ha = new Hummingbird("A"), hb = new Hummingbird("B"); - f.opening.addObserver(ha.openObserver()); - f.opening.addObserver(hb.openObserver()); - f.opening.addObserver(ba.openObserver()); - f.opening.addObserver(bb.openObserver()); - f.closing.addObserver(ha.closeObserver()); - f.closing.addObserver(hb.closeObserver()); - f.closing.addObserver(ba.closeObserver()); - f.closing.addObserver(bb.closeObserver()); - // Hummingbird B decides to sleep in: - f.opening.deleteObserver(hb.openObserver()); + f.opening.addObserver(ha.whenOpened); + f.opening.addObserver(hb.whenOpened); + f.opening.addObserver(ba.whenOpened); + f.opening.addObserver(bb.whenOpened); + f.closing.addObserver(ha.whenClosed); + f.closing.addObserver(hb.whenClosed); + f.closing.addObserver(ba.whenClosed); + f.closing.addObserver(bb.whenClosed); + // Hummingbird B decides to sleep in. + // Removing whenOpened stops open updates. + f.opening.deleteObserver(hb.whenOpened); // A change that interests observers: f.open(); - f.open(); // It's already open, no change. - // Bee A doesn't want to go to bed: - f.closing.deleteObserver(ba.closeObserver()); + f.open(); // No effect: it's already open. + System.out.println("---------------"); + // Bee A doesn't want to go to bed. + // Removing whenClosed stops close updates. + f.closing.deleteObserver(ba.whenClosed); f.close(); - f.close(); // It's already closed; no change + System.out.println("+++++++++++++++"); + f.close(); // No effect: it's already closed. + System.out.println("==============="); f.opening.deleteObservers(); - f.open(); - f.close(); + f.open(); // No observers to update. + System.out.println("###############"); + f.close(); // Close observers are still there. } } /* Output: Bee B's breakfast time! Bee A's breakfast time! -Hummingbird B's breakfast time! Hummingbird A's breakfast time! +--------------- Bee B's bed time! -Bee A's bed time! Hummingbird B's bed time! Hummingbird A's bed time! ++++++++++++++++ +=============== +############### Bee B's bed time! -Bee A's bed time! Hummingbird B's bed time! Hummingbird A's bed time! */ diff --git a/patterns/recyclea/RecycleA.java b/patterns/recyclea/RecycleA.java index 184bc4b3a..483e700ed 100644 --- a/patterns/recyclea/RecycleA.java +++ b/patterns/recyclea/RecycleA.java @@ -2,72 +2,25 @@ // (c)2021 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. -// Recycling with RTTI +// Recycling with reflection. // {java patterns.recyclea.RecycleA} package patterns.recyclea; import java.util.*; import java.util.function.*; import java.util.stream.*; +import patterns.trash.*; -abstract class Trash { - double weight; - Trash(double wt) { weight = wt; } - abstract double value(); - // Sums the value of Trash in a bin: - private static double val; - static void sumValue(List bin) { - val = 0.0f; - bin.forEach( t -> { - // Polymorphism in action: - val += t.weight * t.value(); - System.out.println( - "weight of " + - // Using RTTI to get type - // information about the class: - t.getClass().getSimpleName() + - " = " + t.weight); - }); - System.out.println("Total value = " + val); - } -} - -class Aluminum extends Trash { - static double val = 1.67f; - Aluminum(double wt) { super(wt); } - @Override double value() { return val; } - static void value(double newval) { - val = newval; - } -} - -class Paper extends Trash { - static double val = 0.10f; - Paper(double wt) { super(wt); } - @Override double value() { return val; } - static void value(double newval) { - val = newval; - } -} - -class Glass extends Trash { - static double val = 0.23f; - Glass(double wt) { super(wt); } - @Override double value() { return val; } - static void value(double newval) { - val = newval; - } -} - -class TrashFactory { - static List> ttypes = +class SimpleFactory { + static final + List> constructors = Arrays.asList( Aluminum::new, Paper::new, Glass::new); - static final int SZ = ttypes.size(); + static final int SIZE = constructors.size(); private static SplittableRandom rand = - new SplittableRandom(47); - public static Trash newTrash() { - return ttypes - .get(rand.nextInt(SZ)) + new SplittableRandom(42); + public static Trash random() { + return constructors + .get(rand.nextInt(SIZE)) .apply(rand.nextDouble()); } } @@ -75,50 +28,37 @@ public static Trash newTrash() { public class RecycleA { public static void main(String[] args) { List bin = - Stream.generate(TrashFactory::newTrash) - .limit(25) + Stream.generate(SimpleFactory::random) + .limit(10) .collect(Collectors.toList()); - List glassBin = new ArrayList<>(); - List paperBin = new ArrayList<>(); - List alBin = new ArrayList<>(); - // Sort the Trash: - bin.forEach( t -> { - // RTTI to discover Trash type: - if(t instanceof Aluminum) - alBin.add((Aluminum)t); - if(t instanceof Paper) - paperBin.add((Paper)t); - if(t instanceof Glass) - glassBin.add((Glass)t); - }); - Trash.sumValue(alBin); - Trash.sumValue(paperBin); - Trash.sumValue(glassBin); - Trash.sumValue(bin); + Bins bins = new Bins(bin); + bins.show(); } } -/* Output: (First and Last 11 Lines) -weight of Aluminum = 0.2893030122276371 -weight of Aluminum = 0.1970234961398979 -weight of Aluminum = 0.36295525806274787 -weight of Aluminum = 0.4825532324565849 -weight of Aluminum = 0.8036398273294586 -weight of Aluminum = 0.510430896154935 -weight of Aluminum = 0.6703377164093444 -weight of Aluminum = 0.41477933066243455 -weight of Aluminum = 0.3603022312124007 -weight of Aluminum = 0.43690089841661006 -weight of Aluminum = 0.6708820087907101 -...________...________...________...________... -weight of Aluminum = 0.41477933066243455 -weight of Aluminum = 0.3603022312124007 -weight of Aluminum = 0.43690089841661006 -weight of Glass = 0.5999637765664924 -weight of Glass = 0.7748836191212746 -weight of Paper = 0.5735994548427199 -weight of Glass = 0.5362827750851034 -weight of Aluminum = 0.6708820087907101 -weight of Paper = 0.8370669795210507 -weight of Glass = 0.3397919679731668 -Total value = 9.90671597531968 +/* Output: +Aluminum weight: 0.34 * price: 1.67 = 0.57 +Aluminum weight: 0.62 * price: 1.67 = 1.03 +Aluminum weight: 0.49 * price: 1.67 = 0.82 +Aluminum weight: 0.50 * price: 1.67 = 0.83 +Total Aluminum value = 3.26 +Paper weight: 0.69 * price: 0.10 = 0.07 +Total Paper value = 0.07 +Glass weight: 0.16 * price: 0.23 = 0.04 +Glass weight: 0.87 * price: 0.23 = 0.20 +Glass weight: 0.80 * price: 0.23 = 0.18 +Glass weight: 0.52 * price: 0.23 = 0.12 +Glass weight: 0.20 * price: 0.23 = 0.05 +Total Glass value = 0.59 +Total Cardboard value = 0.00 +Glass weight: 0.16 * price: 0.23 = 0.04 +Aluminum weight: 0.34 * price: 1.67 = 0.57 +Glass weight: 0.87 * price: 0.23 = 0.20 +Glass weight: 0.80 * price: 0.23 = 0.18 +Aluminum weight: 0.62 * price: 1.67 = 1.03 +Aluminum weight: 0.49 * price: 1.67 = 0.82 +Glass weight: 0.52 * price: 0.23 = 0.12 +Glass weight: 0.20 * price: 0.23 = 0.05 +Aluminum weight: 0.50 * price: 1.67 = 0.83 +Paper weight: 0.69 * price: 0.10 = 0.07 +Total Trash value = 3.91 */ diff --git a/patterns/recycleb/RecycleB.java b/patterns/recycleb/RecycleB.java index 25cb6d90e..b65f1db3d 100644 --- a/patterns/recycleb/RecycleB.java +++ b/patterns/recycleb/RecycleB.java @@ -10,47 +10,43 @@ public class RecycleB { public static void main(String[] args) { List bin = new ArrayList<>(); - // Fill up the Trash bin: ParseTrash.fillBin("trash", bin); - List glassBin = new ArrayList<>(); - List paperBin = new ArrayList<>(); - List alBin = new ArrayList<>(); - // Sort the Trash: - bin.forEach( t -> { - // RTTI to discover Trash type: - if(t instanceof Aluminum) - alBin.add((Aluminum)t); - if(t instanceof Paper) - paperBin.add((Paper)t); - if(t instanceof Glass) - glassBin.add((Glass)t); - }); - Trash.sumValue(alBin); - Trash.sumValue(paperBin); - Trash.sumValue(glassBin); - Trash.sumValue(bin); + Bins bins = new Bins(bin); + bins.show(); } } -/* Output: (First and Last 10 Lines) -Loading patterns.trash.Glass +/* Output: +Loading patterns.trash.Cardboard Loading patterns.trash.Paper Loading patterns.trash.Aluminum -Loading patterns.trash.Cardboard -weight of patterns.trash.Aluminum = 89.0 -weight of patterns.trash.Aluminum = 76.0 -weight of patterns.trash.Aluminum = 25.0 -weight of patterns.trash.Aluminum = 34.0 -weight of patterns.trash.Aluminum = 27.0 -weight of patterns.trash.Aluminum = 18.0 -...________...________...________...________... -weight of patterns.trash.Aluminum = 93.0 -weight of patterns.trash.Glass = 93.0 -weight of patterns.trash.Paper = 80.0 -weight of patterns.trash.Glass = 36.0 -weight of patterns.trash.Glass = 12.0 -weight of patterns.trash.Glass = 60.0 -weight of patterns.trash.Paper = 66.0 -weight of patterns.trash.Aluminum = 36.0 -weight of patterns.trash.Cardboard = 22.0 -Total value = 1086.0599818825722 +Loading patterns.trash.Glass +Aluminum weight: 1.80 * price: 1.67 = 3.01 +Aluminum weight: 3.40 * price: 1.67 = 5.68 +Aluminum weight: 2.70 * price: 1.67 = 4.51 +Total Aluminum value = 13.19 +Paper weight: 8.00 * price: 0.10 = 0.80 +Paper weight: 6.60 * price: 0.10 = 0.66 +Paper weight: 9.10 * price: 0.10 = 0.91 +Total Paper value = 2.37 +Glass weight: 5.40 * price: 0.23 = 1.24 +Glass weight: 4.30 * price: 0.23 = 0.99 +Glass weight: 3.60 * price: 0.23 = 0.83 +Total Glass value = 3.06 +Cardboard weight: 4.40 * price: 0.11 = 0.48 +Cardboard weight: 2.20 * price: 0.11 = 0.24 +Cardboard weight: 1.20 * price: 0.11 = 0.13 +Total Cardboard value = 0.86 +Cardboard weight: 4.40 * price: 0.11 = 0.48 +Paper weight: 8.00 * price: 0.10 = 0.80 +Aluminum weight: 1.80 * price: 1.67 = 3.01 +Glass weight: 5.40 * price: 0.23 = 1.24 +Aluminum weight: 3.40 * price: 1.67 = 5.68 +Cardboard weight: 2.20 * price: 0.11 = 0.24 +Glass weight: 4.30 * price: 0.23 = 0.99 +Cardboard weight: 1.20 * price: 0.11 = 0.13 +Paper weight: 6.60 * price: 0.10 = 0.66 +Aluminum weight: 2.70 * price: 1.67 = 4.51 +Paper weight: 9.10 * price: 0.10 = 0.91 +Glass weight: 3.60 * price: 0.23 = 0.83 +Total Trash value = 19.48 */ diff --git a/patterns/recyclec/RecycleC.java b/patterns/recyclec/RecycleC.java index 75dd4e5e2..611c30907 100644 --- a/patterns/recyclec/RecycleC.java +++ b/patterns/recyclec/RecycleC.java @@ -2,83 +2,105 @@ // (c)2021 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. -// Adding more objects to the recycling problem // {java patterns.recyclec.RecycleC} package patterns.recyclec; import patterns.trash.*; import java.util.*; -// A List that admits only the right type: -class Tbin extends ArrayList { - Class binType; - Tbin(Class type) { - binType = type; +// A List that only admits the right type: +class +TrashBin extends ArrayList { + final Class binType; + TrashBin(Class binType) { + this.binType = binType; } @SuppressWarnings("unchecked") boolean grab(Trash t) { - // Comparing class types: + // Compare class types: if(t.getClass().equals(binType)) { - add((T)t); // Downcast to this TBin's type - return true; // Object grabbed + add((T)t); // Downcast to this TrashBin type + return true; // Trash grabbed } - return false; // Object not grabbed + return false; // Trash not grabbed } } -class TbinList -extends ArrayList> { // [1] - boolean sort(T t) { - for(Tbin ts : this) +class TrashBinList +extends ArrayList> { // [1] + @SuppressWarnings("unchecked") + public TrashBinList(Class... types) { + for(Class type : types) + add(new TrashBin<>(type)); + } + public boolean sort(T t) { + for(TrashBin ts : this) if(ts.grab(t)) return true; - return false; // bin not found for t + return false; // TrashBin not found for t + } + public void sortBin(TrashBin bin) { // [2] + for(T trash : bin) + if(!sort(trash)) + throw new RuntimeException( + "Bin not found for " + trash); } - void sortBin(Tbin bin) { // [2] - for(T aBin : bin) - if(!sort(aBin)) - System.err.println("Bin not found"); + public void show() { + for(TrashBin tbin : this) { + String typeName = tbin.binType.getSimpleName(); + TrashValue.sum(tbin, typeName); + } } } public class RecycleC { - static Tbin bin = new Tbin<>(Trash.class); public static void main(String[] args) { - // Fill up the Trash bin: + TrashBin bin = + new TrashBin<>(Trash.class); ParseTrash.fillBin("trash", bin); - - TbinList trashBins = new TbinList<>(); - trashBins.add(new Tbin<>(Aluminum.class)); - trashBins.add(new Tbin<>(Paper.class)); - trashBins.add(new Tbin<>(Glass.class)); - // add one line here: // [3] - trashBins.add(new Tbin<>(Cardboard.class)); - + @SuppressWarnings("unchecked") + TrashBinList trashBins = + new TrashBinList<>( + Aluminum.class, Paper.class, Glass.class, + // Add one item: + Cardboard.class // [3] + ); trashBins.sortBin(bin); // [4] - - trashBins.forEach(Trash::sumValue); - Trash.sumValue(bin); + trashBins.show(); + TrashValue.sum(bin, "Trash"); } } -/* Output: (First and Last 10 Lines) -Loading patterns.trash.Glass +/* Output: +Loading patterns.trash.Cardboard Loading patterns.trash.Paper Loading patterns.trash.Aluminum -Loading patterns.trash.Cardboard -weight of patterns.trash.Aluminum = 89.0 -weight of patterns.trash.Aluminum = 76.0 -weight of patterns.trash.Aluminum = 25.0 -weight of patterns.trash.Aluminum = 34.0 -weight of patterns.trash.Aluminum = 27.0 -weight of patterns.trash.Aluminum = 18.0 -...________...________...________...________... -weight of patterns.trash.Aluminum = 93.0 -weight of patterns.trash.Glass = 93.0 -weight of patterns.trash.Paper = 80.0 -weight of patterns.trash.Glass = 36.0 -weight of patterns.trash.Glass = 12.0 -weight of patterns.trash.Glass = 60.0 -weight of patterns.trash.Paper = 66.0 -weight of patterns.trash.Aluminum = 36.0 -weight of patterns.trash.Cardboard = 22.0 -Total value = 1086.0599818825722 +Loading patterns.trash.Glass +Aluminum weight: 1.80 * price: 1.67 = 3.01 +Aluminum weight: 3.40 * price: 1.67 = 5.68 +Aluminum weight: 2.70 * price: 1.67 = 4.51 +Total Aluminum value = 13.19 +Paper weight: 8.00 * price: 0.10 = 0.80 +Paper weight: 6.60 * price: 0.10 = 0.66 +Paper weight: 9.10 * price: 0.10 = 0.91 +Total Paper value = 2.37 +Glass weight: 5.40 * price: 0.23 = 1.24 +Glass weight: 4.30 * price: 0.23 = 0.99 +Glass weight: 3.60 * price: 0.23 = 0.83 +Total Glass value = 3.06 +Cardboard weight: 4.40 * price: 0.11 = 0.48 +Cardboard weight: 2.20 * price: 0.11 = 0.24 +Cardboard weight: 1.20 * price: 0.11 = 0.13 +Total Cardboard value = 0.86 +Cardboard weight: 4.40 * price: 0.11 = 0.48 +Paper weight: 8.00 * price: 0.10 = 0.80 +Aluminum weight: 1.80 * price: 1.67 = 3.01 +Glass weight: 5.40 * price: 0.23 = 1.24 +Aluminum weight: 3.40 * price: 1.67 = 5.68 +Cardboard weight: 2.20 * price: 0.11 = 0.24 +Glass weight: 4.30 * price: 0.23 = 0.99 +Cardboard weight: 1.20 * price: 0.11 = 0.13 +Paper weight: 6.60 * price: 0.10 = 0.66 +Aluminum weight: 2.70 * price: 1.67 = 4.51 +Paper weight: 9.10 * price: 0.10 = 0.91 +Glass weight: 3.60 * price: 0.23 = 0.83 +Total Trash value = 19.48 */ diff --git a/patterns/state/StateMachineDemo.java b/patterns/state/StateMachineDemo.java index 0046a684b..1b9630a9c 100644 --- a/patterns/state/StateMachineDemo.java +++ b/patterns/state/StateMachineDemo.java @@ -2,9 +2,10 @@ // (c)2021 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. -// The StateMachine pattern and Template method +// The State Machine pattern. // {java patterns.state.StateMachineDemo} package patterns.state; +import java.util.*; import onjava.Nap; interface State { @@ -16,7 +17,7 @@ abstract class StateMachine { protected abstract boolean changeState(); // Template method: protected final void runAll() { - while(changeState()) // Customizable + while(changeState()) currentState.run(); } } @@ -46,20 +47,19 @@ class Rinse implements State { class Washer extends StateMachine { private int i = 0; - // The state table: - private State[] states = { - new Wash(), new Spin(), - new Rinse(), new Spin(), - }; + private Iterator states = + Arrays.asList( + new Wash(), new Spin(), + new Rinse(), new Spin() + ).iterator(); Washer() { runAll(); } @Override public boolean changeState() { - if(i < states.length) { - // Change the state by setting the - // surrogate reference to a new object: - currentState = states[i++]; - return true; - } else + if(!states.hasNext()) return false; + // Set the surrogate reference + // to a new State object: + currentState = states.next(); + return true; } } diff --git a/patterns/strategy/StrategyPattern.java b/patterns/strategy/StrategyPattern.java index 32f989629..7e06bc1e6 100644 --- a/patterns/strategy/StrategyPattern.java +++ b/patterns/strategy/StrategyPattern.java @@ -9,13 +9,14 @@ // The common strategy base type: class FindMinima { + protected Function, List> algorithm; } -// The various strategies: +// The various strategies, each producing dummy data: class LeastSquares extends FindMinima { LeastSquares() { - // Line is a sequence of points (Dummy data): + // Line is a sequence of points: algorithm = (line) -> Arrays.asList(1.1, 2.2); } } @@ -35,8 +36,8 @@ class Bisection extends FindMinima { // The "Context" controls the strategy: class MinimaSolver { private FindMinima strategy; - MinimaSolver(FindMinima strat) { - strategy = strat; + MinimaSolver(FindMinima strategy) { + this.strategy = strategy; } List minima(List line) { return strategy.algorithm.apply(line); @@ -54,11 +55,14 @@ public static void main(String[] args) { 1.0, 2.0, 1.0, 2.0, -1.0, 3.0, 4.0, 5.0, 4.0 ); System.out.println(solver.minima(line)); + solver.changeAlgorithm(new Perturbation()); + System.out.println(solver.minima(line)); solver.changeAlgorithm(new Bisection()); System.out.println(solver.minima(line)); } } /* Output: [1.1, 2.2] +[3.3, 4.4] [5.5, 6.6] */ diff --git a/patterns/strategy/StrategyPattern2.java b/patterns/strategy/StrategyPattern2.java index d63c6e710..640b1c05d 100644 --- a/patterns/strategy/StrategyPattern2.java +++ b/patterns/strategy/StrategyPattern2.java @@ -9,6 +9,7 @@ // "Context" is now incorporated: class FindMinima2 { + private Function, List> algorithm; FindMinima2() { leastSquares(); } // default // The various strategies: @@ -33,11 +34,14 @@ public static void main(String[] args) { 1.0, 2.0, 1.0, 2.0, -1.0, 3.0, 4.0, 5.0, 4.0 ); System.out.println(solver.minima(line)); + solver.perturbation(); + System.out.println(solver.minima(line)); solver.bisection(); System.out.println(solver.minima(line)); } } /* Output: [1.1, 2.2] +[3.3, 4.4] [5.5, 6.6] */ diff --git a/patterns/trash/Aluminum.java b/patterns/trash/Aluminum.java index 085d7047f..620cd5e62 100644 --- a/patterns/trash/Aluminum.java +++ b/patterns/trash/Aluminum.java @@ -5,10 +5,12 @@ package patterns.trash; public class Aluminum extends Trash { - private static double val = 1.67f; public Aluminum(double wt) { super(wt); } - @Override public double value() { return val; } - public static void value(double newVal) { - val = newVal; + @Override public double price() { + return Price.ALUMINUM; + } + // Ignore for now; to be used later: + @Override public void accept(Visitor v) { + v.visit(this); } } diff --git a/patterns/trash/Bins.java b/patterns/trash/Bins.java new file mode 100644 index 000000000..304708b39 --- /dev/null +++ b/patterns/trash/Bins.java @@ -0,0 +1,35 @@ +// patterns/trash/Bins.java +// (c)2021 MindView LLC: see Copyright.txt +// We make no guarantees that this code is fit for any purpose. +// Visit http://OnJava8.com for more book information. +package patterns.trash; +import java.util.*; + +public class Bins { + final List bin; + final List aluminum = new ArrayList<>(); + final List paper = new ArrayList<>(); + final List glass = new ArrayList<>(); + final List cardboard = new ArrayList<>(); + public Bins(List source) { + bin = new ArrayList<>(source); // Copy + bin.forEach( t -> { + // Use reflection to discover Trash type: + if(t instanceof Aluminum) + aluminum.add((Aluminum)t); + if(t instanceof Paper) + paper.add((Paper)t); + if(t instanceof Glass) + glass.add((Glass)t); + if(t instanceof Cardboard) + cardboard.add((Cardboard)t); + }); + } + public void show() { + TrashValue.sum(aluminum, "Aluminum"); + TrashValue.sum(paper, "Paper"); + TrashValue.sum(glass, "Glass"); + TrashValue.sum(cardboard, "Cardboard"); + TrashValue.sum(bin, "Trash"); + } +} diff --git a/patterns/trash/Cardboard.java b/patterns/trash/Cardboard.java index f1998630a..923f6647e 100644 --- a/patterns/trash/Cardboard.java +++ b/patterns/trash/Cardboard.java @@ -5,10 +5,12 @@ package patterns.trash; public class Cardboard extends Trash { - private static double val = 0.23f; public Cardboard(double wt) { super(wt); } - @Override public double value() { return val; } - public static void value(double newVal) { - val = newVal; + @Override public double price() { + return Price.CARDBOARD; + } + // Ignore for now; to be used later: + @Override public void accept(Visitor v) { + v.visit(this); } } diff --git a/patterns/trash/ClassToListOfTrashMap.java b/patterns/trash/ClassToListOfTrashMap.java new file mode 100644 index 000000000..2095cdd41 --- /dev/null +++ b/patterns/trash/ClassToListOfTrashMap.java @@ -0,0 +1,20 @@ +// patterns/trash/ClassToListOfTrashMap.java +// (c)2021 MindView LLC: see Copyright.txt +// We make no guarantees that this code is fit for any purpose. +// Visit http://OnJava8.com for more book information. +// Display a Map>. +package patterns.trash; +import java.util.*; + +public class ClassToListOfTrashMap { + public static void + show(Map> map) { + map.values().forEach( bin -> { + String typeName = "Trash"; + if(!bin.isEmpty()) + typeName = + bin.get(0).getClass().getSimpleName(); + TrashValue.sum(bin, typeName); + }); + } +} diff --git a/patterns/trash/DynaFactory.java b/patterns/trash/DynaFactory.java new file mode 100644 index 000000000..1331e9ba2 --- /dev/null +++ b/patterns/trash/DynaFactory.java @@ -0,0 +1,44 @@ +// patterns/trash/DynaFactory.java +// (c)2021 MindView LLC: see Copyright.txt +// We make no guarantees that this code is fit for any purpose. +// Visit http://OnJava8.com for more book information. +// Dynamic discovery of Trash types. +package patterns.trash; +import java.util.*; +import java.util.function.*; +import java.lang.reflect.*; + +public class DynaFactory { + private Map constructors = + new HashMap<>(); + private String packageName; + public DynaFactory(String packageName) { + this.packageName = packageName; + } + @SuppressWarnings("unchecked") + public + T create(TrashInfo info) { + try { + String typename = + "patterns." + packageName + "." + info.type; + return (T)constructors.computeIfAbsent( + typename, this::findConstructor + ).newInstance(info.data); + } catch(Exception e) { + throw new RuntimeException( + "Cannot create() Trash: " + info, e); + } + } + private + Constructor findConstructor(String typename) { + try { + System.out.println("Loading " + typename); + return Class.forName(typename) + .getConstructor(double.class); + } catch(Exception e) { + throw new RuntimeException( + "Trash(double) Constructor Not Found: " + + typename, e); + } + } +} diff --git a/patterns/trash/Fillable.java b/patterns/trash/Fillable.java index 6c00f6ea9..329c92bdb 100644 --- a/patterns/trash/Fillable.java +++ b/patterns/trash/Fillable.java @@ -2,7 +2,7 @@ // (c)2021 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. -// Any object that can be filled with Trash +// Any object that can be filled with Trash. package patterns.trash; public interface Fillable { diff --git a/patterns/trash/FillableList.java b/patterns/trash/FillableList.java index 05d83ff66..8a0bfa745 100644 --- a/patterns/trash/FillableList.java +++ b/patterns/trash/FillableList.java @@ -2,15 +2,17 @@ // (c)2021 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. -// Adapter that makes a List Fillable +// Adapter that makes a List Fillable. package patterns.trash; import java.util.*; public class FillableList implements Fillable { - private List v; - public FillableList(List vv) { - v = vv; + private List list; + public FillableList(List list) { + this.list = list; + } + @Override public void addTrash(T t) { + list.add(t); } - @Override public void addTrash(T t) { v.add(t); } } diff --git a/patterns/trash/Glass.java b/patterns/trash/Glass.java index faf73762b..df08c9963 100644 --- a/patterns/trash/Glass.java +++ b/patterns/trash/Glass.java @@ -5,10 +5,12 @@ package patterns.trash; public class Glass extends Trash { - private static double val = 0.23f; public Glass(double wt) { super(wt); } - @Override public double value() { return val; } - public static void value(double newVal) { - val = newVal; + @Override public double price() { + return Price.GLASS; + } + // Ignore for now; to be used later: + @Override public void accept(Visitor v) { + v.visit(this); } } diff --git a/patterns/trash/GroupingBy.java b/patterns/trash/GroupingBy.java new file mode 100644 index 000000000..6c8f8bc67 --- /dev/null +++ b/patterns/trash/GroupingBy.java @@ -0,0 +1,41 @@ +// patterns/trash/GroupingBy.java +// (c)2021 MindView LLC: see Copyright.txt +// We make no guarantees that this code is fit for any purpose. +// Visit http://OnJava8.com for more book information. +// {java patterns.trash.GroupingBy} +package patterns.trash; +import java.util.*; +import java.util.stream.*; + +public class GroupingBy { + public static void main(String[] args) { + List bin = new ArrayList<>(); + ParseTrash.fillBin("trash", bin); + Map> m = + bin.stream().collect( + Collectors.groupingBy(Object::getClass)); + ClassToListOfTrashMap.show(m); + } +} +/* Output: +Loading patterns.trash.Cardboard +Loading patterns.trash.Paper +Loading patterns.trash.Aluminum +Loading patterns.trash.Glass +Glass weight: 5.40 * price: 0.23 = 1.24 +Glass weight: 4.30 * price: 0.23 = 0.99 +Glass weight: 3.60 * price: 0.23 = 0.83 +Total Glass value = 3.06 +Paper weight: 8.00 * price: 0.10 = 0.80 +Paper weight: 6.60 * price: 0.10 = 0.66 +Paper weight: 9.10 * price: 0.10 = 0.91 +Total Paper value = 2.37 +Cardboard weight: 4.40 * price: 0.11 = 0.48 +Cardboard weight: 2.20 * price: 0.11 = 0.24 +Cardboard weight: 1.20 * price: 0.11 = 0.13 +Total Cardboard value = 0.86 +Aluminum weight: 1.80 * price: 1.67 = 3.01 +Aluminum weight: 3.40 * price: 1.67 = 5.68 +Aluminum weight: 2.70 * price: 1.67 = 4.51 +Total Aluminum value = 13.19 +*/ diff --git a/patterns/trash/Paper.java b/patterns/trash/Paper.java index dd79e8eae..5a47cea18 100644 --- a/patterns/trash/Paper.java +++ b/patterns/trash/Paper.java @@ -5,10 +5,12 @@ package patterns.trash; public class Paper extends Trash { - private static double val = 0.10f; public Paper(double wt) { super(wt); } - @Override public double value() { return val; } - public static void value(double newVal) { - val = newVal; + @Override public double price() { + return Price.PAPER; + } + // Ignore for now; to be used later: + @Override public void accept(Visitor v) { + v.visit(this); } } diff --git a/patterns/trash/ParseTrash.java b/patterns/trash/ParseTrash.java index 7e69fea36..0ea5df241 100644 --- a/patterns/trash/ParseTrash.java +++ b/patterns/trash/ParseTrash.java @@ -2,8 +2,8 @@ // (c)2021 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. -// Open a file and parse its contents into -// Trash objects, placing each into a List +// Opens a file and parses its contents into +// Trash objects, placing each into a Fillable. // {java patterns.trash.ParseTrash} package patterns.trash; import java.util.*; @@ -13,79 +13,56 @@ import java.nio.file.Files; public class ParseTrash { + public static String source = "Trash.dat"; public static void - fillBin(String pckg, Fillable bin) { + fillBin(String packageName, Fillable bin) { + DynaFactory factory = + new DynaFactory(packageName); try { - Files.lines(Paths.get("trash", "Trash.dat")) - // Remove empty lines and comment lines: + Files.lines(Paths.get("trash", source)) + // Remove comments and empty lines: .filter(line -> line.trim().length() != 0) .filter(line -> !line.startsWith("//")) - .forEach( line -> { - String type = "patterns." + pckg + "." + - line.substring( + .forEach(line -> { + String type = line.substring( 0, line.indexOf(':')).trim(); double weight = Double.valueOf( line.substring(line.indexOf(':') + 1) .trim()); - bin.addTrash(Trash.factory( - new Trash.Info(type, weight))); + bin.addTrash(factory.create( + new TrashInfo(type, weight))); }); - } catch(IOException | - NumberFormatException | - Trash.TrashClassNotFoundException | - Trash.CannotCreateTrashException e) { + } catch(IOException | NumberFormatException e) { throw new RuntimeException(e); } } - // Special case to handle List: + // Special case to handle a List: public static void - fillBin(String pckg, List bin) { - fillBin(pckg, new FillableList<>(bin)); + fillBin(String packageName, List bin) { + fillBin(packageName, new FillableList<>(bin)); } // Basic test: public static void main(String[] args) { - List t = new ArrayList<>(); - fillBin("trash", t); - t.forEach(System.out::println); + List bin = new ArrayList<>(); + fillBin("trash", bin); + bin.forEach(System.out::println); } } /* Output: -Loading patterns.trash.Glass +Loading patterns.trash.Cardboard Loading patterns.trash.Paper Loading patterns.trash.Aluminum -Loading patterns.trash.Cardboard -patterns.trash.Glass w:54.0 v:0.23 -patterns.trash.Paper w:22.0 v:0.10 -patterns.trash.Paper w:11.0 v:0.10 -patterns.trash.Glass w:17.0 v:0.23 -patterns.trash.Aluminum w:89.0 v:1.67 -patterns.trash.Paper w:88.0 v:0.10 -patterns.trash.Aluminum w:76.0 v:1.67 -patterns.trash.Cardboard w:96.0 v:0.23 -patterns.trash.Aluminum w:25.0 v:1.67 -patterns.trash.Aluminum w:34.0 v:1.67 -patterns.trash.Glass w:11.0 v:0.23 -patterns.trash.Glass w:68.0 v:0.23 -patterns.trash.Glass w:43.0 v:0.23 -patterns.trash.Aluminum w:27.0 v:1.67 -patterns.trash.Cardboard w:44.0 v:0.23 -patterns.trash.Aluminum w:18.0 v:1.67 -patterns.trash.Paper w:91.0 v:0.10 -patterns.trash.Glass w:63.0 v:0.23 -patterns.trash.Glass w:50.0 v:0.23 -patterns.trash.Glass w:80.0 v:0.23 -patterns.trash.Aluminum w:81.0 v:1.67 -patterns.trash.Cardboard w:12.0 v:0.23 -patterns.trash.Glass w:12.0 v:0.23 -patterns.trash.Glass w:54.0 v:0.23 -patterns.trash.Aluminum w:36.0 v:1.67 -patterns.trash.Aluminum w:93.0 v:1.67 -patterns.trash.Glass w:93.0 v:0.23 -patterns.trash.Paper w:80.0 v:0.10 -patterns.trash.Glass w:36.0 v:0.23 -patterns.trash.Glass w:12.0 v:0.23 -patterns.trash.Glass w:60.0 v:0.23 -patterns.trash.Paper w:66.0 v:0.10 -patterns.trash.Aluminum w:36.0 v:1.67 -patterns.trash.Cardboard w:22.0 v:0.23 +Loading patterns.trash.Glass +Cardboard weight: 4.40 * price: 0.11 = 0.48 +Paper weight: 8.00 * price: 0.10 = 0.80 +Aluminum weight: 1.80 * price: 1.67 = 3.01 +Glass weight: 5.40 * price: 0.23 = 1.24 +Aluminum weight: 3.40 * price: 1.67 = 5.68 +Cardboard weight: 2.20 * price: 0.11 = 0.24 +Glass weight: 4.30 * price: 0.23 = 0.99 +Cardboard weight: 1.20 * price: 0.11 = 0.13 +Paper weight: 6.60 * price: 0.10 = 0.66 +Aluminum weight: 2.70 * price: 1.67 = 4.51 +Paper weight: 9.10 * price: 0.10 = 0.91 +Glass weight: 3.60 * price: 0.23 = 0.83 */ diff --git a/patterns/trash/Price.java b/patterns/trash/Price.java new file mode 100644 index 000000000..9aa071816 --- /dev/null +++ b/patterns/trash/Price.java @@ -0,0 +1,13 @@ +// patterns/trash/Price.java +// (c)2021 MindView LLC: see Copyright.txt +// We make no guarantees that this code is fit for any purpose. +// Visit http://OnJava8.com for more book information. +package patterns.trash; + +public interface Price { + double + ALUMINUM = 1.67, + PAPER = 0.10, + GLASS = 0.23, + CARDBOARD = 0.11; +} diff --git a/patterns/trash/Trash.dat b/patterns/trash/Trash.dat index 436a7a719..13bd6187a 100644 --- a/patterns/trash/Trash.dat +++ b/patterns/trash/Trash.dat @@ -1,35 +1,13 @@ // patterns/trash/Trash.dat -Glass:54 -Paper:22 -Paper:11 -Glass:17 -Aluminum:89 -Paper:88 -Aluminum:76 -Cardboard:96 -Aluminum:25 -Aluminum:34 -Glass:11 -Glass:68 -Glass:43 -Aluminum:27 -Cardboard:44 -Aluminum:18 -Paper:91 -Glass:63 -Glass:50 -Glass:80 -Aluminum:81 -Cardboard:12 -Glass:12 -Glass:54 -Aluminum:36 -Aluminum:93 -Glass:93 -Paper:80 -Glass:36 -Glass:12 -Glass:60 -Paper:66 -Aluminum:36 -Cardboard:22 +Cardboard:4.4 +Paper:8.0 +Aluminum:1.8 +Glass:5.4 +Aluminum:3.4 +Cardboard:2.2 +Glass:4.3 +Cardboard:1.2 +Paper:6.6 +Aluminum:2.7 +Paper:9.1 +Glass:3.6 diff --git a/patterns/trash/Trash.java b/patterns/trash/Trash.java index 4920e0ba4..9f9feca89 100644 --- a/patterns/trash/Trash.java +++ b/patterns/trash/Trash.java @@ -2,90 +2,21 @@ // (c)2021 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. -// Base class for Trash recycling examples +// Base class for Trash recycling examples. package patterns.trash; -import java.util.*; -import java.lang.reflect.*; public abstract class Trash { - private double weight; - public Trash(double wt) { weight = wt; } - public Trash() {} - public abstract double value(); - public double weight() { return weight; } - // Sums the value of Trash in a bin: - static double val; - public static - void sumValue(List bin) { - val = 0.0f; - bin.forEach( t -> { - val += t.weight() * t.value(); - System.out.println("weight of " + - // RTTI gets type information - // about the class: - t.getClass().getName() + - " = " + t.weight()); - }); - System.out.println("Total value = " + val); + public final double weight; + public Trash(double weight) { + this.weight = weight; } + public abstract double price(); @Override public String toString() { - // Print correct subclass name: - return getClass().getName() + - " w:" + weight() + " v:" + - String.format("%.2f", value()); - } - // Remainder of class supports dynamic creation: - public static class CannotCreateTrashException - extends RuntimeException { - public CannotCreateTrashException(Exception why) { - super(why); - } - } - public static class TrashClassNotFoundException - extends RuntimeException { - public TrashClassNotFoundException(Exception why) { - super(why); - } - } - public static class Info { - public String id; - public double data; - public Info(String name, double data) { - id = name; - this.data = data; - } - } - private static List trashTypes = - new ArrayList<>(); - @SuppressWarnings("unchecked") - public static T factory(Info info) { - for(Class trashType : trashTypes) { - // Determine the type and create one: - if(trashType.getName().contains(info.id)) { - try { - // Get the dynamic constructor method - // that takes a double argument: - Constructor ctor = - trashType.getConstructor(double.class); - // Call the constructor to create a - // new object: - return - (T)ctor.newInstance(info.data); - } catch(Exception e) { - throw new CannotCreateTrashException(e); - } - } - } - // The necessary Class was not in the list. Try to - // load it, but it must be in your class path! - try { - System.out.println("Loading " + info.id); - trashTypes.add(Class.forName(info.id)); - } catch(Exception e) { - throw new TrashClassNotFoundException(e); - } - // Loaded successfully. Recursive call - // should work this time: - return factory(info); + return String.format( + "%s weight: %.2f * price: %.2f = %.2f", + getClass().getSimpleName(), + weight, price(), weight * price()); } + // Ignore for now; to be used later: + public abstract void accept(Visitor v); } diff --git a/patterns/trash/TrashInfo.java b/patterns/trash/TrashInfo.java new file mode 100644 index 000000000..9adc67882 --- /dev/null +++ b/patterns/trash/TrashInfo.java @@ -0,0 +1,18 @@ +// patterns/trash/TrashInfo.java +// (c)2021 MindView LLC: see Copyright.txt +// We make no guarantees that this code is fit for any purpose. +// Visit http://OnJava8.com for more book information. +// Messenger class carrying Trash creation data. +package patterns.trash; + +public class TrashInfo { + public final String type; + public final double data; + public TrashInfo(String type, double data) { + this.type = type; + this.data = data; + } + @Override public String toString() { + return "TrashInfo(" + type + ", " + data + ")"; + } +} diff --git a/patterns/trash/TrashValue.java b/patterns/trash/TrashValue.java new file mode 100644 index 000000000..0ca9caaf0 --- /dev/null +++ b/patterns/trash/TrashValue.java @@ -0,0 +1,21 @@ +// patterns/trash/TrashValue.java +// (c)2021 MindView LLC: see Copyright.txt +// We make no guarantees that this code is fit for any purpose. +// Visit http://OnJava8.com for more book information. +// Sums the value of Trash in a bin. +package patterns.trash; +import java.util.*; + +public class TrashValue { + private static double total; + public static void + sum(List bin, String type) { + total = 0.0; + bin.forEach( t -> { + System.out.println(t); + total += t.weight * t.price(); + }); + System.out.printf( + "Total %s value = %.2f%n", type, total); + } +} diff --git a/patterns/trash/TrashVisitor.java b/patterns/trash/TrashVisitor.java new file mode 100644 index 000000000..3f8431e1b --- /dev/null +++ b/patterns/trash/TrashVisitor.java @@ -0,0 +1,104 @@ +// patterns/trash/TrashVisitor.java +// (c)2021 MindView LLC: see Copyright.txt +// We make no guarantees that this code is fit for any purpose. +// Visit http://OnJava8.com for more book information. +// Related algorithms packaged in +// each implementation of Visitor. +// {java patterns.trash.TrashVisitor} +package patterns.trash; +import java.util.*; + +class PriceVisitor extends Visitor { + public PriceVisitor() { super("price"); } + @Override public void visit(Aluminum al) { + double price = al.weight * al.price(); + show("Aluminum", price); + alTotal += price; + } + @Override public void visit(Paper p) { + double price = p.weight * p.price(); + show("Paper", price); + pTotal += price; + } + @Override public void visit(Glass g) { + double price = g.weight * g.price(); + show("Glass", price); + gTotal += price; + } + @Override public void visit(Cardboard c) { + double price = c.weight * c.price(); + show("Cardboard", price); + cTotal += price; + } +} + +class WeightVisitor extends Visitor { + public WeightVisitor() { super("weight"); } + @Override public void visit(Aluminum al) { + show("Aluminum", al.weight); + alTotal += al.weight; + } + @Override public void visit(Paper p) { + show("Paper", p.weight); + pTotal += p.weight; + } + @Override public void visit(Glass g) { + show("Glass", g.weight); + gTotal += g.weight; + } + @Override public void visit(Cardboard c) { + show("Cardboard", c.weight); + cTotal += c.weight; + } +} + +public class TrashVisitor { + public static void main(String[] args) { + List bin = new ArrayList<>(); + ParseTrash.fillBin("trash", bin); + List visitors = Arrays.asList( + new PriceVisitor(), new WeightVisitor()); + bin.forEach( + trash -> visitors.forEach(trash::accept) + ); + visitors.forEach(Visitor::total); + } +} +/* Output: +Loading patterns.trash.Cardboard +Loading patterns.trash.Paper +Loading patterns.trash.Aluminum +Loading patterns.trash.Glass +Cardboard price: 0.48 +Cardboard weight: 4.40 +Paper price: 0.80 +Paper weight: 8.00 +Aluminum price: 3.01 +Aluminum weight: 1.80 +Glass price: 1.24 +Glass weight: 5.40 +Aluminum price: 5.68 +Aluminum weight: 3.40 +Cardboard price: 0.24 +Cardboard weight: 2.20 +Glass price: 0.99 +Glass weight: 4.30 +Cardboard price: 0.13 +Cardboard weight: 1.20 +Paper price: 0.66 +Paper weight: 6.60 +Aluminum price: 4.51 +Aluminum weight: 2.70 +Paper price: 0.91 +Paper weight: 9.10 +Glass price: 0.83 +Glass weight: 3.60 +Total Aluminum price: 13.19 +Total Paper price: 2.37 +Total Glass price: 3.06 +Total Cardboard price: 0.86 +Total Aluminum weight: 7.90 +Total Paper weight: 23.70 +Total Glass weight: 13.30 +Total Cardboard weight: 7.80 +*/ diff --git a/patterns/trash/TypeMapTrash.java b/patterns/trash/TypeMapTrash.java new file mode 100644 index 000000000..bd04ab1de --- /dev/null +++ b/patterns/trash/TypeMapTrash.java @@ -0,0 +1,52 @@ +// patterns/trash/TypeMapTrash.java +// (c)2021 MindView LLC: see Copyright.txt +// We make no guarantees that this code is fit for any purpose. +// Visit http://OnJava8.com for more book information. +// Using a Map of Lists and reflection to sort +// Trash into Lists. This is extensible, despite +// the use of reflection. +// {java patterns.trash.TypeMapTrash} +package patterns.trash; +import patterns.TypeMap; + +// Adapter class for ParseTrash.fillBin(): +class TypeMapAdapter implements Fillable { + private TypeMap map; + TypeMapAdapter(TypeMap map) { + this.map = map; + } + @Override + public void addTrash(Trash t) { map.add(t); } +} + +public class TypeMapTrash { + @SuppressWarnings("unchecked") + public static void main(String[] args) { + TypeMap bin = new TypeMap<>(); + ParseTrash.fillBin( + "trash", new TypeMapAdapter(bin)); + ClassToListOfTrashMap.show(bin.map); + } +} +/* Output: +Loading patterns.trash.Cardboard +Loading patterns.trash.Paper +Loading patterns.trash.Aluminum +Loading patterns.trash.Glass +Paper weight: 8.00 * price: 0.10 = 0.80 +Paper weight: 6.60 * price: 0.10 = 0.66 +Paper weight: 9.10 * price: 0.10 = 0.91 +Total Paper value = 2.37 +Glass weight: 5.40 * price: 0.23 = 1.24 +Glass weight: 4.30 * price: 0.23 = 0.99 +Glass weight: 3.60 * price: 0.23 = 0.83 +Total Glass value = 3.06 +Aluminum weight: 1.80 * price: 1.67 = 3.01 +Aluminum weight: 3.40 * price: 1.67 = 5.68 +Aluminum weight: 2.70 * price: 1.67 = 4.51 +Total Aluminum value = 13.19 +Cardboard weight: 4.40 * price: 0.11 = 0.48 +Cardboard weight: 2.20 * price: 0.11 = 0.24 +Cardboard weight: 1.20 * price: 0.11 = 0.13 +Total Cardboard value = 0.86 +*/ diff --git a/patterns/trash/Visitor.java b/patterns/trash/Visitor.java new file mode 100644 index 000000000..34f0fff83 --- /dev/null +++ b/patterns/trash/Visitor.java @@ -0,0 +1,31 @@ +// patterns/trash/Visitor.java +// (c)2021 MindView LLC: see Copyright.txt +// We make no guarantees that this code is fit for any purpose. +// Visit http://OnJava8.com for more book information. +// The base class for Visitors. +package patterns.trash; + +public abstract class Visitor { + protected double alTotal; // Aluminum + protected double pTotal; // Paper + protected double gTotal; // Glass + protected double cTotal; // Cardboard + protected String descriptor; + protected Visitor(String descriptor) { + this.descriptor = descriptor; + } + protected void show(String type, double value) { + System.out.printf( + "%s %s: %.2f%n", type, descriptor, value); + } + public void total() { + show("Total Aluminum", alTotal); + show("Total Paper", pTotal); + show("Total Glass", gTotal); + show("Total Cardboard", cTotal); + } + abstract void visit(Aluminum a); + abstract void visit(Paper p); + abstract void visit(Glass g); + abstract void visit(Cardboard c); +} diff --git a/patterns/trashvisitor/Aluminum.java b/patterns/trashvisitor/Aluminum.java deleted file mode 100644 index 9bb9c9e4d..000000000 --- a/patterns/trashvisitor/Aluminum.java +++ /dev/null @@ -1,15 +0,0 @@ -// patterns/trashvisitor/Aluminum.java -// (c)2021 MindView LLC: see Copyright.txt -// We make no guarantees that this code is fit for any purpose. -// Visit http://OnJava8.com for more book information. -// Aluminum for the visitor pattern -package patterns.trashvisitor; -import patterns.trash.*; - -public class Aluminum extends patterns.trash.Aluminum - implements Visitable { - public Aluminum(double wt) { super(wt); } - @Override public void accept(Visitor v) { - v.visit(this); - } -} diff --git a/patterns/trashvisitor/Cardboard.java b/patterns/trashvisitor/Cardboard.java deleted file mode 100644 index 50c3b1c9f..000000000 --- a/patterns/trashvisitor/Cardboard.java +++ /dev/null @@ -1,15 +0,0 @@ -// patterns/trashvisitor/Cardboard.java -// (c)2021 MindView LLC: see Copyright.txt -// We make no guarantees that this code is fit for any purpose. -// Visit http://OnJava8.com for more book information. -// Cardboard for the visitor pattern -package patterns.trashvisitor; -import patterns.trash.*; - -public class Cardboard extends patterns.trash.Cardboard - implements Visitable { - public Cardboard(double wt) { super(wt); } - @Override public void accept(Visitor v) { - v.visit(this); - } -} diff --git a/patterns/trashvisitor/Glass.java b/patterns/trashvisitor/Glass.java deleted file mode 100644 index 71f1de037..000000000 --- a/patterns/trashvisitor/Glass.java +++ /dev/null @@ -1,15 +0,0 @@ -// patterns/trashvisitor/Glass.java -// (c)2021 MindView LLC: see Copyright.txt -// We make no guarantees that this code is fit for any purpose. -// Visit http://OnJava8.com for more book information. -// Glass for the visitor pattern -package patterns.trashvisitor; -import patterns.trash.*; - -public class Glass extends patterns.trash.Glass - implements Visitable { - public Glass(double wt) { super(wt); } - @Override public void accept(Visitor v) { - v.visit(this); - } -} diff --git a/patterns/trashvisitor/Paper.java b/patterns/trashvisitor/Paper.java deleted file mode 100644 index ad209ffdf..000000000 --- a/patterns/trashvisitor/Paper.java +++ /dev/null @@ -1,15 +0,0 @@ -// patterns/trashvisitor/Paper.java -// (c)2021 MindView LLC: see Copyright.txt -// We make no guarantees that this code is fit for any purpose. -// Visit http://OnJava8.com for more book information. -// Paper for the visitor pattern -package patterns.trashvisitor; -import patterns.trash.*; - -public class Paper extends patterns.trash.Paper - implements Visitable { - public Paper(double wt) { super(wt); } - @Override public void accept(Visitor v) { - v.visit(this); - } -} diff --git a/patterns/trashvisitor/TrashVisitor.java b/patterns/trashvisitor/TrashVisitor.java deleted file mode 100644 index c794d82f7..000000000 --- a/patterns/trashvisitor/TrashVisitor.java +++ /dev/null @@ -1,117 +0,0 @@ -// patterns/trashvisitor/TrashVisitor.java -// (c)2021 MindView LLC: see Copyright.txt -// We make no guarantees that this code is fit for any purpose. -// Visit http://OnJava8.com for more book information. -// {java patterns.trashvisitor.TrashVisitor} -package patterns.trashvisitor; -import patterns.trash.*; -import java.util.*; - -// Specific group of algorithms packaged -// in each implementation of Visitor: -class PriceVisitor implements Visitor { - private double alSum; // Aluminum - private double pSum; // Paper - private double gSum; // Glass - private double cSum; // Cardboard - public static void show(String s) { - System.out.println(s); - } - @Override public void visit(Aluminum al) { - double v = al.weight() * al.value(); - show("value of Aluminum= " + v); - alSum += v; - } - @Override public void visit(Paper p) { - double v = p.weight() * p.value(); - show("value of Paper= " + v); - pSum += v; - } - @Override public void visit(Glass g) { - double v = g.weight() * g.value(); - show("value of Glass= " + v); - gSum += v; - } - @Override public void visit(Cardboard c) { - double v = c.weight() * c.value(); - show("value of Cardboard = " + v); - cSum += v; - } - @Override public void total() { - show( - "Total Aluminum: $" + alSum + "\n" + - "Total Paper: $" + pSum + "\n" + - "Total Glass: $" + gSum + "\n" + - "Total Cardboard: $" + cSum); - } -} - -class WeightVisitor implements Visitor { - private double alSum; // Aluminum - private double pSum; // Paper - private double gSum; // Glass - private double cSum; // Cardboard - public static void show(String s) { - System.out.println(s); - } - @Override public void visit(Aluminum al) { - alSum += al.weight(); - show("Aluminum weight = " + al.weight()); - } - @Override public void visit(Paper p) { - pSum += p.weight(); - show("Paper weight = " + p.weight()); - } - @Override public void visit(Glass g) { - gSum += g.weight(); - show("Glass weight = " + g.weight()); - } - @Override public void visit(Cardboard c) { - cSum += c.weight(); - show("Cardboard weight = " + c.weight()); - } - @Override public void total() { - show("Total weight Aluminum:" + alSum); - show("Total weight Paper:" + pSum); - show("Total weight Glass:" + gSum); - show("Total weight Cardboard:" + cSum); - } -} - -public class TrashVisitor { - public static void main(String[] args) { - List bin = new ArrayList<>(); - // ParseTrash still works, without changes: - ParseTrash.fillBin("trashvisitor", bin); - List visitors = Arrays.asList( - new PriceVisitor(), new WeightVisitor()); - bin.forEach( t -> { - Visitable v = (Visitable) t; - visitors.forEach(visitor -> v.accept(visitor)); - }); - visitors.forEach(Visitor::total); - } -} -/* Output: (First and Last 10 Lines) -Loading patterns.trashvisitor.Glass -Loading patterns.trashvisitor.Paper -Loading patterns.trashvisitor.Aluminum -Loading patterns.trashvisitor.Cardboard -value of Glass= 12.420000225305557 -Glass weight = 54.0 -value of Paper= 2.2000000327825546 -Paper weight = 22.0 -value of Paper= 1.1000000163912773 -Paper weight = 11.0 -...________...________...________...________... -value of Cardboard = 5.060000091791153 -Cardboard weight = 22.0 -Total Aluminum: $860.0499778985977 -Total Paper: $35.80000053346157 -Total Glass: $150.1900027245283 -Total Cardboard: $40.02000072598457 -Total weight Aluminum:515.0 -Total weight Paper:358.0 -Total weight Glass:653.0 -Total weight Cardboard:174.0 -*/ diff --git a/patterns/trashvisitor/Visitable.java b/patterns/trashvisitor/Visitable.java deleted file mode 100644 index 54563d435..000000000 --- a/patterns/trashvisitor/Visitable.java +++ /dev/null @@ -1,12 +0,0 @@ -// patterns/trashvisitor/Visitable.java -// (c)2021 MindView LLC: see Copyright.txt -// We make no guarantees that this code is fit for any purpose. -// Visit http://OnJava8.com for more book information. -// An interface to add visitor functionality to the -// Trash hierarchy without modifying the base class -package patterns.trashvisitor; - -public interface Visitable { - // The new method: - void accept(Visitor v); -} diff --git a/patterns/trashvisitor/Visitor.java b/patterns/trashvisitor/Visitor.java deleted file mode 100644 index 3f9bfe460..000000000 --- a/patterns/trashvisitor/Visitor.java +++ /dev/null @@ -1,14 +0,0 @@ -// patterns/trashvisitor/Visitor.java -// (c)2021 MindView LLC: see Copyright.txt -// We make no guarantees that this code is fit for any purpose. -// Visit http://OnJava8.com for more book information. -// The base interface for visitors -package patterns.trashvisitor; - -public interface Visitor { - void visit(Aluminum a); - void visit(Paper p); - void visit(Glass g); - void visit(Cardboard c); - void total(); -} diff --git a/patterns/visitor/BeeAndFlowers.java b/patterns/visitor/BeeAndFlowers.java index a1d400459..395966190 100644 --- a/patterns/visitor/BeeAndFlowers.java +++ b/patterns/visitor/BeeAndFlowers.java @@ -2,7 +2,7 @@ // (c)2021 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. -// Demonstration of "visitor" pattern +// Demonstration of the Visitor pattern. // {java patterns.visitor.BeeAndFlowers} package patterns.visitor; import java.util.*; @@ -11,7 +11,7 @@ interface Visitor { void visit(Gladiolus g); - void visit(Renuculus r); + void visit(Ranunculus r); void visit(Chrysanthemum c); } @@ -25,7 +25,7 @@ class Gladiolus implements Flower { public void accept(Visitor v) { v.visit(this);} } -class Renuculus implements Flower { +class Ranunculus implements Flower { @Override public void accept(Visitor v) { v.visit(this);} } @@ -37,13 +37,13 @@ class Chrysanthemum implements Flower { // Add the ability to produce a String: class StringVal implements Visitor { - String s; + private String s; @Override public String toString() { return s; } @Override public void visit(Gladiolus g) { s = "Gladiolus"; } - @Override public void visit(Renuculus r) { - s = "Renuculus"; + @Override public void visit(Ranunculus r) { + s = "Ranunculus"; } @Override public void visit(Chrysanthemum c) { s = "Chrysanthemum"; @@ -55,8 +55,8 @@ class Bee implements Visitor { @Override public void visit(Gladiolus g) { System.out.println("Bee and Gladiolus"); } - @Override public void visit(Renuculus r) { - System.out.println("Bee and Renuculus"); + @Override public void visit(Ranunculus r) { + System.out.println("Bee and Ranunculus"); } @Override public void visit(Chrysanthemum c) { System.out.println("Bee and Chrysanthemum"); @@ -66,7 +66,7 @@ class Bee implements Visitor { class FlowerFactory { static List> flowers = Arrays.asList(Gladiolus::new, - Renuculus::new, Chrysanthemum::new); + Ranunculus::new, Chrysanthemum::new); static final int SZ = flowers.size(); private static SplittableRandom rand = new SplittableRandom(47); @@ -95,21 +95,21 @@ public static void main(String[] args) { Gladiolus Chrysanthemum Gladiolus -Renuculus +Ranunculus Chrysanthemum -Renuculus +Ranunculus Chrysanthemum Chrysanthemum Chrysanthemum -Renuculus +Ranunculus Bee and Gladiolus Bee and Chrysanthemum Bee and Gladiolus -Bee and Renuculus +Bee and Ranunculus Bee and Chrysanthemum -Bee and Renuculus +Bee and Ranunculus Bee and Chrysanthemum Bee and Chrysanthemum Bee and Chrysanthemum -Bee and Renuculus +Bee and Ranunculus */ diff --git a/polymorphism/RTTI.java b/polymorphism/Reflect.java similarity index 81% rename from polymorphism/RTTI.java rename to polymorphism/Reflect.java index fe56a6b26..341e86f68 100644 --- a/polymorphism/RTTI.java +++ b/polymorphism/Reflect.java @@ -1,8 +1,7 @@ -// polymorphism/RTTI.java +// polymorphism/Reflect.java // (c)2021 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. -// Downcasting & Runtime type information (RTTI) // {ThrowsException} class Useful { @@ -18,7 +17,7 @@ public void v() {} public void w() {} } -public class RTTI { +public class Reflect { public static void main(String[] args) { Useful[] x = { new Useful(), @@ -28,7 +27,7 @@ public static void main(String[] args) { x[1].g(); // Compile time: method not found in Useful: //- x[1].u(); - ((MoreUseful)x[1]).u(); // Downcast/RTTI + ((MoreUseful)x[1]).u(); // Downcast/Reflect ((MoreUseful)x[0]).u(); // Exception thrown } } @@ -37,5 +36,5 @@ public static void main(String[] args) { Exception in thread "main" java.lang.ClassCastException: Useful cannot be cast to MoreUseful - at RTTI.main(RTTI.java:29) + at Reflect.main(Reflect.java:28) */ diff --git a/references/CopyConstructor.java b/references/CopyConstructor.java index 6ffb5303b..fe16259fa 100644 --- a/references/CopyConstructor.java +++ b/references/CopyConstructor.java @@ -13,7 +13,7 @@ class FruitQualities { private int ripeness; private int smell; // etc. - // No-arg constructor: + // Zero-argument constructor: FruitQualities() { // Do something meaningful... } @@ -32,7 +32,7 @@ class FruitQualities { class Seed { // Members... - Seed() { /* No-arg constructor */ } + Seed() { /* Zero-argument constructor */ } Seed(Seed s) { /* Copy constructor */ } } @@ -81,7 +81,7 @@ class Tomato extends Fruit { class ZebraQualities extends FruitQualities { private int stripedness; - // No-arg constructor: + // Zero-argument constructor: ZebraQualities() { super(); // do something meaningful... @@ -117,7 +117,7 @@ public static void ripen(Tomato t) { t.getClass().getName()); } public static void slice(Fruit f) { - f = new Fruit(f); // Hmmm... will this work? // [2] + f = new Fruit(f); // Hmm... will this work? // [2] System.out.println("In slice, f is a " + f.getClass().getName()); } diff --git a/typeinfo/AnonymousImplementation.java b/reflection/AnonymousImplementation.java similarity index 94% rename from typeinfo/AnonymousImplementation.java rename to reflection/AnonymousImplementation.java index 7cff12823..290798bbf 100644 --- a/typeinfo/AnonymousImplementation.java +++ b/reflection/AnonymousImplementation.java @@ -1,9 +1,9 @@ -// typeinfo/AnonymousImplementation.java +// reflection/AnonymousImplementation.java // (c)2021 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Anonymous inner classes can't hide from reflection -import typeinfo.interfacea.*; +import reflection.interfacea.*; class AnonymousA { public static A makeA() { diff --git a/typeinfo/BoundedClassReferences.java b/reflection/BoundedClassReferences.java similarity index 90% rename from typeinfo/BoundedClassReferences.java rename to reflection/BoundedClassReferences.java index 58d7eb009..6d2960591 100644 --- a/typeinfo/BoundedClassReferences.java +++ b/reflection/BoundedClassReferences.java @@ -1,4 +1,4 @@ -// typeinfo/BoundedClassReferences.java +// reflection/BoundedClassReferences.java // (c)2021 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/typeinfo/ClassCasts.java b/reflection/ClassCasts.java similarity index 93% rename from typeinfo/ClassCasts.java rename to reflection/ClassCasts.java index 5f36ba4b3..3efd64c39 100644 --- a/typeinfo/ClassCasts.java +++ b/reflection/ClassCasts.java @@ -1,4 +1,4 @@ -// typeinfo/ClassCasts.java +// reflection/ClassCasts.java // (c)2021 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/typeinfo/ClassInitialization.java b/reflection/ClassInitialization.java similarity index 97% rename from typeinfo/ClassInitialization.java rename to reflection/ClassInitialization.java index 3814949d8..21b711338 100644 --- a/typeinfo/ClassInitialization.java +++ b/reflection/ClassInitialization.java @@ -1,4 +1,4 @@ -// typeinfo/ClassInitialization.java +// reflection/ClassInitialization.java // (c)2021 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/typeinfo/DynamicSupplier.java b/reflection/DynamicSupplier.java similarity index 96% rename from typeinfo/DynamicSupplier.java rename to reflection/DynamicSupplier.java index 1bcf039a7..910d12154 100644 --- a/typeinfo/DynamicSupplier.java +++ b/reflection/DynamicSupplier.java @@ -1,4 +1,4 @@ -// typeinfo/DynamicSupplier.java +// reflection/DynamicSupplier.java // (c)2021 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/typeinfo/FamilyVsExactType.java b/reflection/FamilyVsExactType.java similarity index 90% rename from typeinfo/FamilyVsExactType.java rename to reflection/FamilyVsExactType.java index 10e1b3804..db2bc9daf 100644 --- a/typeinfo/FamilyVsExactType.java +++ b/reflection/FamilyVsExactType.java @@ -1,10 +1,10 @@ -// typeinfo/FamilyVsExactType.java +// reflection/FamilyVsExactType.java // (c)2021 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // The difference between instanceof and class -// {java typeinfo.FamilyVsExactType} -package typeinfo; +// {java reflection.FamilyVsExactType} +package reflection; class Base {} class Derived extends Base {} @@ -41,7 +41,7 @@ public static void main(String[] args) { } } /* Output: -Testing x of type class typeinfo.Base +Testing x of type class reflection.Base x instanceof Base true x instanceof Derived false Base.isInstance(x) true @@ -50,7 +50,7 @@ public static void main(String[] args) { x.getClass() == Derived.class false x.getClass().equals(Base.class)) true x.getClass().equals(Derived.class)) false -Testing x of type class typeinfo.Derived +Testing x of type class reflection.Derived x instanceof Base true x instanceof Derived true Base.isInstance(x) true diff --git a/typeinfo/GenericClassReferences.java b/reflection/GenericClassReferences.java similarity index 91% rename from typeinfo/GenericClassReferences.java rename to reflection/GenericClassReferences.java index 9925fb199..66601f93c 100644 --- a/typeinfo/GenericClassReferences.java +++ b/reflection/GenericClassReferences.java @@ -1,4 +1,4 @@ -// typeinfo/GenericClassReferences.java +// reflection/GenericClassReferences.java // (c)2021 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/typeinfo/HiddenImplementation.java b/reflection/HiddenImplementation.java similarity index 88% rename from typeinfo/HiddenImplementation.java rename to reflection/HiddenImplementation.java index 88dcb2386..1d536d309 100644 --- a/typeinfo/HiddenImplementation.java +++ b/reflection/HiddenImplementation.java @@ -1,10 +1,10 @@ -// typeinfo/HiddenImplementation.java +// reflection/HiddenImplementation.java // (c)2021 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Sneaking around package hiding -import typeinfo.interfacea.*; -import typeinfo.packageaccess.*; +import reflection.interfacea.*; +import reflection.packageaccess.*; import java.lang.reflect.*; public class HiddenImplementation { @@ -36,7 +36,7 @@ public class HiddenImplementation { } /* Output: public C.f() -typeinfo.packageaccess.C +reflection.packageaccess.C public C.g() package C.u() protected C.v() diff --git a/typeinfo/ID2.java b/reflection/ID2.java similarity index 96% rename from typeinfo/ID2.java rename to reflection/ID2.java index 8463a4fe9..6ff472af1 100644 --- a/typeinfo/ID2.java +++ b/reflection/ID2.java @@ -1,4 +1,4 @@ -// typeinfo/ID2.java +// reflection/ID2.java // (c)2021 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/typeinfo/InnerImplementation.java b/reflection/InnerImplementation.java similarity index 90% rename from typeinfo/InnerImplementation.java rename to reflection/InnerImplementation.java index 1c15b7518..248049c27 100644 --- a/typeinfo/InnerImplementation.java +++ b/reflection/InnerImplementation.java @@ -1,9 +1,9 @@ -// typeinfo/InnerImplementation.java +// reflection/InnerImplementation.java // (c)2021 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. -// Private inner classes can't hide from reflection -import typeinfo.interfacea.*; +// Private inner classes can't hide from reflection. +import reflection.interfacea.*; class InnerA { private static class C implements A { diff --git a/typeinfo/InterfaceViolation.java b/reflection/InterfaceViolation.java similarity index 88% rename from typeinfo/InterfaceViolation.java rename to reflection/InterfaceViolation.java index 84300720e..ef8bfc954 100644 --- a/typeinfo/InterfaceViolation.java +++ b/reflection/InterfaceViolation.java @@ -1,9 +1,9 @@ -// typeinfo/InterfaceViolation.java +// reflection/InterfaceViolation.java // (c)2021 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Sneaking around an interface -import typeinfo.interfacea.*; +import reflection.interfacea.*; class B implements A { @Override public void f() {} diff --git a/typeinfo/ModifyingPrivateFields.java b/reflection/ModifyingPrivateFields.java similarity index 97% rename from typeinfo/ModifyingPrivateFields.java rename to reflection/ModifyingPrivateFields.java index 0d68972e4..99b929531 100644 --- a/typeinfo/ModifyingPrivateFields.java +++ b/reflection/ModifyingPrivateFields.java @@ -1,4 +1,4 @@ -// typeinfo/ModifyingPrivateFields.java +// reflection/ModifyingPrivateFields.java // (c)2021 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/typeinfo/NullRobot.java b/reflection/NullRobot.java similarity index 98% rename from typeinfo/NullRobot.java rename to reflection/NullRobot.java index a3d0ed6b3..c3e19659f 100644 --- a/typeinfo/NullRobot.java +++ b/reflection/NullRobot.java @@ -1,4 +1,4 @@ -// typeinfo/NullRobot.java +// reflection/NullRobot.java // (c)2021 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/typeinfo/Operation.java b/reflection/Operation.java similarity index 93% rename from typeinfo/Operation.java rename to reflection/Operation.java index d3013aca9..4b749e7d1 100644 --- a/typeinfo/Operation.java +++ b/reflection/Operation.java @@ -1,4 +1,4 @@ -// typeinfo/Operation.java +// reflection/Operation.java // (c)2021 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/typeinfo/Person.java b/reflection/Person.java similarity index 98% rename from typeinfo/Person.java rename to reflection/Person.java index 77dc091e0..070a2490f 100644 --- a/typeinfo/Person.java +++ b/reflection/Person.java @@ -1,4 +1,4 @@ -// typeinfo/Person.java +// reflection/Person.java // (c)2021 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/typeinfo/PetCounter.java b/reflection/PetCounter.java similarity index 97% rename from typeinfo/PetCounter.java rename to reflection/PetCounter.java index bc0642f5e..974880620 100644 --- a/typeinfo/PetCounter.java +++ b/reflection/PetCounter.java @@ -1,9 +1,9 @@ -// typeinfo/PetCounter.java +// reflection/PetCounter.java // (c)2021 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Using instanceof -import typeinfo.pets.*; +import reflection.pets.*; import java.util.*; public class PetCounter { diff --git a/typeinfo/PetCounter2.java b/reflection/PetCounter2.java similarity index 90% rename from typeinfo/PetCounter2.java rename to reflection/PetCounter2.java index 1293a1075..ccac0b57f 100644 --- a/typeinfo/PetCounter2.java +++ b/reflection/PetCounter2.java @@ -1,8 +1,8 @@ -// typeinfo/PetCounter2.java +// reflection/PetCounter2.java // (c)2021 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. -import typeinfo.pets.*; +import reflection.pets.*; public class PetCounter2 { public static void main(String[] args) { diff --git a/typeinfo/PetCounter3.java b/reflection/PetCounter3.java similarity index 96% rename from typeinfo/PetCounter3.java rename to reflection/PetCounter3.java index ed4c51bd6..aec88ef0b 100644 --- a/typeinfo/PetCounter3.java +++ b/reflection/PetCounter3.java @@ -1,4 +1,4 @@ -// typeinfo/PetCounter3.java +// reflection/PetCounter3.java // (c)2021 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. @@ -6,7 +6,7 @@ import java.util.*; import java.util.stream.*; import onjava.*; -import typeinfo.pets.*; +import reflection.pets.*; public class PetCounter3 { static class Counter extends diff --git a/typeinfo/PetCounter4.java b/reflection/PetCounter4.java similarity index 92% rename from typeinfo/PetCounter4.java rename to reflection/PetCounter4.java index a7058c927..9015e66c7 100644 --- a/typeinfo/PetCounter4.java +++ b/reflection/PetCounter4.java @@ -1,8 +1,8 @@ -// typeinfo/PetCounter4.java +// reflection/PetCounter4.java // (c)2021 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. -import typeinfo.pets.*; +import reflection.pets.*; import onjava.*; public class PetCounter4 { diff --git a/typeinfo/Position.java b/reflection/Position.java similarity index 98% rename from typeinfo/Position.java rename to reflection/Position.java index 44df82691..ea07ca78f 100644 --- a/typeinfo/Position.java +++ b/reflection/Position.java @@ -1,4 +1,4 @@ -// typeinfo/Position.java +// reflection/Position.java // (c)2021 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/typeinfo/RegisteredFactories.java b/reflection/RegisteredFactories.java similarity index 98% rename from typeinfo/RegisteredFactories.java rename to reflection/RegisteredFactories.java index bc7d05457..04267c425 100644 --- a/typeinfo/RegisteredFactories.java +++ b/reflection/RegisteredFactories.java @@ -1,4 +1,4 @@ -// typeinfo/RegisteredFactories.java +// reflection/RegisteredFactories.java // (c)2021 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/typeinfo/Robot.java b/reflection/Robot.java similarity index 96% rename from typeinfo/Robot.java rename to reflection/Robot.java index ed7adc3f9..00818d378 100644 --- a/typeinfo/Robot.java +++ b/reflection/Robot.java @@ -1,4 +1,4 @@ -// typeinfo/Robot.java +// reflection/Robot.java // (c)2021 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/typeinfo/SelectingMethods.java b/reflection/SelectingMethods.java similarity index 97% rename from typeinfo/SelectingMethods.java rename to reflection/SelectingMethods.java index eb679194b..9002cf356 100644 --- a/typeinfo/SelectingMethods.java +++ b/reflection/SelectingMethods.java @@ -1,4 +1,4 @@ -// typeinfo/SelectingMethods.java +// reflection/SelectingMethods.java // (c)2021 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/typeinfo/Shapes.java b/reflection/Shapes.java similarity index 96% rename from typeinfo/Shapes.java rename to reflection/Shapes.java index ec9296504..05d15df5c 100644 --- a/typeinfo/Shapes.java +++ b/reflection/Shapes.java @@ -1,4 +1,4 @@ -// typeinfo/Shapes.java +// reflection/Shapes.java // (c)2021 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/typeinfo/ShowMethods.java b/reflection/ShowMethods.java similarity index 98% rename from typeinfo/ShowMethods.java rename to reflection/ShowMethods.java index ad4f16eb5..48024cdc4 100644 --- a/typeinfo/ShowMethods.java +++ b/reflection/ShowMethods.java @@ -1,4 +1,4 @@ -// typeinfo/ShowMethods.java +// reflection/ShowMethods.java // (c)2021 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/typeinfo/SimpleDynamicProxy.java b/reflection/SimpleDynamicProxy.java similarity index 97% rename from typeinfo/SimpleDynamicProxy.java rename to reflection/SimpleDynamicProxy.java index 544b780b2..9eeb02926 100644 --- a/typeinfo/SimpleDynamicProxy.java +++ b/reflection/SimpleDynamicProxy.java @@ -1,4 +1,4 @@ -// typeinfo/SimpleDynamicProxy.java +// reflection/SimpleDynamicProxy.java // (c)2021 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/typeinfo/SimpleProxyDemo.java b/reflection/SimpleProxyDemo.java similarity index 97% rename from typeinfo/SimpleProxyDemo.java rename to reflection/SimpleProxyDemo.java index 1e5eea41e..24f7b0166 100644 --- a/typeinfo/SimpleProxyDemo.java +++ b/reflection/SimpleProxyDemo.java @@ -1,4 +1,4 @@ -// typeinfo/SimpleProxyDemo.java +// reflection/SimpleProxyDemo.java // (c)2021 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/typeinfo/SnowRobot.java b/reflection/SnowRobot.java similarity index 97% rename from typeinfo/SnowRobot.java rename to reflection/SnowRobot.java index b28b1f7fb..227dcb49d 100644 --- a/typeinfo/SnowRobot.java +++ b/reflection/SnowRobot.java @@ -1,4 +1,4 @@ -// typeinfo/SnowRobot.java +// reflection/SnowRobot.java // (c)2021 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/typeinfo/Staff.java b/reflection/Staff.java similarity index 98% rename from typeinfo/Staff.java rename to reflection/Staff.java index 204280343..8c3bb76e8 100644 --- a/typeinfo/Staff.java +++ b/reflection/Staff.java @@ -1,4 +1,4 @@ -// typeinfo/Staff.java +// reflection/Staff.java // (c)2021 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/typeinfo/SweetShop.java b/reflection/SweetShop.java similarity index 97% rename from typeinfo/SweetShop.java rename to reflection/SweetShop.java index a046b281c..d5f964f0a 100644 --- a/typeinfo/SweetShop.java +++ b/reflection/SweetShop.java @@ -1,4 +1,4 @@ -// typeinfo/SweetShop.java +// reflection/SweetShop.java // (c)2021 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/typeinfo/WildcardClassReferences.java b/reflection/WildcardClassReferences.java similarity index 87% rename from typeinfo/WildcardClassReferences.java rename to reflection/WildcardClassReferences.java index 066b15d5d..d7266f732 100644 --- a/typeinfo/WildcardClassReferences.java +++ b/reflection/WildcardClassReferences.java @@ -1,4 +1,4 @@ -// typeinfo/WildcardClassReferences.java +// reflection/WildcardClassReferences.java // (c)2021 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. diff --git a/typeinfo/interfacea/A.java b/reflection/interfacea/A.java similarity index 75% rename from typeinfo/interfacea/A.java rename to reflection/interfacea/A.java index 359fb98ef..2b4c33ec9 100644 --- a/typeinfo/interfacea/A.java +++ b/reflection/interfacea/A.java @@ -1,8 +1,8 @@ -// typeinfo/interfacea/A.java +// reflection/interfacea/A.java // (c)2021 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. -package typeinfo.interfacea; +package reflection.interfacea; public interface A { void f(); diff --git a/typeinfo/packageaccess/HiddenC.java b/reflection/packageaccess/HiddenC.java similarity index 84% rename from typeinfo/packageaccess/HiddenC.java rename to reflection/packageaccess/HiddenC.java index 53277281e..24fb20d4b 100644 --- a/typeinfo/packageaccess/HiddenC.java +++ b/reflection/packageaccess/HiddenC.java @@ -1,9 +1,9 @@ -// typeinfo/packageaccess/HiddenC.java +// reflection/packageaccess/HiddenC.java // (c)2021 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. -package typeinfo.packageaccess; -import typeinfo.interfacea.*; +package reflection.packageaccess; +import reflection.interfacea.*; class C implements A { @Override public void f() { diff --git a/typeinfo/pets/Cat.java b/reflection/pets/Cat.java similarity index 83% rename from typeinfo/pets/Cat.java rename to reflection/pets/Cat.java index 68594e746..2ed2aba94 100644 --- a/typeinfo/pets/Cat.java +++ b/reflection/pets/Cat.java @@ -1,8 +1,8 @@ -// typeinfo/pets/Cat.java +// reflection/pets/Cat.java // (c)2021 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. -package typeinfo.pets; +package reflection.pets; public class Cat extends Pet { public Cat(String name) { super(name); } diff --git a/typeinfo/pets/Creator.java b/reflection/pets/Creator.java similarity index 95% rename from typeinfo/pets/Creator.java rename to reflection/pets/Creator.java index e3703e76c..f5f152fe8 100644 --- a/typeinfo/pets/Creator.java +++ b/reflection/pets/Creator.java @@ -1,9 +1,9 @@ -// typeinfo/pets/Creator.java +// reflection/pets/Creator.java // (c)2021 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Creates random Pets -package typeinfo.pets; +package reflection.pets; import java.util.*; import java.util.function.*; import java.util.stream.*; diff --git a/typeinfo/pets/Cymric.java b/reflection/pets/Cymric.java similarity index 83% rename from typeinfo/pets/Cymric.java rename to reflection/pets/Cymric.java index 4835e4a25..11521fe85 100644 --- a/typeinfo/pets/Cymric.java +++ b/reflection/pets/Cymric.java @@ -1,8 +1,8 @@ -// typeinfo/pets/Cymric.java +// reflection/pets/Cymric.java // (c)2021 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. -package typeinfo.pets; +package reflection.pets; public class Cymric extends Manx { public Cymric(String name) { super(name); } diff --git a/typeinfo/pets/Dog.java b/reflection/pets/Dog.java similarity index 83% rename from typeinfo/pets/Dog.java rename to reflection/pets/Dog.java index 2e5b9a8ab..abd370ff2 100644 --- a/typeinfo/pets/Dog.java +++ b/reflection/pets/Dog.java @@ -1,8 +1,8 @@ -// typeinfo/pets/Dog.java +// reflection/pets/Dog.java // (c)2021 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. -package typeinfo.pets; +package reflection.pets; public class Dog extends Pet { public Dog(String name) { super(name); } diff --git a/typeinfo/pets/EgyptianMau.java b/reflection/pets/EgyptianMau.java similarity index 82% rename from typeinfo/pets/EgyptianMau.java rename to reflection/pets/EgyptianMau.java index e728de938..4e314fb63 100644 --- a/typeinfo/pets/EgyptianMau.java +++ b/reflection/pets/EgyptianMau.java @@ -1,8 +1,8 @@ -// typeinfo/pets/EgyptianMau.java +// reflection/pets/EgyptianMau.java // (c)2021 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. -package typeinfo.pets; +package reflection.pets; public class EgyptianMau extends Cat { public EgyptianMau(String name) { super(name); } diff --git a/typeinfo/pets/ForNamePetCreator.java b/reflection/pets/ForNamePetCreator.java similarity index 71% rename from typeinfo/pets/ForNamePetCreator.java rename to reflection/pets/ForNamePetCreator.java index 6e35740d2..92648db5d 100644 --- a/typeinfo/pets/ForNamePetCreator.java +++ b/reflection/pets/ForNamePetCreator.java @@ -1,8 +1,8 @@ -// typeinfo/pets/ForNamePetCreator.java +// reflection/pets/ForNamePetCreator.java // (c)2021 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. -package typeinfo.pets; +package reflection.pets; import java.util.*; public class ForNamePetCreator extends Creator { @@ -10,14 +10,14 @@ public class ForNamePetCreator extends Creator { new ArrayList<>(); // Types you want randomly created: private static String[] typeNames = { - "typeinfo.pets.Mutt", - "typeinfo.pets.Pug", - "typeinfo.pets.EgyptianMau", - "typeinfo.pets.Manx", - "typeinfo.pets.Cymric", - "typeinfo.pets.Rat", - "typeinfo.pets.Mouse", - "typeinfo.pets.Hamster" + "reflection.pets.Mutt", + "reflection.pets.Pug", + "reflection.pets.EgyptianMau", + "reflection.pets.Manx", + "reflection.pets.Cymric", + "reflection.pets.Rat", + "reflection.pets.Mouse", + "reflection.pets.Hamster" }; @SuppressWarnings("unchecked") private static void loader() { diff --git a/typeinfo/pets/Hamster.java b/reflection/pets/Hamster.java similarity index 83% rename from typeinfo/pets/Hamster.java rename to reflection/pets/Hamster.java index 9763b30b4..fb09f3ab8 100644 --- a/typeinfo/pets/Hamster.java +++ b/reflection/pets/Hamster.java @@ -1,8 +1,8 @@ -// typeinfo/pets/Hamster.java +// reflection/pets/Hamster.java // (c)2021 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. -package typeinfo.pets; +package reflection.pets; public class Hamster extends Rodent { public Hamster(String name) { super(name); } diff --git a/typeinfo/pets/Individual.java b/reflection/pets/Individual.java similarity index 95% rename from typeinfo/pets/Individual.java rename to reflection/pets/Individual.java index 1783621db..524fba6e4 100644 --- a/typeinfo/pets/Individual.java +++ b/reflection/pets/Individual.java @@ -1,8 +1,8 @@ -// typeinfo/pets/Individual.java +// reflection/pets/Individual.java // (c)2021 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. -package typeinfo.pets; +package reflection.pets; import java.util.*; public class diff --git a/typeinfo/pets/Manx.java b/reflection/pets/Manx.java similarity index 83% rename from typeinfo/pets/Manx.java rename to reflection/pets/Manx.java index bf949bc0e..a5c6bea91 100644 --- a/typeinfo/pets/Manx.java +++ b/reflection/pets/Manx.java @@ -1,8 +1,8 @@ -// typeinfo/pets/Manx.java +// reflection/pets/Manx.java // (c)2021 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. -package typeinfo.pets; +package reflection.pets; public class Manx extends Cat { public Manx(String name) { super(name); } diff --git a/typeinfo/pets/Mouse.java b/reflection/pets/Mouse.java similarity index 83% rename from typeinfo/pets/Mouse.java rename to reflection/pets/Mouse.java index 07a7aac8f..9ad9b290d 100644 --- a/typeinfo/pets/Mouse.java +++ b/reflection/pets/Mouse.java @@ -1,8 +1,8 @@ -// typeinfo/pets/Mouse.java +// reflection/pets/Mouse.java // (c)2021 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. -package typeinfo.pets; +package reflection.pets; public class Mouse extends Rodent { public Mouse(String name) { super(name); } diff --git a/typeinfo/pets/Mutt.java b/reflection/pets/Mutt.java similarity index 83% rename from typeinfo/pets/Mutt.java rename to reflection/pets/Mutt.java index be99e73b2..f50ba64de 100644 --- a/typeinfo/pets/Mutt.java +++ b/reflection/pets/Mutt.java @@ -1,8 +1,8 @@ -// typeinfo/pets/Mutt.java +// reflection/pets/Mutt.java // (c)2021 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. -package typeinfo.pets; +package reflection.pets; public class Mutt extends Dog { public Mutt(String name) { super(name); } diff --git a/typeinfo/pets/Person.java b/reflection/pets/Person.java similarity index 81% rename from typeinfo/pets/Person.java rename to reflection/pets/Person.java index f2055e649..bfe61ca3b 100644 --- a/typeinfo/pets/Person.java +++ b/reflection/pets/Person.java @@ -1,8 +1,8 @@ -// typeinfo/pets/Person.java +// reflection/pets/Person.java // (c)2021 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. -package typeinfo.pets; +package reflection.pets; public class Person extends Individual { public Person(String name) { super(name); } diff --git a/typeinfo/pets/Pet.java b/reflection/pets/Pet.java similarity index 83% rename from typeinfo/pets/Pet.java rename to reflection/pets/Pet.java index b4c934aca..a3a0cf2ed 100644 --- a/typeinfo/pets/Pet.java +++ b/reflection/pets/Pet.java @@ -1,8 +1,8 @@ -// typeinfo/pets/Pet.java +// reflection/pets/Pet.java // (c)2021 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. -package typeinfo.pets; +package reflection.pets; public class Pet extends Individual { public Pet(String name) { super(name); } diff --git a/typeinfo/pets/PetCreator.java b/reflection/pets/PetCreator.java similarity index 75% rename from typeinfo/pets/PetCreator.java rename to reflection/pets/PetCreator.java index 3541160b4..1f01ceed3 100644 --- a/typeinfo/pets/PetCreator.java +++ b/reflection/pets/PetCreator.java @@ -1,10 +1,10 @@ -// typeinfo/pets/PetCreator.java +// reflection/pets/PetCreator.java // (c)2021 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Using class literals -// {java typeinfo.pets.PetCreator} -package typeinfo.pets; +// {java reflection.pets.PetCreator} +package reflection.pets; import java.util.*; public class PetCreator extends Creator { @@ -33,10 +33,10 @@ public static void main(String[] args) { } } /* Output: -[class typeinfo.pets.Mutt, class typeinfo.pets.Pug, -class typeinfo.pets.EgyptianMau, class -typeinfo.pets.Manx, class typeinfo.pets.Cymric, class -typeinfo.pets.Rat, class typeinfo.pets.Mouse, class -typeinfo.pets.Hamster] +[class reflection.pets.Mutt, class reflection.pets.Pug, +class reflection.pets.EgyptianMau, class +reflection.pets.Manx, class reflection.pets.Cymric, class +reflection.pets.Rat, class reflection.pets.Mouse, class +reflection.pets.Hamster] [Rat, Manx, Cymric, Mutt, Pug, Cymric, Pug] */ diff --git a/typeinfo/pets/Pug.java b/reflection/pets/Pug.java similarity index 83% rename from typeinfo/pets/Pug.java rename to reflection/pets/Pug.java index 83da95189..1a150b865 100644 --- a/typeinfo/pets/Pug.java +++ b/reflection/pets/Pug.java @@ -1,8 +1,8 @@ -// typeinfo/pets/Pug.java +// reflection/pets/Pug.java // (c)2021 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. -package typeinfo.pets; +package reflection.pets; public class Pug extends Dog { public Pug(String name) { super(name); } diff --git a/typeinfo/pets/Rat.java b/reflection/pets/Rat.java similarity index 83% rename from typeinfo/pets/Rat.java rename to reflection/pets/Rat.java index 68a346fb2..cd006426d 100644 --- a/typeinfo/pets/Rat.java +++ b/reflection/pets/Rat.java @@ -1,8 +1,8 @@ -// typeinfo/pets/Rat.java +// reflection/pets/Rat.java // (c)2021 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. -package typeinfo.pets; +package reflection.pets; public class Rat extends Rodent { public Rat(String name) { super(name); } diff --git a/typeinfo/pets/Rodent.java b/reflection/pets/Rodent.java similarity index 83% rename from typeinfo/pets/Rodent.java rename to reflection/pets/Rodent.java index cab79e752..3c9063ba3 100644 --- a/typeinfo/pets/Rodent.java +++ b/reflection/pets/Rodent.java @@ -1,8 +1,8 @@ -// typeinfo/pets/Rodent.java +// reflection/pets/Rodent.java // (c)2021 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. -package typeinfo.pets; +package reflection.pets; public class Rodent extends Pet { public Rodent(String name) { super(name); } diff --git a/typeinfo/toys/GenericToyTest.java b/reflection/toys/GenericToyTest.java similarity index 85% rename from typeinfo/toys/GenericToyTest.java rename to reflection/toys/GenericToyTest.java index 930fbc779..3332bcd64 100644 --- a/typeinfo/toys/GenericToyTest.java +++ b/reflection/toys/GenericToyTest.java @@ -1,10 +1,10 @@ -// typeinfo/toys/GenericToyTest.java +// reflection/toys/GenericToyTest.java // (c)2021 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Testing class Class -// {java typeinfo.toys.GenericToyTest} -package typeinfo.toys; +// {java reflection.toys.GenericToyTest} +package reflection.toys; public class GenericToyTest { public static void diff --git a/typeinfo/toys/ToyTest.java b/reflection/toys/ToyTest.java similarity index 67% rename from typeinfo/toys/ToyTest.java rename to reflection/toys/ToyTest.java index f67261f42..e81e64b7e 100644 --- a/typeinfo/toys/ToyTest.java +++ b/reflection/toys/ToyTest.java @@ -1,10 +1,10 @@ -// typeinfo/toys/ToyTest.java +// reflection/toys/ToyTest.java // (c)2021 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Testing class Class -// {java typeinfo.toys.ToyTest} -package typeinfo.toys; +// {java reflection.toys.ToyTest} +package reflection.toys; import java.lang.reflect.InvocationTargetException; interface HasBatteries {} @@ -12,7 +12,7 @@ interface Waterproof {} interface Shoots {} class Toy { - // Comment out the following no-arg + // Comment out the following zero-argument // constructor to see NoSuchMethodError public Toy() {} public Toy(int i) {} @@ -36,7 +36,7 @@ static void printInfo(Class cc) { public static void main(String[] args) { Class c = null; try { - c = Class.forName("typeinfo.toys.FancyToy"); + c = Class.forName("reflection.toys.FancyToy"); } catch(ClassNotFoundException e) { System.out.println("Can't find FancyToy"); System.exit(1); @@ -47,7 +47,7 @@ public static void main(String[] args) { Class up = c.getSuperclass(); Object obj = null; try { - // Requires public no-arg constructor: + // Requires public zero-argument constructor: obj = up.newInstance(); } catch(Exception e) { throw new @@ -57,22 +57,22 @@ public static void main(String[] args) { } } /* Output: -Class name: typeinfo.toys.FancyToy is interface? +Class name: reflection.toys.FancyToy is interface? [false] Simple name: FancyToy -Canonical name : typeinfo.toys.FancyToy -Class name: typeinfo.toys.HasBatteries is interface? +Canonical name : reflection.toys.FancyToy +Class name: reflection.toys.HasBatteries is interface? [true] Simple name: HasBatteries -Canonical name : typeinfo.toys.HasBatteries -Class name: typeinfo.toys.Waterproof is interface? +Canonical name : reflection.toys.HasBatteries +Class name: reflection.toys.Waterproof is interface? [true] Simple name: Waterproof -Canonical name : typeinfo.toys.Waterproof -Class name: typeinfo.toys.Shoots is interface? [true] +Canonical name : reflection.toys.Waterproof +Class name: reflection.toys.Shoots is interface? [true] Simple name: Shoots -Canonical name : typeinfo.toys.Shoots -Class name: typeinfo.toys.Toy is interface? [false] +Canonical name : reflection.toys.Shoots +Class name: reflection.toys.Toy is interface? [false] Simple name: Toy -Canonical name : typeinfo.toys.Toy +Canonical name : reflection.toys.Toy */ diff --git a/reuse/Bath.java b/reuse/Bath.java index 51fbe2649..f31a1490d 100644 --- a/reuse/Bath.java +++ b/reuse/Bath.java @@ -18,14 +18,14 @@ public class Bath { s1 = "Happy", s2 = "Happy", s3, s4; - private Soap castille; + private Soap castile; private int i; private float toy; public Bath() { System.out.println("Inside Bath()"); s3 = "Joy"; toy = 3.14f; - castille = new Soap(); + castile = new Soap(); } // Instance initialization: { i = 47; } @@ -39,7 +39,7 @@ public Bath() { "s4 = " + s4 + "\n" + "i = " + i + "\n" + "toy = " + toy + "\n" + - "castille = " + castille; + "castile = " + castile; } public static void main(String[] args) { Bath b = new Bath(); @@ -55,5 +55,5 @@ Inside Bath() s4 = Joy i = 47 toy = 3.14 -castille = Constructed +castile = Constructed */ diff --git a/serialization/AStoreCADState.java b/serialization/AStoreCADState.java index f9c9e79f9..93b7d5f53 100644 --- a/serialization/AStoreCADState.java +++ b/serialization/AStoreCADState.java @@ -21,7 +21,7 @@ abstract class Shape implements Serializable { dimension = dim; } @Override public String toString() { - return getClass() + "color[" + getColor() + + return getClass() + "Color[" + getColor() + "] xPos[" + xPos + "] yPos[" + yPos + "] dim[" + dimension + "]\n"; } @@ -106,15 +106,15 @@ public static void main(String[] args) { } } /* Output: -[class Circlecolor[GREEN] xPos[58] yPos[55] dim[93] -, class Squarecolor[GREEN] xPos[61] yPos[61] dim[29] -, class Linecolor[GREEN] xPos[68] yPos[0] dim[22] -, class Circlecolor[GREEN] xPos[7] yPos[88] dim[28] -, class Squarecolor[GREEN] xPos[51] yPos[89] dim[9] -, class Linecolor[GREEN] xPos[78] yPos[98] dim[61] -, class Circlecolor[GREEN] xPos[20] yPos[58] dim[16] -, class Squarecolor[GREEN] xPos[40] yPos[11] dim[22] -, class Linecolor[GREEN] xPos[4] yPos[83] dim[6] -, class Circlecolor[GREEN] xPos[75] yPos[10] dim[42] +[class CircleColor[GREEN] xPos[58] yPos[55] dim[93] +, class SquareColor[GREEN] xPos[61] yPos[61] dim[29] +, class LineColor[GREEN] xPos[68] yPos[0] dim[22] +, class CircleColor[GREEN] xPos[7] yPos[88] dim[28] +, class SquareColor[GREEN] xPos[51] yPos[89] dim[9] +, class LineColor[GREEN] xPos[78] yPos[98] dim[61] +, class CircleColor[GREEN] xPos[20] yPos[58] dim[16] +, class SquareColor[GREEN] xPos[40] yPos[11] dim[22] +, class LineColor[GREEN] xPos[4] yPos[83] dim[6] +, class CircleColor[GREEN] xPos[75] yPos[10] dim[42] ] */ diff --git a/serialization/Blip3.java b/serialization/Blip3.java index 3d66f5730..0e6907375 100644 --- a/serialization/Blip3.java +++ b/serialization/Blip3.java @@ -16,7 +16,7 @@ public Blip3(String x, int a) { System.out.println("Blip3(String x, int a)"); s = x; i = a; - // s & i initialized only in non-no-arg constructor. + // s & i initialized only in non-zero-argument constructor. } @Override public String toString() { return s + i; } @Override public void writeExternal(ObjectOutput out) diff --git a/serialization/RecoverCADState.java b/serialization/RecoverCADState.java index 188ac9769..b27da662e 100644 --- a/serialization/RecoverCADState.java +++ b/serialization/RecoverCADState.java @@ -28,15 +28,15 @@ public static void main(String[] args) { } } /* Output: -[class Circlecolor[RED] xPos[58] yPos[55] dim[93] -, class Squarecolor[RED] xPos[61] yPos[61] dim[29] -, class Linecolor[GREEN] xPos[68] yPos[0] dim[22] -, class Circlecolor[RED] xPos[7] yPos[88] dim[28] -, class Squarecolor[RED] xPos[51] yPos[89] dim[9] -, class Linecolor[GREEN] xPos[78] yPos[98] dim[61] -, class Circlecolor[RED] xPos[20] yPos[58] dim[16] -, class Squarecolor[RED] xPos[40] yPos[11] dim[22] -, class Linecolor[GREEN] xPos[4] yPos[83] dim[6] -, class Circlecolor[RED] xPos[75] yPos[10] dim[42] +[class CircleColor[RED] xPos[58] yPos[55] dim[93] +, class SquareColor[RED] xPos[61] yPos[61] dim[29] +, class LineColor[GREEN] xPos[68] yPos[0] dim[22] +, class CircleColor[RED] xPos[7] yPos[88] dim[28] +, class SquareColor[RED] xPos[51] yPos[89] dim[9] +, class LineColor[GREEN] xPos[78] yPos[98] dim[61] +, class CircleColor[RED] xPos[20] yPos[58] dim[16] +, class SquareColor[RED] xPos[40] yPos[11] dim[22] +, class LineColor[GREEN] xPos[4] yPos[83] dim[6] +, class CircleColor[RED] xPos[75] yPos[10] dim[42] ] */ diff --git a/serialization/Worm.java b/serialization/Worm.java index 08e3d684d..7959be098 100644 --- a/serialization/Worm.java +++ b/serialization/Worm.java @@ -31,7 +31,7 @@ public Worm(int i, char x) { next = new Worm(i, (char)(x + 1)); } public Worm() { - System.out.println("No-arg constructor"); + System.out.println("Zero-argument constructor"); } @Override public String toString() { StringBuilder result = new StringBuilder(":"); From a75a55dc81f707951f3eb3c2cc0311c17b280bc2 Mon Sep 17 00:00:00 2001 From: Bruce Eckel Date: Fri, 5 Mar 2021 02:28:04 -0700 Subject: [PATCH 308/320] Break out common code from RoShamBo1.java, reuse in patterns --- concurrent/PSP2.txt | 522 +++++--------------------------- enums/Item.java | 12 + enums/Paper.java | 21 ++ enums/RoShamBo1.java | 53 ---- enums/Rock.java | 21 ++ enums/Scissors.java | 21 ++ gradle/subprojects.gradle | 6 + patterns/PaperScissorsRock.java | 69 +---- 8 files changed, 156 insertions(+), 569 deletions(-) create mode 100644 enums/Item.java create mode 100644 enums/Paper.java create mode 100644 enums/Rock.java create mode 100644 enums/Scissors.java diff --git a/concurrent/PSP2.txt b/concurrent/PSP2.txt index f9ed83610..7cdafb838 100644 --- a/concurrent/PSP2.txt +++ b/concurrent/PSP2.txt @@ -1,512 +1,128 @@ -0: ForkJoinPool.commonPool-worker-1 0: main +1: main 2: main -2: ForkJoinPool.commonPool-worker-1 3: main -4: ForkJoinPool.commonPool-worker-1 +4: main 5: main -6: ForkJoinPool.commonPool-worker-1 +6: main 7: main -9: ForkJoinPool.commonPool-worker-1 +8: main 9: main -11: ForkJoinPool.commonPool-worker-1 +10: main 11: main -12: ForkJoinPool.commonPool-worker-1 +12: main 13: main -15: ForkJoinPool.commonPool-worker-1 +14: main 15: main +16: main 17: main 18: main 19: main 20: main 21: main -17: ForkJoinPool.commonPool-worker-1 +22: main 23: main -23: ForkJoinPool.commonPool-worker-1 24: main -25: ForkJoinPool.commonPool-worker-1 +25: main 26: main -27: ForkJoinPool.commonPool-worker-1 +27: main 28: main -29: ForkJoinPool.commonPool-worker-1 +29: main 30: main +31: main 32: main -32: ForkJoinPool.commonPool-worker-1 33: main -35: ForkJoinPool.commonPool-worker-1 -36: ForkJoinPool.commonPool-worker-1 -37: ForkJoinPool.commonPool-worker-1 -38: ForkJoinPool.commonPool-worker-1 +34: main 35: main -39: ForkJoinPool.commonPool-worker-1 -41: ForkJoinPool.commonPool-worker-1 +36: main +37: main +38: main +39: main 40: main -42: ForkJoinPool.commonPool-worker-1 +41: main +42: main 43: main -44: ForkJoinPool.commonPool-worker-1 +44: main 45: main -46: ForkJoinPool.commonPool-worker-1 +46: main 47: main +48: main 49: main 50: main -50: ForkJoinPool.commonPool-worker-1 51: main -52: ForkJoinPool.commonPool-worker-1 +52: main 53: main -55: ForkJoinPool.commonPool-worker-1 +54: main 55: main -56: ForkJoinPool.commonPool-worker-1 -58: ForkJoinPool.commonPool-worker-1 +56: main 57: main -59: ForkJoinPool.commonPool-worker-1 +58: main +59: main 60: main -61: ForkJoinPool.commonPool-worker-1 +61: main 62: main -63: ForkJoinPool.commonPool-worker-1 +63: main 64: main -65: ForkJoinPool.commonPool-worker-1 +65: main 66: main -67: ForkJoinPool.commonPool-worker-1 +67: main 68: main -69: ForkJoinPool.commonPool-worker-1 -71: ForkJoinPool.commonPool-worker-1 -72: ForkJoinPool.commonPool-worker-1 +69: main 70: main -73: ForkJoinPool.commonPool-worker-1 -75: ForkJoinPool.commonPool-worker-1 -76: ForkJoinPool.commonPool-worker-1 +71: main +72: main +73: main 74: main -77: ForkJoinPool.commonPool-worker-1 -78: ForkJoinPool.commonPool-worker-1 +75: main +76: main +77: main +78: main 79: main -80: ForkJoinPool.commonPool-worker-1 +80: main 81: main -82: ForkJoinPool.commonPool-worker-1 +82: main 83: main -84: ForkJoinPool.commonPool-worker-1 +84: main 85: main -86: ForkJoinPool.commonPool-worker-1 +86: main 87: main -89: ForkJoinPool.commonPool-worker-1 -90: ForkJoinPool.commonPool-worker-1 +88: main 89: main -91: ForkJoinPool.commonPool-worker-1 +90: main +91: main 92: main -93: ForkJoinPool.commonPool-worker-1 +93: main 94: main -95: ForkJoinPool.commonPool-worker-1 +95: main 96: main +97: main 98: main -97: ForkJoinPool.commonPool-worker-1 99: main -100: ForkJoinPool.commonPool-worker-1 +100: main 101: main -103: ForkJoinPool.commonPool-worker-1 +102: main 103: main -104: ForkJoinPool.commonPool-worker-1 -106: ForkJoinPool.commonPool-worker-1 -107: ForkJoinPool.commonPool-worker-1 +104: main +105: main 106: main -108: ForkJoinPool.commonPool-worker-1 -110: ForkJoinPool.commonPool-worker-1 -108: ForkJoinPool.commonPool-worker-2 -111: ForkJoinPool.commonPool-worker-1 +107: main +108: main +109: main 110: main -113: ForkJoinPool.commonPool-worker-1 -112: ForkJoinPool.commonPool-worker-2 -115: ForkJoinPool.commonPool-worker-1 +111: main +112: main +113: main +114: main +115: main 116: main -116: ForkJoinPool.commonPool-worker-2 -117: ForkJoinPool.commonPool-worker-1 +117: main 118: main -119: ForkJoinPool.commonPool-worker-2 -120: ForkJoinPool.commonPool-worker-1 +119: main +120: main 121: main -123: ForkJoinPool.commonPool-worker-1 +122: main +123: main 124: main -124: ForkJoinPool.commonPool-worker-2 +125: main 126: main -126: ForkJoinPool.commonPool-worker-1 -127: ForkJoinPool.commonPool-worker-2 -128: main -130: ForkJoinPool.commonPool-worker-1 -130: ForkJoinPool.commonPool-worker-2 -131: main -133: ForkJoinPool.commonPool-worker-1 -134: ForkJoinPool.commonPool-worker-2 -134: main -136: ForkJoinPool.commonPool-worker-1 -137: main -137: ForkJoinPool.commonPool-worker-2 -138: ForkJoinPool.commonPool-worker-1 -140: main -140: ForkJoinPool.commonPool-worker-2 -141: ForkJoinPool.commonPool-worker-1 -143: main -143: ForkJoinPool.commonPool-worker-2 -145: ForkJoinPool.commonPool-worker-1 -146: main -146: ForkJoinPool.commonPool-worker-2 -148: ForkJoinPool.commonPool-worker-1 -149: main -149: ForkJoinPool.commonPool-worker-2 -151: ForkJoinPool.commonPool-worker-1 -152: ForkJoinPool.commonPool-worker-2 -154: ForkJoinPool.commonPool-worker-1 -154: ForkJoinPool.commonPool-worker-2 -152: main -156: ForkJoinPool.commonPool-worker-1 -156: ForkJoinPool.commonPool-worker-2 -159: ForkJoinPool.commonPool-worker-1 -159: ForkJoinPool.commonPool-worker-2 -161: ForkJoinPool.commonPool-worker-1 -159: main -162: ForkJoinPool.commonPool-worker-1 -161: ForkJoinPool.commonPool-worker-2 -164: ForkJoinPool.commonPool-worker-1 -163: main -166: ForkJoinPool.commonPool-worker-1 -168: ForkJoinPool.commonPool-worker-1 -168: main -169: ForkJoinPool.commonPool-worker-1 -170: main -167: ForkJoinPool.commonPool-worker-2 -171: ForkJoinPool.commonPool-worker-1 -172: main -168: ForkJoinPool.commonPool-worker-3 -174: ForkJoinPool.commonPool-worker-1 -175: main -178: ForkJoinPool.commonPool-worker-1 -178: main -178: ForkJoinPool.commonPool-worker-3 -175: ForkJoinPool.commonPool-worker-2 -179: ForkJoinPool.commonPool-worker-1 -181: main -183: ForkJoinPool.commonPool-worker-1 -183: ForkJoinPool.commonPool-worker-2 -184: main -184: ForkJoinPool.commonPool-worker-3 -185: ForkJoinPool.commonPool-worker-1 -187: main -187: ForkJoinPool.commonPool-worker-2 -189: ForkJoinPool.commonPool-worker-1 -191: main -189: ForkJoinPool.commonPool-worker-3 -191: ForkJoinPool.commonPool-worker-2 -193: main -193: ForkJoinPool.commonPool-worker-1 -195: ForkJoinPool.commonPool-worker-3 -195: ForkJoinPool.commonPool-worker-2 -197: main -199: ForkJoinPool.commonPool-worker-3 -199: ForkJoinPool.commonPool-worker-2 -197: ForkJoinPool.commonPool-worker-1 -200: main -202: ForkJoinPool.commonPool-worker-3 -203: ForkJoinPool.commonPool-worker-2 -204: ForkJoinPool.commonPool-worker-1 -204: main -205: ForkJoinPool.commonPool-worker-3 -207: ForkJoinPool.commonPool-worker-2 -208: ForkJoinPool.commonPool-worker-1 -208: main -209: ForkJoinPool.commonPool-worker-3 -211: ForkJoinPool.commonPool-worker-2 -211: ForkJoinPool.commonPool-worker-1 -213: main -213: ForkJoinPool.commonPool-worker-3 -215: ForkJoinPool.commonPool-worker-2 -215: ForkJoinPool.commonPool-worker-1 -217: main -217: ForkJoinPool.commonPool-worker-3 -219: ForkJoinPool.commonPool-worker-2 -220: ForkJoinPool.commonPool-worker-1 -221: main -221: ForkJoinPool.commonPool-worker-3 -224: ForkJoinPool.commonPool-worker-1 -225: main -225: ForkJoinPool.commonPool-worker-3 -223: ForkJoinPool.commonPool-worker-2 -227: ForkJoinPool.commonPool-worker-1 -227: main -229: ForkJoinPool.commonPool-worker-3 -229: ForkJoinPool.commonPool-worker-2 -231: ForkJoinPool.commonPool-worker-1 -231: main -233: ForkJoinPool.commonPool-worker-3 -233: ForkJoinPool.commonPool-worker-2 -235: ForkJoinPool.commonPool-worker-1 -236: main -237: ForkJoinPool.commonPool-worker-3 -237: ForkJoinPool.commonPool-worker-2 -239: ForkJoinPool.commonPool-worker-1 -241: main -241: ForkJoinPool.commonPool-worker-2 -241: ForkJoinPool.commonPool-worker-3 -243: ForkJoinPool.commonPool-worker-1 -244: main -244: ForkJoinPool.commonPool-worker-2 -245: ForkJoinPool.commonPool-worker-3 -247: ForkJoinPool.commonPool-worker-1 -249: ForkJoinPool.commonPool-worker-3 -251: ForkJoinPool.commonPool-worker-3 -250: ForkJoinPool.commonPool-worker-1 -251: ForkJoinPool.commonPool-worker-2 -253: ForkJoinPool.commonPool-worker-3 -254: ForkJoinPool.commonPool-worker-1 -254: ForkJoinPool.commonPool-worker-2 -251: main -255: ForkJoinPool.commonPool-worker-3 -257: ForkJoinPool.commonPool-worker-1 -257: ForkJoinPool.commonPool-worker-2 -259: ForkJoinPool.commonPool-worker-3 -261: ForkJoinPool.commonPool-worker-1 -261: ForkJoinPool.commonPool-worker-2 -262: ForkJoinPool.commonPool-worker-3 -263: ForkJoinPool.commonPool-worker-1 -264: ForkJoinPool.commonPool-worker-2 -265: ForkJoinPool.commonPool-worker-3 -267: ForkJoinPool.commonPool-worker-1 -267: ForkJoinPool.commonPool-worker-2 -261: main -268: ForkJoinPool.commonPool-worker-3 -269: ForkJoinPool.commonPool-worker-1 -270: ForkJoinPool.commonPool-worker-2 -272: ForkJoinPool.commonPool-worker-3 -273: ForkJoinPool.commonPool-worker-1 -276: ForkJoinPool.commonPool-worker-3 -276: ForkJoinPool.commonPool-worker-1 -274: ForkJoinPool.commonPool-worker-2 -277: ForkJoinPool.commonPool-worker-3 -279: ForkJoinPool.commonPool-worker-1 -279: ForkJoinPool.commonPool-worker-2 -275: main -281: ForkJoinPool.commonPool-worker-1 -280: ForkJoinPool.commonPool-worker-3 -282: ForkJoinPool.commonPool-worker-2 -285: ForkJoinPool.commonPool-worker-1 -286: ForkJoinPool.commonPool-worker-3 -286: ForkJoinPool.commonPool-worker-2 -288: ForkJoinPool.commonPool-worker-1 -289: ForkJoinPool.commonPool-worker-3 -289: ForkJoinPool.commonPool-worker-2 -286: main -291: ForkJoinPool.commonPool-worker-1 -292: ForkJoinPool.commonPool-worker-3 -293: ForkJoinPool.commonPool-worker-2 -293: main -296: ForkJoinPool.commonPool-worker-3 -296: ForkJoinPool.commonPool-worker-2 -297: main -297: ForkJoinPool.commonPool-worker-1 -299: ForkJoinPool.commonPool-worker-3 -299: ForkJoinPool.commonPool-worker-2 -301: main -301: ForkJoinPool.commonPool-worker-1 -303: ForkJoinPool.commonPool-worker-3 -303: ForkJoinPool.commonPool-worker-2 -305: main -305: ForkJoinPool.commonPool-worker-1 -307: ForkJoinPool.commonPool-worker-3 -307: ForkJoinPool.commonPool-worker-2 -309: main -309: ForkJoinPool.commonPool-worker-1 -311: ForkJoinPool.commonPool-worker-3 -311: ForkJoinPool.commonPool-worker-2 -313: main -313: ForkJoinPool.commonPool-worker-1 -315: ForkJoinPool.commonPool-worker-3 -315: ForkJoinPool.commonPool-worker-2 -317: ForkJoinPool.commonPool-worker-1 -319: ForkJoinPool.commonPool-worker-3 -319: ForkJoinPool.commonPool-worker-2 -320: ForkJoinPool.commonPool-worker-1 -322: ForkJoinPool.commonPool-worker-3 -317: main -323: ForkJoinPool.commonPool-worker-1 -322: ForkJoinPool.commonPool-worker-2 -324: ForkJoinPool.commonPool-worker-3 -328: main -328: ForkJoinPool.commonPool-worker-3 -328: ForkJoinPool.commonPool-worker-2 -330: ForkJoinPool.commonPool-worker-3 -329: main -331: ForkJoinPool.commonPool-worker-2 -332: ForkJoinPool.commonPool-worker-3 -334: ForkJoinPool.commonPool-worker-2 -335: main -335: ForkJoinPool.commonPool-worker-3 -337: ForkJoinPool.commonPool-worker-2 -338: main -338: ForkJoinPool.commonPool-worker-3 -340: ForkJoinPool.commonPool-worker-2 -341: main -341: ForkJoinPool.commonPool-worker-3 -343: ForkJoinPool.commonPool-worker-2 -343: main -344: ForkJoinPool.commonPool-worker-3 -346: ForkJoinPool.commonPool-worker-2 -347: main -347: ForkJoinPool.commonPool-worker-3 -349: ForkJoinPool.commonPool-worker-2 -350: main -350: ForkJoinPool.commonPool-worker-3 -351: ForkJoinPool.commonPool-worker-2 -353: main -353: ForkJoinPool.commonPool-worker-3 -355: ForkJoinPool.commonPool-worker-2 -356: main -356: ForkJoinPool.commonPool-worker-3 -358: ForkJoinPool.commonPool-worker-2 -359: main -359: ForkJoinPool.commonPool-worker-3 -361: ForkJoinPool.commonPool-worker-2 -362: main -362: ForkJoinPool.commonPool-worker-3 -365: main -364: ForkJoinPool.commonPool-worker-2 -365: ForkJoinPool.commonPool-worker-3 -366: main -368: ForkJoinPool.commonPool-worker-2 -369: main -369: ForkJoinPool.commonPool-worker-3 -372: ForkJoinPool.commonPool-worker-3 -371: ForkJoinPool.commonPool-worker-2 -372: main -374: ForkJoinPool.commonPool-worker-3 -374: ForkJoinPool.commonPool-worker-2 -376: ForkJoinPool.commonPool-worker-3 -377: ForkJoinPool.commonPool-worker-2 -378: ForkJoinPool.commonPool-worker-3 -376: main -379: ForkJoinPool.commonPool-worker-2 -380: ForkJoinPool.commonPool-worker-3 -382: ForkJoinPool.commonPool-worker-2 -383: ForkJoinPool.commonPool-worker-3 -384: ForkJoinPool.commonPool-worker-2 -385: ForkJoinPool.commonPool-worker-3 -383: main -386: ForkJoinPool.commonPool-worker-2 -387: ForkJoinPool.commonPool-worker-3 -390: ForkJoinPool.commonPool-worker-2 -390: ForkJoinPool.commonPool-worker-3 -392: ForkJoinPool.commonPool-worker-2 -392: ForkJoinPool.commonPool-worker-3 -390: main -394: ForkJoinPool.commonPool-worker-2 -394: ForkJoinPool.commonPool-worker-3 -397: ForkJoinPool.commonPool-worker-2 -397: ForkJoinPool.commonPool-worker-3 -399: ForkJoinPool.commonPool-worker-2 -397: main -400: ForkJoinPool.commonPool-worker-3 -401: ForkJoinPool.commonPool-worker-3 -401: ForkJoinPool.commonPool-worker-2 -404: ForkJoinPool.commonPool-worker-3 -404: ForkJoinPool.commonPool-worker-2 -403: main -406: ForkJoinPool.commonPool-worker-3 -406: ForkJoinPool.commonPool-worker-2 -408: main -409: ForkJoinPool.commonPool-worker-3 -409: ForkJoinPool.commonPool-worker-2 -411: main -412: ForkJoinPool.commonPool-worker-3 -412: ForkJoinPool.commonPool-worker-2 -414: main -414: ForkJoinPool.commonPool-worker-3 -415: ForkJoinPool.commonPool-worker-2 -418: ForkJoinPool.commonPool-worker-3 -418: ForkJoinPool.commonPool-worker-2 -419: ForkJoinPool.commonPool-worker-3 -420: ForkJoinPool.commonPool-worker-2 -421: ForkJoinPool.commonPool-worker-3 -422: ForkJoinPool.commonPool-worker-2 -423: ForkJoinPool.commonPool-worker-3 -424: ForkJoinPool.commonPool-worker-2 -425: ForkJoinPool.commonPool-worker-3 -426: ForkJoinPool.commonPool-worker-2 -427: ForkJoinPool.commonPool-worker-3 -428: ForkJoinPool.commonPool-worker-2 -430: ForkJoinPool.commonPool-worker-2 -430: ForkJoinPool.commonPool-worker-3 -432: ForkJoinPool.commonPool-worker-3 -432: ForkJoinPool.commonPool-worker-2 -433: ForkJoinPool.commonPool-worker-3 -434: ForkJoinPool.commonPool-worker-2 -435: ForkJoinPool.commonPool-worker-3 -436: ForkJoinPool.commonPool-worker-2 -437: ForkJoinPool.commonPool-worker-3 -438: ForkJoinPool.commonPool-worker-2 -439: ForkJoinPool.commonPool-worker-3 -440: ForkJoinPool.commonPool-worker-2 -441: ForkJoinPool.commonPool-worker-3 -442: ForkJoinPool.commonPool-worker-2 -443: ForkJoinPool.commonPool-worker-3 -444: ForkJoinPool.commonPool-worker-2 -445: ForkJoinPool.commonPool-worker-3 -446: ForkJoinPool.commonPool-worker-2 -447: ForkJoinPool.commonPool-worker-3 -448: ForkJoinPool.commonPool-worker-2 -449: ForkJoinPool.commonPool-worker-3 -450: ForkJoinPool.commonPool-worker-2 -451: ForkJoinPool.commonPool-worker-3 -452: ForkJoinPool.commonPool-worker-2 -453: ForkJoinPool.commonPool-worker-3 -454: ForkJoinPool.commonPool-worker-2 -456: ForkJoinPool.commonPool-worker-2 -455: ForkJoinPool.commonPool-worker-3 -458: ForkJoinPool.commonPool-worker-3 -457: ForkJoinPool.commonPool-worker-2 -459: ForkJoinPool.commonPool-worker-3 -460: ForkJoinPool.commonPool-worker-2 -461: ForkJoinPool.commonPool-worker-3 -462: ForkJoinPool.commonPool-worker-2 -463: ForkJoinPool.commonPool-worker-3 -464: ForkJoinPool.commonPool-worker-2 -465: ForkJoinPool.commonPool-worker-3 -466: ForkJoinPool.commonPool-worker-2 -467: ForkJoinPool.commonPool-worker-3 -468: ForkJoinPool.commonPool-worker-2 -469: ForkJoinPool.commonPool-worker-3 -470: ForkJoinPool.commonPool-worker-2 -471: ForkJoinPool.commonPool-worker-3 -472: ForkJoinPool.commonPool-worker-2 -473: ForkJoinPool.commonPool-worker-3 -474: ForkJoinPool.commonPool-worker-2 -475: ForkJoinPool.commonPool-worker-3 -476: ForkJoinPool.commonPool-worker-2 -477: ForkJoinPool.commonPool-worker-3 -478: ForkJoinPool.commonPool-worker-2 -479: ForkJoinPool.commonPool-worker-3 -480: ForkJoinPool.commonPool-worker-2 -482: ForkJoinPool.commonPool-worker-2 -481: ForkJoinPool.commonPool-worker-3 -484: ForkJoinPool.commonPool-worker-3 -484: ForkJoinPool.commonPool-worker-2 -327: ForkJoinPool.commonPool-worker-1 -485: ForkJoinPool.commonPool-worker-3 -486: ForkJoinPool.commonPool-worker-2 -488: ForkJoinPool.commonPool-worker-3 -488: ForkJoinPool.commonPool-worker-1 -489: ForkJoinPool.commonPool-worker-2 -490: ForkJoinPool.commonPool-worker-3 -491: ForkJoinPool.commonPool-worker-1 -492: ForkJoinPool.commonPool-worker-2 -495: ForkJoinPool.commonPool-worker-2 -493: ForkJoinPool.commonPool-worker-3 -496: ForkJoinPool.commonPool-worker-2 -497: ForkJoinPool.commonPool-worker-3 -499: ForkJoinPool.commonPool-worker-3 -500: ForkJoinPool.commonPool-worker-3 -501: ForkJoinPool.commonPool-worker-3 -502: ForkJoinPool.commonPool-worker-3 -503: ForkJoinPool.commonPool-worker-3 -504: ForkJoinPool.commonPool-worker-3 -505: ForkJoinPool.commonPool-worker-3 -506: ForkJoinPool.commonPool-worker-3 -507: ForkJoinPool.commonPool-worker-3 -508: ForkJoinPool.commonPool-worker-3 -509: ForkJoinPool.commonPool-worker-3 -510: ForkJoinPool.commonPool-worker-3 -511: ForkJoinPool.commonPool-worker-3 +127: main diff --git a/enums/Item.java b/enums/Item.java new file mode 100644 index 000000000..1fd45d2fe --- /dev/null +++ b/enums/Item.java @@ -0,0 +1,12 @@ +// enums/Item.java +// (c)2021 MindView LLC: see Copyright.txt +// We make no guarantees that this code is fit for any purpose. +// Visit http://OnJava8.com for more book information. +package enums; + +public interface Item { + Outcome compete(Item it); + Outcome eval(Paper p); + Outcome eval(Scissors s); + Outcome eval(Rock r); +} diff --git a/enums/Paper.java b/enums/Paper.java new file mode 100644 index 000000000..7273a5c18 --- /dev/null +++ b/enums/Paper.java @@ -0,0 +1,21 @@ +// enums/Paper.java +// (c)2021 MindView LLC: see Copyright.txt +// We make no guarantees that this code is fit for any purpose. +// Visit http://OnJava8.com for more book information. +package enums; +import static enums.Outcome.*; + +public class Paper implements Item { + @Override public Outcome compete(Item it) { + return it.eval(this); + } + @Override + public Outcome eval(Paper p) { return DRAW; } + @Override + public Outcome eval(Scissors s) { return WIN; } + @Override + public Outcome eval(Rock r) { return LOSE; } + @Override public String toString() { + return "Paper"; + } +} diff --git a/enums/RoShamBo1.java b/enums/RoShamBo1.java index bf77aad82..d20f0bbcd 100644 --- a/enums/RoShamBo1.java +++ b/enums/RoShamBo1.java @@ -6,59 +6,6 @@ // {java enums.RoShamBo1} package enums; import java.util.*; -import static enums.Outcome.*; - -interface Item { - Outcome compete(Item it); - Outcome eval(Paper p); - Outcome eval(Scissors s); - Outcome eval(Rock r); -} - -class Paper implements Item { - @Override public Outcome compete(Item it) { - return it.eval(this); - } - @Override - public Outcome eval(Paper p) { return DRAW; } - @Override - public Outcome eval(Scissors s) { return WIN; } - @Override - public Outcome eval(Rock r) { return LOSE; } - @Override public String toString() { - return "Paper"; - } -} - -class Scissors implements Item { - @Override public Outcome compete(Item it) { - return it.eval(this); - } - @Override - public Outcome eval(Paper p) { return LOSE; } - @Override - public Outcome eval(Scissors s) { return DRAW; } - @Override - public Outcome eval(Rock r) { return WIN; } - @Override public String toString() { - return "Scissors"; - } -} - -class Rock implements Item { - @Override public Outcome compete(Item it) { - return it.eval(this); - } - @Override - public Outcome eval(Paper p) { return WIN; } - @Override - public Outcome eval(Scissors s) { return LOSE; } - @Override - public Outcome eval(Rock r) { return DRAW; } - @Override public String toString() { - return "Rock"; - } -} public class RoShamBo1 { static final int SIZE = 20; diff --git a/enums/Rock.java b/enums/Rock.java new file mode 100644 index 000000000..f9e5f7046 --- /dev/null +++ b/enums/Rock.java @@ -0,0 +1,21 @@ +// enums/Rock.java +// (c)2021 MindView LLC: see Copyright.txt +// We make no guarantees that this code is fit for any purpose. +// Visit http://OnJava8.com for more book information. +package enums; +import static enums.Outcome.*; + +public class Rock implements Item { + @Override public Outcome compete(Item it) { + return it.eval(this); + } + @Override + public Outcome eval(Paper p) { return WIN; } + @Override + public Outcome eval(Scissors s) { return LOSE; } + @Override + public Outcome eval(Rock r) { return DRAW; } + @Override public String toString() { + return "Rock"; + } +} diff --git a/enums/Scissors.java b/enums/Scissors.java new file mode 100644 index 000000000..45bab4996 --- /dev/null +++ b/enums/Scissors.java @@ -0,0 +1,21 @@ +// enums/Scissors.java +// (c)2021 MindView LLC: see Copyright.txt +// We make no guarantees that this code is fit for any purpose. +// Visit http://OnJava8.com for more book information. +package enums; +import static enums.Outcome.*; + +public class Scissors implements Item { + @Override public Outcome compete(Item it) { + return it.eval(this); + } + @Override + public Outcome eval(Paper p) { return LOSE; } + @Override + public Outcome eval(Scissors s) { return DRAW; } + @Override + public Outcome eval(Rock r) { return WIN; } + @Override public String toString() { + return "Scissors"; + } +} diff --git a/gradle/subprojects.gradle b/gradle/subprojects.gradle index e4fb9764a..945aa9231 100644 --- a/gradle/subprojects.gradle +++ b/gradle/subprojects.gradle @@ -58,6 +58,12 @@ project(':collections') { } } +project(':patterns') { + dependencies { + compile project(':enums') + } +} + configure(subprojects - project(':onjava')) { dependencies { compile project(':onjava') diff --git a/patterns/PaperScissorsRock.java b/patterns/PaperScissorsRock.java index ce48dd4d5..478ac6755 100644 --- a/patterns/PaperScissorsRock.java +++ b/patterns/PaperScissorsRock.java @@ -6,72 +6,15 @@ import java.util.*; import java.util.function.*; import java.util.stream.*; +import enums.Outcome; +import static enums.Outcome.*; +import enums.Item; +import enums.Paper; +import enums.Scissors; +import enums.Rock; import onjava.*; import static onjava.Tuple.*; -enum Outcome { WIN, LOSE, DRAW } - -interface Item { - Outcome compete(Item it); - Outcome eval(Paper p); - Outcome eval(Scissors s); - Outcome eval(Rock r); -} - -class Paper implements Item { - @Override public Outcome compete(Item it) { - return it.eval(this); - } - @Override public Outcome eval(Paper p) { - return Outcome.DRAW; - } - @Override public Outcome eval(Scissors s) { - return Outcome.WIN; - } - @Override public Outcome eval(Rock r) { - return Outcome.LOSE; - } - @Override public String toString() { - return "Paper"; - } -} - -class Scissors implements Item { - @Override public Outcome compete(Item it) { - return it.eval(this); - } - @Override public Outcome eval(Paper p) { - return Outcome.LOSE; - } - @Override public Outcome eval(Scissors s) { - return Outcome.DRAW; - } - @Override public Outcome eval(Rock r) { - return Outcome.WIN; - } - @Override public String toString() { - return "Scissors"; - } -} - -class Rock implements Item { - @Override public Outcome compete(Item it) { - return it.eval(this); - } - @Override public Outcome eval(Paper p) { - return Outcome.WIN; - } - @Override public Outcome eval(Scissors s) { - return Outcome.LOSE; - } - @Override public Outcome eval(Rock r) { - return Outcome.DRAW; - } - @Override public String toString() { - return "Rock"; - } -} - class ItemFactory { static List> items = Arrays.asList( From 5ef986390e83eddc010b8f45d2c18624ba0e94cd Mon Sep 17 00:00:00 2001 From: Bruce Eckel Date: Sun, 18 Apr 2021 09:35:27 -0600 Subject: [PATCH 309/320] Fixed issue #46 --- generics/Diamond.java | 6 ++---- generics/GenericHolder.java | 2 +- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/generics/Diamond.java b/generics/Diamond.java index c7daa484d..9ebc43d37 100644 --- a/generics/Diamond.java +++ b/generics/Diamond.java @@ -3,11 +3,9 @@ // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. -class Bob {} - public class Diamond { public static void main(String[] args) { - GenericHolder h3 = new GenericHolder<>(); - h3.set(new Bob()); + GenericHolder h3 = + new GenericHolder<>(); } } diff --git a/generics/GenericHolder.java b/generics/GenericHolder.java index b04aa17a8..15cfbb9e1 100644 --- a/generics/GenericHolder.java +++ b/generics/GenericHolder.java @@ -10,7 +10,7 @@ public GenericHolder() {} public T get() { return a; } public static void main(String[] args) { GenericHolder h3 = - new GenericHolder<>(); + new GenericHolder(); h3.set(new Automobile()); // type checked Automobile a = h3.get(); // No cast needed //- h3.set("Not an Automobile"); // Error From d911e390d6439a615e7116ecfc0f5fd57ddda869 Mon Sep 17 00:00:00 2001 From: Bruce Eckel Date: Wed, 21 Apr 2021 11:15:54 -0600 Subject: [PATCH 310/320] Update README.md --- README.md | 349 ++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 339 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index b2ad92597..b71fd296d 100644 --- a/README.md +++ b/README.md @@ -1,11 +1,313 @@ -# Example Source Code for the Book "On Java 8" by Bruce Eckel +# Examples for *On Java 8* by Bruce Eckel -Download the latest release from [here](https://github.com/BruceEckel/OnJava8-Examples/releases/). +If you want to experiment with the code examples from the book [On Java +8](https://www.onjava8.com/), you're in the right place. -To compile and run these programs, you only need JDK 8 installed. -Invoking `gradlew` will automatically download and install Gradle. -Gradle will also install all additional libraries necessary to compile -and run the Java examples in the book. +These examples are automatically extracted directly from the book. This repository +includes tests to verify that the code in the book is correct. + +## Contents + +- [Building From the Command Line: Quick Version](#building-from-the-command-line-quick-version) +- [Building From the Command Line: Detailed Instructions](#building-from-the-command-line-detailed-instructions) + * [Install Java](#install-java) + + [Windows](#windows) + + [Macintosh](#macintosh) + + [Linux](#linux) + * [Verify Your Installation](#verify-your-installation) + * [Installing and Running the Book Examples](#installing-and-running-the-book-examples) +- [Appendix A: Command-Line Basics](#appendix-a-command-line-basics) + * [Editors](#editors) + * [The Shell](#the-shell) + + [Starting a Shell](#starting-a-shell) + + [Directories](#directories) + + [Basic Shell Operations](#basic-shell-operations) + + [Unpacking a Zip Archive](#unpacking-a-zip-archive) +- [Appendix B: Testing](#appendix-b-testing) +- [Troubleshooting](#troubleshooting) + +# Building From the Command Line: Quick Version + +Before you can run the examples from this repository, you must install +[JDK8](http://www.oracle.com/technetwork/java/javase/downloads/index.html), the +*Java Development Kit* for version 8 of the language. + +If you just want to download and check the code, [Download +Here](https://github.com/BruceEckel/OnJava8-Examples/archive/refs/heads/master.zip) +and [unzip it](#unpacking-a-zip-archive) into your destination directory. Open +a [shell/command window](#appendix-a-command-line-basics) and move into the +root of that directory. You'll know you are in the right directory if you see +the files `gradlew` and `gradlew.bat`. + +You'll need an Internet connection the first time you compile the code, +because Gradle needs to first install itself, then all the support libraries. +Once these are installed you can perform additional compiling and running +offline. + +On Mac/Linux, enter: + +``` +./gradlew test +``` + +(If you get a *Permission denied* error, run `chmod +x ./gradlew`) + +On Windows, enter + +``` +gradlew test +``` + +If all goes well, the tests will run. Everything should complete without errors. + +All the book examples are in the subdirectory `Examples` in subdirectories +corresponding to the atom names. + +# Building From the Command Line: Detailed Instructions + +If you are not familiar with the command line, first read [Command-Line +Basics](#appendix-a-command-line-basics). + +## Install Java + +You must first install the *Java Development Kit* (JDK). + +### Windows + +1. Follow the instructions to [install Chocolatey](https://chocolatey.org/). + +2. At a [shell prompt](#appendix-a-command-line-basics), type: `choco install +jdk8` (you may also select a more recent version, like `jdk11`). The +installation process takes some time, but when it's finished Java is installed +and the necessary environment variables are set. + +### Macintosh + +The Mac comes with a much older version of Java that won't work for the +examples in this book, so you'll need to update it to (at least) Java 8. + + 1. Follow the instructions at this link to [Install HomeBrew](http://brew.sh/) + + 2. At a [shell prompt](#appendix-a-command-line-basics), first type + `brew update`. When that completes, enter `brew cask install java`. + +**NOTE:** Sometimes the default version of Java that you get with the above +installation will be too recent and not validated by the Mac's security +system. If this happens you'll either need to turn off the security by hand +or install an earlier version of Java. For either choice, you'll need to Google +for answers on how to solve the problem (often the easiest approach is to just +search for the error message produced by the Mac). + +### Linux + +Use the standard package installer with the following [shell commands](#appendix-a-command-line-basics): + +*Ubuntu/Debian*: + + 1. `sudo apt-get update` + + 2. `sudo apt-get install default-jdk` + +*Fedora/Redhat*: + +``` +su -c "yum install java-1.8.0-openjdk" +``` + +## Verify Your Installation + +[Open a new shell](#appendix-a-command-line-basics) and type: + +``` +java -version +``` + +You should see something like the following (Version numbers and actual text +will vary): + +``` +openjdk version "11" 2018-09-25 +OpenJDK Runtime Environment 18.9 (build 11+28) +OpenJDK 64-Bit Server VM 18.9 (build 11+28, mixed mode) +``` + +If you see a message that the command is not found or not recognized, review +the installation instructions. If you still can't get it to work, check +[StackOverflow](http://stackoverflow.com/search?q=installing+java). + +## Installing and Running the Book Examples + +Once you have Java installed, the process to install and run the book examples +is the same for all platforms: + +1. Download the book examples from the +[GitHub Repository](https://github.com/BruceEckel/OnJava8-Examples/archive/refs/heads/master.zip). + +2. [Unzip](#unpacking-a-zip-archive) the downloaded file into the directory of your choice. + +3. Use the Windows Explorer, the Mac Finder, or Nautilus or equivalent on Linux +to browse to the directory where you uzipped `OnJava8-Examples`, and +[open a shell](#appendix-a-command-line-basics) there. + +4. If you're in the right directory, you should see files named `gradlew` and +`gradlew.bat` in that directory, along with numerous other files and +directories. The directories correspond to the chapters in the book. + +5. At the shell prompt, type `gradlew test` (Windows) or `./gradlew test` +(Mac/Linux). + +The first time you do this, Gradle will install itself and numerous other +packages, so it will take some time. After everything is installed, subsequent +builds and runs will be much faster. + +Note that you must be connected to the Internet the first time you run `gradlew` +so that Gradle can download the necessary packages. + +# Appendix A: Command-Line Basics + +Because it is possible for a "dedicated beginner" to learn programming from +this book, you may not have previously used your computer's command-line shell. +If you have, you can go directly to the +[installation instructions](#building-from-the-command-line-detailed-instructions). + +## Editors + +To create and modify Java program files—the code listings shown in this +book—you need a program called an *editor*. You'll also need the editor to +make changes to your system configuration files, which is sometimes required +during installation. + +Programming editors vary from heavyweight *Integrated Development Environments* +(IDEs, like Eclipse, NetBeans and IntelliJ IDEA) to more basic text +manipulation applications. If you already have an IDE and are comfortable with +it, feel free to use that for this book. + +Numerous explanations in this book are specific to IntelliJ IDEA so if you +don't already have an IDE you might as well start with IDEA. There are many +other editors; these are a subculture unto themselves and people sometimes get +into heated arguments about their merits. If you find one you like better, it's +not too hard to change. The important thing is to choose one and get +comfortable with it. + +## The Shell + +If you haven't programmed before, you might be unfamiliar with your operating +system *shell* (also called the *command prompt* in Windows). The shell harkens +back to the early days of computing when everything happened by typing commands +and the computer responded by displaying responses—everything was text-based. + +Although it can seem primitive in the age of graphical user interfaces, a shell +provides a surprising number of valuable features. + +To learn more about your shell than we cover here, see +[Bash Shell](https://en.wikipedia.org/wiki/Bash_(Unix_shell)) for Mac/Linux +or [Windows Shell](https://en.wikipedia.org/wiki/Windows_shell). + +### Starting a Shell + +**Mac**: Click on the *Spotlight* (the magnifying-glass icon in the upper-right +corner of the screen) and type "terminal." Click on the application that looks +like a little TV screen (you might also be able to hit "Return"). This starts a +shell in your home directory. + +**Windows**: First, start the Windows Explorer to navigate through your +directories: + +- *Windows 7*: click the "Start" button in the lower left corner of the screen. +In the Start Menu search box area type "explorer" and then press the "Enter" +key. + +- *Windows 8*: click Windows+Q, type "explorer" and then press the "Enter" key. + +- *Windows 10*: click Windows+E. + +Once the Windows Explorer is running, move through the folders on your computer +by double-clicking on them with the mouse. Navigate to the desired folder. Now +click the file tab at the top left of the Explorer window and select "Open +Windows Powershell." This opens a shell in the destination directory. + +**Linux**: To open a shell in your home directory: + +- *Debian*: Press Alt+F2. In the dialog that pops up, type 'gnome-terminal' + +- *Ubuntu*: Either right-click on the desktop and select 'Open Terminal', or + press Ctrl+Alt+T + +- *Redhat*: Right-click on the desktop and select 'Open Terminal' + +- *Fedora*: Press Alt+F2. In the dialog that pops up, type 'gnome-terminal' + + +### Directories + +*Directories* are one of the fundamental elements of a shell. Directories hold +files, as well as other directories. Think of a directory as a tree with +branches. If `books` is a directory on your system and it has two other +directories as branches, for example `math` and `art`, we say that you have a +directory `books` with two *subdirectories* `math` and `art`. We refer to them +as `books/math` and `books/art` since `books` is their *parent* directory. +Note that Windows uses backslashes rather than forward slashes to separate the +parts of a directory. + +### Basic Shell Operations + +The shell operations shown here are approximately identical across operating +systems. For the purposes of this book, here are the essential operations in a +shell: + +- **Change directory**: Use `cd` followed by the name of the + directory where you want to move, or `cd ..` if you want to move + up a directory. If you want to move to a different directory while + remembering where you came from, use `pushd` followed by the different + directory name. Then, to return to the previous directory, just say + `popd`. + +- **Directory listing**: `ls` (`dir` in Windows) displays all the files and + subdirectory names in the current directory. Use the wildcard `*` (asterisk) to + narrow your search. For example, if you want to list all the files ending in + ".kt," you say `ls *.kt` (Windows: `dir *.kt`). If you want to list the + files starting with "F" and ending in ".kt," you say `ls F*.kt` (Windows: + `dir F*.kt`). + +- **Create a directory**: use the `mkdir` ("make directory") command + (Windows: `md`), followed by the name of the directory you want to create. + For example, `mkdir books` (Windows: `md books`). + +- **Remove a file**: Use `rm` ("remove") followed by the name of the file + you wish to remove (Windows: `del`). For example, `rm somefile.kt` (Windows: + `del somefile.kt`). + +- **Remove a directory**: use the `rm -r` command to remove the files in + the directory and the directory itself (Windows: `deltree`). For example, + `rm -r books` (Windows: `deltree books`). + +- **Repeat a command**: The "up arrow" on all three operating + systems moves through previous commands so you can edit and + repeat them. On Mac/Linux, `!!` repeats the last command and + `!n` repeats the nth command. + +- **Command history**: Use `history` in Mac/Linux or press the F7 key in Windows. + This gives you a list of all the commands you've entered. Mac/Linux provides + numbers to refer to when you want to repeat a command. + +### Unpacking a Zip Archive + +A file name ending with `.zip` is an archive containing other files in a +compressed format. Both Linux and Mac have command-line `unzip` utilities, and +it's possible to install a command-line `unzip` for Windows via the Internet. + +However, in all three systems the graphical file browser (Windows Explorer, the +Mac Finder, or Nautilus or equivalent on Linux) will browse to the directory +containing your zip file. Then right-mouse-click on the file and select "Open" +on the Mac, "Extract Here" on Linux, or "Extract all ..." on Windows. + +# Appendix B: Testing + +The test system is built in so that we (the authors) can verify the correctness +of what goes into the book. + +You don't need to run the tests, but if you want to, you can just run `gradlew +test` (on Windows) or `./gradlew test` (Mac/Linux). To compile and run everything, the command is: @@ -32,12 +334,39 @@ program in the **strings** chapter subdirectory: `gradlew :strings:ReplacingStringTokenizer` -However, if the file name is unique throughout the book (the majority are), you can just give the -program name, like this: +However, if the file name is unique throughout the book (the majority are), you +can just give the program name, like this: `gradlew ReplacingStringTokenizer` -Note that all commands are run from the base directory where the example code is installed, and where you find the -`gradlew` script. +Note that all commands are run from the base directory where the example code is +installed, and where you find the `gradlew` script. You can learn about other options by just typing `gradlew` with no arguments. + +# Troubleshooting + +If any terminology or processes described here remain unclear to you, you can +usually find explanations or answers through [Google](https://www.google.com/). +For more specific issues or problems, try +[StackOverflow](http://stackoverflow.com/). Sometimes you can find installation +instructions on [YouTube](https://www.youtube.com/). + +Sometimes a Gradle build will be unable to connect to the internet and download +the necessary components, producing an error message containing: + +``` +javax.net.ssl.SSLException: java.lang.RuntimeException: Unexpected error: java.security.InvalidAlgorithmParameterException: the trustAnchors parameter must be non-empty +``` + +Normally this means you have multiple Java installations on your machine +(applications built with Java ordinarily install their own version of Java), and +somehow the `cacerts` security file is interfering with the `cacerts` file for +the Java you have installed. It can be difficult to know which `cacerts` file is +interfering with yours. The brute-force approach is to search for all the +`cacerts` files on your machine and begin uninstalling the associated +applications---or in some cases, simply removing the directory containing the +`cacerts` file---until the Gradle build begins to work. You might also need to +adjust some environment variables and/or your path. Once you get the Gradle +build working successfully, you should be able to reinstall any applications you +removed in the process. From a545bd39c027737727f8d24ba5dfb90b81b9a8de Mon Sep 17 00:00:00 2001 From: Bruce Eckel Date: Wed, 21 Apr 2021 11:24:15 -0600 Subject: [PATCH 311/320] Update README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index b71fd296d..5f975e29e 100644 --- a/README.md +++ b/README.md @@ -24,7 +24,7 @@ includes tests to verify that the code in the book is correct. + [Basic Shell Operations](#basic-shell-operations) + [Unpacking a Zip Archive](#unpacking-a-zip-archive) - [Appendix B: Testing](#appendix-b-testing) -- [Troubleshooting](#troubleshooting) +- [Appendix C: Troubleshooting](#appendix-c-troubleshooting) # Building From the Command Line: Quick Version @@ -344,7 +344,7 @@ installed, and where you find the `gradlew` script. You can learn about other options by just typing `gradlew` with no arguments. -# Troubleshooting +# Appendix C: Troubleshooting If any terminology or processes described here remain unclear to you, you can usually find explanations or answers through [Google](https://www.google.com/). From 816c30e91244eaa77e82a2bddce1dedd453b7a89 Mon Sep 17 00:00:00 2001 From: Bruce Eckel Date: Tue, 6 Jul 2021 10:26:19 -0600 Subject: [PATCH 312/320] Create NOTES.md --- NOTES.md | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 NOTES.md diff --git a/NOTES.md b/NOTES.md new file mode 100644 index 000000000..5401db816 --- /dev/null +++ b/NOTES.md @@ -0,0 +1,3 @@ +For generating table of contents in README.md +https://ecotrust-canada.github.io/markdown-toc/ +(Replace double hyphens with single hyphens after generation) From 9706bfaa651d739a07a937a404486cf21054dded Mon Sep 17 00:00:00 2001 From: Bruce Eckel Date: Fri, 3 Sep 2021 17:55:34 -0600 Subject: [PATCH 313/320] Added support for // {NewFeature} tag for features newer than Java 8 --- .../main/groovy/com/mindviewinc/plugins/TaggingPlugin.groovy | 1 + buildSrc/src/main/groovy/com/mindviewinc/plugins/Tags.groovy | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/buildSrc/src/main/groovy/com/mindviewinc/plugins/TaggingPlugin.groovy b/buildSrc/src/main/groovy/com/mindviewinc/plugins/TaggingPlugin.groovy index a72daddee..518a7d5f2 100644 --- a/buildSrc/src/main/groovy/com/mindviewinc/plugins/TaggingPlugin.groovy +++ b/buildSrc/src/main/groovy/com/mindviewinc/plugins/TaggingPlugin.groovy @@ -26,6 +26,7 @@ class TaggingPlugin implements Plugin { // Exclude java sources that will not compile if (tags.willNotCompile + || tags.newFeature // Uses a feature introduced after Java 8 || (tags.lowLevelAppendix && runningInAppveyor) // Exclude entire lowlevel appendix || (tags.excludeFromAppveyorCI && runningInAppveyor) || (tags.excludeFromTravisCI && runningInTravis) diff --git a/buildSrc/src/main/groovy/com/mindviewinc/plugins/Tags.groovy b/buildSrc/src/main/groovy/com/mindviewinc/plugins/Tags.groovy index 9f343be93..f61ed4d79 100644 --- a/buildSrc/src/main/groovy/com/mindviewinc/plugins/Tags.groovy +++ b/buildSrc/src/main/groovy/com/mindviewinc/plugins/Tags.groovy @@ -10,6 +10,7 @@ class Tags { Boolean throwsException = false Boolean errorOutputExpected = false Boolean excludeFromGradle = false + Boolean newFeature = false // For language feature introduced after Java 8 Boolean ignoreOutput = false // This tag isn't used in the build... String fileRoot String mainClass @@ -45,6 +46,7 @@ class Tags { throwsException = hasTag('ThrowsException') errorOutputExpected = hasTag('ErrorOutputExpected') excludeFromGradle = hasTag('ExcludeFromGradle') + newFeature = hasTag('NewFeature') ignoreOutput = hasTag('IgnoreOutput') javap = extract('javap') // Includes only arguments to command runFirst = extract('RunFirst:') @@ -83,6 +85,7 @@ class Tags { throwsException || errorOutputExpected || excludeFromGradle || + newFeature || ignoreOutput || javaCmd || args || @@ -105,6 +108,7 @@ class Tags { throwsException errorOutputExpected excludeFromGradle + newFeature ignoreOutput fileRoot mainClass From 3a84d492f976d3dd9d7ea6169afd8fe3635899ed Mon Sep 17 00:00:00 2001 From: Bruce Eckel Date: Tue, 7 Sep 2021 14:06:38 -0600 Subject: [PATCH 314/320] Changed from old "compile" to new "implementation" Worked successfully with Gradle 6.8.1 and JDK11 --- gradle/java.gradle | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/gradle/java.gradle b/gradle/java.gradle index eadc4ef94..99898c1d0 100644 --- a/gradle/java.gradle +++ b/gradle/java.gradle @@ -18,7 +18,7 @@ sourceSets { include '*.xml' } } - + test { java { srcDir file("tests") @@ -32,8 +32,8 @@ repositories { dependencies { // Logging: - compile 'org.slf4j:slf4j-api:1.7.21' - compile 'ch.qos.logback:logback-classic:1.1.7' + implementation 'org.slf4j:slf4j-api:1.7.21' + implementation 'ch.qos.logback:logback-classic:1.1.7' // You can also use the JDK's built-in logging as the back end: // compile group: 'org.slf4j:slf4j-jdk14:1.7.21' -} \ No newline at end of file +} From eeb09a6997d48abb1917c9d188f86e301c3c41e0 Mon Sep 17 00:00:00 2001 From: Bruce Eckel Date: Mon, 20 Sep 2021 17:33:35 -0600 Subject: [PATCH 315/320] Partial update to JDK 17 Features --- collections/BasicRecord.java | 29 ++++ collections/CompactConstructor.java | 16 ++ collections/ComposedRecord.java | 10 ++ collections/CopyRecord.java | 18 +++ collections/FinalFields.java | 12 ++ collections/GenericTypeInference.java | 20 +++ collections/ImplementingRecord.java | 14 ++ collections/NestedLocalRecords.java | 12 ++ collections/NormalConstructor.java | 11 ++ collections/PlusTen.java | 20 +++ concurrent/PSP2.txt | 168 ++++++++++++++++++--- exceptions/BetterNullPointerReports.java | 43 ++++++ exceptions/EffectivelyFinalTWR.java | 48 ++++++ exceptions/MessyExceptions.java | 2 +- exceptions/TryWithResources.java | 2 +- housekeeping/ArrayInit.java | 10 +- housekeeping/ForTypeInference.java | 19 +++ housekeeping/NewVarArgs.java | 2 +- housekeeping/PrimitiveOverloading.java | 24 +-- housekeeping/TypeInference.java | 36 +++++ housekeeping/VarArgs.java | 3 +- interfaces/CheckedDowncast.java | 19 +++ interfaces/MICollision.java | 2 +- interfaces/Machine.java | 36 ----- interfaces/MetalWork.java | 39 +++++ interfaces/NonSealed.java | 11 ++ interfaces/PermittedSubclasses.java | 22 +++ interfaces/PrivateInterfaceMethods.java | 54 +++++++ interfaces/SameFile.java | 9 ++ interfaces/Sealed.java | 12 ++ interfaces/SealedCat.java | 6 + interfaces/SealedDog.java | 6 + interfaces/SealedInterface.java | 12 ++ interfaces/SealedPets.java | 6 + interfaces/SealedRecords.java | 12 ++ interfaces/SealedSubclasses.java | 10 ++ onjava/{Operations.java => Operation.java} | 9 +- operators/Equivalence.java | 4 +- operators/Literals.java | 2 +- operators/URShift.java | 3 +- streams/Machine2.java | 23 --- streams/MetalWork2.java | 23 +++ strings/DataPoint.java | 32 ++++ strings/Indentation.java | 33 ++++ strings/TextBlocks.java | 37 +++++ 45 files changed, 822 insertions(+), 119 deletions(-) create mode 100644 collections/BasicRecord.java create mode 100644 collections/CompactConstructor.java create mode 100644 collections/ComposedRecord.java create mode 100644 collections/CopyRecord.java create mode 100644 collections/FinalFields.java create mode 100644 collections/GenericTypeInference.java create mode 100644 collections/ImplementingRecord.java create mode 100644 collections/NestedLocalRecords.java create mode 100644 collections/NormalConstructor.java create mode 100644 collections/PlusTen.java create mode 100644 exceptions/BetterNullPointerReports.java create mode 100644 exceptions/EffectivelyFinalTWR.java create mode 100644 housekeeping/ForTypeInference.java create mode 100644 housekeeping/TypeInference.java create mode 100644 interfaces/CheckedDowncast.java delete mode 100644 interfaces/Machine.java create mode 100644 interfaces/MetalWork.java create mode 100644 interfaces/NonSealed.java create mode 100644 interfaces/PermittedSubclasses.java create mode 100644 interfaces/PrivateInterfaceMethods.java create mode 100644 interfaces/SameFile.java create mode 100644 interfaces/Sealed.java create mode 100644 interfaces/SealedCat.java create mode 100644 interfaces/SealedDog.java create mode 100644 interfaces/SealedInterface.java create mode 100644 interfaces/SealedPets.java create mode 100644 interfaces/SealedRecords.java create mode 100644 interfaces/SealedSubclasses.java rename onjava/{Operations.java => Operation.java} (66%) delete mode 100644 streams/Machine2.java create mode 100644 streams/MetalWork2.java create mode 100644 strings/DataPoint.java create mode 100644 strings/Indentation.java create mode 100644 strings/TextBlocks.java diff --git a/collections/BasicRecord.java b/collections/BasicRecord.java new file mode 100644 index 000000000..0fa0f2510 --- /dev/null +++ b/collections/BasicRecord.java @@ -0,0 +1,29 @@ +// collections/BasicRecord.java +// (c)2021 MindView LLC: see Copyright.txt +// We make no guarantees that this code is fit for any purpose. +// Visit http://OnJava8.com for more book information. +// {NewFeature} Since JDK 16 +import java.util.*; + +record Employee(String name, int id) {} + +public class BasicRecord { + public static void main(String[] args) { + var bob = new Employee("Bob Dobbs", 11); + var dot = new Employee("Dorothy Gale", 9); + // bob.id = 12; // Error: + // id has private access in Employee + System.out.println(bob.name()); // Accessor + System.out.println(bob.id()); // Accessor + System.out.println(bob); // toString() + // Employee works as the key in a Map: + var map = Map.of(bob, "A", dot, "B"); + System.out.println(map); + } +} +/* Output: +Bob Dobbs +11 +Employee[name=Bob Dobbs, id=11] +{Employee[name=Dorothy Gale, id=9]=B, Employee[name=Bob Dobbs, id=11]=A} +*/ diff --git a/collections/CompactConstructor.java b/collections/CompactConstructor.java new file mode 100644 index 000000000..017dcbf9b --- /dev/null +++ b/collections/CompactConstructor.java @@ -0,0 +1,16 @@ +// collections/CompactConstructor.java +// (c)2021 MindView LLC: see Copyright.txt +// We make no guarantees that this code is fit for any purpose. +// Visit http://OnJava8.com for more book information. +// {NewFeature} Since JDK 16 + +record Point(int x, int y) { + void assertPositive(int val) { + if(val < 0) + throw new IllegalArgumentException("negative"); + } + Point { // Compact: No parameter list + assertPositive(x); + assertPositive(y); + } +} diff --git a/collections/ComposedRecord.java b/collections/ComposedRecord.java new file mode 100644 index 000000000..1e234b257 --- /dev/null +++ b/collections/ComposedRecord.java @@ -0,0 +1,10 @@ +// collections/ComposedRecord.java +// (c)2021 MindView LLC: see Copyright.txt +// We make no guarantees that this code is fit for any purpose. +// Visit http://OnJava8.com for more book information. +// {NewFeature} Since JDK 16 + +record Company(Employee[] e) {} + +// class Conglomerate extends Company {} +// error: cannot inherit from final Company diff --git a/collections/CopyRecord.java b/collections/CopyRecord.java new file mode 100644 index 000000000..7e2d9dd1b --- /dev/null +++ b/collections/CopyRecord.java @@ -0,0 +1,18 @@ +// collections/CopyRecord.java +// (c)2021 MindView LLC: see Copyright.txt +// We make no guarantees that this code is fit for any purpose. +// Visit http://OnJava8.com for more book information. +// {NewFeature} Since JDK 16 + +record R(int a, double b, char c) {} + +public class CopyRecord { + public static void main(String[] args) { + var r1 = new R(11, 2.2, 'z'); + var r2 = new R(r1.a(), r1.b(), r1.c()); + System.out.println(r1.equals(r2)); + } +} +/* Output: +true +*/ diff --git a/collections/FinalFields.java b/collections/FinalFields.java new file mode 100644 index 000000000..1cf0f4f4e --- /dev/null +++ b/collections/FinalFields.java @@ -0,0 +1,12 @@ +// collections/FinalFields.java +// (c)2021 MindView LLC: see Copyright.txt +// We make no guarantees that this code is fit for any purpose. +// Visit http://OnJava8.com for more book information. +// {NewFeature} Since JDK 16 +import java.util.*; + +record FinalFields(int i) { + int timesTen() { return i * 10; } + // void tryToChange() { i++; } // Error: + // cannot assign a value to final variable i +} diff --git a/collections/GenericTypeInference.java b/collections/GenericTypeInference.java new file mode 100644 index 000000000..83264de2c --- /dev/null +++ b/collections/GenericTypeInference.java @@ -0,0 +1,20 @@ +// collections/GenericTypeInference.java +// (c)2021 MindView LLC: see Copyright.txt +// We make no guarantees that this code is fit for any purpose. +// Visit http://OnJava8.com for more book information. +// {NewFeature} Since JDK 11 +import java.util.*; + +public class GenericTypeInference { + void old() { + ArrayList apples = new ArrayList<>(); + } + void modern() { + var apples = new ArrayList(); + } + void pitFall() { + var apples = new ArrayList<>(); + apples.add(new Apple()); + apples.get(0); // Comes back as plain Object + } +} diff --git a/collections/ImplementingRecord.java b/collections/ImplementingRecord.java new file mode 100644 index 000000000..4a453f775 --- /dev/null +++ b/collections/ImplementingRecord.java @@ -0,0 +1,14 @@ +// collections/ImplementingRecord.java +// (c)2021 MindView LLC: see Copyright.txt +// We make no guarantees that this code is fit for any purpose. +// Visit http://OnJava8.com for more book information. +// {NewFeature} Since JDK 16 + +interface Star { + double brightness(); + double density(); +} + +record RedDwarf(double brightness) implements Star { + @Override public double density() { return 100.0; } +} diff --git a/collections/NestedLocalRecords.java b/collections/NestedLocalRecords.java new file mode 100644 index 000000000..5ae375668 --- /dev/null +++ b/collections/NestedLocalRecords.java @@ -0,0 +1,12 @@ +// collections/NestedLocalRecords.java +// (c)2021 MindView LLC: see Copyright.txt +// We make no guarantees that this code is fit for any purpose. +// Visit http://OnJava8.com for more book information. +// {NewFeature} Since JDK 16 + +public class NestedLocalRecords { + record Nested(String s) {} + void method() { + record Local(String s) {} + } +} diff --git a/collections/NormalConstructor.java b/collections/NormalConstructor.java new file mode 100644 index 000000000..da926b643 --- /dev/null +++ b/collections/NormalConstructor.java @@ -0,0 +1,11 @@ +// collections/NormalConstructor.java +// (c)2021 MindView LLC: see Copyright.txt +// We make no guarantees that this code is fit for any purpose. +// Visit http://OnJava8.com for more book information. +// {NewFeature} Since JDK 16 + +record Value(int x) { + Value(int x) { // With the parameter list + this.x = x; // Must explicitly initialize + } +} diff --git a/collections/PlusTen.java b/collections/PlusTen.java new file mode 100644 index 000000000..a52bfed5b --- /dev/null +++ b/collections/PlusTen.java @@ -0,0 +1,20 @@ +// collections/PlusTen.java +// (c)2021 MindView LLC: see Copyright.txt +// We make no guarantees that this code is fit for any purpose. +// Visit http://OnJava8.com for more book information. +// {NewFeature} Since JDK 16 + +record PlusTen(int x) { + PlusTen { + x += 10; + } + // Adjustment to field can only happen in + // the constructor. Still not legal: + // void mutate() { x += 10; } + public static void main(String[] args) { + System.out.println(new PlusTen(10)); + } +} +/* Output: +PlusTen[x=20] +*/ diff --git a/concurrent/PSP2.txt b/concurrent/PSP2.txt index 7cdafb838..d41bfa1fc 100644 --- a/concurrent/PSP2.txt +++ b/concurrent/PSP2.txt @@ -1,5 +1,5 @@ 0: main -1: main +1: ForkJoinPool.commonPool-worker-2 2: main 3: main 4: main @@ -107,22 +107,150 @@ 106: main 107: main 108: main -109: main -110: main -111: main -112: main -113: main -114: main -115: main -116: main -117: main -118: main -119: main -120: main -121: main -122: main -123: main -124: main -125: main -126: main -127: main +108: ForkJoinPool.commonPool-worker-2 +109: ForkJoinPool.commonPool-worker-2 +110: ForkJoinPool.commonPool-worker-2 +111: ForkJoinPool.commonPool-worker-2 +112: ForkJoinPool.commonPool-worker-2 +113: ForkJoinPool.commonPool-worker-2 +114: ForkJoinPool.commonPool-worker-2 +115: ForkJoinPool.commonPool-worker-2 +116: ForkJoinPool.commonPool-worker-2 +117: ForkJoinPool.commonPool-worker-2 +118: ForkJoinPool.commonPool-worker-2 +119: ForkJoinPool.commonPool-worker-2 +120: ForkJoinPool.commonPool-worker-2 +121: ForkJoinPool.commonPool-worker-2 +122: ForkJoinPool.commonPool-worker-2 +123: ForkJoinPool.commonPool-worker-2 +124: ForkJoinPool.commonPool-worker-2 +125: ForkJoinPool.commonPool-worker-2 +126: ForkJoinPool.commonPool-worker-2 +127: ForkJoinPool.commonPool-worker-2 +128: ForkJoinPool.commonPool-worker-2 +129: ForkJoinPool.commonPool-worker-2 +130: ForkJoinPool.commonPool-worker-2 +131: ForkJoinPool.commonPool-worker-2 +132: ForkJoinPool.commonPool-worker-2 +133: ForkJoinPool.commonPool-worker-2 +134: ForkJoinPool.commonPool-worker-2 +135: ForkJoinPool.commonPool-worker-2 +136: ForkJoinPool.commonPool-worker-2 +137: ForkJoinPool.commonPool-worker-2 +138: ForkJoinPool.commonPool-worker-2 +139: ForkJoinPool.commonPool-worker-2 +140: ForkJoinPool.commonPool-worker-2 +141: ForkJoinPool.commonPool-worker-2 +142: ForkJoinPool.commonPool-worker-2 +143: ForkJoinPool.commonPool-worker-2 +144: ForkJoinPool.commonPool-worker-2 +145: ForkJoinPool.commonPool-worker-2 +146: ForkJoinPool.commonPool-worker-2 +147: ForkJoinPool.commonPool-worker-2 +148: ForkJoinPool.commonPool-worker-2 +149: ForkJoinPool.commonPool-worker-2 +150: ForkJoinPool.commonPool-worker-2 +151: ForkJoinPool.commonPool-worker-2 +152: ForkJoinPool.commonPool-worker-2 +153: ForkJoinPool.commonPool-worker-2 +154: ForkJoinPool.commonPool-worker-2 +155: ForkJoinPool.commonPool-worker-2 +156: ForkJoinPool.commonPool-worker-2 +157: ForkJoinPool.commonPool-worker-2 +158: ForkJoinPool.commonPool-worker-2 +159: ForkJoinPool.commonPool-worker-2 +160: ForkJoinPool.commonPool-worker-2 +161: ForkJoinPool.commonPool-worker-2 +162: ForkJoinPool.commonPool-worker-2 +163: ForkJoinPool.commonPool-worker-2 +164: ForkJoinPool.commonPool-worker-2 +165: ForkJoinPool.commonPool-worker-2 +166: ForkJoinPool.commonPool-worker-2 +167: ForkJoinPool.commonPool-worker-2 +168: ForkJoinPool.commonPool-worker-2 +169: ForkJoinPool.commonPool-worker-2 +170: ForkJoinPool.commonPool-worker-2 +171: ForkJoinPool.commonPool-worker-2 +172: ForkJoinPool.commonPool-worker-2 +173: ForkJoinPool.commonPool-worker-2 +174: ForkJoinPool.commonPool-worker-2 +175: ForkJoinPool.commonPool-worker-2 +176: ForkJoinPool.commonPool-worker-2 +177: ForkJoinPool.commonPool-worker-2 +178: ForkJoinPool.commonPool-worker-2 +179: ForkJoinPool.commonPool-worker-2 +180: ForkJoinPool.commonPool-worker-2 +181: ForkJoinPool.commonPool-worker-2 +182: ForkJoinPool.commonPool-worker-2 +183: ForkJoinPool.commonPool-worker-2 +184: ForkJoinPool.commonPool-worker-2 +185: ForkJoinPool.commonPool-worker-2 +186: ForkJoinPool.commonPool-worker-2 +187: ForkJoinPool.commonPool-worker-2 +188: ForkJoinPool.commonPool-worker-2 +189: ForkJoinPool.commonPool-worker-2 +190: ForkJoinPool.commonPool-worker-2 +191: ForkJoinPool.commonPool-worker-2 +192: ForkJoinPool.commonPool-worker-2 +193: ForkJoinPool.commonPool-worker-2 +194: ForkJoinPool.commonPool-worker-2 +195: ForkJoinPool.commonPool-worker-2 +196: ForkJoinPool.commonPool-worker-2 +197: ForkJoinPool.commonPool-worker-2 +198: ForkJoinPool.commonPool-worker-2 +199: ForkJoinPool.commonPool-worker-2 +200: ForkJoinPool.commonPool-worker-2 +201: ForkJoinPool.commonPool-worker-2 +202: ForkJoinPool.commonPool-worker-2 +203: ForkJoinPool.commonPool-worker-2 +204: ForkJoinPool.commonPool-worker-2 +205: ForkJoinPool.commonPool-worker-2 +206: ForkJoinPool.commonPool-worker-2 +207: ForkJoinPool.commonPool-worker-2 +208: ForkJoinPool.commonPool-worker-2 +209: ForkJoinPool.commonPool-worker-2 +210: ForkJoinPool.commonPool-worker-2 +211: ForkJoinPool.commonPool-worker-2 +212: ForkJoinPool.commonPool-worker-2 +213: ForkJoinPool.commonPool-worker-2 +214: ForkJoinPool.commonPool-worker-2 +215: ForkJoinPool.commonPool-worker-2 +216: ForkJoinPool.commonPool-worker-2 +217: ForkJoinPool.commonPool-worker-2 +218: ForkJoinPool.commonPool-worker-2 +219: ForkJoinPool.commonPool-worker-2 +220: ForkJoinPool.commonPool-worker-2 +221: ForkJoinPool.commonPool-worker-2 +222: ForkJoinPool.commonPool-worker-2 +223: ForkJoinPool.commonPool-worker-2 +224: ForkJoinPool.commonPool-worker-2 +225: ForkJoinPool.commonPool-worker-2 +226: ForkJoinPool.commonPool-worker-2 +227: ForkJoinPool.commonPool-worker-2 +228: ForkJoinPool.commonPool-worker-2 +229: ForkJoinPool.commonPool-worker-2 +230: ForkJoinPool.commonPool-worker-2 +231: ForkJoinPool.commonPool-worker-2 +232: ForkJoinPool.commonPool-worker-2 +233: ForkJoinPool.commonPool-worker-2 +234: ForkJoinPool.commonPool-worker-2 +236: main +237: main +238: main +239: main +240: main +241: main +242: main +243: main +244: main +245: main +246: main +247: main +248: main +249: main +250: main +251: main +252: main +253: main +254: main +255: main diff --git a/exceptions/BetterNullPointerReports.java b/exceptions/BetterNullPointerReports.java new file mode 100644 index 000000000..e5ef495b2 --- /dev/null +++ b/exceptions/BetterNullPointerReports.java @@ -0,0 +1,43 @@ +// exceptions/BetterNullPointerReports.java +// (c)2021 MindView LLC: see Copyright.txt +// We make no guarantees that this code is fit for any purpose. +// Visit http://OnJava8.com for more book information. +// {NewFeature} Since JDK 15 + +class A { + String s; + A(String s) { + this.s = s; + } +} + +class B { + A a; + B(A a) { + this.a = a; + } +} + +class C { + B b; + C(B b) { + this.b = b; + } +} + +public class BetterNullPointerReports { + public static void main(String[] args) { + C[] ca = { + new C(new B(new A(null))), + new C(new B(null)), + new C(null), + }; + for(C c: ca) { + try { + System.out.println(c.b.a.s); + } catch(NullPointerException npe) { + System.out.println(npe); + } + } + } +} diff --git a/exceptions/EffectivelyFinalTWR.java b/exceptions/EffectivelyFinalTWR.java new file mode 100644 index 000000000..7ebeaf0d0 --- /dev/null +++ b/exceptions/EffectivelyFinalTWR.java @@ -0,0 +1,48 @@ +// exceptions/EffectivelyFinalTWR.java +// (c)2021 MindView LLC: see Copyright.txt +// We make no guarantees that this code is fit for any purpose. +// Visit http://OnJava8.com for more book information. +// {NewFeature} Since JDK 9 +import java.io.*; + +public class EffectivelyFinalTWR { + static void old() { + try ( + InputStream r1 = new FileInputStream( + new File("TryWithResources.java")); + InputStream r2 = new FileInputStream( + new File("EffectivelyFinalTWR.java")); + ) { + r1.read(); + r2.read(); + } catch(IOException e) { + // Handle exceptions + } + } + static void jdk9() throws IOException { + final InputStream r1 = new FileInputStream( + new File("TryWithResources.java")); + // Effectively final: + InputStream r2 = new FileInputStream( + new File("EffectivelyFinalTWR.java")); + try (r1; r2) { + r1.read(); + r2.read(); + } + // r1 and r2 are still in scope. Accessing + // either one throws an exception: + r1.read(); + r2.read(); + } + public static void main(String[] args) { + old(); + try { + jdk9(); + } catch(IOException e) { + System.out.println(e); + } + } +} +/* Output: +java.io.IOException: Stream Closed +*/ diff --git a/exceptions/MessyExceptions.java b/exceptions/MessyExceptions.java index 46d63337e..1441abd04 100644 --- a/exceptions/MessyExceptions.java +++ b/exceptions/MessyExceptions.java @@ -13,7 +13,7 @@ public static void main(String[] args) { int contents = in.read(); // Process contents } catch(IOException e) { - // Handle the error + // Handle errors } finally { if(in != null) { try { diff --git a/exceptions/TryWithResources.java b/exceptions/TryWithResources.java index 0ded56154..a82d261c3 100644 --- a/exceptions/TryWithResources.java +++ b/exceptions/TryWithResources.java @@ -13,7 +13,7 @@ public static void main(String[] args) { int contents = in.read(); // Process contents } catch(IOException e) { - // Handle the error + // Handle errors } } } diff --git a/housekeeping/ArrayInit.java b/housekeeping/ArrayInit.java index f515f13b5..fc5ffb1ef 100644 --- a/housekeeping/ArrayInit.java +++ b/housekeeping/ArrayInit.java @@ -7,14 +7,8 @@ public class ArrayInit { public static void main(String[] args) { - Integer[] a = { - 1, 2, - 3, // Autoboxing - }; - Integer[] b = new Integer[]{ - 1, 2, - 3, // Autoboxing - }; + Integer[] a = { 1, 2, 3, }; + Integer[] b = new Integer[]{ 1, 2, 3, }; System.out.println(Arrays.toString(a)); System.out.println(Arrays.toString(b)); } diff --git a/housekeeping/ForTypeInference.java b/housekeeping/ForTypeInference.java new file mode 100644 index 000000000..844ff10e1 --- /dev/null +++ b/housekeeping/ForTypeInference.java @@ -0,0 +1,19 @@ +// housekeeping/ForTypeInference.java +// (c)2021 MindView LLC: see Copyright.txt +// We make no guarantees that this code is fit for any purpose. +// Visit http://OnJava8.com for more book information. +// {NewFeature} Since JDK 11 + +public class ForTypeInference { + public static void main(String[] args) { + for(var s : Spiciness.values()) + System.out.println(s); + } +} +/* Ouput: +NOT +MILD +MEDIUM +HOT +FLAMING +*/ diff --git a/housekeeping/NewVarArgs.java b/housekeeping/NewVarArgs.java index 640dda154..6ee8d4a72 100644 --- a/housekeeping/NewVarArgs.java +++ b/housekeeping/NewVarArgs.java @@ -2,7 +2,7 @@ // (c)2021 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. -// Using array syntax to create variable argument lists +// Using ellipses to define a variable argument list public class NewVarArgs { static void printArray(Object... args) { diff --git a/housekeeping/PrimitiveOverloading.java b/housekeeping/PrimitiveOverloading.java index 9618eddfb..6a120b0cd 100644 --- a/housekeeping/PrimitiveOverloading.java +++ b/housekeeping/PrimitiveOverloading.java @@ -101,20 +101,12 @@ public static void main(String[] args) { } } /* Output: -5: f1(int) f2(int) f3(int) f4(int) f5(long) f6(float) -f7(double) -char: f1(char) f2(int) f3(int) f4(int) f5(long) -f6(float) f7(double) -byte: f1(byte) f2(byte) f3(short) f4(int) f5(long) -f6(float) f7(double) -short: f1(short) f2(short) f3(short) f4(int) f5(long) -f6(float) f7(double) -int: f1(int) f2(int) f3(int) f4(int) f5(long) f6(float) -f7(double) -long: f1(long) f2(long) f3(long) f4(long) f5(long) -f6(float) f7(double) -float: f1(float) f2(float) f3(float) f4(float) -f5(float) f6(float) f7(double) -double: f1(double) f2(double) f3(double) f4(double) -f5(double) f6(double) f7(double) +5: f1(int) f2(int) f3(int) f4(int) f5(long) f6(float) f7(double) +char: f1(char) f2(int) f3(int) f4(int) f5(long) f6(float) f7(double) +byte: f1(byte) f2(byte) f3(short) f4(int) f5(long) f6(float) f7(double) +short: f1(short) f2(short) f3(short) f4(int) f5(long) f6(float) f7(double) +int: f1(int) f2(int) f3(int) f4(int) f5(long) f6(float) f7(double) +long: f1(long) f2(long) f3(long) f4(long) f5(long) f6(float) f7(double) +float: f1(float) f2(float) f3(float) f4(float) f5(float) f6(float) f7(double) +double: f1(double) f2(double) f3(double) f4(double) f5(double) f6(double) f7(double) */ diff --git a/housekeeping/TypeInference.java b/housekeeping/TypeInference.java new file mode 100644 index 000000000..9f06fc2d8 --- /dev/null +++ b/housekeeping/TypeInference.java @@ -0,0 +1,36 @@ +// housekeeping/TypeInference.java +// (c)2021 MindView LLC: see Copyright.txt +// We make no guarantees that this code is fit for any purpose. +// Visit http://OnJava8.com for more book information. +// {NewFeature} Since JDK 11 + +class Plumbus {} + +public class TypeInference { + void method() { + // Explicit type: + String hello1 = "Hello"; + // Type inference: + var hello = "Hello!"; + // Works for user-defined types: + Plumbus pb1 = new Plumbus(); + var pb2 = new Plumbus(); + } + // Also works for static methods: + static void staticMethod() { + var hello = "Hello!"; + var pb2 = new Plumbus(); + } +} + +class NoInference { + String field1 = "Field initialization"; + // var field2 = "Can't do this"; + // void method() { + // var noInitializer; // No inference data + // var aNull = null; // No inference data + // } + // var inferReturnType() { + // return "Can't infer return type"; + // } +} diff --git a/housekeeping/VarArgs.java b/housekeeping/VarArgs.java index 25f44d86e..0899b8614 100644 --- a/housekeeping/VarArgs.java +++ b/housekeeping/VarArgs.java @@ -13,8 +13,7 @@ static void printArray(Object[] args) { System.out.println(); } public static void main(String[] args) { - printArray(new Object[]{ - 47, (float) 3.14, 11.11}); + printArray(new Object[]{47, (float) 3.14, 11.11}); printArray(new Object[]{"one", "two", "three" }); printArray(new Object[]{new A(), new A(), new A()}); } diff --git a/interfaces/CheckedDowncast.java b/interfaces/CheckedDowncast.java new file mode 100644 index 000000000..90689585d --- /dev/null +++ b/interfaces/CheckedDowncast.java @@ -0,0 +1,19 @@ +// interfaces/CheckedDowncast.java +// (c)2021 MindView LLC: see Copyright.txt +// We make no guarantees that this code is fit for any purpose. +// Visit http://OnJava8.com for more book information. +// {NewFeature} Since JDK 17 + +sealed interface II permits JJ {} +final class JJ implements II {} +class Something {} + +public class CheckedDowncast { + public void f() { + II i = new JJ(); + JJ j = (JJ)i; + // Something s = (Something)i; + // error: incompatible types: II cannot + // be converted to Something + } +} diff --git a/interfaces/MICollision.java b/interfaces/MICollision.java index a37d947ad..ab1c8090f 100644 --- a/interfaces/MICollision.java +++ b/interfaces/MICollision.java @@ -37,7 +37,7 @@ default void sam(int i) { } } -// This works because the argument lists are distinct: +// Works because the argument lists are distinct: class Sam implements Sam1, Sam2 {} interface Max1 { diff --git a/interfaces/Machine.java b/interfaces/Machine.java deleted file mode 100644 index 72e3fcbc9..000000000 --- a/interfaces/Machine.java +++ /dev/null @@ -1,36 +0,0 @@ -// interfaces/Machine.java -// (c)2021 MindView LLC: see Copyright.txt -// We make no guarantees that this code is fit for any purpose. -// Visit http://OnJava8.com for more book information. -import java.util.*; -import onjava.Operations; - -class Bing implements Operations { - @Override public void execute() { - Operations.show("Bing"); - } -} - -class Crack implements Operations { - @Override public void execute() { - Operations.show("Crack"); - } -} - -class Twist implements Operations { - @Override public void execute() { - Operations.show("Twist"); - } -} - -public class Machine { - public static void main(String[] args) { - Operations.runOps( - new Bing(), new Crack(), new Twist()); - } -} -/* Output: -Bing -Crack -Twist -*/ diff --git a/interfaces/MetalWork.java b/interfaces/MetalWork.java new file mode 100644 index 000000000..071b13ac9 --- /dev/null +++ b/interfaces/MetalWork.java @@ -0,0 +1,39 @@ +// interfaces/MetalWork.java +// (c)2021 MindView LLC: see Copyright.txt +// We make no guarantees that this code is fit for any purpose. +// Visit http://OnJava8.com for more book information. +import onjava.Operation; + +class Heat implements Operation { + @Override public void execute() { + Operation.show("Heat"); + } +} + +public class MetalWork { + public static void main(String[] args) { + // Must be defined in a static context + // to access a method reference: + Operation twist = new Operation() { + public void execute() { + Operation.show("Twist"); + } + }; + Operation.runOps( + new Heat(), // [1] + new Operation() { // [2] + public void execute() { + Operation.show("Hammer"); + } + }, + twist::execute, // [3] + () -> Operation.show("Anneal") // [4] + ); + } +} +/* Output: +Heat +Hammer +Twist +Anneal +*/ diff --git a/interfaces/NonSealed.java b/interfaces/NonSealed.java new file mode 100644 index 000000000..8bc4b8fae --- /dev/null +++ b/interfaces/NonSealed.java @@ -0,0 +1,11 @@ +// interfaces/NonSealed.java +// (c)2021 MindView LLC: see Copyright.txt +// We make no guarantees that this code is fit for any purpose. +// Visit http://OnJava8.com for more book information. +// {NewFeature} Since JDK 17 + +sealed class Super permits Sub1, Sub2 {} +final class Sub1 extends Super {} +non-sealed class Sub2 extends Super {} +class Any1 extends Sub2 {} +class Any2 extends Sub2 {} diff --git a/interfaces/PermittedSubclasses.java b/interfaces/PermittedSubclasses.java new file mode 100644 index 000000000..73afd6eb7 --- /dev/null +++ b/interfaces/PermittedSubclasses.java @@ -0,0 +1,22 @@ +// interfaces/PermittedSubclasses.java +// (c)2021 MindView LLC: see Copyright.txt +// We make no guarantees that this code is fit for any purpose. +// Visit http://OnJava8.com for more book information. +// {NewFeature} Since JDK 17 + +sealed class Color permits Red, Green, Blue {} +final class Red extends Color {} +final class Green extends Color {} +final class Blue extends Color {} + +public class PermittedSubclasses { + public static void main(String[] args) { + for(var p: Color.class.getPermittedSubclasses()) + System.out.println(p.getSimpleName()); + } +} +/* Output: +Red +Green +Blue +*/ diff --git a/interfaces/PrivateInterfaceMethods.java b/interfaces/PrivateInterfaceMethods.java new file mode 100644 index 000000000..ebad9bd5b --- /dev/null +++ b/interfaces/PrivateInterfaceMethods.java @@ -0,0 +1,54 @@ +// interfaces/PrivateInterfaceMethods.java +// (c)2021 MindView LLC: see Copyright.txt +// We make no guarantees that this code is fit for any purpose. +// Visit http://OnJava8.com for more book information. +// {NewFeature} Since JDK 9 + +interface Old { + default void fd() { + System.out.println("Old::fd()"); + } + static void fs() { + System.out.println("Old::fs()"); + } + default void f() { + fd(); + } + static void g() { + fs(); + } +} + +class ImplOld implements Old {} + +interface JDK9 { + private void fd() { // Automatically default + System.out.println("JDK9::fd()"); + } + private static void fs() { + System.out.println("JDK9::fs()"); + } + default void f() { + fd(); + } + static void g() { + fs(); + } +} + +class ImplJDK9 implements JDK9 {} + +public class PrivateInterfaceMethods { + public static void main(String[] args) { + new ImplOld().f(); + Old.g(); + new ImplJDK9().f(); + JDK9.g(); + } +} +/* Output: +Old::fd() +Old::fs() +JDK9::fd() +JDK9::fs() +*/ diff --git a/interfaces/SameFile.java b/interfaces/SameFile.java new file mode 100644 index 000000000..e20e93ae7 --- /dev/null +++ b/interfaces/SameFile.java @@ -0,0 +1,9 @@ +// interfaces/SameFile.java +// (c)2021 MindView LLC: see Copyright.txt +// We make no guarantees that this code is fit for any purpose. +// Visit http://OnJava8.com for more book information. +// {NewFeature} Since JDK 17 + +sealed class Shape {} +final class Circle extends Shape {} +final class Triangle extends Shape {} diff --git a/interfaces/Sealed.java b/interfaces/Sealed.java new file mode 100644 index 000000000..5124606c0 --- /dev/null +++ b/interfaces/Sealed.java @@ -0,0 +1,12 @@ +// interfaces/Sealed.java +// (c)2021 MindView LLC: see Copyright.txt +// We make no guarantees that this code is fit for any purpose. +// Visit http://OnJava8.com for more book information. +// {NewFeature} Since JDK 17 + +sealed class Base permits D1, D2 {} + +final class D1 extends Base {} +final class D2 extends Base {} +// Illegal: +// final class D3 extends Base {} diff --git a/interfaces/SealedCat.java b/interfaces/SealedCat.java new file mode 100644 index 000000000..0356ccac8 --- /dev/null +++ b/interfaces/SealedCat.java @@ -0,0 +1,6 @@ +// interfaces/SealedCat.java +// (c)2021 MindView LLC: see Copyright.txt +// We make no guarantees that this code is fit for any purpose. +// Visit http://OnJava8.com for more book information. +// {NewFeature} Since JDK 17 +final class Cat extends Pet {} diff --git a/interfaces/SealedDog.java b/interfaces/SealedDog.java new file mode 100644 index 000000000..f0441afde --- /dev/null +++ b/interfaces/SealedDog.java @@ -0,0 +1,6 @@ +// interfaces/SealedDog.java +// (c)2021 MindView LLC: see Copyright.txt +// We make no guarantees that this code is fit for any purpose. +// Visit http://OnJava8.com for more book information. +// {NewFeature} Since JDK 17 +final class Dog extends Pet {} diff --git a/interfaces/SealedInterface.java b/interfaces/SealedInterface.java new file mode 100644 index 000000000..315517bb1 --- /dev/null +++ b/interfaces/SealedInterface.java @@ -0,0 +1,12 @@ +// interfaces/SealedInterface.java +// (c)2021 MindView LLC: see Copyright.txt +// We make no guarantees that this code is fit for any purpose. +// Visit http://OnJava8.com for more book information. +// {NewFeature} Since JDK 17 + +sealed interface Ifc permits Imp1, Imp2 {} +final class Imp1 implements Ifc {} +final class Imp2 implements Ifc {} + +sealed abstract class AC permits X {} +final class X extends AC {} diff --git a/interfaces/SealedPets.java b/interfaces/SealedPets.java new file mode 100644 index 000000000..79ab9e5bc --- /dev/null +++ b/interfaces/SealedPets.java @@ -0,0 +1,6 @@ +// interfaces/SealedPets.java +// (c)2021 MindView LLC: see Copyright.txt +// We make no guarantees that this code is fit for any purpose. +// Visit http://OnJava8.com for more book information. +// {NewFeature} Since JDK 17 +sealed class Pet permits Dog, Cat {} diff --git a/interfaces/SealedRecords.java b/interfaces/SealedRecords.java new file mode 100644 index 000000000..c1fd7b7eb --- /dev/null +++ b/interfaces/SealedRecords.java @@ -0,0 +1,12 @@ +// interfaces/SealedRecords.java +// (c)2021 MindView LLC: see Copyright.txt +// We make no guarantees that this code is fit for any purpose. +// Visit http://OnJava8.com for more book information. +// {NewFeature} Since JDK 17 + +sealed interface Employee + permits CLevel, Programmer {} +record CLevel(String type) + implements Employee {} +record Programmer(String experience) + implements Employee {} diff --git a/interfaces/SealedSubclasses.java b/interfaces/SealedSubclasses.java new file mode 100644 index 000000000..68b83af3e --- /dev/null +++ b/interfaces/SealedSubclasses.java @@ -0,0 +1,10 @@ +// interfaces/SealedSubclasses.java +// (c)2021 MindView LLC: see Copyright.txt +// We make no guarantees that this code is fit for any purpose. +// Visit http://OnJava8.com for more book information. +// {NewFeature} Since JDK 17 + +sealed class Bottom permits Level1 {} +sealed class Level1 extends Bottom permits Level2 {} +sealed class Level2 extends Level1 permits Level3 {} +final class Level3 extends Level2 {} diff --git a/onjava/Operations.java b/onjava/Operation.java similarity index 66% rename from onjava/Operations.java rename to onjava/Operation.java index 0f935c365..f540bb76a 100644 --- a/onjava/Operations.java +++ b/onjava/Operation.java @@ -1,14 +1,13 @@ -// onjava/Operations.java +// onjava/Operation.java // (c)2021 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. package onjava; -import java.util.*; -public interface Operations { +public interface Operation { void execute(); - static void runOps(Operations... ops) { - for(Operations op : ops) + static void runOps(Operation... ops) { + for(Operation op : ops) op.execute(); } static void show(String msg) { diff --git a/operators/Equivalence.java b/operators/Equivalence.java index 25f7f3e70..dafc49524 100644 --- a/operators/Equivalence.java +++ b/operators/Equivalence.java @@ -14,11 +14,11 @@ public static void test(int value) { Integer i1 = value; // [1] Integer i2 = value; show("Automatic", i1, i2); - // Old way, deprecated in Java 9 and on: + // Old way, deprecated since Java 9: Integer r1 = new Integer(value); // [2] Integer r2 = new Integer(value); show("new Integer()", r1, r2); - // Preferred in Java 9 and on: + // Preferred since Java 9: Integer v1 = Integer.valueOf(value); // [3] Integer v2 = Integer.valueOf(value); show("Integer.valueOf()", v1, v2); diff --git a/operators/Literals.java b/operators/Literals.java index 3f2eef058..67232c222 100644 --- a/operators/Literals.java +++ b/operators/Literals.java @@ -17,7 +17,7 @@ public static void main(String[] args) { char c = 0xffff; // max char hex value System.out.println( "c: " + Integer.toBinaryString(c)); - byte b = 0x7f; // max byte hex value 10101111; + byte b = 0x7f; // max byte hex value 0111111; System.out.println( "b: " + Integer.toBinaryString(b)); short s = 0x7fff; // max short hex value diff --git a/operators/URShift.java b/operators/URShift.java index d1bcc4f09..7596408cd 100644 --- a/operators/URShift.java +++ b/operators/URShift.java @@ -30,8 +30,7 @@ public static void main(String[] args) { /* Output: 11111111111111111111111111111111 1111111111111111111111 -1111111111111111111111111111111111111111111111111111111 -111111111 +1111111111111111111111111111111111111111111111111111111111111111 111111111111111111111111111111111111111111111111111111 11111111111111111111111111111111 11111111111111111111111111111111 diff --git a/streams/Machine2.java b/streams/Machine2.java deleted file mode 100644 index e7b425ea7..000000000 --- a/streams/Machine2.java +++ /dev/null @@ -1,23 +0,0 @@ -// streams/Machine2.java -// (c)2021 MindView LLC: see Copyright.txt -// We make no guarantees that this code is fit for any purpose. -// Visit http://OnJava8.com for more book information. -import java.util.*; -import onjava.Operations; - -public class Machine2 { - public static void main(String[] args) { - Arrays.stream(new Operations[] { - () -> Operations.show("Bing"), - () -> Operations.show("Crack"), - () -> Operations.show("Twist"), - () -> Operations.show("Pop") - }).forEach(Operations::execute); - } -} -/* Output: -Bing -Crack -Twist -Pop -*/ diff --git a/streams/MetalWork2.java b/streams/MetalWork2.java new file mode 100644 index 000000000..0bf74152f --- /dev/null +++ b/streams/MetalWork2.java @@ -0,0 +1,23 @@ +// streams/MetalWork2.java +// (c)2021 MindView LLC: see Copyright.txt +// We make no guarantees that this code is fit for any purpose. +// Visit http://OnJava8.com for more book information. +import java.util.*; +import onjava.Operation; + +public class MetalWork2 { + public static void main(String[] args) { + Arrays.stream(new Operation[] { + () -> Operation.show("Heat"), + () -> Operation.show("Hammer"), + () -> Operation.show("Twist"), + () -> Operation.show("Anneal") + }).forEach(Operation::execute); + } +} +/* Output: +Heat +Hammer +Twist +Anneal +*/ diff --git a/strings/DataPoint.java b/strings/DataPoint.java new file mode 100644 index 000000000..719e0959d --- /dev/null +++ b/strings/DataPoint.java @@ -0,0 +1,32 @@ +// strings/DataPoint.java +// (c)2021 MindView LLC: see Copyright.txt +// We make no guarantees that this code is fit for any purpose. +// Visit http://OnJava8.com for more book information. +// {NewFeature} Since JDK 15 + +public class DataPoint { + private String location; + private Double temperature; + public DataPoint(String loc, Double temp) { + location = loc; + temperature = temp; + } + @Override public String toString() { + return """ + Location: %s + Temperature: %.2f + """.formatted(location, temperature); + } + public static void main(String[] args) { + var hill = new DataPoint("Hill", 45.2); + var dale = new DataPoint("Dale", 65.2); + System.out.print(hill); + System.out.print(dale); + } +} +/* Output: +Location: Hill +Temperature: 45.20 +Location: Dale +Temperature: 65.20 +*/ diff --git a/strings/Indentation.java b/strings/Indentation.java new file mode 100644 index 000000000..71a88365f --- /dev/null +++ b/strings/Indentation.java @@ -0,0 +1,33 @@ +// strings/Indentation.java +// (c)2021 MindView LLC: see Copyright.txt +// We make no guarantees that this code is fit for any purpose. +// Visit http://OnJava8.com for more book information. +// {NewFeature} Since JDK 15 + +public class Indentation { + public static final String NONE = """ + XXX + YYY + """; // No indentation + public static final String TWO = """ + XXX + YYY + """; // Produces indent of 2 + public static final String EIGHT = """ + XXX + YYY + """; // Produces indent of 8 + public static void main(String[] args) { + System.out.print(NONE); + System.out.print(TWO); + System.out.print(EIGHT); + } +} +/* Output: +XXX +YYY + XXX + YYY + XXX + YYY +*/ diff --git a/strings/TextBlocks.java b/strings/TextBlocks.java new file mode 100644 index 000000000..0e634001d --- /dev/null +++ b/strings/TextBlocks.java @@ -0,0 +1,37 @@ +// strings/TextBlocks.java +// (c)2021 MindView LLC: see Copyright.txt +// We make no guarantees that this code is fit for any purpose. +// Visit http://OnJava8.com for more book information. +// {NewFeature} Since JDK 15 +// Poem: Antigonish by Hughes Mearns + +public class TextBlocks { + public static final String OLD = + "Yesterday, upon the stair,\n" + + "I met a man who wasn't there\n" + + "He wasn't there again today\n" + + "I wish, I wish he'd go away...\n" + + "\n" + + "When I came home last night at three\n" + + "The man was waiting there for me\n" + + "But when I looked around the hall\n" + + "I couldn't see him there at all!\n"; + + public static final String NEW = """ + Yesterday, upon the stair, + I met a man who wasn't there + He wasn't there again today + I wish, I wish he'd go away... + + When I came home last night at three + The man was waiting there for me + But when I looked around the hall + I couldn't see him there at all! + """; + public static void main(String[] args) { + System.out.println(OLD.equals(NEW)); + } +} +/* Output: +true +*/ From c0068e7d8a2d803e409d46b877d0c682767f8591 Mon Sep 17 00:00:00 2001 From: Bruce Eckel Date: Sun, 7 Nov 2021 17:23:11 -0700 Subject: [PATCH 316/320] Message about broken Gradle for JDK 16 or 17 --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index 5f975e29e..73131ecd0 100644 --- a/README.md +++ b/README.md @@ -6,6 +6,10 @@ If you want to experiment with the code examples from the book [On Java These examples are automatically extracted directly from the book. This repository includes tests to verify that the code in the book is correct. +> NOTE: Do not attempt to use JDK 16 or greater with gradle. +> This produces a `BUG!` message from Gradle, which is broken for those versions. +> To test new Java features in JDK 16 or 17 you must compile and run those examples by hand. + ## Contents - [Building From the Command Line: Quick Version](#building-from-the-command-line-quick-version) From 0fedf4317859c3267f565ab446c411d960c6860e Mon Sep 17 00:00:00 2001 From: Bruce Eckel Date: Sun, 7 Nov 2021 17:39:59 -0700 Subject: [PATCH 317/320] Update README.md --- README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/README.md b/README.md index 73131ecd0..ad462ebc0 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,6 @@ includes tests to verify that the code in the book is correct. > NOTE: Do not attempt to use JDK 16 or greater with gradle. > This produces a `BUG!` message from Gradle, which is broken for those versions. -> To test new Java features in JDK 16 or 17 you must compile and run those examples by hand. ## Contents From cab823f881c083d599a2dbf8098ff259ed480b90 Mon Sep 17 00:00:00 2001 From: Bruce Eckel Date: Sun, 7 Nov 2021 17:48:46 -0700 Subject: [PATCH 318/320] New Feature Examples, Corrections & Rewrites --- README.md | 1 + collectiontopics/CanonicalMapping.java | 52 ++---- collectiontopics/ListSortSearch.java | 6 +- collectiontopics/QueueBehavior.java | 2 +- concurrent/PSP2.txt | 248 +------------------------ enumerations/ArrowInSwitch.java | 42 +++++ enumerations/CaseNull.java | 92 +++++++++ enumerations/Dominance.java | 20 ++ enumerations/EnumSwitch.java | 17 ++ enumerations/NormalLiskov.java | 40 ++++ enumerations/ObjectMatch.java | 46 +++++ enumerations/OddScoping.java | 27 +++ enumerations/People.java | 46 +++++ enumerations/Pet.java | 16 ++ enumerations/PetPatternMatch.java | 22 +++ enumerations/PetPatternMatch2.java | 36 ++++ enumerations/Planets.java | 36 ++++ enumerations/SealedPatternMatch.java | 48 +++++ enumerations/Shapes.java | 53 ++++++ enumerations/SmartCasting.java | 36 ++++ enumerations/SwitchExpression.java | 38 ++++ enumerations/Tanks.java | 47 +++++ housekeeping/ForTypeInference.java | 2 +- onjava/Range.java | 2 +- serialization/AStoreCADState.java | 66 +++---- serialization/RecoverCADState.java | 20 +- streams/StreamOfRandoms.java | 3 +- strings/BackSlashes.java | 26 +++ strings/IntegerMatch.java | 12 +- strings/JGrep.java | 38 ++-- validating/SimpleDebugging.java | 15 -- 31 files changed, 779 insertions(+), 376 deletions(-) create mode 100644 enumerations/ArrowInSwitch.java create mode 100644 enumerations/CaseNull.java create mode 100644 enumerations/Dominance.java create mode 100644 enumerations/EnumSwitch.java create mode 100644 enumerations/NormalLiskov.java create mode 100644 enumerations/ObjectMatch.java create mode 100644 enumerations/OddScoping.java create mode 100644 enumerations/People.java create mode 100644 enumerations/Pet.java create mode 100644 enumerations/PetPatternMatch.java create mode 100644 enumerations/PetPatternMatch2.java create mode 100644 enumerations/Planets.java create mode 100644 enumerations/SealedPatternMatch.java create mode 100644 enumerations/Shapes.java create mode 100644 enumerations/SmartCasting.java create mode 100644 enumerations/SwitchExpression.java create mode 100644 enumerations/Tanks.java create mode 100644 strings/BackSlashes.java diff --git a/README.md b/README.md index ad462ebc0..73131ecd0 100644 --- a/README.md +++ b/README.md @@ -8,6 +8,7 @@ includes tests to verify that the code in the book is correct. > NOTE: Do not attempt to use JDK 16 or greater with gradle. > This produces a `BUG!` message from Gradle, which is broken for those versions. +> To test new Java features in JDK 16 or 17 you must compile and run those examples by hand. ## Contents diff --git a/collectiontopics/CanonicalMapping.java b/collectiontopics/CanonicalMapping.java index 72735a3ba..f464599b5 100644 --- a/collectiontopics/CanonicalMapping.java +++ b/collectiontopics/CanonicalMapping.java @@ -4,49 +4,29 @@ // Visit http://OnJava8.com for more book information. // Demonstrates WeakHashMap import java.util.*; - -class Element { - private String ident; - Element(String id) { ident = id; } - @Override public String toString() { return ident; } - @Override public int hashCode() { - return Objects.hashCode(ident); - } - @Override public boolean equals(Object r) { - return r instanceof Element && - Objects.equals(ident, ((Element)r).ident); - } - @SuppressWarnings("deprecation") - @Override protected void finalize() { - System.out.println("Finalizing " + - getClass().getSimpleName() + " " + ident); - } -} - -class Key extends Element { - Key(String id) { super(id); } -} - -class Value extends Element { - Value(String id) { super(id); } -} +import java.util.stream.*; public class CanonicalMapping { + static void showKeys(Map m) { + // Display sorted keys + List keys = new ArrayList<>(m.keySet()); + Collections.sort(keys); + System.out.println(keys); + } public static void main(String[] args) { - int size = 1000; - // Or, choose size via the command line: - if(args.length > 0) - size = Integer.valueOf(args[0]); - Key[] keys = new Key[size]; - WeakHashMap map = + int size = 100; + String[] savedKeys = new String[size]; + WeakHashMap map = new WeakHashMap<>(); for(int i = 0; i < size; i++) { - Key k = new Key(Integer.toString(i)); - Value v = new Value(Integer.toString(i)); + String key = String.format("%03d", i); + String value = Integer.toString(i); if(i % 3 == 0) - keys[i] = k; // Save as "real" references - map.put(k, v); + savedKeys[i] = key; // Save as "real" references + map.put(key, value); } + showKeys(map); System.gc(); + showKeys(map); } } diff --git a/collectiontopics/ListSortSearch.java b/collectiontopics/ListSortSearch.java index 13df7af28..2f2ca2d7e 100644 --- a/collectiontopics/ListSortSearch.java +++ b/collectiontopics/ListSortSearch.java @@ -13,9 +13,9 @@ public static void main(String[] args) { System.out.println(list); Collections.shuffle(list, new Random(47)); System.out.println("Shuffled: " + list); - // Use ListIterator to trim off last elements: - ListIterator it = list.listIterator(10); - while(it.hasNext()) { + ListIterator it = + list.listIterator(10); // [1] + while(it.hasNext()) { // [2] it.next(); it.remove(); } diff --git a/collectiontopics/QueueBehavior.java b/collectiontopics/QueueBehavior.java index 1547e0d96..16f7582e2 100644 --- a/collectiontopics/QueueBehavior.java +++ b/collectiontopics/QueueBehavior.java @@ -15,7 +15,7 @@ static Stream strings() { } static void test(int id, Queue queue) { System.out.print(id + ": "); - strings().map(queue::offer).count(); + strings().forEach(queue::offer); while(queue.peek() != null) System.out.print(queue.remove() + " "); System.out.println(); diff --git a/concurrent/PSP2.txt b/concurrent/PSP2.txt index d41bfa1fc..f206148e4 100644 --- a/concurrent/PSP2.txt +++ b/concurrent/PSP2.txt @@ -1,5 +1,5 @@ 0: main -1: ForkJoinPool.commonPool-worker-2 +1: main 2: main 3: main 4: main @@ -8,249 +8,3 @@ 7: main 8: main 9: main -10: main -11: main -12: main -13: main -14: main -15: main -16: main -17: main -18: main -19: main -20: main -21: main -22: main -23: main -24: main -25: main -26: main -27: main -28: main -29: main -30: main -31: main -32: main -33: main -34: main -35: main -36: main -37: main -38: main -39: main -40: main -41: main -42: main -43: main -44: main -45: main -46: main -47: main -48: main -49: main -50: main -51: main -52: main -53: main -54: main -55: main -56: main -57: main -58: main -59: main -60: main -61: main -62: main -63: main -64: main -65: main -66: main -67: main -68: main -69: main -70: main -71: main -72: main -73: main -74: main -75: main -76: main -77: main -78: main -79: main -80: main -81: main -82: main -83: main -84: main -85: main -86: main -87: main -88: main -89: main -90: main -91: main -92: main -93: main -94: main -95: main -96: main -97: main -98: main -99: main -100: main -101: main -102: main -103: main -104: main -105: main -106: main -107: main -108: main -108: ForkJoinPool.commonPool-worker-2 -109: ForkJoinPool.commonPool-worker-2 -110: ForkJoinPool.commonPool-worker-2 -111: ForkJoinPool.commonPool-worker-2 -112: ForkJoinPool.commonPool-worker-2 -113: ForkJoinPool.commonPool-worker-2 -114: ForkJoinPool.commonPool-worker-2 -115: ForkJoinPool.commonPool-worker-2 -116: ForkJoinPool.commonPool-worker-2 -117: ForkJoinPool.commonPool-worker-2 -118: ForkJoinPool.commonPool-worker-2 -119: ForkJoinPool.commonPool-worker-2 -120: ForkJoinPool.commonPool-worker-2 -121: ForkJoinPool.commonPool-worker-2 -122: ForkJoinPool.commonPool-worker-2 -123: ForkJoinPool.commonPool-worker-2 -124: ForkJoinPool.commonPool-worker-2 -125: ForkJoinPool.commonPool-worker-2 -126: ForkJoinPool.commonPool-worker-2 -127: ForkJoinPool.commonPool-worker-2 -128: ForkJoinPool.commonPool-worker-2 -129: ForkJoinPool.commonPool-worker-2 -130: ForkJoinPool.commonPool-worker-2 -131: ForkJoinPool.commonPool-worker-2 -132: ForkJoinPool.commonPool-worker-2 -133: ForkJoinPool.commonPool-worker-2 -134: ForkJoinPool.commonPool-worker-2 -135: ForkJoinPool.commonPool-worker-2 -136: ForkJoinPool.commonPool-worker-2 -137: ForkJoinPool.commonPool-worker-2 -138: ForkJoinPool.commonPool-worker-2 -139: ForkJoinPool.commonPool-worker-2 -140: ForkJoinPool.commonPool-worker-2 -141: ForkJoinPool.commonPool-worker-2 -142: ForkJoinPool.commonPool-worker-2 -143: ForkJoinPool.commonPool-worker-2 -144: ForkJoinPool.commonPool-worker-2 -145: ForkJoinPool.commonPool-worker-2 -146: ForkJoinPool.commonPool-worker-2 -147: ForkJoinPool.commonPool-worker-2 -148: ForkJoinPool.commonPool-worker-2 -149: ForkJoinPool.commonPool-worker-2 -150: ForkJoinPool.commonPool-worker-2 -151: ForkJoinPool.commonPool-worker-2 -152: ForkJoinPool.commonPool-worker-2 -153: ForkJoinPool.commonPool-worker-2 -154: ForkJoinPool.commonPool-worker-2 -155: ForkJoinPool.commonPool-worker-2 -156: ForkJoinPool.commonPool-worker-2 -157: ForkJoinPool.commonPool-worker-2 -158: ForkJoinPool.commonPool-worker-2 -159: ForkJoinPool.commonPool-worker-2 -160: ForkJoinPool.commonPool-worker-2 -161: ForkJoinPool.commonPool-worker-2 -162: ForkJoinPool.commonPool-worker-2 -163: ForkJoinPool.commonPool-worker-2 -164: ForkJoinPool.commonPool-worker-2 -165: ForkJoinPool.commonPool-worker-2 -166: ForkJoinPool.commonPool-worker-2 -167: ForkJoinPool.commonPool-worker-2 -168: ForkJoinPool.commonPool-worker-2 -169: ForkJoinPool.commonPool-worker-2 -170: ForkJoinPool.commonPool-worker-2 -171: ForkJoinPool.commonPool-worker-2 -172: ForkJoinPool.commonPool-worker-2 -173: ForkJoinPool.commonPool-worker-2 -174: ForkJoinPool.commonPool-worker-2 -175: ForkJoinPool.commonPool-worker-2 -176: ForkJoinPool.commonPool-worker-2 -177: ForkJoinPool.commonPool-worker-2 -178: ForkJoinPool.commonPool-worker-2 -179: ForkJoinPool.commonPool-worker-2 -180: ForkJoinPool.commonPool-worker-2 -181: ForkJoinPool.commonPool-worker-2 -182: ForkJoinPool.commonPool-worker-2 -183: ForkJoinPool.commonPool-worker-2 -184: ForkJoinPool.commonPool-worker-2 -185: ForkJoinPool.commonPool-worker-2 -186: ForkJoinPool.commonPool-worker-2 -187: ForkJoinPool.commonPool-worker-2 -188: ForkJoinPool.commonPool-worker-2 -189: ForkJoinPool.commonPool-worker-2 -190: ForkJoinPool.commonPool-worker-2 -191: ForkJoinPool.commonPool-worker-2 -192: ForkJoinPool.commonPool-worker-2 -193: ForkJoinPool.commonPool-worker-2 -194: ForkJoinPool.commonPool-worker-2 -195: ForkJoinPool.commonPool-worker-2 -196: ForkJoinPool.commonPool-worker-2 -197: ForkJoinPool.commonPool-worker-2 -198: ForkJoinPool.commonPool-worker-2 -199: ForkJoinPool.commonPool-worker-2 -200: ForkJoinPool.commonPool-worker-2 -201: ForkJoinPool.commonPool-worker-2 -202: ForkJoinPool.commonPool-worker-2 -203: ForkJoinPool.commonPool-worker-2 -204: ForkJoinPool.commonPool-worker-2 -205: ForkJoinPool.commonPool-worker-2 -206: ForkJoinPool.commonPool-worker-2 -207: ForkJoinPool.commonPool-worker-2 -208: ForkJoinPool.commonPool-worker-2 -209: ForkJoinPool.commonPool-worker-2 -210: ForkJoinPool.commonPool-worker-2 -211: ForkJoinPool.commonPool-worker-2 -212: ForkJoinPool.commonPool-worker-2 -213: ForkJoinPool.commonPool-worker-2 -214: ForkJoinPool.commonPool-worker-2 -215: ForkJoinPool.commonPool-worker-2 -216: ForkJoinPool.commonPool-worker-2 -217: ForkJoinPool.commonPool-worker-2 -218: ForkJoinPool.commonPool-worker-2 -219: ForkJoinPool.commonPool-worker-2 -220: ForkJoinPool.commonPool-worker-2 -221: ForkJoinPool.commonPool-worker-2 -222: ForkJoinPool.commonPool-worker-2 -223: ForkJoinPool.commonPool-worker-2 -224: ForkJoinPool.commonPool-worker-2 -225: ForkJoinPool.commonPool-worker-2 -226: ForkJoinPool.commonPool-worker-2 -227: ForkJoinPool.commonPool-worker-2 -228: ForkJoinPool.commonPool-worker-2 -229: ForkJoinPool.commonPool-worker-2 -230: ForkJoinPool.commonPool-worker-2 -231: ForkJoinPool.commonPool-worker-2 -232: ForkJoinPool.commonPool-worker-2 -233: ForkJoinPool.commonPool-worker-2 -234: ForkJoinPool.commonPool-worker-2 -236: main -237: main -238: main -239: main -240: main -241: main -242: main -243: main -244: main -245: main -246: main -247: main -248: main -249: main -250: main -251: main -252: main -253: main -254: main -255: main diff --git a/enumerations/ArrowInSwitch.java b/enumerations/ArrowInSwitch.java new file mode 100644 index 000000000..f583d7ee2 --- /dev/null +++ b/enumerations/ArrowInSwitch.java @@ -0,0 +1,42 @@ +// enumerations/ArrowInSwitch.java +// (c)2021 MindView LLC: see Copyright.txt +// We make no guarantees that this code is fit for any purpose. +// Visit http://OnJava8.com for more book information. +// {NewFeature} Since JDK 14 +import static java.util.stream.IntStream.range; + +public class ArrowInSwitch { + static void colons(int i) { + switch(i) { + case 1: System.out.println("one"); + break; + case 2: System.out.println("two"); + break; + case 3: System.out.println("three"); + break; + default: System.out.println("default"); + } + } + static void arrows(int i) { + switch(i) { + case 1 -> System.out.println("one"); + case 2 -> System.out.println("two"); + case 3 -> System.out.println("three"); + default -> System.out.println("default"); + } + } + public static void main(String[] args) { + range(0, 4).forEach(i -> colons(i)); + range(0, 4).forEach(i -> arrows(i)); + } +} +/* Output: +default +one +two +three +default +one +two +three +*/ diff --git a/enumerations/CaseNull.java b/enumerations/CaseNull.java new file mode 100644 index 000000000..6b5004920 --- /dev/null +++ b/enumerations/CaseNull.java @@ -0,0 +1,92 @@ +// enumerations/CaseNull.java +// (c)2021 MindView LLC: see Copyright.txt +// We make no guarantees that this code is fit for any purpose. +// Visit http://OnJava8.com for more book information. +// {NewFeature} Preview in JDK 17 +// Compile with javac flags: +// --enable-preview --source 17 +// Run with java flag: --enable-preview +import java.util.*; +import java.util.function.*; + +public class CaseNull { + static void old(String s) { + if(s == null) { + System.out.println("null"); + return; + } + switch(s) { + case "XX" -> System.out.println("XX"); + default -> System.out.println("default"); + } + } + static void checkNull(String s) { + switch(s) { + case "XX" -> System.out.println("XX"); + case null -> System.out.println("null"); + default -> System.out.println("default"); + } + // Works with colon syntax, too: + switch(s) { + case "XX": System.out.println("XX"); + break; + case null: System.out.println("null"); + break; + default : System.out.println("default"); + } + } + static void defaultOnly(String s) { + switch(s) { + case "XX" -> System.out.println("XX"); + default -> System.out.println("default"); + } + } + static void combineNullAndCase(String s) { + switch(s) { + case "XX", null -> System.out.println("XX|null"); + default -> System.out.println("default"); + } + } + static void combineNullAndDefault(String s) { + switch(s) { + case "XX" -> System.out.println("XX"); + case null, default -> System.out.println("both"); + } + } + static void test(Consumer cs) { + cs.accept("XX"); + cs.accept("YY"); + try { + cs.accept(null); + } catch(NullPointerException e) { + System.out.println(e.getMessage()); + } + } + public static void main(String[] args) { + test(CaseNull::old); + test(CaseNull::checkNull); + test(CaseNull::defaultOnly); + test(CaseNull::combineNullAndCase); + test(CaseNull::combineNullAndDefault); + } +} +/* Output: +XX +default +null +XX +XX +default +default +null +null +XX +default +Cannot invoke "String.hashCode()" because "" is null +XX|null +default +XX|null +XX +both +both +*/ diff --git a/enumerations/Dominance.java b/enumerations/Dominance.java new file mode 100644 index 000000000..893e755e2 --- /dev/null +++ b/enumerations/Dominance.java @@ -0,0 +1,20 @@ +// enumerations/Dominance.java +// (c)2021 MindView LLC: see Copyright.txt +// We make no guarantees that this code is fit for any purpose. +// Visit http://OnJava8.com for more book information. +// {NewFeature} Preview in JDK 17 +// Compile with javac flags: +// --enable-preview --source 17 +import java.util.*; + +sealed interface Base {} +record Derived() implements Base {} + +public class Dominance { + static String test(Base base) { + return switch(base) { + case Derived d -> "Derived"; + case Base b -> "B"; // [1] + }; + } +} diff --git a/enumerations/EnumSwitch.java b/enumerations/EnumSwitch.java new file mode 100644 index 000000000..a17546eab --- /dev/null +++ b/enumerations/EnumSwitch.java @@ -0,0 +1,17 @@ +// enumerations/EnumSwitch.java +// (c)2021 MindView LLC: see Copyright.txt +// We make no guarantees that this code is fit for any purpose. +// Visit http://OnJava8.com for more book information. +// {NewFeature} Since JDK 14 + +public class EnumSwitch { + enum Signal { GREEN, YELLOW, RED, } + Signal color = Signal.RED; + public void change() { + color = switch(color) { + case RED -> Signal.GREEN; + case GREEN -> Signal.YELLOW; + case YELLOW -> Signal.RED; + }; + } +} diff --git a/enumerations/NormalLiskov.java b/enumerations/NormalLiskov.java new file mode 100644 index 000000000..c121700ab --- /dev/null +++ b/enumerations/NormalLiskov.java @@ -0,0 +1,40 @@ +// enumerations/NormalLiskov.java +// (c)2021 MindView LLC: see Copyright.txt +// We make no guarantees that this code is fit for any purpose. +// Visit http://OnJava8.com for more book information. +import java.util.stream.*; + +interface LifeForm { + String move(); + String react(); +} + +class Worm implements LifeForm { + @Override public String move() { + return "Worm::move()"; + } + @Override public String react() { + return "Worm::react()"; + } +} + +class Giraffe implements LifeForm { + @Override public String move() { + return "Giraffe::move()"; + } + @Override public String react() { + return "Giraffe::react()"; + } +} + +public class NormalLiskov { + public static void main(String[] args) { + Stream.of(new Worm(), new Giraffe()) + .forEach(lf -> System.out.println( + lf.move() + " " + lf.react())); + } +} +/* Output: +Worm::move() Worm::react() +Giraffe::move() Giraffe::react() +*/ diff --git a/enumerations/ObjectMatch.java b/enumerations/ObjectMatch.java new file mode 100644 index 000000000..490b79a0b --- /dev/null +++ b/enumerations/ObjectMatch.java @@ -0,0 +1,46 @@ +// enumerations/ObjectMatch.java +// (c)2021 MindView LLC: see Copyright.txt +// We make no guarantees that this code is fit for any purpose. +// Visit http://OnJava8.com for more book information. +// {NewFeature} Preview in JDK 17 +// Compile with javac flags: +// --enable-preview --source 17 +// Run with java flag: --enable-preview +import java.util.*; + +record XX() {} + +public class ObjectMatch { + static String match(Object o) { + return switch(o) { + case Dog d -> "Walk the dog"; + case Fish f -> "Change the fish water"; + case Pet sp -> "Not dog or fish"; + case String s -> "String " + s; + case Integer i -> "Integer " + i; + case String[] sa -> String.join(", ", sa); + case null, XX xx -> "null or XX: " + xx; + default -> "Something else"; + }; + } + public static void main(String[] args) { + List.of(new Dog(), new Fish(), new Pet(), + "Oscar", Integer.valueOf(12), + Double.valueOf("47.74"), + new String[]{ "to", "the", "point" }, + new XX() + ).forEach( + p -> System.out.println(match(p)) + ); + } +} +/* Output: +Walk the dog +Change the fish water +Not dog or fish +String Oscar +Integer 12 +Something else +to, the, point +null or Object: XX[] +*/ diff --git a/enumerations/OddScoping.java b/enumerations/OddScoping.java new file mode 100644 index 000000000..fd938e98a --- /dev/null +++ b/enumerations/OddScoping.java @@ -0,0 +1,27 @@ +// enumerations/OddScoping.java +// (c)2021 MindView LLC: see Copyright.txt +// We make no guarantees that this code is fit for any purpose. +// Visit http://OnJava8.com for more book information. +// {NewFeature} Since JDK 16 + +public class OddScoping { + static void f(Object o) { + if(!(o instanceof String s)) { + System.out.println("Not a String"); + throw new RuntimeException(); + } + // s is in scope here! + System.out.println(s.toUpperCase()); // [1] + } + public static void main(String[] args) { + f("Curiouser and Curiouser"); + f(null); + } +} +/* Output: +CURIOUSER AND CURIOUSER +Not a String +Exception in thread "main" java.lang.RuntimeException + at OddScoping.f(OddScoping.java:8) + at OddScoping.main(OddScoping.java:15) +*/ diff --git a/enumerations/People.java b/enumerations/People.java new file mode 100644 index 000000000..183d34c79 --- /dev/null +++ b/enumerations/People.java @@ -0,0 +1,46 @@ +// enumerations/People.java +// (c)2021 MindView LLC: see Copyright.txt +// We make no guarantees that this code is fit for any purpose. +// Visit http://OnJava8.com for more book information. +// {NewFeature} Preview in JDK 17 +// Compile with javac flags: +// --enable-preview --source 17 +// Run with java flag: --enable-preview +import java.util.*; + +record Person(String name, int age) {} + +public class People { + static String categorize(Person person) { + return switch(person) { + case Person p && p.age() > 40 // [1] + -> p + " is middle aged"; + case Person p && + (p.name().contains("D") || p.age() == 14) + -> p + " D or 14"; + case Person p && !(p.age() >= 100) // [2] + -> p + " is not a centenarian"; + case Person p -> p + " Everyone else"; + }; + } + public static void main(String[] args) { + List.of( + new Person("Dorothy", 15), + new Person("John Bigboote", 42), + new Person("Morty", 14), + new Person("Morty Jr.", 1), + new Person("Jose", 39), + new Person("Kane", 118) + ).forEach( + p -> System.out.println(categorize(p)) + ); + } +} +/* Output: +Person[name=Dorothy, age=15] D or 14 +Person[name=John Bigboote, age=42] is middle aged +Person[name=Morty, age=14] D or 14 +Person[name=Morty Jr., age=1] is not a centenarian +Person[name=Jose, age=39] is not a centenarian +Person[name=Kane, age=118] is middle aged +*/ diff --git a/enumerations/Pet.java b/enumerations/Pet.java new file mode 100644 index 000000000..0508905e3 --- /dev/null +++ b/enumerations/Pet.java @@ -0,0 +1,16 @@ +// enumerations/Pet.java +// (c)2021 MindView LLC: see Copyright.txt +// We make no guarantees that this code is fit for any purpose. +// Visit http://OnJava8.com for more book information. + +public class Pet { + void feed() {} +} + +class Dog extends Pet { + void walk() {} +} + +class Fish extends Pet { + void changeWater() {} +} diff --git a/enumerations/PetPatternMatch.java b/enumerations/PetPatternMatch.java new file mode 100644 index 000000000..d538ef2b8 --- /dev/null +++ b/enumerations/PetPatternMatch.java @@ -0,0 +1,22 @@ +// enumerations/PetPatternMatch.java +// (c)2021 MindView LLC: see Copyright.txt +// We make no guarantees that this code is fit for any purpose. +// Visit http://OnJava8.com for more book information. +// {NewFeature} Preview in JDK 17 +// Compile with javac flags: +// --enable-preview --source 17 +import java.util.*; + +public class PetPatternMatch { + static void careFor(Pet p) { + switch(p) { + case Dog d -> d.walk(); + case Fish f -> f.changeWater(); + case Pet sp -> sp.feed(); + }; + } + static void petCare() { + List.of(new Dog(), new Fish()) + .forEach(p -> careFor(p)); + } +} diff --git a/enumerations/PetPatternMatch2.java b/enumerations/PetPatternMatch2.java new file mode 100644 index 000000000..76b44f4ee --- /dev/null +++ b/enumerations/PetPatternMatch2.java @@ -0,0 +1,36 @@ +// enumerations/PetPatternMatch2.java +// (c)2021 MindView LLC: see Copyright.txt +// We make no guarantees that this code is fit for any purpose. +// Visit http://OnJava8.com for more book information. +// {NewFeature} Preview in JDK 17 +// Compile with javac flags: +// --enable-preview --source 17 +package sealedpet; +import java.util.*; + +sealed interface Pet { + void feed(); +} + +final class Dog implements Pet { + @Override public void feed() {} + void walk() {} +} + +final class Fish implements Pet { + @Override public void feed() {} + void changeWater() {} +} + +public class PetPatternMatch2 { + static void careFor(Pet p) { + switch(p) { + case Dog d -> d.walk(); + case Fish f -> f.changeWater(); + }; + } + static void petCare() { + List.of(new Dog(), new Fish()) + .forEach(p -> careFor(p)); + } +} diff --git a/enumerations/Planets.java b/enumerations/Planets.java new file mode 100644 index 000000000..9554c684f --- /dev/null +++ b/enumerations/Planets.java @@ -0,0 +1,36 @@ +// enumerations/Planets.java +// (c)2021 MindView LLC: see Copyright.txt +// We make no guarantees that this code is fit for any purpose. +// Visit http://OnJava8.com for more book information. +// {NewFeature} Since JDK 14 + +enum CelestialBody { + MERCURY, VENUS, EARTH, MARS, JUPITER, + SATURN, URANUS, NEPTUNE, PLUTO +} + +public class Planets { + public static String classify(CelestialBody b) { + var result = switch(b) { + case MERCURY, VENUS, EARTH, + MARS, JUPITER, + SATURN, URANUS, NEPTUNE -> { + System.out.print("A planet: "); + yield b.toString(); + } + case PLUTO -> { + System.out.print("Not a planet: "); + yield b.toString(); + } + }; + return result; + } + public static void main(String[] args) { + System.out.println(classify(CelestialBody.MARS)); + System.out.println(classify(CelestialBody.PLUTO)); + } +} +/* Output: +A planet: MARS +Not a planet: PLUTO +*/ diff --git a/enumerations/SealedPatternMatch.java b/enumerations/SealedPatternMatch.java new file mode 100644 index 000000000..b5051303b --- /dev/null +++ b/enumerations/SealedPatternMatch.java @@ -0,0 +1,48 @@ +// enumerations/SealedPatternMatch.java +// (c)2021 MindView LLC: see Copyright.txt +// We make no guarantees that this code is fit for any purpose. +// Visit http://OnJava8.com for more book information. +// {NewFeature} Preview in JDK 17 +// Compile with javac flags: +// --enable-preview --source 17 +// Run with java flag: --enable-preview +import java.util.*; + +sealed interface Transport {}; +record Bicycle(String id) implements Transport {}; +record Glider(int size) implements Transport {}; +record Surfboard(double weight) implements Transport {}; +// If you uncomment this: +// record Skis(int length) implements Transport {}; +// You get an error: "the switch expression +// does not cover all possible input values" + +public class SealedPatternMatch { + static String exhaustive(Transport t) { + return switch(t) { + case Bicycle b -> "Bicycle " + b.id(); + case Glider g -> "Glider " + g.size(); + case Surfboard s -> "Surfboard " + s.weight(); + }; + } + public static void main(String[] args) { + List.of( + new Bicycle("Bob"), + new Glider(65), + new Surfboard(6.4) + ).forEach( + t -> System.out.println(exhaustive(t)) + ); + try { + exhaustive(null); // Always possible! // [1] + } catch(NullPointerException e) { + System.out.println("Not exhaustive: " + e); + } + } +} +/* Output: +Bicycle Bob +Glider 65 +Surfboard 6.4 +Not exhaustive: java.lang.NullPointerException +*/ diff --git a/enumerations/Shapes.java b/enumerations/Shapes.java new file mode 100644 index 000000000..031fc4851 --- /dev/null +++ b/enumerations/Shapes.java @@ -0,0 +1,53 @@ +// enumerations/Shapes.java +// (c)2021 MindView LLC: see Copyright.txt +// We make no guarantees that this code is fit for any purpose. +// Visit http://OnJava8.com for more book information. +// {NewFeature} Preview in JDK 17 +// Compile with javac flags: +// --enable-preview --source 17 +// Run with java flag: --enable-preview +import java.util.*; + +sealed interface Shape { + double area(); +} + +record Circle(double radius) implements Shape { + @Override public double area() { + return Math.PI * radius * radius; + } +} + +record Rectangle(double side1, double side2) + implements Shape { + @Override public double area() { + return side1 * side2; + } +} + +public class Shapes { + static void classify(Shape s) { + System.out.println(switch(s) { + case Circle c && c.area() < 100.0 + -> "Small Circle: " + c; + case Circle c -> "Large Circle: " + c; + case Rectangle r && r.side1() == r.side2() + -> "Square: " + r; + case Rectangle r -> "Rectangle: " + r; + }); + } + public static void main(String[] args) { + List.of( + new Circle(5.0), + new Circle(25.0), + new Rectangle(12.0, 12.0), + new Rectangle(12.0, 15.0) + ).forEach(t -> classify(t)); + } +} +/* Output: +Small Circle: Circle[radius=5.0] +Large Circle: Circle[radius=25.0] +Square: Rectangle[side1=12.0, side2=12.0] +Rectangle: Rectangle[side1=12.0, side2=15.0] +*/ diff --git a/enumerations/SmartCasting.java b/enumerations/SmartCasting.java new file mode 100644 index 000000000..848c0e9de --- /dev/null +++ b/enumerations/SmartCasting.java @@ -0,0 +1,36 @@ +// enumerations/SmartCasting.java +// (c)2021 MindView LLC: see Copyright.txt +// We make no guarantees that this code is fit for any purpose. +// Visit http://OnJava8.com for more book information. +// {NewFeature} Since JDK 16 + +public class SmartCasting { + static void dumb(Object x) { + if(x instanceof String) { + String s = (String)x; + if(s.length() > 0) { + System.out.format( + "%d %s%n", s.length(), s.toUpperCase()); + } + } + } + static void smart(Object x) { + if(x instanceof String s && s.length() > 0) { + System.out.format( + "%d %s%n", s.length(), s.toUpperCase()); + } + } + static void wrong(Object x) { + // "Or" never works: + // if(x instanceof String s || s.length() > 0) {} + // error: cannot find symbol ^ + } + public static void main(String[] args) { + dumb("dumb"); + smart("smart"); + } +} +/* Output: +4 DUMB +5 SMART +*/ diff --git a/enumerations/SwitchExpression.java b/enumerations/SwitchExpression.java new file mode 100644 index 000000000..06a0fe49b --- /dev/null +++ b/enumerations/SwitchExpression.java @@ -0,0 +1,38 @@ +// enumerations/SwitchExpression.java +// (c)2021 MindView LLC: see Copyright.txt +// We make no guarantees that this code is fit for any purpose. +// Visit http://OnJava8.com for more book information. +// {NewFeature} Since JDK 14 +import java.util.*; + +public class SwitchExpression { + static int colon(String s) { + var result = switch(s) { + case "i": yield 1; + case "j": yield 2; + case "k": yield 3; + default: yield 0; + }; + return result; + } + static int arrow(String s) { + var result = switch(s) { + case "i" -> 1; + case "j" -> 2; + case "k" -> 3; + default -> 0; + }; + return result; + } + public static void main(String[] args) { + for(var s: new String[]{"i", "j", "k", "z"}) + System.out.format( + "%s %d %d%n", s, colon(s), arrow(s)); + } +} +/* Output: +i 1 1 +j 2 2 +k 3 3 +z 0 0 +*/ diff --git a/enumerations/Tanks.java b/enumerations/Tanks.java new file mode 100644 index 000000000..0604693f5 --- /dev/null +++ b/enumerations/Tanks.java @@ -0,0 +1,47 @@ +// enumerations/Tanks.java +// (c)2021 MindView LLC: see Copyright.txt +// We make no guarantees that this code is fit for any purpose. +// Visit http://OnJava8.com for more book information. +// {NewFeature} Preview in JDK 17 +// Compile with javac flags: +// --enable-preview --source 17 +// Run with java flag: --enable-preview +import java.util.*; + +enum Type { TOXIC, FLAMMABLE, NEUTRAL } + +record Level(int percent) { + Level { + if(percent < 0 || percent > 100) + throw new IndexOutOfBoundsException( + percent + " percent"); + } +} + +record Tank(Type type, Level level) {} + +public class Tanks { + static String check(Tank tank) { + return switch(tank) { + case Tank t && t.type() == Type.TOXIC + -> "Toxic: " + t; + case Tank t && ( // [1] + t.type() == Type.TOXIC && + t.level().percent() < 50 + ) -> "Toxic, low: " + t; + case Tank t && t.type() == Type.FLAMMABLE + -> "Flammable: " + t; + // Equivalent to "default": + case Tank t -> "Other Tank: " + t; + }; + } + public static void main(String[] args) { + List.of( + new Tank(Type.TOXIC, new Level(49)), + new Tank(Type.FLAMMABLE, new Level(52)), + new Tank(Type.NEUTRAL, new Level(75)) + ).forEach( + t -> System.out.println(check(t)) + ); + } +} diff --git a/housekeeping/ForTypeInference.java b/housekeeping/ForTypeInference.java index 844ff10e1..8db4b9034 100644 --- a/housekeeping/ForTypeInference.java +++ b/housekeeping/ForTypeInference.java @@ -10,7 +10,7 @@ public static void main(String[] args) { System.out.println(s); } } -/* Ouput: +/* Output: NOT MILD MEDIUM diff --git a/onjava/Range.java b/onjava/Range.java index 82041db5e..3003dbd52 100644 --- a/onjava/Range.java +++ b/onjava/Range.java @@ -9,7 +9,7 @@ public class Range { // Produce sequence [start..end) incrementing by step public static int[] range(int start, int end, int step) { - if (step == 0) + if(step == 0) throw new IllegalArgumentException("Step cannot be zero"); int sz = Math.max(0, step >= 0 ? diff --git a/serialization/AStoreCADState.java b/serialization/AStoreCADState.java index 93b7d5f53..ef496b808 100644 --- a/serialization/AStoreCADState.java +++ b/serialization/AStoreCADState.java @@ -11,85 +11,74 @@ enum Color { RED, BLUE, GREEN } abstract class Shape implements Serializable { private int xPos, yPos, dimension; - private static Random rand = new Random(47); - private static int counter = 0; - public abstract void setColor(Color newColor); - public abstract Color getColor(); Shape(int xVal, int yVal, int dim) { xPos = xVal; yPos = yVal; dimension = dim; } + public abstract void setColor(Color newColor); + public abstract Color getColor(); @Override public String toString() { - return getClass() + "Color[" + getColor() + - "] xPos[" + xPos + "] yPos[" + yPos + - "] dim[" + dimension + "]\n"; + return "\n" + getClass() + " " + getColor() + + " xPos[" + xPos + "] yPos[" + yPos + + "] dim[" + dimension + "]"; } + private static Random rand = new Random(47); + private static int counter = 0; public static Shape randomFactory() { int xVal = rand.nextInt(100); int yVal = rand.nextInt(100); int dim = rand.nextInt(100); - switch(counter++ % 3) { + switch(counter++ % 2) { default: case 0: return new Circle(xVal, yVal, dim); - case 1: return new Square(xVal, yVal, dim); - case 2: return new Line(xVal, yVal, dim); + case 1: return new Line(xVal, yVal, dim); } } } class Circle extends Shape { - private static Color color = Color.RED; Circle(int xVal, int yVal, int dim) { super(xVal, yVal, dim); } + private static Color color = Color.RED; @Override public void setColor(Color newColor) { color = newColor; } @Override public Color getColor() { return color; } } -class Square extends Shape { - private static Color color = Color.RED; - Square(int xVal, int yVal, int dim) { +class Line extends Shape { + Line(int xVal, int yVal, int dim) { super(xVal, yVal, dim); } + private static Color color = Color.RED; @Override public void setColor(Color newColor) { color = newColor; } @Override public Color getColor() { return color; } -} - -class Line extends Shape { - private static Color color = Color.RED; public static void serializeStaticState(ObjectOutputStream os) - throws IOException { os.writeObject(color); } + throws IOException { + os.writeObject(color); + } public static void deserializeStaticState(ObjectInputStream os) throws IOException, ClassNotFoundException { color = (Color)os.readObject(); } - Line(int xVal, int yVal, int dim) { - super(xVal, yVal, dim); - } - @Override public void setColor(Color newColor) { - color = newColor; - } - @Override public Color getColor() { return color; } } public class AStoreCADState { public static void main(String[] args) { List> shapeTypes = - Arrays.asList( - Circle.class, Square.class, Line.class); - List shapes = IntStream.range(0, 10) + Arrays.asList(Circle.class, Line.class); + List shapes = IntStream.range(0, 5) .mapToObj(i -> Shape.randomFactory()) .collect(Collectors.toList()); // Set all the static colors to GREEN: shapes.forEach(s -> s.setColor(Color.GREEN)); - // Save the state vector: + // Serialize everything to CADState.dat: try( ObjectOutputStream out = new ObjectOutputStream( @@ -106,15 +95,10 @@ public static void main(String[] args) { } } /* Output: -[class CircleColor[GREEN] xPos[58] yPos[55] dim[93] -, class SquareColor[GREEN] xPos[61] yPos[61] dim[29] -, class LineColor[GREEN] xPos[68] yPos[0] dim[22] -, class CircleColor[GREEN] xPos[7] yPos[88] dim[28] -, class SquareColor[GREEN] xPos[51] yPos[89] dim[9] -, class LineColor[GREEN] xPos[78] yPos[98] dim[61] -, class CircleColor[GREEN] xPos[20] yPos[58] dim[16] -, class SquareColor[GREEN] xPos[40] yPos[11] dim[22] -, class LineColor[GREEN] xPos[4] yPos[83] dim[6] -, class CircleColor[GREEN] xPos[75] yPos[10] dim[42] -] +[ +class Circle GREEN xPos[58] yPos[55] dim[93], +class Line GREEN xPos[61] yPos[61] dim[29], +class Circle GREEN xPos[68] yPos[0] dim[22], +class Line GREEN xPos[7] yPos[88] dim[28], +class Circle GREEN xPos[51] yPos[89] dim[9]] */ diff --git a/serialization/RecoverCADState.java b/serialization/RecoverCADState.java index b27da662e..3c4bec35d 100644 --- a/serialization/RecoverCADState.java +++ b/serialization/RecoverCADState.java @@ -19,8 +19,7 @@ public static void main(String[] args) { List> shapeTypes = (List>)in.readObject(); Line.deserializeStaticState(in); - List shapes = - (List)in.readObject(); + List shapes = (List)in.readObject(); System.out.println(shapes); } catch(IOException | ClassNotFoundException e) { throw new RuntimeException(e); @@ -28,15 +27,10 @@ public static void main(String[] args) { } } /* Output: -[class CircleColor[RED] xPos[58] yPos[55] dim[93] -, class SquareColor[RED] xPos[61] yPos[61] dim[29] -, class LineColor[GREEN] xPos[68] yPos[0] dim[22] -, class CircleColor[RED] xPos[7] yPos[88] dim[28] -, class SquareColor[RED] xPos[51] yPos[89] dim[9] -, class LineColor[GREEN] xPos[78] yPos[98] dim[61] -, class CircleColor[RED] xPos[20] yPos[58] dim[16] -, class SquareColor[RED] xPos[40] yPos[11] dim[22] -, class LineColor[GREEN] xPos[4] yPos[83] dim[6] -, class CircleColor[RED] xPos[75] yPos[10] dim[42] -] +[ +class Circle RED xPos[58] yPos[55] dim[93], +class Line GREEN xPos[61] yPos[61] dim[29], +class Circle RED xPos[68] yPos[0] dim[22], +class Line GREEN xPos[7] yPos[88] dim[28], +class Circle RED xPos[51] yPos[89] dim[9]] */ diff --git a/streams/StreamOfRandoms.java b/streams/StreamOfRandoms.java index 6b83b83ba..07efa25e0 100644 --- a/streams/StreamOfRandoms.java +++ b/streams/StreamOfRandoms.java @@ -15,6 +15,5 @@ public static void main(String[] args) { } } /* Output: -58 -1 55 93 -1 61 61 29 -1 68 0 22 7 -1 88 28 51 89 9 --1 +58 -1 55 93 -1 61 61 29 -1 68 0 22 7 -1 88 28 51 89 9 -1 */ diff --git a/strings/BackSlashes.java b/strings/BackSlashes.java new file mode 100644 index 000000000..6363defcc --- /dev/null +++ b/strings/BackSlashes.java @@ -0,0 +1,26 @@ +// strings/BackSlashes.java +// (c)2021 MindView LLC: see Copyright.txt +// We make no guarantees that this code is fit for any purpose. +// Visit http://OnJava8.com for more book information. + +public class BackSlashes { + public static void main(String[] args) { + String one = "\\"; + String two = "\\\\"; + String three = "\\\\\\"; + System.out.println(one); + System.out.println(two); + System.out.println(three); + System.out.println(one.matches("\\\\")); + System.out.println(two.matches("\\\\\\\\")); + System.out.println(three.matches("\\\\\\\\\\\\")); + } +} +/* Output: +\ +\\ +\\\ +true +true +true +*/ diff --git a/strings/IntegerMatch.java b/strings/IntegerMatch.java index c951a2cf9..822c5d4c6 100644 --- a/strings/IntegerMatch.java +++ b/strings/IntegerMatch.java @@ -2,13 +2,17 @@ // (c)2021 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. +import java.util.stream.*; public class IntegerMatch { public static void main(String[] args) { - System.out.println("-1234".matches("-?\\d+")); - System.out.println("5678".matches("-?\\d+")); - System.out.println("+911".matches("-?\\d+")); - System.out.println("+911".matches("(-|\\+)?\\d+")); + String possiblyMinus = "-?\\d+"; + Stream.of( + "-1234".matches(possiblyMinus), + "5678".matches(possiblyMinus), + "+911".matches(possiblyMinus), + "+911".matches("(-|\\+)?\\d+") + ).forEach(System.out::println); } } /* Output: diff --git a/strings/JGrep.java b/strings/JGrep.java index 946e8ff63..368fd13ef 100644 --- a/strings/JGrep.java +++ b/strings/JGrep.java @@ -4,7 +4,7 @@ // Visit http://OnJava8.com for more book information. // A very simple version of the "grep" program // {java JGrep -// WhitherStringBuilder.java 'return|for|String'} +// WhitherStringBuilder.java "return|for|String"} import java.util.regex.*; import java.nio.file.*; import java.util.stream.*; @@ -18,19 +18,33 @@ public class JGrep { System.exit(0); } Pattern p = Pattern.compile(args[1]); - // Iterate through the lines of the input file: - int index = 0; Matcher m = p.matcher(""); - for(String line : - Files.readAllLines(Paths.get(args[0]))) { - m.reset(line); - while(m.find()) - System.out.println(index++ + ": " + - m.group() + ": " + m.start()); - } + // Iterate through the lines of the input file: + Files.readAllLines(Paths.get(args[0])).forEach( + line -> { + m.reset(line); + while(m.find()) + System.out.println( + m.group() + ": " + m.start()); + } + ); } } /* Output: -0: for: 4 -1: for: 4 +String: 18 +String: 20 +String: 9 +String: 25 +String: 4 +for: 4 +String: 8 +return: 4 +String: 9 +String: 25 +String: 4 +String: 31 +for: 4 +String: 8 +return: 4 +String: 20 */ diff --git a/validating/SimpleDebugging.java b/validating/SimpleDebugging.java index 721820e74..609e8e7d5 100644 --- a/validating/SimpleDebugging.java +++ b/validating/SimpleDebugging.java @@ -23,18 +23,3 @@ public static void main(String[] args) { foo1(); } } -/* Output: -In foo1 -In foo2 -In foo3 -___[ Error Output ]___ -Exception in thread "main" -java.lang.ArithmeticException: / by zero - at -SimpleDebugging.foo3(SimpleDebugging.java:17) - at -SimpleDebugging.foo2(SimpleDebugging.java:11) - at SimpleDebugging.foo1(SimpleDebugging.java:7) - at -SimpleDebugging.main(SimpleDebugging.java:20) -*/ From 7bf3a4c7b75ca6cca0a5651edf11ea0e9ec7fd5f Mon Sep 17 00:00:00 2001 From: Bruce Eckel Date: Sun, 7 Nov 2021 17:50:15 -0700 Subject: [PATCH 319/320] Update README.md --- README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/README.md b/README.md index 73131ecd0..ad462ebc0 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,6 @@ includes tests to verify that the code in the book is correct. > NOTE: Do not attempt to use JDK 16 or greater with gradle. > This produces a `BUG!` message from Gradle, which is broken for those versions. -> To test new Java features in JDK 16 or 17 you must compile and run those examples by hand. ## Contents From ade1d5ef122bdfc1320370e2fde7a62245e26d41 Mon Sep 17 00:00:00 2001 From: Bruce Eckel Date: Tue, 14 Dec 2021 12:38:46 -0700 Subject: [PATCH 320/320] Further Updates prior to releasing Version 2.0 of book --- .../ApplesAndOrangesWithoutGenerics.java | 2 +- collections/AsListInference.java | 4 + concurrent/PSP2.txt | 10 - concurrent/primes.txt | 100000 --------------- files/AddAndSubtractPaths.java | 13 +- files/FileSystemDemo.java | 8 +- files/PartsOfPaths.java | 2 +- files/PathAnalysis.java | 6 +- files/PathInfo.java | 39 +- functional/MethodReferences.java | 1 - generics/coffee/CoffeeSupplier.java | 2 +- newio/data.txt | 1 - references/ImmutableStrings.java | 25 - references/Stringer.java | 22 - streams/RandomGenerators.java | 8 +- 15 files changed, 46 insertions(+), 100097 deletions(-) delete mode 100644 concurrent/PSP2.txt delete mode 100644 concurrent/primes.txt delete mode 100644 newio/data.txt delete mode 100644 references/ImmutableStrings.java delete mode 100644 references/Stringer.java diff --git a/collections/ApplesAndOrangesWithoutGenerics.java b/collections/ApplesAndOrangesWithoutGenerics.java index 6ca4a6f4b..4cbe23073 100644 --- a/collections/ApplesAndOrangesWithoutGenerics.java +++ b/collections/ApplesAndOrangesWithoutGenerics.java @@ -24,7 +24,7 @@ public static void main(String[] args) { apples.add(new Orange()); for(Object apple : apples) { ((Apple) apple).id(); - // Orange is detected only at run time + // Orange is detected only at runtime } } } diff --git a/collections/AsListInference.java b/collections/AsListInference.java index e4b825447..b25ac8e61 100644 --- a/collections/AsListInference.java +++ b/collections/AsListInference.java @@ -16,19 +16,23 @@ public static void main(String[] args) { List snow1 = Arrays.asList( new Crusty(), new Slush(), new Powder()); //- snow1.add(new Heavy()); // Exception + //- snow1.remove(0); // Exception List snow2 = Arrays.asList( new Light(), new Heavy()); //- snow2.add(new Slush()); // Exception + //- snow2.remove(0); // Exception List snow3 = new ArrayList<>(); Collections.addAll(snow3, new Light(), new Heavy(), new Powder()); snow3.add(new Crusty()); + snow3.remove(0); // Hint with explicit type argument specification: List snow4 = Arrays.asList( new Light(), new Heavy(), new Slush()); //- snow4.add(new Powder()); // Exception + //- snow4.remove(0); // Exception } } diff --git a/concurrent/PSP2.txt b/concurrent/PSP2.txt deleted file mode 100644 index f206148e4..000000000 --- a/concurrent/PSP2.txt +++ /dev/null @@ -1,10 +0,0 @@ -0: main -1: main -2: main -3: main -4: main -5: main -6: main -7: main -8: main -9: main diff --git a/concurrent/primes.txt b/concurrent/primes.txt deleted file mode 100644 index 6dc8a58ab..000000000 --- a/concurrent/primes.txt +++ /dev/null @@ -1,100000 +0,0 @@ -2 -3 -5 -7 -11 -13 -17 -19 -23 -29 -31 -37 -41 -43 -47 -53 -59 -61 -67 -71 -73 -79 -83 -89 -97 -101 -103 -107 -109 -113 -127 -131 -137 -139 -149 -151 -157 -163 -167 -173 -179 -181 -191 -193 -197 -199 -211 -223 -227 -229 -233 -239 -241 -251 -257 -263 -269 -271 -277 -281 -283 -293 -307 -311 -313 -317 -331 -337 -347 -349 -353 -359 -367 -373 -379 -383 -389 -397 -401 -409 -419 -421 -431 -433 -439 -443 -449 -457 -461 -463 -467 -479 -487 -491 -499 -503 -509 -521 -523 -541 -547 -557 -563 -569 -571 -577 -587 -593 -599 -601 -607 -613 -617 -619 -631 -641 -643 -647 -653 -659 -661 -673 -677 -683 -691 -701 -709 -719 -727 -733 -739 -743 -751 -757 -761 -769 -773 -787 -797 -809 -811 -821 -823 -827 -829 -839 -853 -857 -859 -863 -877 -881 -883 -887 -907 -911 -919 -929 -937 -941 -947 -953 -967 -971 -977 -983 -991 -997 -1009 -1013 -1019 -1021 -1031 -1033 -1039 -1049 -1051 -1061 -1063 -1069 -1087 -1091 -1093 -1097 -1103 -1109 -1117 -1123 -1129 -1151 -1153 -1163 -1171 -1181 -1187 -1193 -1201 -1213 -1217 -1223 -1229 -1231 -1237 -1249 -1259 -1277 -1279 -1283 -1289 -1291 -1297 -1301 -1303 -1307 -1319 -1321 -1327 -1361 -1367 -1373 -1381 -1399 -1409 -1423 -1427 -1429 -1433 -1439 -1447 -1451 -1453 -1459 -1471 -1481 -1483 -1487 -1489 -1493 -1499 -1511 -1523 -1531 -1543 -1549 -1553 -1559 -1567 -1571 -1579 -1583 -1597 -1601 -1607 -1609 -1613 -1619 -1621 -1627 -1637 -1657 -1663 -1667 -1669 -1693 -1697 -1699 -1709 -1721 -1723 -1733 -1741 -1747 -1753 -1759 -1777 -1783 -1787 -1789 -1801 -1811 -1823 -1831 -1847 -1861 -1867 -1871 -1873 -1877 -1879 -1889 -1901 -1907 -1913 -1931 -1933 -1949 -1951 -1973 -1979 -1987 -1993 -1997 -1999 -2003 -2011 -2017 -2027 -2029 -2039 -2053 -2063 -2069 -2081 -2083 -2087 -2089 -2099 -2111 -2113 -2129 -2131 -2137 -2141 -2143 -2153 -2161 -2179 -2203 -2207 -2213 -2221 -2237 -2239 -2243 -2251 -2267 -2269 -2273 -2281 -2287 -2293 -2297 -2309 -2311 -2333 -2339 -2341 -2347 -2351 -2357 -2371 -2377 -2381 -2383 -2389 -2393 -2399 -2411 -2417 -2423 -2437 -2441 -2447 -2459 -2467 -2473 -2477 -2503 -2521 -2531 -2539 -2543 -2549 -2551 -2557 -2579 -2591 -2593 -2609 -2617 -2621 -2633 -2647 -2657 -2659 -2663 -2671 -2677 -2683 -2687 -2689 -2693 -2699 -2707 -2711 -2713 -2719 -2729 -2731 -2741 -2749 -2753 -2767 -2777 -2789 -2791 -2797 -2801 -2803 -2819 -2833 -2837 -2843 -2851 -2857 -2861 -2879 -2887 -2897 -2903 -2909 -2917 -2927 -2939 -2953 -2957 -2963 -2969 -2971 -2999 -3001 -3011 -3019 -3023 -3037 -3041 -3049 -3061 -3067 -3079 -3083 -3089 -3109 -3119 -3121 -3137 -3163 -3167 -3169 -3181 -3187 -3191 -3203 -3209 -3217 -3221 -3229 -3251 -3253 -3257 -3259 -3271 -3299 -3301 -3307 -3313 -3319 -3323 -3329 -3331 -3343 -3347 -3359 -3361 -3371 -3373 -3389 -3391 -3407 -3413 -3433 -3449 -3457 -3461 -3463 -3467 -3469 -3491 -3499 -3511 -3517 -3527 -3529 -3533 -3539 -3541 -3547 -3557 -3559 -3571 -3581 -3583 -3593 -3607 -3613 -3617 -3623 -3631 -3637 -3643 -3659 -3671 -3673 -3677 -3691 -3697 -3701 -3709 -3719 -3727 -3733 -3739 -3761 -3767 -3769 -3779 -3793 -3797 -3803 -3821 -3823 -3833 -3847 -3851 -3853 -3863 -3877 -3881 -3889 -3907 -3911 -3917 -3919 -3923 -3929 -3931 -3943 -3947 -3967 -3989 -4001 -4003 -4007 -4013 -4019 -4021 -4027 -4049 -4051 -4057 -4073 -4079 -4091 -4093 -4099 -4111 -4127 -4129 -4133 -4139 -4153 -4157 -4159 -4177 -4201 -4211 -4217 -4219 -4229 -4231 -4241 -4243 -4253 -4259 -4261 -4271 -4273 -4283 -4289 -4297 -4327 -4337 -4339 -4349 -4357 -4363 -4373 -4391 -4397 -4409 -4421 -4423 -4441 -4447 -4451 -4457 -4463 -4481 -4483 -4493 -4507 -4513 -4517 -4519 -4523 -4547 -4549 -4561 -4567 -4583 -4591 -4597 -4603 -4621 -4637 -4639 -4643 -4649 -4651 -4657 -4663 -4673 -4679 -4691 -4703 -4721 -4723 -4729 -4733 -4751 -4759 -4783 -4787 -4789 -4793 -4799 -4801 -4813 -4817 -4831 -4861 -4871 -4877 -4889 -4903 -4909 -4919 -4931 -4933 -4937 -4943 -4951 -4957 -4967 -4969 -4973 -4987 -4993 -4999 -5003 -5009 -5011 -5021 -5023 -5039 -5051 -5059 -5077 -5081 -5087 -5099 -5101 -5107 -5113 -5119 -5147 -5153 -5167 -5171 -5179 -5189 -5197 -5209 -5227 -5231 -5233 -5237 -5261 -5273 -5279 -5281 -5297 -5303 -5309 -5323 -5333 -5347 -5351 -5381 -5387 -5393 -5399 -5407 -5413 -5417 -5419 -5431 -5437 -5441 -5443 -5449 -5471 -5477 -5479 -5483 -5501 -5503 -5507 -5519 -5521 -5527 -5531 -5557 -5563 -5569 -5573 -5581 -5591 -5623 -5639 -5641 -5647 -5651 -5653 -5657 -5659 -5669 -5683 -5689 -5693 -5701 -5711 -5717 -5737 -5741 -5743 -5749 -5779 -5783 -5791 -5801 -5807 -5813 -5821 -5827 -5839 -5843 -5849 -5851 -5857 -5861 -5867 -5869 -5879 -5881 -5897 -5903 -5923 -5927 -5939 -5953 -5981 -5987 -6007 -6011 -6029 -6037 -6043 -6047 -6053 -6067 -6073 -6079 -6089 -6091 -6101 -6113 -6121 -6131 -6133 -6143 -6151 -6163 -6173 -6197 -6199 -6203 -6211 -6217 -6221 -6229 -6247 -6257 -6263 -6269 -6271 -6277 -6287 -6299 -6301 -6311 -6317 -6323 -6329 -6337 -6343 -6353 -6359 -6361 -6367 -6373 -6379 -6389 -6397 -6421 -6427 -6449 -6451 -6469 -6473 -6481 -6491 -6521 -6529 -6547 -6551 -6553 -6563 -6569 -6571 -6577 -6581 -6599 -6607 -6619 -6637 -6653 -6659 -6661 -6673 -6679 -6689 -6691 -6701 -6703 -6709 -6719 -6733 -6737 -6761 -6763 -6779 -6781 -6791 -6793 -6803 -6823 -6827 -6829 -6833 -6841 -6857 -6863 -6869 -6871 -6883 -6899 -6907 -6911 -6917 -6947 -6949 -6959 -6961 -6967 -6971 -6977 -6983 -6991 -6997 -7001 -7013 -7019 -7027 -7039 -7043 -7057 -7069 -7079 -7103 -7109 -7121 -7127 -7129 -7151 -7159 -7177 -7187 -7193 -7207 -7211 -7213 -7219 -7229 -7237 -7243 -7247 -7253 -7283 -7297 -7307 -7309 -7321 -7331 -7333 -7349 -7351 -7369 -7393 -7411 -7417 -7433 -7451 -7457 -7459 -7477 -7481 -7487 -7489 -7499 -7507 -7517 -7523 -7529 -7537 -7541 -7547 -7549 -7559 -7561 -7573 -7577 -7583 -7589 -7591 -7603 -7607 -7621 -7639 -7643 -7649 -7669 -7673 -7681 -7687 -7691 -7699 -7703 -7717 -7723 -7727 -7741 -7753 -7757 -7759 -7789 -7793 -7817 -7823 -7829 -7841 -7853 -7867 -7873 -7877 -7879 -7883 -7901 -7907 -7919 -7927 -7933 -7937 -7949 -7951 -7963 -7993 -8009 -8011 -8017 -8039 -8053 -8059 -8069 -8081 -8087 -8089 -8093 -8101 -8111 -8117 -8123 -8147 -8161 -8167 -8171 -8179 -8191 -8209 -8219 -8221 -8231 -8233 -8237 -8243 -8263 -8269 -8273 -8287 -8291 -8293 -8297 -8311 -8317 -8329 -8353 -8363 -8369 -8377 -8387 -8389 -8419 -8423 -8429 -8431 -8443 -8447 -8461 -8467 -8501 -8513 -8521 -8527 -8537 -8539 -8543 -8563 -8573 -8581 -8597 -8599 -8609 -8623 -8627 -8629 -8641 -8647 -8663 -8669 -8677 -8681 -8689 -8693 -8699 -8707 -8713 -8719 -8731 -8737 -8741 -8747 -8753 -8761 -8779 -8783 -8803 -8807 -8819 -8821 -8831 -8837 -8839 -8849 -8861 -8863 -8867 -8887 -8893 -8923 -8929 -8933 -8941 -8951 -8963 -8969 -8971 -8999 -9001 -9007 -9011 -9013 -9029 -9041 -9043 -9049 -9059 -9067 -9091 -9103 -9109 -9127 -9133 -9137 -9151 -9157 -9161 -9173 -9181 -9187 -9199 -9203 -9209 -9221 -9227 -9239 -9241 -9257 -9277 -9281 -9283 -9293 -9311 -9319 -9323 -9337 -9341 -9343 -9349 -9371 -9377 -9391 -9397 -9403 -9413 -9419 -9421 -9431 -9433 -9437 -9439 -9461 -9463 -9467 -9473 -9479 -9491 -9497 -9511 -9521 -9533 -9539 -9547 -9551 -9587 -9601 -9613 -9619 -9623 -9629 -9631 -9643 -9649 -9661 -9677 -9679 -9689 -9697 -9719 -9721 -9733 -9739 -9743 -9749 -9767 -9769 -9781 -9787 -9791 -9803 -9811 -9817 -9829 -9833 -9839 -9851 -9857 -9859 -9871 -9883 -9887 -9901 -9907 -9923 -9929 -9931 -9941 -9949 -9967 -9973 -10007 -10009 -10037 -10039 -10061 -10067 -10069 -10079 -10091 -10093 -10099 -10103 -10111 -10133 -10139 -10141 -10151 -10159 -10163 -10169 -10177 -10181 -10193 -10211 -10223 -10243 -10247 -10253 -10259 -10267 -10271 -10273 -10289 -10301 -10303 -10313 -10321 -10331 -10333 -10337 -10343 -10357 -10369 -10391 -10399 -10427 -10429 -10433 -10453 -10457 -10459 -10463 -10477 -10487 -10499 -10501 -10513 -10529 -10531 -10559 -10567 -10589 -10597 -10601 -10607 -10613 -10627 -10631 -10639 -10651 -10657 -10663 -10667 -10687 -10691 -10709 -10711 -10723 -10729 -10733 -10739 -10753 -10771 -10781 -10789 -10799 -10831 -10837 -10847 -10853 -10859 -10861 -10867 -10883 -10889 -10891 -10903 -10909 -10937 -10939 -10949 -10957 -10973 -10979 -10987 -10993 -11003 -11027 -11047 -11057 -11059 -11069 -11071 -11083 -11087 -11093 -11113 -11117 -11119 -11131 -11149 -11159 -11161 -11171 -11173 -11177 -11197 -11213 -11239 -11243 -11251 -11257 -11261 -11273 -11279 -11287 -11299 -11311 -11317 -11321 -11329 -11351 -11353 -11369 -11383 -11393 -11399 -11411 -11423 -11437 -11443 -11447 -11467 -11471 -11483 -11489 -11491 -11497 -11503 -11519 -11527 -11549 -11551 -11579 -11587 -11593 -11597 -11617 -11621 -11633 -11657 -11677 -11681 -11689 -11699 -11701 -11717 -11719 -11731 -11743 -11777 -11779 -11783 -11789 -11801 -11807 -11813 -11821 -11827 -11831 -11833 -11839 -11863 -11867 -11887 -11897 -11903 -11909 -11923 -11927 -11933 -11939 -11941 -11953 -11959 -11969 -11971 -11981 -11987 -12007 -12011 -12037 -12041 -12043 -12049 -12071 -12073 -12097 -12101 -12107 -12109 -12113 -12119 -12143 -12149 -12157 -12161 -12163 -12197 -12203 -12211 -12227 -12239 -12241 -12251 -12253 -12263 -12269 -12277 -12281 -12289 -12301 -12323 -12329 -12343 -12347 -12373 -12377 -12379 -12391 -12401 -12409 -12413 -12421 -12433 -12437 -12451 -12457 -12473 -12479 -12487 -12491 -12497 -12503 -12511 -12517 -12527 -12539 -12541 -12547 -12553 -12569 -12577 -12583 -12589 -12601 -12611 -12613 -12619 -12637 -12641 -12647 -12653 -12659 -12671 -12689 -12697 -12703 -12713 -12721 -12739 -12743 -12757 -12763 -12781 -12791 -12799 -12809 -12821 -12823 -12829 -12841 -12853 -12889 -12893 -12899 -12907 -12911 -12917 -12919 -12923 -12941 -12953 -12959 -12967 -12973 -12979 -12983 -13001 -13003 -13007 -13009 -13033 -13037 -13043 -13049 -13063 -13093 -13099 -13103 -13109 -13121 -13127 -13147 -13151 -13159 -13163 -13171 -13177 -13183 -13187 -13217 -13219 -13229 -13241 -13249 -13259 -13267 -13291 -13297 -13309 -13313 -13327 -13331 -13337 -13339 -13367 -13381 -13397 -13399 -13411 -13417 -13421 -13441 -13451 -13457 -13463 -13469 -13477 -13487 -13499 -13513 -13523 -13537 -13553 -13567 -13577 -13591 -13597 -13613 -13619 -13627 -13633 -13649 -13669 -13679 -13681 -13687 -13691 -13693 -13697 -13709 -13711 -13721 -13723 -13729 -13751 -13757 -13759 -13763 -13781 -13789 -13799 -13807 -13829 -13831 -13841 -13859 -13873 -13877 -13879 -13883 -13901 -13903 -13907 -13913 -13921 -13931 -13933 -13963 -13967 -13997 -13999 -14009 -14011 -14029 -14033 -14051 -14057 -14071 -14081 -14083 -14087 -14107 -14143 -14149 -14153 -14159 -14173 -14177 -14197 -14207 -14221 -14243 -14249 -14251 -14281 -14293 -14303 -14321 -14323 -14327 -14341 -14347 -14369 -14387 -14389 -14401 -14407 -14411 -14419 -14423 -14431 -14437 -14447 -14449 -14461 -14479 -14489 -14503 -14519 -14533 -14537 -14543 -14549 -14551 -14557 -14561 -14563 -14591 -14593 -14621 -14627 -14629 -14633 -14639 -14653 -14657 -14669 -14683 -14699 -14713 -14717 -14723 -14731 -14737 -14741 -14747 -14753 -14759 -14767 -14771 -14779 -14783 -14797 -14813 -14821 -14827 -14831 -14843 -14851 -14867 -14869 -14879 -14887 -14891 -14897 -14923 -14929 -14939 -14947 -14951 -14957 -14969 -14983 -15013 -15017 -15031 -15053 -15061 -15073 -15077 -15083 -15091 -15101 -15107 -15121 -15131 -15137 -15139 -15149 -15161 -15173 -15187 -15193 -15199 -15217 -15227 -15233 -15241 -15259 -15263 -15269 -15271 -15277 -15287 -15289 -15299 -15307 -15313 -15319 -15329 -15331 -15349 -15359 -15361 -15373 -15377 -15383 -15391 -15401 -15413 -15427 -15439 -15443 -15451 -15461 -15467 -15473 -15493 -15497 -15511 -15527 -15541 -15551 -15559 -15569 -15581 -15583 -15601 -15607 -15619 -15629 -15641 -15643 -15647 -15649 -15661 -15667 -15671 -15679 -15683 -15727 -15731 -15733 -15737 -15739 -15749 -15761 -15767 -15773 -15787 -15791 -15797 -15803 -15809 -15817 -15823 -15859 -15877 -15881 -15887 -15889 -15901 -15907 -15913 -15919 -15923 -15937 -15959 -15971 -15973 -15991 -16001 -16007 -16033 -16057 -16061 -16063 -16067 -16069 -16073 -16087 -16091 -16097 -16103 -16111 -16127 -16139 -16141 -16183 -16187 -16189 -16193 -16217 -16223 -16229 -16231 -16249 -16253 -16267 -16273 -16301 -16319 -16333 -16339 -16349 -16361 -16363 -16369 -16381 -16411 -16417 -16421 -16427 -16433 -16447 -16451 -16453 -16477 -16481 -16487 -16493 -16519 -16529 -16547 -16553 -16561 -16567 -16573 -16603 -16607 -16619 -16631 -16633 -16649 -16651 -16657 -16661 -16673 -16691 -16693 -16699 -16703 -16729 -16741 -16747 -16759 -16763 -16787 -16811 -16823 -16829 -16831 -16843 -16871 -16879 -16883 -16889 -16901 -16903 -16921 -16927 -16931 -16937 -16943 -16963 -16979 -16981 -16987 -16993 -17011 -17021 -17027 -17029 -17033 -17041 -17047 -17053 -17077 -17093 -17099 -17107 -17117 -17123 -17137 -17159 -17167 -17183 -17189 -17191 -17203 -17207 -17209 -17231 -17239 -17257 -17291 -17293 -17299 -17317 -17321 -17327 -17333 -17341 -17351 -17359 -17377 -17383 -17387 -17389 -17393 -17401 -17417 -17419 -17431 -17443 -17449 -17467 -17471 -17477 -17483 -17489 -17491 -17497 -17509 -17519 -17539 -17551 -17569 -17573 -17579 -17581 -17597 -17599 -17609 -17623 -17627 -17657 -17659 -17669 -17681 -17683 -17707 -17713 -17729 -17737 -17747 -17749 -17761 -17783 -17789 -17791 -17807 -17827 -17837 -17839 -17851 -17863 -17881 -17891 -17903 -17909 -17911 -17921 -17923 -17929 -17939 -17957 -17959 -17971 -17977 -17981 -17987 -17989 -18013 -18041 -18043 -18047 -18049 -18059 -18061 -18077 -18089 -18097 -18119 -18121 -18127 -18131 -18133 -18143 -18149 -18169 -18181 -18191 -18199 -18211 -18217 -18223 -18229 -18233 -18251 -18253 -18257 -18269 -18287 -18289 -18301 -18307 -18311 -18313 -18329 -18341 -18353 -18367 -18371 -18379 -18397 -18401 -18413 -18427 -18433 -18439 -18443 -18451 -18457 -18461 -18481 -18493 -18503 -18517 -18521 -18523 -18539 -18541 -18553 -18583 -18587 -18593 -18617 -18637 -18661 -18671 -18679 -18691 -18701 -18713 -18719 -18731 -18743 -18749 -18757 -18773 -18787 -18793 -18797 -18803 -18839 -18859 -18869 -18899 -18911 -18913 -18917 -18919 -18947 -18959 -18973 -18979 -19001 -19009 -19013 -19031 -19037 -19051 -19069 -19073 -19079 -19081 -19087 -19121 -19139 -19141 -19157 -19163 -19181 -19183 -19207 -19211 -19213 -19219 -19231 -19237 -19249 -19259 -19267 -19273 -19289 -19301 -19309 -19319 -19333 -19373 -19379 -19381 -19387 -19391 -19403 -19417 -19421 -19423 -19427 -19429 -19433 -19441 -19447 -19457 -19463 -19469 -19471 -19477 -19483 -19489 -19501 -19507 -19531 -19541 -19543 -19553 -19559 -19571 -19577 -19583 -19597 -19603 -19609 -19661 -19681 -19687 -19697 -19699 -19709 -19717 -19727 -19739 -19751 -19753 -19759 -19763 -19777 -19793 -19801 -19813 -19819 -19841 -19843 -19853 -19861 -19867 -19889 -19891 -19913 -19919 -19927 -19937 -19949 -19961 -19963 -19973 -19979 -19991 -19993 -19997 -20011 -20021 -20023 -20029 -20047 -20051 -20063 -20071 -20089 -20101 -20107 -20113 -20117 -20123 -20129 -20143 -20147 -20149 -20161 -20173 -20177 -20183 -20201 -20219 -20231 -20233 -20249 -20261 -20269 -20287 -20297 -20323 -20327 -20333 -20341 -20347 -20353 -20357 -20359 -20369 -20389 -20393 -20399 -20407 -20411 -20431 -20441 -20443 -20477 -20479 -20483 -20507 -20509 -20521 -20533 -20543 -20549 -20551 -20563 -20593 -20599 -20611 -20627 -20639 -20641 -20663 -20681 -20693 -20707 -20717 -20719 -20731 -20743 -20747 -20749 -20753 -20759 -20771 -20773 -20789 -20807 -20809 -20849 -20857 -20873 -20879 -20887 -20897 -20899 -20903 -20921 -20929 -20939 -20947 -20959 -20963 -20981 -20983 -21001 -21011 -21013 -21017 -21019 -21023 -21031 -21059 -21061 -21067 -21089 -21101 -21107 -21121 -21139 -21143 -21149 -21157 -21163 -21169 -21179 -21187 -21191 -21193 -21211 -21221 -21227 -21247 -21269 -21277 -21283 -21313 -21317 -21319 -21323 -21341 -21347 -21377 -21379 -21383 -21391 -21397 -21401 -21407 -21419 -21433 -21467 -21481 -21487 -21491 -21493 -21499 -21503 -21517 -21521 -21523 -21529 -21557 -21559 -21563 -21569 -21577 -21587 -21589 -21599 -21601 -21611 -21613 -21617 -21647 -21649 -21661 -21673 -21683 -21701 -21713 -21727 -21737 -21739 -21751 -21757 -21767 -21773 -21787 -21799 -21803 -21817 -21821 -21839 -21841 -21851 -21859 -21863 -21871 -21881 -21893 -21911 -21929 -21937 -21943 -21961 -21977 -21991 -21997 -22003 -22013 -22027 -22031 -22037 -22039 -22051 -22063 -22067 -22073 -22079 -22091 -22093 -22109 -22111 -22123 -22129 -22133 -22147 -22153 -22157 -22159 -22171 -22189 -22193 -22229 -22247 -22259 -22271 -22273 -22277 -22279 -22283 -22291 -22303 -22307 -22343 -22349 -22367 -22369 -22381 -22391 -22397 -22409 -22433 -22441 -22447 -22453 -22469 -22481 -22483 -22501 -22511 -22531 -22541 -22543 -22549 -22567 -22571 -22573 -22613 -22619 -22621 -22637 -22639 -22643 -22651 -22669 -22679 -22691 -22697 -22699 -22709 -22717 -22721 -22727 -22739 -22741 -22751 -22769 -22777 -22783 -22787 -22807 -22811 -22817 -22853 -22859 -22861 -22871 -22877 -22901 -22907 -22921 -22937 -22943 -22961 -22963 -22973 -22993 -23003 -23011 -23017 -23021 -23027 -23029 -23039 -23041 -23053 -23057 -23059 -23063 -23071 -23081 -23087 -23099 -23117 -23131 -23143 -23159 -23167 -23173 -23189 -23197 -23201 -23203 -23209 -23227 -23251 -23269 -23279 -23291 -23293 -23297 -23311 -23321 -23327 -23333 -23339 -23357 -23369 -23371 -23399 -23417 -23431 -23447 -23459 -23473 -23497 -23509 -23531 -23537 -23539 -23549 -23557 -23561 -23563 -23567 -23581 -23593 -23599 -23603 -23609 -23623 -23627 -23629 -23633 -23663 -23669 -23671 -23677 -23687 -23689 -23719 -23741 -23743 -23747 -23753 -23761 -23767 -23773 -23789 -23801 -23813 -23819 -23827 -23831 -23833 -23857 -23869 -23873 -23879 -23887 -23893 -23899 -23909 -23911 -23917 -23929 -23957 -23971 -23977 -23981 -23993 -24001 -24007 -24019 -24023 -24029 -24043 -24049 -24061 -24071 -24077 -24083 -24091 -24097 -24103 -24107 -24109 -24113 -24121 -24133 -24137 -24151 -24169 -24179 -24181 -24197 -24203 -24223 -24229 -24239 -24247 -24251 -24281 -24317 -24329 -24337 -24359 -24371 -24373 -24379 -24391 -24407 -24413 -24419 -24421 -24439 -24443 -24469 -24473 -24481 -24499 -24509 -24517 -24527 -24533 -24547 -24551 -24571 -24593 -24611 -24623 -24631 -24659 -24671 -24677 -24683 -24691 -24697 -24709 -24733 -24749 -24763 -24767 -24781 -24793 -24799 -24809 -24821 -24841 -24847 -24851 -24859 -24877 -24889 -24907 -24917 -24919 -24923 -24943 -24953 -24967 -24971 -24977 -24979 -24989 -25013 -25031 -25033 -25037 -25057 -25073 -25087 -25097 -25111 -25117 -25121 -25127 -25147 -25153 -25163 -25169 -25171 -25183 -25189 -25219 -25229 -25237 -25243 -25247 -25253 -25261 -25301 -25303 -25307 -25309 -25321 -25339 -25343 -25349 -25357 -25367 -25373 -25391 -25409 -25411 -25423 -25439 -25447 -25453 -25457 -25463 -25469 -25471 -25523 -25537 -25541 -25561 -25577 -25579 -25583 -25589 -25601 -25603 -25609 -25621 -25633 -25639 -25643 -25657 -25667 -25673 -25679 -25693 -25703 -25717 -25733 -25741 -25747 -25759 -25763 -25771 -25793 -25799 -25801 -25819 -25841 -25847 -25849 -25867 -25873 -25889 -25903 -25913 -25919 -25931 -25933 -25939 -25943 -25951 -25969 -25981 -25997 -25999 -26003 -26017 -26021 -26029 -26041 -26053 -26083 -26099 -26107 -26111 -26113 -26119 -26141 -26153 -26161 -26171 -26177 -26183 -26189 -26203 -26209 -26227 -26237 -26249 -26251 -26261 -26263 -26267 -26293 -26297 -26309 -26317 -26321 -26339 -26347 -26357 -26371 -26387 -26393 -26399 -26407 -26417 -26423 -26431 -26437 -26449 -26459 -26479 -26489 -26497 -26501 -26513 -26539 -26557 -26561 -26573 -26591 -26597 -26627 -26633 -26641 -26647 -26669 -26681 -26683 -26687 -26693 -26699 -26701 -26711 -26713 -26717 -26723 -26729 -26731 -26737 -26759 -26777 -26783 -26801 -26813 -26821 -26833 -26839 -26849 -26861 -26863 -26879 -26881 -26891 -26893 -26903 -26921 -26927 -26947 -26951 -26953 -26959 -26981 -26987 -26993 -27011 -27017 -27031 -27043 -27059 -27061 -27067 -27073 -27077 -27091 -27103 -27107 -27109 -27127 -27143 -27179 -27191 -27197 -27211 -27239 -27241 -27253 -27259 -27271 -27277 -27281 -27283 -27299 -27329 -27337 -27361 -27367 -27397 -27407 -27409 -27427 -27431 -27437 -27449 -27457 -27479 -27481 -27487 -27509 -27527 -27529 -27539 -27541 -27551 -27581 -27583 -27611 -27617 -27631 -27647 -27653 -27673 -27689 -27691 -27697 -27701 -27733 -27737 -27739 -27743 -27749 -27751 -27763 -27767 -27773 -27779 -27791 -27793 -27799 -27803 -27809 -27817 -27823 -27827 -27847 -27851 -27883 -27893 -27901 -27917 -27919 -27941 -27943 -27947 -27953 -27961 -27967 -27983 -27997 -28001 -28019 -28027 -28031 -28051 -28057 -28069 -28081 -28087 -28097 -28099 -28109 -28111 -28123 -28151 -28163 -28181 -28183 -28201 -28211 -28219 -28229 -28277 -28279 -28283 -28289 -28297 -28307 -28309 -28319 -28349 -28351 -28387 -28393 -28403 -28409 -28411 -28429 -28433 -28439 -28447 -28463 -28477 -28493 -28499 -28513 -28517 -28537 -28541 -28547 -28549 -28559 -28571 -28573 -28579 -28591 -28597 -28603 -28607 -28619 -28621 -28627 -28631 -28643 -28649 -28657 -28661 -28663 -28669 -28687 -28697 -28703 -28711 -28723 -28729 -28751 -28753 -28759 -28771 -28789 -28793 -28807 -28813 -28817 -28837 -28843 -28859 -28867 -28871 -28879 -28901 -28909 -28921 -28927 -28933 -28949 -28961 -28979 -29009 -29017 -29021 -29023 -29027 -29033 -29059 -29063 -29077 -29101 -29123 -29129 -29131 -29137 -29147 -29153 -29167 -29173 -29179 -29191 -29201 -29207 -29209 -29221 -29231 -29243 -29251 -29269 -29287 -29297 -29303 -29311 -29327 -29333 -29339 -29347 -29363 -29383 -29387 -29389 -29399 -29401 -29411 -29423 -29429 -29437 -29443 -29453 -29473 -29483 -29501 -29527 -29531 -29537 -29567 -29569 -29573 -29581 -29587 -29599 -29611 -29629 -29633 -29641 -29663 -29669 -29671 -29683 -29717 -29723 -29741 -29753 -29759 -29761 -29789 -29803 -29819 -29833 -29837 -29851 -29863 -29867 -29873 -29879 -29881 -29917 -29921 -29927 -29947 -29959 -29983 -29989 -30011 -30013 -30029 -30047 -30059 -30071 -30089 -30091 -30097 -30103 -30109 -30113 -30119 -30133 -30137 -30139 -30161 -30169 -30181 -30187 -30197 -30203 -30211 -30223 -30241 -30253 -30259 -30269 -30271 -30293 -30307 -30313 -30319 -30323 -30341 -30347 -30367 -30389 -30391 -30403 -30427 -30431 -30449 -30467 -30469 -30491 -30493 -30497 -30509 -30517 -30529 -30539 -30553 -30557 -30559 -30577 -30593 -30631 -30637 -30643 -30649 -30661 -30671 -30677 -30689 -30697 -30703 -30707 -30713 -30727 -30757 -30763 -30773 -30781 -30803 -30809 -30817 -30829 -30839 -30841 -30851 -30853 -30859 -30869 -30871 -30881 -30893 -30911 -30931 -30937 -30941 -30949 -30971 -30977 -30983 -31013 -31019 -31033 -31039 -31051 -31063 -31069 -31079 -31081 -31091 -31121 -31123 -31139 -31147 -31151 -31153 -31159 -31177 -31181 -31183 -31189 -31193 -31219 -31223 -31231 -31237 -31247 -31249 -31253 -31259 -31267 -31271 -31277 -31307 -31319 -31321 -31327 -31333 -31337 -31357 -31379 -31387 -31391 -31393 -31397 -31469 -31477 -31481 -31489 -31511 -31513 -31517 -31531 -31541 -31543 -31547 -31567 -31573 -31583 -31601 -31607 -31627 -31643 -31649 -31657 -31663 -31667 -31687 -31699 -31721 -31723 -31727 -31729 -31741 -31751 -31769 -31771 -31793 -31799 -31817 -31847 -31849 -31859 -31873 -31883 -31891 -31907 -31957 -31963 -31973 -31981 -31991 -32003 -32009 -32027 -32029 -32051 -32057 -32059 -32063 -32069 -32077 -32083 -32089 -32099 -32117 -32119 -32141 -32143 -32159 -32173 -32183 -32189 -32191 -32203 -32213 -32233 -32237 -32251 -32257 -32261 -32297 -32299 -32303 -32309 -32321 -32323 -32327 -32341 -32353 -32359 -32363 -32369 -32371 -32377 -32381 -32401 -32411 -32413 -32423 -32429 -32441 -32443 -32467 -32479 -32491 -32497 -32503 -32507 -32531 -32533 -32537 -32561 -32563 -32569 -32573 -32579 -32587 -32603 -32609 -32611 -32621 -32633 -32647 -32653 -32687 -32693 -32707 -32713 -32717 -32719 -32749 -32771 -32779 -32783 -32789 -32797 -32801 -32803 -32831 -32833 -32839 -32843 -32869 -32887 -32909 -32911 -32917 -32933 -32939 -32941 -32957 -32969 -32971 -32983 -32987 -32993 -32999 -33013 -33023 -33029 -33037 -33049 -33053 -33071 -33073 -33083 -33091 -33107 -33113 -33119 -33149 -33151 -33161 -33179 -33181 -33191 -33199 -33203 -33211 -33223 -33247 -33287 -33289 -33301 -33311 -33317 -33329 -33331 -33343 -33347 -33349 -33353 -33359 -33377 -33391 -33403 -33409 -33413 -33427 -33457 -33461 -33469 -33479 -33487 -33493 -33503 -33521 -33529 -33533 -33547 -33563 -33569 -33577 -33581 -33587 -33589 -33599 -33601 -33613 -33617 -33619 -33623 -33629 -33637 -33641 -33647 -33679 -33703 -33713 -33721 -33739 -33749 -33751 -33757 -33767 -33769 -33773 -33791 -33797 -33809 -33811 -33827 -33829 -33851 -33857 -33863 -33871 -33889 -33893 -33911 -33923 -33931 -33937 -33941 -33961 -33967 -33997 -34019 -34031 -34033 -34039 -34057 -34061 -34123 -34127 -34129 -34141 -34147 -34157 -34159 -34171 -34183 -34211 -34213 -34217 -34231 -34253 -34259 -34261 -34267 -34273 -34283 -34297 -34301 -34303 -34313 -34319 -34327 -34337 -34351 -34361 -34367 -34369 -34381 -34403 -34421 -34429 -34439 -34457 -34469 -34471 -34483 -34487 -34499 -34501 -34511 -34513 -34519 -34537 -34543 -34549 -34583 -34589 -34591 -34603 -34607 -34613 -34631 -34649 -34651 -34667 -34673 -34679 -34687 -34693 -34703 -34721 -34729 -34739 -34747 -34757 -34759 -34763 -34781 -34807 -34819 -34841 -34843 -34847 -34849 -34871 -34877 -34883 -34897 -34913 -34919 -34939 -34949 -34961 -34963 -34981 -35023 -35027 -35051 -35053 -35059 -35069 -35081 -35083 -35089 -35099 -35107 -35111 -35117 -35129 -35141 -35149 -35153 -35159 -35171 -35201 -35221 -35227 -35251 -35257 -35267 -35279 -35281 -35291 -35311 -35317 -35323 -35327 -35339 -35353 -35363 -35381 -35393 -35401 -35407 -35419 -35423 -35437 -35447 -35449 -35461 -35491 -35507 -35509 -35521 -35527 -35531 -35533 -35537 -35543 -35569 -35573 -35591 -35593 -35597 -35603 -35617 -35671 -35677 -35729 -35731 -35747 -35753 -35759 -35771 -35797 -35801 -35803 -35809 -35831 -35837 -35839 -35851 -35863 -35869 -35879 -35897 -35899 -35911 -35923 -35933 -35951 -35963 -35969 -35977 -35983 -35993 -35999 -36007 -36011 -36013 -36017 -36037 -36061 -36067 -36073 -36083 -36097 -36107 -36109 -36131 -36137 -36151 -36161 -36187 -36191 -36209 -36217 -36229 -36241 -36251 -36263 -36269 -36277 -36293 -36299 -36307 -36313 -36319 -36341 -36343 -36353 -36373 -36383 -36389 -36433 -36451 -36457 -36467 -36469 -36473 -36479 -36493 -36497 -36523 -36527 -36529 -36541 -36551 -36559 -36563 -36571 -36583 -36587 -36599 -36607 -36629 -36637 -36643 -36653 -36671 -36677 -36683 -36691 -36697 -36709 -36713 -36721 -36739 -36749 -36761 -36767 -36779 -36781 -36787 -36791 -36793 -36809 -36821 -36833 -36847 -36857 -36871 -36877 -36887 -36899 -36901 -36913 -36919 -36923 -36929 -36931 -36943 -36947 -36973 -36979 -36997 -37003 -37013 -37019 -37021 -37039 -37049 -37057 -37061 -37087 -37097 -37117 -37123 -37139 -37159 -37171 -37181 -37189 -37199 -37201 -37217 -37223 -37243 -37253 -37273 -37277 -37307 -37309 -37313 -37321 -37337 -37339 -37357 -37361 -37363 -37369 -37379 -37397 -37409 -37423 -37441 -37447 -37463 -37483 -37489 -37493 -37501 -37507 -37511 -37517 -37529 -37537 -37547 -37549 -37561 -37567 -37571 -37573 -37579 -37589 -37591 -37607 -37619 -37633 -37643 -37649 -37657 -37663 -37691 -37693 -37699 -37717 -37747 -37781 -37783 -37799 -37811 -37813 -37831 -37847 -37853 -37861 -37871 -37879 -37889 -37897 -37907 -37951 -37957 -37963 -37967 -37987 -37991 -37993 -37997 -38011 -38039 -38047 -38053 -38069 -38083 -38113 -38119 -38149 -38153 -38167 -38177 -38183 -38189 -38197 -38201 -38219 -38231 -38237 -38239 -38261 -38273 -38281 -38287 -38299 -38303 -38317 -38321 -38327 -38329 -38333 -38351 -38371 -38377 -38393 -38431 -38447 -38449 -38453 -38459 -38461 -38501 -38543 -38557 -38561 -38567 -38569 -38593 -38603 -38609 -38611 -38629 -38639 -38651 -38653 -38669 -38671 -38677 -38693 -38699 -38707 -38711 -38713 -38723 -38729 -38737 -38747 -38749 -38767 -38783 -38791 -38803 -38821 -38833 -38839 -38851 -38861 -38867 -38873 -38891 -38903 -38917 -38921 -38923 -38933 -38953 -38959 -38971 -38977 -38993 -39019 -39023 -39041 -39043 -39047 -39079 -39089 -39097 -39103 -39107 -39113 -39119 -39133 -39139 -39157 -39161 -39163 -39181 -39191 -39199 -39209 -39217 -39227 -39229 -39233 -39239 -39241 -39251 -39293 -39301 -39313 -39317 -39323 -39341 -39343 -39359 -39367 -39371 -39373 -39383 -39397 -39409 -39419 -39439 -39443 -39451 -39461 -39499 -39503 -39509 -39511 -39521 -39541 -39551 -39563 -39569 -39581 -39607 -39619 -39623 -39631 -39659 -39667 -39671 -39679 -39703 -39709 -39719 -39727 -39733 -39749 -39761 -39769 -39779 -39791 -39799 -39821 -39827 -39829 -39839 -39841 -39847 -39857 -39863 -39869 -39877 -39883 -39887 -39901 -39929 -39937 -39953 -39971 -39979 -39983 -39989 -40009 -40013 -40031 -40037 -40039 -40063 -40087 -40093 -40099 -40111 -40123 -40127 -40129 -40151 -40153 -40163 -40169 -40177 -40189 -40193 -40213 -40231 -40237 -40241 -40253 -40277 -40283 -40289 -40343 -40351 -40357 -40361 -40387 -40423 -40427 -40429 -40433 -40459 -40471 -40483 -40487 -40493 -40499 -40507 -40519 -40529 -40531 -40543 -40559 -40577 -40583 -40591 -40597 -40609 -40627 -40637 -40639 -40693 -40697 -40699 -40709 -40739 -40751 -40759 -40763 -40771 -40787 -40801 -40813 -40819 -40823 -40829 -40841 -40847 -40849 -40853 -40867 -40879 -40883 -40897 -40903 -40927 -40933 -40939 -40949 -40961 -40973 -40993 -41011 -41017 -41023 -41039 -41047 -41051 -41057 -41077 -41081 -41113 -41117 -41131 -41141 -41143 -41149 -41161 -41177 -41179 -41183 -41189 -41201 -41203 -41213 -41221 -41227 -41231 -41233 -41243 -41257 -41263 -41269 -41281 -41299 -41333 -41341 -41351 -41357 -41381 -41387 -41389 -41399 -41411 -41413 -41443 -41453 -41467 -41479 -41491 -41507 -41513 -41519 -41521 -41539 -41543 -41549 -41579 -41593 -41597 -41603 -41609 -41611 -41617 -41621 -41627 -41641 -41647 -41651 -41659 -41669 -41681 -41687 -41719 -41729 -41737 -41759 -41761 -41771 -41777 -41801 -41809 -41813 -41843 -41849 -41851 -41863 -41879 -41887 -41893 -41897 -41903 -41911 -41927 -41941 -41947 -41953 -41957 -41959 -41969 -41981 -41983 -41999 -42013 -42017 -42019 -42023 -42043 -42061 -42071 -42073 -42083 -42089 -42101 -42131 -42139 -42157 -42169 -42179 -42181 -42187 -42193 -42197 -42209 -42221 -42223 -42227 -42239 -42257 -42281 -42283 -42293 -42299 -42307 -42323 -42331 -42337 -42349 -42359 -42373 -42379 -42391 -42397 -42403 -42407 -42409 -42433 -42437 -42443 -42451 -42457 -42461 -42463 -42467 -42473 -42487 -42491 -42499 -42509 -42533 -42557 -42569 -42571 -42577 -42589 -42611 -42641 -42643 -42649 -42667 -42677 -42683 -42689 -42697 -42701 -42703 -42709 -42719 -42727 -42737 -42743 -42751 -42767 -42773 -42787 -42793 -42797 -42821 -42829 -42839 -42841 -42853 -42859 -42863 -42899 -42901 -42923 -42929 -42937 -42943 -42953 -42961 -42967 -42979 -42989 -43003 -43013 -43019 -43037 -43049 -43051 -43063 -43067 -43093 -43103 -43117 -43133 -43151 -43159 -43177 -43189 -43201 -43207 -43223 -43237 -43261 -43271 -43283 -43291 -43313 -43319 -43321 -43331 -43391 -43397 -43399 -43403 -43411 -43427 -43441 -43451 -43457 -43481 -43487 -43499 -43517 -43541 -43543 -43573 -43577 -43579 -43591 -43597 -43607 -43609 -43613 -43627 -43633 -43649 -43651 -43661 -43669 -43691 -43711 -43717 -43721 -43753 -43759 -43777 -43781 -43783 -43787 -43789 -43793 -43801 -43853 -43867 -43889 -43891 -43913 -43933 -43943 -43951 -43961 -43963 -43969 -43973 -43987 -43991 -43997 -44017 -44021 -44027 -44029 -44041 -44053 -44059 -44071 -44087 -44089 -44101 -44111 -44119 -44123 -44129 -44131 -44159 -44171 -44179 -44189 -44201 -44203 -44207 -44221 -44249 -44257 -44263 -44267 -44269 -44273 -44279 -44281 -44293 -44351 -44357 -44371 -44381 -44383 -44389 -44417 -44449 -44453 -44483 -44491 -44497 -44501 -44507 -44519 -44531 -44533 -44537 -44543 -44549 -44563 -44579 -44587 -44617 -44621 -44623 -44633 -44641 -44647 -44651 -44657 -44683 -44687 -44699 -44701 -44711 -44729 -44741 -44753 -44771 -44773 -44777 -44789 -44797 -44809 -44819 -44839 -44843 -44851 -44867 -44879 -44887 -44893 -44909 -44917 -44927 -44939 -44953 -44959 -44963 -44971 -44983 -44987 -45007 -45013 -45053 -45061 -45077 -45083 -45119 -45121 -45127 -45131 -45137 -45139 -45161 -45179 -45181 -45191 -45197 -45233 -45247 -45259 -45263 -45281 -45289 -45293 -45307 -45317 -45319 -45329 -45337 -45341 -45343 -45361 -45377 -45389 -45403 -45413 -45427 -45433 -45439 -45481 -45491 -45497 -45503 -45523 -45533 -45541 -45553 -45557 -45569 -45587 -45589 -45599 -45613 -45631 -45641 -45659 -45667 -45673 -45677 -45691 -45697 -45707 -45737 -45751 -45757 -45763 -45767 -45779 -45817 -45821 -45823 -45827 -45833 -45841 -45853 -45863 -45869 -45887 -45893 -45943 -45949 -45953 -45959 -45971 -45979 -45989 -46021 -46027 -46049 -46051 -46061 -46073 -46091 -46093 -46099 -46103 -46133 -46141 -46147 -46153 -46171 -46181 -46183 -46187 -46199 -46219 -46229 -46237 -46261 -46271 -46273 -46279 -46301 -46307 -46309 -46327 -46337 -46349 -46351 -46381 -46399 -46411 -46439 -46441 -46447 -46451 -46457 -46471 -46477 -46489 -46499 -46507 -46511 -46523 -46549 -46559 -46567 -46573 -46589 -46591 -46601 -46619 -46633 -46639 -46643 -46649 -46663 -46679 -46681 -46687 -46691 -46703 -46723 -46727 -46747 -46751 -46757 -46769 -46771 -46807 -46811 -46817 -46819 -46829 -46831 -46853 -46861 -46867 -46877 -46889 -46901 -46919 -46933 -46957 -46993 -46997 -47017 -47041 -47051 -47057 -47059 -47087 -47093 -47111 -47119 -47123 -47129 -47137 -47143 -47147 -47149 -47161 -47189 -47207 -47221 -47237 -47251 -47269 -47279 -47287 -47293 -47297 -47303 -47309 -47317 -47339 -47351 -47353 -47363 -47381 -47387 -47389 -47407 -47417 -47419 -47431 -47441 -47459 -47491 -47497 -47501 -47507 -47513 -47521 -47527 -47533 -47543 -47563 -47569 -47581 -47591 -47599 -47609 -47623 -47629 -47639 -47653 -47657 -47659 -47681 -47699 -47701 -47711 -47713 -47717 -47737 -47741 -47743 -47777 -47779 -47791 -47797 -47807 -47809 -47819 -47837 -47843 -47857 -47869 -47881 -47903 -47911 -47917 -47933 -47939 -47947 -47951 -47963 -47969 -47977 -47981 -48017 -48023 -48029 -48049 -48073 -48079 -48091 -48109 -48119 -48121 -48131 -48157 -48163 -48179 -48187 -48193 -48197 -48221 -48239 -48247 -48259 -48271 -48281 -48299 -48311 -48313 -48337 -48341 -48353 -48371 -48383 -48397 -48407 -48409 -48413 -48437 -48449 -48463 -48473 -48479 -48481 -48487 -48491 -48497 -48523 -48527 -48533 -48539 -48541 -48563 -48571 -48589 -48593 -48611 -48619 -48623 -48647 -48649 -48661 -48673 -48677 -48679 -48731 -48733 -48751 -48757 -48761 -48767 -48779 -48781 -48787 -48799 -48809 -48817 -48821 -48823 -48847 -48857 -48859 -48869 -48871 -48883 -48889 -48907 -48947 -48953 -48973 -48989 -48991 -49003 -49009 -49019 -49031 -49033 -49037 -49043 -49057 -49069 -49081 -49103 -49109 -49117 -49121 -49123 -49139 -49157 -49169 -49171 -49177 -49193 -49199 -49201 -49207 -49211 -49223 -49253 -49261 -49277 -49279 -49297 -49307 -49331 -49333 -49339 -49363 -49367 -49369 -49391 -49393 -49409 -49411 -49417 -49429 -49433 -49451 -49459 -49463 -49477 -49481 -49499 -49523 -49529 -49531 -49537 -49547 -49549 -49559 -49597 -49603 -49613 -49627 -49633 -49639 -49663 -49667 -49669 -49681 -49697 -49711 -49727 -49739 -49741 -49747 -49757 -49783 -49787 -49789 -49801 -49807 -49811 -49823 -49831 -49843 -49853 -49871 -49877 -49891 -49919 -49921 -49927 -49937 -49939 -49943 -49957 -49991 -49993 -49999 -50021 -50023 -50033 -50047 -50051 -50053 -50069 -50077 -50087 -50093 -50101 -50111 -50119 -50123 -50129 -50131 -50147 -50153 -50159 -50177 -50207 -50221 -50227 -50231 -50261 -50263 -50273 -50287 -50291 -50311 -50321 -50329 -50333 -50341 -50359 -50363 -50377 -50383 -50387 -50411 -50417 -50423 -50441 -50459 -50461 -50497 -50503 -50513 -50527 -50539 -50543 -50549 -50551 -50581 -50587 -50591 -50593 -50599 -50627 -50647 -50651 -50671 -50683 -50707 -50723 -50741 -50753 -50767 -50773 -50777 -50789 -50821 -50833 -50839 -50849 -50857 -50867 -50873 -50891 -50893 -50909 -50923 -50929 -50951 -50957 -50969 -50971 -50989 -50993 -51001 -51031 -51043 -51047 -51059 -51061 -51071 -51109 -51131 -51133 -51137 -51151 -51157 -51169 -51193 -51197 -51199 -51203 -51217 -51229 -51239 -51241 -51257 -51263 -51283 -51287 -51307 -51329 -51341 -51343 -51347 -51349 -51361 -51383 -51407 -51413 -51419 -51421 -51427 -51431 -51437 -51439 -51449 -51461 -51473 -51479 -51481 -51487 -51503 -51511 -51517 -51521 -51539 -51551 -51563 -51577 -51581 -51593 -51599 -51607 -51613 -51631 -51637 -51647 -51659 -51673 -51679 -51683 -51691 -51713 -51719 -51721 -51749 -51767 -51769 -51787 -51797 -51803 -51817 -51827 -51829 -51839 -51853 -51859 -51869 -51871 -51893 -51899 -51907 -51913 -51929 -51941 -51949 -51971 -51973 -51977 -51991 -52009 -52021 -52027 -52051 -52057 -52067 -52069 -52081 -52103 -52121 -52127 -52147 -52153 -52163 -52177 -52181 -52183 -52189 -52201 -52223 -52237 -52249 -52253 -52259 -52267 -52289 -52291 -52301 -52313 -52321 -52361 -52363 -52369 -52379 -52387 -52391 -52433 -52453 -52457 -52489 -52501 -52511 -52517 -52529 -52541 -52543 -52553 -52561 -52567 -52571 -52579 -52583 -52609 -52627 -52631 -52639 -52667 -52673 -52691 -52697 -52709 -52711 -52721 -52727 -52733 -52747 -52757 -52769 -52783 -52807 -52813 -52817 -52837 -52859 -52861 -52879 -52883 -52889 -52901 -52903 -52919 -52937 -52951 -52957 -52963 -52967 -52973 -52981 -52999 -53003 -53017 -53047 -53051 -53069 -53077 -53087 -53089 -53093 -53101 -53113 -53117 -53129 -53147 -53149 -53161 -53171 -53173 -53189 -53197 -53201 -53231 -53233 -53239 -53267 -53269 -53279 -53281 -53299 -53309 -53323 -53327 -53353 -53359 -53377 -53381 -53401 -53407 -53411 -53419 -53437 -53441 -53453 -53479 -53503 -53507 -53527 -53549 -53551 -53569 -53591 -53593 -53597 -53609 -53611 -53617 -53623 -53629 -53633 -53639 -53653 -53657 -53681 -53693 -53699 -53717 -53719 -53731 -53759 -53773 -53777 -53783 -53791 -53813 -53819 -53831 -53849 -53857 -53861 -53881 -53887 -53891 -53897 -53899 -53917 -53923 -53927 -53939 -53951 -53959 -53987 -53993 -54001 -54011 -54013 -54037 -54049 -54059 -54083 -54091 -54101 -54121 -54133 -54139 -54151 -54163 -54167 -54181 -54193 -54217 -54251 -54269 -54277 -54287 -54293 -54311 -54319 -54323 -54331 -54347 -54361 -54367 -54371 -54377 -54401 -54403 -54409 -54413 -54419 -54421 -54437 -54443 -54449 -54469 -54493 -54497 -54499 -54503 -54517 -54521 -54539 -54541 -54547 -54559 -54563 -54577 -54581 -54583 -54601 -54617 -54623 -54629 -54631 -54647 -54667 -54673 -54679 -54709 -54713 -54721 -54727 -54751 -54767 -54773 -54779 -54787 -54799 -54829 -54833 -54851 -54869 -54877 -54881 -54907 -54917 -54919 -54941 -54949 -54959 -54973 -54979 -54983 -55001 -55009 -55021 -55049 -55051 -55057 -55061 -55073 -55079 -55103 -55109 -55117 -55127 -55147 -55163 -55171 -55201 -55207 -55213 -55217 -55219 -55229 -55243 -55249 -55259 -55291 -55313 -55331 -55333 -55337 -55339 -55343 -55351 -55373 -55381 -55399 -55411 -55439 -55441 -55457 -55469 -55487 -55501 -55511 -55529 -55541 -55547 -55579 -55589 -55603 -55609 -55619 -55621 -55631 -55633 -55639 -55661 -55663 -55667 -55673 -55681 -55691 -55697 -55711 -55717 -55721 -55733 -55763 -55787 -55793 -55799 -55807 -55813 -55817 -55819 -55823 -55829 -55837 -55843 -55849 -55871 -55889 -55897 -55901 -55903 -55921 -55927 -55931 -55933 -55949 -55967 -55987 -55997 -56003 -56009 -56039 -56041 -56053 -56081 -56087 -56093 -56099 -56101 -56113 -56123 -56131 -56149 -56167 -56171 -56179 -56197 -56207 -56209 -56237 -56239 -56249 -56263 -56267 -56269 -56299 -56311 -56333 -56359 -56369 -56377 -56383 -56393 -56401 -56417 -56431 -56437 -56443 -56453 -56467 -56473 -56477 -56479 -56489 -56501 -56503 -56509 -56519 -56527 -56531 -56533 -56543 -56569 -56591 -56597 -56599 -56611 -56629 -56633 -56659 -56663 -56671 -56681 -56687 -56701 -56711 -56713 -56731 -56737 -56747 -56767 -56773 -56779 -56783 -56807 -56809 -56813 -56821 -56827 -56843 -56857 -56873 -56891 -56893 -56897 -56909 -56911 -56921 -56923 -56929 -56941 -56951 -56957 -56963 -56983 -56989 -56993 -56999 -57037 -57041 -57047 -57059 -57073 -57077 -57089 -57097 -57107 -57119 -57131 -57139 -57143 -57149 -57163 -57173 -57179 -57191 -57193 -57203 -57221 -57223 -57241 -57251 -57259 -57269 -57271 -57283 -57287 -57301 -57329 -57331 -57347 -57349 -57367 -57373 -57383 -57389 -57397 -57413 -57427 -57457 -57467 -57487 -57493 -57503 -57527 -57529 -57557 -57559 -57571 -57587 -57593 -57601 -57637 -57641 -57649 -57653 -57667 -57679 -57689 -57697 -57709 -57713 -57719 -57727 -57731 -57737 -57751 -57773 -57781 -57787 -57791 -57793 -57803 -57809 -57829 -57839 -57847 -57853 -57859 -57881 -57899 -57901 -57917 -57923 -57943 -57947 -57973 -57977 -57991 -58013 -58027 -58031 -58043 -58049 -58057 -58061 -58067 -58073 -58099 -58109 -58111 -58129 -58147 -58151 -58153 -58169 -58171 -58189 -58193 -58199 -58207 -58211 -58217 -58229 -58231 -58237 -58243 -58271 -58309 -58313 -58321 -58337 -58363 -58367 -58369 -58379 -58391 -58393 -58403 -58411 -58417 -58427 -58439 -58441 -58451 -58453 -58477 -58481 -58511 -58537 -58543 -58549 -58567 -58573 -58579 -58601 -58603 -58613 -58631 -58657 -58661 -58679 -58687 -58693 -58699 -58711 -58727 -58733 -58741 -58757 -58763 -58771 -58787 -58789 -58831 -58889 -58897 -58901 -58907 -58909 -58913 -58921 -58937 -58943 -58963 -58967 -58979 -58991 -58997 -59009 -59011 -59021 -59023 -59029 -59051 -59053 -59063 -59069 -59077 -59083 -59093 -59107 -59113 -59119 -59123 -59141 -59149 -59159 -59167 -59183 -59197 -59207 -59209 -59219 -59221 -59233 -59239 -59243 -59263 -59273 -59281 -59333 -59341 -59351 -59357 -59359 -59369 -59377 -59387 -59393 -59399 -59407 -59417 -59419 -59441 -59443 -59447 -59453 -59467 -59471 -59473 -59497 -59509 -59513 -59539 -59557 -59561 -59567 -59581 -59611 -59617 -59621 -59627 -59629 -59651 -59659 -59663 -59669 -59671 -59693 -59699 -59707 -59723 -59729 -59743 -59747 -59753 -59771 -59779 -59791 -59797 -59809 -59833 -59863 -59879 -59887 -59921 -59929 -59951 -59957 -59971 -59981 -59999 -60013 -60017 -60029 -60037 -60041 -60077 -60083 -60089 -60091 -60101 -60103 -60107 -60127 -60133 -60139 -60149 -60161 -60167 -60169 -60209 -60217 -60223 -60251 -60257 -60259 -60271 -60289 -60293 -60317 -60331 -60337 -60343 -60353 -60373 -60383 -60397 -60413 -60427 -60443 -60449 -60457 -60493 -60497 -60509 -60521 -60527 -60539 -60589 -60601 -60607 -60611 -60617 -60623 -60631 -60637 -60647 -60649 -60659 -60661 -60679 -60689 -60703 -60719 -60727 -60733 -60737 -60757 -60761 -60763 -60773 -60779 -60793 -60811 -60821 -60859 -60869 -60887 -60889 -60899 -60901 -60913 -60917 -60919 -60923 -60937 -60943 -60953 -60961 -61001 -61007 -61027 -61031 -61043 -61051 -61057 -61091 -61099 -61121 -61129 -61141 -61151 -61153 -61169 -61211 -61223 -61231 -61253 -61261 -61283 -61291 -61297 -61331 -61333 -61339 -61343 -61357 -61363 -61379 -61381 -61403 -61409 -61417 -61441 -61463 -61469 -61471 -61483 -61487 -61493 -61507 -61511 -61519 -61543 -61547 -61553 -61559 -61561 -61583 -61603 -61609 -61613 -61627 -61631 -61637 -61643 -61651 -61657 -61667 -61673 -61681 -61687 -61703 -61717 -61723 -61729 -61751 -61757 -61781 -61813 -61819 -61837 -61843 -61861 -61871 -61879 -61909 -61927 -61933 -61949 -61961 -61967 -61979 -61981 -61987 -61991 -62003 -62011 -62017 -62039 -62047 -62053 -62057 -62071 -62081 -62099 -62119 -62129 -62131 -62137 -62141 -62143 -62171 -62189 -62191 -62201 -62207 -62213 -62219 -62233 -62273 -62297 -62299 -62303 -62311 -62323 -62327 -62347 -62351 -62383 -62401 -62417 -62423 -62459 -62467 -62473 -62477 -62483 -62497 -62501 -62507 -62533 -62539 -62549 -62563 -62581 -62591 -62597 -62603 -62617 -62627 -62633 -62639 -62653 -62659 -62683 -62687 -62701 -62723 -62731 -62743 -62753 -62761 -62773 -62791 -62801 -62819 -62827 -62851 -62861 -62869 -62873 -62897 -62903 -62921 -62927 -62929 -62939 -62969 -62971 -62981 -62983 -62987 -62989 -63029 -63031 -63059 -63067 -63073 -63079 -63097 -63103 -63113 -63127 -63131 -63149 -63179 -63197 -63199 -63211 -63241 -63247 -63277 -63281 -63299 -63311 -63313 -63317 -63331 -63337 -63347 -63353 -63361 -63367 -63377 -63389 -63391 -63397 -63409 -63419 -63421 -63439 -63443 -63463 -63467 -63473 -63487 -63493 -63499 -63521 -63527 -63533 -63541 -63559 -63577 -63587 -63589 -63599 -63601 -63607 -63611 -63617 -63629 -63647 -63649 -63659 -63667 -63671 -63689 -63691 -63697 -63703 -63709 -63719 -63727 -63737 -63743 -63761 -63773 -63781 -63793 -63799 -63803 -63809 -63823 -63839 -63841 -63853 -63857 -63863 -63901 -63907 -63913 -63929 -63949 -63977 -63997 -64007 -64013 -64019 -64033 -64037 -64063 -64067 -64081 -64091 -64109 -64123 -64151 -64153 -64157 -64171 -64187 -64189 -64217 -64223 -64231 -64237 -64271 -64279 -64283 -64301 -64303 -64319 -64327 -64333 -64373 -64381 -64399 -64403 -64433 -64439 -64451 -64453 -64483 -64489 -64499 -64513 -64553 -64567 -64577 -64579 -64591 -64601 -64609 -64613 -64621 -64627 -64633 -64661 -64663 -64667 -64679 -64693 -64709 -64717 -64747 -64763 -64781 -64783 -64793 -64811 -64817 -64849 -64853 -64871 -64877 -64879 -64891 -64901 -64919 -64921 -64927 -64937 -64951 -64969 -64997 -65003 -65011 -65027 -65029 -65033 -65053 -65063 -65071 -65089 -65099 -65101 -65111 -65119 -65123 -65129 -65141 -65147 -65167 -65171 -65173 -65179 -65183 -65203 -65213 -65239 -65257 -65267 -65269 -65287 -65293 -65309 -65323 -65327 -65353 -65357 -65371 -65381 -65393 -65407 -65413 -65419 -65423 -65437 -65447 -65449 -65479 -65497 -65519 -65521 -65537 -65539 -65543 -65551 -65557 -65563 -65579 -65581 -65587 -65599 -65609 -65617 -65629 -65633 -65647 -65651 -65657 -65677 -65687 -65699 -65701 -65707 -65713 -65717 -65719 -65729 -65731 -65761 -65777 -65789 -65809 -65827 -65831 -65837 -65839 -65843 -65851 -65867 -65881 -65899 -65921 -65927 -65929 -65951 -65957 -65963 -65981 -65983 -65993 -66029 -66037 -66041 -66047 -66067 -66071 -66083 -66089 -66103 -66107 -66109 -66137 -66161 -66169 -66173 -66179 -66191 -66221 -66239 -66271 -66293 -66301 -66337 -66343 -66347 -66359 -66361 -66373 -66377 -66383 -66403 -66413 -66431 -66449 -66457 -66463 -66467 -66491 -66499 -66509 -66523 -66529 -66533 -66541 -66553 -66569 -66571 -66587 -66593 -66601 -66617 -66629 -66643 -66653 -66683 -66697 -66701 -66713 -66721 -66733 -66739 -66749 -66751 -66763 -66791 -66797 -66809 -66821 -66841 -66851 -66853 -66863 -66877 -66883 -66889 -66919 -66923 -66931 -66943 -66947 -66949 -66959 -66973 -66977 -67003 -67021 -67033 -67043 -67049 -67057 -67061 -67073 -67079 -67103 -67121 -67129 -67139 -67141 -67153 -67157 -67169 -67181 -67187 -67189 -67211 -67213 -67217 -67219 -67231 -67247 -67261 -67271 -67273 -67289 -67307 -67339 -67343 -67349 -67369 -67391 -67399 -67409 -67411 -67421 -67427 -67429 -67433 -67447 -67453 -67477 -67481 -67489 -67493 -67499 -67511 -67523 -67531 -67537 -67547 -67559 -67567 -67577 -67579 -67589 -67601 -67607 -67619 -67631 -67651 -67679 -67699 -67709 -67723 -67733 -67741 -67751 -67757 -67759 -67763 -67777 -67783 -67789 -67801 -67807 -67819 -67829 -67843 -67853 -67867 -67883 -67891 -67901 -67927 -67931 -67933 -67939 -67943 -67957 -67961 -67967 -67979 -67987 -67993 -68023 -68041 -68053 -68059 -68071 -68087 -68099 -68111 -68113 -68141 -68147 -68161 -68171 -68207 -68209 -68213 -68219 -68227 -68239 -68261 -68279 -68281 -68311 -68329 -68351 -68371 -68389 -68399 -68437 -68443 -68447 -68449 -68473 -68477 -68483 -68489 -68491 -68501 -68507 -68521 -68531 -68539 -68543 -68567 -68581 -68597 -68611 -68633 -68639 -68659 -68669 -68683 -68687 -68699 -68711 -68713 -68729 -68737 -68743 -68749 -68767 -68771 -68777 -68791 -68813 -68819 -68821 -68863 -68879 -68881 -68891 -68897 -68899 -68903 -68909 -68917 -68927 -68947 -68963 -68993 -69001 -69011 -69019 -69029 -69031 -69061 -69067 -69073 -69109 -69119 -69127 -69143 -69149 -69151 -69163 -69191 -69193 -69197 -69203 -69221 -69233 -69239 -69247 -69257 -69259 -69263 -69313 -69317 -69337 -69341 -69371 -69379 -69383 -69389 -69401 -69403 -69427 -69431 -69439 -69457 -69463 -69467 -69473 -69481 -69491 -69493 -69497 -69499 -69539 -69557 -69593 -69623 -69653 -69661 -69677 -69691 -69697 -69709 -69737 -69739 -69761 -69763 -69767 -69779 -69809 -69821 -69827 -69829 -69833 -69847 -69857 -69859 -69877 -69899 -69911 -69929 -69931 -69941 -69959 -69991 -69997 -70001 -70003 -70009 -70019 -70039 -70051 -70061 -70067 -70079 -70099 -70111 -70117 -70121 -70123 -70139 -70141 -70157 -70163 -70177 -70181 -70183 -70199 -70201 -70207 -70223 -70229 -70237 -70241 -70249 -70271 -70289 -70297 -70309 -70313 -70321 -70327 -70351 -70373 -70379 -70381 -70393 -70423 -70429 -70439 -70451 -70457 -70459 -70481 -70487 -70489 -70501 -70507 -70529 -70537 -70549 -70571 -70573 -70583 -70589 -70607 -70619 -70621 -70627 -70639 -70657 -70663 -70667 -70687 -70709 -70717 -70729 -70753 -70769 -70783 -70793 -70823 -70841 -70843 -70849 -70853 -70867 -70877 -70879 -70891 -70901 -70913 -70919 -70921 -70937 -70949 -70951 -70957 -70969 -70979 -70981 -70991 -70997 -70999 -71011 -71023 -71039 -71059 -71069 -71081 -71089 -71119 -71129 -71143 -71147 -71153 -71161 -71167 -71171 -71191 -71209 -71233 -71237 -71249 -71257 -71261 -71263 -71287 -71293 -71317 -71327 -71329 -71333 -71339 -71341 -71347 -71353 -71359 -71363 -71387 -71389 -71399 -71411 -71413 -71419 -71429 -71437 -71443 -71453 -71471 -71473 -71479 -71483 -71503 -71527 -71537 -71549 -71551 -71563 -71569 -71593 -71597 -71633 -71647 -71663 -71671 -71693 -71699 -71707 -71711 -71713 -71719 -71741 -71761 -71777 -71789 -71807 -71809 -71821 -71837 -71843 -71849 -71861 -71867 -71879 -71881 -71887 -71899 -71909 -71917 -71933 -71941 -71947 -71963 -71971 -71983 -71987 -71993 -71999 -72019 -72031 -72043 -72047 -72053 -72073 -72077 -72089 -72091 -72101 -72103 -72109 -72139 -72161 -72167 -72169 -72173 -72211 -72221 -72223 -72227 -72229 -72251 -72253 -72269 -72271 -72277 -72287 -72307 -72313 -72337 -72341 -72353 -72367 -72379 -72383 -72421 -72431 -72461 -72467 -72469 -72481 -72493 -72497 -72503 -72533 -72547 -72551 -72559 -72577 -72613 -72617 -72623 -72643 -72647 -72649 -72661 -72671 -72673 -72679 -72689 -72701 -72707 -72719 -72727 -72733 -72739 -72763 -72767 -72797 -72817 -72823 -72859 -72869 -72871 -72883 -72889 -72893 -72901 -72907 -72911 -72923 -72931 -72937 -72949 -72953 -72959 -72973 -72977 -72997 -73009 -73013 -73019 -73037 -73039 -73043 -73061 -73063 -73079 -73091 -73121 -73127 -73133 -73141 -73181 -73189 -73237 -73243 -73259 -73277 -73291 -73303 -73309 -73327 -73331 -73351 -73361 -73363 -73369 -73379 -73387 -73417 -73421 -73433 -73453 -73459 -73471 -73477 -73483 -73517 -73523 -73529 -73547 -73553 -73561 -73571 -73583 -73589 -73597 -73607 -73609 -73613 -73637 -73643 -73651 -73673 -73679 -73681 -73693 -73699 -73709 -73721 -73727 -73751 -73757 -73771 -73783 -73819 -73823 -73847 -73849 -73859 -73867 -73877 -73883 -73897 -73907 -73939 -73943 -73951 -73961 -73973 -73999 -74017 -74021 -74027 -74047 -74051 -74071 -74077 -74093 -74099 -74101 -74131 -74143 -74149 -74159 -74161 -74167 -74177 -74189 -74197 -74201 -74203 -74209 -74219 -74231 -74257 -74279 -74287 -74293 -74297 -74311 -74317 -74323 -74353 -74357 -74363 -74377 -74381 -74383 -74411 -74413 -74419 -74441 -74449 -74453 -74471 -74489 -74507 -74509 -74521 -74527 -74531 -74551 -74561 -74567 -74573 -74587 -74597 -74609 -74611 -74623 -74653 -74687 -74699 -74707 -74713 -74717 -74719 -74729 -74731 -74747 -74759 -74761 -74771 -74779 -74797 -74821 -74827 -74831 -74843 -74857 -74861 -74869 -74873 -74887 -74891 -74897 -74903 -74923 -74929 -74933 -74941 -74959 -75011 -75013 -75017 -75029 -75037 -75041 -75079 -75083 -75109 -75133 -75149 -75161 -75167 -75169 -75181 -75193 -75209 -75211 -75217 -75223 -75227 -75239 -75253 -75269 -75277 -75289 -75307 -75323 -75329 -75337 -75347 -75353 -75367 -75377 -75389 -75391 -75401 -75403 -75407 -75431 -75437 -75479 -75503 -75511 -75521 -75527 -75533 -75539 -75541 -75553 -75557 -75571 -75577 -75583 -75611 -75617 -75619 -75629 -75641 -75653 -75659 -75679 -75683 -75689 -75703 -75707 -75709 -75721 -75731 -75743 -75767 -75773 -75781 -75787 -75793 -75797 -75821 -75833 -75853 -75869 -75883 -75913 -75931 -75937 -75941 -75967 -75979 -75983 -75989 -75991 -75997 -76001 -76003 -76031 -76039 -76079 -76081 -76091 -76099 -76103 -76123 -76129 -76147 -76157 -76159 -76163 -76207 -76213 -76231 -76243 -76249 -76253 -76259 -76261 -76283 -76289 -76303 -76333 -76343 -76367 -76369 -76379 -76387 -76403 -76421 -76423 -76441 -76463 -76471 -76481 -76487 -76493 -76507 -76511 -76519 -76537 -76541 -76543 -76561 -76579 -76597 -76603 -76607 -76631 -76649 -76651 -76667 -76673 -76679 -76697 -76717 -76733 -76753 -76757 -76771 -76777 -76781 -76801 -76819 -76829 -76831 -76837 -76847 -76871 -76873 -76883 -76907 -76913 -76919 -76943 -76949 -76961 -76963 -76991 -77003 -77017 -77023 -77029 -77041 -77047 -77069 -77081 -77093 -77101 -77137 -77141 -77153 -77167 -77171 -77191 -77201 -77213 -77237 -77239 -77243 -77249 -77261 -77263 -77267 -77269 -77279 -77291 -77317 -77323 -77339 -77347 -77351 -77359 -77369 -77377 -77383 -77417 -77419 -77431 -77447 -77471 -77477 -77479 -77489 -77491 -77509 -77513 -77521 -77527 -77543 -77549 -77551 -77557 -77563 -77569 -77573 -77587 -77591 -77611 -77617 -77621 -77641 -77647 -77659 -77681 -77687 -77689 -77699 -77711 -77713 -77719 -77723 -77731 -77743 -77747 -77761 -77773 -77783 -77797 -77801 -77813 -77839 -77849 -77863 -77867 -77893 -77899 -77929 -77933 -77951 -77969 -77977 -77983 -77999 -78007 -78017 -78031 -78041 -78049 -78059 -78079 -78101 -78121 -78137 -78139 -78157 -78163 -78167 -78173 -78179 -78191 -78193 -78203 -78229 -78233 -78241 -78259 -78277 -78283 -78301 -78307 -78311 -78317 -78341 -78347 -78367 -78401 -78427 -78437 -78439 -78467 -78479 -78487 -78497 -78509 -78511 -78517 -78539 -78541 -78553 -78569 -78571 -78577 -78583 -78593 -78607 -78623 -78643 -78649 -78653 -78691 -78697 -78707 -78713 -78721 -78737 -78779 -78781 -78787 -78791 -78797 -78803 -78809 -78823 -78839 -78853 -78857 -78877 -78887 -78889 -78893 -78901 -78919 -78929 -78941 -78977 -78979 -78989 -79031 -79039 -79043 -79063 -79087 -79103 -79111 -79133 -79139 -79147 -79151 -79153 -79159 -79181 -79187 -79193 -79201 -79229 -79231 -79241 -79259 -79273 -79279 -79283 -79301 -79309 -79319 -79333 -79337 -79349 -79357 -79367 -79379 -79393 -79397 -79399 -79411 -79423 -79427 -79433 -79451 -79481 -79493 -79531 -79537 -79549 -79559 -79561 -79579 -79589 -79601 -79609 -79613 -79621 -79627 -79631 -79633 -79657 -79669 -79687 -79691 -79693 -79697 -79699 -79757 -79769 -79777 -79801 -79811 -79813 -79817 -79823 -79829 -79841 -79843 -79847 -79861 -79867 -79873 -79889 -79901 -79903 -79907 -79939 -79943 -79967 -79973 -79979 -79987 -79997 -79999 -80021 -80039 -80051 -80071 -80077 -80107 -80111 -80141 -80147 -80149 -80153 -80167 -80173 -80177 -80191 -80207 -80209 -80221 -80231 -80233 -80239 -80251 -80263 -80273 -80279 -80287 -80309 -80317 -80329 -80341 -80347 -80363 -80369 -80387 -80407 -80429 -80447 -80449 -80471 -80473 -80489 -80491 -80513 -80527 -80537 -80557 -80567 -80599 -80603 -80611 -80621 -80627 -80629 -80651 -80657 -80669 -80671 -80677 -80681 -80683 -80687 -80701 -80713 -80737 -80747 -80749 -80761 -80777 -80779 -80783 -80789 -80803 -80809 -80819 -80831 -80833 -80849 -80863 -80897 -80909 -80911 -80917 -80923 -80929 -80933 -80953 -80963 -80989 -81001 -81013 -81017 -81019 -81023 -81031 -81041 -81043 -81047 -81049 -81071 -81077 -81083 -81097 -81101 -81119 -81131 -81157 -81163 -81173 -81181 -81197 -81199 -81203 -81223 -81233 -81239 -81281 -81283 -81293 -81299 -81307 -81331 -81343 -81349 -81353 -81359 -81371 -81373 -81401 -81409 -81421 -81439 -81457 -81463 -81509 -81517 -81527 -81533 -81547 -81551 -81553 -81559 -81563 -81569 -81611 -81619 -81629 -81637 -81647 -81649 -81667 -81671 -81677 -81689 -81701 -81703 -81707 -81727 -81737 -81749 -81761 -81769 -81773 -81799 -81817 -81839 -81847 -81853 -81869 -81883 -81899 -81901 -81919 -81929 -81931 -81937 -81943 -81953 -81967 -81971 -81973 -82003 -82007 -82009 -82013 -82021 -82031 -82037 -82039 -82051 -82067 -82073 -82129 -82139 -82141 -82153 -82163 -82171 -82183 -82189 -82193 -82207 -82217 -82219 -82223 -82231 -82237 -82241 -82261 -82267 -82279 -82301 -82307 -82339 -82349 -82351 -82361 -82373 -82387 -82393 -82421 -82457 -82463 -82469 -82471 -82483 -82487 -82493 -82499 -82507 -82529 -82531 -82549 -82559 -82561 -82567 -82571 -82591 -82601 -82609 -82613 -82619 -82633 -82651 -82657 -82699 -82721 -82723 -82727 -82729 -82757 -82759 -82763 -82781 -82787 -82793 -82799 -82811 -82813 -82837 -82847 -82883 -82889 -82891 -82903 -82913 -82939 -82963 -82981 -82997 -83003 -83009 -83023 -83047 -83059 -83063 -83071 -83077 -83089 -83093 -83101 -83117 -83137 -83177 -83203 -83207 -83219 -83221 -83227 -83231 -83233 -83243 -83257 -83267 -83269 -83273 -83299 -83311 -83339 -83341 -83357 -83383 -83389 -83399 -83401 -83407 -83417 -83423 -83431 -83437 -83443 -83449 -83459 -83471 -83477 -83497 -83537 -83557 -83561 -83563 -83579 -83591 -83597 -83609 -83617 -83621 -83639 -83641 -83653 -83663 -83689 -83701 -83717 -83719 -83737 -83761 -83773 -83777 -83791 -83813 -83833 -83843 -83857 -83869 -83873 -83891 -83903 -83911 -83921 -83933 -83939 -83969 -83983 -83987 -84011 -84017 -84047 -84053 -84059 -84061 -84067 -84089 -84121 -84127 -84131 -84137 -84143 -84163 -84179 -84181 -84191 -84199 -84211 -84221 -84223 -84229 -84239 -84247 -84263 -84299 -84307 -84313 -84317 -84319 -84347 -84349 -84377 -84389 -84391 -84401 -84407 -84421 -84431 -84437 -84443 -84449 -84457 -84463 -84467 -84481 -84499 -84503 -84509 -84521 -84523 -84533 -84551 -84559 -84589 -84629 -84631 -84649 -84653 -84659 -84673 -84691 -84697 -84701 -84713 -84719 -84731 -84737 -84751 -84761 -84787 -84793 -84809 -84811 -84827 -84857 -84859 -84869 -84871 -84913 -84919 -84947 -84961 -84967 -84977 -84979 -84991 -85009 -85021 -85027 -85037 -85049 -85061 -85081 -85087 -85091 -85093 -85103 -85109 -85121 -85133 -85147 -85159 -85193 -85199 -85201 -85213 -85223 -85229 -85237 -85243 -85247 -85259 -85297 -85303 -85313 -85331 -85333 -85361 -85363 -85369 -85381 -85411 -85427 -85429 -85439 -85447 -85451 -85453 -85469 -85487 -85513 -85517 -85523 -85531 -85549 -85571 -85577 -85597 -85601 -85607 -85619 -85621 -85627 -85639 -85643 -85661 -85667 -85669 -85691 -85703 -85711 -85717 -85733 -85751 -85781 -85793 -85817 -85819 -85829 -85831 -85837 -85843 -85847 -85853 -85889 -85903 -85909 -85931 -85933 -85991 -85999 -86011 -86017 -86027 -86029 -86069 -86077 -86083 -86111 -86113 -86117 -86131 -86137 -86143 -86161 -86171 -86179 -86183 -86197 -86201 -86209 -86239 -86243 -86249 -86257 -86263 -86269 -86287 -86291 -86293 -86297 -86311 -86323 -86341 -86351 -86353 -86357 -86369 -86371 -86381 -86389 -86399 -86413 -86423 -86441 -86453 -86461 -86467 -86477 -86491 -86501 -86509 -86531 -86533 -86539 -86561 -86573 -86579 -86587 -86599 -86627 -86629 -86677 -86689 -86693 -86711 -86719 -86729 -86743 -86753 -86767 -86771 -86783 -86813 -86837 -86843 -86851 -86857 -86861 -86869 -86923 -86927 -86929 -86939 -86951 -86959 -86969 -86981 -86993 -87011 -87013 -87037 -87041 -87049 -87071 -87083 -87103 -87107 -87119 -87121 -87133 -87149 -87151 -87179 -87181 -87187 -87211 -87221 -87223 -87251 -87253 -87257 -87277 -87281 -87293 -87299 -87313 -87317 -87323 -87337 -87359 -87383 -87403 -87407 -87421 -87427 -87433 -87443 -87473 -87481 -87491 -87509 -87511 -87517 -87523 -87539 -87541 -87547 -87553 -87557 -87559 -87583 -87587 -87589 -87613 -87623 -87629 -87631 -87641 -87643 -87649 -87671 -87679 -87683 -87691 -87697 -87701 -87719 -87721 -87739 -87743 -87751 -87767 -87793 -87797 -87803 -87811 -87833 -87853 -87869 -87877 -87881 -87887 -87911 -87917 -87931 -87943 -87959 -87961 -87973 -87977 -87991 -88001 -88003 -88007 -88019 -88037 -88069 -88079 -88093 -88117 -88129 -88169 -88177 -88211 -88223 -88237 -88241 -88259 -88261 -88289 -88301 -88321 -88327 -88337 -88339 -88379 -88397 -88411 -88423 -88427 -88463 -88469 -88471 -88493 -88499 -88513 -88523 -88547 -88589 -88591 -88607 -88609 -88643 -88651 -88657 -88661 -88663 -88667 -88681 -88721 -88729 -88741 -88747 -88771 -88789 -88793 -88799 -88801 -88807 -88811 -88813 -88817 -88819 -88843 -88853 -88861 -88867 -88873 -88883 -88897 -88903 -88919 -88937 -88951 -88969 -88993 -88997 -89003 -89009 -89017 -89021 -89041 -89051 -89057 -89069 -89071 -89083 -89087 -89101 -89107 -89113 -89119 -89123 -89137 -89153 -89189 -89203 -89209 -89213 -89227 -89231 -89237 -89261 -89269 -89273 -89293 -89303 -89317 -89329 -89363 -89371 -89381 -89387 -89393 -89399 -89413 -89417 -89431 -89443 -89449 -89459 -89477 -89491 -89501 -89513 -89519 -89521 -89527 -89533 -89561 -89563 -89567 -89591 -89597 -89599 -89603 -89611 -89627 -89633 -89653 -89657 -89659 -89669 -89671 -89681 -89689 -89753 -89759 -89767 -89779 -89783 -89797 -89809 -89819 -89821 -89833 -89839 -89849 -89867 -89891 -89897 -89899 -89909 -89917 -89923 -89939 -89959 -89963 -89977 -89983 -89989 -90001 -90007 -90011 -90017 -90019 -90023 -90031 -90053 -90059 -90067 -90071 -90073 -90089 -90107 -90121 -90127 -90149 -90163 -90173 -90187 -90191 -90197 -90199 -90203 -90217 -90227 -90239 -90247 -90263 -90271 -90281 -90289 -90313 -90353 -90359 -90371 -90373 -90379 -90397 -90401 -90403 -90407 -90437 -90439 -90469 -90473 -90481 -90499 -90511 -90523 -90527 -90529 -90533 -90547 -90583 -90599 -90617 -90619 -90631 -90641 -90647 -90659 -90677 -90679 -90697 -90703 -90709 -90731 -90749 -90787 -90793 -90803 -90821 -90823 -90833 -90841 -90847 -90863 -90887 -90901 -90907 -90911 -90917 -90931 -90947 -90971 -90977 -90989 -90997 -91009 -91019 -91033 -91079 -91081 -91097 -91099 -91121 -91127 -91129 -91139 -91141 -91151 -91153 -91159 -91163 -91183 -91193 -91199 -91229 -91237 -91243 -91249 -91253 -91283 -91291 -91297 -91303 -91309 -91331 -91367 -91369 -91373 -91381 -91387 -91393 -91397 -91411 -91423 -91433 -91453 -91457 -91459 -91463 -91493 -91499 -91513 -91529 -91541 -91571 -91573 -91577 -91583 -91591 -91621 -91631 -91639 -91673 -91691 -91703 -91711 -91733 -91753 -91757 -91771 -91781 -91801 -91807 -91811 -91813 -91823 -91837 -91841 -91867 -91873 -91909 -91921 -91939 -91943 -91951 -91957 -91961 -91967 -91969 -91997 -92003 -92009 -92033 -92041 -92051 -92077 -92083 -92107 -92111 -92119 -92143 -92153 -92173 -92177 -92179 -92189 -92203 -92219 -92221 -92227 -92233 -92237 -92243 -92251 -92269 -92297 -92311 -92317 -92333 -92347 -92353 -92357 -92363 -92369 -92377 -92381 -92383 -92387 -92399 -92401 -92413 -92419 -92431 -92459 -92461 -92467 -92479 -92489 -92503 -92507 -92551 -92557 -92567 -92569 -92581 -92593 -92623 -92627 -92639 -92641 -92647 -92657 -92669 -92671 -92681 -92683 -92693 -92699 -92707 -92717 -92723 -92737 -92753 -92761 -92767 -92779 -92789 -92791 -92801 -92809 -92821 -92831 -92849 -92857 -92861 -92863 -92867 -92893 -92899 -92921 -92927 -92941 -92951 -92957 -92959 -92987 -92993 -93001 -93047 -93053 -93059 -93077 -93083 -93089 -93097 -93103 -93113 -93131 -93133 -93139 -93151 -93169 -93179 -93187 -93199 -93229 -93239 -93241 -93251 -93253 -93257 -93263 -93281 -93283 -93287 -93307 -93319 -93323 -93329 -93337 -93371 -93377 -93383 -93407 -93419 -93427 -93463 -93479 -93481 -93487 -93491 -93493 -93497 -93503 -93523 -93529 -93553 -93557 -93559 -93563 -93581 -93601 -93607 -93629 -93637 -93683 -93701 -93703 -93719 -93739 -93761 -93763 -93787 -93809 -93811 -93827 -93851 -93871 -93887 -93889 -93893 -93901 -93911 -93913 -93923 -93937 -93941 -93949 -93967 -93971 -93979 -93983 -93997 -94007 -94009 -94033 -94049 -94057 -94063 -94079 -94099 -94109 -94111 -94117 -94121 -94151 -94153 -94169 -94201 -94207 -94219 -94229 -94253 -94261 -94273 -94291 -94307 -94309 -94321 -94327 -94331 -94343 -94349 -94351 -94379 -94397 -94399 -94421 -94427 -94433 -94439 -94441 -94447 -94463 -94477 -94483 -94513 -94529 -94531 -94541 -94543 -94547 -94559 -94561 -94573 -94583 -94597 -94603 -94613 -94621 -94649 -94651 -94687 -94693 -94709 -94723 -94727 -94747 -94771 -94777 -94781 -94789 -94793 -94811 -94819 -94823 -94837 -94841 -94847 -94849 -94873 -94889 -94903 -94907 -94933 -94949 -94951 -94961 -94993 -94999 -95003 -95009 -95021 -95027 -95063 -95071 -95083 -95087 -95089 -95093 -95101 -95107 -95111 -95131 -95143 -95153 -95177 -95189 -95191 -95203 -95213 -95219 -95231 -95233 -95239 -95257 -95261 -95267 -95273 -95279 -95287 -95311 -95317 -95327 -95339 -95369 -95383 -95393 -95401 -95413 -95419 -95429 -95441 -95443 -95461 -95467 -95471 -95479 -95483 -95507 -95527 -95531 -95539 -95549 -95561 -95569 -95581 -95597 -95603 -95617 -95621 -95629 -95633 -95651 -95701 -95707 -95713 -95717 -95723 -95731 -95737 -95747 -95773 -95783 -95789 -95791 -95801 -95803 -95813 -95819 -95857 -95869 -95873 -95881 -95891 -95911 -95917 -95923 -95929 -95947 -95957 -95959 -95971 -95987 -95989 -96001 -96013 -96017 -96043 -96053 -96059 -96079 -96097 -96137 -96149 -96157 -96167 -96179 -96181 -96199 -96211 -96221 -96223 -96233 -96259 -96263 -96269 -96281 -96289 -96293 -96323 -96329 -96331 -96337 -96353 -96377 -96401 -96419 -96431 -96443 -96451 -96457 -96461 -96469 -96479 -96487 -96493 -96497 -96517 -96527 -96553 -96557 -96581 -96587 -96589 -96601 -96643 -96661 -96667 -96671 -96697 -96703 -96731 -96737 -96739 -96749 -96757 -96763 -96769 -96779 -96787 -96797 -96799 -96821 -96823 -96827 -96847 -96851 -96857 -96893 -96907 -96911 -96931 -96953 -96959 -96973 -96979 -96989 -96997 -97001 -97003 -97007 -97021 -97039 -97073 -97081 -97103 -97117 -97127 -97151 -97157 -97159 -97169 -97171 -97177 -97187 -97213 -97231 -97241 -97259 -97283 -97301 -97303 -97327 -97367 -97369 -97373 -97379 -97381 -97387 -97397 -97423 -97429 -97441 -97453 -97459 -97463 -97499 -97501 -97511 -97523 -97547 -97549 -97553 -97561 -97571 -97577 -97579 -97583 -97607 -97609 -97613 -97649 -97651 -97673 -97687 -97711 -97729 -97771 -97777 -97787 -97789 -97813 -97829 -97841 -97843 -97847 -97849 -97859 -97861 -97871 -97879 -97883 -97919 -97927 -97931 -97943 -97961 -97967 -97973 -97987 -98009 -98011 -98017 -98041 -98047 -98057 -98081 -98101 -98123 -98129 -98143 -98179 -98207 -98213 -98221 -98227 -98251 -98257 -98269 -98297 -98299 -98317 -98321 -98323 -98327 -98347 -98369 -98377 -98387 -98389 -98407 -98411 -98419 -98429 -98443 -98453 -98459 -98467 -98473 -98479 -98491 -98507 -98519 -98533 -98543 -98561 -98563 -98573 -98597 -98621 -98627 -98639 -98641 -98663 -98669 -98689 -98711 -98713 -98717 -98729 -98731 -98737 -98773 -98779 -98801 -98807 -98809 -98837 -98849 -98867 -98869 -98873 -98887 -98893 -98897 -98899 -98909 -98911 -98927 -98929 -98939 -98947 -98953 -98963 -98981 -98993 -98999 -99013 -99017 -99023 -99041 -99053 -99079 -99083 -99089 -99103 -99109 -99119 -99131 -99133 -99137 -99139 -99149 -99173 -99181 -99191 -99223 -99233 -99241 -99251 -99257 -99259 -99277 -99289 -99317 -99347 -99349 -99367 -99371 -99377 -99391 -99397 -99401 -99409 -99431 -99439 -99469 -99487 -99497 -99523 -99527 -99529 -99551 -99559 -99563 -99571 -99577 -99581 -99607 -99611 -99623 -99643 -99661 -99667 -99679 -99689 -99707 -99709 -99713 -99719 -99721 -99733 -99761 -99767 -99787 -99793 -99809 -99817 -99823 -99829 -99833 -99839 -99859 -99871 -99877 -99881 -99901 -99907 -99923 -99929 -99961 -99971 -99989 -99991 -100003 -100019 -100043 -100049 -100057 -100069 -100103 -100109 -100129 -100151 -100153 -100169 -100183 -100189 -100193 -100207 -100213 -100237 -100267 -100271 -100279 -100291 -100297 -100313 -100333 -100343 -100357 -100361 -100363 -100379 -100391 -100393 -100403 -100411 -100417 -100447 -100459 -100469 -100483 -100493 -100501 -100511 -100517 -100519 -100523 -100537 -100547 -100549 -100559 -100591 -100609 -100613 -100621 -100649 -100669 -100673 -100693 -100699 -100703 -100733 -100741 -100747 -100769 -100787 -100799 -100801 -100811 -100823 -100829 -100847 -100853 -100907 -100913 -100927 -100931 -100937 -100943 -100957 -100981 -100987 -100999 -101009 -101021 -101027 -101051 -101063 -101081 -101089 -101107 -101111 -101113 -101117 -101119 -101141 -101149 -101159 -101161 -101173 -101183 -101197 -101203 -101207 -101209 -101221 -101267 -101273 -101279 -101281 -101287 -101293 -101323 -101333 -101341 -101347 -101359 -101363 -101377 -101383 -101399 -101411 -101419 -101429 -101449 -101467 -101477 -101483 -101489 -101501 -101503 -101513 -101527 -101531 -101533 -101537 -101561 -101573 -101581 -101599 -101603 -101611 -101627 -101641 -101653 -101663 -101681 -101693 -101701 -101719 -101723 -101737 -101741 -101747 -101749 -101771 -101789 -101797 -101807 -101833 -101837 -101839 -101863 -101869 -101873 -101879 -101891 -101917 -101921 -101929 -101939 -101957 -101963 -101977 -101987 -101999 -102001 -102013 -102019 -102023 -102031 -102043 -102059 -102061 -102071 -102077 -102079 -102101 -102103 -102107 -102121 -102139 -102149 -102161 -102181 -102191 -102197 -102199 -102203 -102217 -102229 -102233 -102241 -102251 -102253 -102259 -102293 -102299 -102301 -102317 -102329 -102337 -102359 -102367 -102397 -102407 -102409 -102433 -102437 -102451 -102461 -102481 -102497 -102499 -102503 -102523 -102533 -102539 -102547 -102551 -102559 -102563 -102587 -102593 -102607 -102611 -102643 -102647 -102653 -102667 -102673 -102677 -102679 -102701 -102761 -102763 -102769 -102793 -102797 -102811 -102829 -102841 -102859 -102871 -102877 -102881 -102911 -102913 -102929 -102931 -102953 -102967 -102983 -103001 -103007 -103043 -103049 -103067 -103069 -103079 -103087 -103091 -103093 -103099 -103123 -103141 -103171 -103177 -103183 -103217 -103231 -103237 -103289 -103291 -103307 -103319 -103333 -103349 -103357 -103387 -103391 -103393 -103399 -103409 -103421 -103423 -103451 -103457 -103471 -103483 -103511 -103529 -103549 -103553 -103561 -103567 -103573 -103577 -103583 -103591 -103613 -103619 -103643 -103651 -103657 -103669 -103681 -103687 -103699 -103703 -103723 -103769 -103787 -103801 -103811 -103813 -103837 -103841 -103843 -103867 -103889 -103903 -103913 -103919 -103951 -103963 -103967 -103969 -103979 -103981 -103991 -103993 -103997 -104003 -104009 -104021 -104033 -104047 -104053 -104059 -104087 -104089 -104107 -104113 -104119 -104123 -104147 -104149 -104161 -104173 -104179 -104183 -104207 -104231 -104233 -104239 -104243 -104281 -104287 -104297 -104309 -104311 -104323 -104327 -104347 -104369 -104381 -104383 -104393 -104399 -104417 -104459 -104471 -104473 -104479 -104491 -104513 -104527 -104537 -104543 -104549 -104551 -104561 -104579 -104593 -104597 -104623 -104639 -104651 -104659 -104677 -104681 -104683 -104693 -104701 -104707 -104711 -104717 -104723 -104729 -104743 -104759 -104761 -104773 -104779 -104789 -104801 -104803 -104827 -104831 -104849 -104851 -104869 -104879 -104891 -104911 -104917 -104933 -104947 -104953 -104959 -104971 -104987 -104999 -105019 -105023 -105031 -105037 -105071 -105097 -105107 -105137 -105143 -105167 -105173 -105199 -105211 -105227 -105229 -105239 -105251 -105253 -105263 -105269 -105277 -105319 -105323 -105331 -105337 -105341 -105359 -105361 -105367 -105373 -105379 -105389 -105397 -105401 -105407 -105437 -105449 -105467 -105491 -105499 -105503 -105509 -105517 -105527 -105529 -105533 -105541 -105557 -105563 -105601 -105607 -105613 -105619 -105649 -105653 -105667 -105673 -105683 -105691 -105701 -105727 -105733 -105751 -105761 -105767 -105769 -105817 -105829 -105863 -105871 -105883 -105899 -105907 -105913 -105929 -105943 -105953 -105967 -105971 -105977 -105983 -105997 -106013 -106019 -106031 -106033 -106087 -106103 -106109 -106121 -106123 -106129 -106163 -106181 -106187 -106189 -106207 -106213 -106217 -106219 -106243 -106261 -106273 -106277 -106279 -106291 -106297 -106303 -106307 -106319 -106321 -106331 -106349 -106357 -106363 -106367 -106373 -106391 -106397 -106411 -106417 -106427 -106433 -106441 -106451 -106453 -106487 -106501 -106531 -106537 -106541 -106543 -106591 -106619 -106621 -106627 -106637 -106649 -106657 -106661 -106663 -106669 -106681 -106693 -106699 -106703 -106721 -106727 -106739 -106747 -106751 -106753 -106759 -106781 -106783 -106787 -106801 -106823 -106853 -106859 -106861 -106867 -106871 -106877 -106903 -106907 -106921 -106937 -106949 -106957 -106961 -106963 -106979 -106993 -107021 -107033 -107053 -107057 -107069 -107071 -107077 -107089 -107099 -107101 -107119 -107123 -107137 -107171 -107183 -107197 -107201 -107209 -107227 -107243 -107251 -107269 -107273 -107279 -107309 -107323 -107339 -107347 -107351 -107357 -107377 -107441 -107449 -107453 -107467 -107473 -107507 -107509 -107563 -107581 -107599 -107603 -107609 -107621 -107641 -107647 -107671 -107687 -107693 -107699 -107713 -107717 -107719 -107741 -107747 -107761 -107773 -107777 -107791 -107827 -107837 -107839 -107843 -107857 -107867 -107873 -107881 -107897 -107903 -107923 -107927 -107941 -107951 -107971 -107981 -107999 -108007 -108011 -108013 -108023 -108037 -108041 -108061 -108079 -108089 -108107 -108109 -108127 -108131 -108139 -108161 -108179 -108187 -108191 -108193 -108203 -108211 -108217 -108223 -108233 -108247 -108263 -108271 -108287 -108289 -108293 -108301 -108343 -108347 -108359 -108377 -108379 -108401 -108413 -108421 -108439 -108457 -108461 -108463 -108497 -108499 -108503 -108517 -108529 -108533 -108541 -108553 -108557 -108571 -108587 -108631 -108637 -108643 -108649 -108677 -108707 -108709 -108727 -108739 -108751 -108761 -108769 -108791 -108793 -108799 -108803 -108821 -108827 -108863 -108869 -108877 -108881 -108883 -108887 -108893 -108907 -108917 -108923 -108929 -108943 -108947 -108949 -108959 -108961 -108967 -108971 -108991 -109001 -109013 -109037 -109049 -109063 -109073 -109097 -109103 -109111 -109121 -109133 -109139 -109141 -109147 -109159 -109169 -109171 -109199 -109201 -109211 -109229 -109253 -109267 -109279 -109297 -109303 -109313 -109321 -109331 -109357 -109363 -109367 -109379 -109387 -109391 -109397 -109423 -109433 -109441 -109451 -109453 -109469 -109471 -109481 -109507 -109517 -109519 -109537 -109541 -109547 -109567 -109579 -109583 -109589 -109597 -109609 -109619 -109621 -109639 -109661 -109663 -109673 -109717 -109721 -109741 -109751 -109789 -109793 -109807 -109819 -109829 -109831 -109841 -109843 -109847 -109849 -109859 -109873 -109883 -109891 -109897 -109903 -109913 -109919 -109937 -109943 -109961 -109987 -110017 -110023 -110039 -110051 -110059 -110063 -110069 -110083 -110119 -110129 -110161 -110183 -110221 -110233 -110237 -110251 -110261 -110269 -110273 -110281 -110291 -110311 -110321 -110323 -110339 -110359 -110419 -110431 -110437 -110441 -110459 -110477 -110479 -110491 -110501 -110503 -110527 -110533 -110543 -110557 -110563 -110567 -110569 -110573 -110581 -110587 -110597 -110603 -110609 -110623 -110629 -110641 -110647 -110651 -110681 -110711 -110729 -110731 -110749 -110753 -110771 -110777 -110807 -110813 -110819 -110821 -110849 -110863 -110879 -110881 -110899 -110909 -110917 -110921 -110923 -110927 -110933 -110939 -110947 -110951 -110969 -110977 -110989 -111029 -111031 -111043 -111049 -111053 -111091 -111103 -111109 -111119 -111121 -111127 -111143 -111149 -111187 -111191 -111211 -111217 -111227 -111229 -111253 -111263 -111269 -111271 -111301 -111317 -111323 -111337 -111341 -111347 -111373 -111409 -111427 -111431 -111439 -111443 -111467 -111487 -111491 -111493 -111497 -111509 -111521 -111533 -111539 -111577 -111581 -111593 -111599 -111611 -111623 -111637 -111641 -111653 -111659 -111667 -111697 -111721 -111731 -111733 -111751 -111767 -111773 -111779 -111781 -111791 -111799 -111821 -111827 -111829 -111833 -111847 -111857 -111863 -111869 -111871 -111893 -111913 -111919 -111949 -111953 -111959 -111973 -111977 -111997 -112019 -112031 -112061 -112067 -112069 -112087 -112097 -112103 -112111 -112121 -112129 -112139 -112153 -112163 -112181 -112199 -112207 -112213 -112223 -112237 -112241 -112247 -112249 -112253 -112261 -112279 -112289 -112291 -112297 -112303 -112327 -112331 -112337 -112339 -112349 -112361 -112363 -112397 -112403 -112429 -112459 -112481 -112501 -112507 -112543 -112559 -112571 -112573 -112577 -112583 -112589 -112601 -112603 -112621 -112643 -112657 -112663 -112687 -112691 -112741 -112757 -112759 -112771 -112787 -112799 -112807 -112831 -112843 -112859 -112877 -112901 -112909 -112913 -112919 -112921 -112927 -112939 -112951 -112967 -112979 -112997 -113011 -113017 -113021 -113023 -113027 -113039 -113041 -113051 -113063 -113081 -113083 -113089 -113093 -113111 -113117 -113123 -113131 -113143 -113147 -113149 -113153 -113159 -113161 -113167 -113171 -113173 -113177 -113189 -113209 -113213 -113227 -113233 -113279 -113287 -113327 -113329 -113341 -113357 -113359 -113363 -113371 -113381 -113383 -113417 -113437 -113453 -113467 -113489 -113497 -113501 -113513 -113537 -113539 -113557 -113567 -113591 -113621 -113623 -113647 -113657 -113683 -113717 -113719 -113723 -113731 -113749 -113759 -113761 -113777 -113779 -113783 -113797 -113809 -113819 -113837 -113843 -113891 -113899 -113903 -113909 -113921 -113933 -113947 -113957 -113963 -113969 -113983 -113989 -114001 -114013 -114031 -114041 -114043 -114067 -114073 -114077 -114083 -114089 -114113 -114143 -114157 -114161 -114167 -114193 -114197 -114199 -114203 -114217 -114221 -114229 -114259 -114269 -114277 -114281 -114299 -114311 -114319 -114329 -114343 -114371 -114377 -114407 -114419 -114451 -114467 -114473 -114479 -114487 -114493 -114547 -114553 -114571 -114577 -114593 -114599 -114601 -114613 -114617 -114641 -114643 -114649 -114659 -114661 -114671 -114679 -114689 -114691 -114713 -114743 -114749 -114757 -114761 -114769 -114773 -114781 -114797 -114799 -114809 -114827 -114833 -114847 -114859 -114883 -114889 -114901 -114913 -114941 -114967 -114973 -114997 -115001 -115013 -115019 -115021 -115057 -115061 -115067 -115079 -115099 -115117 -115123 -115127 -115133 -115151 -115153 -115163 -115183 -115201 -115211 -115223 -115237 -115249 -115259 -115279 -115301 -115303 -115309 -115319 -115321 -115327 -115331 -115337 -115343 -115361 -115363 -115399 -115421 -115429 -115459 -115469 -115471 -115499 -115513 -115523 -115547 -115553 -115561 -115571 -115589 -115597 -115601 -115603 -115613 -115631 -115637 -115657 -115663 -115679 -115693 -115727 -115733 -115741 -115751 -115757 -115763 -115769 -115771 -115777 -115781 -115783 -115793 -115807 -115811 -115823 -115831 -115837 -115849 -115853 -115859 -115861 -115873 -115877 -115879 -115883 -115891 -115901 -115903 -115931 -115933 -115963 -115979 -115981 -115987 -116009 -116027 -116041 -116047 -116089 -116099 -116101 -116107 -116113 -116131 -116141 -116159 -116167 -116177 -116189 -116191 -116201 -116239 -116243 -116257 -116269 -116273 -116279 -116293 -116329 -116341 -116351 -116359 -116371 -116381 -116387 -116411 -116423 -116437 -116443 -116447 -116461 -116471 -116483 -116491 -116507 -116531 -116533 -116537 -116539 -116549 -116579 -116593 -116639 -116657 -116663 -116681 -116687 -116689 -116707 -116719 -116731 -116741 -116747 -116789 -116791 -116797 -116803 -116819 -116827 -116833 -116849 -116867 -116881 -116903 -116911 -116923 -116927 -116929 -116933 -116953 -116959 -116969 -116981 -116989 -116993 -117017 -117023 -117037 -117041 -117043 -117053 -117071 -117101 -117109 -117119 -117127 -117133 -117163 -117167 -117191 -117193 -117203 -117209 -117223 -117239 -117241 -117251 -117259 -117269 -117281 -117307 -117319 -117329 -117331 -117353 -117361 -117371 -117373 -117389 -117413 -117427 -117431 -117437 -117443 -117497 -117499 -117503 -117511 -117517 -117529 -117539 -117541 -117563 -117571 -117577 -117617 -117619 -117643 -117659 -117671 -117673 -117679 -117701 -117703 -117709 -117721 -117727 -117731 -117751 -117757 -117763 -117773 -117779 -117787 -117797 -117809 -117811 -117833 -117839 -117841 -117851 -117877 -117881 -117883 -117889 -117899 -117911 -117917 -117937 -117959 -117973 -117977 -117979 -117989 -117991 -118033 -118037 -118043 -118051 -118057 -118061 -118081 -118093 -118127 -118147 -118163 -118169 -118171 -118189 -118211 -118213 -118219 -118247 -118249 -118253 -118259 -118273 -118277 -118297 -118343 -118361 -118369 -118373 -118387 -118399 -118409 -118411 -118423 -118429 -118453 -118457 -118463 -118471 -118493 -118529 -118543 -118549 -118571 -118583 -118589 -118603 -118619 -118621 -118633 -118661 -118669 -118673 -118681 -118687 -118691 -118709 -118717 -118739 -118747 -118751 -118757 -118787 -118799 -118801 -118819 -118831 -118843 -118861 -118873 -118891 -118897 -118901 -118903 -118907 -118913 -118927 -118931 -118967 -118973 -119027 -119033 -119039 -119047 -119057 -119069 -119083 -119087 -119089 -119099 -119101 -119107 -119129 -119131 -119159 -119173 -119179 -119183 -119191 -119227 -119233 -119237 -119243 -119267 -119291 -119293 -119297 -119299 -119311 -119321 -119359 -119363 -119389 -119417 -119419 -119429 -119447 -119489 -119503 -119513 -119533 -119549 -119551 -119557 -119563 -119569 -119591 -119611 -119617 -119627 -119633 -119653 -119657 -119659 -119671 -119677 -119687 -119689 -119699 -119701 -119723 -119737 -119747 -119759 -119771 -119773 -119783 -119797 -119809 -119813 -119827 -119831 -119839 -119849 -119851 -119869 -119881 -119891 -119921 -119923 -119929 -119953 -119963 -119971 -119981 -119983 -119993 -120011 -120017 -120041 -120047 -120049 -120067 -120077 -120079 -120091 -120097 -120103 -120121 -120157 -120163 -120167 -120181 -120193 -120199 -120209 -120223 -120233 -120247 -120277 -120283 -120293 -120299 -120319 -120331 -120349 -120371 -120383 -120391 -120397 -120401 -120413 -120427 -120431 -120473 -120503 -120511 -120539 -120551 -120557 -120563 -120569 -120577 -120587 -120607 -120619 -120623 -120641 -120647 -120661 -120671 -120677 -120689 -120691 -120709 -120713 -120721 -120737 -120739 -120749 -120763 -120767 -120779 -120811 -120817 -120823 -120829 -120833 -120847 -120851 -120863 -120871 -120877 -120889 -120899 -120907 -120917 -120919 -120929 -120937 -120941 -120943 -120947 -120977 -120997 -121001 -121007 -121013 -121019 -121021 -121039 -121061 -121063 -121067 -121081 -121123 -121139 -121151 -121157 -121169 -121171 -121181 -121189 -121229 -121259 -121267 -121271 -121283 -121291 -121309 -121313 -121321 -121327 -121333 -121343 -121349 -121351 -121357 -121367 -121369 -121379 -121403 -121421 -121439 -121441 -121447 -121453 -121469 -121487 -121493 -121501 -121507 -121523 -121531 -121547 -121553 -121559 -121571 -121577 -121579 -121591 -121607 -121609 -121621 -121631 -121633 -121637 -121661 -121687 -121697 -121711 -121721 -121727 -121763 -121787 -121789 -121843 -121853 -121867 -121883 -121889 -121909 -121921 -121931 -121937 -121949 -121951 -121963 -121967 -121993 -121997 -122011 -122021 -122027 -122029 -122033 -122039 -122041 -122051 -122053 -122069 -122081 -122099 -122117 -122131 -122147 -122149 -122167 -122173 -122201 -122203 -122207 -122209 -122219 -122231 -122251 -122263 -122267 -122273 -122279 -122299 -122321 -122323 -122327 -122347 -122363 -122387 -122389 -122393 -122399 -122401 -122443 -122449 -122453 -122471 -122477 -122489 -122497 -122501 -122503 -122509 -122527 -122533 -122557 -122561 -122579 -122597 -122599 -122609 -122611 -122651 -122653 -122663 -122693 -122701 -122719 -122741 -122743 -122753 -122761 -122777 -122789 -122819 -122827 -122833 -122839 -122849 -122861 -122867 -122869 -122887 -122891 -122921 -122929 -122939 -122953 -122957 -122963 -122971 -123001 -123007 -123017 -123031 -123049 -123059 -123077 -123083 -123091 -123113 -123121 -123127 -123143 -123169 -123191 -123203 -123209 -123217 -123229 -123239 -123259 -123269 -123289 -123307 -123311 -123323 -123341 -123373 -123377 -123379 -123397 -123401 -123407 -123419 -123427 -123433 -123439 -123449 -123457 -123479 -123491 -123493 -123499 -123503 -123517 -123527 -123547 -123551 -123553 -123581 -123583 -123593 -123601 -123619 -123631 -123637 -123653 -123661 -123667 -123677 -123701 -123707 -123719 -123727 -123731 -123733 -123737 -123757 -123787 -123791 -123803 -123817 -123821 -123829 -123833 -123853 -123863 -123887 -123911 -123923 -123931 -123941 -123953 -123973 -123979 -123983 -123989 -123997 -124001 -124021 -124067 -124087 -124097 -124121 -124123 -124133 -124139 -124147 -124153 -124171 -124181 -124183 -124193 -124199 -124213 -124231 -124247 -124249 -124277 -124291 -124297 -124301 -124303 -124309 -124337 -124339 -124343 -124349 -124351 -124363 -124367 -124427 -124429 -124433 -124447 -124459 -124471 -124477 -124489 -124493 -124513 -124529 -124541 -124543 -124561 -124567 -124577 -124601 -124633 -124643 -124669 -124673 -124679 -124693 -124699 -124703 -124717 -124721 -124739 -124753 -124759 -124769 -124771 -124777 -124781 -124783 -124793 -124799 -124819 -124823 -124847 -124853 -124897 -124907 -124909 -124919 -124951 -124979 -124981 -124987 -124991 -125003 -125017 -125029 -125053 -125063 -125093 -125101 -125107 -125113 -125117 -125119 -125131 -125141 -125149 -125183 -125197 -125201 -125207 -125219 -125221 -125231 -125243 -125261 -125269 -125287 -125299 -125303 -125311 -125329 -125339 -125353 -125371 -125383 -125387 -125399 -125407 -125423 -125429 -125441 -125453 -125471 -125497 -125507 -125509 -125527 -125539 -125551 -125591 -125597 -125617 -125621 -125627 -125639 -125641 -125651 -125659 -125669 -125683 -125687 -125693 -125707 -125711 -125717 -125731 -125737 -125743 -125753 -125777 -125789 -125791 -125803 -125813 -125821 -125863 -125887 -125897 -125899 -125921 -125927 -125929 -125933 -125941 -125959 -125963 -126001 -126011 -126013 -126019 -126023 -126031 -126037 -126041 -126047 -126067 -126079 -126097 -126107 -126127 -126131 -126143 -126151 -126173 -126199 -126211 -126223 -126227 -126229 -126233 -126241 -126257 -126271 -126307 -126311 -126317 -126323 -126337 -126341 -126349 -126359 -126397 -126421 -126433 -126443 -126457 -126461 -126473 -126481 -126487 -126491 -126493 -126499 -126517 -126541 -126547 -126551 -126583 -126601 -126611 -126613 -126631 -126641 -126653 -126683 -126691 -126703 -126713 -126719 -126733 -126739 -126743 -126751 -126757 -126761 -126781 -126823 -126827 -126839 -126851 -126857 -126859 -126913 -126923 -126943 -126949 -126961 -126967 -126989 -127031 -127033 -127037 -127051 -127079 -127081 -127103 -127123 -127133 -127139 -127157 -127163 -127189 -127207 -127217 -127219 -127241 -127247 -127249 -127261 -127271 -127277 -127289 -127291 -127297 -127301 -127321 -127331 -127343 -127363 -127373 -127399 -127403 -127423 -127447 -127453 -127481 -127487 -127493 -127507 -127529 -127541 -127549 -127579 -127583 -127591 -127597 -127601 -127607 -127609 -127637 -127643 -127649 -127657 -127663 -127669 -127679 -127681 -127691 -127703 -127709 -127711 -127717 -127727 -127733 -127739 -127747 -127763 -127781 -127807 -127817 -127819 -127837 -127843 -127849 -127859 -127867 -127873 -127877 -127913 -127921 -127931 -127951 -127973 -127979 -127997 -128021 -128033 -128047 -128053 -128099 -128111 -128113 -128119 -128147 -128153 -128159 -128173 -128189 -128201 -128203 -128213 -128221 -128237 -128239 -128257 -128273 -128287 -128291 -128311 -128321 -128327 -128339 -128341 -128347 -128351 -128377 -128389 -128393 -128399 -128411 -128413 -128431 -128437 -128449 -128461 -128467 -128473 -128477 -128483 -128489 -128509 -128519 -128521 -128549 -128551 -128563 -128591 -128599 -128603 -128621 -128629 -128657 -128659 -128663 -128669 -128677 -128683 -128693 -128717 -128747 -128749 -128761 -128767 -128813 -128819 -128831 -128833 -128837 -128857 -128861 -128873 -128879 -128903 -128923 -128939 -128941 -128951 -128959 -128969 -128971 -128981 -128983 -128987 -128993 -129001 -129011 -129023 -129037 -129049 -129061 -129083 -129089 -129097 -129113 -129119 -129121 -129127 -129169 -129187 -129193 -129197 -129209 -129221 -129223 -129229 -129263 -129277 -129281 -129287 -129289 -129293 -129313 -129341 -129347 -129361 -129379 -129401 -129403 -129419 -129439 -129443 -129449 -129457 -129461 -129469 -129491 -129497 -129499 -129509 -129517 -129527 -129529 -129533 -129539 -129553 -129581 -129587 -129589 -129593 -129607 -129629 -129631 -129641 -129643 -129671 -129707 -129719 -129733 -129737 -129749 -129757 -129763 -129769 -129793 -129803 -129841 -129853 -129887 -129893 -129901 -129917 -129919 -129937 -129953 -129959 -129967 -129971 -130003 -130021 -130027 -130043 -130051 -130057 -130069 -130073 -130079 -130087 -130099 -130121 -130127 -130147 -130171 -130183 -130199 -130201 -130211 -130223 -130241 -130253 -130259 -130261 -130267 -130279 -130303 -130307 -130337 -130343 -130349 -130363 -130367 -130369 -130379 -130399 -130409 -130411 -130423 -130439 -130447 -130457 -130469 -130477 -130483 -130489 -130513 -130517 -130523 -130531 -130547 -130553 -130579 -130589 -130619 -130621 -130631 -130633 -130639 -130643 -130649 -130651 -130657 -130681 -130687 -130693 -130699 -130729 -130769 -130783 -130787 -130807 -130811 -130817 -130829 -130841 -130843 -130859 -130873 -130927 -130957 -130969 -130973 -130981 -130987 -131009 -131011 -131023 -131041 -131059 -131063 -131071 -131101 -131111 -131113 -131129 -131143 -131149 -131171 -131203 -131213 -131221 -131231 -131249 -131251 -131267 -131293 -131297 -131303 -131311 -131317 -131321 -131357 -131363 -131371 -131381 -131413 -131431 -131437 -131441 -131447 -131449 -131477 -131479 -131489 -131497 -131501 -131507 -131519 -131543 -131561 -131581 -131591 -131611 -131617 -131627 -131639 -131641 -131671 -131687 -131701 -131707 -131711 -131713 -131731 -131743 -131749 -131759 -131771 -131777 -131779 -131783 -131797 -131837 -131839 -131849 -131861 -131891 -131893 -131899 -131909 -131927 -131933 -131939 -131941 -131947 -131959 -131969 -132001 -132019 -132047 -132049 -132059 -132071 -132103 -132109 -132113 -132137 -132151 -132157 -132169 -132173 -132199 -132229 -132233 -132241 -132247 -132257 -132263 -132283 -132287 -132299 -132313 -132329 -132331 -132347 -132361 -132367 -132371 -132383 -132403 -132409 -132421 -132437 -132439 -132469 -132491 -132499 -132511 -132523 -132527 -132529 -132533 -132541 -132547 -132589 -132607 -132611 -132619 -132623 -132631 -132637 -132647 -132661 -132667 -132679 -132689 -132697 -132701 -132707 -132709 -132721 -132739 -132749 -132751 -132757 -132761 -132763 -132817 -132833 -132851 -132857 -132859 -132863 -132887 -132893 -132911 -132929 -132947 -132949 -132953 -132961 -132967 -132971 -132989 -133013 -133033 -133039 -133051 -133069 -133073 -133087 -133097 -133103 -133109 -133117 -133121 -133153 -133157 -133169 -133183 -133187 -133201 -133213 -133241 -133253 -133261 -133271 -133277 -133279 -133283 -133303 -133319 -133321 -133327 -133337 -133349 -133351 -133379 -133387 -133391 -133403 -133417 -133439 -133447 -133451 -133481 -133493 -133499 -133519 -133541 -133543 -133559 -133571 -133583 -133597 -133631 -133633 -133649 -133657 -133669 -133673 -133691 -133697 -133709 -133711 -133717 -133723 -133733 -133769 -133781 -133801 -133811 -133813 -133831 -133843 -133853 -133873 -133877 -133919 -133949 -133963 -133967 -133979 -133981 -133993 -133999 -134033 -134039 -134047 -134053 -134059 -134077 -134081 -134087 -134089 -134093 -134129 -134153 -134161 -134171 -134177 -134191 -134207 -134213 -134219 -134227 -134243 -134257 -134263 -134269 -134287 -134291 -134293 -134327 -134333 -134339 -134341 -134353 -134359 -134363 -134369 -134371 -134399 -134401 -134417 -134437 -134443 -134471 -134489 -134503 -134507 -134513 -134581 -134587 -134591 -134593 -134597 -134609 -134639 -134669 -134677 -134681 -134683 -134699 -134707 -134731 -134741 -134753 -134777 -134789 -134807 -134837 -134839 -134851 -134857 -134867 -134873 -134887 -134909 -134917 -134921 -134923 -134947 -134951 -134989 -134999 -135007 -135017 -135019 -135029 -135043 -135049 -135059 -135077 -135089 -135101 -135119 -135131 -135151 -135173 -135181 -135193 -135197 -135209 -135211 -135221 -135241 -135257 -135271 -135277 -135281 -135283 -135301 -135319 -135329 -135347 -135349 -135353 -135367 -135389 -135391 -135403 -135409 -135427 -135431 -135433 -135449 -135461 -135463 -135467 -135469 -135479 -135497 -135511 -135533 -135559 -135571 -135581 -135589 -135593 -135599 -135601 -135607 -135613 -135617 -135623 -135637 -135647 -135649 -135661 -135671 -135697 -135701 -135719 -135721 -135727 -135731 -135743 -135757 -135781 -135787 -135799 -135829 -135841 -135851 -135859 -135887 -135893 -135899 -135911 -135913 -135929 -135937 -135977 -135979 -136013 -136027 -136033 -136043 -136057 -136067 -136069 -136093 -136099 -136111 -136133 -136139 -136163 -136177 -136189 -136193 -136207 -136217 -136223 -136237 -136247 -136261 -136273 -136277 -136303 -136309 -136319 -136327 -136333 -136337 -136343 -136351 -136361 -136373 -136379 -136393 -136397 -136399 -136403 -136417 -136421 -136429 -136447 -136453 -136463 -136471 -136481 -136483 -136501 -136511 -136519 -136523 -136531 -136537 -136541 -136547 -136559 -136573 -136601 -136603 -136607 -136621 -136649 -136651 -136657 -136691 -136693 -136709 -136711 -136727 -136733 -136739 -136751 -136753 -136769 -136777 -136811 -136813 -136841 -136849 -136859 -136861 -136879 -136883 -136889 -136897 -136943 -136949 -136951 -136963 -136973 -136979 -136987 -136991 -136993 -136999 -137029 -137077 -137087 -137089 -137117 -137119 -137131 -137143 -137147 -137153 -137177 -137183 -137191 -137197 -137201 -137209 -137219 -137239 -137251 -137273 -137279 -137303 -137321 -137339 -137341 -137353 -137359 -137363 -137369 -137383 -137387 -137393 -137399 -137413 -137437 -137443 -137447 -137453 -137477 -137483 -137491 -137507 -137519 -137537 -137567 -137573 -137587 -137593 -137597 -137623 -137633 -137639 -137653 -137659 -137699 -137707 -137713 -137723 -137737 -137743 -137771 -137777 -137791 -137803 -137827 -137831 -137849 -137867 -137869 -137873 -137909 -137911 -137927 -137933 -137941 -137947 -137957 -137983 -137993 -137999 -138007 -138041 -138053 -138059 -138071 -138077 -138079 -138101 -138107 -138113 -138139 -138143 -138157 -138163 -138179 -138181 -138191 -138197 -138209 -138239 -138241 -138247 -138251 -138283 -138289 -138311 -138319 -138323 -138337 -138349 -138371 -138373 -138389 -138401 -138403 -138407 -138427 -138433 -138449 -138451 -138461 -138469 -138493 -138497 -138511 -138517 -138547 -138559 -138563 -138569 -138571 -138577 -138581 -138587 -138599 -138617 -138629 -138637 -138641 -138647 -138661 -138679 -138683 -138727 -138731 -138739 -138763 -138793 -138797 -138799 -138821 -138829 -138841 -138863 -138869 -138883 -138889 -138893 -138899 -138917 -138923 -138937 -138959 -138967 -138977 -139021 -139033 -139067 -139079 -139091 -139109 -139121 -139123 -139133 -139169 -139177 -139187 -139199 -139201 -139241 -139267 -139273 -139291 -139297 -139301 -139303 -139309 -139313 -139333 -139339 -139343 -139361 -139367 -139369 -139387 -139393 -139397 -139409 -139423 -139429 -139439 -139457 -139459 -139483 -139487 -139493 -139501 -139511 -139537 -139547 -139571 -139589 -139591 -139597 -139609 -139619 -139627 -139661 -139663 -139681 -139697 -139703 -139709 -139721 -139729 -139739 -139747 -139753 -139759 -139787 -139801 -139813 -139831 -139837 -139861 -139871 -139883 -139891 -139901 -139907 -139921 -139939 -139943 -139967 -139969 -139981 -139987 -139991 -139999 -140009 -140053 -140057 -140069 -140071 -140111 -140123 -140143 -140159 -140167 -140171 -140177 -140191 -140197 -140207 -140221 -140227 -140237 -140249 -140263 -140269 -140281 -140297 -140317 -140321 -140333 -140339 -140351 -140363 -140381 -140401 -140407 -140411 -140417 -140419 -140423 -140443 -140449 -140453 -140473 -140477 -140521 -140527 -140533 -140549 -140551 -140557 -140587 -140593 -140603 -140611 -140617 -140627 -140629 -140639 -140659 -140663 -140677 -140681 -140683 -140689 -140717 -140729 -140731 -140741 -140759 -140761 -140773 -140779 -140797 -140813 -140827 -140831 -140837 -140839 -140863 -140867 -140869 -140891 -140893 -140897 -140909 -140929 -140939 -140977 -140983 -140989 -141023 -141041 -141061 -141067 -141073 -141079 -141101 -141107 -141121 -141131 -141157 -141161 -141179 -141181 -141199 -141209 -141221 -141223 -141233 -141241 -141257 -141263 -141269 -141277 -141283 -141301 -141307 -141311 -141319 -141353 -141359 -141371 -141397 -141403 -141413 -141439 -141443 -141461 -141481 -141497 -141499 -141509 -141511 -141529 -141539 -141551 -141587 -141601 -141613 -141619 -141623 -141629 -141637 -141649 -141653 -141667 -141671 -141677 -141679 -141689 -141697 -141707 -141709 -141719 -141731 -141761 -141767 -141769 -141773 -141793 -141803 -141811 -141829 -141833 -141851 -141853 -141863 -141871 -141907 -141917 -141931 -141937 -141941 -141959 -141961 -141971 -141991 -142007 -142019 -142031 -142039 -142049 -142057 -142061 -142067 -142097 -142099 -142111 -142123 -142151 -142157 -142159 -142169 -142183 -142189 -142193 -142211 -142217 -142223 -142231 -142237 -142271 -142297 -142319 -142327 -142357 -142369 -142381 -142391 -142403 -142421 -142427 -142433 -142453 -142469 -142501 -142529 -142537 -142543 -142547 -142553 -142559 -142567 -142573 -142589 -142591 -142601 -142607 -142609 -142619 -142657 -142673 -142697 -142699 -142711 -142733 -142757 -142759 -142771 -142787 -142789 -142799 -142811 -142837 -142841 -142867 -142871 -142873 -142897 -142903 -142907 -142939 -142949 -142963 -142969 -142973 -142979 -142981 -142993 -143053 -143063 -143093 -143107 -143111 -143113 -143137 -143141 -143159 -143177 -143197 -143239 -143243 -143249 -143257 -143261 -143263 -143281 -143287 -143291 -143329 -143333 -143357 -143387 -143401 -143413 -143419 -143443 -143461 -143467 -143477 -143483 -143489 -143501 -143503 -143509 -143513 -143519 -143527 -143537 -143551 -143567 -143569 -143573 -143593 -143609 -143617 -143629 -143651 -143653 -143669 -143677 -143687 -143699 -143711 -143719 -143729 -143743 -143779 -143791 -143797 -143807 -143813 -143821 -143827 -143831 -143833 -143873 -143879 -143881 -143909 -143947 -143953 -143971 -143977 -143981 -143999 -144013 -144031 -144037 -144061 -144071 -144073 -144103 -144139 -144161 -144163 -144167 -144169 -144173 -144203 -144223 -144241 -144247 -144253 -144259 -144271 -144289 -144299 -144307 -144311 -144323 -144341 -144349 -144379 -144383 -144407 -144409 -144413 -144427 -144439 -144451 -144461 -144479 -144481 -144497 -144511 -144539 -144541 -144563 -144569 -144577 -144583 -144589 -144593 -144611 -144629 -144659 -144667 -144671 -144701 -144709 -144719 -144731 -144737 -144751 -144757 -144763 -144773 -144779 -144791 -144817 -144829 -144839 -144847 -144883 -144887 -144889 -144899 -144917 -144931 -144941 -144961 -144967 -144973 -144983 -145007 -145009 -145021 -145031 -145037 -145043 -145063 -145069 -145091 -145109 -145121 -145133 -145139 -145177 -145193 -145207 -145213 -145219 -145253 -145259 -145267 -145283 -145289 -145303 -145307 -145349 -145361 -145381 -145391 -145399 -145417 -145423 -145433 -145441 -145451 -145459 -145463 -145471 -145477 -145487 -145501 -145511 -145513 -145517 -145531 -145543 -145547 -145549 -145577 -145589 -145601 -145603 -145633 -145637 -145643 -145661 -145679 -145681 -145687 -145703 -145709 -145721 -145723 -145753 -145757 -145759 -145771 -145777 -145799 -145807 -145819 -145823 -145829 -145861 -145879 -145897 -145903 -145931 -145933 -145949 -145963 -145967 -145969 -145987 -145991 -146009 -146011 -146021 -146023 -146033 -146051 -146057 -146059 -146063 -146077 -146093 -146099 -146117 -146141 -146161 -146173 -146191 -146197 -146203 -146213 -146221 -146239 -146249 -146273 -146291 -146297 -146299 -146309 -146317 -146323 -146347 -146359 -146369 -146381 -146383 -146389 -146407 -146417 -146423 -146437 -146449 -146477 -146513 -146519 -146521 -146527 -146539 -146543 -146563 -146581 -146603 -146609 -146617 -146639 -146647 -146669 -146677 -146681 -146683 -146701 -146719 -146743 -146749 -146767 -146777 -146801 -146807 -146819 -146833 -146837 -146843 -146849 -146857 -146891 -146893 -146917 -146921 -146933 -146941 -146953 -146977 -146983 -146987 -146989 -147011 -147029 -147031 -147047 -147073 -147083 -147089 -147097 -147107 -147137 -147139 -147151 -147163 -147179 -147197 -147209 -147211 -147221 -147227 -147229 -147253 -147263 -147283 -147289 -147293 -147299 -147311 -147319 -147331 -147341 -147347 -147353 -147377 -147391 -147397 -147401 -147409 -147419 -147449 -147451 -147457 -147481 -147487 -147503 -147517 -147541 -147547 -147551 -147557 -147571 -147583 -147607 -147613 -147617 -147629 -147647 -147661 -147671 -147673 -147689 -147703 -147709 -147727 -147739 -147743 -147761 -147769 -147773 -147779 -147787 -147793 -147799 -147811 -147827 -147853 -147859 -147863 -147881 -147919 -147937 -147949 -147977 -147997 -148013 -148021 -148061 -148063 -148073 -148079 -148091 -148123 -148139 -148147 -148151 -148153 -148157 -148171 -148193 -148199 -148201 -148207 -148229 -148243 -148249 -148279 -148301 -148303 -148331 -148339 -148361 -148367 -148381 -148387 -148399 -148403 -148411 -148429 -148439 -148457 -148469 -148471 -148483 -148501 -148513 -148517 -148531 -148537 -148549 -148573 -148579 -148609 -148627 -148633 -148639 -148663 -148667 -148669 -148691 -148693 -148711 -148721 -148723 -148727 -148747 -148763 -148781 -148783 -148793 -148817 -148829 -148853 -148859 -148861 -148867 -148873 -148891 -148913 -148921 -148927 -148931 -148933 -148949 -148957 -148961 -148991 -148997 -149011 -149021 -149027 -149033 -149053 -149057 -149059 -149069 -149077 -149087 -149099 -149101 -149111 -149113 -149119 -149143 -149153 -149159 -149161 -149173 -149183 -149197 -149213 -149239 -149249 -149251 -149257 -149269 -149287 -149297 -149309 -149323 -149333 -149341 -149351 -149371 -149377 -149381 -149393 -149399 -149411 -149417 -149419 -149423 -149441 -149459 -149489 -149491 -149497 -149503 -149519 -149521 -149531 -149533 -149543 -149551 -149561 -149563 -149579 -149603 -149623 -149627 -149629 -149689 -149711 -149713 -149717 -149729 -149731 -149749 -149759 -149767 -149771 -149791 -149803 -149827 -149837 -149839 -149861 -149867 -149873 -149893 -149899 -149909 -149911 -149921 -149939 -149953 -149969 -149971 -149993 -150001 -150011 -150041 -150053 -150061 -150067 -150077 -150083 -150089 -150091 -150097 -150107 -150131 -150151 -150169 -150193 -150197 -150203 -150209 -150211 -150217 -150221 -150223 -150239 -150247 -150287 -150299 -150301 -150323 -150329 -150343 -150373 -150377 -150379 -150383 -150401 -150407 -150413 -150427 -150431 -150439 -150473 -150497 -150503 -150517 -150523 -150533 -150551 -150559 -150571 -150583 -150587 -150589 -150607 -150611 -150617 -150649 -150659 -150697 -150707 -150721 -150743 -150767 -150769 -150779 -150791 -150797 -150827 -150833 -150847 -150869 -150881 -150883 -150889 -150893 -150901 -150907 -150919 -150929 -150959 -150961 -150967 -150979 -150989 -150991 -151007 -151009 -151013 -151027 -151049 -151051 -151057 -151091 -151121 -151141 -151153 -151157 -151163 -151169 -151171 -151189 -151201 -151213 -151237 -151241 -151243 -151247 -151253 -151273 -151279 -151289 -151303 -151337 -151339 -151343 -151357 -151379 -151381 -151391 -151397 -151423 -151429 -151433 -151451 -151471 -151477 -151483 -151499 -151507 -151517 -151523 -151531 -151537 -151549 -151553 -151561 -151573 -151579 -151597 -151603 -151607 -151609 -151631 -151637 -151643 -151651 -151667 -151673 -151681 -151687 -151693 -151703 -151717 -151729 -151733 -151769 -151771 -151783 -151787 -151799 -151813 -151817 -151841 -151847 -151849 -151871 -151883 -151897 -151901 -151903 -151909 -151937 -151939 -151967 -151969 -152003 -152017 -152027 -152029 -152039 -152041 -152063 -152077 -152081 -152083 -152093 -152111 -152123 -152147 -152183 -152189 -152197 -152203 -152213 -152219 -152231 -152239 -152249 -152267 -152287 -152293 -152297 -152311 -152363 -152377 -152381 -152389 -152393 -152407 -152417 -152419 -152423 -152429 -152441 -152443 -152459 -152461 -152501 -152519 -152531 -152533 -152539 -152563 -152567 -152597 -152599 -152617 -152623 -152629 -152639 -152641 -152657 -152671 -152681 -152717 -152723 -152729 -152753 -152767 -152777 -152783 -152791 -152809 -152819 -152821 -152833 -152837 -152839 -152843 -152851 -152857 -152879 -152897 -152899 -152909 -152939 -152941 -152947 -152953 -152959 -152981 -152989 -152993 -153001 -153059 -153067 -153071 -153073 -153077 -153089 -153107 -153113 -153133 -153137 -153151 -153191 -153247 -153259 -153269 -153271 -153277 -153281 -153287 -153313 -153319 -153337 -153343 -153353 -153359 -153371 -153379 -153407 -153409 -153421 -153427 -153437 -153443 -153449 -153457 -153469 -153487 -153499 -153509 -153511 -153521 -153523 -153529 -153533 -153557 -153563 -153589 -153607 -153611 -153623 -153641 -153649 -153689 -153701 -153719 -153733 -153739 -153743 -153749 -153757 -153763 -153817 -153841 -153871 -153877 -153887 -153889 -153911 -153913 -153929 -153941 -153947 -153949 -153953 -153991 -153997 -154001 -154027 -154043 -154057 -154061 -154067 -154073 -154079 -154081 -154087 -154097 -154111 -154127 -154153 -154157 -154159 -154181 -154183 -154211 -154213 -154229 -154243 -154247 -154267 -154277 -154279 -154291 -154303 -154313 -154321 -154333 -154339 -154351 -154369 -154373 -154387 -154409 -154417 -154423 -154439 -154459 -154487 -154493 -154501 -154523 -154543 -154571 -154573 -154579 -154589 -154591 -154613 -154619 -154621 -154643 -154667 -154669 -154681 -154691 -154699 -154723 -154727 -154733 -154747 -154753 -154769 -154787 -154789 -154799 -154807 -154823 -154841 -154849 -154871 -154873 -154877 -154883 -154897 -154927 -154933 -154937 -154943 -154981 -154991 -155003 -155009 -155017 -155027 -155047 -155069 -155081 -155083 -155087 -155119 -155137 -155153 -155161 -155167 -155171 -155191 -155201 -155203 -155209 -155219 -155231 -155251 -155269 -155291 -155299 -155303 -155317 -155327 -155333 -155371 -155377 -155381 -155383 -155387 -155399 -155413 -155423 -155443 -155453 -155461 -155473 -155501 -155509 -155521 -155537 -155539 -155557 -155569 -155579 -155581 -155593 -155599 -155609 -155621 -155627 -155653 -155657 -155663 -155671 -155689 -155693 -155699 -155707 -155717 -155719 -155723 -155731 -155741 -155747 -155773 -155777 -155783 -155797 -155801 -155809 -155821 -155833 -155849 -155851 -155861 -155863 -155887 -155891 -155893 -155921 -156007 -156011 -156019 -156041 -156059 -156061 -156071 -156089 -156109 -156119 -156127 -156131 -156139 -156151 -156157 -156217 -156227 -156229 -156241 -156253 -156257 -156259 -156269 -156307 -156319 -156329 -156347 -156353 -156361 -156371 -156419 -156421 -156437 -156467 -156487 -156491 -156493 -156511 -156521 -156539 -156577 -156589 -156593 -156601 -156619 -156623 -156631 -156641 -156659 -156671 -156677 -156679 -156683 -156691 -156703 -156707 -156719 -156727 -156733 -156749 -156781 -156797 -156799 -156817 -156823 -156833 -156841 -156887 -156899 -156901 -156913 -156941 -156943 -156967 -156971 -156979 -157007 -157013 -157019 -157037 -157049 -157051 -157057 -157061 -157081 -157103 -157109 -157127 -157133 -157141 -157163 -157177 -157181 -157189 -157207 -157211 -157217 -157219 -157229 -157231 -157243 -157247 -157253 -157259 -157271 -157273 -157277 -157279 -157291 -157303 -157307 -157321 -157327 -157349 -157351 -157363 -157393 -157411 -157427 -157429 -157433 -157457 -157477 -157483 -157489 -157513 -157519 -157523 -157543 -157559 -157561 -157571 -157579 -157627 -157637 -157639 -157649 -157667 -157669 -157679 -157721 -157733 -157739 -157747 -157769 -157771 -157793 -157799 -157813 -157823 -157831 -157837 -157841 -157867 -157877 -157889 -157897 -157901 -157907 -157931 -157933 -157951 -157991 -157999 -158003 -158009 -158017 -158029 -158047 -158071 -158077 -158113 -158129 -158141 -158143 -158161 -158189 -158201 -158209 -158227 -158231 -158233 -158243 -158261 -158269 -158293 -158303 -158329 -158341 -158351 -158357 -158359 -158363 -158371 -158393 -158407 -158419 -158429 -158443 -158449 -158489 -158507 -158519 -158527 -158537 -158551 -158563 -158567 -158573 -158581 -158591 -158597 -158611 -158617 -158621 -158633 -158647 -158657 -158663 -158699 -158731 -158747 -158749 -158759 -158761 -158771 -158777 -158791 -158803 -158843 -158849 -158863 -158867 -158881 -158909 -158923 -158927 -158941 -158959 -158981 -158993 -159013 -159017 -159023 -159059 -159073 -159079 -159097 -159113 -159119 -159157 -159161 -159167 -159169 -159179 -159191 -159193 -159199 -159209 -159223 -159227 -159233 -159287 -159293 -159311 -159319 -159337 -159347 -159349 -159361 -159389 -159403 -159407 -159421 -159431 -159437 -159457 -159463 -159469 -159473 -159491 -159499 -159503 -159521 -159539 -159541 -159553 -159563 -159569 -159571 -159589 -159617 -159623 -159629 -159631 -159667 -159671 -159673 -159683 -159697 -159701 -159707 -159721 -159737 -159739 -159763 -159769 -159773 -159779 -159787 -159791 -159793 -159799 -159811 -159833 -159839 -159853 -159857 -159869 -159871 -159899 -159911 -159931 -159937 -159977 -159979 -160001 -160009 -160019 -160031 -160033 -160049 -160073 -160079 -160081 -160087 -160091 -160093 -160117 -160141 -160159 -160163 -160169 -160183 -160201 -160207 -160217 -160231 -160243 -160253 -160309 -160313 -160319 -160343 -160357 -160367 -160373 -160387 -160397 -160403 -160409 -160423 -160441 -160453 -160481 -160483 -160499 -160507 -160541 -160553 -160579 -160583 -160591 -160603 -160619 -160621 -160627 -160637 -160639 -160649 -160651 -160663 -160669 -160681 -160687 -160697 -160709 -160711 -160723 -160739 -160751 -160753 -160757 -160781 -160789 -160807 -160813 -160817 -160829 -160841 -160861 -160877 -160879 -160883 -160903 -160907 -160933 -160967 -160969 -160981 -160997 -161009 -161017 -161033 -161039 -161047 -161053 -161059 -161071 -161087 -161093 -161123 -161137 -161141 -161149 -161159 -161167 -161201 -161221 -161233 -161237 -161263 -161267 -161281 -161303 -161309 -161323 -161333 -161339 -161341 -161363 -161377 -161387 -161407 -161411 -161453 -161459 -161461 -161471 -161503 -161507 -161521 -161527 -161531 -161543 -161561 -161563 -161569 -161573 -161591 -161599 -161611 -161627 -161639 -161641 -161659 -161683 -161717 -161729 -161731 -161741 -161743 -161753 -161761 -161771 -161773 -161779 -161783 -161807 -161831 -161839 -161869 -161873 -161879 -161881 -161911 -161921 -161923 -161947 -161957 -161969 -161971 -161977 -161983 -161999 -162007 -162011 -162017 -162053 -162059 -162079 -162091 -162109 -162119 -162143 -162209 -162221 -162229 -162251 -162257 -162263 -162269 -162277 -162287 -162289 -162293 -162343 -162359 -162389 -162391 -162413 -162419 -162439 -162451 -162457 -162473 -162493 -162499 -162517 -162523 -162527 -162529 -162553 -162557 -162563 -162577 -162593 -162601 -162611 -162623 -162629 -162641 -162649 -162671 -162677 -162683 -162691 -162703 -162709 -162713 -162727 -162731 -162739 -162749 -162751 -162779 -162787 -162791 -162821 -162823 -162829 -162839 -162847 -162853 -162859 -162881 -162889 -162901 -162907 -162917 -162937 -162947 -162971 -162973 -162989 -162997 -163003 -163019 -163021 -163027 -163061 -163063 -163109 -163117 -163127 -163129 -163147 -163151 -163169 -163171 -163181 -163193 -163199 -163211 -163223 -163243 -163249 -163259 -163307 -163309 -163321 -163327 -163337 -163351 -163363 -163367 -163393 -163403 -163409 -163411 -163417 -163433 -163469 -163477 -163481 -163483 -163487 -163517 -163543 -163561 -163567 -163573 -163601 -163613 -163621 -163627 -163633 -163637 -163643 -163661 -163673 -163679 -163697 -163729 -163733 -163741 -163753 -163771 -163781 -163789 -163811 -163819 -163841 -163847 -163853 -163859 -163861 -163871 -163883 -163901 -163909 -163927 -163973 -163979 -163981 -163987 -163991 -163993 -163997 -164011 -164023 -164039 -164051 -164057 -164071 -164089 -164093 -164113 -164117 -164147 -164149 -164173 -164183 -164191 -164201 -164209 -164231 -164233 -164239 -164249 -164251 -164267 -164279 -164291 -164299 -164309 -164321 -164341 -164357 -164363 -164371 -164377 -164387 -164413 -164419 -164429 -164431 -164443 -164447 -164449 -164471 -164477 -164503 -164513 -164531 -164569 -164581 -164587 -164599 -164617 -164621 -164623 -164627 -164653 -164663 -164677 -164683 -164701 -164707 -164729 -164743 -164767 -164771 -164789 -164809 -164821 -164831 -164837 -164839 -164881 -164893 -164911 -164953 -164963 -164987 -164999 -165001 -165037 -165041 -165047 -165049 -165059 -165079 -165083 -165089 -165103 -165133 -165161 -165173 -165181 -165203 -165211 -165229 -165233 -165247 -165287 -165293 -165311 -165313 -165317 -165331 -165343 -165349 -165367 -165379 -165383 -165391 -165397 -165437 -165443 -165449 -165457 -165463 -165469 -165479 -165511 -165523 -165527 -165533 -165541 -165551 -165553 -165559 -165569 -165587 -165589 -165601 -165611 -165617 -165653 -165667 -165673 -165701 -165703 -165707 -165709 -165713 -165719 -165721 -165749 -165779 -165799 -165811 -165817 -165829 -165833 -165857 -165877 -165883 -165887 -165901 -165931 -165941 -165947 -165961 -165983 -166013 -166021 -166027 -166031 -166043 -166063 -166081 -166099 -166147 -166151 -166157 -166169 -166183 -166189 -166207 -166219 -166237 -166247 -166259 -166273 -166289 -166297 -166301 -166303 -166319 -166349 -166351 -166357 -166363 -166393 -166399 -166403 -166409 -166417 -166429 -166457 -166471 -166487 -166541 -166561 -166567 -166571 -166597 -166601 -166603 -166609 -166613 -166619 -166627 -166631 -166643 -166657 -166667 -166669 -166679 -166693 -166703 -166723 -166739 -166741 -166781 -166783 -166799 -166807 -166823 -166841 -166843 -166847 -166849 -166853 -166861 -166867 -166871 -166909 -166919 -166931 -166949 -166967 -166973 -166979 -166987 -167009 -167017 -167021 -167023 -167033 -167039 -167047 -167051 -167071 -167077 -167081 -167087 -167099 -167107 -167113 -167117 -167119 -167149 -167159 -167173 -167177 -167191 -167197 -167213 -167221 -167249 -167261 -167267 -167269 -167309 -167311 -167317 -167329 -167339 -167341 -167381 -167393 -167407 -167413 -167423 -167429 -167437 -167441 -167443 -167449 -167471 -167483 -167491 -167521 -167537 -167543 -167593 -167597 -167611 -167621 -167623 -167627 -167633 -167641 -167663 -167677 -167683 -167711 -167729 -167747 -167759 -167771 -167777 -167779 -167801 -167809 -167861 -167863 -167873 -167879 -167887 -167891 -167899 -167911 -167917 -167953 -167971 -167987 -168013 -168023 -168029 -168037 -168043 -168067 -168071 -168083 -168089 -168109 -168127 -168143 -168151 -168193 -168197 -168211 -168227 -168247 -168253 -168263 -168269 -168277 -168281 -168293 -168323 -168331 -168347 -168353 -168391 -168409 -168433 -168449 -168451 -168457 -168463 -168481 -168491 -168499 -168523 -168527 -168533 -168541 -168559 -168599 -168601 -168617 -168629 -168631 -168643 -168673 -168677 -168697 -168713 -168719 -168731 -168737 -168743 -168761 -168769 -168781 -168803 -168851 -168863 -168869 -168887 -168893 -168899 -168901 -168913 -168937 -168943 -168977 -168991 -169003 -169007 -169009 -169019 -169049 -169063 -169067 -169069 -169079 -169093 -169097 -169111 -169129 -169151 -169159 -169177 -169181 -169199 -169217 -169219 -169241 -169243 -169249 -169259 -169283 -169307 -169313 -169319 -169321 -169327 -169339 -169343 -169361 -169369 -169373 -169399 -169409 -169427 -169457 -169471 -169483 -169489 -169493 -169501 -169523 -169531 -169553 -169567 -169583 -169591 -169607 -169627 -169633 -169639 -169649 -169657 -169661 -169667 -169681 -169691 -169693 -169709 -169733 -169751 -169753 -169769 -169777 -169783 -169789 -169817 -169823 -169831 -169837 -169843 -169859 -169889 -169891 -169909 -169913 -169919 -169933 -169937 -169943 -169951 -169957 -169987 -169991 -170003 -170021 -170029 -170047 -170057 -170063 -170081 -170099 -170101 -170111 -170123 -170141 -170167 -170179 -170189 -170197 -170207 -170213 -170227 -170231 -170239 -170243 -170249 -170263 -170267 -170279 -170293 -170299 -170327 -170341 -170347 -170351 -170353 -170363 -170369 -170371 -170383 -170389 -170393 -170413 -170441 -170447 -170473 -170483 -170497 -170503 -170509 -170537 -170539 -170551 -170557 -170579 -170603 -170609 -170627 -170633 -170641 -170647 -170669 -170689 -170701 -170707 -170711 -170741 -170749 -170759 -170761 -170767 -170773 -170777 -170801 -170809 -170813 -170827 -170837 -170843 -170851 -170857 -170873 -170881 -170887 -170899 -170921 -170927 -170953 -170957 -170971 -171007 -171023 -171029 -171043 -171047 -171049 -171053 -171077 -171079 -171091 -171103 -171131 -171161 -171163 -171167 -171169 -171179 -171203 -171233 -171251 -171253 -171263 -171271 -171293 -171299 -171317 -171329 -171341 -171383 -171401 -171403 -171427 -171439 -171449 -171467 -171469 -171473 -171481 -171491 -171517 -171529 -171539 -171541 -171553 -171559 -171571 -171583 -171617 -171629 -171637 -171641 -171653 -171659 -171671 -171673 -171679 -171697 -171707 -171713 -171719 -171733 -171757 -171761 -171763 -171793 -171799 -171803 -171811 -171823 -171827 -171851 -171863 -171869 -171877 -171881 -171889 -171917 -171923 -171929 -171937 -171947 -172001 -172009 -172021 -172027 -172031 -172049 -172069 -172079 -172093 -172097 -172127 -172147 -172153 -172157 -172169 -172171 -172181 -172199 -172213 -172217 -172219 -172223 -172243 -172259 -172279 -172283 -172297 -172307 -172313 -172321 -172331 -172343 -172351 -172357 -172373 -172399 -172411 -172421 -172423 -172427 -172433 -172439 -172441 -172489 -172507 -172517 -172519 -172541 -172553 -172561 -172573 -172583 -172589 -172597 -172603 -172607 -172619 -172633 -172643 -172649 -172657 -172663 -172673 -172681 -172687 -172709 -172717 -172721 -172741 -172751 -172759 -172787 -172801 -172807 -172829 -172849 -172853 -172859 -172867 -172871 -172877 -172883 -172933 -172969 -172973 -172981 -172987 -172993 -172999 -173021 -173023 -173039 -173053 -173059 -173081 -173087 -173099 -173137 -173141 -173149 -173177 -173183 -173189 -173191 -173207 -173209 -173219 -173249 -173263 -173267 -173273 -173291 -173293 -173297 -173309 -173347 -173357 -173359 -173429 -173431 -173473 -173483 -173491 -173497 -173501 -173531 -173539 -173543 -173549 -173561 -173573 -173599 -173617 -173629 -173647 -173651 -173659 -173669 -173671 -173683 -173687 -173699 -173707 -173713 -173729 -173741 -173743 -173773 -173777 -173779 -173783 -173807 -173819 -173827 -173839 -173851 -173861 -173867 -173891 -173897 -173909 -173917 -173923 -173933 -173969 -173977 -173981 -173993 -174007 -174017 -174019 -174047 -174049 -174061 -174067 -174071 -174077 -174079 -174091 -174101 -174121 -174137 -174143 -174149 -174157 -174169 -174197 -174221 -174241 -174257 -174259 -174263 -174281 -174289 -174299 -174311 -174329 -174331 -174337 -174347 -174367 -174389 -174407 -174413 -174431 -174443 -174457 -174467 -174469 -174481 -174487 -174491 -174527 -174533 -174569 -174571 -174583 -174599 -174613 -174617 -174631 -174637 -174649 -174653 -174659 -174673 -174679 -174703 -174721 -174737 -174749 -174761 -174763 -174767 -174773 -174799 -174821 -174829 -174851 -174859 -174877 -174893 -174901 -174907 -174917 -174929 -174931 -174943 -174959 -174989 -174991 -175003 -175013 -175039 -175061 -175067 -175069 -175079 -175081 -175103 -175129 -175141 -175211 -175229 -175261 -175267 -175277 -175291 -175303 -175309 -175327 -175333 -175349 -175361 -175391 -175393 -175403 -175411 -175433 -175447 -175453 -175463 -175481 -175493 -175499 -175519 -175523 -175543 -175573 -175601 -175621 -175631 -175633 -175649 -175663 -175673 -175687 -175691 -175699 -175709 -175723 -175727 -175753 -175757 -175759 -175781 -175783 -175811 -175829 -175837 -175843 -175853 -175859 -175873 -175891 -175897 -175909 -175919 -175937 -175939 -175949 -175961 -175963 -175979 -175991 -175993 -176017 -176021 -176023 -176041 -176047 -176051 -176053 -176063 -176081 -176087 -176089 -176123 -176129 -176153 -176159 -176161 -176179 -176191 -176201 -176207 -176213 -176221 -176227 -176237 -176243 -176261 -176299 -176303 -176317 -176321 -176327 -176329 -176333 -176347 -176353 -176357 -176369 -176383 -176389 -176401 -176413 -176417 -176419 -176431 -176459 -176461 -176467 -176489 -176497 -176503 -176507 -176509 -176521 -176531 -176537 -176549 -176551 -176557 -176573 -176591 -176597 -176599 -176609 -176611 -176629 -176641 -176651 -176677 -176699 -176711 -176713 -176741 -176747 -176753 -176777 -176779 -176789 -176791 -176797 -176807 -176809 -176819 -176849 -176857 -176887 -176899 -176903 -176921 -176923 -176927 -176933 -176951 -176977 -176983 -176989 -177007 -177011 -177013 -177019 -177043 -177091 -177101 -177109 -177113 -177127 -177131 -177167 -177173 -177209 -177211 -177217 -177223 -177239 -177257 -177269 -177283 -177301 -177319 -177323 -177337 -177347 -177379 -177383 -177409 -177421 -177427 -177431 -177433 -177467 -177473 -177481 -177487 -177493 -177511 -177533 -177539 -177553 -177589 -177601 -177623 -177647 -177677 -177679 -177691 -177739 -177743 -177761 -177763 -177787 -177791 -177797 -177811 -177823 -177839 -177841 -177883 -177887 -177889 -177893 -177907 -177913 -177917 -177929 -177943 -177949 -177953 -177967 -177979 -178001 -178021 -178037 -178039 -178067 -178069 -178091 -178093 -178103 -178117 -178127 -178141 -178151 -178169 -178183 -178187 -178207 -178223 -178231 -178247 -178249 -178259 -178261 -178289 -178301 -178307 -178327 -178333 -178349 -178351 -178361 -178393 -178397 -178403 -178417 -178439 -178441 -178447 -178469 -178481 -178487 -178489 -178501 -178513 -178531 -178537 -178559 -178561 -178567 -178571 -178597 -178601 -178603 -178609 -178613 -178621 -178627 -178639 -178643 -178681 -178691 -178693 -178697 -178753 -178757 -178781 -178793 -178799 -178807 -178813 -178817 -178819 -178831 -178853 -178859 -178873 -178877 -178889 -178897 -178903 -178907 -178909 -178921 -178931 -178933 -178939 -178951 -178973 -178987 -179021 -179029 -179033 -179041 -179051 -179057 -179083 -179089 -179099 -179107 -179111 -179119 -179143 -179161 -179167 -179173 -179203 -179209 -179213 -179233 -179243 -179261 -179269 -179281 -179287 -179317 -179321 -179327 -179351 -179357 -179369 -179381 -179383 -179393 -179407 -179411 -179429 -179437 -179441 -179453 -179461 -179471 -179479 -179483 -179497 -179519 -179527 -179533 -179549 -179563 -179573 -179579 -179581 -179591 -179593 -179603 -179623 -179633 -179651 -179657 -179659 -179671 -179687 -179689 -179693 -179717 -179719 -179737 -179743 -179749 -179779 -179801 -179807 -179813 -179819 -179821 -179827 -179833 -179849 -179897 -179899 -179903 -179909 -179917 -179923 -179939 -179947 -179951 -179953 -179957 -179969 -179981 -179989 -179999 -180001 -180007 -180023 -180043 -180053 -180071 -180073 -180077 -180097 -180137 -180161 -180179 -180181 -180211 -180221 -180233 -180239 -180241 -180247 -180259 -180263 -180281 -180287 -180289 -180307 -180311 -180317 -180331 -180337 -180347 -180361 -180371 -180379 -180391 -180413 -180419 -180437 -180463 -180473 -180491 -180497 -180503 -180511 -180533 -180539 -180541 -180547 -180563 -180569 -180617 -180623 -180629 -180647 -180667 -180679 -180701 -180731 -180749 -180751 -180773 -180779 -180793 -180797 -180799 -180811 -180847 -180871 -180883 -180907 -180949 -180959 -181001 -181003 -181019 -181031 -181039 -181061 -181063 -181081 -181087 -181123 -181141 -181157 -181183 -181193 -181199 -181201 -181211 -181213 -181219 -181243 -181253 -181273 -181277 -181283 -181297 -181301 -181303 -181361 -181387 -181397 -181399 -181409 -181421 -181439 -181457 -181459 -181499 -181501 -181513 -181523 -181537 -181549 -181553 -181603 -181607 -181609 -181619 -181639 -181667 -181669 -181693 -181711 -181717 -181721 -181729 -181739 -181751 -181757 -181759 -181763 -181777 -181787 -181789 -181813 -181837 -181871 -181873 -181889 -181891 -181903 -181913 -181919 -181927 -181931 -181943 -181957 -181967 -181981 -181997 -182009 -182011 -182027 -182029 -182041 -182047 -182057 -182059 -182089 -182099 -182101 -182107 -182111 -182123 -182129 -182131 -182141 -182159 -182167 -182177 -182179 -182201 -182209 -182233 -182239 -182243 -182261 -182279 -182297 -182309 -182333 -182339 -182341 -182353 -182387 -182389 -182417 -182423 -182431 -182443 -182453 -182467 -182471 -182473 -182489 -182503 -182509 -182519 -182537 -182549 -182561 -182579 -182587 -182593 -182599 -182603 -182617 -182627 -182639 -182641 -182653 -182657 -182659 -182681 -182687 -182701 -182711 -182713 -182747 -182773 -182779 -182789 -182803 -182813 -182821 -182839 -182851 -182857 -182867 -182887 -182893 -182899 -182921 -182927 -182929 -182933 -182953 -182957 -182969 -182981 -182999 -183023 -183037 -183041 -183047 -183059 -183067 -183089 -183091 -183119 -183151 -183167 -183191 -183203 -183247 -183259 -183263 -183283 -183289 -183299 -183301 -183307 -183317 -183319 -183329 -183343 -183349 -183361 -183373 -183377 -183383 -183389 -183397 -183437 -183439 -183451 -183461 -183473 -183479 -183487 -183497 -183499 -183503 -183509 -183511 -183523 -183527 -183569 -183571 -183577 -183581 -183587 -183593 -183611 -183637 -183661 -183683 -183691 -183697 -183707 -183709 -183713 -183761 -183763 -183797 -183809 -183823 -183829 -183871 -183877 -183881 -183907 -183917 -183919 -183943 -183949 -183959 -183971 -183973 -183979 -184003 -184007 -184013 -184031 -184039 -184043 -184057 -184073 -184081 -184087 -184111 -184117 -184133 -184153 -184157 -184181 -184187 -184189 -184199 -184211 -184231 -184241 -184259 -184271 -184273 -184279 -184291 -184309 -184321 -184333 -184337 -184351 -184369 -184409 -184417 -184441 -184447 -184463 -184477 -184487 -184489 -184511 -184517 -184523 -184553 -184559 -184567 -184571 -184577 -184607 -184609 -184627 -184631 -184633 -184649 -184651 -184669 -184687 -184693 -184703 -184711 -184721 -184727 -184733 -184753 -184777 -184823 -184829 -184831 -184837 -184843 -184859 -184879 -184901 -184903 -184913 -184949 -184957 -184967 -184969 -184993 -184997 -184999 -185021 -185027 -185051 -185057 -185063 -185069 -185071 -185077 -185089 -185099 -185123 -185131 -185137 -185149 -185153 -185161 -185167 -185177 -185183 -185189 -185221 -185233 -185243 -185267 -185291 -185299 -185303 -185309 -185323 -185327 -185359 -185363 -185369 -185371 -185401 -185429 -185441 -185467 -185477 -185483 -185491 -185519 -185527 -185531 -185533 -185539 -185543 -185551 -185557 -185567 -185569 -185593 -185599 -185621 -185641 -185651 -185677 -185681 -185683 -185693 -185699 -185707 -185711 -185723 -185737 -185747 -185749 -185753 -185767 -185789 -185797 -185813 -185819 -185821 -185831 -185833 -185849 -185869 -185873 -185893 -185897 -185903 -185917 -185923 -185947 -185951 -185957 -185959 -185971 -185987 -185993 -186007 -186013 -186019 -186023 -186037 -186041 -186049 -186071 -186097 -186103 -186107 -186113 -186119 -186149 -186157 -186161 -186163 -186187 -186191 -186211 -186227 -186229 -186239 -186247 -186253 -186259 -186271 -186283 -186299 -186301 -186311 -186317 -186343 -186377 -186379 -186391 -186397 -186419 -186437 -186451 -186469 -186479 -186481 -186551 -186569 -186581 -186583 -186587 -186601 -186619 -186629 -186647 -186649 -186653 -186671 -186679 -186689 -186701 -186707 -186709 -186727 -186733 -186743 -186757 -186761 -186763 -186773 -186793 -186799 -186841 -186859 -186869 -186871 -186877 -186883 -186889 -186917 -186947 -186959 -187003 -187009 -187027 -187043 -187049 -187067 -187069 -187073 -187081 -187091 -187111 -187123 -187127 -187129 -187133 -187139 -187141 -187163 -187171 -187177 -187181 -187189 -187193 -187211 -187217 -187219 -187223 -187237 -187273 -187277 -187303 -187337 -187339 -187349 -187361 -187367 -187373 -187379 -187387 -187393 -187409 -187417 -187423 -187433 -187441 -187463 -187469 -187471 -187477 -187507 -187513 -187531 -187547 -187559 -187573 -187597 -187631 -187633 -187637 -187639 -187651 -187661 -187669 -187687 -187699 -187711 -187721 -187751 -187763 -187787 -187793 -187823 -187843 -187861 -187871 -187877 -187883 -187897 -187907 -187909 -187921 -187927 -187931 -187951 -187963 -187973 -187987 -188011 -188017 -188021 -188029 -188107 -188137 -188143 -188147 -188159 -188171 -188179 -188189 -188197 -188249 -188261 -188273 -188281 -188291 -188299 -188303 -188311 -188317 -188323 -188333 -188351 -188359 -188369 -188389 -188401 -188407 -188417 -188431 -188437 -188443 -188459 -188473 -188483 -188491 -188519 -188527 -188533 -188563 -188579 -188603 -188609 -188621 -188633 -188653 -188677 -188681 -188687 -188693 -188701 -188707 -188711 -188719 -188729 -188753 -188767 -188779 -188791 -188801 -188827 -188831 -188833 -188843 -188857 -188861 -188863 -188869 -188891 -188911 -188927 -188933 -188939 -188941 -188953 -188957 -188983 -188999 -189011 -189017 -189019 -189041 -189043 -189061 -189067 -189127 -189139 -189149 -189151 -189169 -189187 -189199 -189223 -189229 -189239 -189251 -189253 -189257 -189271 -189307 -189311 -189337 -189347 -189349 -189353 -189361 -189377 -189389 -189391 -189401 -189407 -189421 -189433 -189437 -189439 -189463 -189467 -189473 -189479 -189491 -189493 -189509 -189517 -189523 -189529 -189547 -189559 -189583 -189593 -189599 -189613 -189617 -189619 -189643 -189653 -189661 -189671 -189691 -189697 -189701 -189713 -189733 -189743 -189757 -189767 -189797 -189799 -189817 -189823 -189851 -189853 -189859 -189877 -189881 -189887 -189901 -189913 -189929 -189947 -189949 -189961 -189967 -189977 -189983 -189989 -189997 -190027 -190031 -190051 -190063 -190093 -190097 -190121 -190129 -190147 -190159 -190181 -190207 -190243 -190249 -190261 -190271 -190283 -190297 -190301 -190313 -190321 -190331 -190339 -190357 -190367 -190369 -190387 -190391 -190403 -190409 -190471 -190507 -190523 -190529 -190537 -190543 -190573 -190577 -190579 -190583 -190591 -190607 -190613 -190633 -190639 -190649 -190657 -190667 -190669 -190699 -190709 -190711 -190717 -190753 -190759 -190763 -190769 -190783 -190787 -190793 -190807 -190811 -190823 -190829 -190837 -190843 -190871 -190889 -190891 -190901 -190909 -190913 -190921 -190979 -190997 -191021 -191027 -191033 -191039 -191047 -191057 -191071 -191089 -191099 -191119 -191123 -191137 -191141 -191143 -191161 -191173 -191189 -191227 -191231 -191237 -191249 -191251 -191281 -191297 -191299 -191339 -191341 -191353 -191413 -191441 -191447 -191449 -191453 -191459 -191461 -191467 -191473 -191491 -191497 -191507 -191509 -191519 -191531 -191533 -191537 -191551 -191561 -191563 -191579 -191599 -191621 -191627 -191657 -191669 -191671 -191677 -191689 -191693 -191699 -191707 -191717 -191747 -191749 -191773 -191783 -191791 -191801 -191803 -191827 -191831 -191833 -191837 -191861 -191899 -191903 -191911 -191929 -191953 -191969 -191977 -191999 -192007 -192013 -192029 -192037 -192043 -192047 -192053 -192091 -192097 -192103 -192113 -192121 -192133 -192149 -192161 -192173 -192187 -192191 -192193 -192229 -192233 -192239 -192251 -192259 -192263 -192271 -192307 -192317 -192319 -192323 -192341 -192343 -192347 -192373 -192377 -192383 -192391 -192407 -192431 -192461 -192463 -192497 -192499 -192529 -192539 -192547 -192553 -192557 -192571 -192581 -192583 -192587 -192601 -192611 -192613 -192617 -192629 -192631 -192637 -192667 -192677 -192697 -192737 -192743 -192749 -192757 -192767 -192781 -192791 -192799 -192811 -192817 -192833 -192847 -192853 -192859 -192877 -192883 -192887 -192889 -192917 -192923 -192931 -192949 -192961 -192971 -192977 -192979 -192991 -193003 -193009 -193013 -193031 -193043 -193051 -193057 -193073 -193093 -193133 -193139 -193147 -193153 -193163 -193181 -193183 -193189 -193201 -193243 -193247 -193261 -193283 -193301 -193327 -193337 -193357 -193367 -193373 -193379 -193381 -193387 -193393 -193423 -193433 -193441 -193447 -193451 -193463 -193469 -193493 -193507 -193513 -193541 -193549 -193559 -193573 -193577 -193597 -193601 -193603 -193607 -193619 -193649 -193663 -193679 -193703 -193723 -193727 -193741 -193751 -193757 -193763 -193771 -193789 -193793 -193799 -193811 -193813 -193841 -193847 -193859 -193861 -193871 -193873 -193877 -193883 -193891 -193937 -193939 -193943 -193951 -193957 -193979 -193993 -194003 -194017 -194027 -194057 -194069 -194071 -194083 -194087 -194093 -194101 -194113 -194119 -194141 -194149 -194167 -194179 -194197 -194203 -194239 -194263 -194267 -194269 -194309 -194323 -194353 -194371 -194377 -194413 -194431 -194443 -194471 -194479 -194483 -194507 -194521 -194527 -194543 -194569 -194581 -194591 -194609 -194647 -194653 -194659 -194671 -194681 -194683 -194687 -194707 -194713 -194717 -194723 -194729 -194749 -194767 -194771 -194809 -194813 -194819 -194827 -194839 -194861 -194863 -194867 -194869 -194891 -194899 -194911 -194917 -194933 -194963 -194977 -194981 -194989 -195023 -195029 -195043 -195047 -195049 -195053 -195071 -195077 -195089 -195103 -195121 -195127 -195131 -195137 -195157 -195161 -195163 -195193 -195197 -195203 -195229 -195241 -195253 -195259 -195271 -195277 -195281 -195311 -195319 -195329 -195341 -195343 -195353 -195359 -195389 -195401 -195407 -195413 -195427 -195443 -195457 -195469 -195479 -195493 -195497 -195511 -195527 -195539 -195541 -195581 -195593 -195599 -195659 -195677 -195691 -195697 -195709 -195731 -195733 -195737 -195739 -195743 -195751 -195761 -195781 -195787 -195791 -195809 -195817 -195863 -195869 -195883 -195887 -195893 -195907 -195913 -195919 -195929 -195931 -195967 -195971 -195973 -195977 -195991 -195997 -196003 -196033 -196039 -196043 -196051 -196073 -196081 -196087 -196111 -196117 -196139 -196159 -196169 -196171 -196177 -196181 -196187 -196193 -196201 -196247 -196271 -196277 -196279 -196291 -196303 -196307 -196331 -196337 -196379 -196387 -196429 -196439 -196453 -196459 -196477 -196499 -196501 -196519 -196523 -196541 -196543 -196549 -196561 -196579 -196583 -196597 -196613 -196643 -196657 -196661 -196663 -196681 -196687 -196699 -196709 -196717 -196727 -196739 -196751 -196769 -196771 -196799 -196817 -196831 -196837 -196853 -196871 -196873 -196879 -196901 -196907 -196919 -196927 -196961 -196991 -196993 -197003 -197009 -197023 -197033 -197059 -197063 -197077 -197083 -197089 -197101 -197117 -197123 -197137 -197147 -197159 -197161 -197203 -197207 -197221 -197233 -197243 -197257 -197261 -197269 -197273 -197279 -197293 -197297 -197299 -197311 -197339 -197341 -197347 -197359 -197369 -197371 -197381 -197383 -197389 -197419 -197423 -197441 -197453 -197479 -197507 -197521 -197539 -197551 -197567 -197569 -197573 -197597 -197599 -197609 -197621 -197641 -197647 -197651 -197677 -197683 -197689 -197699 -197711 -197713 -197741 -197753 -197759 -197767 -197773 -197779 -197803 -197807 -197831 -197837 -197887 -197891 -197893 -197909 -197921 -197927 -197933 -197947 -197957 -197959 -197963 -197969 -197971 -198013 -198017 -198031 -198043 -198047 -198073 -198083 -198091 -198097 -198109 -198127 -198139 -198173 -198179 -198193 -198197 -198221 -198223 -198241 -198251 -198257 -198259 -198277 -198281 -198301 -198313 -198323 -198337 -198347 -198349 -198377 -198391 -198397 -198409 -198413 -198427 -198437 -198439 -198461 -198463 -198469 -198479 -198491 -198503 -198529 -198533 -198553 -198571 -198589 -198593 -198599 -198613 -198623 -198637 -198641 -198647 -198659 -198673 -198689 -198701 -198719 -198733 -198761 -198769 -198811 -198817 -198823 -198827 -198829 -198833 -198839 -198841 -198851 -198859 -198899 -198901 -198929 -198937 -198941 -198943 -198953 -198959 -198967 -198971 -198977 -198997 -199021 -199033 -199037 -199039 -199049 -199081 -199103 -199109 -199151 -199153 -199181 -199193 -199207 -199211 -199247 -199261 -199267 -199289 -199313 -199321 -199337 -199343 -199357 -199373 -199379 -199399 -199403 -199411 -199417 -199429 -199447 -199453 -199457 -199483 -199487 -199489 -199499 -199501 -199523 -199559 -199567 -199583 -199601 -199603 -199621 -199637 -199657 -199669 -199673 -199679 -199687 -199697 -199721 -199729 -199739 -199741 -199751 -199753 -199777 -199783 -199799 -199807 -199811 -199813 -199819 -199831 -199853 -199873 -199877 -199889 -199909 -199921 -199931 -199933 -199961 -199967 -199999 -200003 -200009 -200017 -200023 -200029 -200033 -200041 -200063 -200087 -200117 -200131 -200153 -200159 -200171 -200177 -200183 -200191 -200201 -200227 -200231 -200237 -200257 -200273 -200293 -200297 -200323 -200329 -200341 -200351 -200357 -200363 -200371 -200381 -200383 -200401 -200407 -200437 -200443 -200461 -200467 -200483 -200513 -200569 -200573 -200579 -200587 -200591 -200597 -200609 -200639 -200657 -200671 -200689 -200699 -200713 -200723 -200731 -200771 -200779 -200789 -200797 -200807 -200843 -200861 -200867 -200869 -200881 -200891 -200899 -200903 -200909 -200927 -200929 -200971 -200983 -200987 -200989 -201007 -201011 -201031 -201037 -201049 -201073 -201101 -201107 -201119 -201121 -201139 -201151 -201163 -201167 -201193 -201203 -201209 -201211 -201233 -201247 -201251 -201281 -201287 -201307 -201329 -201337 -201359 -201389 -201401 -201403 -201413 -201437 -201449 -201451 -201473 -201491 -201493 -201497 -201499 -201511 -201517 -201547 -201557 -201577 -201581 -201589 -201599 -201611 -201623 -201629 -201653 -201661 -201667 -201673 -201683 -201701 -201709 -201731 -201743 -201757 -201767 -201769 -201781 -201787 -201791 -201797 -201809 -201821 -201823 -201827 -201829 -201833 -201847 -201881 -201889 -201893 -201907 -201911 -201919 -201923 -201937 -201947 -201953 -201961 -201973 -201979 -201997 -202001 -202021 -202031 -202049 -202061 -202063 -202067 -202087 -202099 -202109 -202121 -202127 -202129 -202183 -202187 -202201 -202219 -202231 -202243 -202277 -202289 -202291 -202309 -202327 -202339 -202343 -202357 -202361 -202381 -202387 -202393 -202403 -202409 -202441 -202471 -202481 -202493 -202519 -202529 -202549 -202567 -202577 -202591 -202613 -202621 -202627 -202637 -202639 -202661 -202667 -202679 -202693 -202717 -202729 -202733 -202747 -202751 -202753 -202757 -202777 -202799 -202817 -202823 -202841 -202859 -202877 -202879 -202889 -202907 -202921 -202931 -202933 -202949 -202967 -202973 -202981 -202987 -202999 -203011 -203017 -203023 -203039 -203051 -203057 -203117 -203141 -203173 -203183 -203207 -203209 -203213 -203221 -203227 -203233 -203249 -203279 -203293 -203309 -203311 -203317 -203321 -203323 -203339 -203341 -203351 -203353 -203363 -203381 -203383 -203387 -203393 -203417 -203419 -203429 -203431 -203449 -203459 -203461 -203531 -203549 -203563 -203569 -203579 -203591 -203617 -203627 -203641 -203653 -203657 -203659 -203663 -203669 -203713 -203761 -203767 -203771 -203773 -203789 -203807 -203809 -203821 -203843 -203857 -203869 -203873 -203897 -203909 -203911 -203921 -203947 -203953 -203969 -203971 -203977 -203989 -203999 -204007 -204013 -204019 -204023 -204047 -204059 -204067 -204101 -204107 -204133 -204137 -204143 -204151 -204161 -204163 -204173 -204233 -204251 -204299 -204301 -204311 -204319 -204329 -204331 -204353 -204359 -204361 -204367 -204371 -204377 -204397 -204427 -204431 -204437 -204439 -204443 -204461 -204481 -204487 -204509 -204511 -204517 -204521 -204557 -204563 -204583 -204587 -204599 -204601 -204613 -204623 -204641 -204667 -204679 -204707 -204719 -204733 -204749 -204751 -204781 -204791 -204793 -204797 -204803 -204821 -204857 -204859 -204871 -204887 -204913 -204917 -204923 -204931 -204947 -204973 -204979 -204983 -205019 -205031 -205033 -205043 -205063 -205069 -205081 -205097 -205103 -205111 -205129 -205133 -205141 -205151 -205157 -205171 -205187 -205201 -205211 -205213 -205223 -205237 -205253 -205267 -205297 -205307 -205319 -205327 -205339 -205357 -205391 -205397 -205399 -205417 -205421 -205423 -205427 -205433 -205441 -205453 -205463 -205477 -205483 -205487 -205493 -205507 -205519 -205529 -205537 -205549 -205553 -205559 -205589 -205603 -205607 -205619 -205627 -205633 -205651 -205657 -205661 -205663 -205703 -205721 -205759 -205763 -205783 -205817 -205823 -205837 -205847 -205879 -205883 -205913 -205937 -205949 -205951 -205957 -205963 -205967 -205981 -205991 -205993 -206009 -206021 -206027 -206033 -206039 -206047 -206051 -206069 -206077 -206081 -206083 -206123 -206153 -206177 -206179 -206183 -206191 -206197 -206203 -206209 -206221 -206233 -206237 -206249 -206251 -206263 -206273 -206279 -206281 -206291 -206299 -206303 -206341 -206347 -206351 -206369 -206383 -206399 -206407 -206411 -206413 -206419 -206447 -206461 -206467 -206477 -206483 -206489 -206501 -206519 -206527 -206543 -206551 -206593 -206597 -206603 -206623 -206627 -206639 -206641 -206651 -206699 -206749 -206779 -206783 -206803 -206807 -206813 -206819 -206821 -206827 -206879 -206887 -206897 -206909 -206911 -206917 -206923 -206933 -206939 -206951 -206953 -206993 -207013 -207017 -207029 -207037 -207041 -207061 -207073 -207079 -207113 -207121 -207127 -207139 -207169 -207187 -207191 -207197 -207199 -207227 -207239 -207241 -207257 -207269 -207287 -207293 -207301 -207307 -207329 -207331 -207341 -207343 -207367 -207371 -207377 -207401 -207409 -207433 -207443 -207457 -207463 -207469 -207479 -207481 -207491 -207497 -207509 -207511 -207517 -207521 -207523 -207541 -207547 -207551 -207563 -207569 -207589 -207593 -207619 -207629 -207643 -207653 -207661 -207671 -207673 -207679 -207709 -207719 -207721 -207743 -207763 -207769 -207797 -207799 -207811 -207821 -207833 -207847 -207869 -207877 -207923 -207931 -207941 -207947 -207953 -207967 -207971 -207973 -207997 -208001 -208003 -208009 -208037 -208049 -208057 -208067 -208073 -208099 -208111 -208121 -208129 -208139 -208141 -208147 -208189 -208207 -208213 -208217 -208223 -208231 -208253 -208261 -208277 -208279 -208283 -208291 -208309 -208319 -208333 -208337 -208367 -208379 -208387 -208391 -208393 -208409 -208433 -208441 -208457 -208459 -208463 -208469 -208489 -208493 -208499 -208501 -208511 -208513 -208519 -208529 -208553 -208577 -208589 -208591 -208609 -208627 -208631 -208657 -208667 -208673 -208687 -208697 -208699 -208721 -208729 -208739 -208759 -208787 -208799 -208807 -208837 -208843 -208877 -208889 -208891 -208907 -208927 -208931 -208933 -208961 -208963 -208991 -208993 -208997 -209021 -209029 -209039 -209063 -209071 -209089 -209123 -209147 -209159 -209173 -209179 -209189 -209201 -209203 -209213 -209221 -209227 -209233 -209249 -209257 -209263 -209267 -209269 -209299 -209311 -209317 -209327 -209333 -209347 -209353 -209357 -209359 -209371 -209381 -209393 -209401 -209431 -209441 -209449 -209459 -209471 -209477 -209497 -209519 -209533 -209543 -209549 -209563 -209567 -209569 -209579 -209581 -209597 -209621 -209623 -209639 -209647 -209659 -209669 -209687 -209701 -209707 -209717 -209719 -209743 -209767 -209771 -209789 -209801 -209809 -209813 -209819 -209821 -209837 -209851 -209857 -209861 -209887 -209917 -209927 -209929 -209939 -209953 -209959 -209971 -209977 -209983 -209987 -210011 -210019 -210031 -210037 -210053 -210071 -210097 -210101 -210109 -210113 -210127 -210131 -210139 -210143 -210157 -210169 -210173 -210187 -210191 -210193 -210209 -210229 -210233 -210241 -210247 -210257 -210263 -210277 -210283 -210299 -210317 -210319 -210323 -210347 -210359 -210361 -210391 -210401 -210403 -210407 -210421 -210437 -210461 -210467 -210481 -210487 -210491 -210499 -210523 -210527 -210533 -210557 -210599 -210601 -210619 -210631 -210643 -210659 -210671 -210709 -210713 -210719 -210731 -210739 -210761 -210773 -210803 -210809 -210811 -210823 -210827 -210839 -210853 -210857 -210869 -210901 -210907 -210911 -210913 -210923 -210929 -210943 -210961 -210967 -211007 -211039 -211049 -211051 -211061 -211063 -211067 -211073 -211093 -211097 -211129 -211151 -211153 -211177 -211187 -211193 -211199 -211213 -211217 -211219 -211229 -211231 -211241 -211247 -211271 -211283 -211291 -211297 -211313 -211319 -211333 -211339 -211349 -211369 -211373 -211403 -211427 -211433 -211441 -211457 -211469 -211493 -211499 -211501 -211507 -211543 -211559 -211571 -211573 -211583 -211597 -211619 -211639 -211643 -211657 -211661 -211663 -211681 -211691 -211693 -211711 -211723 -211727 -211741 -211747 -211777 -211781 -211789 -211801 -211811 -211817 -211859 -211867 -211873 -211877 -211879 -211889 -211891 -211927 -211931 -211933 -211943 -211949 -211969 -211979 -211997 -212029 -212039 -212057 -212081 -212099 -212117 -212123 -212131 -212141 -212161 -212167 -212183 -212203 -212207 -212209 -212227 -212239 -212243 -212281 -212293 -212297 -212353 -212369 -212383 -212411 -212419 -212423 -212437 -212447 -212453 -212461 -212467 -212479 -212501 -212507 -212557 -212561 -212573 -212579 -212587 -212593 -212627 -212633 -212651 -212669 -212671 -212677 -212683 -212701 -212777 -212791 -212801 -212827 -212837 -212843 -212851 -212867 -212869 -212873 -212881 -212897 -212903 -212909 -212917 -212923 -212969 -212981 -212987 -212999 -213019 -213023 -213029 -213043 -213067 -213079 -213091 -213097 -213119 -213131 -213133 -213139 -213149 -213173 -213181 -213193 -213203 -213209 -213217 -213223 -213229 -213247 -213253 -213263 -213281 -213287 -213289 -213307 -213319 -213329 -213337 -213349 -213359 -213361 -213383 -213391 -213397 -213407 -213449 -213461 -213467 -213481 -213491 -213523 -213533 -213539 -213553 -213557 -213589 -213599 -213611 -213613 -213623 -213637 -213641 -213649 -213659 -213713 -213721 -213727 -213737 -213751 -213791 -213799 -213821 -213827 -213833 -213847 -213859 -213881 -213887 -213901 -213919 -213929 -213943 -213947 -213949 -213953 -213973 -213977 -213989 -214003 -214007 -214009 -214021 -214031 -214033 -214043 -214051 -214063 -214069 -214087 -214091 -214129 -214133 -214141 -214147 -214163 -214177 -214189 -214211 -214213 -214219 -214237 -214243 -214259 -214283 -214297 -214309 -214351 -214363 -214373 -214381 -214391 -214399 -214433 -214439 -214451 -214457 -214463 -214469 -214481 -214483 -214499 -214507 -214517 -214519 -214531 -214541 -214559 -214561 -214589 -214603 -214607 -214631 -214639 -214651 -214657 -214663 -214667 -214673 -214691 -214723 -214729 -214733 -214741 -214759 -214763 -214771 -214783 -214787 -214789 -214807 -214811 -214817 -214831 -214849 -214853 -214867 -214883 -214891 -214913 -214939 -214943 -214967 -214987 -214993 -215051 -215063 -215077 -215087 -215123 -215141 -215143 -215153 -215161 -215179 -215183 -215191 -215197 -215239 -215249 -215261 -215273 -215279 -215297 -215309 -215317 -215329 -215351 -215353 -215359 -215381 -215389 -215393 -215399 -215417 -215443 -215447 -215459 -215461 -215471 -215483 -215497 -215503 -215507 -215521 -215531 -215563 -215573 -215587 -215617 -215653 -215659 -215681 -215687 -215689 -215693 -215723 -215737 -215753 -215767 -215771 -215797 -215801 -215827 -215833 -215843 -215851 -215857 -215863 -215893 -215899 -215909 -215921 -215927 -215939 -215953 -215959 -215981 -215983 -216023 -216037 -216061 -216071 -216091 -216103 -216107 -216113 -216119 -216127 -216133 -216149 -216157 -216173 -216179 -216211 -216217 -216233 -216259 -216263 -216289 -216317 -216319 -216329 -216347 -216371 -216373 -216379 -216397 -216401 -216421 -216431 -216451 -216481 -216493 -216509 -216523 -216551 -216553 -216569 -216571 -216577 -216607 -216617 -216641 -216647 -216649 -216653 -216661 -216679 -216703 -216719 -216731 -216743 -216751 -216757 -216761 -216779 -216781 -216787 -216791 -216803 -216829 -216841 -216851 -216859 -216877 -216899 -216901 -216911 -216917 -216919 -216947 -216967 -216973 -216991 -217001 -217003 -217027 -217033 -217057 -217069 -217081 -217111 -217117 -217121 -217157 -217163 -217169 -217199 -217201 -217207 -217219 -217223 -217229 -217241 -217253 -217271 -217307 -217309 -217313 -217319 -217333 -217337 -217339 -217351 -217361 -217363 -217367 -217369 -217387 -217397 -217409 -217411 -217421 -217429 -217439 -217457 -217463 -217489 -217499 -217517 -217519 -217559 -217561 -217573 -217577 -217579 -217619 -217643 -217661 -217667 -217681 -217687 -217691 -217697 -217717 -217727 -217733 -217739 -217747 -217771 -217781 -217793 -217823 -217829 -217849 -217859 -217901 -217907 -217909 -217933 -217937 -217969 -217979 -217981 -218003 -218021 -218047 -218069 -218077 -218081 -218083 -218087 -218107 -218111 -218117 -218131 -218137 -218143 -218149 -218171 -218191 -218213 -218227 -218233 -218249 -218279 -218287 -218357 -218363 -218371 -218381 -218389 -218401 -218417 -218419 -218423 -218437 -218447 -218453 -218459 -218461 -218479 -218509 -218513 -218521 -218527 -218531 -218549 -218551 -218579 -218591 -218599 -218611 -218623 -218627 -218629 -218641 -218651 -218657 -218677 -218681 -218711 -218717 -218719 -218723 -218737 -218749 -218761 -218783 -218797 -218809 -218819 -218833 -218839 -218843 -218849 -218857 -218873 -218887 -218923 -218941 -218947 -218963 -218969 -218971 -218987 -218989 -218993 -219001 -219017 -219019 -219031 -219041 -219053 -219059 -219071 -219083 -219091 -219097 -219103 -219119 -219133 -219143 -219169 -219187 -219217 -219223 -219251 -219277 -219281 -219293 -219301 -219311 -219313 -219353 -219361 -219371 -219377 -219389 -219407 -219409 -219433 -219437 -219451 -219463 -219467 -219491 -219503 -219517 -219523 -219529 -219533 -219547 -219577 -219587 -219599 -219607 -219613 -219619 -219629 -219647 -219649 -219677 -219679 -219683 -219689 -219707 -219721 -219727 -219731 -219749 -219757 -219761 -219763 -219767 -219787 -219797 -219799 -219809 -219823 -219829 -219839 -219847 -219851 -219871 -219881 -219889 -219911 -219917 -219931 -219937 -219941 -219943 -219953 -219959 -219971 -219977 -219979 -219983 -220009 -220013 -220019 -220021 -220057 -220063 -220123 -220141 -220147 -220151 -220163 -220169 -220177 -220189 -220217 -220243 -220279 -220291 -220301 -220307 -220327 -220333 -220351 -220357 -220361 -220369 -220373 -220391 -220399 -220403 -220411 -220421 -220447 -220469 -220471 -220511 -220513 -220529 -220537 -220543 -220553 -220559 -220573 -220579 -220589 -220613 -220663 -220667 -220673 -220681 -220687 -220699 -220709 -220721 -220747 -220757 -220771 -220783 -220789 -220793 -220807 -220811 -220841 -220859 -220861 -220873 -220877 -220879 -220889 -220897 -220901 -220903 -220907 -220919 -220931 -220933 -220939 -220973 -221021 -221047 -221059 -221069 -221071 -221077 -221083 -221087 -221093 -221101 -221159 -221171 -221173 -221197 -221201 -221203 -221209 -221219 -221227 -221233 -221239 -221251 -221261 -221281 -221303 -221311 -221317 -221327 -221393 -221399 -221401 -221411 -221413 -221447 -221453 -221461 -221471 -221477 -221489 -221497 -221509 -221537 -221539 -221549 -221567 -221581 -221587 -221603 -221621 -221623 -221653 -221657 -221659 -221671 -221677 -221707 -221713 -221717 -221719 -221723 -221729 -221737 -221747 -221773 -221797 -221807 -221813 -221827 -221831 -221849 -221873 -221891 -221909 -221941 -221951 -221953 -221957 -221987 -221989 -221999 -222007 -222011 -222023 -222029 -222041 -222043 -222059 -222067 -222073 -222107 -222109 -222113 -222127 -222137 -222149 -222151 -222161 -222163 -222193 -222197 -222199 -222247 -222269 -222289 -222293 -222311 -222317 -222323 -222329 -222337 -222347 -222349 -222361 -222367 -222379 -222389 -222403 -222419 -222437 -222461 -222493 -222499 -222511 -222527 -222533 -222553 -222557 -222587 -222601 -222613 -222619 -222643 -222647 -222659 -222679 -222707 -222713 -222731 -222773 -222779 -222787 -222791 -222793 -222799 -222823 -222839 -222841 -222857 -222863 -222877 -222883 -222913 -222919 -222931 -222941 -222947 -222953 -222967 -222977 -222979 -222991 -223007 -223009 -223019 -223037 -223049 -223051 -223061 -223063 -223087 -223099 -223103 -223129 -223133 -223151 -223207 -223211 -223217 -223219 -223229 -223241 -223243 -223247 -223253 -223259 -223273 -223277 -223283 -223291 -223303 -223313 -223319 -223331 -223337 -223339 -223361 -223367 -223381 -223403 -223423 -223429 -223439 -223441 -223463 -223469 -223481 -223493 -223507 -223529 -223543 -223547 -223549 -223577 -223589 -223621 -223633 -223637 -223667 -223679 -223681 -223697 -223711 -223747 -223753 -223757 -223759 -223781 -223823 -223829 -223831 -223837 -223841 -223843 -223849 -223903 -223919 -223921 -223939 -223963 -223969 -223999 -224011 -224027 -224033 -224041 -224047 -224057 -224069 -224071 -224101 -224113 -224129 -224131 -224149 -224153 -224171 -224177 -224197 -224201 -224209 -224221 -224233 -224239 -224251 -224261 -224267 -224291 -224299 -224303 -224309 -224317 -224327 -224351 -224359 -224363 -224401 -224423 -224429 -224443 -224449 -224461 -224467 -224473 -224491 -224501 -224513 -224527 -224563 -224569 -224579 -224591 -224603 -224611 -224617 -224629 -224633 -224669 -224677 -224683 -224699 -224711 -224717 -224729 -224737 -224743 -224759 -224771 -224797 -224813 -224831 -224863 -224869 -224881 -224891 -224897 -224909 -224911 -224921 -224929 -224947 -224951 -224969 -224977 -224993 -225023 -225037 -225061 -225067 -225077 -225079 -225089 -225109 -225119 -225133 -225143 -225149 -225157 -225161 -225163 -225167 -225217 -225221 -225223 -225227 -225241 -225257 -225263 -225287 -225289 -225299 -225307 -225341 -225343 -225347 -225349 -225353 -225371 -225373 -225383 -225427 -225431 -225457 -225461 -225479 -225493 -225499 -225503 -225509 -225523 -225527 -225529 -225569 -225581 -225583 -225601 -225611 -225613 -225619 -225629 -225637 -225671 -225683 -225689 -225697 -225721 -225733 -225749 -225751 -225767 -225769 -225779 -225781 -225809 -225821 -225829 -225839 -225859 -225871 -225889 -225919 -225931 -225941 -225943 -225949 -225961 -225977 -225983 -225989 -226001 -226007 -226013 -226027 -226063 -226087 -226099 -226103 -226123 -226129 -226133 -226141 -226169 -226183 -226189 -226199 -226201 -226217 -226231 -226241 -226267 -226283 -226307 -226313 -226337 -226357 -226367 -226379 -226381 -226397 -226409 -226427 -226433 -226451 -226453 -226463 -226483 -226487 -226511 -226531 -226547 -226549 -226553 -226571 -226601 -226609 -226621 -226631 -226637 -226643 -226649 -226657 -226663 -226669 -226691 -226697 -226741 -226753 -226769 -226777 -226783 -226789 -226799 -226813 -226817 -226819 -226823 -226843 -226871 -226901 -226903 -226907 -226913 -226937 -226943 -226991 -227011 -227027 -227053 -227081 -227089 -227093 -227111 -227113 -227131 -227147 -227153 -227159 -227167 -227177 -227189 -227191 -227207 -227219 -227231 -227233 -227251 -227257 -227267 -227281 -227299 -227303 -227363 -227371 -227377 -227387 -227393 -227399 -227407 -227419 -227431 -227453 -227459 -227467 -227471 -227473 -227489 -227497 -227501 -227519 -227531 -227533 -227537 -227561 -227567 -227569 -227581 -227593 -227597 -227603 -227609 -227611 -227627 -227629 -227651 -227653 -227663 -227671 -227693 -227699 -227707 -227719 -227729 -227743 -227789 -227797 -227827 -227849 -227869 -227873 -227893 -227947 -227951 -227977 -227989 -227993 -228013 -228023 -228049 -228061 -228077 -228097 -228103 -228113 -228127 -228131 -228139 -228181 -228197 -228199 -228203 -228211 -228223 -228233 -228251 -228257 -228281 -228299 -228301 -228307 -228311 -228331 -228337 -228341 -228353 -228359 -228383 -228409 -228419 -228421 -228427 -228443 -228451 -228457 -228461 -228469 -228479 -228509 -228511 -228517 -228521 -228523 -228539 -228559 -228577 -228581 -228587 -228593 -228601 -228611 -228617 -228619 -228637 -228647 -228677 -228707 -228713 -228731 -228733 -228737 -228751 -228757 -228773 -228793 -228797 -228799 -228829 -228841 -228847 -228853 -228859 -228869 -228881 -228883 -228887 -228901 -228911 -228913 -228923 -228929 -228953 -228959 -228961 -228983 -228989 -229003 -229027 -229037 -229081 -229093 -229123 -229127 -229133 -229139 -229153 -229157 -229171 -229181 -229189 -229199 -229213 -229217 -229223 -229237 -229247 -229249 -229253 -229261 -229267 -229283 -229309 -229321 -229343 -229351 -229373 -229393 -229399 -229403 -229409 -229423 -229433 -229459 -229469 -229487 -229499 -229507 -229519 -229529 -229547 -229549 -229553 -229561 -229583 -229589 -229591 -229601 -229613 -229627 -229631 -229637 -229639 -229681 -229693 -229699 -229703 -229711 -229717 -229727 -229739 -229751 -229753 -229759 -229763 -229769 -229771 -229777 -229781 -229799 -229813 -229819 -229837 -229841 -229847 -229849 -229897 -229903 -229937 -229939 -229949 -229961 -229963 -229979 -229981 -230003 -230017 -230047 -230059 -230063 -230077 -230081 -230089 -230101 -230107 -230117 -230123 -230137 -230143 -230149 -230189 -230203 -230213 -230221 -230227 -230233 -230239 -230257 -230273 -230281 -230291 -230303 -230309 -230311 -230327 -230339 -230341 -230353 -230357 -230369 -230383 -230387 -230389 -230393 -230431 -230449 -230453 -230467 -230471 -230479 -230501 -230507 -230539 -230551 -230561 -230563 -230567 -230597 -230611 -230647 -230653 -230663 -230683 -230693 -230719 -230729 -230743 -230761 -230767 -230771 -230773 -230779 -230807 -230819 -230827 -230833 -230849 -230861 -230863 -230873 -230891 -230929 -230933 -230939 -230941 -230959 -230969 -230977 -230999 -231001 -231017 -231019 -231031 -231041 -231053 -231067 -231079 -231107 -231109 -231131 -231169 -231197 -231223 -231241 -231269 -231271 -231277 -231289 -231293 -231299 -231317 -231323 -231331 -231347 -231349 -231359 -231367 -231379 -231409 -231419 -231431 -231433 -231443 -231461 -231463 -231479 -231481 -231493 -231503 -231529 -231533 -231547 -231551 -231559 -231563 -231571 -231589 -231599 -231607 -231611 -231613 -231631 -231643 -231661 -231677 -231701 -231709 -231719 -231779 -231799 -231809 -231821 -231823 -231827 -231839 -231841 -231859 -231871 -231877 -231893 -231901 -231919 -231923 -231943 -231947 -231961 -231967 -232003 -232007 -232013 -232049 -232051 -232073 -232079 -232081 -232091 -232103 -232109 -232117 -232129 -232153 -232171 -232187 -232189 -232207 -232217 -232259 -232303 -232307 -232333 -232357 -232363 -232367 -232381 -232391 -232409 -232411 -232417 -232433 -232439 -232451 -232457 -232459 -232487 -232499 -232513 -232523 -232549 -232567 -232571 -232591 -232597 -232607 -232621 -232633 -232643 -232663 -232669 -232681 -232699 -232709 -232711 -232741 -232751 -232753 -232777 -232801 -232811 -232819 -232823 -232847 -232853 -232861 -232871 -232877 -232891 -232901 -232907 -232919 -232937 -232961 -232963 -232987 -233021 -233069 -233071 -233083 -233113 -233117 -233141 -233143 -233159 -233161 -233173 -233183 -233201 -233221 -233231 -233239 -233251 -233267 -233279 -233293 -233297 -233323 -233327 -233329 -233341 -233347 -233353 -233357 -233371 -233407 -233417 -233419 -233423 -233437 -233477 -233489 -233509 -233549 -233551 -233557 -233591 -233599 -233609 -233617 -233621 -233641 -233663 -233669 -233683 -233687 -233689 -233693 -233713 -233743 -233747 -233759 -233777 -233837 -233851 -233861 -233879 -233881 -233911 -233917 -233921 -233923 -233939 -233941 -233969 -233983 -233993 -234007 -234029 -234043 -234067 -234083 -234089 -234103 -234121 -234131 -234139 -234149 -234161 -234167 -234181 -234187 -234191 -234193 -234197 -234203 -234211 -234217 -234239 -234259 -234271 -234281 -234287 -234293 -234317 -234319 -234323 -234331 -234341 -234343 -234361 -234383 -234431 -234457 -234461 -234463 -234467 -234473 -234499 -234511 -234527 -234529 -234539 -234541 -234547 -234571 -234587 -234589 -234599 -234613 -234629 -234653 -234659 -234673 -234683 -234713 -234721 -234727 -234733 -234743 -234749 -234769 -234781 -234791 -234799 -234803 -234809 -234811 -234833 -234847 -234851 -234863 -234869 -234893 -234907 -234917 -234931 -234947 -234959 -234961 -234967 -234977 -234979 -234989 -235003 -235007 -235009 -235013 -235043 -235051 -235057 -235069 -235091 -235099 -235111 -235117 -235159 -235171 -235177 -235181 -235199 -235211 -235231 -235241 -235243 -235273 -235289 -235307 -235309 -235337 -235349 -235369 -235397 -235439 -235441 -235447 -235483 -235489 -235493 -235513 -235519 -235523 -235537 -235541 -235553 -235559 -235577 -235591 -235601 -235607 -235621 -235661 -235663 -235673 -235679 -235699 -235723 -235747 -235751 -235783 -235787 -235789 -235793 -235811 -235813 -235849 -235871 -235877 -235889 -235891 -235901 -235919 -235927 -235951 -235967 -235979 -235997 -236017 -236021 -236053 -236063 -236069 -236077 -236087 -236107 -236111 -236129 -236143 -236153 -236167 -236207 -236209 -236219 -236231 -236261 -236287 -236293 -236297 -236323 -236329 -236333 -236339 -236377 -236381 -236387 -236399 -236407 -236429 -236449 -236461 -236471 -236477 -236479 -236503 -236507 -236519 -236527 -236549 -236563 -236573 -236609 -236627 -236641 -236653 -236659 -236681 -236699 -236701 -236707 -236713 -236723 -236729 -236737 -236749 -236771 -236773 -236779 -236783 -236807 -236813 -236867 -236869 -236879 -236881 -236891 -236893 -236897 -236909 -236917 -236947 -236981 -236983 -236993 -237011 -237019 -237043 -237053 -237067 -237071 -237073 -237089 -237091 -237137 -237143 -237151 -237157 -237161 -237163 -237173 -237179 -237203 -237217 -237233 -237257 -237271 -237277 -237283 -237287 -237301 -237313 -237319 -237331 -237343 -237361 -237373 -237379 -237401 -237409 -237467 -237487 -237509 -237547 -237563 -237571 -237581 -237607 -237619 -237631 -237673 -237683 -237689 -237691 -237701 -237707 -237733 -237737 -237749 -237763 -237767 -237781 -237791 -237821 -237851 -237857 -237859 -237877 -237883 -237901 -237911 -237929 -237959 -237967 -237971 -237973 -237977 -237997 -238001 -238009 -238019 -238031 -238037 -238039 -238079 -238081 -238093 -238099 -238103 -238109 -238141 -238151 -238157 -238159 -238163 -238171 -238181 -238201 -238207 -238213 -238223 -238229 -238237 -238247 -238261 -238267 -238291 -238307 -238313 -238321 -238331 -238339 -238361 -238363 -238369 -238373 -238397 -238417 -238423 -238439 -238451 -238463 -238471 -238477 -238481 -238499 -238519 -238529 -238531 -238547 -238573 -238591 -238627 -238639 -238649 -238657 -238673 -238681 -238691 -238703 -238709 -238723 -238727 -238729 -238747 -238759 -238781 -238789 -238801 -238829 -238837 -238841 -238853 -238859 -238877 -238879 -238883 -238897 -238919 -238921 -238939 -238943 -238949 -238967 -238991 -239017 -239023 -239027 -239053 -239069 -239081 -239087 -239119 -239137 -239147 -239167 -239171 -239179 -239201 -239231 -239233 -239237 -239243 -239251 -239263 -239273 -239287 -239297 -239329 -239333 -239347 -239357 -239383 -239387 -239389 -239417 -239423 -239429 -239431 -239441 -239461 -239489 -239509 -239521 -239527 -239531 -239539 -239543 -239557 -239567 -239579 -239587 -239597 -239611 -239623 -239633 -239641 -239671 -239689 -239699 -239711 -239713 -239731 -239737 -239753 -239779 -239783 -239803 -239807 -239831 -239843 -239849 -239851 -239857 -239873 -239879 -239893 -239929 -239933 -239947 -239957 -239963 -239977 -239999 -240007 -240011 -240017 -240041 -240043 -240047 -240049 -240059 -240073 -240089 -240101 -240109 -240113 -240131 -240139 -240151 -240169 -240173 -240197 -240203 -240209 -240257 -240259 -240263 -240271 -240283 -240287 -240319 -240341 -240347 -240349 -240353 -240371 -240379 -240421 -240433 -240437 -240473 -240479 -240491 -240503 -240509 -240517 -240551 -240571 -240587 -240589 -240599 -240607 -240623 -240631 -240641 -240659 -240677 -240701 -240707 -240719 -240727 -240733 -240739 -240743 -240763 -240769 -240797 -240811 -240829 -240841 -240853 -240859 -240869 -240881 -240883 -240893 -240899 -240913 -240943 -240953 -240959 -240967 -240997 -241013 -241027 -241037 -241049 -241051 -241061 -241067 -241069 -241079 -241093 -241117 -241127 -241141 -241169 -241177 -241183 -241207 -241229 -241249 -241253 -241259 -241261 -241271 -241291 -241303 -241313 -241321 -241327 -241333 -241337 -241343 -241361 -241363 -241391 -241393 -241421 -241429 -241441 -241453 -241463 -241469 -241489 -241511 -241513 -241517 -241537 -241543 -241559 -241561 -241567 -241589 -241597 -241601 -241603 -241639 -241643 -241651 -241663 -241667 -241679 -241687 -241691 -241711 -241727 -241739 -241771 -241781 -241783 -241793 -241807 -241811 -241817 -241823 -241847 -241861 -241867 -241873 -241877 -241883 -241903 -241907 -241919 -241921 -241931 -241939 -241951 -241963 -241973 -241979 -241981 -241993 -242009 -242057 -242059 -242069 -242083 -242093 -242101 -242119 -242129 -242147 -242161 -242171 -242173 -242197 -242201 -242227 -242243 -242257 -242261 -242273 -242279 -242309 -242329 -242357 -242371 -242377 -242393 -242399 -242413 -242419 -242441 -242447 -242449 -242453 -242467 -242479 -242483 -242491 -242509 -242519 -242521 -242533 -242551 -242591 -242603 -242617 -242621 -242629 -242633 -242639 -242647 -242659 -242677 -242681 -242689 -242713 -242729 -242731 -242747 -242773 -242779 -242789 -242797 -242807 -242813 -242819 -242863 -242867 -242873 -242887 -242911 -242923 -242927 -242971 -242989 -242999 -243011 -243031 -243073 -243077 -243091 -243101 -243109 -243119 -243121 -243137 -243149 -243157 -243161 -243167 -243197 -243203 -243209 -243227 -243233 -243239 -243259 -243263 -243301 -243311 -243343 -243367 -243391 -243401 -243403 -243421 -243431 -243433 -243437 -243461 -243469 -243473 -243479 -243487 -243517 -243521 -243527 -243533 -243539 -243553 -243577 -243583 -243587 -243589 -243613 -243623 -243631 -243643 -243647 -243671 -243673 -243701 -243703 -243707 -243709 -243769 -243781 -243787 -243799 -243809 -243829 -243839 -243851 -243857 -243863 -243871 -243889 -243911 -243917 -243931 -243953 -243973 -243989 -244003 -244009 -244021 -244033 -244043 -244087 -244091 -244109 -244121 -244129 -244141 -244147 -244157 -244159 -244177 -244199 -244217 -244219 -244243 -244247 -244253 -244261 -244291 -244297 -244301 -244303 -244313 -244333 -244339 -244351 -244357 -244367 -244379 -244381 -244393 -244399 -244403 -244411 -244423 -244429 -244451 -244457 -244463 -244471 -244481 -244493 -244507 -244529 -244547 -244553 -244561 -244567 -244583 -244589 -244597 -244603 -244619 -244633 -244637 -244639 -244667 -244669 -244687 -244691 -244703 -244711 -244721 -244733 -244747 -244753 -244759 -244781 -244787 -244813 -244837 -244841 -244843 -244859 -244861 -244873 -244877 -244889 -244897 -244901 -244939 -244943 -244957 -244997 -245023 -245029 -245033 -245039 -245071 -245083 -245087 -245107 -245129 -245131 -245149 -245171 -245173 -245177 -245183 -245209 -245251 -245257 -245261 -245269 -245279 -245291 -245299 -245317 -245321 -245339 -245383 -245389 -245407 -245411 -245417 -245419 -245437 -245471 -245473 -245477 -245501 -245513 -245519 -245521 -245527 -245533 -245561 -245563 -245587 -245591 -245593 -245621 -245627 -245629 -245639 -245653 -245671 -245681 -245683 -245711 -245719 -245723 -245741 -245747 -245753 -245759 -245771 -245783 -245789 -245821 -245849 -245851 -245863 -245881 -245897 -245899 -245909 -245911 -245941 -245963 -245977 -245981 -245983 -245989 -246011 -246017 -246049 -246073 -246097 -246119 -246121 -246131 -246133 -246151 -246167 -246173 -246187 -246193 -246203 -246209 -246217 -246223 -246241 -246247 -246251 -246271 -246277 -246289 -246317 -246319 -246329 -246343 -246349 -246361 -246371 -246391 -246403 -246439 -246469 -246473 -246497 -246509 -246511 -246523 -246527 -246539 -246557 -246569 -246577 -246599 -246607 -246611 -246613 -246637 -246641 -246643 -246661 -246683 -246689 -246707 -246709 -246713 -246731 -246739 -246769 -246773 -246781 -246787 -246793 -246803 -246809 -246811 -246817 -246833 -246839 -246889 -246899 -246907 -246913 -246919 -246923 -246929 -246931 -246937 -246941 -246947 -246971 -246979 -247001 -247007 -247031 -247067 -247069 -247073 -247087 -247099 -247141 -247183 -247193 -247201 -247223 -247229 -247241 -247249 -247259 -247279 -247301 -247309 -247337 -247339 -247343 -247363 -247369 -247381 -247391 -247393 -247409 -247421 -247433 -247439 -247451 -247463 -247501 -247519 -247529 -247531 -247547 -247553 -247579 -247591 -247601 -247603 -247607 -247609 -247613 -247633 -247649 -247651 -247691 -247693 -247697 -247711 -247717 -247729 -247739 -247759 -247769 -247771 -247781 -247799 -247811 -247813 -247829 -247847 -247853 -247873 -247879 -247889 -247901 -247913 -247939 -247943 -247957 -247991 -247993 -247997 -247999 -248021 -248033 -248041 -248051 -248057 -248063 -248071 -248077 -248089 -248099 -248117 -248119 -248137 -248141 -248161 -248167 -248177 -248179 -248189 -248201 -248203 -248231 -248243 -248257 -248267 -248291 -248293 -248299 -248309 -248317 -248323 -248351 -248357 -248371 -248389 -248401 -248407 -248431 -248441 -248447 -248461 -248473 -248477 -248483 -248509 -248533 -248537 -248543 -248569 -248579 -248587 -248593 -248597 -248609 -248621 -248627 -248639 -248641 -248657 -248683 -248701 -248707 -248719 -248723 -248737 -248749 -248753 -248779 -248783 -248789 -248797 -248813 -248821 -248827 -248839 -248851 -248861 -248867 -248869 -248879 -248887 -248891 -248893 -248903 -248909 -248971 -248981 -248987 -249017 -249037 -249059 -249079 -249089 -249097 -249103 -249107 -249127 -249131 -249133 -249143 -249181 -249187 -249199 -249211 -249217 -249229 -249233 -249253 -249257 -249287 -249311 -249317 -249329 -249341 -249367 -249377 -249383 -249397 -249419 -249421 -249427 -249433 -249437 -249439 -249449 -249463 -249497 -249499 -249503 -249517 -249521 -249533 -249539 -249541 -249563 -249583 -249589 -249593 -249607 -249647 -249659 -249671 -249677 -249703 -249721 -249727 -249737 -249749 -249763 -249779 -249797 -249811 -249827 -249833 -249853 -249857 -249859 -249863 -249871 -249881 -249911 -249923 -249943 -249947 -249967 -249971 -249973 -249989 -250007 -250013 -250027 -250031 -250037 -250043 -250049 -250051 -250057 -250073 -250091 -250109 -250123 -250147 -250153 -250169 -250199 -250253 -250259 -250267 -250279 -250301 -250307 -250343 -250361 -250403 -250409 -250423 -250433 -250441 -250451 -250489 -250499 -250501 -250543 -250583 -250619 -250643 -250673 -250681 -250687 -250693 -250703 -250709 -250721 -250727 -250739 -250741 -250751 -250753 -250777 -250787 -250793 -250799 -250807 -250813 -250829 -250837 -250841 -250853 -250867 -250871 -250889 -250919 -250949 -250951 -250963 -250967 -250969 -250979 -250993 -251003 -251033 -251051 -251057 -251059 -251063 -251071 -251081 -251087 -251099 -251117 -251143 -251149 -251159 -251171 -251177 -251179 -251191 -251197 -251201 -251203 -251219 -251221 -251231 -251233 -251257 -251261 -251263 -251287 -251291 -251297 -251323 -251347 -251353 -251359 -251387 -251393 -251417 -251429 -251431 -251437 -251443 -251467 -251473 -251477 -251483 -251491 -251501 -251513 -251519 -251527 -251533 -251539 -251543 -251561 -251567 -251609 -251611 -251621 -251623 -251639 -251653 -251663 -251677 -251701 -251707 -251737 -251761 -251789 -251791 -251809 -251831 -251833 -251843 -251857 -251861 -251879 -251887 -251893 -251897 -251903 -251917 -251939 -251941 -251947 -251969 -251971 -251983 -252001 -252013 -252017 -252029 -252037 -252079 -252101 -252139 -252143 -252151 -252157 -252163 -252169 -252173 -252181 -252193 -252209 -252223 -252233 -252253 -252277 -252283 -252289 -252293 -252313 -252319 -252323 -252341 -252359 -252383 -252391 -252401 -252409 -252419 -252431 -252443 -252449 -252457 -252463 -252481 -252509 -252533 -252541 -252559 -252583 -252589 -252607 -252611 -252617 -252641 -252667 -252691 -252709 -252713 -252727 -252731 -252737 -252761 -252767 -252779 -252817 -252823 -252827 -252829 -252869 -252877 -252881 -252887 -252893 -252899 -252911 -252913 -252919 -252937 -252949 -252971 -252979 -252983 -253003 -253013 -253049 -253063 -253081 -253103 -253109 -253133 -253153 -253157 -253159 -253229 -253243 -253247 -253273 -253307 -253321 -253343 -253349 -253361 -253367 -253369 -253381 -253387 -253417 -253423 -253427 -253433 -253439 -253447 -253469 -253481 -253493 -253501 -253507 -253531 -253537 -253543 -253553 -253567 -253573 -253601 -253607 -253609 -253613 -253633 -253637 -253639 -253651 -253661 -253679 -253681 -253703 -253717 -253733 -253741 -253751 -253763 -253769 -253777 -253787 -253789 -253801 -253811 -253819 -253823 -253853 -253867 -253871 -253879 -253901 -253907 -253909 -253919 -253937 -253949 -253951 -253969 -253987 -253993 -253999 -254003 -254021 -254027 -254039 -254041 -254047 -254053 -254071 -254083 -254119 -254141 -254147 -254161 -254179 -254197 -254207 -254209 -254213 -254249 -254257 -254279 -254281 -254291 -254299 -254329 -254369 -254377 -254383 -254389 -254407 -254413 -254437 -254447 -254461 -254489 -254491 -254519 -254537 -254557 -254593 -254623 -254627 -254647 -254659 -254663 -254699 -254713 -254729 -254731 -254741 -254747 -254753 -254773 -254777 -254783 -254791 -254803 -254827 -254831 -254833 -254857 -254869 -254873 -254879 -254887 -254899 -254911 -254927 -254929 -254941 -254959 -254963 -254971 -254977 -254987 -254993 -255007 -255019 -255023 -255043 -255049 -255053 -255071 -255077 -255083 -255097 -255107 -255121 -255127 -255133 -255137 -255149 -255173 -255179 -255181 -255191 -255193 -255197 -255209 -255217 -255239 -255247 -255251 -255253 -255259 -255313 -255329 -255349 -255361 -255371 -255383 -255413 -255419 -255443 -255457 -255467 -255469 -255473 -255487 -255499 -255503 -255511 -255517 -255523 -255551 -255571 -255587 -255589 -255613 -255617 -255637 -255641 -255649 -255653 -255659 -255667 -255679 -255709 -255713 -255733 -255743 -255757 -255763 -255767 -255803 -255839 -255841 -255847 -255851 -255859 -255869 -255877 -255887 -255907 -255917 -255919 -255923 -255947 -255961 -255971 -255973 -255977 -255989 -256019 -256021 -256031 -256033 -256049 -256057 -256079 -256093 -256117 -256121 -256129 -256133 -256147 -256163 -256169 -256181 -256187 -256189 -256199 -256211 -256219 -256279 -256301 -256307 -256313 -256337 -256349 -256363 -256369 -256391 -256393 -256423 -256441 -256469 -256471 -256483 -256489 -256493 -256499 -256517 -256541 -256561 -256567 -256577 -256579 -256589 -256603 -256609 -256639 -256643 -256651 -256661 -256687 -256699 -256721 -256723 -256757 -256771 -256799 -256801 -256813 -256831 -256873 -256877 -256889 -256901 -256903 -256931 -256939 -256957 -256967 -256981 -257003 -257017 -257053 -257069 -257077 -257093 -257099 -257107 -257123 -257141 -257161 -257171 -257177 -257189 -257219 -257221 -257239 -257249 -257263 -257273 -257281 -257287 -257293 -257297 -257311 -257321 -257339 -257351 -257353 -257371 -257381 -257399 -257401 -257407 -257437 -257443 -257447 -257459 -257473 -257489 -257497 -257501 -257503 -257519 -257539 -257561 -257591 -257611 -257627 -257639 -257657 -257671 -257687 -257689 -257707 -257711 -257713 -257717 -257731 -257783 -257791 -257797 -257837 -257857 -257861 -257863 -257867 -257869 -257879 -257893 -257903 -257921 -257947 -257953 -257981 -257987 -257989 -257993 -258019 -258023 -258031 -258061 -258067 -258101 -258107 -258109 -258113 -258119 -258127 -258131 -258143 -258157 -258161 -258173 -258197 -258211 -258233 -258241 -258253 -258277 -258283 -258299 -258317 -258319 -258329 -258331 -258337 -258353 -258373 -258389 -258403 -258407 -258413 -258421 -258437 -258443 -258449 -258469 -258487 -258491 -258499 -258521 -258527 -258539 -258551 -258563 -258569 -258581 -258607 -258611 -258613 -258617 -258623 -258631 -258637 -258659 -258673 -258677 -258691 -258697 -258703 -258707 -258721 -258733 -258737 -258743 -258763 -258779 -258787 -258803 -258809 -258827 -258847 -258871 -258887 -258917 -258919 -258949 -258959 -258967 -258971 -258977 -258983 -258991 -259001 -259009 -259019 -259033 -259099 -259121 -259123 -259151 -259157 -259159 -259163 -259169 -259177 -259183 -259201 -259211 -259213 -259219 -259229 -259271 -259277 -259309 -259321 -259339 -259379 -259381 -259387 -259397 -259411 -259421 -259429 -259451 -259453 -259459 -259499 -259507 -259517 -259531 -259537 -259547 -259577 -259583 -259603 -259619 -259621 -259627 -259631 -259639 -259643 -259657 -259667 -259681 -259691 -259697 -259717 -259723 -259733 -259751 -259771 -259781 -259783 -259801 -259813 -259823 -259829 -259837 -259841 -259867 -259907 -259933 -259937 -259943 -259949 -259967 -259991 -259993 -260003 -260009 -260011 -260017 -260023 -260047 -260081 -260089 -260111 -260137 -260171 -260179 -260189 -260191 -260201 -260207 -260209 -260213 -260231 -260263 -260269 -260317 -260329 -260339 -260363 -260387 -260399 -260411 -260413 -260417 -260419 -260441 -260453 -260461 -260467 -260483 -260489 -260527 -260539 -260543 -260549 -260551 -260569 -260573 -260581 -260587 -260609 -260629 -260647 -260651 -260671 -260677 -260713 -260717 -260723 -260747 -260753 -260761 -260773 -260791 -260807 -260809 -260849 -260857 -260861 -260863 -260873 -260879 -260893 -260921 -260941 -260951 -260959 -260969 -260983 -260987 -260999 -261011 -261013 -261017 -261031 -261043 -261059 -261061 -261071 -261077 -261089 -261101 -261127 -261167 -261169 -261223 -261229 -261241 -261251 -261271 -261281 -261301 -261323 -261329 -261337 -261347 -261353 -261379 -261389 -261407 -261427 -261431 -261433 -261439 -261451 -261463 -261467 -261509 -261523 -261529 -261557 -261563 -261577 -261581 -261587 -261593 -261601 -261619 -261631 -261637 -261641 -261643 -261673 -261697 -261707 -261713 -261721 -261739 -261757 -261761 -261773 -261787 -261791 -261799 -261823 -261847 -261881 -261887 -261917 -261959 -261971 -261973 -261977 -261983 -262007 -262027 -262049 -262051 -262069 -262079 -262103 -262109 -262111 -262121 -262127 -262133 -262139 -262147 -262151 -262153 -262187 -262193 -262217 -262231 -262237 -262253 -262261 -262271 -262303 -262313 -262321 -262331 -262337 -262349 -262351 -262369 -262387 -262391 -262399 -262411 -262433 -262459 -262469 -262489 -262501 -262511 -262513 -262519 -262541 -262543 -262553 -262567 -262583 -262597 -262621 -262627 -262643 -262649 -262651 -262657 -262681 -262693 -262697 -262709 -262723 -262733 -262739 -262741 -262747 -262781 -262783 -262807 -262819 -262853 -262877 -262883 -262897 -262901 -262909 -262937 -262949 -262957 -262981 -263009 -263023 -263047 -263063 -263071 -263077 -263083 -263089 -263101 -263111 -263119 -263129 -263167 -263171 -263183 -263191 -263201 -263209 -263213 -263227 -263239 -263257 -263267 -263269 -263273 -263287 -263293 -263303 -263323 -263369 -263383 -263387 -263399 -263401 -263411 -263423 -263429 -263437 -263443 -263489 -263491 -263503 -263513 -263519 -263521 -263533 -263537 -263561 -263567 -263573 -263591 -263597 -263609 -263611 -263621 -263647 -263651 -263657 -263677 -263723 -263729 -263737 -263759 -263761 -263803 -263819 -263821 -263827 -263843 -263849 -263863 -263867 -263869 -263881 -263899 -263909 -263911 -263927 -263933 -263941 -263951 -263953 -263957 -263983 -264007 -264013 -264029 -264031 -264053 -264059 -264071 -264083 -264091 -264101 -264113 -264127 -264133 -264137 -264139 -264167 -264169 -264179 -264211 -264221 -264263 -264269 -264283 -264289 -264301 -264323 -264331 -264343 -264349 -264353 -264359 -264371 -264391 -264403 -264437 -264443 -264463 -264487 -264527 -264529 -264553 -264559 -264577 -264581 -264599 -264601 -264619 -264631 -264637 -264643 -264659 -264697 -264731 -264739 -264743 -264749 -264757 -264763 -264769 -264779 -264787 -264791 -264793 -264811 -264827 -264829 -264839 -264871 -264881 -264889 -264893 -264899 -264919 -264931 -264949 -264959 -264961 -264977 -264991 -264997 -265003 -265007 -265021 -265037 -265079 -265091 -265093 -265117 -265123 -265129 -265141 -265151 -265157 -265163 -265169 -265193 -265207 -265231 -265241 -265247 -265249 -265261 -265271 -265273 -265277 -265313 -265333 -265337 -265339 -265381 -265399 -265403 -265417 -265423 -265427 -265451 -265459 -265471 -265483 -265493 -265511 -265513 -265541 -265543 -265547 -265561 -265567 -265571 -265579 -265607 -265613 -265619 -265621 -265703 -265709 -265711 -265717 -265729 -265739 -265747 -265757 -265781 -265787 -265807 -265813 -265819 -265831 -265841 -265847 -265861 -265871 -265873 -265883 -265891 -265921 -265957 -265961 -265987 -266003 -266009 -266023 -266027 -266029 -266047 -266051 -266053 -266059 -266081 -266083 -266089 -266093 -266099 -266111 -266117 -266129 -266137 -266153 -266159 -266177 -266183 -266221 -266239 -266261 -266269 -266281 -266291 -266293 -266297 -266333 -266351 -266353 -266359 -266369 -266381 -266401 -266411 -266417 -266447 -266449 -266477 -266479 -266489 -266491 -266521 -266549 -266587 -266599 -266603 -266633 -266641 -266647 -266663 -266671 -266677 -266681 -266683 -266687 -266689 -266701 -266711 -266719 -266759 -266767 -266797 -266801 -266821 -266837 -266839 -266863 -266867 -266891 -266897 -266899 -266909 -266921 -266927 -266933 -266947 -266953 -266957 -266971 -266977 -266983 -266993 -266999 -267017 -267037 -267049 -267097 -267131 -267133 -267139 -267143 -267167 -267187 -267193 -267199 -267203 -267217 -267227 -267229 -267233 -267259 -267271 -267277 -267299 -267301 -267307 -267317 -267341 -267353 -267373 -267389 -267391 -267401 -267403 -267413 -267419 -267431 -267433 -267439 -267451 -267469 -267479 -267481 -267493 -267497 -267511 -267517 -267521 -267523 -267541 -267551 -267557 -267569 -267581 -267587 -267593 -267601 -267611 -267613 -267629 -267637 -267643 -267647 -267649 -267661 -267667 -267671 -267677 -267679 -267713 -267719 -267721 -267727 -267737 -267739 -267749 -267763 -267781 -267791 -267797 -267803 -267811 -267829 -267833 -267857 -267863 -267877 -267887 -267893 -267899 -267901 -267907 -267913 -267929 -267941 -267959 -267961 -268003 -268013 -268043 -268049 -268063 -268069 -268091 -268123 -268133 -268153 -268171 -268189 -268199 -268207 -268211 -268237 -268253 -268267 -268271 -268283 -268291 -268297 -268343 -268403 -268439 -268459 -268487 -268493 -268501 -268507 -268517 -268519 -268529 -268531 -268537 -268547 -268573 -268607 -268613 -268637 -268643 -268661 -268693 -268721 -268729 -268733 -268747 -268757 -268759 -268771 -268777 -268781 -268783 -268789 -268811 -268813 -268817 -268819 -268823 -268841 -268843 -268861 -268883 -268897 -268909 -268913 -268921 -268927 -268937 -268969 -268973 -268979 -268993 -268997 -268999 -269023 -269029 -269039 -269041 -269057 -269063 -269069 -269089 -269117 -269131 -269141 -269167 -269177 -269179 -269183 -269189 -269201 -269209 -269219 -269221 -269231 -269237 -269251 -269257 -269281 -269317 -269327 -269333 -269341 -269351 -269377 -269383 -269387 -269389 -269393 -269413 -269419 -269429 -269431 -269441 -269461 -269473 -269513 -269519 -269527 -269539 -269543 -269561 -269573 -269579 -269597 -269617 -269623 -269641 -269651 -269663 -269683 -269701 -269713 -269719 -269723 -269741 -269749 -269761 -269779 -269783 -269791 -269851 -269879 -269887 -269891 -269897 -269923 -269939 -269947 -269953 -269981 -269987 -270001 -270029 -270031 -270037 -270059 -270071 -270073 -270097 -270121 -270131 -270133 -270143 -270157 -270163 -270167 -270191 -270209 -270217 -270223 -270229 -270239 -270241 -270269 -270271 -270287 -270299 -270307 -270311 -270323 -270329 -270337 -270343 -270371 -270379 -270407 -270421 -270437 -270443 -270451 -270461 -270463 -270493 -270509 -270527 -270539 -270547 -270551 -270553 -270563 -270577 -270583 -270587 -270593 -270601 -270619 -270631 -270653 -270659 -270667 -270679 -270689 -270701 -270709 -270719 -270737 -270749 -270761 -270763 -270791 -270797 -270799 -270821 -270833 -270841 -270859 -270899 -270913 -270923 -270931 -270937 -270953 -270961 -270967 -270973 -271003 -271013 -271021 -271027 -271043 -271057 -271067 -271079 -271097 -271109 -271127 -271129 -271163 -271169 -271177 -271181 -271211 -271217 -271231 -271241 -271253 -271261 -271273 -271277 -271279 -271289 -271333 -271351 -271357 -271363 -271367 -271393 -271409 -271429 -271451 -271463 -271471 -271483 -271489 -271499 -271501 -271517 -271549 -271553 -271571 -271573 -271597 -271603 -271619 -271637 -271639 -271651 -271657 -271693 -271703 -271723 -271729 -271753 -271769 -271771 -271787 -271807 -271811 -271829 -271841 -271849 -271853 -271861 -271867 -271879 -271897 -271903 -271919 -271927 -271939 -271967 -271969 -271981 -272003 -272009 -272011 -272029 -272039 -272053 -272059 -272093 -272131 -272141 -272171 -272179 -272183 -272189 -272191 -272201 -272203 -272227 -272231 -272249 -272257 -272263 -272267 -272269 -272287 -272299 -272317 -272329 -272333 -272341 -272347 -272351 -272353 -272359 -272369 -272381 -272383 -272399 -272407 -272411 -272417 -272423 -272449 -272453 -272477 -272507 -272533 -272537 -272539 -272549 -272563 -272567 -272581 -272603 -272621 -272651 -272659 -272683 -272693 -272717 -272719 -272737 -272759 -272761 -272771 -272777 -272807 -272809 -272813 -272863 -272879 -272887 -272903 -272911 -272917 -272927 -272933 -272959 -272971 -272981 -272983 -272989 -272999 -273001 -273029 -273043 -273047 -273059 -273061 -273067 -273073 -273083 -273107 -273113 -273127 -273131 -273149 -273157 -273181 -273187 -273193 -273233 -273253 -273269 -273271 -273281 -273283 -273289 -273311 -273313 -273323 -273349 -273359 -273367 -273433 -273457 -273473 -273503 -273517 -273521 -273527 -273551 -273569 -273601 -273613 -273617 -273629 -273641 -273643 -273653 -273697 -273709 -273719 -273727 -273739 -273773 -273787 -273797 -273803 -273821 -273827 -273857 -273881 -273899 -273901 -273913 -273919 -273929 -273941 -273943 -273967 -273971 -273979 -273997 -274007 -274019 -274033 -274061 -274069 -274081 -274093 -274103 -274117 -274121 -274123 -274139 -274147 -274163 -274171 -274177 -274187 -274199 -274201 -274213 -274223 -274237 -274243 -274259 -274271 -274277 -274283 -274301 -274333 -274349 -274357 -274361 -274403 -274423 -274441 -274451 -274453 -274457 -274471 -274489 -274517 -274529 -274579 -274583 -274591 -274609 -274627 -274661 -274667 -274679 -274693 -274697 -274709 -274711 -274723 -274739 -274751 -274777 -274783 -274787 -274811 -274817 -274829 -274831 -274837 -274843 -274847 -274853 -274861 -274867 -274871 -274889 -274909 -274931 -274943 -274951 -274957 -274961 -274973 -274993 -275003 -275027 -275039 -275047 -275053 -275059 -275083 -275087 -275129 -275131 -275147 -275153 -275159 -275161 -275167 -275183 -275201 -275207 -275227 -275251 -275263 -275269 -275299 -275309 -275321 -275323 -275339 -275357 -275371 -275389 -275393 -275399 -275419 -275423 -275447 -275449 -275453 -275459 -275461 -275489 -275491 -275503 -275521 -275531 -275543 -275549 -275573 -275579 -275581 -275591 -275593 -275599 -275623 -275641 -275651 -275657 -275669 -275677 -275699 -275711 -275719 -275729 -275741 -275767 -275773 -275783 -275813 -275827 -275837 -275881 -275897 -275911 -275917 -275921 -275923 -275929 -275939 -275941 -275963 -275969 -275981 -275987 -275999 -276007 -276011 -276019 -276037 -276041 -276043 -276047 -276049 -276079 -276083 -276091 -276113 -276137 -276151 -276173 -276181 -276187 -276191 -276209 -276229 -276239 -276247 -276251 -276257 -276277 -276293 -276319 -276323 -276337 -276343 -276347 -276359 -276371 -276373 -276389 -276401 -276439 -276443 -276449 -276461 -276467 -276487 -276499 -276503 -276517 -276527 -276553 -276557 -276581 -276587 -276589 -276593 -276599 -276623 -276629 -276637 -276671 -276673 -276707 -276721 -276739 -276763 -276767 -276779 -276781 -276817 -276821 -276823 -276827 -276833 -276839 -276847 -276869 -276883 -276901 -276907 -276917 -276919 -276929 -276949 -276953 -276961 -276977 -277003 -277007 -277021 -277051 -277063 -277073 -277087 -277097 -277099 -277157 -277163 -277169 -277177 -277183 -277213 -277217 -277223 -277231 -277247 -277259 -277261 -277273 -277279 -277297 -277301 -277309 -277331 -277363 -277373 -277411 -277421 -277427 -277429 -277483 -277493 -277499 -277513 -277531 -277547 -277549 -277567 -277577 -277579 -277597 -277601 -277603 -277637 -277639 -277643 -277657 -277663 -277687 -277691 -277703 -277741 -277747 -277751 -277757 -277787 -277789 -277793 -277813 -277829 -277847 -277859 -277883 -277889 -277891 -277897 -277903 -277919 -277961 -277993 -277999 -278017 -278029 -278041 -278051 -278063 -278071 -278087 -278111 -278119 -278123 -278143 -278147 -278149 -278177 -278191 -278207 -278209 -278219 -278227 -278233 -278237 -278261 -278269 -278279 -278321 -278329 -278347 -278353 -278363 -278387 -278393 -278413 -278437 -278459 -278479 -278489 -278491 -278497 -278501 -278503 -278543 -278549 -278557 -278561 -278563 -278581 -278591 -278609 -278611 -278617 -278623 -278627 -278639 -278651 -278671 -278687 -278689 -278701 -278717 -278741 -278743 -278753 -278767 -278801 -278807 -278809 -278813 -278819 -278827 -278843 -278849 -278867 -278879 -278881 -278891 -278903 -278909 -278911 -278917 -278947 -278981 -279001 -279007 -279023 -279029 -279047 -279073 -279109 -279119 -279121 -279127 -279131 -279137 -279143 -279173 -279179 -279187 -279203 -279211 -279221 -279269 -279311 -279317 -279329 -279337 -279353 -279397 -279407 -279413 -279421 -279431 -279443 -279451 -279479 -279481 -279511 -279523 -279541 -279551 -279553 -279557 -279571 -279577 -279583 -279593 -279607 -279613 -279619 -279637 -279641 -279649 -279659 -279679 -279689 -279707 -279709 -279731 -279751 -279761 -279767 -279779 -279817 -279823 -279847 -279857 -279863 -279883 -279913 -279919 -279941 -279949 -279967 -279977 -279991 -280001 -280009 -280013 -280031 -280037 -280061 -280069 -280097 -280099 -280103 -280121 -280129 -280139 -280183 -280187 -280199 -280207 -280219 -280223 -280229 -280243 -280249 -280253 -280277 -280297 -280303 -280321 -280327 -280337 -280339 -280351 -280373 -280409 -280411 -280451 -280463 -280487 -280499 -280507 -280513 -280537 -280541 -280547 -280549 -280561 -280583 -280589 -280591 -280597 -280603 -280607 -280613 -280627 -280639 -280673 -280681 -280697 -280699 -280703 -280711 -280717 -280729 -280751 -280759 -280769 -280771 -280811 -280817 -280837 -280843 -280859 -280871 -280879 -280883 -280897 -280909 -280913 -280921 -280927 -280933 -280939 -280949 -280957 -280963 -280967 -280979 -280997 -281023 -281033 -281053 -281063 -281069 -281081 -281117 -281131 -281153 -281159 -281167 -281189 -281191 -281207 -281227 -281233 -281243 -281249 -281251 -281273 -281279 -281291 -281297 -281317 -281321 -281327 -281339 -281353 -281357 -281363 -281381 -281419 -281423 -281429 -281431 -281509 -281527 -281531 -281539 -281549 -281551 -281557 -281563 -281579 -281581 -281609 -281621 -281623 -281627 -281641 -281647 -281651 -281653 -281663 -281669 -281683 -281717 -281719 -281737 -281747 -281761 -281767 -281777 -281783 -281791 -281797 -281803 -281807 -281833 -281837 -281839 -281849 -281857 -281867 -281887 -281893 -281921 -281923 -281927 -281933 -281947 -281959 -281971 -281989 -281993 -282001 -282011 -282019 -282053 -282059 -282071 -282089 -282091 -282097 -282101 -282103 -282127 -282143 -282157 -282167 -282221 -282229 -282239 -282241 -282253 -282281 -282287 -282299 -282307 -282311 -282313 -282349 -282377 -282383 -282389 -282391 -282407 -282409 -282413 -282427 -282439 -282461 -282481 -282487 -282493 -282559 -282563 -282571 -282577 -282589 -282599 -282617 -282661 -282671 -282677 -282679 -282683 -282691 -282697 -282703 -282707 -282713 -282767 -282769 -282773 -282797 -282809 -282827 -282833 -282847 -282851 -282869 -282881 -282889 -282907 -282911 -282913 -282917 -282959 -282973 -282977 -282991 -283001 -283007 -283009 -283027 -283051 -283079 -283093 -283097 -283099 -283111 -283117 -283121 -283133 -283139 -283159 -283163 -283181 -283183 -283193 -283207 -283211 -283267 -283277 -283289 -283303 -283369 -283397 -283403 -283411 -283447 -283463 -283487 -283489 -283501 -283511 -283519 -283541 -283553 -283571 -283573 -283579 -283583 -283601 -283607 -283609 -283631 -283637 -283639 -283669 -283687 -283697 -283721 -283741 -283763 -283769 -283771 -283793 -283799 -283807 -283813 -283817 -283831 -283837 -283859 -283861 -283873 -283909 -283937 -283949 -283957 -283961 -283979 -284003 -284023 -284041 -284051 -284057 -284059 -284083 -284093 -284111 -284117 -284129 -284131 -284149 -284153 -284159 -284161 -284173 -284191 -284201 -284227 -284231 -284233 -284237 -284243 -284261 -284267 -284269 -284293 -284311 -284341 -284357 -284369 -284377 -284387 -284407 -284413 -284423 -284429 -284447 -284467 -284477 -284483 -284489 -284507 -284509 -284521 -284527 -284539 -284551 -284561 -284573 -284587 -284591 -284593 -284623 -284633 -284651 -284657 -284659 -284681 -284689 -284701 -284707 -284723 -284729 -284731 -284737 -284741 -284743 -284747 -284749 -284759 -284777 -284783 -284803 -284807 -284813 -284819 -284831 -284833 -284839 -284857 -284881 -284897 -284899 -284917 -284927 -284957 -284969 -284989 -285007 -285023 -285031 -285049 -285071 -285079 -285091 -285101 -285113 -285119 -285121 -285139 -285151 -285161 -285179 -285191 -285199 -285221 -285227 -285251 -285281 -285283 -285287 -285289 -285301 -285317 -285343 -285377 -285421 -285433 -285451 -285457 -285463 -285469 -285473 -285497 -285517 -285521 -285533 -285539 -285553 -285557 -285559 -285569 -285599 -285611 -285613 -285629 -285631 -285641 -285643 -285661 -285667 -285673 -285697 -285707 -285709 -285721 -285731 -285749 -285757 -285763 -285767 -285773 -285781 -285823 -285827 -285839 -285841 -285871 -285937 -285949 -285953 -285977 -285979 -285983 -285997 -286001 -286009 -286019 -286043 -286049 -286061 -286063 -286073 -286103 -286129 -286163 -286171 -286199 -286243 -286249 -286289 -286301 -286333 -286367 -286369 -286381 -286393 -286397 -286411 -286421 -286427 -286453 -286457 -286459 -286469 -286477 -286483 -286487 -286493 -286499 -286513 -286519 -286541 -286543 -286547 -286553 -286589 -286591 -286609 -286613 -286619 -286633 -286651 -286673 -286687 -286697 -286703 -286711 -286721 -286733 -286751 -286753 -286763 -286771 -286777 -286789 -286801 -286813 -286831 -286859 -286873 -286927 -286973 -286981 -286987 -286999 -287003 -287047 -287057 -287059 -287087 -287093 -287099 -287107 -287117 -287137 -287141 -287149 -287159 -287167 -287173 -287179 -287191 -287219 -287233 -287237 -287239 -287251 -287257 -287269 -287279 -287281 -287291 -287297 -287321 -287327 -287333 -287341 -287347 -287383 -287387 -287393 -287437 -287449 -287491 -287501 -287503 -287537 -287549 -287557 -287579 -287597 -287611 -287629 -287669 -287671 -287681 -287689 -287701 -287731 -287747 -287783 -287789 -287801 -287813 -287821 -287849 -287851 -287857 -287863 -287867 -287873 -287887 -287921 -287933 -287939 -287977 -288007 -288023 -288049 -288053 -288061 -288077 -288089 -288109 -288137 -288179 -288181 -288191 -288199 -288203 -288209 -288227 -288241 -288247 -288257 -288283 -288293 -288307 -288313 -288317 -288349 -288359 -288361 -288383 -288389 -288403 -288413 -288427 -288433 -288461 -288467 -288481 -288493 -288499 -288527 -288529 -288539 -288551 -288559 -288571 -288577 -288583 -288647 -288649 -288653 -288661 -288679 -288683 -288689 -288697 -288731 -288733 -288751 -288767 -288773 -288803 -288817 -288823 -288833 -288839 -288851 -288853 -288877 -288907 -288913 -288929 -288931 -288947 -288973 -288979 -288989 -288991 -288997 -289001 -289019 -289021 -289031 -289033 -289039 -289049 -289063 -289067 -289099 -289103 -289109 -289111 -289127 -289129 -289139 -289141 -289151 -289169 -289171 -289181 -289189 -289193 -289213 -289241 -289243 -289249 -289253 -289273 -289283 -289291 -289297 -289309 -289319 -289343 -289349 -289361 -289369 -289381 -289397 -289417 -289423 -289439 -289453 -289463 -289469 -289477 -289489 -289511 -289543 -289559 -289573 -289577 -289589 -289603 -289607 -289637 -289643 -289657 -289669 -289717 -289721 -289727 -289733 -289741 -289759 -289763 -289771 -289789 -289837 -289841 -289843 -289847 -289853 -289859 -289871 -289889 -289897 -289937 -289951 -289957 -289967 -289973 -289987 -289999 -290011 -290021 -290023 -290027 -290033 -290039 -290041 -290047 -290057 -290083 -290107 -290113 -290119 -290137 -290141 -290161 -290183 -290189 -290201 -290209 -290219 -290233 -290243 -290249 -290317 -290327 -290347 -290351 -290359 -290369 -290383 -290393 -290399 -290419 -290429 -290441 -290443 -290447 -290471 -290473 -290489 -290497 -290509 -290527 -290531 -290533 -290539 -290557 -290593 -290597 -290611 -290617 -290621 -290623 -290627 -290657 -290659 -290663 -290669 -290671 -290677 -290701 -290707 -290711 -290737 -290761 -290767 -290791 -290803 -290821 -290827 -290837 -290839 -290861 -290869 -290879 -290897 -290923 -290959 -290963 -290971 -290987 -290993 -290999 -291007 -291013 -291037 -291041 -291043 -291077 -291089 -291101 -291103 -291107 -291113 -291143 -291167 -291169 -291173 -291191 -291199 -291209 -291217 -291253 -291257 -291271 -291287 -291293 -291299 -291331 -291337 -291349 -291359 -291367 -291371 -291373 -291377 -291419 -291437 -291439 -291443 -291457 -291481 -291491 -291503 -291509 -291521 -291539 -291547 -291559 -291563 -291569 -291619 -291647 -291649 -291661 -291677 -291689 -291691 -291701 -291721 -291727 -291743 -291751 -291779 -291791 -291817 -291829 -291833 -291853 -291857 -291869 -291877 -291887 -291899 -291901 -291923 -291971 -291979 -291983 -291997 -292021 -292027 -292037 -292057 -292069 -292079 -292081 -292091 -292093 -292133 -292141 -292147 -292157 -292181 -292183 -292223 -292231 -292241 -292249 -292267 -292283 -292301 -292309 -292319 -292343 -292351 -292363 -292367 -292381 -292393 -292427 -292441 -292459 -292469 -292471 -292477 -292483 -292489 -292493 -292517 -292531 -292541 -292549 -292561 -292573 -292577 -292601 -292627 -292631 -292661 -292667 -292673 -292679 -292693 -292703 -292709 -292711 -292717 -292727 -292753 -292759 -292777 -292793 -292801 -292807 -292819 -292837 -292841 -292849 -292867 -292879 -292909 -292921 -292933 -292969 -292973 -292979 -292993 -293021 -293071 -293081 -293087 -293093 -293099 -293107 -293123 -293129 -293147 -293149 -293173 -293177 -293179 -293201 -293207 -293213 -293221 -293257 -293261 -293263 -293269 -293311 -293329 -293339 -293351 -293357 -293399 -293413 -293431 -293441 -293453 -293459 -293467 -293473 -293483 -293507 -293543 -293599 -293603 -293617 -293621 -293633 -293639 -293651 -293659 -293677 -293681 -293701 -293717 -293723 -293729 -293749 -293767 -293773 -293791 -293803 -293827 -293831 -293861 -293863 -293893 -293899 -293941 -293957 -293983 -293989 -293999 -294001 -294013 -294023 -294029 -294043 -294053 -294059 -294067 -294103 -294127 -294131 -294149 -294157 -294167 -294169 -294179 -294181 -294199 -294211 -294223 -294227 -294241 -294247 -294251 -294269 -294277 -294289 -294293 -294311 -294313 -294317 -294319 -294337 -294341 -294347 -294353 -294383 -294391 -294397 -294403 -294431 -294439 -294461 -294467 -294479 -294499 -294509 -294523 -294529 -294551 -294563 -294629 -294641 -294647 -294649 -294659 -294673 -294703 -294731 -294751 -294757 -294761 -294773 -294781 -294787 -294793 -294799 -294803 -294809 -294821 -294829 -294859 -294869 -294887 -294893 -294911 -294919 -294923 -294947 -294949 -294953 -294979 -294989 -294991 -294997 -295007 -295033 -295037 -295039 -295049 -295073 -295079 -295081 -295111 -295123 -295129 -295153 -295187 -295199 -295201 -295219 -295237 -295247 -295259 -295271 -295277 -295283 -295291 -295313 -295319 -295333 -295357 -295363 -295387 -295411 -295417 -295429 -295433 -295439 -295441 -295459 -295513 -295517 -295541 -295553 -295567 -295571 -295591 -295601 -295663 -295693 -295699 -295703 -295727 -295751 -295759 -295769 -295777 -295787 -295819 -295831 -295837 -295843 -295847 -295853 -295861 -295871 -295873 -295877 -295879 -295901 -295903 -295909 -295937 -295943 -295949 -295951 -295961 -295973 -295993 -296011 -296017 -296027 -296041 -296047 -296071 -296083 -296099 -296117 -296129 -296137 -296159 -296183 -296201 -296213 -296221 -296237 -296243 -296249 -296251 -296269 -296273 -296279 -296287 -296299 -296347 -296353 -296363 -296369 -296377 -296437 -296441 -296473 -296477 -296479 -296489 -296503 -296507 -296509 -296519 -296551 -296557 -296561 -296563 -296579 -296581 -296587 -296591 -296627 -296651 -296663 -296669 -296683 -296687 -296693 -296713 -296719 -296729 -296731 -296741 -296749 -296753 -296767 -296771 -296773 -296797 -296801 -296819 -296827 -296831 -296833 -296843 -296909 -296911 -296921 -296929 -296941 -296969 -296971 -296981 -296983 -296987 -297019 -297023 -297049 -297061 -297067 -297079 -297083 -297097 -297113 -297133 -297151 -297161 -297169 -297191 -297233 -297247 -297251 -297257 -297263 -297289 -297317 -297359 -297371 -297377 -297391 -297397 -297403 -297421 -297439 -297457 -297467 -297469 -297481 -297487 -297503 -297509 -297523 -297533 -297581 -297589 -297601 -297607 -297613 -297617 -297623 -297629 -297641 -297659 -297683 -297691 -297707 -297719 -297727 -297757 -297779 -297793 -297797 -297809 -297811 -297833 -297841 -297853 -297881 -297889 -297893 -297907 -297911 -297931 -297953 -297967 -297971 -297989 -297991 -298013 -298021 -298031 -298043 -298049 -298063 -298087 -298093 -298099 -298153 -298157 -298159 -298169 -298171 -298187 -298201 -298211 -298213 -298223 -298237 -298247 -298261 -298283 -298303 -298307 -298327 -298339 -298343 -298349 -298369 -298373 -298399 -298409 -298411 -298427 -298451 -298477 -298483 -298513 -298559 -298579 -298583 -298589 -298601 -298607 -298621 -298631 -298651 -298667 -298679 -298681 -298687 -298691 -298693 -298709 -298723 -298733 -298757 -298759 -298777 -298799 -298801 -298817 -298819 -298841 -298847 -298853 -298861 -298897 -298937 -298943 -298993 -298999 -299011 -299017 -299027 -299029 -299053 -299059 -299063 -299087 -299099 -299107 -299113 -299137 -299147 -299171 -299179 -299191 -299197 -299213 -299239 -299261 -299281 -299287 -299311 -299317 -299329 -299333 -299357 -299359 -299363 -299371 -299389 -299393 -299401 -299417 -299419 -299447 -299471 -299473 -299477 -299479 -299501 -299513 -299521 -299527 -299539 -299567 -299569 -299603 -299617 -299623 -299653 -299671 -299681 -299683 -299699 -299701 -299711 -299723 -299731 -299743 -299749 -299771 -299777 -299807 -299843 -299857 -299861 -299881 -299891 -299903 -299909 -299933 -299941 -299951 -299969 -299977 -299983 -299993 -300007 -300017 -300023 -300043 -300073 -300089 -300109 -300119 -300137 -300149 -300151 -300163 -300187 -300191 -300193 -300221 -300229 -300233 -300239 -300247 -300277 -300299 -300301 -300317 -300319 -300323 -300331 -300343 -300347 -300367 -300397 -300413 -300427 -300431 -300439 -300463 -300481 -300491 -300493 -300497 -300499 -300511 -300557 -300569 -300581 -300583 -300589 -300593 -300623 -300631 -300647 -300649 -300661 -300667 -300673 -300683 -300691 -300719 -300721 -300733 -300739 -300743 -300749 -300757 -300761 -300779 -300787 -300799 -300809 -300821 -300823 -300851 -300857 -300869 -300877 -300889 -300893 -300929 -300931 -300953 -300961 -300967 -300973 -300977 -300997 -301013 -301027 -301039 -301051 -301057 -301073 -301079 -301123 -301127 -301141 -301153 -301159 -301177 -301181 -301183 -301211 -301219 -301237 -301241 -301243 -301247 -301267 -301303 -301319 -301331 -301333 -301349 -301361 -301363 -301381 -301403 -301409 -301423 -301429 -301447 -301459 -301463 -301471 -301487 -301489 -301493 -301501 -301531 -301577 -301579 -301583 -301591 -301601 -301619 -301627 -301643 -301649 -301657 -301669 -301673 -301681 -301703 -301711 -301747 -301751 -301753 -301759 -301789 -301793 -301813 -301831 -301841 -301843 -301867 -301877 -301897 -301901 -301907 -301913 -301927 -301933 -301943 -301949 -301979 -301991 -301993 -301997 -301999 -302009 -302053 -302111 -302123 -302143 -302167 -302171 -302173 -302189 -302191 -302213 -302221 -302227 -302261 -302273 -302279 -302287 -302297 -302299 -302317 -302329 -302399 -302411 -302417 -302429 -302443 -302459 -302483 -302507 -302513 -302551 -302563 -302567 -302573 -302579 -302581 -302587 -302593 -302597 -302609 -302629 -302647 -302663 -302681 -302711 -302723 -302747 -302759 -302767 -302779 -302791 -302801 -302831 -302833 -302837 -302843 -302851 -302857 -302873 -302891 -302903 -302909 -302921 -302927 -302941 -302959 -302969 -302971 -302977 -302983 -302989 -302999 -303007 -303011 -303013 -303019 -303029 -303049 -303053 -303073 -303089 -303091 -303097 -303119 -303139 -303143 -303151 -303157 -303187 -303217 -303257 -303271 -303283 -303287 -303293 -303299 -303307 -303313 -303323 -303337 -303341 -303361 -303367 -303371 -303377 -303379 -303389 -303409 -303421 -303431 -303463 -303469 -303473 -303491 -303493 -303497 -303529 -303539 -303547 -303551 -303553 -303571 -303581 -303587 -303593 -303613 -303617 -303619 -303643 -303647 -303649 -303679 -303683 -303689 -303691 -303703 -303713 -303727 -303731 -303749 -303767 -303781 -303803 -303817 -303827 -303839 -303859 -303871 -303889 -303907 -303917 -303931 -303937 -303959 -303983 -303997 -304009 -304013 -304021 -304033 -304039 -304049 -304063 -304067 -304069 -304081 -304091 -304099 -304127 -304151 -304153 -304163 -304169 -304193 -304211 -304217 -304223 -304253 -304259 -304279 -304301 -304303 -304331 -304349 -304357 -304363 -304373 -304391 -304393 -304411 -304417 -304429 -304433 -304439 -304457 -304459 -304477 -304481 -304489 -304501 -304511 -304517 -304523 -304537 -304541 -304553 -304559 -304561 -304597 -304609 -304631 -304643 -304651 -304663 -304687 -304709 -304723 -304729 -304739 -304751 -304757 -304763 -304771 -304781 -304789 -304807 -304813 -304831 -304847 -304849 -304867 -304879 -304883 -304897 -304901 -304903 -304907 -304933 -304937 -304943 -304949 -304961 -304979 -304981 -305017 -305021 -305023 -305029 -305033 -305047 -305069 -305093 -305101 -305111 -305113 -305119 -305131 -305143 -305147 -305209 -305219 -305231 -305237 -305243 -305267 -305281 -305297 -305329 -305339 -305351 -305353 -305363 -305369 -305377 -305401 -305407 -305411 -305413 -305419 -305423 -305441 -305449 -305471 -305477 -305479 -305483 -305489 -305497 -305521 -305533 -305551 -305563 -305581 -305593 -305597 -305603 -305611 -305621 -305633 -305639 -305663 -305717 -305719 -305741 -305743 -305749 -305759 -305761 -305771 -305783 -305803 -305821 -305839 -305849 -305857 -305861 -305867 -305873 -305917 -305927 -305933 -305947 -305971 -305999 -306011 -306023 -306029 -306041 -306049 -306083 -306091 -306121 -306133 -306139 -306149 -306157 -306167 -306169 -306191 -306193 -306209 -306239 -306247 -306253 -306259 -306263 -306301 -306329 -306331 -306347 -306349 -306359 -306367 -306377 -306389 -306407 -306419 -306421 -306431 -306437 -306457 -306463 -306473 -306479 -306491 -306503 -306511 -306517 -306529 -306533 -306541 -306563 -306577 -306587 -306589 -306643 -306653 -306661 -306689 -306701 -306703 -306707 -306727 -306739 -306749 -306763 -306781 -306809 -306821 -306827 -306829 -306847 -306853 -306857 -306871 -306877 -306883 -306893 -306899 -306913 -306919 -306941 -306947 -306949 -306953 -306991 -307009 -307019 -307031 -307033 -307067 -307079 -307091 -307093 -307103 -307121 -307129 -307147 -307163 -307169 -307171 -307187 -307189 -307201 -307243 -307253 -307259 -307261 -307267 -307273 -307277 -307283 -307289 -307301 -307337 -307339 -307361 -307367 -307381 -307397 -307399 -307409 -307423 -307451 -307471 -307481 -307511 -307523 -307529 -307537 -307543 -307577 -307583 -307589 -307609 -307627 -307631 -307633 -307639 -307651 -307669 -307687 -307691 -307693 -307711 -307733 -307759 -307817 -307823 -307831 -307843 -307859 -307871 -307873 -307891 -307903 -307919 -307939 -307969 -308003 -308017 -308027 -308041 -308051 -308081 -308093 -308101 -308107 -308117 -308129 -308137 -308141 -308149 -308153 -308213 -308219 -308249 -308263 -308291 -308293 -308303 -308309 -308311 -308317 -308323 -308327 -308333 -308359 -308383 -308411 -308423 -308437 -308447 -308467 -308489 -308491 -308501 -308507 -308509 -308519 -308521 -308527 -308537 -308551 -308569 -308573 -308587 -308597 -308621 -308639 -308641 -308663 -308681 -308701 -308713 -308723 -308761 -308773 -308801 -308809 -308813 -308827 -308849 -308851 -308857 -308887 -308899 -308923 -308927 -308929 -308933 -308939 -308951 -308989 -308999 -309007 -309011 -309013 -309019 -309031 -309037 -309059 -309079 -309083 -309091 -309107 -309109 -309121 -309131 -309137 -309157 -309167 -309173 -309193 -309223 -309241 -309251 -309259 -309269 -309271 -309277 -309289 -309293 -309311 -309313 -309317 -309359 -309367 -309371 -309391 -309403 -309433 -309437 -309457 -309461 -309469 -309479 -309481 -309493 -309503 -309521 -309523 -309539 -309541 -309559 -309571 -309577 -309583 -309599 -309623 -309629 -309637 -309667 -309671 -309677 -309707 -309713 -309731 -309737 -309769 -309779 -309781 -309797 -309811 -309823 -309851 -309853 -309857 -309877 -309899 -309929 -309931 -309937 -309977 -309989 -310019 -310021 -310027 -310043 -310049 -310081 -310087 -310091 -310111 -310117 -310127 -310129 -310169 -310181 -310187 -310223 -310229 -310231 -310237 -310243 -310273 -310283 -310291 -310313 -310333 -310357 -310361 -310363 -310379 -310397 -310423 -310433 -310439 -310447 -310459 -310463 -310481 -310489 -310501 -310507 -310511 -310547 -310553 -310559 -310567 -310571 -310577 -310591 -310627 -310643 -310663 -310693 -310697 -310711 -310721 -310727 -310729 -310733 -310741 -310747 -310771 -310781 -310789 -310801 -310819 -310823 -310829 -310831 -310861 -310867 -310883 -310889 -310901 -310927 -310931 -310949 -310969 -310987 -310997 -311009 -311021 -311027 -311033 -311041 -311099 -311111 -311123 -311137 -311153 -311173 -311177 -311183 -311189 -311197 -311203 -311237 -311279 -311291 -311293 -311299 -311303 -311323 -311329 -311341 -311347 -311359 -311371 -311393 -311407 -311419 -311447 -311453 -311473 -311533 -311537 -311539 -311551 -311557 -311561 -311567 -311569 -311603 -311609 -311653 -311659 -311677 -311681 -311683 -311687 -311711 -311713 -311737 -311743 -311747 -311749 -311791 -311803 -311807 -311821 -311827 -311867 -311869 -311881 -311897 -311951 -311957 -311963 -311981 -312007 -312023 -312029 -312031 -312043 -312047 -312071 -312073 -312083 -312089 -312101 -312107 -312121 -312161 -312197 -312199 -312203 -312209 -312211 -312217 -312229 -312233 -312241 -312251 -312253 -312269 -312281 -312283 -312289 -312311 -312313 -312331 -312343 -312349 -312353 -312371 -312383 -312397 -312401 -312407 -312413 -312427 -312451 -312469 -312509 -312517 -312527 -312551 -312553 -312563 -312581 -312583 -312589 -312601 -312617 -312619 -312623 -312643 -312673 -312677 -312679 -312701 -312703 -312709 -312727 -312737 -312743 -312757 -312773 -312779 -312799 -312839 -312841 -312857 -312863 -312887 -312899 -312929 -312931 -312937 -312941 -312943 -312967 -312971 -312979 -312989 -313003 -313009 -313031 -313037 -313081 -313087 -313109 -313127 -313129 -313133 -313147 -313151 -313153 -313163 -313207 -313211 -313219 -313241 -313249 -313267 -313273 -313289 -313297 -313301 -313307 -313321 -313331 -313333 -313343 -313351 -313373 -313381 -313387 -313399 -313409 -313471 -313477 -313507 -313517 -313543 -313549 -313553 -313561 -313567 -313571 -313583 -313589 -313597 -313603 -313613 -313619 -313637 -313639 -313661 -313669 -313679 -313699 -313711 -313717 -313721 -313727 -313739 -313741 -313763 -313777 -313783 -313829 -313849 -313853 -313879 -313883 -313889 -313897 -313909 -313921 -313931 -313933 -313949 -313961 -313969 -313979 -313981 -313987 -313991 -313993 -313997 -314003 -314021 -314059 -314063 -314077 -314107 -314113 -314117 -314129 -314137 -314159 -314161 -314173 -314189 -314213 -314219 -314227 -314233 -314239 -314243 -314257 -314261 -314263 -314267 -314299 -314329 -314339 -314351 -314357 -314359 -314399 -314401 -314407 -314423 -314441 -314453 -314467 -314491 -314497 -314513 -314527 -314543 -314549 -314569 -314581 -314591 -314597 -314599 -314603 -314623 -314627 -314641 -314651 -314693 -314707 -314711 -314719 -314723 -314747 -314761 -314771 -314777 -314779 -314807 -314813 -314827 -314851 -314879 -314903 -314917 -314927 -314933 -314953 -314957 -314983 -314989 -315011 -315013 -315037 -315047 -315059 -315067 -315083 -315097 -315103 -315109 -315127 -315179 -315181 -315193 -315199 -315223 -315247 -315251 -315257 -315269 -315281 -315313 -315349 -315361 -315373 -315377 -315389 -315407 -315409 -315421 -315437 -315449 -315451 -315461 -315467 -315481 -315493 -315517 -315521 -315527 -315529 -315547 -315551 -315559 -315569 -315589 -315593 -315599 -315613 -315617 -315631 -315643 -315671 -315677 -315691 -315697 -315701 -315703 -315739 -315743 -315751 -315779 -315803 -315811 -315829 -315851 -315857 -315881 -315883 -315893 -315899 -315907 -315937 -315949 -315961 -315967 -315977 -316003 -316031 -316033 -316037 -316051 -316067 -316073 -316087 -316097 -316109 -316133 -316139 -316153 -316177 -316189 -316193 -316201 -316213 -316219 -316223 -316241 -316243 -316259 -316271 -316291 -316297 -316301 -316321 -316339 -316343 -316363 -316373 -316391 -316403 -316423 -316429 -316439 -316453 -316469 -316471 -316493 -316499 -316501 -316507 -316531 -316567 -316571 -316577 -316583 -316621 -316633 -316637 -316649 -316661 -316663 -316681 -316691 -316697 -316699 -316703 -316717 -316753 -316759 -316769 -316777 -316783 -316793 -316801 -316817 -316819 -316847 -316853 -316859 -316861 -316879 -316891 -316903 -316907 -316919 -316937 -316951 -316957 -316961 -316991 -317003 -317011 -317021 -317029 -317047 -317063 -317071 -317077 -317087 -317089 -317123 -317159 -317171 -317179 -317189 -317197 -317209 -317227 -317257 -317263 -317267 -317269 -317279 -317321 -317323 -317327 -317333 -317351 -317353 -317363 -317371 -317399 -317411 -317419 -317431 -317437 -317453 -317459 -317483 -317489 -317491 -317503 -317539 -317557 -317563 -317587 -317591 -317593 -317599 -317609 -317617 -317621 -317651 -317663 -317671 -317693 -317701 -317711 -317717 -317729 -317731 -317741 -317743 -317771 -317773 -317777 -317783 -317789 -317797 -317827 -317831 -317839 -317857 -317887 -317903 -317921 -317923 -317957 -317959 -317963 -317969 -317971 -317983 -317987 -318001 -318007 -318023 -318077 -318103 -318107 -318127 -318137 -318161 -318173 -318179 -318181 -318191 -318203 -318209 -318211 -318229 -318233 -318247 -318259 -318271 -318281 -318287 -318289 -318299 -318301 -318313 -318319 -318323 -318337 -318347 -318349 -318377 -318403 -318407 -318419 -318431 -318443 -318457 -318467 -318473 -318503 -318523 -318557 -318559 -318569 -318581 -318589 -318601 -318629 -318641 -318653 -318671 -318677 -318679 -318683 -318691 -318701 -318713 -318737 -318743 -318749 -318751 -318781 -318793 -318809 -318811 -318817 -318823 -318833 -318841 -318863 -318881 -318883 -318889 -318907 -318911 -318917 -318919 -318949 -318979 -319001 -319027 -319031 -319037 -319049 -319057 -319061 -319069 -319093 -319097 -319117 -319127 -319129 -319133 -319147 -319159 -319169 -319183 -319201 -319211 -319223 -319237 -319259 -319279 -319289 -319313 -319321 -319327 -319339 -319343 -319351 -319357 -319387 -319391 -319399 -319411 -319427 -319433 -319439 -319441 -319453 -319469 -319477 -319483 -319489 -319499 -319511 -319519 -319541 -319547 -319567 -319577 -319589 -319591 -319601 -319607 -319639 -319673 -319679 -319681 -319687 -319691 -319699 -319727 -319729 -319733 -319747 -319757 -319763 -319811 -319817 -319819 -319829 -319831 -319849 -319883 -319897 -319901 -319919 -319927 -319931 -319937 -319967 -319973 -319981 -319993 -320009 -320011 -320027 -320039 -320041 -320053 -320057 -320063 -320081 -320083 -320101 -320107 -320113 -320119 -320141 -320143 -320149 -320153 -320179 -320209 -320213 -320219 -320237 -320239 -320267 -320269 -320273 -320291 -320293 -320303 -320317 -320329 -320339 -320377 -320387 -320389 -320401 -320417 -320431 -320449 -320471 -320477 -320483 -320513 -320521 -320533 -320539 -320561 -320563 -320591 -320609 -320611 -320627 -320647 -320657 -320659 -320669 -320687 -320693 -320699 -320713 -320741 -320759 -320767 -320791 -320821 -320833 -320839 -320843 -320851 -320861 -320867 -320899 -320911 -320923 -320927 -320939 -320941 -320953 -321007 -321017 -321031 -321037 -321047 -321053 -321073 -321077 -321091 -321109 -321143 -321163 -321169 -321187 -321193 -321199 -321203 -321221 -321227 -321239 -321247 -321289 -321301 -321311 -321313 -321319 -321323 -321329 -321331 -321341 -321359 -321367 -321371 -321383 -321397 -321403 -321413 -321427 -321443 -321449 -321467 -321469 -321509 -321547 -321553 -321569 -321571 -321577 -321593 -321611 -321617 -321619 -321631 -321647 -321661 -321679 -321707 -321709 -321721 -321733 -321743 -321751 -321757 -321779 -321799 -321817 -321821 -321823 -321829 -321833 -321847 -321851 -321889 -321901 -321911 -321947 -321949 -321961 -321983 -321991 -322001 -322009 -322013 -322037 -322039 -322051 -322057 -322067 -322073 -322079 -322093 -322097 -322109 -322111 -322139 -322169 -322171 -322193 -322213 -322229 -322237 -322243 -322247 -322249 -322261 -322271 -322319 -322327 -322339 -322349 -322351 -322397 -322403 -322409 -322417 -322429 -322433 -322459 -322463 -322501 -322513 -322519 -322523 -322537 -322549 -322559 -322571 -322573 -322583 -322589 -322591 -322607 -322613 -322627 -322631 -322633 -322649 -322669 -322709 -322727 -322747 -322757 -322769 -322771 -322781 -322783 -322807 -322849 -322859 -322871 -322877 -322891 -322901 -322919 -322921 -322939 -322951 -322963 -322969 -322997 -322999 -323003 -323009 -323027 -323053 -323077 -323083 -323087 -323093 -323101 -323123 -323131 -323137 -323149 -323201 -323207 -323233 -323243 -323249 -323251 -323273 -323333 -323339 -323341 -323359 -323369 -323371 -323377 -323381 -323383 -323413 -323419 -323441 -323443 -323467 -323471 -323473 -323507 -323509 -323537 -323549 -323567 -323579 -323581 -323591 -323597 -323599 -323623 -323641 -323647 -323651 -323699 -323707 -323711 -323717 -323759 -323767 -323789 -323797 -323801 -323803 -323819 -323837 -323879 -323899 -323903 -323923 -323927 -323933 -323951 -323957 -323987 -324011 -324031 -324053 -324067 -324073 -324089 -324097 -324101 -324113 -324119 -324131 -324143 -324151 -324161 -324179 -324199 -324209 -324211 -324217 -324223 -324239 -324251 -324293 -324299 -324301 -324319 -324329 -324341 -324361 -324391 -324397 -324403 -324419 -324427 -324431 -324437 -324439 -324449 -324451 -324469 -324473 -324491 -324497 -324503 -324517 -324523 -324529 -324557 -324587 -324589 -324593 -324617 -324619 -324637 -324641 -324647 -324661 -324673 -324689 -324697 -324707 -324733 -324743 -324757 -324763 -324773 -324781 -324791 -324799 -324809 -324811 -324839 -324847 -324869 -324871 -324889 -324893 -324901 -324931 -324941 -324949 -324953 -324977 -324979 -324983 -324991 -324997 -325001 -325009 -325019 -325021 -325027 -325043 -325051 -325063 -325079 -325081 -325093 -325133 -325153 -325163 -325181 -325187 -325189 -325201 -325217 -325219 -325229 -325231 -325249 -325271 -325301 -325307 -325309 -325319 -325333 -325343 -325349 -325379 -325411 -325421 -325439 -325447 -325453 -325459 -325463 -325477 -325487 -325513 -325517 -325537 -325541 -325543 -325571 -325597 -325607 -325627 -325631 -325643 -325667 -325673 -325681 -325691 -325693 -325697 -325709 -325723 -325729 -325747 -325751 -325753 -325769 -325777 -325781 -325783 -325807 -325813 -325849 -325861 -325877 -325883 -325889 -325891 -325901 -325921 -325939 -325943 -325951 -325957 -325987 -325993 -325999 -326023 -326057 -326063 -326083 -326087 -326099 -326101 -326113 -326119 -326141 -326143 -326147 -326149 -326153 -326159 -326171 -326189 -326203 -326219 -326251 -326257 -326309 -326323 -326351 -326353 -326369 -326437 -326441 -326449 -326467 -326479 -326497 -326503 -326537 -326539 -326549 -326561 -326563 -326567 -326581 -326593 -326597 -326609 -326611 -326617 -326633 -326657 -326659 -326663 -326681 -326687 -326693 -326701 -326707 -326737 -326741 -326773 -326779 -326831 -326863 -326867 -326869 -326873 -326881 -326903 -326923 -326939 -326941 -326947 -326951 -326983 -326993 -326999 -327001 -327007 -327011 -327017 -327023 -327059 -327071 -327079 -327127 -327133 -327163 -327179 -327193 -327203 -327209 -327211 -327247 -327251 -327263 -327277 -327289 -327307 -327311 -327317 -327319 -327331 -327337 -327343 -327347 -327401 -327407 -327409 -327419 -327421 -327433 -327443 -327463 -327469 -327473 -327479 -327491 -327493 -327499 -327511 -327517 -327529 -327553 -327557 -327559 -327571 -327581 -327583 -327599 -327619 -327629 -327647 -327661 -327667 -327673 -327689 -327707 -327721 -327737 -327739 -327757 -327779 -327797 -327799 -327809 -327823 -327827 -327829 -327839 -327851 -327853 -327869 -327871 -327881 -327889 -327917 -327923 -327941 -327953 -327967 -327979 -327983 -328007 -328037 -328043 -328051 -328061 -328063 -328067 -328093 -328103 -328109 -328121 -328127 -328129 -328171 -328177 -328213 -328243 -328249 -328271 -328277 -328283 -328291 -328303 -328327 -328331 -328333 -328343 -328357 -328373 -328379 -328381 -328397 -328411 -328421 -328429 -328439 -328481 -328511 -328513 -328519 -328543 -328579 -328589 -328591 -328619 -328621 -328633 -328637 -328639 -328651 -328667 -328687 -328709 -328721 -328753 -328777 -328781 -328787 -328789 -328813 -328829 -328837 -328847 -328849 -328883 -328891 -328897 -328901 -328919 -328921 -328931 -328961 -328981 -329009 -329027 -329053 -329059 -329081 -329083 -329089 -329101 -329111 -329123 -329143 -329167 -329177 -329191 -329201 -329207 -329209 -329233 -329243 -329257 -329267 -329269 -329281 -329293 -329297 -329299 -329309 -329317 -329321 -329333 -329347 -329387 -329393 -329401 -329419 -329431 -329471 -329473 -329489 -329503 -329519 -329533 -329551 -329557 -329587 -329591 -329597 -329603 -329617 -329627 -329629 -329639 -329657 -329663 -329671 -329677 -329683 -329687 -329711 -329717 -329723 -329729 -329761 -329773 -329779 -329789 -329801 -329803 -329863 -329867 -329873 -329891 -329899 -329941 -329947 -329951 -329957 -329969 -329977 -329993 -329999 -330017 -330019 -330037 -330041 -330047 -330053 -330061 -330067 -330097 -330103 -330131 -330133 -330139 -330149 -330167 -330199 -330203 -330217 -330227 -330229 -330233 -330241 -330247 -330271 -330287 -330289 -330311 -330313 -330329 -330331 -330347 -330359 -330383 -330389 -330409 -330413 -330427 -330431 -330433 -330439 -330469 -330509 -330557 -330563 -330569 -330587 -330607 -330611 -330623 -330641 -330643 -330653 -330661 -330679 -330683 -330689 -330697 -330703 -330719 -330721 -330731 -330749 -330767 -330787 -330791 -330793 -330821 -330823 -330839 -330853 -330857 -330859 -330877 -330887 -330899 -330907 -330917 -330943 -330983 -330997 -331013 -331027 -331031 -331043 -331063 -331081 -331099 -331127 -331141 -331147 -331153 -331159 -331171 -331183 -331207 -331213 -331217 -331231 -331241 -331249 -331259 -331277 -331283 -331301 -331307 -331319 -331333 -331337 -331339 -331349 -331367 -331369 -331391 -331399 -331423 -331447 -331451 -331489 -331501 -331511 -331519 -331523 -331537 -331543 -331547 -331549 -331553 -331577 -331579 -331589 -331603 -331609 -331613 -331651 -331663 -331691 -331693 -331697 -331711 -331739 -331753 -331769 -331777 -331781 -331801 -331819 -331841 -331843 -331871 -331883 -331889 -331897 -331907 -331909 -331921 -331937 -331943 -331957 -331967 -331973 -331997 -331999 -332009 -332011 -332039 -332053 -332069 -332081 -332099 -332113 -332117 -332147 -332159 -332161 -332179 -332183 -332191 -332201 -332203 -332207 -332219 -332221 -332251 -332263 -332273 -332287 -332303 -332309 -332317 -332393 -332399 -332411 -332417 -332441 -332447 -332461 -332467 -332471 -332473 -332477 -332489 -332509 -332513 -332561 -332567 -332569 -332573 -332611 -332617 -332623 -332641 -332687 -332699 -332711 -332729 -332743 -332749 -332767 -332779 -332791 -332803 -332837 -332851 -332873 -332881 -332887 -332903 -332921 -332933 -332947 -332951 -332987 -332989 -332993 -333019 -333023 -333029 -333031 -333041 -333049 -333071 -333097 -333101 -333103 -333107 -333131 -333139 -333161 -333187 -333197 -333209 -333227 -333233 -333253 -333269 -333271 -333283 -333287 -333299 -333323 -333331 -333337 -333341 -333349 -333367 -333383 -333397 -333419 -333427 -333433 -333439 -333449 -333451 -333457 -333479 -333491 -333493 -333497 -333503 -333517 -333533 -333539 -333563 -333581 -333589 -333623 -333631 -333647 -333667 -333673 -333679 -333691 -333701 -333713 -333719 -333721 -333737 -333757 -333769 -333779 -333787 -333791 -333793 -333803 -333821 -333857 -333871 -333911 -333923 -333929 -333941 -333959 -333973 -333989 -333997 -334021 -334031 -334043 -334049 -334057 -334069 -334093 -334099 -334127 -334133 -334157 -334171 -334177 -334183 -334189 -334199 -334231 -334247 -334261 -334289 -334297 -334319 -334331 -334333 -334349 -334363 -334379 -334387 -334393 -334403 -334421 -334423 -334427 -334429 -334447 -334487 -334493 -334507 -334511 -334513 -334541 -334547 -334549 -334561 -334603 -334619 -334637 -334643 -334651 -334661 -334667 -334681 -334693 -334699 -334717 -334721 -334727 -334751 -334753 -334759 -334771 -334777 -334783 -334787 -334793 -334843 -334861 -334877 -334889 -334891 -334897 -334931 -334963 -334973 -334987 -334991 -334993 -335009 -335021 -335029 -335033 -335047 -335051 -335057 -335077 -335081 -335089 -335107 -335113 -335117 -335123 -335131 -335149 -335161 -335171 -335173 -335207 -335213 -335221 -335249 -335261 -335273 -335281 -335299 -335323 -335341 -335347 -335381 -335383 -335411 -335417 -335429 -335449 -335453 -335459 -335473 -335477 -335507 -335519 -335527 -335539 -335557 -335567 -335579 -335591 -335609 -335633 -335641 -335653 -335663 -335669 -335681 -335689 -335693 -335719 -335729 -335743 -335747 -335771 -335807 -335809 -335813 -335821 -335833 -335843 -335857 -335879 -335893 -335897 -335917 -335941 -335953 -335957 -335999 -336029 -336031 -336041 -336059 -336079 -336101 -336103 -336109 -336113 -336121 -336143 -336151 -336157 -336163 -336181 -336199 -336211 -336221 -336223 -336227 -336239 -336247 -336251 -336253 -336263 -336307 -336317 -336353 -336361 -336373 -336397 -336403 -336419 -336437 -336463 -336491 -336499 -336503 -336521 -336527 -336529 -336533 -336551 -336563 -336571 -336577 -336587 -336593 -336599 -336613 -336631 -336643 -336649 -336653 -336667 -336671 -336683 -336689 -336703 -336727 -336757 -336761 -336767 -336769 -336773 -336793 -336799 -336803 -336823 -336827 -336829 -336857 -336863 -336871 -336887 -336899 -336901 -336911 -336929 -336961 -336977 -336983 -336989 -336997 -337013 -337021 -337031 -337039 -337049 -337069 -337081 -337091 -337097 -337121 -337153 -337189 -337201 -337213 -337217 -337219 -337223 -337261 -337277 -337279 -337283 -337291 -337301 -337313 -337327 -337339 -337343 -337349 -337361 -337367 -337369 -337397 -337411 -337427 -337453 -337457 -337487 -337489 -337511 -337517 -337529 -337537 -337541 -337543 -337583 -337607 -337609 -337627 -337633 -337639 -337651 -337661 -337669 -337681 -337691 -337697 -337721 -337741 -337751 -337759 -337781 -337793 -337817 -337837 -337853 -337859 -337861 -337867 -337871 -337873 -337891 -337901 -337903 -337907 -337919 -337949 -337957 -337969 -337973 -337999 -338017 -338027 -338033 -338119 -338137 -338141 -338153 -338159 -338161 -338167 -338171 -338183 -338197 -338203 -338207 -338213 -338231 -338237 -338251 -338263 -338267 -338269 -338279 -338287 -338293 -338297 -338309 -338321 -338323 -338339 -338341 -338347 -338369 -338383 -338389 -338407 -338411 -338413 -338423 -338431 -338449 -338461 -338473 -338477 -338497 -338531 -338543 -338563 -338567 -338573 -338579 -338581 -338609 -338659 -338669 -338683 -338687 -338707 -338717 -338731 -338747 -338753 -338761 -338773 -338777 -338791 -338803 -338839 -338851 -338857 -338867 -338893 -338909 -338927 -338959 -338993 -338999 -339023 -339049 -339067 -339071 -339091 -339103 -339107 -339121 -339127 -339137 -339139 -339151 -339161 -339173 -339187 -339211 -339223 -339239 -339247 -339257 -339263 -339289 -339307 -339323 -339331 -339341 -339373 -339389 -339413 -339433 -339467 -339491 -339517 -339527 -339539 -339557 -339583 -339589 -339601 -339613 -339617 -339631 -339637 -339649 -339653 -339659 -339671 -339673 -339679 -339707 -339727 -339749 -339751 -339761 -339769 -339799 -339811 -339817 -339821 -339827 -339839 -339841 -339863 -339887 -339907 -339943 -339959 -339991 -340007 -340027 -340031 -340037 -340049 -340057 -340061 -340063 -340073 -340079 -340103 -340111 -340117 -340121 -340127 -340129 -340169 -340183 -340201 -340211 -340237 -340261 -340267 -340283 -340297 -340321 -340337 -340339 -340369 -340381 -340387 -340393 -340397 -340409 -340429 -340447 -340451 -340453 -340477 -340481 -340519 -340541 -340559 -340573 -340577 -340579 -340583 -340591 -340601 -340619 -340633 -340643 -340649 -340657 -340661 -340687 -340693 -340709 -340723 -340757 -340777 -340787 -340789 -340793 -340801 -340811 -340819 -340849 -340859 -340877 -340889 -340897 -340903 -340909 -340913 -340919 -340927 -340931 -340933 -340937 -340939 -340957 -340979 -340999 -341017 -341027 -341041 -341057 -341059 -341063 -341083 -341087 -341123 -341141 -341171 -341179 -341191 -341203 -341219 -341227 -341233 -341269 -341273 -341281 -341287 -341293 -341303 -341311 -341321 -341323 -341333 -341339 -341347 -341357 -341423 -341443 -341447 -341459 -341461 -341477 -341491 -341501 -341507 -341521 -341543 -341557 -341569 -341587 -341597 -341603 -341617 -341623 -341629 -341641 -341647 -341659 -341681 -341687 -341701 -341729 -341743 -341749 -341771 -341773 -341777 -341813 -341821 -341827 -341839 -341851 -341863 -341879 -341911 -341927 -341947 -341951 -341953 -341959 -341963 -341983 -341993 -342037 -342047 -342049 -342059 -342061 -342071 -342073 -342077 -342101 -342107 -342131 -342143 -342179 -342187 -342191 -342197 -342203 -342211 -342233 -342239 -342241 -342257 -342281 -342283 -342299 -342319 -342337 -342341 -342343 -342347 -342359 -342371 -342373 -342379 -342389 -342413 -342421 -342449 -342451 -342467 -342469 -342481 -342497 -342521 -342527 -342547 -342553 -342569 -342593 -342599 -342607 -342647 -342653 -342659 -342673 -342679 -342691 -342697 -342733 -342757 -342761 -342791 -342799 -342803 -342821 -342833 -342841 -342847 -342863 -342869 -342871 -342889 -342899 -342929 -342949 -342971 -342989 -343019 -343037 -343051 -343061 -343073 -343081 -343087 -343127 -343141 -343153 -343163 -343169 -343177 -343193 -343199 -343219 -343237 -343243 -343253 -343261 -343267 -343289 -343303 -343307 -343309 -343313 -343327 -343333 -343337 -343373 -343379 -343381 -343391 -343393 -343411 -343423 -343433 -343481 -343489 -343517 -343529 -343531 -343543 -343547 -343559 -343561 -343579 -343583 -343589 -343591 -343601 -343627 -343631 -343639 -343649 -343661 -343667 -343687 -343709 -343727 -343769 -343771 -343787 -343799 -343801 -343813 -343817 -343823 -343829 -343831 -343891 -343897 -343901 -343913 -343933 -343939 -343943 -343951 -343963 -343997 -344017 -344021 -344039 -344053 -344083 -344111 -344117 -344153 -344161 -344167 -344171 -344173 -344177 -344189 -344207 -344209 -344213 -344221 -344231 -344237 -344243 -344249 -344251 -344257 -344263 -344269 -344273 -344291 -344293 -344321 -344327 -344347 -344353 -344363 -344371 -344417 -344423 -344429 -344453 -344479 -344483 -344497 -344543 -344567 -344587 -344599 -344611 -344621 -344629 -344639 -344653 -344671 -344681 -344683 -344693 -344719 -344749 -344753 -344759 -344791 -344797 -344801 -344807 -344819 -344821 -344843 -344857 -344863 -344873 -344887 -344893 -344909 -344917 -344921 -344941 -344957 -344959 -344963 -344969 -344987 -345001 -345011 -345017 -345019 -345041 -345047 -345067 -345089 -345109 -345133 -345139 -345143 -345181 -345193 -345221 -345227 -345229 -345259 -345263 -345271 -345307 -345311 -345329 -345379 -345413 -345431 -345451 -345461 -345463 -345473 -345479 -345487 -345511 -345517 -345533 -345547 -345551 -345571 -345577 -345581 -345599 -345601 -345607 -345637 -345643 -345647 -345659 -345673 -345679 -345689 -345701 -345707 -345727 -345731 -345733 -345739 -345749 -345757 -345769 -345773 -345791 -345803 -345811 -345817 -345823 -345853 -345869 -345881 -345887 -345889 -345907 -345923 -345937 -345953 -345979 -345997 -346013 -346039 -346043 -346051 -346079 -346091 -346097 -346111 -346117 -346133 -346139 -346141 -346147 -346169 -346187 -346201 -346207 -346217 -346223 -346259 -346261 -346277 -346303 -346309 -346321 -346331 -346337 -346349 -346361 -346369 -346373 -346391 -346393 -346397 -346399 -346417 -346421 -346429 -346433 -346439 -346441 -346447 -346453 -346469 -346501 -346529 -346543 -346547 -346553 -346559 -346561 -346589 -346601 -346607 -346627 -346639 -346649 -346651 -346657 -346667 -346669 -346699 -346711 -346721 -346739 -346751 -346763 -346793 -346831 -346849 -346867 -346873 -346877 -346891 -346903 -346933 -346939 -346943 -346961 -346963 -347003 -347033 -347041 -347051 -347057 -347059 -347063 -347069 -347071 -347099 -347129 -347131 -347141 -347143 -347161 -347167 -347173 -347177 -347183 -347197 -347201 -347209 -347227 -347233 -347239 -347251 -347257 -347287 -347297 -347299 -347317 -347329 -347341 -347359 -347401 -347411 -347437 -347443 -347489 -347509 -347513 -347519 -347533 -347539 -347561 -347563 -347579 -347587 -347591 -347609 -347621 -347629 -347651 -347671 -347707 -347717 -347729 -347731 -347747 -347759 -347771 -347773 -347779 -347801 -347813 -347821 -347849 -347873 -347887 -347891 -347899 -347929 -347933 -347951 -347957 -347959 -347969 -347981 -347983 -347987 -347989 -347993 -348001 -348011 -348017 -348031 -348043 -348053 -348077 -348083 -348097 -348149 -348163 -348181 -348191 -348209 -348217 -348221 -348239 -348241 -348247 -348253 -348259 -348269 -348287 -348307 -348323 -348353 -348367 -348389 -348401 -348407 -348419 -348421 -348431 -348433 -348437 -348443 -348451 -348457 -348461 -348463 -348487 -348527 -348547 -348553 -348559 -348563 -348571 -348583 -348587 -348617 -348629 -348637 -348643 -348661 -348671 -348709 -348731 -348739 -348757 -348763 -348769 -348779 -348811 -348827 -348833 -348839 -348851 -348883 -348889 -348911 -348917 -348919 -348923 -348937 -348949 -348989 -348991 -349007 -349039 -349043 -349051 -349079 -349081 -349093 -349099 -349109 -349121 -349133 -349171 -349177 -349183 -349187 -349199 -349207 -349211 -349241 -349291 -349303 -349313 -349331 -349337 -349343 -349357 -349369 -349373 -349379 -349381 -349387 -349397 -349399 -349403 -349409 -349411 -349423 -349471 -349477 -349483 -349493 -349499 -349507 -349519 -349529 -349553 -349567 -349579 -349589 -349603 -349637 -349663 -349667 -349697 -349709 -349717 -349729 -349753 -349759 -349787 -349793 -349801 -349813 -349819 -349829 -349831 -349837 -349841 -349849 -349871 -349903 -349907 -349913 -349919 -349927 -349931 -349933 -349939 -349949 -349963 -349967 -349981 -350003 -350029 -350033 -350039 -350087 -350089 -350093 -350107 -350111 -350137 -350159 -350179 -350191 -350213 -350219 -350237 -350249 -350257 -350281 -350293 -350347 -350351 -350377 -350381 -350411 -350423 -350429 -350431 -350437 -350443 -350447 -350453 -350459 -350503 -350521 -350549 -350561 -350563 -350587 -350593 -350617 -350621 -350629 -350657 -350663 -350677 -350699 -350711 -350719 -350729 -350731 -350737 -350741 -350747 -350767 -350771 -350783 -350789 -350803 -350809 -350843 -350851 -350869 -350881 -350887 -350891 -350899 -350941 -350947 -350963 -350971 -350981 -350983 -350989 -351011 -351023 -351031 -351037 -351041 -351047 -351053 -351059 -351061 -351077 -351079 -351097 -351121 -351133 -351151 -351157 -351179 -351217 -351223 -351229 -351257 -351259 -351269 -351287 -351289 -351293 -351301 -351311 -351341 -351343 -351347 -351359 -351361 -351383 -351391 -351397 -351401 -351413 -351427 -351437 -351457 -351469 -351479 -351497 -351503 -351517 -351529 -351551 -351563 -351587 -351599 -351643 -351653 -351661 -351667 -351691 -351707 -351727 -351731 -351733 -351749 -351751 -351763 -351773 -351779 -351797 -351803 -351811 -351829 -351847 -351851 -351859 -351863 -351887 -351913 -351919 -351929 -351931 -351959 -351971 -351991 -352007 -352021 -352043 -352049 -352057 -352069 -352073 -352081 -352097 -352109 -352111 -352123 -352133 -352181 -352193 -352201 -352217 -352229 -352237 -352249 -352267 -352271 -352273 -352301 -352309 -352327 -352333 -352349 -352357 -352361 -352367 -352369 -352381 -352399 -352403 -352409 -352411 -352421 -352423 -352441 -352459 -352463 -352481 -352483 -352489 -352493 -352511 -352523 -352543 -352549 -352579 -352589 -352601 -352607 -352619 -352633 -352637 -352661 -352691 -352711 -352739 -352741 -352753 -352757 -352771 -352813 -352817 -352819 -352831 -352837 -352841 -352853 -352867 -352883 -352907 -352909 -352931 -352939 -352949 -352951 -352973 -352991 -353011 -353021 -353047 -353053 -353057 -353069 -353081 -353099 -353117 -353123 -353137 -353147 -353149 -353161 -353173 -353179 -353201 -353203 -353237 -353263 -353293 -353317 -353321 -353329 -353333 -353341 -353359 -353389 -353401 -353411 -353429 -353443 -353453 -353459 -353471 -353473 -353489 -353501 -353527 -353531 -353557 -353567 -353603 -353611 -353621 -353627 -353629 -353641 -353653 -353657 -353677 -353681 -353687 -353699 -353711 -353737 -353747 -353767 -353777 -353783 -353797 -353807 -353813 -353819 -353833 -353867 -353869 -353879 -353891 -353897 -353911 -353917 -353921 -353929 -353939 -353963 -354001 -354007 -354017 -354023 -354031 -354037 -354041 -354043 -354047 -354073 -354091 -354097 -354121 -354139 -354143 -354149 -354163 -354169 -354181 -354209 -354247 -354251 -354253 -354257 -354259 -354271 -354301 -354307 -354313 -354317 -354323 -354329 -354337 -354353 -354371 -354373 -354377 -354383 -354391 -354401 -354421 -354439 -354443 -354451 -354461 -354463 -354469 -354479 -354533 -354539 -354551 -354553 -354581 -354587 -354619 -354643 -354647 -354661 -354667 -354677 -354689 -354701 -354703 -354727 -354737 -354743 -354751 -354763 -354779 -354791 -354799 -354829 -354833 -354839 -354847 -354869 -354877 -354881 -354883 -354911 -354953 -354961 -354971 -354973 -354979 -354983 -354997 -355007 -355009 -355027 -355031 -355037 -355039 -355049 -355057 -355063 -355073 -355087 -355093 -355099 -355109 -355111 -355127 -355139 -355171 -355193 -355211 -355261 -355297 -355307 -355321 -355331 -355339 -355343 -355361 -355363 -355379 -355417 -355427 -355441 -355457 -355463 -355483 -355499 -355501 -355507 -355513 -355517 -355519 -355529 -355541 -355549 -355559 -355571 -355573 -355591 -355609 -355633 -355643 -355651 -355669 -355679 -355697 -355717 -355721 -355723 -355753 -355763 -355777 -355783 -355799 -355811 -355819 -355841 -355847 -355853 -355867 -355891 -355909 -355913 -355933 -355937 -355939 -355951 -355967 -355969 -356023 -356039 -356077 -356093 -356101 -356113 -356123 -356129 -356137 -356141 -356143 -356171 -356173 -356197 -356219 -356243 -356261 -356263 -356287 -356299 -356311 -356327 -356333 -356351 -356387 -356399 -356441 -356443 -356449 -356453 -356467 -356479 -356501 -356509 -356533 -356549 -356561 -356563 -356567 -356579 -356591 -356621 -356647 -356663 -356693 -356701 -356731 -356737 -356749 -356761 -356803 -356819 -356821 -356831 -356869 -356887 -356893 -356927 -356929 -356933 -356947 -356959 -356969 -356977 -356981 -356989 -356999 -357031 -357047 -357073 -357079 -357083 -357103 -357107 -357109 -357131 -357139 -357169 -357179 -357197 -357199 -357211 -357229 -357239 -357241 -357263 -357271 -357281 -357283 -357293 -357319 -357347 -357349 -357353 -357359 -357377 -357389 -357421 -357431 -357437 -357473 -357503 -357509 -357517 -357551 -357559 -357563 -357569 -357571 -357583 -357587 -357593 -357611 -357613 -357619 -357649 -357653 -357659 -357661 -357667 -357671 -357677 -357683 -357689 -357703 -357727 -357733 -357737 -357739 -357767 -357779 -357781 -357787 -357793 -357809 -357817 -357823 -357829 -357839 -357859 -357883 -357913 -357967 -357977 -357983 -357989 -357997 -358031 -358051 -358069 -358073 -358079 -358103 -358109 -358153 -358157 -358159 -358181 -358201 -358213 -358219 -358223 -358229 -358243 -358273 -358277 -358279 -358289 -358291 -358297 -358301 -358313 -358327 -358331 -358349 -358373 -358417 -358427 -358429 -358441 -358447 -358459 -358471 -358483 -358487 -358499 -358531 -358541 -358571 -358573 -358591 -358597 -358601 -358607 -358613 -358637 -358667 -358669 -358681 -358691 -358697 -358703 -358711 -358723 -358727 -358733 -358747 -358753 -358769 -358783 -358793 -358811 -358829 -358847 -358859 -358861 -358867 -358877 -358879 -358901 -358903 -358907 -358909 -358931 -358951 -358973 -358979 -358987 -358993 -358999 -359003 -359017 -359027 -359041 -359063 -359069 -359101 -359111 -359129 -359137 -359143 -359147 -359153 -359167 -359171 -359207 -359209 -359231 -359243 -359263 -359267 -359279 -359291 -359297 -359299 -359311 -359323 -359327 -359353 -359357 -359377 -359389 -359407 -359417 -359419 -359441 -359449 -359477 -359479 -359483 -359501 -359509 -359539 -359549 -359561 -359563 -359581 -359587 -359599 -359621 -359633 -359641 -359657 -359663 -359701 -359713 -359719 -359731 -359747 -359753 -359761 -359767 -359783 -359837 -359851 -359869 -359897 -359911 -359929 -359981 -359987 -360007 -360023 -360037 -360049 -360053 -360071 -360089 -360091 -360163 -360167 -360169 -360181 -360187 -360193 -360197 -360223 -360229 -360233 -360257 -360271 -360277 -360287 -360289 -360293 -360307 -360317 -360323 -360337 -360391 -360407 -360421 -360439 -360457 -360461 -360497 -360509 -360511 -360541 -360551 -360589 -360593 -360611 -360637 -360649 -360653 -360749 -360769 -360779 -360781 -360803 -360817 -360821 -360823 -360827 -360851 -360853 -360863 -360869 -360901 -360907 -360947 -360949 -360953 -360959 -360973 -360977 -360979 -360989 -361001 -361003 -361013 -361033 -361069 -361091 -361093 -361111 -361159 -361183 -361211 -361213 -361217 -361219 -361223 -361237 -361241 -361271 -361279 -361313 -361321 -361327 -361337 -361349 -361351 -361357 -361363 -361373 -361409 -361411 -361421 -361433 -361441 -361447 -361451 -361463 -361469 -361481 -361499 -361507 -361511 -361523 -361531 -361541 -361549 -361561 -361577 -361637 -361643 -361649 -361651 -361663 -361679 -361687 -361723 -361727 -361747 -361763 -361769 -361787 -361789 -361793 -361799 -361807 -361843 -361871 -361873 -361877 -361901 -361903 -361909 -361919 -361927 -361943 -361961 -361967 -361973 -361979 -361993 -362003 -362027 -362051 -362053 -362059 -362069 -362081 -362093 -362099 -362107 -362137 -362143 -362147 -362161 -362177 -362191 -362203 -362213 -362221 -362233 -362237 -362281 -362291 -362293 -362303 -362309 -362333 -362339 -362347 -362353 -362357 -362363 -362371 -362377 -362381 -362393 -362407 -362419 -362429 -362431 -362443 -362449 -362459 -362473 -362521 -362561 -362569 -362581 -362599 -362629 -362633 -362657 -362693 -362707 -362717 -362723 -362741 -362743 -362749 -362753 -362759 -362801 -362851 -362863 -362867 -362897 -362903 -362911 -362927 -362941 -362951 -362953 -362969 -362977 -362983 -362987 -363017 -363019 -363037 -363043 -363047 -363059 -363061 -363067 -363119 -363149 -363151 -363157 -363161 -363173 -363179 -363199 -363211 -363217 -363257 -363269 -363271 -363277 -363313 -363317 -363329 -363343 -363359 -363361 -363367 -363371 -363373 -363379 -363397 -363401 -363403 -363431 -363437 -363439 -363463 -363481 -363491 -363497 -363523 -363529 -363533 -363541 -363551 -363557 -363563 -363569 -363577 -363581 -363589 -363611 -363619 -363659 -363677 -363683 -363691 -363719 -363731 -363751 -363757 -363761 -363767 -363773 -363799 -363809 -363829 -363833 -363841 -363871 -363887 -363889 -363901 -363911 -363917 -363941 -363947 -363949 -363959 -363967 -363977 -363989 -364027 -364031 -364069 -364073 -364079 -364103 -364127 -364129 -364141 -364171 -364183 -364187 -364193 -364213 -364223 -364241 -364267 -364271 -364289 -364291 -364303 -364313 -364321 -364333 -364337 -364349 -364373 -364379 -364393 -364411 -364417 -364423 -364433 -364447 -364451 -364459 -364471 -364499 -364513 -364523 -364537 -364541 -364543 -364571 -364583 -364601 -364607 -364621 -364627 -364643 -364657 -364669 -364687 -364691 -364699 -364717 -364739 -364747 -364751 -364753 -364759 -364801 -364829 -364853 -364873 -364879 -364883 -364891 -364909 -364919 -364921 -364937 -364943 -364961 -364979 -364993 -364997 -365003 -365017 -365021 -365039 -365063 -365069 -365089 -365107 -365119 -365129 -365137 -365147 -365159 -365173 -365179 -365201 -365213 -365231 -365249 -365251 -365257 -365291 -365293 -365297 -365303 -365327 -365333 -365357 -365369 -365377 -365411 -365413 -365419 -365423 -365441 -365461 -365467 -365471 -365473 -365479 -365489 -365507 -365509 -365513 -365527 -365531 -365537 -365557 -365567 -365569 -365587 -365591 -365611 -365627 -365639 -365641 -365669 -365683 -365689 -365699 -365747 -365749 -365759 -365773 -365779 -365791 -365797 -365809 -365837 -365839 -365851 -365903 -365929 -365933 -365941 -365969 -365983 -366001 -366013 -366019 -366029 -366031 -366053 -366077 -366097 -366103 -366127 -366133 -366139 -366161 -366167 -366169 -366173 -366181 -366193 -366199 -366211 -366217 -366221 -366227 -366239 -366259 -366269 -366277 -366287 -366293 -366307 -366313 -366329 -366341 -366343 -366347 -366383 -366397 -366409 -366419 -366433 -366437 -366439 -366461 -366463 -366467 -366479 -366497 -366511 -366517 -366521 -366547 -366593 -366599 -366607 -366631 -366677 -366683 -366697 -366701 -366703 -366713 -366721 -366727 -366733 -366787 -366791 -366811 -366829 -366841 -366851 -366853 -366859 -366869 -366881 -366889 -366901 -366907 -366917 -366923 -366941 -366953 -366967 -366973 -366983 -366997 -367001 -367007 -367019 -367021 -367027 -367033 -367049 -367069 -367097 -367121 -367123 -367127 -367139 -367163 -367181 -367189 -367201 -367207 -367219 -367229 -367231 -367243 -367259 -367261 -367273 -367277 -367307 -367309 -367313 -367321 -367357 -367369 -367391 -367397 -367427 -367453 -367457 -367469 -367501 -367519 -367531 -367541 -367547 -367559 -367561 -367573 -367597 -367603 -367613 -367621 -367637 -367649 -367651 -367663 -367673 -367687 -367699 -367711 -367721 -367733 -367739 -367751 -367771 -367777 -367781 -367789 -367819 -367823 -367831 -367841 -367849 -367853 -367867 -367879 -367883 -367889 -367909 -367949 -367957 -368021 -368029 -368047 -368059 -368077 -368083 -368089 -368099 -368107 -368111 -368117 -368129 -368141 -368149 -368153 -368171 -368189 -368197 -368227 -368231 -368233 -368243 -368273 -368279 -368287 -368293 -368323 -368327 -368359 -368363 -368369 -368399 -368411 -368443 -368447 -368453 -368471 -368491 -368507 -368513 -368521 -368531 -368539 -368551 -368579 -368593 -368597 -368609 -368633 -368647 -368651 -368653 -368689 -368717 -368729 -368737 -368743 -368773 -368783 -368789 -368791 -368801 -368803 -368833 -368857 -368873 -368881 -368899 -368911 -368939 -368947 -368957 -369007 -369013 -369023 -369029 -369067 -369071 -369077 -369079 -369097 -369119 -369133 -369137 -369143 -369169 -369181 -369191 -369197 -369211 -369247 -369253 -369263 -369269 -369283 -369293 -369301 -369319 -369331 -369353 -369361 -369407 -369409 -369419 -369469 -369487 -369491 -369539 -369553 -369557 -369581 -369637 -369647 -369659 -369661 -369673 -369703 -369709 -369731 -369739 -369751 -369791 -369793 -369821 -369827 -369829 -369833 -369841 -369851 -369877 -369893 -369913 -369917 -369947 -369959 -369961 -369979 -369983 -369991 -369997 -370003 -370009 -370021 -370033 -370057 -370061 -370067 -370081 -370091 -370103 -370121 -370133 -370147 -370159 -370169 -370193 -370199 -370207 -370213 -370217 -370241 -370247 -370261 -370373 -370387 -370399 -370411 -370421 -370423 -370427 -370439 -370441 -370451 -370463 -370471 -370477 -370483 -370493 -370511 -370529 -370537 -370547 -370561 -370571 -370597 -370603 -370609 -370613 -370619 -370631 -370661 -370663 -370673 -370679 -370687 -370693 -370723 -370759 -370793 -370801 -370813 -370837 -370871 -370873 -370879 -370883 -370891 -370897 -370919 -370949 -371027 -371029 -371057 -371069 -371071 -371083 -371087 -371099 -371131 -371141 -371143 -371153 -371177 -371179 -371191 -371213 -371227 -371233 -371237 -371249 -371251 -371257 -371281 -371291 -371299 -371303 -371311 -371321 -371333 -371339 -371341 -371353 -371359 -371383 -371387 -371389 -371417 -371447 -371453 -371471 -371479 -371491 -371509 -371513 -371549 -371561 -371573 -371587 -371617 -371627 -371633 -371639 -371663 -371669 -371699 -371719 -371737 -371779 -371797 -371831 -371837 -371843 -371851 -371857 -371869 -371873 -371897 -371927 -371929 -371939 -371941 -371951 -371957 -371971 -371981 -371999 -372013 -372023 -372037 -372049 -372059 -372061 -372067 -372107 -372121 -372131 -372137 -372149 -372167 -372173 -372179 -372223 -372241 -372263 -372269 -372271 -372277 -372289 -372293 -372299 -372311 -372313 -372353 -372367 -372371 -372377 -372397 -372401 -372409 -372413 -372443 -372451 -372461 -372473 -372481 -372497 -372511 -372523 -372539 -372607 -372611 -372613 -372629 -372637 -372653 -372661 -372667 -372677 -372689 -372707 -372709 -372719 -372733 -372739 -372751 -372763 -372769 -372773 -372797 -372803 -372809 -372817 -372829 -372833 -372839 -372847 -372859 -372871 -372877 -372881 -372901 -372917 -372941 -372943 -372971 -372973 -372979 -373003 -373007 -373019 -373049 -373063 -373073 -373091 -373127 -373151 -373157 -373171 -373181 -373183 -373187 -373193 -373199 -373207 -373211 -373213 -373229 -373231 -373273 -373291 -373297 -373301 -373327 -373339 -373343 -373349 -373357 -373361 -373363 -373379 -373393 -373447 -373453 -373459 -373463 -373487 -373489 -373501 -373517 -373553 -373561 -373567 -373613 -373621 -373631 -373649 -373657 -373661 -373669 -373693 -373717 -373721 -373753 -373757 -373777 -373783 -373823 -373837 -373859 -373861 -373903 -373909 -373937 -373943 -373951 -373963 -373969 -373981 -373987 -373999 -374009 -374029 -374039 -374041 -374047 -374063 -374069 -374083 -374089 -374093 -374111 -374117 -374123 -374137 -374149 -374159 -374173 -374177 -374189 -374203 -374219 -374239 -374287 -374291 -374293 -374299 -374317 -374321 -374333 -374347 -374351 -374359 -374389 -374399 -374441 -374443 -374447 -374461 -374483 -374501 -374531 -374537 -374557 -374587 -374603 -374639 -374641 -374653 -374669 -374677 -374681 -374683 -374687 -374701 -374713 -374719 -374729 -374741 -374753 -374761 -374771 -374783 -374789 -374797 -374807 -374819 -374837 -374839 -374849 -374879 -374887 -374893 -374903 -374909 -374929 -374939 -374953 -374977 -374981 -374987 -374989 -374993 -375017 -375019 -375029 -375043 -375049 -375059 -375083 -375091 -375097 -375101 -375103 -375113 -375119 -375121 -375127 -375149 -375157 -375163 -375169 -375203 -375209 -375223 -375227 -375233 -375247 -375251 -375253 -375257 -375259 -375281 -375283 -375311 -375341 -375359 -375367 -375371 -375373 -375391 -375407 -375413 -375443 -375449 -375451 -375457 -375467 -375481 -375509 -375511 -375523 -375527 -375533 -375553 -375559 -375563 -375569 -375593 -375607 -375623 -375631 -375643 -375647 -375667 -375673 -375703 -375707 -375709 -375743 -375757 -375761 -375773 -375779 -375787 -375799 -375833 -375841 -375857 -375899 -375901 -375923 -375931 -375967 -375971 -375979 -375983 -375997 -376001 -376003 -376009 -376021 -376039 -376049 -376063 -376081 -376097 -376099 -376127 -376133 -376147 -376153 -376171 -376183 -376199 -376231 -376237 -376241 -376283 -376291 -376297 -376307 -376351 -376373 -376393 -376399 -376417 -376463 -376469 -376471 -376477 -376483 -376501 -376511 -376529 -376531 -376547 -376573 -376577 -376583 -376589 -376603 -376609 -376627 -376631 -376633 -376639 -376657 -376679 -376687 -376699 -376709 -376721 -376729 -376757 -376759 -376769 -376787 -376793 -376801 -376807 -376811 -376819 -376823 -376837 -376841 -376847 -376853 -376889 -376891 -376897 -376921 -376927 -376931 -376933 -376949 -376963 -376969 -377011 -377021 -377051 -377059 -377071 -377099 -377123 -377129 -377137 -377147 -377171 -377173 -377183 -377197 -377219 -377231 -377257 -377263 -377287 -377291 -377297 -377327 -377329 -377339 -377347 -377353 -377369 -377371 -377387 -377393 -377459 -377471 -377477 -377491 -377513 -377521 -377527 -377537 -377543 -377557 -377561 -377563 -377581 -377593 -377599 -377617 -377623 -377633 -377653 -377681 -377687 -377711 -377717 -377737 -377749 -377761 -377771 -377779 -377789 -377801 -377809 -377827 -377831 -377843 -377851 -377873 -377887 -377911 -377963 -377981 -377999 -378011 -378019 -378023 -378041 -378071 -378083 -378089 -378101 -378127 -378137 -378149 -378151 -378163 -378167 -378179 -378193 -378223 -378229 -378239 -378241 -378253 -378269 -378277 -378283 -378289 -378317 -378353 -378361 -378379 -378401 -378407 -378439 -378449 -378463 -378467 -378493 -378503 -378509 -378523 -378533 -378551 -378559 -378569 -378571 -378583 -378593 -378601 -378619 -378629 -378661 -378667 -378671 -378683 -378691 -378713 -378733 -378739 -378757 -378761 -378779 -378793 -378809 -378817 -378821 -378823 -378869 -378883 -378893 -378901 -378919 -378929 -378941 -378949 -378953 -378967 -378977 -378997 -379007 -379009 -379013 -379033 -379039 -379073 -379081 -379087 -379097 -379103 -379123 -379133 -379147 -379157 -379163 -379177 -379187 -379189 -379199 -379207 -379273 -379277 -379283 -379289 -379307 -379319 -379333 -379343 -379369 -379387 -379391 -379397 -379399 -379417 -379433 -379439 -379441 -379451 -379459 -379499 -379501 -379513 -379531 -379541 -379549 -379571 -379573 -379579 -379597 -379607 -379633 -379649 -379663 -379667 -379679 -379681 -379693 -379699 -379703 -379721 -379723 -379727 -379751 -379777 -379787 -379811 -379817 -379837 -379849 -379853 -379859 -379877 -379889 -379903 -379909 -379913 -379927 -379931 -379963 -379979 -379993 -379997 -379999 -380041 -380047 -380059 -380071 -380117 -380129 -380131 -380141 -380147 -380179 -380189 -380197 -380201 -380203 -380207 -380231 -380251 -380267 -380269 -380287 -380291 -380299 -380309 -380311 -380327 -380329 -380333 -380363 -380377 -380383 -380417 -380423 -380441 -380447 -380453 -380459 -380461 -380483 -380503 -380533 -380557 -380563 -380591 -380621 -380623 -380629 -380641 -380651 -380657 -380707 -380713 -380729 -380753 -380777 -380797 -380803 -380819 -380837 -380839 -380843 -380867 -380869 -380879 -380881 -380909 -380917 -380929 -380951 -380957 -380971 -380977 -380983 -381001 -381011 -381019 -381037 -381047 -381061 -381071 -381077 -381097 -381103 -381167 -381169 -381181 -381209 -381221 -381223 -381233 -381239 -381253 -381287 -381289 -381301 -381319 -381323 -381343 -381347 -381371 -381373 -381377 -381383 -381389 -381401 -381413 -381419 -381439 -381443 -381461 -381467 -381481 -381487 -381509 -381523 -381527 -381529 -381533 -381541 -381559 -381569 -381607 -381629 -381631 -381637 -381659 -381673 -381697 -381707 -381713 -381737 -381739 -381749 -381757 -381761 -381791 -381793 -381817 -381841 -381853 -381859 -381911 -381917 -381937 -381943 -381949 -381977 -381989 -381991 -382001 -382003 -382021 -382037 -382061 -382069 -382073 -382087 -382103 -382117 -382163 -382171 -382189 -382229 -382231 -382241 -382253 -382267 -382271 -382303 -382331 -382351 -382357 -382363 -382373 -382391 -382427 -382429 -382457 -382463 -382493 -382507 -382511 -382519 -382541 -382549 -382553 -382567 -382579 -382583 -382589 -382601 -382621 -382631 -382643 -382649 -382661 -382663 -382693 -382703 -382709 -382727 -382729 -382747 -382751 -382763 -382769 -382777 -382801 -382807 -382813 -382843 -382847 -382861 -382867 -382871 -382873 -382883 -382919 -382933 -382939 -382961 -382979 -382999 -383011 -383023 -383029 -383041 -383051 -383069 -383077 -383081 -383083 -383099 -383101 -383107 -383113 -383143 -383147 -383153 -383171 -383179 -383219 -383221 -383261 -383267 -383281 -383291 -383297 -383303 -383321 -383347 -383371 -383393 -383399 -383417 -383419 -383429 -383459 -383483 -383489 -383519 -383521 -383527 -383533 -383549 -383557 -383573 -383587 -383609 -383611 -383623 -383627 -383633 -383651 -383657 -383659 -383681 -383683 -383693 -383723 -383729 -383753 -383759 -383767 -383777 -383791 -383797 -383807 -383813 -383821 -383833 -383837 -383839 -383869 -383891 -383909 -383917 -383923 -383941 -383951 -383963 -383969 -383983 -383987 -384001 -384017 -384029 -384049 -384061 -384067 -384079 -384089 -384107 -384113 -384133 -384143 -384151 -384157 -384173 -384187 -384193 -384203 -384227 -384247 -384253 -384257 -384259 -384277 -384287 -384289 -384299 -384301 -384317 -384331 -384343 -384359 -384367 -384383 -384403 -384407 -384437 -384469 -384473 -384479 -384481 -384487 -384497 -384509 -384533 -384547 -384577 -384581 -384589 -384599 -384611 -384619 -384623 -384641 -384673 -384691 -384697 -384701 -384719 -384733 -384737 -384751 -384757 -384773 -384779 -384817 -384821 -384827 -384841 -384847 -384851 -384889 -384907 -384913 -384919 -384941 -384961 -384973 -385001 -385013 -385027 -385039 -385057 -385069 -385079 -385081 -385087 -385109 -385127 -385129 -385139 -385141 -385153 -385159 -385171 -385193 -385199 -385223 -385249 -385261 -385267 -385279 -385289 -385291 -385321 -385327 -385331 -385351 -385379 -385391 -385393 -385397 -385403 -385417 -385433 -385471 -385481 -385493 -385501 -385519 -385531 -385537 -385559 -385571 -385573 -385579 -385589 -385591 -385597 -385607 -385621 -385631 -385639 -385657 -385661 -385663 -385709 -385739 -385741 -385771 -385783 -385793 -385811 -385817 -385831 -385837 -385843 -385859 -385877 -385897 -385901 -385907 -385927 -385939 -385943 -385967 -385991 -385997 -386017 -386039 -386041 -386047 -386051 -386083 -386093 -386117 -386119 -386129 -386131 -386143 -386149 -386153 -386159 -386161 -386173 -386219 -386227 -386233 -386237 -386249 -386263 -386279 -386297 -386299 -386303 -386329 -386333 -386339 -386363 -386369 -386371 -386381 -386383 -386401 -386411 -386413 -386429 -386431 -386437 -386471 -386489 -386501 -386521 -386537 -386543 -386549 -386569 -386587 -386609 -386611 -386621 -386629 -386641 -386647 -386651 -386677 -386689 -386693 -386713 -386719 -386723 -386731 -386747 -386777 -386809 -386839 -386851 -386887 -386891 -386921 -386927 -386963 -386977 -386987 -386989 -386993 -387007 -387017 -387031 -387047 -387071 -387077 -387083 -387089 -387109 -387137 -387151 -387161 -387169 -387173 -387187 -387197 -387199 -387203 -387227 -387253 -387263 -387269 -387281 -387307 -387313 -387329 -387341 -387371 -387397 -387403 -387433 -387437 -387449 -387463 -387493 -387503 -387509 -387529 -387551 -387577 -387587 -387613 -387623 -387631 -387641 -387659 -387677 -387679 -387683 -387707 -387721 -387727 -387743 -387749 -387763 -387781 -387791 -387799 -387839 -387853 -387857 -387911 -387913 -387917 -387953 -387967 -387971 -387973 -387977 -388009 -388051 -388057 -388067 -388081 -388099 -388109 -388111 -388117 -388133 -388159 -388163 -388169 -388177 -388181 -388183 -388187 -388211 -388231 -388237 -388253 -388259 -388273 -388277 -388301 -388313 -388319 -388351 -388363 -388369 -388373 -388391 -388403 -388459 -388471 -388477 -388481 -388483 -388489 -388499 -388519 -388529 -388541 -388567 -388573 -388621 -388651 -388657 -388673 -388691 -388693 -388697 -388699 -388711 -388727 -388757 -388777 -388781 -388789 -388793 -388813 -388823 -388837 -388859 -388879 -388891 -388897 -388901 -388903 -388931 -388933 -388937 -388961 -388963 -388991 -389003 -389023 -389027 -389029 -389041 -389047 -389057 -389083 -389089 -389099 -389111 -389117 -389141 -389149 -389161 -389167 -389171 -389173 -389189 -389219 -389227 -389231 -389269 -389273 -389287 -389297 -389299 -389303 -389357 -389369 -389381 -389399 -389401 -389437 -389447 -389461 -389479 -389483 -389507 -389513 -389527 -389531 -389533 -389539 -389561 -389563 -389567 -389569 -389579 -389591 -389621 -389629 -389651 -389659 -389663 -389687 -389699 -389713 -389723 -389743 -389749 -389761 -389773 -389783 -389791 -389797 -389819 -389839 -389849 -389867 -389891 -389897 -389903 -389911 -389923 -389927 -389941 -389947 -389953 -389957 -389971 -389981 -389989 -389999 -390001 -390043 -390067 -390077 -390083 -390097 -390101 -390107 -390109 -390113 -390119 -390151 -390157 -390161 -390191 -390193 -390199 -390209 -390211 -390223 -390263 -390281 -390289 -390307 -390323 -390343 -390347 -390353 -390359 -390367 -390373 -390389 -390391 -390407 -390413 -390419 -390421 -390433 -390437 -390449 -390463 -390479 -390487 -390491 -390493 -390499 -390503 -390527 -390539 -390553 -390581 -390647 -390653 -390671 -390673 -390703 -390707 -390721 -390727 -390737 -390739 -390743 -390751 -390763 -390781 -390791 -390809 -390821 -390829 -390851 -390869 -390877 -390883 -390889 -390893 -390953 -390959 -390961 -390967 -390989 -390991 -391009 -391019 -391021 -391031 -391049 -391057 -391063 -391067 -391073 -391103 -391117 -391133 -391151 -391159 -391163 -391177 -391199 -391217 -391219 -391231 -391247 -391249 -391273 -391283 -391291 -391301 -391331 -391337 -391351 -391367 -391373 -391379 -391387 -391393 -391397 -391399 -391403 -391441 -391451 -391453 -391487 -391519 -391537 -391553 -391579 -391613 -391619 -391627 -391631 -391639 -391661 -391679 -391691 -391693 -391711 -391717 -391733 -391739 -391751 -391753 -391757 -391789 -391801 -391817 -391823 -391847 -391861 -391873 -391879 -391889 -391891 -391903 -391907 -391921 -391939 -391961 -391967 -391987 -391999 -392011 -392033 -392053 -392059 -392069 -392087 -392099 -392101 -392111 -392113 -392131 -392143 -392149 -392153 -392159 -392177 -392201 -392209 -392213 -392221 -392233 -392239 -392251 -392261 -392263 -392267 -392269 -392279 -392281 -392297 -392299 -392321 -392333 -392339 -392347 -392351 -392363 -392383 -392389 -392423 -392437 -392443 -392467 -392473 -392477 -392489 -392503 -392519 -392531 -392543 -392549 -392569 -392593 -392599 -392611 -392629 -392647 -392663 -392669 -392699 -392723 -392737 -392741 -392759 -392761 -392767 -392803 -392807 -392809 -392827 -392831 -392837 -392849 -392851 -392857 -392879 -392893 -392911 -392923 -392927 -392929 -392957 -392963 -392969 -392981 -392983 -393007 -393013 -393017 -393031 -393059 -393073 -393077 -393079 -393083 -393097 -393103 -393109 -393121 -393137 -393143 -393157 -393161 -393181 -393187 -393191 -393203 -393209 -393241 -393247 -393257 -393271 -393287 -393299 -393301 -393311 -393331 -393361 -393373 -393377 -393383 -393401 -393403 -393413 -393451 -393473 -393479 -393487 -393517 -393521 -393539 -393541 -393551 -393557 -393571 -393577 -393581 -393583 -393587 -393593 -393611 -393629 -393637 -393649 -393667 -393671 -393677 -393683 -393697 -393709 -393713 -393721 -393727 -393739 -393749 -393761 -393779 -393797 -393847 -393853 -393857 -393859 -393863 -393871 -393901 -393919 -393929 -393931 -393947 -393961 -393977 -393989 -393997 -394007 -394019 -394039 -394049 -394063 -394073 -394099 -394123 -394129 -394153 -394157 -394169 -394187 -394201 -394211 -394223 -394241 -394249 -394259 -394271 -394291 -394319 -394327 -394357 -394363 -394367 -394369 -394393 -394409 -394411 -394453 -394481 -394489 -394501 -394507 -394523 -394529 -394549 -394571 -394577 -394579 -394601 -394619 -394631 -394633 -394637 -394643 -394673 -394699 -394717 -394721 -394727 -394729 -394733 -394739 -394747 -394759 -394787 -394811 -394813 -394817 -394819 -394829 -394837 -394861 -394879 -394897 -394931 -394943 -394963 -394967 -394969 -394981 -394987 -394993 -395023 -395027 -395039 -395047 -395069 -395089 -395093 -395107 -395111 -395113 -395119 -395137 -395141 -395147 -395159 -395173 -395189 -395191 -395201 -395231 -395243 -395251 -395261 -395273 -395287 -395293 -395303 -395309 -395321 -395323 -395377 -395383 -395407 -395429 -395431 -395443 -395449 -395453 -395459 -395491 -395509 -395513 -395533 -395537 -395543 -395581 -395597 -395611 -395621 -395627 -395657 -395671 -395677 -395687 -395701 -395719 -395737 -395741 -395749 -395767 -395803 -395849 -395851 -395873 -395887 -395891 -395897 -395909 -395921 -395953 -395959 -395971 -396001 -396029 -396031 -396041 -396043 -396061 -396079 -396091 -396103 -396107 -396119 -396157 -396173 -396181 -396197 -396199 -396203 -396217 -396239 -396247 -396259 -396269 -396293 -396299 -396301 -396311 -396323 -396349 -396353 -396373 -396377 -396379 -396413 -396427 -396437 -396443 -396449 -396479 -396509 -396523 -396527 -396533 -396541 -396547 -396563 -396577 -396581 -396601 -396619 -396623 -396629 -396631 -396637 -396647 -396667 -396679 -396703 -396709 -396713 -396719 -396733 -396833 -396871 -396881 -396883 -396887 -396919 -396931 -396937 -396943 -396947 -396953 -396971 -396983 -396997 -397013 -397027 -397037 -397051 -397057 -397063 -397073 -397093 -397099 -397127 -397151 -397153 -397181 -397183 -397211 -397217 -397223 -397237 -397253 -397259 -397283 -397289 -397297 -397301 -397303 -397337 -397351 -397357 -397361 -397373 -397379 -397427 -397429 -397433 -397459 -397469 -397489 -397493 -397517 -397519 -397541 -397543 -397547 -397549 -397567 -397589 -397591 -397597 -397633 -397643 -397673 -397687 -397697 -397721 -397723 -397729 -397751 -397753 -397757 -397759 -397763 -397799 -397807 -397811 -397829 -397849 -397867 -397897 -397907 -397921 -397939 -397951 -397963 -397973 -397981 -398011 -398023 -398029 -398033 -398039 -398053 -398059 -398063 -398077 -398087 -398113 -398117 -398119 -398129 -398143 -398149 -398171 -398207 -398213 -398219 -398227 -398249 -398261 -398267 -398273 -398287 -398303 -398311 -398323 -398339 -398341 -398347 -398353 -398357 -398369 -398393 -398407 -398417 -398423 -398441 -398459 -398467 -398471 -398473 -398477 -398491 -398509 -398539 -398543 -398549 -398557 -398569 -398581 -398591 -398609 -398611 -398621 -398627 -398669 -398681 -398683 -398693 -398711 -398729 -398731 -398759 -398771 -398813 -398819 -398821 -398833 -398857 -398863 -398887 -398903 -398917 -398921 -398933 -398941 -398969 -398977 -398989 -399023 -399031 -399043 -399059 -399067 -399071 -399079 -399097 -399101 -399107 -399131 -399137 -399149 -399151 -399163 -399173 -399181 -399197 -399221 -399227 -399239 -399241 -399263 -399271 -399277 -399281 -399283 -399353 -399379 -399389 -399391 -399401 -399403 -399409 -399433 -399439 -399473 -399481 -399491 -399493 -399499 -399523 -399527 -399541 -399557 -399571 -399577 -399583 -399587 -399601 -399613 -399617 -399643 -399647 -399667 -399677 -399689 -399691 -399719 -399727 -399731 -399739 -399757 -399761 -399769 -399781 -399787 -399793 -399851 -399853 -399871 -399887 -399899 -399911 -399913 -399937 -399941 -399953 -399979 -399983 -399989 -400009 -400031 -400033 -400051 -400067 -400069 -400087 -400093 -400109 -400123 -400151 -400157 -400187 -400199 -400207 -400217 -400237 -400243 -400247 -400249 -400261 -400277 -400291 -400297 -400307 -400313 -400321 -400331 -400339 -400381 -400391 -400409 -400417 -400429 -400441 -400457 -400471 -400481 -400523 -400559 -400579 -400597 -400601 -400607 -400619 -400643 -400651 -400657 -400679 -400681 -400703 -400711 -400721 -400723 -400739 -400753 -400759 -400823 -400837 -400849 -400853 -400859 -400871 -400903 -400927 -400931 -400943 -400949 -400963 -400997 -401017 -401029 -401039 -401053 -401057 -401069 -401077 -401087 -401101 -401113 -401119 -401161 -401173 -401179 -401201 -401209 -401231 -401237 -401243 -401279 -401287 -401309 -401311 -401321 -401329 -401341 -401347 -401371 -401381 -401393 -401407 -401411 -401417 -401473 -401477 -401507 -401519 -401537 -401539 -401551 -401567 -401587 -401593 -401627 -401629 -401651 -401669 -401671 -401689 -401707 -401711 -401743 -401771 -401773 -401809 -401813 -401827 -401839 -401861 -401867 -401887 -401903 -401909 -401917 -401939 -401953 -401957 -401959 -401981 -401987 -401993 -402023 -402029 -402037 -402043 -402049 -402053 -402071 -402089 -402091 -402107 -402131 -402133 -402137 -402139 -402197 -402221 -402223 -402239 -402253 -402263 -402277 -402299 -402307 -402313 -402329 -402331 -402341 -402343 -402359 -402361 -402371 -402379 -402383 -402403 -402419 -402443 -402487 -402503 -402511 -402517 -402527 -402529 -402541 -402551 -402559 -402581 -402583 -402587 -402593 -402601 -402613 -402631 -402691 -402697 -402739 -402751 -402757 -402761 -402763 -402767 -402769 -402797 -402803 -402817 -402823 -402847 -402851 -402859 -402863 -402869 -402881 -402923 -402943 -402947 -402949 -402991 -403001 -403003 -403037 -403043 -403049 -403057 -403061 -403063 -403079 -403097 -403103 -403133 -403141 -403159 -403163 -403181 -403219 -403241 -403243 -403253 -403261 -403267 -403289 -403301 -403309 -403327 -403331 -403339 -403363 -403369 -403387 -403391 -403433 -403439 -403483 -403499 -403511 -403537 -403547 -403549 -403553 -403567 -403577 -403591 -403603 -403607 -403621 -403649 -403661 -403679 -403681 -403687 -403703 -403717 -403721 -403729 -403757 -403783 -403787 -403817 -403829 -403831 -403849 -403861 -403867 -403877 -403889 -403901 -403933 -403951 -403957 -403969 -403979 -403981 -403993 -404009 -404011 -404017 -404021 -404029 -404051 -404081 -404099 -404113 -404119 -404123 -404161 -404167 -404177 -404189 -404191 -404197 -404213 -404221 -404249 -404251 -404267 -404269 -404273 -404291 -404309 -404321 -404323 -404357 -404381 -404387 -404389 -404399 -404419 -404423 -404429 -404431 -404449 -404461 -404483 -404489 -404497 -404507 -404513 -404527 -404531 -404533 -404539 -404557 -404597 -404671 -404693 -404699 -404713 -404773 -404779 -404783 -404819 -404827 -404837 -404843 -404849 -404851 -404941 -404951 -404959 -404969 -404977 -404981 -404983 -405001 -405011 -405029 -405037 -405047 -405049 -405071 -405073 -405089 -405091 -405143 -405157 -405179 -405199 -405211 -405221 -405227 -405239 -405241 -405247 -405253 -405269 -405277 -405287 -405299 -405323 -405341 -405343 -405347 -405373 -405401 -405407 -405413 -405437 -405439 -405473 -405487 -405491 -405497 -405499 -405521 -405527 -405529 -405541 -405553 -405577 -405599 -405607 -405611 -405641 -405659 -405667 -405677 -405679 -405683 -405689 -405701 -405703 -405709 -405719 -405731 -405749 -405763 -405767 -405781 -405799 -405817 -405827 -405829 -405857 -405863 -405869 -405871 -405893 -405901 -405917 -405947 -405949 -405959 -405967 -405989 -405991 -405997 -406013 -406027 -406037 -406067 -406073 -406093 -406117 -406123 -406169 -406171 -406177 -406183 -406207 -406247 -406253 -406267 -406271 -406309 -406313 -406327 -406331 -406339 -406349 -406361 -406381 -406397 -406403 -406423 -406447 -406481 -406499 -406501 -406507 -406513 -406517 -406531 -406547 -406559 -406561 -406573 -406577 -406579 -406583 -406591 -406631 -406633 -406649 -406661 -406673 -406697 -406699 -406717 -406729 -406739 -406789 -406807 -406811 -406817 -406837 -406859 -406873 -406883 -406907 -406951 -406969 -406981 -406993 -407023 -407047 -407059 -407083 -407119 -407137 -407149 -407153 -407177 -407179 -407191 -407203 -407207 -407219 -407221 -407233 -407249 -407257 -407263 -407273 -407287 -407291 -407299 -407311 -407317 -407321 -407347 -407357 -407359 -407369 -407377 -407383 -407401 -407437 -407471 -407483 -407489 -407501 -407503 -407509 -407521 -407527 -407567 -407573 -407579 -407587 -407599 -407621 -407633 -407639 -407651 -407657 -407669 -407699 -407707 -407713 -407717 -407723 -407741 -407747 -407783 -407789 -407791 -407801 -407807 -407821 -407833 -407843 -407857 -407861 -407879 -407893 -407899 -407917 -407923 -407947 -407959 -407969 -407971 -407977 -407993 -408011 -408019 -408041 -408049 -408071 -408077 -408091 -408127 -408131 -408137 -408169 -408173 -408197 -408203 -408209 -408211 -408217 -408223 -408229 -408241 -408251 -408263 -408271 -408283 -408311 -408337 -408341 -408347 -408361 -408379 -408389 -408403 -408413 -408427 -408431 -408433 -408437 -408461 -408469 -408479 -408491 -408497 -408533 -408539 -408553 -408563 -408607 -408623 -408631 -408637 -408643 -408659 -408677 -408689 -408691 -408701 -408703 -408713 -408719 -408743 -408763 -408769 -408773 -408787 -408803 -408809 -408817 -408841 -408857 -408869 -408911 -408913 -408923 -408943 -408953 -408959 -408971 -408979 -408997 -409007 -409021 -409027 -409033 -409043 -409063 -409069 -409081 -409099 -409121 -409153 -409163 -409177 -409187 -409217 -409237 -409259 -409261 -409267 -409271 -409289 -409291 -409327 -409333 -409337 -409349 -409351 -409369 -409379 -409391 -409397 -409429 -409433 -409441 -409463 -409471 -409477 -409483 -409499 -409517 -409523 -409529 -409543 -409573 -409579 -409589 -409597 -409609 -409639 -409657 -409691 -409693 -409709 -409711 -409723 -409729 -409733 -409753 -409769 -409777 -409781 -409813 -409817 -409823 -409831 -409841 -409861 -409867 -409879 -409889 -409891 -409897 -409901 -409909 -409933 -409943 -409951 -409961 -409967 -409987 -409993 -409999 -410009 -410029 -410063 -410087 -410093 -410117 -410119 -410141 -410143 -410149 -410171 -410173 -410203 -410231 -410233 -410239 -410243 -410257 -410279 -410281 -410299 -410317 -410323 -410339 -410341 -410353 -410359 -410383 -410387 -410393 -410401 -410411 -410413 -410453 -410461 -410477 -410489 -410491 -410497 -410507 -410513 -410519 -410551 -410561 -410587 -410617 -410621 -410623 -410629 -410651 -410659 -410671 -410687 -410701 -410717 -410731 -410741 -410747 -410749 -410759 -410783 -410789 -410801 -410807 -410819 -410833 -410857 -410899 -410903 -410929 -410953 -410983 -410999 -411001 -411007 -411011 -411013 -411031 -411041 -411049 -411067 -411071 -411083 -411101 -411113 -411119 -411127 -411143 -411157 -411167 -411193 -411197 -411211 -411233 -411241 -411251 -411253 -411259 -411287 -411311 -411337 -411347 -411361 -411371 -411379 -411409 -411421 -411443 -411449 -411469 -411473 -411479 -411491 -411503 -411527 -411529 -411557 -411563 -411569 -411577 -411583 -411589 -411611 -411613 -411617 -411637 -411641 -411667 -411679 -411683 -411703 -411707 -411709 -411721 -411727 -411737 -411739 -411743 -411751 -411779 -411799 -411809 -411821 -411823 -411833 -411841 -411883 -411919 -411923 -411937 -411941 -411947 -411967 -411991 -412001 -412007 -412019 -412031 -412033 -412037 -412039 -412051 -412067 -412073 -412081 -412099 -412109 -412123 -412127 -412133 -412147 -412157 -412171 -412187 -412189 -412193 -412201 -412211 -412213 -412219 -412249 -412253 -412273 -412277 -412289 -412303 -412333 -412339 -412343 -412387 -412397 -412411 -412457 -412463 -412481 -412487 -412493 -412537 -412561 -412567 -412571 -412589 -412591 -412603 -412609 -412619 -412627 -412637 -412639 -412651 -412663 -412667 -412717 -412739 -412771 -412793 -412807 -412831 -412849 -412859 -412891 -412901 -412903 -412939 -412943 -412949 -412967 -412987 -413009 -413027 -413033 -413053 -413069 -413071 -413081 -413087 -413089 -413093 -413111 -413113 -413129 -413141 -413143 -413159 -413167 -413183 -413197 -413201 -413207 -413233 -413243 -413251 -413263 -413267 -413293 -413299 -413353 -413411 -413417 -413429 -413443 -413461 -413477 -413521 -413527 -413533 -413537 -413551 -413557 -413579 -413587 -413597 -413629 -413653 -413681 -413683 -413689 -413711 -413713 -413719 -413737 -413753 -413759 -413779 -413783 -413807 -413827 -413849 -413863 -413867 -413869 -413879 -413887 -413911 -413923 -413951 -413981 -414013 -414017 -414019 -414031 -414049 -414053 -414061 -414077 -414083 -414097 -414101 -414107 -414109 -414131 -414157 -414179 -414199 -414203 -414209 -414217 -414221 -414241 -414259 -414269 -414277 -414283 -414311 -414313 -414329 -414331 -414347 -414361 -414367 -414383 -414389 -414397 -414413 -414431 -414433 -414451 -414457 -414461 -414467 -414487 -414503 -414521 -414539 -414553 -414559 -414571 -414577 -414607 -414611 -414629 -414641 -414643 -414653 -414677 -414679 -414683 -414691 -414697 -414703 -414707 -414709 -414721 -414731 -414737 -414763 -414767 -414769 -414773 -414779 -414793 -414803 -414809 -414833 -414857 -414871 -414889 -414893 -414899 -414913 -414923 -414929 -414949 -414959 -414971 -414977 -414991 -415013 -415031 -415039 -415061 -415069 -415073 -415087 -415097 -415109 -415111 -415133 -415141 -415147 -415153 -415159 -415171 -415187 -415189 -415201 -415213 -415231 -415253 -415271 -415273 -415319 -415343 -415379 -415381 -415391 -415409 -415427 -415447 -415469 -415477 -415489 -415507 -415517 -415523 -415543 -415553 -415559 -415567 -415577 -415603 -415607 -415609 -415627 -415631 -415643 -415651 -415661 -415669 -415673 -415687 -415691 -415697 -415717 -415721 -415729 -415759 -415783 -415787 -415799 -415801 -415819 -415823 -415861 -415873 -415879 -415901 -415931 -415937 -415949 -415951 -415957 -415963 -415969 -415979 -415993 -415999 -416011 -416023 -416071 -416077 -416089 -416107 -416147 -416149 -416153 -416159 -416167 -416201 -416219 -416239 -416243 -416249 -416257 -416263 -416281 -416291 -416333 -416359 -416387 -416389 -416393 -416399 -416401 -416407 -416413 -416417 -416419 -416441 -416443 -416459 -416473 -416477 -416491 -416497 -416501 -416503 -416513 -416531 -416543 -416573 -416579 -416593 -416621 -416623 -416629 -416659 -416677 -416693 -416719 -416761 -416797 -416821 -416833 -416839 -416849 -416851 -416873 -416881 -416887 -416947 -416957 -416963 -416989 -417007 -417017 -417019 -417023 -417037 -417089 -417097 -417113 -417119 -417127 -417133 -417161 -417169 -417173 -417181 -417187 -417191 -417203 -417217 -417227 -417239 -417251 -417271 -417283 -417293 -417311 -417317 -417331 -417337 -417371 -417377 -417379 -417383 -417419 -417437 -417451 -417457 -417479 -417491 -417493 -417509 -417511 -417523 -417541 -417553 -417559 -417577 -417581 -417583 -417617 -417623 -417631 -417643 -417649 -417671 -417691 -417719 -417721 -417727 -417731 -417733 -417737 -417751 -417763 -417773 -417793 -417811 -417821 -417839 -417863 -417869 -417881 -417883 -417899 -417931 -417941 -417947 -417953 -417959 -417961 -417983 -417997 -418007 -418009 -418027 -418031 -418043 -418051 -418069 -418073 -418079 -418087 -418109 -418129 -418157 -418169 -418177 -418181 -418189 -418199 -418207 -418219 -418259 -418273 -418279 -418289 -418303 -418321 -418331 -418337 -418339 -418343 -418349 -418351 -418357 -418373 -418381 -418391 -418423 -418427 -418447 -418459 -418471 -418493 -418511 -418553 -418559 -418597 -418601 -418603 -418631 -418633 -418637 -418657 -418667 -418699 -418709 -418721 -418739 -418751 -418763 -418771 -418783 -418787 -418793 -418799 -418811 -418813 -418819 -418837 -418843 -418849 -418861 -418867 -418871 -418883 -418889 -418909 -418921 -418927 -418933 -418939 -418961 -418981 -418987 -418993 -418997 -419047 -419051 -419053 -419057 -419059 -419087 -419141 -419147 -419161 -419171 -419183 -419189 -419191 -419201 -419231 -419249 -419261 -419281 -419291 -419297 -419303 -419317 -419329 -419351 -419383 -419401 -419417 -419423 -419429 -419443 -419449 -419459 -419467 -419473 -419477 -419483 -419491 -419513 -419527 -419537 -419557 -419561 -419563 -419567 -419579 -419591 -419597 -419599 -419603 -419609 -419623 -419651 -419687 -419693 -419701 -419711 -419743 -419753 -419777 -419789 -419791 -419801 -419803 -419821 -419827 -419831 -419873 -419893 -419921 -419927 -419929 -419933 -419953 -419959 -419999 -420001 -420029 -420037 -420041 -420047 -420073 -420097 -420103 -420149 -420163 -420191 -420193 -420221 -420241 -420253 -420263 -420269 -420271 -420293 -420307 -420313 -420317 -420319 -420323 -420331 -420341 -420349 -420353 -420361 -420367 -420383 -420397 -420419 -420421 -420439 -420457 -420467 -420479 -420481 -420499 -420503 -420521 -420551 -420557 -420569 -420571 -420593 -420599 -420613 -420671 -420677 -420683 -420691 -420731 -420737 -420743 -420757 -420769 -420779 -420781 -420799 -420803 -420809 -420811 -420851 -420853 -420857 -420859 -420899 -420919 -420929 -420941 -420967 -420977 -420997 -421009 -421019 -421033 -421037 -421049 -421079 -421081 -421093 -421103 -421121 -421123 -421133 -421147 -421159 -421163 -421177 -421181 -421189 -421207 -421241 -421273 -421279 -421303 -421313 -421331 -421339 -421349 -421361 -421381 -421397 -421409 -421417 -421423 -421433 -421453 -421459 -421469 -421471 -421483 -421493 -421501 -421517 -421559 -421607 -421609 -421621 -421633 -421639 -421643 -421657 -421661 -421691 -421697 -421699 -421703 -421709 -421711 -421717 -421727 -421739 -421741 -421783 -421801 -421807 -421831 -421847 -421891 -421907 -421913 -421943 -421973 -421987 -421997 -422029 -422041 -422057 -422063 -422069 -422077 -422083 -422087 -422089 -422099 -422101 -422111 -422113 -422129 -422137 -422141 -422183 -422203 -422209 -422231 -422239 -422243 -422249 -422267 -422287 -422291 -422309 -422311 -422321 -422339 -422353 -422363 -422369 -422377 -422393 -422407 -422431 -422453 -422459 -422479 -422537 -422549 -422551 -422557 -422563 -422567 -422573 -422581 -422621 -422627 -422657 -422689 -422701 -422707 -422711 -422749 -422753 -422759 -422761 -422789 -422797 -422803 -422827 -422857 -422861 -422867 -422869 -422879 -422881 -422893 -422897 -422899 -422911 -422923 -422927 -422969 -422987 -423001 -423013 -423019 -423043 -423053 -423061 -423067 -423083 -423091 -423097 -423103 -423109 -423121 -423127 -423133 -423173 -423179 -423191 -423209 -423221 -423229 -423233 -423251 -423257 -423259 -423277 -423281 -423287 -423289 -423299 -423307 -423323 -423341 -423347 -423389 -423403 -423413 -423427 -423431 -423439 -423457 -423461 -423463 -423469 -423481 -423497 -423503 -423509 -423541 -423547 -423557 -423559 -423581 -423587 -423601 -423617 -423649 -423667 -423697 -423707 -423713 -423727 -423749 -423751 -423763 -423769 -423779 -423781 -423791 -423803 -423823 -423847 -423853 -423859 -423869 -423883 -423887 -423931 -423949 -423961 -423977 -423989 -423991 -424001 -424003 -424007 -424019 -424027 -424037 -424079 -424091 -424093 -424103 -424117 -424121 -424129 -424139 -424147 -424157 -424163 -424169 -424187 -424199 -424223 -424231 -424243 -424247 -424261 -424267 -424271 -424273 -424313 -424331 -424339 -424343 -424351 -424397 -424423 -424429 -424433 -424451 -424471 -424481 -424493 -424519 -424537 -424547 -424549 -424559 -424573 -424577 -424597 -424601 -424639 -424661 -424667 -424679 -424687 -424693 -424709 -424727 -424729 -424757 -424769 -424771 -424777 -424811 -424817 -424819 -424829 -424841 -424843 -424849 -424861 -424867 -424889 -424891 -424903 -424909 -424913 -424939 -424961 -424967 -424997 -425003 -425027 -425039 -425057 -425059 -425071 -425083 -425101 -425107 -425123 -425147 -425149 -425189 -425197 -425207 -425233 -425237 -425251 -425273 -425279 -425281 -425291 -425297 -425309 -425317 -425329 -425333 -425363 -425377 -425387 -425393 -425417 -425419 -425423 -425441 -425443 -425471 -425473 -425489 -425501 -425519 -425521 -425533 -425549 -425563 -425591 -425603 -425609 -425641 -425653 -425681 -425701 -425713 -425779 -425783 -425791 -425801 -425813 -425819 -425837 -425839 -425851 -425857 -425861 -425869 -425879 -425899 -425903 -425911 -425939 -425959 -425977 -425987 -425989 -426007 -426011 -426061 -426073 -426077 -426089 -426091 -426103 -426131 -426161 -426163 -426193 -426197 -426211 -426229 -426233 -426253 -426287 -426301 -426311 -426319 -426331 -426353 -426383 -426389 -426401 -426407 -426421 -426427 -426469 -426487 -426527 -426541 -426551 -426553 -426563 -426583 -426611 -426631 -426637 -426641 -426661 -426691 -426697 -426707 -426709 -426731 -426737 -426739 -426743 -426757 -426761 -426763 -426773 -426779 -426787 -426799 -426841 -426859 -426863 -426871 -426889 -426893 -426913 -426917 -426919 -426931 -426941 -426971 -426973 -426997 -427001 -427013 -427039 -427043 -427067 -427069 -427073 -427079 -427081 -427103 -427117 -427151 -427169 -427181 -427213 -427237 -427241 -427243 -427247 -427249 -427279 -427283 -427307 -427309 -427327 -427333 -427351 -427369 -427379 -427381 -427403 -427417 -427421 -427423 -427429 -427433 -427439 -427447 -427451 -427457 -427477 -427513 -427517 -427523 -427529 -427541 -427579 -427591 -427597 -427619 -427621 -427681 -427711 -427717 -427723 -427727 -427733 -427751 -427781 -427787 -427789 -427813 -427849 -427859 -427877 -427879 -427883 -427913 -427919 -427939 -427949 -427951 -427957 -427967 -427969 -427991 -427993 -427997 -428003 -428023 -428027 -428033 -428039 -428041 -428047 -428083 -428093 -428137 -428143 -428147 -428149 -428161 -428167 -428173 -428177 -428221 -428227 -428231 -428249 -428251 -428273 -428297 -428299 -428303 -428339 -428353 -428369 -428401 -428411 -428429 -428471 -428473 -428489 -428503 -428509 -428531 -428539 -428551 -428557 -428563 -428567 -428569 -428579 -428629 -428633 -428639 -428657 -428663 -428671 -428677 -428683 -428693 -428731 -428741 -428759 -428777 -428797 -428801 -428807 -428809 -428833 -428843 -428851 -428863 -428873 -428899 -428951 -428957 -428977 -429007 -429017 -429043 -429083 -429101 -429109 -429119 -429127 -429137 -429139 -429161 -429181 -429197 -429211 -429217 -429223 -429227 -429241 -429259 -429271 -429277 -429281 -429283 -429329 -429347 -429349 -429361 -429367 -429389 -429397 -429409 -429413 -429427 -429431 -429449 -429463 -429467 -429469 -429487 -429497 -429503 -429509 -429511 -429521 -429529 -429547 -429551 -429563 -429581 -429587 -429589 -429599 -429631 -429643 -429659 -429661 -429673 -429677 -429679 -429683 -429701 -429719 -429727 -429731 -429733 -429773 -429791 -429797 -429817 -429823 -429827 -429851 -429853 -429881 -429887 -429889 -429899 -429901 -429907 -429911 -429917 -429929 -429931 -429937 -429943 -429953 -429971 -429973 -429991 -430007 -430009 -430013 -430019 -430057 -430061 -430081 -430091 -430093 -430121 -430139 -430147 -430193 -430259 -430267 -430277 -430279 -430289 -430303 -430319 -430333 -430343 -430357 -430393 -430411 -430427 -430433 -430453 -430487 -430499 -430511 -430513 -430517 -430543 -430553 -430571 -430579 -430589 -430601 -430603 -430649 -430663 -430691 -430697 -430699 -430709 -430723 -430739 -430741 -430747 -430751 -430753 -430769 -430783 -430789 -430799 -430811 -430819 -430823 -430841 -430847 -430861 -430873 -430879 -430883 -430891 -430897 -430907 -430909 -430921 -430949 -430957 -430979 -430981 -430987 -430999 -431017 -431021 -431029 -431047 -431051 -431063 -431077 -431083 -431099 -431107 -431141 -431147 -431153 -431173 -431191 -431203 -431213 -431219 -431237 -431251 -431257 -431267 -431269 -431287 -431297 -431311 -431329 -431339 -431363 -431369 -431377 -431381 -431399 -431423 -431429 -431441 -431447 -431449 -431479 -431513 -431521 -431533 -431567 -431581 -431597 -431603 -431611 -431617 -431621 -431657 -431659 -431663 -431671 -431693 -431707 -431729 -431731 -431759 -431777 -431797 -431801 -431803 -431807 -431831 -431833 -431857 -431863 -431867 -431869 -431881 -431887 -431891 -431903 -431911 -431929 -431933 -431947 -431983 -431993 -432001 -432007 -432023 -432031 -432037 -432043 -432053 -432059 -432067 -432073 -432097 -432121 -432137 -432139 -432143 -432149 -432161 -432163 -432167 -432199 -432203 -432227 -432241 -432251 -432277 -432281 -432287 -432301 -432317 -432323 -432337 -432343 -432349 -432359 -432373 -432389 -432391 -432401 -432413 -432433 -432437 -432449 -432457 -432479 -432491 -432499 -432503 -432511 -432527 -432539 -432557 -432559 -432569 -432577 -432587 -432589 -432613 -432631 -432637 -432659 -432661 -432713 -432721 -432727 -432737 -432743 -432749 -432781 -432793 -432797 -432799 -432833 -432847 -432857 -432869 -432893 -432907 -432923 -432931 -432959 -432961 -432979 -432983 -432989 -433003 -433033 -433049 -433051 -433061 -433073 -433079 -433087 -433093 -433099 -433117 -433123 -433141 -433151 -433187 -433193 -433201 -433207 -433229 -433241 -433249 -433253 -433259 -433261 -433267 -433271 -433291 -433309 -433319 -433337 -433351 -433357 -433361 -433369 -433373 -433393 -433399 -433421 -433429 -433439 -433453 -433469 -433471 -433501 -433507 -433513 -433549 -433571 -433577 -433607 -433627 -433633 -433639 -433651 -433661 -433663 -433673 -433679 -433681 -433703 -433723 -433729 -433747 -433759 -433777 -433781 -433787 -433813 -433817 -433847 -433859 -433861 -433877 -433883 -433889 -433931 -433943 -433963 -433967 -433981 -434009 -434011 -434029 -434039 -434081 -434087 -434107 -434111 -434113 -434117 -434141 -434167 -434179 -434191 -434201 -434209 -434221 -434237 -434243 -434249 -434261 -434267 -434293 -434297 -434303 -434311 -434323 -434347 -434353 -434363 -434377 -434383 -434387 -434389 -434407 -434411 -434431 -434437 -434459 -434461 -434471 -434479 -434501 -434509 -434521 -434561 -434563 -434573 -434593 -434597 -434611 -434647 -434659 -434683 -434689 -434699 -434717 -434719 -434743 -434761 -434783 -434803 -434807 -434813 -434821 -434827 -434831 -434839 -434849 -434857 -434867 -434873 -434881 -434909 -434921 -434923 -434927 -434933 -434939 -434947 -434957 -434963 -434977 -434981 -434989 -435037 -435041 -435059 -435103 -435107 -435109 -435131 -435139 -435143 -435151 -435161 -435179 -435181 -435187 -435191 -435221 -435223 -435247 -435257 -435263 -435277 -435283 -435287 -435307 -435317 -435343 -435349 -435359 -435371 -435397 -435401 -435403 -435419 -435427 -435437 -435439 -435451 -435481 -435503 -435529 -435541 -435553 -435559 -435563 -435569 -435571 -435577 -435583 -435593 -435619 -435623 -435637 -435641 -435647 -435649 -435653 -435661 -435679 -435709 -435731 -435733 -435739 -435751 -435763 -435769 -435779 -435817 -435839 -435847 -435857 -435859 -435881 -435889 -435893 -435907 -435913 -435923 -435947 -435949 -435973 -435983 -435997 -436003 -436013 -436027 -436061 -436081 -436087 -436091 -436097 -436127 -436147 -436151 -436157 -436171 -436181 -436217 -436231 -436253 -436273 -436279 -436283 -436291 -436307 -436309 -436313 -436343 -436357 -436399 -436417 -436427 -436439 -436459 -436463 -436477 -436481 -436483 -436507 -436523 -436529 -436531 -436547 -436549 -436571 -436591 -436607 -436621 -436627 -436649 -436651 -436673 -436687 -436693 -436717 -436727 -436729 -436739 -436741 -436757 -436801 -436811 -436819 -436831 -436841 -436853 -436871 -436889 -436913 -436957 -436963 -436967 -436973 -436979 -436993 -436999 -437011 -437033 -437071 -437077 -437083 -437093 -437111 -437113 -437137 -437141 -437149 -437153 -437159 -437191 -437201 -437219 -437237 -437243 -437263 -437273 -437279 -437287 -437293 -437321 -437351 -437357 -437363 -437387 -437389 -437401 -437413 -437467 -437471 -437473 -437497 -437501 -437509 -437519 -437527 -437533 -437539 -437543 -437557 -437587 -437629 -437641 -437651 -437653 -437677 -437681 -437687 -437693 -437719 -437729 -437743 -437753 -437771 -437809 -437819 -437837 -437849 -437861 -437867 -437881 -437909 -437923 -437947 -437953 -437959 -437977 -438001 -438017 -438029 -438047 -438049 -438091 -438131 -438133 -438143 -438169 -438203 -438211 -438223 -438233 -438241 -438253 -438259 -438271 -438281 -438287 -438301 -438313 -438329 -438341 -438377 -438391 -438401 -438409 -438419 -438439 -438443 -438467 -438479 -438499 -438517 -438521 -438523 -438527 -438533 -438551 -438569 -438589 -438601 -438611 -438623 -438631 -438637 -438661 -438667 -438671 -438701 -438707 -438721 -438733 -438761 -438769 -438793 -438827 -438829 -438833 -438847 -438853 -438869 -438877 -438887 -438899 -438913 -438937 -438941 -438953 -438961 -438967 -438979 -438983 -438989 -439007 -439009 -439063 -439081 -439123 -439133 -439141 -439157 -439163 -439171 -439183 -439199 -439217 -439253 -439273 -439279 -439289 -439303 -439339 -439349 -439357 -439367 -439381 -439409 -439421 -439427 -439429 -439441 -439459 -439463 -439471 -439493 -439511 -439519 -439541 -439559 -439567 -439573 -439577 -439583 -439601 -439613 -439631 -439639 -439661 -439667 -439687 -439693 -439697 -439709 -439723 -439729 -439753 -439759 -439763 -439771 -439781 -439787 -439799 -439811 -439823 -439849 -439853 -439861 -439867 -439883 -439891 -439903 -439919 -439949 -439961 -439969 -439973 -439981 -439991 -440009 -440023 -440039 -440047 -440087 -440093 -440101 -440131 -440159 -440171 -440177 -440179 -440183 -440203 -440207 -440221 -440227 -440239 -440261 -440269 -440281 -440303 -440311 -440329 -440333 -440339 -440347 -440371 -440383 -440389 -440393 -440399 -440431 -440441 -440443 -440471 -440497 -440501 -440507 -440509 -440527 -440537 -440543 -440549 -440551 -440567 -440569 -440579 -440581 -440641 -440651 -440653 -440669 -440677 -440681 -440683 -440711 -440717 -440723 -440731 -440753 -440761 -440773 -440807 -440809 -440821 -440831 -440849 -440863 -440893 -440903 -440911 -440939 -440941 -440953 -440959 -440983 -440987 -440989 -441011 -441029 -441041 -441043 -441053 -441073 -441079 -441101 -441107 -441109 -441113 -441121 -441127 -441157 -441169 -441179 -441187 -441191 -441193 -441229 -441247 -441251 -441257 -441263 -441281 -441307 -441319 -441349 -441359 -441361 -441403 -441421 -441443 -441449 -441461 -441479 -441499 -441517 -441523 -441527 -441547 -441557 -441563 -441569 -441587 -441607 -441613 -441619 -441631 -441647 -441667 -441697 -441703 -441713 -441737 -441751 -441787 -441797 -441799 -441811 -441827 -441829 -441839 -441841 -441877 -441887 -441907 -441913 -441923 -441937 -441953 -441971 -442003 -442007 -442009 -442019 -442027 -442031 -442033 -442061 -442069 -442097 -442109 -442121 -442139 -442147 -442151 -442157 -442171 -442177 -442181 -442193 -442201 -442207 -442217 -442229 -442237 -442243 -442271 -442283 -442291 -442319 -442327 -442333 -442363 -442367 -442397 -442399 -442439 -442447 -442457 -442469 -442487 -442489 -442499 -442501 -442517 -442531 -442537 -442571 -442573 -442577 -442579 -442601 -442609 -442619 -442633 -442691 -442699 -442703 -442721 -442733 -442747 -442753 -442763 -442769 -442777 -442781 -442789 -442807 -442817 -442823 -442829 -442831 -442837 -442843 -442861 -442879 -442903 -442919 -442961 -442963 -442973 -442979 -442987 -442991 -442997 -443011 -443017 -443039 -443041 -443057 -443059 -443063 -443077 -443089 -443117 -443123 -443129 -443147 -443153 -443159 -443161 -443167 -443171 -443189 -443203 -443221 -443227 -443231 -443237 -443243 -443249 -443263 -443273 -443281 -443291 -443293 -443341 -443347 -443353 -443363 -443369 -443389 -443407 -443413 -443419 -443423 -443431 -443437 -443453 -443467 -443489 -443501 -443533 -443543 -443551 -443561 -443563 -443567 -443587 -443591 -443603 -443609 -443629 -443659 -443687 -443689 -443701 -443711 -443731 -443749 -443753 -443759 -443761 -443771 -443777 -443791 -443837 -443851 -443867 -443869 -443873 -443879 -443881 -443893 -443899 -443909 -443917 -443939 -443941 -443953 -443983 -443987 -443999 -444001 -444007 -444029 -444043 -444047 -444079 -444089 -444109 -444113 -444121 -444127 -444131 -444151 -444167 -444173 -444179 -444181 -444187 -444209 -444253 -444271 -444281 -444287 -444289 -444293 -444307 -444341 -444343 -444347 -444349 -444401 -444403 -444421 -444443 -444449 -444461 -444463 -444469 -444473 -444487 -444517 -444523 -444527 -444529 -444539 -444547 -444553 -444557 -444569 -444589 -444607 -444623 -444637 -444641 -444649 -444671 -444677 -444701 -444713 -444739 -444767 -444791 -444793 -444803 -444811 -444817 -444833 -444841 -444859 -444863 -444869 -444877 -444883 -444887 -444893 -444901 -444929 -444937 -444953 -444967 -444971 -444979 -445001 -445019 -445021 -445031 -445033 -445069 -445087 -445091 -445097 -445103 -445141 -445157 -445169 -445183 -445187 -445199 -445229 -445261 -445271 -445279 -445283 -445297 -445307 -445321 -445339 -445363 -445427 -445433 -445447 -445453 -445463 -445477 -445499 -445507 -445537 -445541 -445567 -445573 -445583 -445589 -445597 -445619 -445631 -445633 -445649 -445657 -445691 -445699 -445703 -445741 -445747 -445769 -445771 -445789 -445799 -445807 -445829 -445847 -445853 -445871 -445877 -445883 -445891 -445931 -445937 -445943 -445967 -445969 -446003 -446009 -446041 -446053 -446081 -446087 -446111 -446123 -446129 -446141 -446179 -446189 -446191 -446197 -446221 -446227 -446231 -446261 -446263 -446273 -446279 -446293 -446309 -446323 -446333 -446353 -446363 -446387 -446389 -446399 -446401 -446417 -446441 -446447 -446461 -446473 -446477 -446503 -446533 -446549 -446561 -446569 -446597 -446603 -446609 -446647 -446657 -446713 -446717 -446731 -446753 -446759 -446767 -446773 -446819 -446827 -446839 -446863 -446881 -446891 -446893 -446909 -446911 -446921 -446933 -446951 -446969 -446983 -447001 -447011 -447019 -447053 -447067 -447079 -447101 -447107 -447119 -447133 -447137 -447173 -447179 -447193 -447197 -447211 -447217 -447221 -447233 -447247 -447257 -447259 -447263 -447311 -447319 -447323 -447331 -447353 -447401 -447409 -447427 -447439 -447443 -447449 -447451 -447463 -447467 -447481 -447509 -447521 -447527 -447541 -447569 -447571 -447611 -447617 -447637 -447641 -447677 -447683 -447701 -447703 -447743 -447749 -447757 -447779 -447791 -447793 -447817 -447823 -447827 -447829 -447841 -447859 -447877 -447883 -447893 -447901 -447907 -447943 -447961 -447983 -447991 -448003 -448013 -448027 -448031 -448057 -448067 -448073 -448093 -448111 -448121 -448139 -448141 -448157 -448159 -448169 -448177 -448187 -448193 -448199 -448207 -448241 -448249 -448303 -448309 -448313 -448321 -448351 -448363 -448367 -448373 -448379 -448387 -448397 -448421 -448451 -448519 -448531 -448561 -448597 -448607 -448627 -448631 -448633 -448667 -448687 -448697 -448703 -448727 -448733 -448741 -448769 -448793 -448801 -448807 -448829 -448843 -448853 -448859 -448867 -448871 -448873 -448879 -448883 -448907 -448927 -448939 -448969 -448993 -448997 -448999 -449003 -449011 -449051 -449077 -449083 -449093 -449107 -449117 -449129 -449131 -449149 -449153 -449161 -449171 -449173 -449201 -449203 -449209 -449227 -449243 -449249 -449261 -449263 -449269 -449287 -449299 -449303 -449311 -449321 -449333 -449347 -449353 -449363 -449381 -449399 -449411 -449417 -449419 -449437 -449441 -449459 -449473 -449543 -449549 -449557 -449563 -449567 -449569 -449591 -449609 -449621 -449629 -449653 -449663 -449671 -449677 -449681 -449689 -449693 -449699 -449741 -449759 -449767 -449773 -449783 -449797 -449807 -449821 -449833 -449851 -449879 -449921 -449929 -449941 -449951 -449959 -449963 -449971 -449987 -449989 -450001 -450011 -450019 -450029 -450067 -450071 -450077 -450083 -450101 -450103 -450113 -450127 -450137 -450161 -450169 -450193 -450199 -450209 -450217 -450223 -450227 -450239 -450257 -450259 -450277 -450287 -450293 -450299 -450301 -450311 -450343 -450349 -450361 -450367 -450377 -450383 -450391 -450403 -450413 -450421 -450431 -450451 -450473 -450479 -450481 -450487 -450493 -450503 -450529 -450533 -450557 -450563 -450581 -450587 -450599 -450601 -450617 -450641 -450643 -450649 -450677 -450691 -450707 -450719 -450727 -450761 -450767 -450787 -450797 -450799 -450803 -450809 -450811 -450817 -450829 -450839 -450841 -450847 -450859 -450881 -450883 -450887 -450893 -450899 -450913 -450917 -450929 -450943 -450949 -450971 -450991 -450997 -451013 -451039 -451051 -451057 -451069 -451093 -451097 -451103 -451109 -451159 -451177 -451181 -451183 -451201 -451207 -451249 -451277 -451279 -451301 -451303 -451309 -451313 -451331 -451337 -451343 -451361 -451387 -451397 -451411 -451439 -451441 -451481 -451499 -451519 -451523 -451541 -451547 -451553 -451579 -451601 -451609 -451621 -451637 -451657 -451663 -451667 -451669 -451679 -451681 -451691 -451699 -451709 -451723 -451747 -451753 -451771 -451783 -451793 -451799 -451823 -451831 -451837 -451859 -451873 -451879 -451897 -451901 -451903 -451909 -451921 -451933 -451937 -451939 -451961 -451967 -451987 -452009 -452017 -452027 -452033 -452041 -452077 -452083 -452087 -452131 -452159 -452161 -452171 -452191 -452201 -452213 -452227 -452233 -452239 -452269 -452279 -452293 -452297 -452329 -452363 -452377 -452393 -452401 -452443 -452453 -452497 -452519 -452521 -452531 -452533 -452537 -452539 -452549 -452579 -452587 -452597 -452611 -452629 -452633 -452671 -452687 -452689 -452701 -452731 -452759 -452773 -452797 -452807 -452813 -452821 -452831 -452857 -452869 -452873 -452923 -452953 -452957 -452983 -452989 -453023 -453029 -453053 -453073 -453107 -453119 -453133 -453137 -453143 -453157 -453161 -453181 -453197 -453199 -453209 -453217 -453227 -453239 -453247 -453269 -453289 -453293 -453301 -453311 -453317 -453329 -453347 -453367 -453371 -453377 -453379 -453421 -453451 -453461 -453527 -453553 -453559 -453569 -453571 -453599 -453601 -453617 -453631 -453637 -453641 -453643 -453659 -453667 -453671 -453683 -453703 -453707 -453709 -453737 -453757 -453797 -453799 -453823 -453833 -453847 -453851 -453877 -453889 -453907 -453913 -453923 -453931 -453949 -453961 -453977 -453983 -453991 -454009 -454021 -454031 -454033 -454039 -454061 -454063 -454079 -454109 -454141 -454151 -454159 -454183 -454199 -454211 -454213 -454219 -454229 -454231 -454247 -454253 -454277 -454297 -454303 -454313 -454331 -454351 -454357 -454361 -454379 -454387 -454409 -454417 -454451 -454453 -454483 -454501 -454507 -454513 -454541 -454543 -454547 -454577 -454579 -454603 -454609 -454627 -454637 -454673 -454679 -454709 -454711 -454721 -454723 -454759 -454763 -454777 -454799 -454823 -454843 -454847 -454849 -454859 -454889 -454891 -454907 -454919 -454921 -454931 -454943 -454967 -454969 -454973 -454991 -455003 -455011 -455033 -455047 -455053 -455093 -455099 -455123 -455149 -455159 -455167 -455171 -455177 -455201 -455219 -455227 -455233 -455237 -455261 -455263 -455269 -455291 -455309 -455317 -455321 -455333 -455339 -455341 -455353 -455381 -455393 -455401 -455407 -455419 -455431 -455437 -455443 -455461 -455471 -455473 -455479 -455489 -455491 -455513 -455527 -455531 -455537 -455557 -455573 -455579 -455597 -455599 -455603 -455627 -455647 -455659 -455681 -455683 -455687 -455701 -455711 -455717 -455737 -455761 -455783 -455789 -455809 -455827 -455831 -455849 -455863 -455881 -455899 -455921 -455933 -455941 -455953 -455969 -455977 -455989 -455993 -455999 -456007 -456013 -456023 -456037 -456047 -456061 -456091 -456107 -456109 -456119 -456149 -456151 -456167 -456193 -456223 -456233 -456241 -456283 -456293 -456329 -456349 -456353 -456367 -456377 -456403 -456409 -456427 -456439 -456451 -456457 -456461 -456499 -456503 -456517 -456523 -456529 -456539 -456553 -456557 -456559 -456571 -456581 -456587 -456607 -456611 -456613 -456623 -456641 -456647 -456649 -456653 -456679 -456683 -456697 -456727 -456737 -456763 -456767 -456769 -456791 -456809 -456811 -456821 -456871 -456877 -456881 -456899 -456901 -456923 -456949 -456959 -456979 -456991 -457001 -457003 -457013 -457021 -457043 -457049 -457057 -457087 -457091 -457097 -457099 -457117 -457139 -457151 -457153 -457183 -457189 -457201 -457213 -457229 -457241 -457253 -457267 -457271 -457277 -457279 -457307 -457319 -457333 -457339 -457363 -457367 -457381 -457393 -457397 -457399 -457403 -457411 -457421 -457433 -457459 -457469 -457507 -457511 -457517 -457547 -457553 -457559 -457571 -457607 -457609 -457621 -457643 -457651 -457661 -457669 -457673 -457679 -457687 -457697 -457711 -457739 -457757 -457789 -457799 -457813 -457817 -457829 -457837 -457871 -457889 -457903 -457913 -457943 -457979 -457981 -457987 -458009 -458027 -458039 -458047 -458053 -458057 -458063 -458069 -458119 -458123 -458173 -458179 -458189 -458191 -458197 -458207 -458219 -458239 -458309 -458317 -458323 -458327 -458333 -458357 -458363 -458377 -458399 -458401 -458407 -458449 -458477 -458483 -458501 -458531 -458533 -458543 -458567 -458569 -458573 -458593 -458599 -458611 -458621 -458629 -458639 -458651 -458663 -458669 -458683 -458701 -458719 -458729 -458747 -458789 -458791 -458797 -458807 -458819 -458849 -458863 -458879 -458891 -458897 -458917 -458921 -458929 -458947 -458957 -458959 -458963 -458971 -458977 -458981 -458987 -458993 -459007 -459013 -459023 -459029 -459031 -459037 -459047 -459089 -459091 -459113 -459127 -459167 -459169 -459181 -459209 -459223 -459229 -459233 -459257 -459271 -459293 -459301 -459313 -459317 -459337 -459341 -459343 -459353 -459373 -459377 -459383 -459397 -459421 -459427 -459443 -459463 -459467 -459469 -459479 -459509 -459521 -459523 -459593 -459607 -459611 -459619 -459623 -459631 -459647 -459649 -459671 -459677 -459691 -459703 -459749 -459763 -459791 -459803 -459817 -459829 -459841 -459847 -459883 -459913 -459923 -459929 -459937 -459961 -460013 -460039 -460051 -460063 -460073 -460079 -460081 -460087 -460091 -460099 -460111 -460127 -460147 -460157 -460171 -460181 -460189 -460211 -460217 -460231 -460247 -460267 -460289 -460297 -460301 -460337 -460349 -460373 -460379 -460387 -460393 -460403 -460409 -460417 -460451 -460463 -460477 -460531 -460543 -460561 -460571 -460589 -460609 -460619 -460627 -460633 -460637 -460643 -460657 -460673 -460697 -460709 -460711 -460721 -460771 -460777 -460787 -460793 -460813 -460829 -460841 -460843 -460871 -460891 -460903 -460907 -460913 -460919 -460937 -460949 -460951 -460969 -460973 -460979 -460981 -460987 -460991 -461009 -461011 -461017 -461051 -461053 -461059 -461093 -461101 -461119 -461143 -461147 -461171 -461183 -461191 -461207 -461233 -461239 -461257 -461269 -461273 -461297 -461299 -461309 -461317 -461323 -461327 -461333 -461359 -461381 -461393 -461407 -461411 -461413 -461437 -461441 -461443 -461467 -461479 -461507 -461521 -461561 -461569 -461581 -461599 -461603 -461609 -461627 -461639 -461653 -461677 -461687 -461689 -461693 -461707 -461717 -461801 -461803 -461819 -461843 -461861 -461887 -461891 -461917 -461921 -461933 -461957 -461971 -461977 -461983 -462013 -462041 -462067 -462073 -462079 -462097 -462103 -462109 -462113 -462131 -462149 -462181 -462191 -462199 -462221 -462239 -462263 -462271 -462307 -462311 -462331 -462337 -462361 -462373 -462377 -462401 -462409 -462419 -462421 -462437 -462443 -462467 -462481 -462491 -462493 -462499 -462529 -462541 -462547 -462557 -462569 -462571 -462577 -462589 -462607 -462629 -462641 -462643 -462653 -462659 -462667 -462673 -462677 -462697 -462713 -462719 -462727 -462733 -462739 -462773 -462827 -462841 -462851 -462863 -462871 -462881 -462887 -462899 -462901 -462911 -462937 -462947 -462953 -462983 -463003 -463031 -463033 -463093 -463103 -463157 -463181 -463189 -463207 -463213 -463219 -463231 -463237 -463247 -463249 -463261 -463283 -463291 -463297 -463303 -463313 -463319 -463321 -463339 -463343 -463363 -463387 -463399 -463433 -463447 -463451 -463453 -463457 -463459 -463483 -463501 -463511 -463513 -463523 -463531 -463537 -463549 -463579 -463613 -463627 -463633 -463643 -463649 -463663 -463679 -463693 -463711 -463717 -463741 -463747 -463753 -463763 -463781 -463787 -463807 -463823 -463829 -463831 -463849 -463861 -463867 -463873 -463889 -463891 -463907 -463919 -463921 -463949 -463963 -463973 -463987 -463993 -464003 -464011 -464021 -464033 -464047 -464069 -464081 -464089 -464119 -464129 -464131 -464137 -464141 -464143 -464171 -464173 -464197 -464201 -464213 -464237 -464251 -464257 -464263 -464279 -464281 -464291 -464309 -464311 -464327 -464351 -464371 -464381 -464383 -464413 -464419 -464437 -464447 -464459 -464467 -464479 -464483 -464521 -464537 -464539 -464549 -464557 -464561 -464587 -464591 -464603 -464617 -464621 -464647 -464663 -464687 -464699 -464741 -464747 -464749 -464753 -464767 -464771 -464773 -464777 -464801 -464803 -464809 -464813 -464819 -464843 -464857 -464879 -464897 -464909 -464917 -464923 -464927 -464939 -464941 -464951 -464953 -464963 -464983 -464993 -464999 -465007 -465011 -465013 -465019 -465041 -465061 -465067 -465071 -465077 -465079 -465089 -465107 -465119 -465133 -465151 -465161 -465163 -465167 -465169 -465173 -465187 -465209 -465211 -465259 -465271 -465277 -465281 -465293 -465299 -465317 -465319 -465331 -465337 -465373 -465379 -465383 -465407 -465419 -465433 -465463 -465469 -465523 -465529 -465541 -465551 -465581 -465587 -465611 -465631 -465643 -465649 -465659 -465679 -465701 -465721 -465739 -465743 -465761 -465781 -465797 -465799 -465809 -465821 -465833 -465841 -465887 -465893 -465901 -465917 -465929 -465931 -465947 -465977 -465989 -466009 -466019 -466027 -466033 -466043 -466061 -466069 -466073 -466079 -466087 -466091 -466121 -466139 -466153 -466171 -466181 -466183 -466201 -466243 -466247 -466261 -466267 -466273 -466283 -466303 -466321 -466331 -466339 -466357 -466369 -466373 -466409 -466423 -466441 -466451 -466483 -466517 -466537 -466547 -466553 -466561 -466567 -466573 -466579 -466603 -466619 -466637 -466649 -466651 -466673 -466717 -466723 -466729 -466733 -466747 -466751 -466777 -466787 -466801 -466819 -466853 -466859 -466897 -466909 -466913 -466919 -466951 -466957 -466997 -467003 -467009 -467017 -467021 -467063 -467081 -467083 -467101 -467119 -467123 -467141 -467147 -467171 -467183 -467197 -467209 -467213 -467237 -467239 -467261 -467293 -467297 -467317 -467329 -467333 -467353 -467371 -467399 -467417 -467431 -467437 -467447 -467471 -467473 -467477 -467479 -467491 -467497 -467503 -467507 -467527 -467531 -467543 -467549 -467557 -467587 -467591 -467611 -467617 -467627 -467629 -467633 -467641 -467651 -467657 -467669 -467671 -467681 -467689 -467699 -467713 -467729 -467737 -467743 -467749 -467773 -467783 -467813 -467827 -467833 -467867 -467869 -467879 -467881 -467893 -467897 -467899 -467903 -467927 -467941 -467953 -467963 -467977 -468001 -468011 -468019 -468029 -468049 -468059 -468067 -468071 -468079 -468107 -468109 -468113 -468121 -468133 -468137 -468151 -468157 -468173 -468187 -468191 -468199 -468239 -468241 -468253 -468271 -468277 -468289 -468319 -468323 -468353 -468359 -468371 -468389 -468421 -468439 -468451 -468463 -468473 -468491 -468493 -468499 -468509 -468527 -468551 -468557 -468577 -468581 -468593 -468599 -468613 -468619 -468623 -468641 -468647 -468653 -468661 -468667 -468683 -468691 -468697 -468703 -468709 -468719 -468737 -468739 -468761 -468773 -468781 -468803 -468817 -468821 -468841 -468851 -468859 -468869 -468883 -468887 -468889 -468893 -468899 -468913 -468953 -468967 -468973 -468983 -469009 -469031 -469037 -469069 -469099 -469121 -469127 -469141 -469153 -469169 -469193 -469207 -469219 -469229 -469237 -469241 -469253 -469267 -469279 -469283 -469303 -469321 -469331 -469351 -469363 -469367 -469369 -469379 -469397 -469411 -469429 -469439 -469457 -469487 -469501 -469529 -469541 -469543 -469561 -469583 -469589 -469613 -469627 -469631 -469649 -469657 -469673 -469687 -469691 -469717 -469723 -469747 -469753 -469757 -469769 -469787 -469793 -469801 -469811 -469823 -469841 -469849 -469877 -469879 -469891 -469907 -469919 -469939 -469957 -469969 -469979 -469993 -470021 -470039 -470059 -470077 -470081 -470083 -470087 -470089 -470131 -470149 -470153 -470161 -470167 -470179 -470201 -470207 -470209 -470213 -470219 -470227 -470243 -470251 -470263 -470279 -470297 -470299 -470303 -470317 -470333 -470347 -470359 -470389 -470399 -470411 -470413 -470417 -470429 -470443 -470447 -470453 -470461 -470471 -470473 -470489 -470501 -470513 -470521 -470531 -470539 -470551 -470579 -470593 -470597 -470599 -470609 -470621 -470627 -470647 -470651 -470653 -470663 -470669 -470689 -470711 -470719 -470731 -470749 -470779 -470783 -470791 -470819 -470831 -470837 -470863 -470867 -470881 -470887 -470891 -470903 -470927 -470933 -470941 -470947 -470957 -470959 -470993 -470999 -471007 -471041 -471061 -471073 -471089 -471091 -471101 -471137 -471139 -471161 -471173 -471179 -471187 -471193 -471209 -471217 -471241 -471253 -471259 -471277 -471281 -471283 -471299 -471301 -471313 -471353 -471389 -471391 -471403 -471407 -471439 -471451 -471467 -471481 -471487 -471503 -471509 -471521 -471533 -471539 -471553 -471571 -471589 -471593 -471607 -471617 -471619 -471641 -471649 -471659 -471671 -471673 -471677 -471683 -471697 -471703 -471719 -471721 -471749 -471769 -471781 -471791 -471803 -471817 -471841 -471847 -471853 -471871 -471893 -471901 -471907 -471923 -471929 -471931 -471943 -471949 -471959 -471997 -472019 -472027 -472051 -472057 -472063 -472067 -472103 -472111 -472123 -472127 -472133 -472139 -472151 -472159 -472163 -472189 -472193 -472247 -472249 -472253 -472261 -472273 -472289 -472301 -472309 -472319 -472331 -472333 -472349 -472369 -472391 -472393 -472399 -472411 -472421 -472457 -472469 -472477 -472523 -472541 -472543 -472559 -472561 -472573 -472597 -472631 -472639 -472643 -472669 -472687 -472691 -472697 -472709 -472711 -472721 -472741 -472751 -472763 -472793 -472799 -472817 -472831 -472837 -472847 -472859 -472883 -472907 -472909 -472921 -472937 -472939 -472963 -472993 -473009 -473021 -473027 -473089 -473101 -473117 -473141 -473147 -473159 -473167 -473173 -473191 -473197 -473201 -473203 -473219 -473227 -473257 -473279 -473287 -473293 -473311 -473321 -473327 -473351 -473353 -473377 -473381 -473383 -473411 -473419 -473441 -473443 -473453 -473471 -473477 -473479 -473497 -473503 -473507 -473513 -473519 -473527 -473531 -473533 -473549 -473579 -473597 -473611 -473617 -473633 -473647 -473659 -473719 -473723 -473729 -473741 -473743 -473761 -473789 -473833 -473839 -473857 -473861 -473867 -473887 -473899 -473911 -473923 -473927 -473929 -473939 -473951 -473953 -473971 -473981 -473987 -473999 -474017 -474029 -474037 -474043 -474049 -474059 -474073 -474077 -474101 -474119 -474127 -474137 -474143 -474151 -474163 -474169 -474197 -474211 -474223 -474241 -474263 -474289 -474307 -474311 -474319 -474337 -474343 -474347 -474359 -474379 -474389 -474391 -474413 -474433 -474437 -474443 -474479 -474491 -474497 -474499 -474503 -474533 -474541 -474547 -474557 -474569 -474571 -474581 -474583 -474619 -474629 -474647 -474659 -474667 -474671 -474707 -474709 -474737 -474751 -474757 -474769 -474779 -474787 -474809 -474811 -474839 -474847 -474857 -474899 -474907 -474911 -474917 -474923 -474931 -474937 -474941 -474949 -474959 -474977 -474983 -475037 -475051 -475073 -475081 -475091 -475093 -475103 -475109 -475141 -475147 -475151 -475159 -475169 -475207 -475219 -475229 -475243 -475271 -475273 -475283 -475289 -475297 -475301 -475327 -475331 -475333 -475351 -475367 -475369 -475379 -475381 -475403 -475417 -475421 -475427 -475429 -475441 -475457 -475469 -475483 -475511 -475523 -475529 -475549 -475583 -475597 -475613 -475619 -475621 -475637 -475639 -475649 -475669 -475679 -475681 -475691 -475693 -475697 -475721 -475729 -475751 -475753 -475759 -475763 -475777 -475789 -475793 -475807 -475823 -475831 -475837 -475841 -475859 -475877 -475879 -475889 -475897 -475903 -475907 -475921 -475927 -475933 -475957 -475973 -475991 -475997 -476009 -476023 -476027 -476029 -476039 -476041 -476059 -476081 -476087 -476089 -476101 -476107 -476111 -476137 -476143 -476167 -476183 -476219 -476233 -476237 -476243 -476249 -476279 -476299 -476317 -476347 -476351 -476363 -476369 -476381 -476401 -476407 -476419 -476423 -476429 -476467 -476477 -476479 -476507 -476513 -476519 -476579 -476587 -476591 -476599 -476603 -476611 -476633 -476639 -476647 -476659 -476681 -476683 -476701 -476713 -476719 -476737 -476743 -476753 -476759 -476783 -476803 -476831 -476849 -476851 -476863 -476869 -476887 -476891 -476911 -476921 -476929 -476977 -476981 -476989 -477011 -477013 -477017 -477019 -477031 -477047 -477073 -477077 -477091 -477131 -477149 -477163 -477209 -477221 -477229 -477259 -477277 -477293 -477313 -477317 -477329 -477341 -477359 -477361 -477383 -477409 -477439 -477461 -477469 -477497 -477511 -477517 -477523 -477539 -477551 -477553 -477557 -477571 -477577 -477593 -477619 -477623 -477637 -477671 -477677 -477721 -477727 -477731 -477739 -477767 -477769 -477791 -477797 -477809 -477811 -477821 -477823 -477839 -477847 -477857 -477863 -477881 -477899 -477913 -477941 -477947 -477973 -477977 -477991 -478001 -478039 -478063 -478067 -478069 -478087 -478099 -478111 -478129 -478139 -478157 -478169 -478171 -478189 -478199 -478207 -478213 -478241 -478243 -478253 -478259 -478271 -478273 -478321 -478339 -478343 -478351 -478391 -478399 -478403 -478411 -478417 -478421 -478427 -478433 -478441 -478451 -478453 -478459 -478481 -478483 -478493 -478523 -478531 -478571 -478573 -478579 -478589 -478603 -478627 -478631 -478637 -478651 -478679 -478697 -478711 -478727 -478729 -478739 -478741 -478747 -478763 -478769 -478787 -478801 -478811 -478813 -478823 -478831 -478843 -478853 -478861 -478871 -478879 -478897 -478901 -478913 -478927 -478931 -478937 -478943 -478963 -478967 -478991 -478999 -479023 -479027 -479029 -479041 -479081 -479131 -479137 -479147 -479153 -479189 -479191 -479201 -479209 -479221 -479231 -479239 -479243 -479263 -479267 -479287 -479299 -479309 -479317 -479327 -479357 -479371 -479377 -479387 -479419 -479429 -479431 -479441 -479461 -479473 -479489 -479497 -479509 -479513 -479533 -479543 -479561 -479569 -479581 -479593 -479599 -479623 -479629 -479639 -479701 -479749 -479753 -479761 -479771 -479777 -479783 -479797 -479813 -479821 -479833 -479839 -479861 -479879 -479881 -479891 -479903 -479909 -479939 -479951 -479953 -479957 -479971 -480013 -480017 -480019 -480023 -480043 -480047 -480049 -480059 -480061 -480071 -480091 -480101 -480107 -480113 -480133 -480143 -480157 -480167 -480169 -480203 -480209 -480287 -480299 -480317 -480329 -480341 -480343 -480349 -480367 -480373 -480379 -480383 -480391 -480409 -480419 -480427 -480449 -480451 -480461 -480463 -480499 -480503 -480509 -480517 -480521 -480527 -480533 -480541 -480553 -480563 -480569 -480583 -480587 -480647 -480661 -480707 -480713 -480731 -480737 -480749 -480761 -480773 -480787 -480803 -480827 -480839 -480853 -480881 -480911 -480919 -480929 -480937 -480941 -480959 -480967 -480979 -480989 -481001 -481003 -481009 -481021 -481043 -481051 -481067 -481073 -481087 -481093 -481097 -481109 -481123 -481133 -481141 -481147 -481153 -481157 -481171 -481177 -481181 -481199 -481207 -481211 -481231 -481249 -481297 -481301 -481303 -481307 -481343 -481363 -481373 -481379 -481387 -481409 -481417 -481433 -481447 -481469 -481489 -481501 -481513 -481531 -481549 -481571 -481577 -481589 -481619 -481633 -481639 -481651 -481667 -481673 -481681 -481693 -481697 -481699 -481721 -481751 -481753 -481769 -481787 -481801 -481807 -481813 -481837 -481843 -481847 -481849 -481861 -481867 -481879 -481883 -481909 -481939 -481963 -481997 -482017 -482021 -482029 -482033 -482039 -482051 -482071 -482093 -482099 -482101 -482117 -482123 -482179 -482189 -482203 -482213 -482227 -482231 -482233 -482243 -482263 -482281 -482309 -482323 -482347 -482351 -482359 -482371 -482387 -482393 -482399 -482401 -482407 -482413 -482423 -482437 -482441 -482483 -482501 -482507 -482509 -482513 -482519 -482527 -482539 -482569 -482593 -482597 -482621 -482627 -482633 -482641 -482659 -482663 -482683 -482687 -482689 -482707 -482711 -482717 -482719 -482731 -482743 -482753 -482759 -482767 -482773 -482789 -482803 -482819 -482827 -482837 -482861 -482863 -482873 -482897 -482899 -482917 -482941 -482947 -482957 -482971 -483017 -483031 -483061 -483071 -483097 -483127 -483139 -483163 -483167 -483179 -483209 -483211 -483221 -483229 -483233 -483239 -483247 -483251 -483281 -483289 -483317 -483323 -483337 -483347 -483367 -483377 -483389 -483397 -483407 -483409 -483433 -483443 -483467 -483481 -483491 -483499 -483503 -483523 -483541 -483551 -483557 -483563 -483577 -483611 -483619 -483629 -483643 -483649 -483671 -483697 -483709 -483719 -483727 -483733 -483751 -483757 -483761 -483767 -483773 -483787 -483809 -483811 -483827 -483829 -483839 -483853 -483863 -483869 -483883 -483907 -483929 -483937 -483953 -483971 -483991 -484019 -484027 -484037 -484061 -484067 -484079 -484091 -484111 -484117 -484123 -484129 -484151 -484153 -484171 -484181 -484193 -484201 -484207 -484229 -484243 -484259 -484283 -484301 -484303 -484327 -484339 -484361 -484369 -484373 -484397 -484411 -484417 -484439 -484447 -484457 -484459 -484487 -484489 -484493 -484531 -484543 -484577 -484597 -484607 -484609 -484613 -484621 -484639 -484643 -484691 -484703 -484727 -484733 -484751 -484763 -484769 -484777 -484787 -484829 -484853 -484867 -484927 -484951 -484987 -484999 -485021 -485029 -485041 -485053 -485059 -485063 -485081 -485101 -485113 -485123 -485131 -485137 -485161 -485167 -485171 -485201 -485207 -485209 -485263 -485311 -485347 -485351 -485363 -485371 -485383 -485389 -485411 -485417 -485423 -485437 -485447 -485479 -485497 -485509 -485519 -485543 -485567 -485587 -485593 -485603 -485609 -485647 -485657 -485671 -485689 -485701 -485717 -485729 -485731 -485753 -485777 -485819 -485827 -485831 -485833 -485893 -485899 -485909 -485923 -485941 -485959 -485977 -485993 -486023 -486037 -486041 -486043 -486053 -486061 -486071 -486091 -486103 -486119 -486133 -486139 -486163 -486179 -486181 -486193 -486203 -486221 -486223 -486247 -486281 -486293 -486307 -486313 -486323 -486329 -486331 -486341 -486349 -486377 -486379 -486389 -486391 -486397 -486407 -486433 -486443 -486449 -486481 -486491 -486503 -486509 -486511 -486527 -486539 -486559 -486569 -486583 -486589 -486601 -486617 -486637 -486641 -486643 -486653 -486667 -486671 -486677 -486679 -486683 -486697 -486713 -486721 -486757 -486767 -486769 -486781 -486797 -486817 -486821 -486833 -486839 -486869 -486907 -486923 -486929 -486943 -486947 -486949 -486971 -486977 -486991 -487007 -487013 -487021 -487049 -487051 -487057 -487073 -487079 -487093 -487099 -487111 -487133 -487177 -487183 -487187 -487211 -487213 -487219 -487247 -487261 -487283 -487303 -487307 -487313 -487349 -487363 -487381 -487387 -487391 -487397 -487423 -487427 -487429 -487447 -487457 -487463 -487469 -487471 -487477 -487481 -487489 -487507 -487561 -487589 -487601 -487603 -487607 -487637 -487649 -487651 -487657 -487681 -487691 -487703 -487709 -487717 -487727 -487733 -487741 -487757 -487769 -487783 -487789 -487793 -487811 -487819 -487829 -487831 -487843 -487873 -487889 -487891 -487897 -487933 -487943 -487973 -487979 -487997 -488003 -488009 -488011 -488021 -488051 -488057 -488069 -488119 -488143 -488149 -488153 -488161 -488171 -488197 -488203 -488207 -488209 -488227 -488231 -488233 -488239 -488249 -488261 -488263 -488287 -488303 -488309 -488311 -488317 -488321 -488329 -488333 -488339 -488347 -488353 -488381 -488399 -488401 -488407 -488417 -488419 -488441 -488459 -488473 -488503 -488513 -488539 -488567 -488573 -488603 -488611 -488617 -488627 -488633 -488639 -488641 -488651 -488687 -488689 -488701 -488711 -488717 -488723 -488729 -488743 -488749 -488759 -488779 -488791 -488797 -488821 -488827 -488833 -488861 -488879 -488893 -488897 -488909 -488921 -488947 -488959 -488981 -488993 -489001 -489011 -489019 -489043 -489053 -489061 -489101 -489109 -489113 -489127 -489133 -489157 -489161 -489179 -489191 -489197 -489217 -489239 -489241 -489257 -489263 -489283 -489299 -489329 -489337 -489343 -489361 -489367 -489389 -489407 -489409 -489427 -489431 -489439 -489449 -489457 -489479 -489487 -489493 -489529 -489539 -489551 -489553 -489557 -489571 -489613 -489631 -489653 -489659 -489673 -489677 -489679 -489689 -489691 -489733 -489743 -489761 -489791 -489793 -489799 -489803 -489817 -489823 -489833 -489847 -489851 -489869 -489871 -489887 -489901 -489911 -489913 -489941 -489943 -489959 -489961 -489977 -489989 -490001 -490003 -490019 -490031 -490033 -490057 -490097 -490103 -490111 -490117 -490121 -490151 -490159 -490169 -490183 -490201 -490207 -490223 -490241 -490247 -490249 -490267 -490271 -490277 -490283 -490309 -490313 -490339 -490367 -490393 -490417 -490421 -490453 -490459 -490463 -490481 -490493 -490499 -490519 -490537 -490541 -490543 -490549 -490559 -490571 -490573 -490577 -490579 -490591 -490619 -490627 -490631 -490643 -490661 -490663 -490697 -490733 -490741 -490769 -490771 -490783 -490829 -490837 -490849 -490859 -490877 -490891 -490913 -490921 -490927 -490937 -490949 -490951 -490957 -490967 -490969 -490991 -490993 -491003 -491039 -491041 -491059 -491081 -491083 -491129 -491137 -491149 -491159 -491167 -491171 -491201 -491213 -491219 -491251 -491261 -491273 -491279 -491297 -491299 -491327 -491329 -491333 -491339 -491341 -491353 -491357 -491371 -491377 -491417 -491423 -491429 -491461 -491483 -491489 -491497 -491501 -491503 -491527 -491531 -491537 -491539 -491581 -491591 -491593 -491611 -491627 -491633 -491639 -491651 -491653 -491669 -491677 -491707 -491719 -491731 -491737 -491747 -491773 -491783 -491789 -491797 -491819 -491833 -491837 -491851 -491857 -491867 -491873 -491899 -491923 -491951 -491969 -491977 -491983 -492007 -492013 -492017 -492029 -492047 -492053 -492059 -492061 -492067 -492077 -492083 -492103 -492113 -492227 -492251 -492253 -492257 -492281 -492293 -492299 -492319 -492377 -492389 -492397 -492403 -492409 -492413 -492421 -492431 -492463 -492467 -492487 -492491 -492511 -492523 -492551 -492563 -492587 -492601 -492617 -492619 -492629 -492631 -492641 -492647 -492659 -492671 -492673 -492707 -492719 -492721 -492731 -492757 -492761 -492763 -492769 -492781 -492799 -492839 -492853 -492871 -492883 -492893 -492901 -492911 -492967 -492979 -493001 -493013 -493021 -493027 -493043 -493049 -493067 -493093 -493109 -493111 -493121 -493123 -493127 -493133 -493139 -493147 -493159 -493169 -493177 -493193 -493201 -493211 -493217 -493219 -493231 -493243 -493249 -493277 -493279 -493291 -493301 -493313 -493333 -493351 -493369 -493393 -493397 -493399 -493403 -493433 -493447 -493457 -493463 -493481 -493523 -493531 -493541 -493567 -493573 -493579 -493583 -493607 -493621 -493627 -493643 -493657 -493693 -493709 -493711 -493721 -493729 -493733 -493747 -493777 -493793 -493807 -493811 -493813 -493817 -493853 -493859 -493873 -493877 -493897 -493919 -493931 -493937 -493939 -493967 -493973 -493979 -493993 -494023 -494029 -494041 -494051 -494069 -494077 -494083 -494093 -494101 -494107 -494129 -494141 -494147 -494167 -494191 -494213 -494237 -494251 -494257 -494267 -494269 -494281 -494287 -494317 -494327 -494341 -494353 -494359 -494369 -494381 -494383 -494387 -494407 -494413 -494441 -494443 -494471 -494497 -494519 -494521 -494539 -494561 -494563 -494567 -494587 -494591 -494609 -494617 -494621 -494639 -494647 -494651 -494671 -494677 -494687 -494693 -494699 -494713 -494719 -494723 -494731 -494737 -494743 -494749 -494759 -494761 -494783 -494789 -494803 -494843 -494849 -494873 -494899 -494903 -494917 -494927 -494933 -494939 -494959 -494987 -495017 -495037 -495041 -495043 -495067 -495071 -495109 -495113 -495119 -495133 -495139 -495149 -495151 -495161 -495181 -495199 -495211 -495221 -495241 -495269 -495277 -495289 -495301 -495307 -495323 -495337 -495343 -495347 -495359 -495361 -495371 -495377 -495389 -495401 -495413 -495421 -495433 -495437 -495449 -495457 -495461 -495491 -495511 -495527 -495557 -495559 -495563 -495569 -495571 -495587 -495589 -495611 -495613 -495617 -495619 -495629 -495637 -495647 -495667 -495679 -495701 -495707 -495713 -495749 -495751 -495757 -495769 -495773 -495787 -495791 -495797 -495799 -495821 -495827 -495829 -495851 -495877 -495893 -495899 -495923 -495931 -495947 -495953 -495959 -495967 -495973 -495983 -496007 -496019 -496039 -496051 -496063 -496073 -496079 -496123 -496127 -496163 -496187 -496193 -496211 -496229 -496231 -496259 -496283 -496289 -496291 -496297 -496303 -496313 -496333 -496339 -496343 -496381 -496399 -496427 -496439 -496453 -496459 -496471 -496477 -496481 -496487 -496493 -496499 -496511 -496549 -496579 -496583 -496609 -496631 -496669 -496681 -496687 -496703 -496711 -496733 -496747 -496763 -496789 -496813 -496817 -496841 -496849 -496871 -496877 -496889 -496891 -496897 -496901 -496913 -496919 -496949 -496963 -496997 -496999 -497011 -497017 -497041 -497047 -497051 -497069 -497093 -497111 -497113 -497117 -497137 -497141 -497153 -497171 -497177 -497197 -497239 -497257 -497261 -497269 -497279 -497281 -497291 -497297 -497303 -497309 -497323 -497339 -497351 -497389 -497411 -497417 -497423 -497449 -497461 -497473 -497479 -497491 -497501 -497507 -497509 -497521 -497537 -497551 -497557 -497561 -497579 -497587 -497597 -497603 -497633 -497659 -497663 -497671 -497677 -497689 -497701 -497711 -497719 -497729 -497737 -497741 -497771 -497773 -497801 -497813 -497831 -497839 -497851 -497867 -497869 -497873 -497899 -497929 -497957 -497963 -497969 -497977 -497989 -497993 -497999 -498013 -498053 -498061 -498073 -498089 -498101 -498103 -498119 -498143 -498163 -498167 -498181 -498209 -498227 -498257 -498259 -498271 -498301 -498331 -498343 -498361 -498367 -498391 -498397 -498401 -498403 -498409 -498439 -498461 -498467 -498469 -498493 -498497 -498521 -498523 -498527 -498551 -498557 -498577 -498583 -498599 -498611 -498613 -498643 -498647 -498653 -498679 -498689 -498691 -498733 -498739 -498749 -498761 -498767 -498779 -498781 -498787 -498791 -498803 -498833 -498857 -498859 -498881 -498907 -498923 -498931 -498937 -498947 -498961 -498973 -498977 -498989 -499021 -499027 -499033 -499039 -499063 -499067 -499099 -499117 -499127 -499129 -499133 -499139 -499141 -499151 -499157 -499159 -499181 -499183 -499189 -499211 -499229 -499253 -499267 -499277 -499283 -499309 -499321 -499327 -499349 -499361 -499363 -499391 -499397 -499403 -499423 -499439 -499459 -499481 -499483 -499493 -499507 -499519 -499523 -499549 -499559 -499571 -499591 -499601 -499607 -499621 -499633 -499637 -499649 -499661 -499663 -499669 -499673 -499679 -499687 -499691 -499693 -499711 -499717 -499729 -499739 -499747 -499781 -499787 -499801 -499819 -499853 -499879 -499883 -499897 -499903 -499927 -499943 -499957 -499969 -499973 -499979 -500009 -500029 -500041 -500057 -500069 -500083 -500107 -500111 -500113 -500119 -500153 -500167 -500173 -500177 -500179 -500197 -500209 -500231 -500233 -500237 -500239 -500249 -500257 -500287 -500299 -500317 -500321 -500333 -500341 -500363 -500369 -500389 -500393 -500413 -500417 -500431 -500443 -500459 -500471 -500473 -500483 -500501 -500509 -500519 -500527 -500567 -500579 -500587 -500603 -500629 -500671 -500677 -500693 -500699 -500713 -500719 -500723 -500729 -500741 -500777 -500791 -500807 -500809 -500831 -500839 -500861 -500873 -500881 -500887 -500891 -500909 -500911 -500921 -500923 -500933 -500947 -500953 -500957 -500977 -501001 -501013 -501019 -501029 -501031 -501037 -501043 -501077 -501089 -501103 -501121 -501131 -501133 -501139 -501157 -501173 -501187 -501191 -501197 -501203 -501209 -501217 -501223 -501229 -501233 -501257 -501271 -501287 -501299 -501317 -501341 -501343 -501367 -501383 -501401 -501409 -501419 -501427 -501451 -501463 -501493 -501503 -501511 -501563 -501577 -501593 -501601 -501617 -501623 -501637 -501659 -501691 -501701 -501703 -501707 -501719 -501731 -501769 -501779 -501803 -501817 -501821 -501827 -501829 -501841 -501863 -501889 -501911 -501931 -501947 -501953 -501967 -501971 -501997 -502001 -502013 -502039 -502043 -502057 -502063 -502079 -502081 -502087 -502093 -502121 -502133 -502141 -502171 -502181 -502217 -502237 -502247 -502259 -502261 -502277 -502301 -502321 -502339 -502393 -502409 -502421 -502429 -502441 -502451 -502487 -502499 -502501 -502507 -502517 -502543 -502549 -502553 -502591 -502597 -502613 -502631 -502633 -502643 -502651 -502669 -502687 -502699 -502703 -502717 -502729 -502769 -502771 -502781 -502787 -502807 -502819 -502829 -502841 -502847 -502861 -502883 -502919 -502921 -502937 -502961 -502973 -503003 -503017 -503039 -503053 -503077 -503123 -503131 -503137 -503147 -503159 -503197 -503207 -503213 -503227 -503231 -503233 -503249 -503267 -503287 -503297 -503303 -503317 -503339 -503351 -503359 -503369 -503381 -503383 -503389 -503407 -503413 -503423 -503431 -503441 -503453 -503483 -503501 -503543 -503549 -503551 -503563 -503593 -503599 -503609 -503611 -503621 -503623 -503647 -503653 -503663 -503707 -503717 -503743 -503753 -503771 -503777 -503779 -503791 -503803 -503819 -503821 -503827 -503851 -503857 -503869 -503879 -503911 -503927 -503929 -503939 -503947 -503959 -503963 -503969 -503983 -503989 -504001 -504011 -504017 -504047 -504061 -504073 -504103 -504121 -504139 -504143 -504149 -504151 -504157 -504181 -504187 -504197 -504209 -504221 -504247 -504269 -504289 -504299 -504307 -504311 -504323 -504337 -504349 -504353 -504359 -504377 -504379 -504389 -504403 -504457 -504461 -504473 -504479 -504521 -504523 -504527 -504547 -504563 -504593 -504599 -504607 -504617 -504619 -504631 -504661 -504667 -504671 -504677 -504683 -504727 -504767 -504787 -504797 -504799 -504817 -504821 -504851 -504853 -504857 -504871 -504877 -504893 -504901 -504929 -504937 -504943 -504947 -504953 -504967 -504983 -504989 -504991 -505027 -505031 -505033 -505049 -505051 -505061 -505067 -505073 -505091 -505097 -505111 -505117 -505123 -505129 -505139 -505157 -505159 -505181 -505187 -505201 -505213 -505231 -505237 -505277 -505279 -505283 -505301 -505313 -505319 -505321 -505327 -505339 -505357 -505367 -505369 -505399 -505409 -505411 -505429 -505447 -505459 -505469 -505481 -505493 -505501 -505511 -505513 -505523 -505537 -505559 -505573 -505601 -505607 -505613 -505619 -505633 -505639 -505643 -505657 -505663 -505669 -505691 -505693 -505709 -505711 -505727 -505759 -505763 -505777 -505781 -505811 -505819 -505823 -505867 -505871 -505877 -505907 -505919 -505927 -505949 -505961 -505969 -505979 -506047 -506071 -506083 -506101 -506113 -506119 -506131 -506147 -506171 -506173 -506183 -506201 -506213 -506251 -506263 -506269 -506281 -506291 -506327 -506329 -506333 -506339 -506347 -506351 -506357 -506381 -506393 -506417 -506423 -506449 -506459 -506461 -506479 -506491 -506501 -506507 -506531 -506533 -506537 -506551 -506563 -506573 -506591 -506593 -506599 -506609 -506629 -506647 -506663 -506683 -506687 -506689 -506699 -506729 -506731 -506743 -506773 -506783 -506791 -506797 -506809 -506837 -506843 -506861 -506873 -506887 -506893 -506899 -506903 -506911 -506929 -506941 -506963 -506983 -506993 -506999 -507029 -507049 -507071 -507077 -507079 -507103 -507109 -507113 -507119 -507137 -507139 -507149 -507151 -507163 -507193 -507197 -507217 -507289 -507301 -507313 -507317 -507329 -507347 -507349 -507359 -507361 -507371 -507383 -507401 -507421 -507431 -507461 -507491 -507497 -507499 -507503 -507523 -507557 -507571 -507589 -507593 -507599 -507607 -507631 -507641 -507667 -507673 -507691 -507697 -507713 -507719 -507743 -507757 -507779 -507781 -507797 -507803 -507809 -507821 -507827 -507839 -507883 -507901 -507907 -507917 -507919 -507937 -507953 -507961 -507971 -507979 -508009 -508019 -508021 -508033 -508037 -508073 -508087 -508091 -508097 -508103 -508129 -508159 -508171 -508187 -508213 -508223 -508229 -508237 -508243 -508259 -508271 -508273 -508297 -508301 -508327 -508331 -508349 -508363 -508367 -508373 -508393 -508433 -508439 -508451 -508471 -508477 -508489 -508499 -508513 -508517 -508531 -508549 -508559 -508567 -508577 -508579 -508583 -508619 -508621 -508637 -508643 -508661 -508693 -508709 -508727 -508771 -508789 -508799 -508811 -508817 -508841 -508847 -508867 -508901 -508903 -508909 -508913 -508919 -508931 -508943 -508951 -508957 -508961 -508969 -508973 -508987 -509023 -509027 -509053 -509063 -509071 -509087 -509101 -509123 -509137 -509147 -509149 -509203 -509221 -509227 -509239 -509263 -509281 -509287 -509293 -509297 -509317 -509329 -509359 -509363 -509389 -509393 -509413 -509417 -509429 -509441 -509449 -509477 -509513 -509521 -509543 -509549 -509557 -509563 -509569 -509573 -509581 -509591 -509603 -509623 -509633 -509647 -509653 -509659 -509681 -509687 -509689 -509693 -509699 -509723 -509731 -509737 -509741 -509767 -509783 -509797 -509801 -509833 -509837 -509843 -509863 -509867 -509879 -509909 -509911 -509921 -509939 -509947 -509959 -509963 -509989 -510007 -510031 -510047 -510049 -510061 -510067 -510073 -510077 -510079 -510089 -510101 -510121 -510127 -510137 -510157 -510179 -510199 -510203 -510217 -510227 -510233 -510241 -510247 -510253 -510271 -510287 -510299 -510311 -510319 -510331 -510361 -510379 -510383 -510401 -510403 -510449 -510451 -510457 -510463 -510481 -510529 -510551 -510553 -510569 -510581 -510583 -510589 -510611 -510613 -510617 -510619 -510677 -510683 -510691 -510707 -510709 -510751 -510767 -510773 -510793 -510803 -510817 -510823 -510827 -510847 -510889 -510907 -510919 -510931 -510941 -510943 -510989 -511001 -511013 -511019 -511033 -511039 -511057 -511061 -511087 -511109 -511111 -511123 -511151 -511153 -511163 -511169 -511171 -511177 -511193 -511201 -511211 -511213 -511223 -511237 -511243 -511261 -511279 -511289 -511297 -511327 -511333 -511337 -511351 -511361 -511387 -511391 -511409 -511417 -511439 -511447 -511453 -511457 -511463 -511477 -511487 -511507 -511519 -511523 -511541 -511549 -511559 -511573 -511579 -511583 -511591 -511603 -511627 -511631 -511633 -511669 -511691 -511703 -511711 -511723 -511757 -511787 -511793 -511801 -511811 -511831 -511843 -511859 -511867 -511873 -511891 -511897 -511909 -511933 -511939 -511961 -511963 -511991 -511997 -512009 -512011 -512021 -512047 -512059 -512093 -512101 -512137 -512147 -512167 -512207 -512249 -512251 -512269 -512287 -512311 -512321 -512333 -512353 -512389 -512419 -512429 -512443 -512467 -512497 -512503 -512507 -512521 -512531 -512537 -512543 -512569 -512573 -512579 -512581 -512591 -512593 -512597 -512609 -512621 -512641 -512657 -512663 -512671 -512683 -512711 -512713 -512717 -512741 -512747 -512761 -512767 -512779 -512797 -512803 -512819 -512821 -512843 -512849 -512891 -512899 -512903 -512917 -512921 -512927 -512929 -512959 -512977 -512989 -512999 -513001 -513013 -513017 -513031 -513041 -513047 -513053 -513059 -513067 -513083 -513101 -513103 -513109 -513131 -513137 -513157 -513167 -513169 -513173 -513203 -513239 -513257 -513269 -513277 -513283 -513307 -513311 -513313 -513319 -513341 -513347 -513353 -513367 -513371 -513397 -513407 -513419 -513427 -513431 -513439 -513473 -513479 -513481 -513509 -513511 -513529 -513533 -513593 -513631 -513641 -513649 -513673 -513679 -513683 -513691 -513697 -513719 -513727 -513731 -513739 -513749 -513761 -513767 -513769 -513781 -513829 -513839 -513841 -513871 -513881 -513899 -513917 -513923 -513937 -513943 -513977 -513991 -514001 -514009 -514013 -514021 -514049 -514051 -514057 -514061 -514079 -514081 -514093 -514103 -514117 -514123 -514127 -514147 -514177 -514187 -514201 -514219 -514229 -514243 -514247 -514249 -514271 -514277 -514289 -514309 -514313 -514333 -514343 -514357 -514361 -514379 -514399 -514417 -514429 -514433 -514453 -514499 -514513 -514519 -514523 -514529 -514531 -514543 -514561 -514571 -514621 -514637 -514639 -514643 -514649 -514651 -514669 -514681 -514711 -514733 -514739 -514741 -514747 -514751 -514757 -514769 -514783 -514793 -514819 -514823 -514831 -514841 -514847 -514853 -514859 -514867 -514873 -514889 -514903 -514933 -514939 -514949 -514967 -515041 -515087 -515089 -515111 -515143 -515149 -515153 -515173 -515191 -515227 -515231 -515233 -515237 -515279 -515293 -515311 -515323 -515351 -515357 -515369 -515371 -515377 -515381 -515401 -515429 -515477 -515507 -515519 -515539 -515563 -515579 -515587 -515597 -515611 -515621 -515639 -515651 -515653 -515663 -515677 -515681 -515687 -515693 -515701 -515737 -515741 -515761 -515771 -515773 -515777 -515783 -515803 -515813 -515839 -515843 -515857 -515861 -515873 -515887 -515917 -515923 -515929 -515941 -515951 -515969 -515993 -516017 -516023 -516049 -516053 -516077 -516091 -516127 -516151 -516157 -516161 -516163 -516169 -516179 -516193 -516199 -516209 -516223 -516227 -516233 -516247 -516251 -516253 -516277 -516283 -516293 -516319 -516323 -516349 -516359 -516361 -516371 -516377 -516391 -516407 -516421 -516431 -516433 -516437 -516449 -516457 -516469 -516493 -516499 -516517 -516521 -516539 -516541 -516563 -516587 -516589 -516599 -516611 -516617 -516619 -516623 -516643 -516653 -516673 -516679 -516689 -516701 -516709 -516713 -516721 -516727 -516757 -516793 -516811 -516821 -516829 -516839 -516847 -516871 -516877 -516883 -516907 -516911 -516931 -516947 -516949 -516959 -516973 -516977 -516979 -516991 -517003 -517043 -517061 -517067 -517073 -517079 -517081 -517087 -517091 -517129 -517151 -517169 -517177 -517183 -517189 -517207 -517211 -517217 -517229 -517241 -517243 -517249 -517261 -517267 -517277 -517289 -517303 -517337 -517343 -517367 -517373 -517381 -517393 -517399 -517403 -517411 -517417 -517457 -517459 -517469 -517471 -517481 -517487 -517499 -517501 -517507 -517511 -517513 -517547 -517549 -517553 -517571 -517577 -517589 -517597 -517603 -517609 -517613 -517619 -517637 -517639 -517711 -517717 -517721 -517729 -517733 -517739 -517747 -517817 -517823 -517831 -517861 -517873 -517877 -517901 -517919 -517927 -517931 -517949 -517967 -517981 -517991 -517999 -518017 -518047 -518057 -518059 -518083 -518099 -518101 -518113 -518123 -518129 -518131 -518137 -518153 -518159 -518171 -518179 -518191 -518207 -518209 -518233 -518237 -518239 -518249 -518261 -518291 -518299 -518311 -518327 -518341 -518387 -518389 -518411 -518417 -518429 -518431 -518447 -518467 -518471 -518473 -518509 -518521 -518533 -518543 -518579 -518587 -518597 -518611 -518621 -518657 -518689 -518699 -518717 -518729 -518737 -518741 -518743 -518747 -518759 -518761 -518767 -518779 -518801 -518803 -518807 -518809 -518813 -518831 -518863 -518867 -518893 -518911 -518933 -518953 -518981 -518983 -518989 -519011 -519031 -519037 -519067 -519083 -519089 -519091 -519097 -519107 -519119 -519121 -519131 -519151 -519161 -519193 -519217 -519227 -519229 -519247 -519257 -519269 -519283 -519287 -519301 -519307 -519349 -519353 -519359 -519371 -519373 -519383 -519391 -519413 -519427 -519433 -519457 -519487 -519499 -519509 -519521 -519523 -519527 -519539 -519551 -519553 -519577 -519581 -519587 -519611 -519619 -519643 -519647 -519667 -519683 -519691 -519703 -519713 -519733 -519737 -519769 -519787 -519793 -519797 -519803 -519817 -519863 -519881 -519889 -519907 -519917 -519919 -519923 -519931 -519943 -519947 -519971 -519989 -519997 -520019 -520021 -520031 -520043 -520063 -520067 -520073 -520103 -520111 -520123 -520129 -520151 -520193 -520213 -520241 -520279 -520291 -520297 -520307 -520309 -520313 -520339 -520349 -520357 -520361 -520363 -520369 -520379 -520381 -520393 -520409 -520411 -520423 -520427 -520433 -520447 -520451 -520529 -520547 -520549 -520567 -520571 -520589 -520607 -520609 -520621 -520631 -520633 -520649 -520679 -520691 -520699 -520703 -520717 -520721 -520747 -520759 -520763 -520787 -520813 -520837 -520841 -520853 -520867 -520889 -520913 -520921 -520943 -520957 -520963 -520967 -520969 -520981 -521009 -521021 -521023 -521039 -521041 -521047 -521051 -521063 -521107 -521119 -521137 -521153 -521161 -521167 -521173 -521177 -521179 -521201 -521231 -521243 -521251 -521267 -521281 -521299 -521309 -521317 -521329 -521357 -521359 -521363 -521369 -521377 -521393 -521399 -521401 -521429 -521447 -521471 -521483 -521491 -521497 -521503 -521519 -521527 -521533 -521537 -521539 -521551 -521557 -521567 -521581 -521603 -521641 -521657 -521659 -521669 -521671 -521693 -521707 -521723 -521743 -521749 -521753 -521767 -521777 -521789 -521791 -521809 -521813 -521819 -521831 -521861 -521869 -521879 -521881 -521887 -521897 -521903 -521923 -521929 -521981 -521993 -521999 -522017 -522037 -522047 -522059 -522061 -522073 -522079 -522083 -522113 -522127 -522157 -522161 -522167 -522191 -522199 -522211 -522227 -522229 -522233 -522239 -522251 -522259 -522281 -522283 -522289 -522317 -522323 -522337 -522371 -522373 -522383 -522391 -522409 -522413 -522439 -522449 -522469 -522479 -522497 -522517 -522521 -522523 -522541 -522553 -522569 -522601 -522623 -522637 -522659 -522661 -522673 -522677 -522679 -522689 -522703 -522707 -522719 -522737 -522749 -522757 -522761 -522763 -522787 -522811 -522827 -522829 -522839 -522853 -522857 -522871 -522881 -522883 -522887 -522919 -522943 -522947 -522959 -522961 -522989 -523007 -523021 -523031 -523049 -523093 -523097 -523109 -523129 -523169 -523177 -523207 -523213 -523219 -523261 -523297 -523307 -523333 -523349 -523351 -523357 -523387 -523403 -523417 -523427 -523433 -523459 -523463 -523487 -523489 -523493 -523511 -523519 -523541 -523543 -523553 -523571 -523573 -523577 -523597 -523603 -523631 -523637 -523639 -523657 -523667 -523669 -523673 -523681 -523717 -523729 -523741 -523759 -523763 -523771 -523777 -523793 -523801 -523829 -523847 -523867 -523877 -523903 -523907 -523927 -523937 -523949 -523969 -523987 -523997 -524047 -524053 -524057 -524063 -524071 -524081 -524087 -524099 -524113 -524119 -524123 -524149 -524171 -524189 -524197 -524201 -524203 -524219 -524221 -524231 -524243 -524257 -524261 -524269 -524287 -524309 -524341 -524347 -524351 -524353 -524369 -524387 -524389 -524411 -524413 -524429 -524453 -524497 -524507 -524509 -524519 -524521 -524591 -524593 -524599 -524633 -524669 -524681 -524683 -524701 -524707 -524731 -524743 -524789 -524801 -524803 -524827 -524831 -524857 -524863 -524869 -524873 -524893 -524899 -524921 -524933 -524939 -524941 -524947 -524957 -524959 -524963 -524969 -524971 -524981 -524983 -524999 -525001 -525013 -525017 -525029 -525043 -525101 -525127 -525137 -525143 -525157 -525163 -525167 -525191 -525193 -525199 -525209 -525221 -525241 -525247 -525253 -525257 -525299 -525313 -525353 -525359 -525361 -525373 -525377 -525379 -525391 -525397 -525409 -525431 -525433 -525439 -525457 -525461 -525467 -525491 -525493 -525517 -525529 -525533 -525541 -525571 -525583 -525593 -525599 -525607 -525641 -525649 -525671 -525677 -525697 -525709 -525713 -525719 -525727 -525731 -525739 -525769 -525773 -525781 -525809 -525817 -525839 -525869 -525871 -525887 -525893 -525913 -525923 -525937 -525947 -525949 -525953 -525961 -525979 -525983 -526027 -526037 -526049 -526051 -526063 -526067 -526069 -526073 -526087 -526117 -526121 -526139 -526157 -526159 -526189 -526193 -526199 -526213 -526223 -526231 -526249 -526271 -526283 -526289 -526291 -526297 -526307 -526367 -526373 -526381 -526387 -526391 -526397 -526423 -526429 -526441 -526453 -526459 -526483 -526499 -526501 -526511 -526531 -526543 -526571 -526573 -526583 -526601 -526619 -526627 -526633 -526637 -526649 -526651 -526657 -526667 -526679 -526681 -526703 -526709 -526717 -526733 -526739 -526741 -526759 -526763 -526777 -526781 -526829 -526831 -526837 -526853 -526859 -526871 -526909 -526913 -526931 -526937 -526943 -526951 -526957 -526963 -526993 -526997 -527053 -527057 -527063 -527069 -527071 -527081 -527099 -527123 -527129 -527143 -527159 -527161 -527173 -527179 -527203 -527207 -527209 -527237 -527251 -527273 -527281 -527291 -527327 -527333 -527347 -527353 -527377 -527381 -527393 -527399 -527407 -527411 -527419 -527441 -527447 -527453 -527489 -527507 -527533 -527557 -527563 -527581 -527591 -527599 -527603 -527623 -527627 -527633 -527671 -527699 -527701 -527729 -527741 -527749 -527753 -527789 -527803 -527809 -527819 -527843 -527851 -527869 -527881 -527897 -527909 -527921 -527929 -527941 -527981 -527983 -527987 -527993 -528001 -528013 -528041 -528043 -528053 -528091 -528097 -528107 -528127 -528131 -528137 -528163 -528167 -528191 -528197 -528217 -528223 -528247 -528263 -528289 -528299 -528313 -528317 -528329 -528373 -528383 -528391 -528401 -528403 -528413 -528419 -528433 -528469 -528487 -528491 -528509 -528511 -528527 -528559 -528611 -528623 -528629 -528631 -528659 -528667 -528673 -528679 -528691 -528707 -528709 -528719 -528763 -528779 -528791 -528799 -528811 -528821 -528823 -528833 -528863 -528877 -528881 -528883 -528911 -528929 -528947 -528967 -528971 -528973 -528991 -529003 -529007 -529027 -529033 -529037 -529043 -529049 -529051 -529097 -529103 -529117 -529121 -529127 -529129 -529153 -529157 -529181 -529183 -529213 -529229 -529237 -529241 -529259 -529271 -529273 -529301 -529307 -529313 -529327 -529343 -529349 -529357 -529381 -529393 -529411 -529421 -529423 -529471 -529489 -529513 -529517 -529519 -529531 -529547 -529577 -529579 -529603 -529619 -529637 -529649 -529657 -529673 -529681 -529687 -529691 -529693 -529709 -529723 -529741 -529747 -529751 -529807 -529811 -529813 -529819 -529829 -529847 -529871 -529927 -529933 -529939 -529957 -529961 -529973 -529979 -529981 -529987 -529999 -530017 -530021 -530027 -530041 -530051 -530063 -530087 -530093 -530129 -530137 -530143 -530177 -530183 -530197 -530203 -530209 -530227 -530237 -530249 -530251 -530261 -530267 -530279 -530293 -530297 -530303 -530329 -530333 -530339 -530353 -530359 -530389 -530393 -530401 -530429 -530443 -530447 -530501 -530507 -530513 -530527 -530531 -530533 -530539 -530549 -530567 -530597 -530599 -530603 -530609 -530641 -530653 -530659 -530669 -530693 -530701 -530711 -530713 -530731 -530741 -530743 -530753 -530767 -530773 -530797 -530807 -530833 -530837 -530843 -530851 -530857 -530861 -530869 -530897 -530911 -530947 -530969 -530977 -530983 -530989 -531017 -531023 -531043 -531071 -531079 -531101 -531103 -531121 -531133 -531143 -531163 -531169 -531173 -531197 -531203 -531229 -531239 -531253 -531263 -531281 -531287 -531299 -531331 -531337 -531343 -531347 -531353 -531359 -531383 -531457 -531481 -531497 -531521 -531547 -531551 -531569 -531571 -531581 -531589 -531611 -531613 -531623 -531631 -531637 -531667 -531673 -531689 -531701 -531731 -531793 -531799 -531821 -531823 -531827 -531833 -531841 -531847 -531857 -531863 -531871 -531877 -531901 -531911 -531919 -531977 -531983 -531989 -531997 -532001 -532009 -532027 -532033 -532061 -532069 -532093 -532099 -532141 -532153 -532159 -532163 -532183 -532187 -532193 -532199 -532241 -532249 -532261 -532267 -532277 -532283 -532307 -532313 -532327 -532331 -532333 -532349 -532373 -532379 -532391 -532403 -532417 -532421 -532439 -532447 -532451 -532453 -532489 -532501 -532523 -532529 -532531 -532537 -532547 -532561 -532601 -532603 -532607 -532619 -532621 -532633 -532639 -532663 -532669 -532687 -532691 -532709 -532733 -532739 -532751 -532757 -532771 -532781 -532783 -532789 -532801 -532811 -532823 -532849 -532853 -532867 -532907 -532919 -532949 -532951 -532981 -532993 -532999 -533003 -533009 -533011 -533033 -533051 -533053 -533063 -533077 -533089 -533111 -533129 -533149 -533167 -533177 -533189 -533191 -533213 -533219 -533227 -533237 -533249 -533257 -533261 -533263 -533297 -533303 -533317 -533321 -533327 -533353 -533363 -533371 -533389 -533399 -533413 -533447 -533453 -533459 -533509 -533543 -533549 -533573 -533581 -533593 -533633 -533641 -533671 -533693 -533711 -533713 -533719 -533723 -533737 -533747 -533777 -533801 -533809 -533821 -533831 -533837 -533857 -533879 -533887 -533893 -533909 -533921 -533927 -533959 -533963 -533969 -533971 -533989 -533993 -533999 -534007 -534013 -534019 -534029 -534043 -534047 -534049 -534059 -534073 -534077 -534091 -534101 -534113 -534137 -534167 -534173 -534199 -534203 -534211 -534229 -534241 -534253 -534283 -534301 -534307 -534311 -534323 -534329 -534341 -534367 -534371 -534403 -534407 -534431 -534439 -534473 -534491 -534511 -534529 -534553 -534571 -534577 -534581 -534601 -534607 -534617 -534629 -534631 -534637 -534647 -534649 -534659 -534661 -534671 -534697 -534707 -534739 -534799 -534811 -534827 -534839 -534841 -534851 -534857 -534883 -534889 -534913 -534923 -534931 -534943 -534949 -534971 -535013 -535019 -535033 -535037 -535061 -535099 -535103 -535123 -535133 -535151 -535159 -535169 -535181 -535193 -535207 -535219 -535229 -535237 -535243 -535273 -535303 -535319 -535333 -535349 -535351 -535361 -535387 -535391 -535399 -535481 -535487 -535489 -535499 -535511 -535523 -535529 -535547 -535571 -535573 -535589 -535607 -535609 -535627 -535637 -535663 -535669 -535673 -535679 -535697 -535709 -535727 -535741 -535751 -535757 -535771 -535783 -535793 -535811 -535849 -535859 -535861 -535879 -535919 -535937 -535939 -535943 -535957 -535967 -535973 -535991 -535999 -536017 -536023 -536051 -536057 -536059 -536069 -536087 -536099 -536101 -536111 -536141 -536147 -536149 -536189 -536191 -536203 -536213 -536219 -536227 -536233 -536243 -536267 -536273 -536279 -536281 -536287 -536293 -536311 -536323 -536353 -536357 -536377 -536399 -536407 -536423 -536441 -536443 -536447 -536449 -536453 -536461 -536467 -536479 -536491 -536509 -536513 -536531 -536533 -536561 -536563 -536593 -536609 -536621 -536633 -536651 -536671 -536677 -536687 -536699 -536717 -536719 -536729 -536743 -536749 -536771 -536773 -536777 -536779 -536791 -536801 -536803 -536839 -536849 -536857 -536867 -536869 -536891 -536909 -536917 -536923 -536929 -536933 -536947 -536953 -536971 -536989 -536999 -537001 -537007 -537011 -537023 -537029 -537037 -537041 -537067 -537071 -537079 -537091 -537127 -537133 -537143 -537157 -537169 -537181 -537191 -537197 -537221 -537233 -537241 -537269 -537281 -537287 -537307 -537331 -537343 -537347 -537373 -537379 -537401 -537403 -537413 -537497 -537527 -537547 -537569 -537583 -537587 -537599 -537611 -537637 -537661 -537673 -537679 -537703 -537709 -537739 -537743 -537749 -537769 -537773 -537781 -537787 -537793 -537811 -537841 -537847 -537853 -537877 -537883 -537899 -537913 -537919 -537941 -537991 -538001 -538019 -538049 -538051 -538073 -538079 -538093 -538117 -538121 -538123 -538127 -538147 -538151 -538157 -538159 -538163 -538199 -538201 -538247 -538249 -538259 -538267 -538283 -538297 -538301 -538303 -538309 -538331 -538333 -538357 -538367 -538397 -538399 -538411 -538423 -538457 -538471 -538481 -538487 -538511 -538513 -538519 -538523 -538529 -538553 -538561 -538567 -538579 -538589 -538597 -538621 -538649 -538651 -538697 -538709 -538711 -538721 -538723 -538739 -538751 -538763 -538771 -538777 -538789 -538799 -538801 -538817 -538823 -538829 -538841 -538871 -538877 -538921 -538927 -538931 -538939 -538943 -538987 -539003 -539009 -539039 -539047 -539089 -539093 -539101 -539107 -539111 -539113 -539129 -539141 -539153 -539159 -539167 -539171 -539207 -539219 -539233 -539237 -539261 -539267 -539269 -539293 -539303 -539309 -539311 -539321 -539323 -539339 -539347 -539351 -539389 -539401 -539447 -539449 -539479 -539501 -539503 -539507 -539509 -539533 -539573 -539621 -539629 -539633 -539639 -539641 -539653 -539663 -539677 -539687 -539711 -539713 -539723 -539729 -539743 -539761 -539783 -539797 -539837 -539839 -539843 -539849 -539863 -539881 -539897 -539899 -539921 -539947 -539993 -540041 -540061 -540079 -540101 -540119 -540121 -540139 -540149 -540157 -540167 -540173 -540179 -540181 -540187 -540203 -540217 -540233 -540251 -540269 -540271 -540283 -540301 -540307 -540343 -540347 -540349 -540367 -540373 -540377 -540383 -540389 -540391 -540433 -540437 -540461 -540469 -540509 -540511 -540517 -540539 -540541 -540557 -540559 -540577 -540587 -540599 -540611 -540613 -540619 -540629 -540677 -540679 -540689 -540691 -540697 -540703 -540713 -540751 -540769 -540773 -540779 -540781 -540803 -540809 -540823 -540851 -540863 -540871 -540877 -540901 -540907 -540961 -540989 -541001 -541007 -541027 -541049 -541061 -541087 -541097 -541129 -541133 -541141 -541153 -541181 -541193 -541201 -541217 -541231 -541237 -541249 -541267 -541271 -541283 -541301 -541309 -541339 -541349 -541361 -541363 -541369 -541381 -541391 -541417 -541439 -541447 -541469 -541483 -541507 -541511 -541523 -541529 -541531 -541537 -541543 -541547 -541549 -541571 -541577 -541579 -541589 -541613 -541631 -541657 -541661 -541669 -541693 -541699 -541711 -541721 -541727 -541759 -541763 -541771 -541777 -541781 -541799 -541817 -541831 -541837 -541859 -541889 -541901 -541927 -541951 -541967 -541987 -541991 -541993 -541999 -542021 -542023 -542027 -542053 -542063 -542071 -542081 -542083 -542093 -542111 -542117 -542119 -542123 -542131 -542141 -542149 -542153 -542167 -542183 -542189 -542197 -542207 -542219 -542237 -542251 -542261 -542263 -542281 -542293 -542299 -542323 -542371 -542401 -542441 -542447 -542461 -542467 -542483 -542489 -542497 -542519 -542533 -542537 -542539 -542551 -542557 -542567 -542579 -542587 -542599 -542603 -542683 -542687 -542693 -542713 -542719 -542723 -542747 -542761 -542771 -542783 -542791 -542797 -542821 -542831 -542837 -542873 -542891 -542911 -542921 -542923 -542933 -542939 -542947 -542951 -542981 -542987 -542999 -543017 -543019 -543029 -543061 -543097 -543113 -543131 -543139 -543143 -543149 -543157 -543161 -543163 -543187 -543203 -543217 -543223 -543227 -543233 -543241 -543253 -543259 -543281 -543287 -543289 -543299 -543307 -543311 -543313 -543341 -543349 -543353 -543359 -543379 -543383 -543407 -543427 -543463 -543497 -543503 -543509 -543539 -543551 -543553 -543593 -543601 -543607 -543611 -543617 -543637 -543659 -543661 -543671 -543679 -543689 -543703 -543707 -543713 -543769 -543773 -543787 -543791 -543793 -543797 -543811 -543827 -543841 -543853 -543857 -543859 -543871 -543877 -543883 -543887 -543889 -543901 -543911 -543929 -543967 -543971 -543997 -544001 -544007 -544009 -544013 -544021 -544031 -544097 -544099 -544109 -544123 -544129 -544133 -544139 -544171 -544177 -544183 -544199 -544223 -544259 -544273 -544277 -544279 -544367 -544373 -544399 -544403 -544429 -544451 -544471 -544477 -544487 -544501 -544513 -544517 -544543 -544549 -544601 -544613 -544627 -544631 -544651 -544667 -544699 -544717 -544721 -544723 -544727 -544757 -544759 -544771 -544781 -544793 -544807 -544813 -544837 -544861 -544877 -544879 -544883 -544889 -544897 -544903 -544919 -544927 -544937 -544961 -544963 -544979 -545023 -545029 -545033 -545057 -545063 -545087 -545089 -545093 -545117 -545131 -545141 -545143 -545161 -545189 -545203 -545213 -545231 -545239 -545257 -545267 -545291 -545329 -545371 -545387 -545429 -545437 -545443 -545449 -545473 -545477 -545483 -545497 -545521 -545527 -545533 -545543 -545549 -545551 -545579 -545599 -545609 -545617 -545621 -545641 -545647 -545651 -545663 -545711 -545723 -545731 -545747 -545749 -545759 -545773 -545789 -545791 -545827 -545843 -545863 -545873 -545893 -545899 -545911 -545917 -545929 -545933 -545939 -545947 -545959 -546001 -546017 -546019 -546031 -546047 -546053 -546067 -546071 -546097 -546101 -546103 -546109 -546137 -546149 -546151 -546173 -546179 -546197 -546211 -546233 -546239 -546241 -546253 -546263 -546283 -546289 -546317 -546323 -546341 -546349 -546353 -546361 -546367 -546373 -546391 -546461 -546467 -546479 -546509 -546523 -546547 -546569 -546583 -546587 -546599 -546613 -546617 -546619 -546631 -546643 -546661 -546671 -546677 -546683 -546691 -546709 -546719 -546731 -546739 -546781 -546841 -546859 -546863 -546869 -546881 -546893 -546919 -546937 -546943 -546947 -546961 -546967 -546977 -547007 -547021 -547037 -547061 -547087 -547093 -547097 -547103 -547121 -547133 -547139 -547171 -547223 -547229 -547237 -547241 -547249 -547271 -547273 -547291 -547301 -547321 -547357 -547361 -547363 -547369 -547373 -547387 -547397 -547399 -547411 -547441 -547453 -547471 -547483 -547487 -547493 -547499 -547501 -547513 -547529 -547537 -547559 -547567 -547577 -547583 -547601 -547609 -547619 -547627 -547639 -547643 -547661 -547663 -547681 -547709 -547727 -547741 -547747 -547753 -547763 -547769 -547787 -547817 -547819 -547823 -547831 -547849 -547853 -547871 -547889 -547901 -547909 -547951 -547957 -547999 -548003 -548039 -548059 -548069 -548083 -548089 -548099 -548117 -548123 -548143 -548153 -548189 -548201 -548213 -548221 -548227 -548239 -548243 -548263 -548291 -548309 -548323 -548347 -548351 -548363 -548371 -548393 -548399 -548407 -548417 -548423 -548441 -548453 -548459 -548461 -548489 -548501 -548503 -548519 -548521 -548533 -548543 -548557 -548567 -548579 -548591 -548623 -548629 -548657 -548671 -548677 -548687 -548693 -548707 -548719 -548749 -548753 -548761 -548771 -548783 -548791 -548827 -548831 -548833 -548837 -548843 -548851 -548861 -548869 -548893 -548897 -548903 -548909 -548927 -548953 -548957 -548963 -549001 -549011 -549013 -549019 -549023 -549037 -549071 -549089 -549091 -549097 -549121 -549139 -549149 -549161 -549163 -549167 -549169 -549193 -549203 -549221 -549229 -549247 -549257 -549259 -549281 -549313 -549319 -549323 -549331 -549379 -549391 -549403 -549421 -549431 -549443 -549449 -549481 -549503 -549509 -549511 -549517 -549533 -549547 -549551 -549553 -549569 -549587 -549589 -549607 -549623 -549641 -549643 -549649 -549667 -549683 -549691 -549701 -549707 -549713 -549719 -549733 -549737 -549739 -549749 -549751 -549767 -549817 -549833 -549839 -549863 -549877 -549883 -549911 -549937 -549943 -549949 -549977 -549979 -550007 -550009 -550027 -550049 -550061 -550063 -550073 -550111 -550117 -550127 -550129 -550139 -550163 -550169 -550177 -550181 -550189 -550211 -550213 -550241 -550267 -550279 -550283 -550289 -550309 -550337 -550351 -550369 -550379 -550427 -550439 -550441 -550447 -550457 -550469 -550471 -550489 -550513 -550519 -550531 -550541 -550553 -550577 -550607 -550609 -550621 -550631 -550637 -550651 -550657 -550661 -550663 -550679 -550691 -550703 -550717 -550721 -550733 -550757 -550763 -550789 -550801 -550811 -550813 -550831 -550841 -550843 -550859 -550861 -550903 -550909 -550937 -550939 -550951 -550961 -550969 -550973 -550993 -550997 -551003 -551017 -551027 -551039 -551059 -551063 -551069 -551093 -551099 -551107 -551113 -551129 -551143 -551179 -551197 -551207 -551219 -551231 -551233 -551269 -551281 -551297 -551311 -551321 -551339 -551347 -551363 -551381 -551387 -551407 -551423 -551443 -551461 -551483 -551489 -551503 -551519 -551539 -551543 -551549 -551557 -551569 -551581 -551587 -551597 -551651 -551653 -551659 -551671 -551689 -551693 -551713 -551717 -551723 -551729 -551731 -551743 -551753 -551767 -551773 -551801 -551809 -551813 -551843 -551849 -551861 -551909 -551911 -551917 -551927 -551933 -551951 -551959 -551963 -551981 -552001 -552011 -552029 -552031 -552047 -552053 -552059 -552089 -552091 -552103 -552107 -552113 -552127 -552137 -552179 -552193 -552217 -552239 -552241 -552259 -552263 -552271 -552283 -552301 -552317 -552341 -552353 -552379 -552397 -552401 -552403 -552469 -552473 -552481 -552491 -552493 -552511 -552523 -552527 -552553 -552581 -552583 -552589 -552611 -552649 -552659 -552677 -552703 -552707 -552709 -552731 -552749 -552751 -552757 -552787 -552791 -552793 -552809 -552821 -552833 -552841 -552847 -552859 -552883 -552887 -552899 -552913 -552917 -552971 -552983 -552991 -553013 -553037 -553043 -553051 -553057 -553067 -553073 -553093 -553097 -553099 -553103 -553123 -553139 -553141 -553153 -553171 -553181 -553193 -553207 -553211 -553229 -553249 -553253 -553277 -553279 -553309 -553351 -553363 -553369 -553411 -553417 -553433 -553439 -553447 -553457 -553463 -553471 -553481 -553507 -553513 -553517 -553529 -553543 -553549 -553561 -553573 -553583 -553589 -553591 -553601 -553607 -553627 -553643 -553649 -553667 -553681 -553687 -553699 -553703 -553727 -553733 -553747 -553757 -553759 -553769 -553789 -553811 -553837 -553849 -553867 -553873 -553897 -553901 -553919 -553921 -553933 -553961 -553963 -553981 -553991 -554003 -554011 -554017 -554051 -554077 -554087 -554089 -554117 -554123 -554129 -554137 -554167 -554171 -554179 -554189 -554207 -554209 -554233 -554237 -554263 -554269 -554293 -554299 -554303 -554317 -554347 -554377 -554383 -554417 -554419 -554431 -554447 -554453 -554467 -554503 -554527 -554531 -554569 -554573 -554597 -554611 -554627 -554633 -554639 -554641 -554663 -554669 -554677 -554699 -554707 -554711 -554731 -554747 -554753 -554759 -554767 -554779 -554789 -554791 -554797 -554803 -554821 -554833 -554837 -554839 -554843 -554849 -554887 -554891 -554893 -554899 -554923 -554927 -554951 -554959 -554969 -554977 -555029 -555041 -555043 -555053 -555073 -555077 -555083 -555091 -555097 -555109 -555119 -555143 -555167 -555209 -555221 -555251 -555253 -555257 -555277 -555287 -555293 -555301 -555307 -555337 -555349 -555361 -555383 -555391 -555419 -555421 -555439 -555461 -555487 -555491 -555521 -555523 -555557 -555589 -555593 -555637 -555661 -555671 -555677 -555683 -555691 -555697 -555707 -555739 -555743 -555761 -555767 -555823 -555827 -555829 -555853 -555857 -555871 -555931 -555941 -555953 -555967 -556007 -556021 -556027 -556037 -556043 -556051 -556067 -556069 -556093 -556103 -556123 -556159 -556177 -556181 -556211 -556219 -556229 -556243 -556253 -556261 -556267 -556271 -556273 -556279 -556289 -556313 -556321 -556327 -556331 -556343 -556351 -556373 -556399 -556403 -556441 -556459 -556477 -556483 -556487 -556513 -556519 -556537 -556559 -556573 -556579 -556583 -556601 -556607 -556609 -556613 -556627 -556639 -556651 -556679 -556687 -556691 -556693 -556697 -556709 -556723 -556727 -556741 -556753 -556763 -556769 -556781 -556789 -556793 -556799 -556811 -556817 -556819 -556823 -556841 -556849 -556859 -556861 -556867 -556883 -556891 -556931 -556939 -556943 -556957 -556967 -556981 -556987 -556999 -557017 -557021 -557027 -557033 -557041 -557057 -557059 -557069 -557087 -557093 -557153 -557159 -557197 -557201 -557261 -557269 -557273 -557281 -557303 -557309 -557321 -557329 -557339 -557369 -557371 -557377 -557423 -557443 -557449 -557461 -557483 -557489 -557519 -557521 -557533 -557537 -557551 -557567 -557573 -557591 -557611 -557633 -557639 -557663 -557671 -557693 -557717 -557729 -557731 -557741 -557743 -557747 -557759 -557761 -557779 -557789 -557801 -557803 -557831 -557857 -557861 -557863 -557891 -557899 -557903 -557927 -557981 -557987 -558007 -558017 -558029 -558053 -558067 -558083 -558091 -558109 -558113 -558121 -558139 -558149 -558167 -558179 -558197 -558203 -558209 -558223 -558241 -558251 -558253 -558287 -558289 -558307 -558319 -558343 -558401 -558413 -558421 -558427 -558431 -558457 -558469 -558473 -558479 -558491 -558497 -558499 -558521 -558529 -558533 -558539 -558541 -558563 -558583 -558587 -558599 -558611 -558629 -558643 -558661 -558683 -558703 -558721 -558731 -558757 -558769 -558781 -558787 -558791 -558793 -558827 -558829 -558863 -558869 -558881 -558893 -558913 -558931 -558937 -558947 -558973 -558979 -558997 -559001 -559049 -559051 -559067 -559081 -559093 -559099 -559123 -559133 -559157 -559177 -559183 -559201 -559211 -559213 -559217 -559219 -559231 -559243 -559259 -559277 -559297 -559313 -559319 -559343 -559357 -559367 -559369 -559397 -559421 -559451 -559459 -559469 -559483 -559511 -559513 -559523 -559529 -559541 -559547 -559549 -559561 -559571 -559577 -559583 -559591 -559597 -559631 -559633 -559639 -559649 -559667 -559673 -559679 -559687 -559703 -559709 -559739 -559747 -559777 -559781 -559799 -559807 -559813 -559831 -559841 -559849 -559859 -559877 -559883 -559901 -559907 -559913 -559939 -559967 -559973 -559991 -560017 -560023 -560029 -560039 -560047 -560081 -560083 -560089 -560093 -560107 -560113 -560117 -560123 -560137 -560149 -560159 -560171 -560173 -560179 -560191 -560207 -560213 -560221 -560227 -560233 -560237 -560239 -560243 -560249 -560281 -560293 -560297 -560299 -560311 -560317 -560341 -560353 -560393 -560411 -560437 -560447 -560459 -560471 -560477 -560479 -560489 -560491 -560501 -560503 -560531 -560543 -560551 -560561 -560597 -560617 -560621 -560639 -560641 -560653 -560669 -560683 -560689 -560701 -560719 -560737 -560753 -560761 -560767 -560771 -560783 -560797 -560803 -560827 -560837 -560863 -560869 -560873 -560887 -560891 -560893 -560897 -560929 -560939 -560941 -560969 -560977 -561019 -561047 -561053 -561059 -561061 -561079 -561083 -561091 -561097 -561101 -561103 -561109 -561161 -561173 -561181 -561191 -561199 -561229 -561251 -561277 -561307 -561313 -561343 -561347 -561359 -561367 -561373 -561377 -561389 -561409 -561419 -561439 -561461 -561521 -561529 -561551 -561553 -561559 -561599 -561607 -561667 -561703 -561713 -561733 -561761 -561767 -561787 -561797 -561809 -561829 -561839 -561907 -561917 -561923 -561931 -561943 -561947 -561961 -561973 -561983 -561997 -562007 -562019 -562021 -562043 -562091 -562103 -562129 -562147 -562169 -562181 -562193 -562201 -562231 -562259 -562271 -562273 -562283 -562291 -562297 -562301 -562307 -562313 -562333 -562337 -562349 -562351 -562357 -562361 -562399 -562403 -562409 -562417 -562421 -562427 -562439 -562459 -562477 -562493 -562501 -562517 -562519 -562537 -562577 -562579 -562589 -562591 -562607 -562613 -562621 -562631 -562633 -562651 -562663 -562669 -562673 -562691 -562693 -562699 -562703 -562711 -562721 -562739 -562753 -562759 -562763 -562781 -562789 -562813 -562831 -562841 -562871 -562897 -562901 -562909 -562931 -562943 -562949 -562963 -562967 -562973 -562979 -562987 -562997 -563009 -563011 -563021 -563039 -563041 -563047 -563051 -563077 -563081 -563099 -563113 -563117 -563119 -563131 -563149 -563153 -563183 -563197 -563219 -563249 -563263 -563287 -563327 -563351 -563357 -563359 -563377 -563401 -563411 -563413 -563417 -563419 -563447 -563449 -563467 -563489 -563501 -563503 -563543 -563551 -563561 -563587 -563593 -563599 -563623 -563657 -563663 -563723 -563743 -563747 -563777 -563809 -563813 -563821 -563831 -563837 -563851 -563869 -563881 -563887 -563897 -563929 -563933 -563947 -563971 -563987 -563999 -564013 -564017 -564041 -564049 -564059 -564061 -564089 -564097 -564103 -564127 -564133 -564149 -564163 -564173 -564191 -564197 -564227 -564229 -564233 -564251 -564257 -564269 -564271 -564299 -564301 -564307 -564313 -564323 -564353 -564359 -564367 -564371 -564373 -564391 -564401 -564407 -564409 -564419 -564437 -564449 -564457 -564463 -564467 -564491 -564497 -564523 -564533 -564593 -564607 -564617 -564643 -564653 -564667 -564671 -564679 -564701 -564703 -564709 -564713 -564761 -564779 -564793 -564797 -564827 -564871 -564881 -564899 -564917 -564919 -564923 -564937 -564959 -564973 -564979 -564983 -564989 -564997 -565013 -565039 -565049 -565057 -565069 -565109 -565111 -565127 -565163 -565171 -565177 -565183 -565189 -565207 -565237 -565241 -565247 -565259 -565261 -565273 -565283 -565289 -565303 -565319 -565333 -565337 -565343 -565361 -565379 -565381 -565387 -565391 -565393 -565427 -565429 -565441 -565451 -565463 -565469 -565483 -565489 -565507 -565511 -565517 -565519 -565549 -565553 -565559 -565567 -565571 -565583 -565589 -565597 -565603 -565613 -565637 -565651 -565661 -565667 -565723 -565727 -565769 -565771 -565787 -565793 -565813 -565849 -565867 -565889 -565891 -565907 -565909 -565919 -565921 -565937 -565973 -565979 -565997 -566011 -566023 -566047 -566057 -566077 -566089 -566101 -566107 -566131 -566149 -566161 -566173 -566179 -566183 -566201 -566213 -566227 -566231 -566233 -566273 -566311 -566323 -566347 -566387 -566393 -566413 -566417 -566429 -566431 -566437 -566441 -566443 -566453 -566521 -566537 -566539 -566543 -566549 -566551 -566557 -566563 -566567 -566617 -566633 -566639 -566653 -566659 -566677 -566681 -566693 -566701 -566707 -566717 -566719 -566723 -566737 -566759 -566767 -566791 -566821 -566833 -566851 -566857 -566879 -566911 -566939 -566947 -566963 -566971 -566977 -566987 -566999 -567011 -567013 -567031 -567053 -567059 -567067 -567097 -567101 -567107 -567121 -567143 -567179 -567181 -567187 -567209 -567257 -567263 -567277 -567319 -567323 -567367 -567377 -567383 -567389 -567401 -567407 -567439 -567449 -567451 -567467 -567487 -567493 -567499 -567527 -567529 -567533 -567569 -567601 -567607 -567631 -567649 -567653 -567659 -567661 -567667 -567673 -567689 -567719 -567737 -567751 -567761 -567767 -567779 -567793 -567811 -567829 -567841 -567857 -567863 -567871 -567877 -567881 -567883 -567899 -567937 -567943 -567947 -567949 -567961 -567979 -567991 -567997 -568019 -568027 -568033 -568049 -568069 -568091 -568097 -568109 -568133 -568151 -568153 -568163 -568171 -568177 -568187 -568189 -568193 -568201 -568207 -568231 -568237 -568241 -568273 -568279 -568289 -568303 -568349 -568363 -568367 -568387 -568391 -568433 -568439 -568441 -568453 -568471 -568481 -568493 -568523 -568541 -568549 -568577 -568609 -568619 -568627 -568643 -568657 -568669 -568679 -568691 -568699 -568709 -568723 -568751 -568783 -568787 -568807 -568823 -568831 -568853 -568877 -568891 -568903 -568907 -568913 -568921 -568963 -568979 -568987 -568991 -568999 -569003 -569011 -569021 -569047 -569053 -569057 -569071 -569077 -569081 -569083 -569111 -569117 -569137 -569141 -569159 -569161 -569189 -569197 -569201 -569209 -569213 -569237 -569243 -569249 -569251 -569263 -569267 -569269 -569321 -569323 -569369 -569417 -569419 -569423 -569431 -569447 -569461 -569479 -569497 -569507 -569533 -569573 -569579 -569581 -569599 -569603 -569609 -569617 -569623 -569659 -569663 -569671 -569683 -569711 -569713 -569717 -569729 -569731 -569747 -569759 -569771 -569773 -569797 -569809 -569813 -569819 -569831 -569839 -569843 -569851 -569861 -569869 -569887 -569893 -569897 -569903 -569927 -569939 -569957 -569983 -570001 -570013 -570029 -570041 -570043 -570047 -570049 -570071 -570077 -570079 -570083 -570091 -570107 -570109 -570113 -570131 -570139 -570161 -570173 -570181 -570191 -570217 -570221 -570233 -570253 -570329 -570359 -570373 -570379 -570389 -570391 -570403 -570407 -570413 -570419 -570421 -570461 -570463 -570467 -570487 -570491 -570497 -570499 -570509 -570511 -570527 -570529 -570539 -570547 -570553 -570569 -570587 -570601 -570613 -570637 -570643 -570649 -570659 -570667 -570671 -570677 -570683 -570697 -570719 -570733 -570737 -570743 -570781 -570821 -570827 -570839 -570841 -570851 -570853 -570859 -570881 -570887 -570901 -570919 -570937 -570949 -570959 -570961 -570967 -570991 -571001 -571019 -571031 -571037 -571049 -571069 -571093 -571099 -571111 -571133 -571147 -571157 -571163 -571199 -571201 -571211 -571223 -571229 -571231 -571261 -571267 -571279 -571303 -571321 -571331 -571339 -571369 -571381 -571397 -571399 -571409 -571433 -571453 -571471 -571477 -571531 -571541 -571579 -571583 -571589 -571601 -571603 -571633 -571657 -571673 -571679 -571699 -571709 -571717 -571721 -571741 -571751 -571759 -571777 -571783 -571789 -571799 -571801 -571811 -571841 -571847 -571853 -571861 -571867 -571871 -571873 -571877 -571903 -571933 -571939 -571969 -571973 -572023 -572027 -572041 -572051 -572053 -572059 -572063 -572069 -572087 -572093 -572107 -572137 -572161 -572177 -572179 -572183 -572207 -572233 -572239 -572251 -572269 -572281 -572303 -572311 -572321 -572323 -572329 -572333 -572357 -572387 -572399 -572417 -572419 -572423 -572437 -572449 -572461 -572471 -572479 -572491 -572497 -572519 -572521 -572549 -572567 -572573 -572581 -572587 -572597 -572599 -572609 -572629 -572633 -572639 -572651 -572653 -572657 -572659 -572683 -572687 -572699 -572707 -572711 -572749 -572777 -572791 -572801 -572807 -572813 -572821 -572827 -572833 -572843 -572867 -572879 -572881 -572903 -572909 -572927 -572933 -572939 -572941 -572963 -572969 -572993 -573007 -573031 -573047 -573101 -573107 -573109 -573119 -573143 -573161 -573163 -573179 -573197 -573247 -573253 -573263 -573277 -573289 -573299 -573317 -573329 -573341 -573343 -573371 -573379 -573383 -573409 -573437 -573451 -573457 -573473 -573479 -573481 -573487 -573493 -573497 -573509 -573511 -573523 -573527 -573557 -573569 -573571 -573637 -573647 -573673 -573679 -573691 -573719 -573737 -573739 -573757 -573761 -573763 -573787 -573791 -573809 -573817 -573829 -573847 -573851 -573863 -573871 -573883 -573887 -573899 -573901 -573929 -573941 -573953 -573967 -573973 -573977 -574003 -574031 -574033 -574051 -574061 -574081 -574099 -574109 -574127 -574157 -574159 -574163 -574169 -574181 -574183 -574201 -574219 -574261 -574279 -574283 -574289 -574297 -574307 -574309 -574363 -574367 -574373 -574393 -574423 -574429 -574433 -574439 -574477 -574489 -574493 -574501 -574507 -574529 -574543 -574547 -574597 -574619 -574621 -574627 -574631 -574643 -574657 -574667 -574687 -574699 -574703 -574711 -574723 -574727 -574733 -574741 -574789 -574799 -574801 -574813 -574817 -574859 -574907 -574913 -574933 -574939 -574949 -574963 -574967 -574969 -575009 -575027 -575033 -575053 -575063 -575077 -575087 -575119 -575123 -575129 -575131 -575137 -575153 -575173 -575177 -575203 -575213 -575219 -575231 -575243 -575249 -575251 -575257 -575261 -575303 -575317 -575359 -575369 -575371 -575401 -575417 -575429 -575431 -575441 -575473 -575479 -575489 -575503 -575513 -575551 -575557 -575573 -575579 -575581 -575591 -575593 -575611 -575623 -575647 -575651 -575669 -575677 -575689 -575693 -575699 -575711 -575717 -575723 -575747 -575753 -575777 -575791 -575821 -575837 -575849 -575857 -575863 -575867 -575893 -575903 -575921 -575923 -575941 -575957 -575959 -575963 -575987 -576001 -576013 -576019 -576029 -576031 -576041 -576049 -576089 -576101 -576119 -576131 -576151 -576161 -576167 -576179 -576193 -576203 -576211 -576217 -576221 -576223 -576227 -576287 -576293 -576299 -576313 -576319 -576341 -576377 -576379 -576391 -576421 -576427 -576431 -576439 -576461 -576469 -576473 -576493 -576509 -576523 -576529 -576533 -576539 -576551 -576553 -576577 -576581 -576613 -576617 -576637 -576647 -576649 -576659 -576671 -576677 -576683 -576689 -576701 -576703 -576721 -576727 -576731 -576739 -576743 -576749 -576757 -576769 -576787 -576791 -576881 -576883 -576889 -576899 -576943 -576949 -576967 -576977 -577007 -577009 -577033 -577043 -577063 -577067 -577069 -577081 -577097 -577111 -577123 -577147 -577151 -577153 -577169 -577177 -577193 -577219 -577249 -577259 -577271 -577279 -577307 -577327 -577331 -577333 -577349 -577351 -577363 -577387 -577397 -577399 -577427 -577453 -577457 -577463 -577471 -577483 -577513 -577517 -577523 -577529 -577531 -577537 -577547 -577559 -577573 -577589 -577601 -577613 -577627 -577637 -577639 -577667 -577721 -577739 -577751 -577757 -577781 -577799 -577807 -577817 -577831 -577849 -577867 -577873 -577879 -577897 -577901 -577909 -577919 -577931 -577937 -577939 -577957 -577979 -577981 -578021 -578029 -578041 -578047 -578063 -578077 -578093 -578117 -578131 -578167 -578183 -578191 -578203 -578209 -578213 -578251 -578267 -578297 -578299 -578309 -578311 -578317 -578327 -578353 -578363 -578371 -578399 -578401 -578407 -578419 -578441 -578453 -578467 -578477 -578483 -578489 -578497 -578503 -578509 -578533 -578537 -578563 -578573 -578581 -578587 -578597 -578603 -578609 -578621 -578647 -578659 -578687 -578689 -578693 -578701 -578719 -578729 -578741 -578777 -578779 -578789 -578803 -578819 -578821 -578827 -578839 -578843 -578857 -578861 -578881 -578917 -578923 -578957 -578959 -578971 -578999 -579011 -579017 -579023 -579053 -579079 -579083 -579107 -579113 -579119 -579133 -579179 -579197 -579199 -579239 -579251 -579259 -579263 -579277 -579281 -579283 -579287 -579311 -579331 -579353 -579379 -579407 -579409 -579427 -579433 -579451 -579473 -579497 -579499 -579503 -579517 -579521 -579529 -579533 -579539 -579541 -579563 -579569 -579571 -579583 -579587 -579611 -579613 -579629 -579637 -579641 -579643 -579653 -579673 -579701 -579707 -579713 -579721 -579737 -579757 -579763 -579773 -579779 -579809 -579829 -579851 -579869 -579877 -579881 -579883 -579893 -579907 -579947 -579949 -579961 -579967 -579973 -579983 -580001 -580031 -580033 -580079 -580081 -580093 -580133 -580163 -580169 -580183 -580187 -580201 -580213 -580219 -580231 -580259 -580291 -580301 -580303 -580331 -580339 -580343 -580357 -580361 -580373 -580379 -580381 -580409 -580417 -580471 -580477 -580487 -580513 -580529 -580549 -580553 -580561 -580577 -580607 -580627 -580631 -580633 -580639 -580663 -580673 -580687 -580691 -580693 -580711 -580717 -580733 -580747 -580757 -580759 -580763 -580787 -580793 -580807 -580813 -580837 -580843 -580859 -580871 -580889 -580891 -580901 -580913 -580919 -580927 -580939 -580969 -580981 -580997 -581029 -581041 -581047 -581069 -581071 -581089 -581099 -581101 -581137 -581143 -581149 -581171 -581173 -581177 -581183 -581197 -581201 -581227 -581237 -581239 -581261 -581263 -581293 -581303 -581311 -581323 -581333 -581341 -581351 -581353 -581369 -581377 -581393 -581407 -581411 -581429 -581443 -581447 -581459 -581473 -581491 -581521 -581527 -581549 -581551 -581557 -581573 -581597 -581599 -581617 -581639 -581657 -581663 -581683 -581687 -581699 -581701 -581729 -581731 -581743 -581753 -581767 -581773 -581797 -581809 -581821 -581843 -581857 -581863 -581869 -581873 -581891 -581909 -581921 -581941 -581947 -581953 -581981 -581983 -582011 -582013 -582017 -582031 -582037 -582067 -582083 -582119 -582137 -582139 -582157 -582161 -582167 -582173 -582181 -582203 -582209 -582221 -582223 -582227 -582247 -582251 -582299 -582317 -582319 -582371 -582391 -582409 -582419 -582427 -582433 -582451 -582457 -582469 -582499 -582509 -582511 -582541 -582551 -582563 -582587 -582601 -582623 -582643 -582649 -582677 -582689 -582691 -582719 -582721 -582727 -582731 -582737 -582761 -582763 -582767 -582773 -582781 -582793 -582809 -582821 -582851 -582853 -582859 -582887 -582899 -582931 -582937 -582949 -582961 -582971 -582973 -582983 -583007 -583013 -583019 -583021 -583031 -583069 -583087 -583127 -583139 -583147 -583153 -583169 -583171 -583181 -583189 -583207 -583213 -583229 -583237 -583249 -583267 -583273 -583279 -583291 -583301 -583337 -583339 -583351 -583367 -583391 -583397 -583403 -583409 -583417 -583421 -583447 -583459 -583469 -583481 -583493 -583501 -583511 -583519 -583523 -583537 -583543 -583577 -583603 -583613 -583619 -583621 -583631 -583651 -583657 -583669 -583673 -583697 -583727 -583733 -583753 -583769 -583777 -583783 -583789 -583801 -583841 -583853 -583859 -583861 -583873 -583879 -583903 -583909 -583937 -583969 -583981 -583991 -583997 -584011 -584027 -584033 -584053 -584057 -584063 -584081 -584099 -584141 -584153 -584167 -584183 -584203 -584249 -584261 -584279 -584281 -584303 -584347 -584357 -584359 -584377 -584387 -584393 -584399 -584411 -584417 -584429 -584447 -584471 -584473 -584509 -584531 -584557 -584561 -584587 -584593 -584599 -584603 -584609 -584621 -584627 -584659 -584663 -584677 -584693 -584699 -584707 -584713 -584719 -584723 -584737 -584767 -584777 -584789 -584791 -584809 -584849 -584863 -584869 -584873 -584879 -584897 -584911 -584917 -584923 -584951 -584963 -584971 -584981 -584993 -584999 -585019 -585023 -585031 -585037 -585041 -585043 -585049 -585061 -585071 -585073 -585077 -585107 -585113 -585119 -585131 -585149 -585163 -585199 -585217 -585251 -585269 -585271 -585283 -585289 -585313 -585317 -585337 -585341 -585367 -585383 -585391 -585413 -585437 -585443 -585461 -585467 -585493 -585503 -585517 -585547 -585551 -585569 -585577 -585581 -585587 -585593 -585601 -585619 -585643 -585653 -585671 -585677 -585691 -585721 -585727 -585733 -585737 -585743 -585749 -585757 -585779 -585791 -585799 -585839 -585841 -585847 -585853 -585857 -585863 -585877 -585881 -585883 -585889 -585899 -585911 -585913 -585917 -585919 -585953 -585989 -585997 -586009 -586037 -586051 -586057 -586067 -586073 -586087 -586111 -586121 -586123 -586129 -586139 -586147 -586153 -586189 -586213 -586237 -586273 -586277 -586291 -586301 -586309 -586319 -586349 -586361 -586363 -586367 -586387 -586403 -586429 -586433 -586457 -586459 -586463 -586471 -586493 -586499 -586501 -586541 -586543 -586567 -586571 -586577 -586589 -586601 -586603 -586609 -586627 -586631 -586633 -586667 -586679 -586693 -586711 -586723 -586741 -586769 -586787 -586793 -586801 -586811 -586813 -586819 -586837 -586841 -586849 -586871 -586897 -586903 -586909 -586919 -586921 -586933 -586939 -586951 -586961 -586973 -586979 -586981 -587017 -587021 -587033 -587051 -587053 -587057 -587063 -587087 -587101 -587107 -587117 -587123 -587131 -587137 -587143 -587149 -587173 -587179 -587189 -587201 -587219 -587263 -587267 -587269 -587281 -587287 -587297 -587303 -587341 -587371 -587381 -587387 -587413 -587417 -587429 -587437 -587441 -587459 -587467 -587473 -587497 -587513 -587519 -587527 -587533 -587539 -587549 -587551 -587563 -587579 -587599 -587603 -587617 -587621 -587623 -587633 -587659 -587669 -587677 -587687 -587693 -587711 -587731 -587737 -587747 -587749 -587753 -587771 -587773 -587789 -587813 -587827 -587833 -587849 -587863 -587887 -587891 -587897 -587927 -587933 -587947 -587959 -587969 -587971 -587987 -587989 -587999 -588011 -588019 -588037 -588043 -588061 -588073 -588079 -588083 -588097 -588113 -588121 -588131 -588151 -588167 -588169 -588173 -588191 -588199 -588229 -588239 -588241 -588257 -588277 -588293 -588311 -588347 -588359 -588361 -588383 -588389 -588397 -588403 -588433 -588437 -588463 -588481 -588493 -588503 -588509 -588517 -588521 -588529 -588569 -588571 -588619 -588631 -588641 -588647 -588649 -588667 -588673 -588683 -588703 -588733 -588737 -588743 -588767 -588773 -588779 -588811 -588827 -588839 -588871 -588877 -588881 -588893 -588911 -588937 -588941 -588947 -588949 -588953 -588977 -589021 -589027 -589049 -589063 -589109 -589111 -589123 -589139 -589159 -589163 -589181 -589187 -589189 -589207 -589213 -589219 -589231 -589241 -589243 -589273 -589289 -589291 -589297 -589327 -589331 -589349 -589357 -589387 -589409 -589439 -589451 -589453 -589471 -589481 -589493 -589507 -589529 -589531 -589579 -589583 -589591 -589601 -589607 -589609 -589639 -589643 -589681 -589711 -589717 -589751 -589753 -589759 -589763 -589783 -589793 -589807 -589811 -589829 -589847 -589859 -589861 -589873 -589877 -589903 -589921 -589933 -589993 -589997 -590021 -590027 -590033 -590041 -590071 -590077 -590099 -590119 -590123 -590129 -590131 -590137 -590141 -590153 -590171 -590201 -590207 -590243 -590251 -590263 -590267 -590269 -590279 -590309 -590321 -590323 -590327 -590357 -590363 -590377 -590383 -590389 -590399 -590407 -590431 -590437 -590489 -590537 -590543 -590567 -590573 -590593 -590599 -590609 -590627 -590641 -590647 -590657 -590659 -590669 -590713 -590717 -590719 -590741 -590753 -590771 -590797 -590809 -590813 -590819 -590833 -590839 -590867 -590899 -590921 -590923 -590929 -590959 -590963 -590983 -590987 -591023 -591053 -591061 -591067 -591079 -591089 -591091 -591113 -591127 -591131 -591137 -591161 -591163 -591181 -591193 -591233 -591259 -591271 -591287 -591289 -591301 -591317 -591319 -591341 -591377 -591391 -591403 -591407 -591421 -591431 -591443 -591457 -591469 -591499 -591509 -591523 -591553 -591559 -591581 -591599 -591601 -591611 -591623 -591649 -591653 -591659 -591673 -591691 -591709 -591739 -591743 -591749 -591751 -591757 -591779 -591791 -591827 -591841 -591847 -591863 -591881 -591887 -591893 -591901 -591937 -591959 -591973 -592019 -592027 -592049 -592057 -592061 -592073 -592087 -592099 -592121 -592129 -592133 -592139 -592157 -592199 -592217 -592219 -592223 -592237 -592261 -592289 -592303 -592307 -592309 -592321 -592337 -592343 -592351 -592357 -592367 -592369 -592387 -592391 -592393 -592429 -592451 -592453 -592463 -592469 -592483 -592489 -592507 -592517 -592531 -592547 -592561 -592577 -592589 -592597 -592601 -592609 -592621 -592639 -592643 -592649 -592661 -592663 -592681 -592693 -592723 -592727 -592741 -592747 -592759 -592763 -592793 -592843 -592849 -592853 -592861 -592873 -592877 -592897 -592903 -592919 -592931 -592939 -592967 -592973 -592987 -592993 -593003 -593029 -593041 -593051 -593059 -593071 -593081 -593083 -593111 -593119 -593141 -593143 -593149 -593171 -593179 -593183 -593207 -593209 -593213 -593227 -593231 -593233 -593251 -593261 -593273 -593291 -593293 -593297 -593321 -593323 -593353 -593381 -593387 -593399 -593401 -593407 -593429 -593447 -593449 -593473 -593479 -593491 -593497 -593501 -593507 -593513 -593519 -593531 -593539 -593573 -593587 -593597 -593603 -593627 -593629 -593633 -593641 -593647 -593651 -593689 -593707 -593711 -593767 -593777 -593783 -593839 -593851 -593863 -593869 -593899 -593903 -593933 -593951 -593969 -593977 -593987 -593993 -594023 -594037 -594047 -594091 -594103 -594107 -594119 -594137 -594151 -594157 -594161 -594163 -594179 -594193 -594203 -594211 -594227 -594241 -594271 -594281 -594283 -594287 -594299 -594311 -594313 -594329 -594359 -594367 -594379 -594397 -594401 -594403 -594421 -594427 -594449 -594457 -594467 -594469 -594499 -594511 -594521 -594523 -594533 -594551 -594563 -594569 -594571 -594577 -594617 -594637 -594641 -594653 -594667 -594679 -594697 -594709 -594721 -594739 -594749 -594751 -594773 -594793 -594821 -594823 -594827 -594829 -594857 -594889 -594899 -594911 -594917 -594929 -594931 -594953 -594959 -594961 -594977 -594989 -595003 -595037 -595039 -595043 -595057 -595069 -595073 -595081 -595087 -595093 -595097 -595117 -595123 -595129 -595139 -595141 -595157 -595159 -595181 -595183 -595201 -595207 -595229 -595247 -595253 -595261 -595267 -595271 -595277 -595291 -595303 -595313 -595319 -595333 -595339 -595351 -595363 -595373 -595379 -595381 -595411 -595451 -595453 -595481 -595513 -595519 -595523 -595547 -595549 -595571 -595577 -595579 -595613 -595627 -595687 -595703 -595709 -595711 -595717 -595733 -595741 -595801 -595807 -595817 -595843 -595873 -595877 -595927 -595939 -595943 -595949 -595951 -595957 -595961 -595963 -595967 -595981 -596009 -596021 -596027 -596047 -596053 -596059 -596069 -596081 -596083 -596093 -596117 -596119 -596143 -596147 -596159 -596179 -596209 -596227 -596231 -596243 -596251 -596257 -596261 -596273 -596279 -596291 -596293 -596317 -596341 -596363 -596369 -596399 -596419 -596423 -596461 -596489 -596503 -596507 -596537 -596569 -596573 -596579 -596587 -596593 -596599 -596611 -596623 -596633 -596653 -596663 -596669 -596671 -596693 -596707 -596737 -596741 -596749 -596767 -596779 -596789 -596803 -596821 -596831 -596839 -596851 -596857 -596861 -596863 -596879 -596899 -596917 -596927 -596929 -596933 -596941 -596963 -596977 -596983 -596987 -597031 -597049 -597053 -597059 -597073 -597127 -597131 -597133 -597137 -597169 -597209 -597221 -597239 -597253 -597263 -597269 -597271 -597301 -597307 -597349 -597353 -597361 -597367 -597383 -597391 -597403 -597407 -597409 -597419 -597433 -597437 -597451 -597473 -597497 -597521 -597523 -597539 -597551 -597559 -597577 -597581 -597589 -597593 -597599 -597613 -597637 -597643 -597659 -597671 -597673 -597677 -597679 -597689 -597697 -597757 -597761 -597767 -597769 -597781 -597803 -597823 -597827 -597833 -597853 -597859 -597869 -597889 -597899 -597901 -597923 -597929 -597967 -597997 -598007 -598049 -598051 -598057 -598079 -598093 -598099 -598123 -598127 -598141 -598151 -598159 -598163 -598187 -598189 -598193 -598219 -598229 -598261 -598303 -598307 -598333 -598363 -598369 -598379 -598387 -598399 -598421 -598427 -598439 -598447 -598457 -598463 -598487 -598489 -598501 -598537 -598541 -598571 -598613 -598643 -598649 -598651 -598657 -598669 -598681 -598687 -598691 -598711 -598721 -598727 -598729 -598777 -598783 -598789 -598799 -598817 -598841 -598853 -598867 -598877 -598883 -598891 -598903 -598931 -598933 -598963 -598967 -598973 -598981 -598987 -598999 -599003 -599009 -599021 -599023 -599069 -599087 -599117 -599143 -599147 -599149 -599153 -599191 -599213 -599231 -599243 -599251 -599273 -599281 -599303 -599309 -599321 -599341 -599353 -599359 -599371 -599383 -599387 -599399 -599407 -599413 -599419 -599429 -599477 -599479 -599491 -599513 -599519 -599537 -599551 -599561 -599591 -599597 -599603 -599611 -599623 -599629 -599657 -599663 -599681 -599693 -599699 -599701 -599713 -599719 -599741 -599759 -599779 -599783 -599803 -599831 -599843 -599857 -599869 -599891 -599899 -599927 -599933 -599939 -599941 -599959 -599983 -599993 -599999 -600011 -600043 -600053 -600071 -600073 -600091 -600101 -600109 -600167 -600169 -600203 -600217 -600221 -600233 -600239 -600241 -600247 -600269 -600283 -600289 -600293 -600307 -600311 -600317 -600319 -600337 -600359 -600361 -600367 -600371 -600401 -600403 -600407 -600421 -600433 -600449 -600451 -600463 -600469 -600487 -600517 -600529 -600557 -600569 -600577 -600601 -600623 -600631 -600641 -600659 -600673 -600689 -600697 -600701 -600703 -600727 -600751 -600791 -600823 -600827 -600833 -600841 -600857 -600877 -600881 -600883 -600889 -600893 -600931 -600947 -600949 -600959 -600961 -600973 -600979 -600983 -601021 -601031 -601037 -601039 -601043 -601061 -601067 -601079 -601093 -601127 -601147 -601187 -601189 -601193 -601201 -601207 -601219 -601231 -601241 -601247 -601259 -601267 -601283 -601291 -601297 -601309 -601313 -601319 -601333 -601339 -601357 -601379 -601397 -601411 -601423 -601439 -601451 -601457 -601487 -601507 -601541 -601543 -601589 -601591 -601607 -601631 -601651 -601669 -601687 -601697 -601717 -601747 -601751 -601759 -601763 -601771 -601801 -601807 -601813 -601819 -601823 -601831 -601849 -601873 -601883 -601889 -601897 -601903 -601943 -601949 -601961 -601969 -601981 -602029 -602033 -602039 -602047 -602057 -602081 -602083 -602087 -602093 -602099 -602111 -602137 -602141 -602143 -602153 -602179 -602197 -602201 -602221 -602227 -602233 -602257 -602267 -602269 -602279 -602297 -602309 -602311 -602317 -602321 -602333 -602341 -602351 -602377 -602383 -602401 -602411 -602431 -602453 -602461 -602477 -602479 -602489 -602501 -602513 -602521 -602543 -602551 -602593 -602597 -602603 -602621 -602627 -602639 -602647 -602677 -602687 -602689 -602711 -602713 -602717 -602729 -602743 -602753 -602759 -602773 -602779 -602801 -602821 -602831 -602839 -602867 -602873 -602887 -602891 -602909 -602929 -602947 -602951 -602971 -602977 -602983 -602999 -603011 -603013 -603023 -603047 -603077 -603091 -603101 -603103 -603131 -603133 -603149 -603173 -603191 -603203 -603209 -603217 -603227 -603257 -603283 -603311 -603319 -603349 -603389 -603391 -603401 -603431 -603443 -603457 -603467 -603487 -603503 -603521 -603523 -603529 -603541 -603553 -603557 -603563 -603569 -603607 -603613 -603623 -603641 -603667 -603679 -603689 -603719 -603731 -603739 -603749 -603761 -603769 -603781 -603791 -603793 -603817 -603821 -603833 -603847 -603851 -603853 -603859 -603881 -603893 -603899 -603901 -603907 -603913 -603917 -603919 -603923 -603931 -603937 -603947 -603949 -603989 -604001 -604007 -604013 -604031 -604057 -604063 -604069 -604073 -604171 -604189 -604223 -604237 -604243 -604249 -604259 -604277 -604291 -604309 -604313 -604319 -604339 -604343 -604349 -604361 -604369 -604379 -604397 -604411 -604427 -604433 -604441 -604477 -604481 -604517 -604529 -604547 -604559 -604579 -604589 -604603 -604609 -604613 -604619 -604649 -604651 -604661 -604697 -604699 -604711 -604727 -604729 -604733 -604753 -604759 -604781 -604787 -604801 -604811 -604819 -604823 -604829 -604837 -604859 -604861 -604867 -604883 -604907 -604931 -604939 -604949 -604957 -604973 -604997 -605009 -605021 -605023 -605039 -605051 -605069 -605071 -605113 -605117 -605123 -605147 -605167 -605173 -605177 -605191 -605221 -605233 -605237 -605239 -605249 -605257 -605261 -605309 -605323 -605329 -605333 -605347 -605369 -605393 -605401 -605411 -605413 -605443 -605471 -605477 -605497 -605503 -605509 -605531 -605533 -605543 -605551 -605573 -605593 -605597 -605599 -605603 -605609 -605617 -605629 -605639 -605641 -605687 -605707 -605719 -605779 -605789 -605809 -605837 -605849 -605861 -605867 -605873 -605879 -605887 -605893 -605909 -605921 -605933 -605947 -605953 -605977 -605987 -605993 -606017 -606029 -606031 -606037 -606041 -606049 -606059 -606077 -606079 -606083 -606091 -606113 -606121 -606131 -606173 -606181 -606223 -606241 -606247 -606251 -606299 -606301 -606311 -606313 -606323 -606341 -606379 -606383 -606413 -606433 -606443 -606449 -606493 -606497 -606503 -606521 -606527 -606539 -606559 -606569 -606581 -606587 -606589 -606607 -606643 -606649 -606653 -606659 -606673 -606721 -606731 -606733 -606737 -606743 -606757 -606791 -606811 -606829 -606833 -606839 -606847 -606857 -606863 -606899 -606913 -606919 -606943 -606959 -606961 -606967 -606971 -606997 -607001 -607003 -607007 -607037 -607043 -607049 -607063 -607067 -607081 -607091 -607093 -607097 -607109 -607127 -607129 -607147 -607151 -607153 -607157 -607163 -607181 -607199 -607213 -607219 -607249 -607253 -607261 -607301 -607303 -607307 -607309 -607319 -607331 -607337 -607339 -607349 -607357 -607363 -607417 -607421 -607423 -607471 -607493 -607517 -607531 -607549 -607573 -607583 -607619 -607627 -607667 -607669 -607681 -607697 -607703 -607721 -607723 -607727 -607741 -607769 -607813 -607819 -607823 -607837 -607843 -607861 -607883 -607889 -607909 -607921 -607931 -607933 -607939 -607951 -607961 -607967 -607991 -607993 -608011 -608029 -608033 -608087 -608089 -608099 -608117 -608123 -608129 -608131 -608147 -608161 -608177 -608191 -608207 -608213 -608269 -608273 -608297 -608299 -608303 -608339 -608347 -608357 -608359 -608369 -608371 -608383 -608389 -608393 -608401 -608411 -608423 -608429 -608431 -608459 -608471 -608483 -608497 -608519 -608521 -608527 -608581 -608591 -608593 -608609 -608611 -608633 -608653 -608659 -608669 -608677 -608693 -608701 -608737 -608743 -608749 -608759 -608767 -608789 -608819 -608831 -608843 -608851 -608857 -608863 -608873 -608887 -608897 -608899 -608903 -608941 -608947 -608953 -608977 -608987 -608989 -608999 -609043 -609047 -609067 -609071 -609079 -609101 -609107 -609113 -609143 -609149 -609163 -609173 -609179 -609199 -609209 -609221 -609227 -609233 -609241 -609253 -609269 -609277 -609283 -609289 -609307 -609313 -609337 -609359 -609361 -609373 -609379 -609391 -609397 -609403 -609407 -609421 -609437 -609443 -609461 -609487 -609503 -609509 -609517 -609527 -609533 -609541 -609571 -609589 -609593 -609599 -609601 -609607 -609613 -609617 -609619 -609641 -609673 -609683 -609701 -609709 -609743 -609751 -609757 -609779 -609781 -609803 -609809 -609821 -609859 -609877 -609887 -609907 -609911 -609913 -609923 -609929 -609979 -609989 -609991 -609997 -610031 -610063 -610081 -610123 -610157 -610163 -610187 -610193 -610199 -610217 -610219 -610229 -610243 -610271 -610279 -610289 -610301 -610327 -610331 -610339 -610391 -610409 -610417 -610429 -610439 -610447 -610457 -610469 -610501 -610523 -610541 -610543 -610553 -610559 -610567 -610579 -610583 -610619 -610633 -610639 -610651 -610661 -610667 -610681 -610699 -610703 -610721 -610733 -610739 -610741 -610763 -610781 -610783 -610787 -610801 -610817 -610823 -610829 -610837 -610843 -610847 -610849 -610867 -610877 -610879 -610891 -610913 -610919 -610921 -610933 -610957 -610969 -610993 -611011 -611027 -611033 -611057 -611069 -611071 -611081 -611101 -611111 -611113 -611131 -611137 -611147 -611189 -611207 -611213 -611257 -611263 -611279 -611293 -611297 -611323 -611333 -611389 -611393 -611411 -611419 -611441 -611449 -611453 -611459 -611467 -611483 -611497 -611531 -611543 -611549 -611551 -611557 -611561 -611587 -611603 -611621 -611641 -611657 -611671 -611693 -611707 -611729 -611753 -611791 -611801 -611803 -611827 -611833 -611837 -611839 -611873 -611879 -611887 -611903 -611921 -611927 -611939 -611951 -611953 -611957 -611969 -611977 -611993 -611999 -612011 -612023 -612037 -612041 -612043 -612049 -612061 -612067 -612071 -612083 -612107 -612109 -612113 -612133 -612137 -612149 -612169 -612173 -612181 -612193 -612217 -612223 -612229 -612259 -612263 -612301 -612307 -612317 -612319 -612331 -612341 -612349 -612371 -612373 -612377 -612383 -612401 -612407 -612439 -612481 -612497 -612511 -612553 -612583 -612589 -612611 -612613 -612637 -612643 -612649 -612671 -612679 -612713 -612719 -612727 -612737 -612751 -612763 -612791 -612797 -612809 -612811 -612817 -612823 -612841 -612847 -612853 -612869 -612877 -612889 -612923 -612929 -612947 -612967 -612971 -612977 -613007 -613009 -613013 -613049 -613061 -613097 -613099 -613141 -613153 -613163 -613169 -613177 -613181 -613189 -613199 -613213 -613219 -613229 -613231 -613243 -613247 -613253 -613267 -613279 -613289 -613297 -613337 -613357 -613363 -613367 -613381 -613421 -613427 -613439 -613441 -613447 -613451 -613463 -613469 -613471 -613493 -613499 -613507 -613523 -613549 -613559 -613573 -613577 -613597 -613607 -613609 -613633 -613637 -613651 -613661 -613667 -613673 -613699 -613733 -613741 -613747 -613759 -613763 -613807 -613813 -613817 -613829 -613841 -613849 -613861 -613883 -613889 -613903 -613957 -613967 -613969 -613981 -613993 -613999 -614041 -614051 -614063 -614071 -614093 -614101 -614113 -614129 -614143 -614147 -614153 -614167 -614177 -614179 -614183 -614219 -614267 -614279 -614291 -614293 -614297 -614321 -614333 -614377 -614387 -614413 -614417 -614437 -614477 -614483 -614503 -614527 -614531 -614543 -614561 -614563 -614569 -614609 -614611 -614617 -614623 -614633 -614639 -614657 -614659 -614671 -614683 -614687 -614693 -614701 -614717 -614729 -614741 -614743 -614749 -614753 -614759 -614773 -614827 -614843 -614849 -614851 -614863 -614881 -614893 -614909 -614917 -614927 -614963 -614981 -614983 -615019 -615031 -615047 -615053 -615067 -615101 -615103 -615107 -615137 -615151 -615161 -615187 -615229 -615233 -615253 -615259 -615269 -615289 -615299 -615313 -615337 -615341 -615343 -615367 -615379 -615389 -615401 -615403 -615413 -615427 -615431 -615437 -615449 -615473 -615479 -615491 -615493 -615497 -615509 -615521 -615539 -615557 -615577 -615599 -615607 -615617 -615623 -615661 -615677 -615679 -615709 -615721 -615731 -615739 -615743 -615749 -615751 -615761 -615767 -615773 -615793 -615799 -615821 -615827 -615829 -615833 -615869 -615883 -615887 -615907 -615919 -615941 -615949 -615971 -615997 -616003 -616027 -616051 -616069 -616073 -616079 -616103 -616111 -616117 -616129 -616139 -616141 -616153 -616157 -616169 -616171 -616181 -616207 -616211 -616219 -616223 -616229 -616243 -616261 -616277 -616289 -616307 -616313 -616321 -616327 -616361 -616367 -616387 -616391 -616393 -616409 -616411 -616433 -616439 -616459 -616463 -616481 -616489 -616501 -616507 -616513 -616519 -616523 -616529 -616537 -616547 -616579 -616589 -616597 -616639 -616643 -616669 -616673 -616703 -616717 -616723 -616729 -616741 -616757 -616769 -616783 -616787 -616789 -616793 -616799 -616829 -616841 -616843 -616849 -616871 -616877 -616897 -616909 -616933 -616943 -616951 -616961 -616991 -616997 -616999 -617011 -617027 -617039 -617051 -617053 -617059 -617077 -617087 -617107 -617119 -617129 -617131 -617147 -617153 -617161 -617189 -617191 -617231 -617233 -617237 -617249 -617257 -617269 -617273 -617293 -617311 -617327 -617333 -617339 -617341 -617359 -617363 -617369 -617387 -617401 -617411 -617429 -617447 -617453 -617467 -617471 -617473 -617479 -617509 -617521 -617531 -617537 -617579 -617587 -617647 -617651 -617657 -617677 -617681 -617689 -617693 -617699 -617707 -617717 -617719 -617723 -617731 -617759 -617761 -617767 -617777 -617791 -617801 -617809 -617819 -617843 -617857 -617873 -617879 -617887 -617917 -617951 -617959 -617963 -617971 -617983 -618029 -618031 -618041 -618049 -618053 -618083 -618119 -618131 -618161 -618173 -618199 -618227 -618229 -618253 -618257 -618269 -618271 -618287 -618301 -618311 -618323 -618329 -618337 -618347 -618349 -618361 -618377 -618407 -618413 -618421 -618437 -618439 -618463 -618509 -618521 -618547 -618559 -618571 -618577 -618581 -618587 -618589 -618593 -618619 -618637 -618643 -618671 -618679 -618703 -618707 -618719 -618799 -618823 -618833 -618841 -618847 -618857 -618859 -618869 -618883 -618913 -618929 -618941 -618971 -618979 -618991 -618997 -619007 -619009 -619019 -619027 -619033 -619057 -619061 -619067 -619079 -619111 -619117 -619139 -619159 -619169 -619181 -619187 -619189 -619207 -619247 -619253 -619261 -619273 -619277 -619279 -619303 -619309 -619313 -619331 -619363 -619373 -619391 -619397 -619471 -619477 -619511 -619537 -619543 -619561 -619573 -619583 -619589 -619603 -619607 -619613 -619621 -619657 -619669 -619681 -619687 -619693 -619711 -619739 -619741 -619753 -619763 -619771 -619793 -619807 -619811 -619813 -619819 -619831 -619841 -619849 -619867 -619897 -619909 -619921 -619967 -619979 -619981 -619987 -619999 -620003 -620029 -620033 -620051 -620099 -620111 -620117 -620159 -620161 -620171 -620183 -620197 -620201 -620227 -620233 -620237 -620239 -620251 -620261 -620297 -620303 -620311 -620317 -620329 -620351 -620359 -620363 -620377 -620383 -620393 -620401 -620413 -620429 -620437 -620441 -620461 -620467 -620491 -620507 -620519 -620531 -620549 -620561 -620567 -620569 -620579 -620603 -620623 -620639 -620647 -620657 -620663 -620671 -620689 -620693 -620717 -620731 -620743 -620759 -620771 -620773 -620777 -620813 -620821 -620827 -620831 -620849 -620869 -620887 -620909 -620911 -620929 -620933 -620947 -620957 -620981 -620999 -621007 -621013 -621017 -621029 -621031 -621043 -621059 -621083 -621097 -621113 -621133 -621139 -621143 -621217 -621223 -621227 -621239 -621241 -621259 -621289 -621301 -621317 -621337 -621343 -621347 -621353 -621359 -621371 -621389 -621419 -621427 -621431 -621443 -621451 -621461 -621473 -621521 -621527 -621541 -621583 -621611 -621617 -621619 -621629 -621631 -621641 -621671 -621679 -621697 -621701 -621703 -621721 -621739 -621749 -621757 -621769 -621779 -621799 -621821 -621833 -621869 -621871 -621883 -621893 -621913 -621923 -621937 -621941 -621983 -621997 -622009 -622019 -622043 -622049 -622051 -622067 -622073 -622091 -622103 -622109 -622123 -622129 -622133 -622151 -622157 -622159 -622177 -622187 -622189 -622241 -622243 -622247 -622249 -622277 -622301 -622313 -622331 -622333 -622337 -622351 -622367 -622397 -622399 -622423 -622477 -622481 -622483 -622493 -622513 -622519 -622529 -622547 -622549 -622561 -622571 -622577 -622603 -622607 -622613 -622619 -622621 -622637 -622639 -622663 -622669 -622709 -622723 -622729 -622751 -622777 -622781 -622793 -622813 -622849 -622861 -622879 -622889 -622901 -622927 -622943 -622957 -622967 -622987 -622997 -623003 -623009 -623017 -623023 -623041 -623057 -623059 -623071 -623107 -623171 -623209 -623221 -623261 -623263 -623269 -623279 -623281 -623291 -623299 -623303 -623321 -623327 -623341 -623351 -623353 -623383 -623387 -623393 -623401 -623417 -623423 -623431 -623437 -623477 -623521 -623531 -623537 -623563 -623591 -623617 -623621 -623633 -623641 -623653 -623669 -623671 -623677 -623681 -623683 -623699 -623717 -623719 -623723 -623729 -623743 -623759 -623767 -623771 -623803 -623839 -623851 -623867 -623869 -623879 -623881 -623893 -623923 -623929 -623933 -623947 -623957 -623963 -623977 -623983 -623989 -624007 -624031 -624037 -624047 -624049 -624067 -624089 -624097 -624119 -624133 -624139 -624149 -624163 -624191 -624199 -624203 -624209 -624229 -624233 -624241 -624251 -624259 -624271 -624277 -624311 -624313 -624319 -624329 -624331 -624347 -624391 -624401 -624419 -624443 -624451 -624467 -624469 -624479 -624487 -624497 -624509 -624517 -624521 -624539 -624541 -624577 -624593 -624599 -624601 -624607 -624643 -624649 -624667 -624683 -624707 -624709 -624721 -624727 -624731 -624737 -624763 -624769 -624787 -624791 -624797 -624803 -624809 -624829 -624839 -624847 -624851 -624859 -624917 -624961 -624973 -624977 -624983 -624997 -625007 -625033 -625057 -625063 -625087 -625103 -625109 -625111 -625129 -625133 -625169 -625171 -625181 -625187 -625199 -625213 -625231 -625237 -625253 -625267 -625279 -625283 -625307 -625319 -625343 -625351 -625367 -625369 -625397 -625409 -625451 -625477 -625483 -625489 -625507 -625517 -625529 -625543 -625589 -625591 -625609 -625621 -625627 -625631 -625637 -625643 -625657 -625661 -625663 -625697 -625699 -625763 -625777 -625789 -625811 -625819 -625831 -625837 -625861 -625871 -625883 -625909 -625913 -625927 -625939 -625943 -625969 -625979 -625997 -626009 -626011 -626033 -626051 -626063 -626113 -626117 -626147 -626159 -626173 -626177 -626189 -626191 -626201 -626207 -626239 -626251 -626261 -626317 -626323 -626333 -626341 -626347 -626363 -626377 -626389 -626393 -626443 -626477 -626489 -626519 -626533 -626539 -626581 -626597 -626599 -626609 -626611 -626617 -626621 -626623 -626627 -626629 -626663 -626683 -626687 -626693 -626701 -626711 -626713 -626723 -626741 -626749 -626761 -626771 -626783 -626797 -626809 -626833 -626837 -626861 -626887 -626917 -626921 -626929 -626947 -626953 -626959 -626963 -626987 -627017 -627041 -627059 -627071 -627073 -627083 -627089 -627091 -627101 -627119 -627131 -627139 -627163 -627169 -627191 -627197 -627217 -627227 -627251 -627257 -627269 -627271 -627293 -627301 -627329 -627349 -627353 -627377 -627379 -627383 -627391 -627433 -627449 -627479 -627481 -627491 -627511 -627541 -627547 -627559 -627593 -627611 -627617 -627619 -627637 -627643 -627659 -627661 -627667 -627673 -627709 -627721 -627733 -627749 -627773 -627787 -627791 -627797 -627799 -627811 -627841 -627859 -627901 -627911 -627919 -627943 -627947 -627953 -627961 -627973 -628013 -628021 -628037 -628049 -628051 -628057 -628063 -628093 -628097 -628127 -628139 -628171 -628183 -628189 -628193 -628207 -628213 -628217 -628219 -628231 -628261 -628267 -628289 -628301 -628319 -628357 -628363 -628373 -628379 -628391 -628399 -628423 -628427 -628447 -628477 -628487 -628493 -628499 -628547 -628561 -628583 -628591 -628651 -628673 -628679 -628681 -628687 -628699 -628709 -628721 -628753 -628757 -628759 -628781 -628783 -628787 -628799 -628801 -628811 -628819 -628841 -628861 -628877 -628909 -628913 -628921 -628937 -628939 -628973 -628993 -628997 -629003 -629009 -629011 -629023 -629029 -629059 -629081 -629113 -629137 -629143 -629171 -629177 -629203 -629243 -629249 -629263 -629281 -629311 -629339 -629341 -629351 -629371 -629381 -629383 -629401 -629411 -629417 -629429 -629449 -629467 -629483 -629491 -629509 -629513 -629537 -629567 -629569 -629591 -629593 -629609 -629611 -629617 -629623 -629653 -629683 -629687 -629689 -629701 -629711 -629723 -629737 -629743 -629747 -629767 -629773 -629779 -629803 -629807 -629819 -629843 -629857 -629861 -629873 -629891 -629897 -629899 -629903 -629921 -629927 -629929 -629939 -629963 -629977 -629987 -629989 -630017 -630023 -630029 -630043 -630067 -630101 -630107 -630127 -630151 -630163 -630167 -630169 -630181 -630193 -630197 -630229 -630247 -630263 -630281 -630299 -630307 -630319 -630349 -630353 -630391 -630433 -630451 -630467 -630473 -630481 -630493 -630521 -630523 -630529 -630559 -630577 -630583 -630587 -630589 -630593 -630607 -630613 -630659 -630677 -630689 -630701 -630709 -630713 -630719 -630733 -630737 -630797 -630803 -630823 -630827 -630841 -630863 -630871 -630893 -630899 -630901 -630907 -630911 -630919 -630941 -630967 -630997 -631003 -631013 -631039 -631061 -631121 -631133 -631139 -631151 -631153 -631157 -631171 -631181 -631187 -631223 -631229 -631247 -631249 -631259 -631271 -631273 -631291 -631307 -631339 -631357 -631361 -631387 -631391 -631399 -631409 -631429 -631453 -631457 -631459 -631469 -631471 -631483 -631487 -631507 -631513 -631529 -631531 -631537 -631549 -631559 -631573 -631577 -631583 -631597 -631613 -631619 -631643 -631667 -631679 -631681 -631711 -631717 -631723 -631733 -631739 -631751 -631753 -631789 -631817 -631819 -631843 -631847 -631853 -631859 -631861 -631867 -631889 -631901 -631903 -631913 -631927 -631931 -631937 -631979 -631987 -631991 -631993 -632029 -632041 -632053 -632081 -632083 -632087 -632089 -632101 -632117 -632123 -632141 -632147 -632153 -632189 -632209 -632221 -632227 -632231 -632251 -632257 -632267 -632273 -632297 -632299 -632321 -632323 -632327 -632329 -632347 -632351 -632353 -632363 -632371 -632381 -632389 -632393 -632447 -632459 -632473 -632483 -632497 -632501 -632503 -632521 -632557 -632561 -632591 -632609 -632623 -632627 -632629 -632647 -632669 -632677 -632683 -632699 -632713 -632717 -632743 -632747 -632773 -632777 -632813 -632839 -632843 -632851 -632857 -632881 -632897 -632911 -632923 -632939 -632941 -632971 -632977 -632987 -632993 -633001 -633013 -633037 -633053 -633067 -633079 -633091 -633133 -633151 -633161 -633187 -633197 -633209 -633221 -633253 -633257 -633263 -633271 -633287 -633307 -633317 -633337 -633359 -633377 -633379 -633383 -633401 -633407 -633427 -633449 -633461 -633463 -633467 -633469 -633473 -633487 -633497 -633559 -633569 -633571 -633583 -633599 -633613 -633623 -633629 -633649 -633653 -633667 -633739 -633751 -633757 -633767 -633781 -633791 -633793 -633797 -633799 -633803 -633823 -633833 -633877 -633883 -633923 -633931 -633937 -633943 -633953 -633961 -633967 -633991 -634003 -634013 -634031 -634061 -634079 -634091 -634097 -634103 -634141 -634157 -634159 -634169 -634177 -634181 -634187 -634199 -634211 -634223 -634237 -634241 -634247 -634261 -634267 -634273 -634279 -634301 -634307 -634313 -634327 -634331 -634343 -634367 -634373 -634397 -634421 -634441 -634471 -634483 -634493 -634499 -634511 -634519 -634523 -634531 -634541 -634567 -634573 -634577 -634597 -634603 -634609 -634643 -634649 -634651 -634679 -634681 -634687 -634703 -634709 -634717 -634727 -634741 -634747 -634757 -634759 -634793 -634807 -634817 -634841 -634853 -634859 -634861 -634871 -634891 -634901 -634903 -634927 -634937 -634939 -634943 -634969 -634979 -635003 -635021 -635039 -635051 -635057 -635087 -635119 -635147 -635149 -635197 -635203 -635207 -635249 -635251 -635263 -635267 -635279 -635287 -635291 -635293 -635309 -635317 -635333 -635339 -635347 -635351 -635353 -635359 -635363 -635387 -635389 -635413 -635423 -635431 -635441 -635449 -635461 -635471 -635483 -635507 -635519 -635527 -635533 -635563 -635567 -635599 -635603 -635617 -635639 -635653 -635659 -635689 -635707 -635711 -635729 -635731 -635737 -635777 -635801 -635809 -635813 -635821 -635837 -635849 -635867 -635879 -635891 -635893 -635909 -635917 -635923 -635939 -635959 -635969 -635977 -635981 -635983 -635989 -636017 -636023 -636043 -636059 -636061 -636071 -636073 -636107 -636109 -636133 -636137 -636149 -636193 -636211 -636217 -636241 -636247 -636257 -636263 -636277 -636283 -636287 -636301 -636313 -636319 -636331 -636343 -636353 -636359 -636403 -636407 -636409 -636421 -636469 -636473 -636499 -636533 -636539 -636541 -636547 -636553 -636563 -636569 -636613 -636619 -636631 -636653 -636673 -636697 -636719 -636721 -636731 -636739 -636749 -636761 -636763 -636773 -636781 -636809 -636817 -636821 -636829 -636851 -636863 -636877 -636917 -636919 -636931 -636947 -636953 -636967 -636983 -636997 -637001 -637003 -637067 -637073 -637079 -637097 -637129 -637139 -637157 -637163 -637171 -637199 -637201 -637229 -637243 -637271 -637277 -637283 -637291 -637297 -637309 -637319 -637321 -637327 -637337 -637339 -637349 -637369 -637379 -637409 -637421 -637423 -637447 -637459 -637463 -637471 -637489 -637499 -637513 -637519 -637529 -637531 -637543 -637573 -637597 -637601 -637603 -637607 -637627 -637657 -637669 -637691 -637699 -637709 -637711 -637717 -637723 -637727 -637729 -637751 -637771 -637781 -637783 -637787 -637817 -637829 -637831 -637841 -637873 -637883 -637909 -637933 -637937 -637939 -638023 -638047 -638051 -638059 -638063 -638081 -638117 -638123 -638147 -638159 -638161 -638171 -638177 -638179 -638201 -638233 -638263 -638269 -638303 -638317 -638327 -638347 -638359 -638371 -638423 -638431 -638437 -638453 -638459 -638467 -638489 -638501 -638527 -638567 -638581 -638587 -638621 -638629 -638633 -638663 -638669 -638689 -638699 -638717 -638719 -638767 -638801 -638819 -638839 -638857 -638861 -638893 -638923 -638933 -638959 -638971 -638977 -638993 -638999 -639007 -639011 -639043 -639049 -639053 -639083 -639091 -639137 -639143 -639151 -639157 -639167 -639169 -639181 -639211 -639253 -639257 -639259 -639263 -639269 -639299 -639307 -639311 -639329 -639337 -639361 -639371 -639391 -639433 -639439 -639451 -639487 -639491 -639493 -639511 -639517 -639533 -639547 -639563 -639571 -639577 -639589 -639599 -639601 -639631 -639637 -639647 -639671 -639677 -639679 -639689 -639697 -639701 -639703 -639713 -639719 -639731 -639739 -639757 -639833 -639839 -639851 -639853 -639857 -639907 -639911 -639937 -639941 -639949 -639959 -639983 -639997 -640007 -640009 -640019 -640027 -640039 -640043 -640049 -640061 -640069 -640099 -640109 -640121 -640127 -640139 -640151 -640153 -640163 -640193 -640219 -640223 -640229 -640231 -640247 -640249 -640259 -640261 -640267 -640279 -640303 -640307 -640333 -640363 -640369 -640411 -640421 -640457 -640463 -640477 -640483 -640499 -640529 -640531 -640579 -640583 -640589 -640613 -640621 -640631 -640649 -640663 -640667 -640669 -640687 -640691 -640727 -640733 -640741 -640771 -640777 -640793 -640837 -640847 -640853 -640859 -640873 -640891 -640901 -640907 -640919 -640933 -640943 -640949 -640957 -640963 -640967 -640973 -640993 -641051 -641057 -641077 -641083 -641089 -641093 -641101 -641129 -641131 -641143 -641167 -641197 -641203 -641213 -641227 -641239 -641261 -641279 -641287 -641299 -641317 -641327 -641371 -641387 -641411 -641413 -641419 -641437 -641441 -641453 -641467 -641471 -641479 -641491 -641513 -641519 -641521 -641549 -641551 -641579 -641581 -641623 -641633 -641639 -641681 -641701 -641713 -641747 -641749 -641761 -641789 -641791 -641803 -641813 -641819 -641821 -641827 -641833 -641843 -641863 -641867 -641873 -641881 -641891 -641897 -641909 -641923 -641929 -641959 -641969 -641981 -642011 -642013 -642049 -642071 -642077 -642079 -642113 -642121 -642133 -642149 -642151 -642157 -642163 -642197 -642199 -642211 -642217 -642223 -642233 -642241 -642247 -642253 -642281 -642359 -642361 -642373 -642403 -642407 -642419 -642427 -642457 -642487 -642517 -642527 -642529 -642533 -642547 -642557 -642563 -642581 -642613 -642623 -642673 -642683 -642701 -642737 -642739 -642769 -642779 -642791 -642797 -642799 -642809 -642833 -642853 -642869 -642871 -642877 -642881 -642899 -642907 -642931 -642937 -642947 -642953 -642973 -642977 -642997 -643009 -643021 -643031 -643039 -643043 -643051 -643061 -643073 -643081 -643087 -643099 -643121 -643129 -643183 -643187 -643199 -643213 -643217 -643231 -643243 -643273 -643301 -643303 -643369 -643373 -643403 -643421 -643429 -643439 -643453 -643457 -643463 -643469 -643493 -643507 -643523 -643547 -643553 -643567 -643583 -643589 -643619 -643633 -643639 -643649 -643651 -643661 -643681 -643691 -643693 -643697 -643703 -643723 -643729 -643751 -643781 -643847 -643849 -643859 -643873 -643879 -643883 -643889 -643919 -643927 -643949 -643957 -643961 -643969 -643991 -644009 -644029 -644047 -644051 -644053 -644057 -644089 -644101 -644107 -644117 -644123 -644129 -644131 -644141 -644143 -644153 -644159 -644173 -644191 -644197 -644201 -644227 -644239 -644257 -644261 -644291 -644297 -644327 -644341 -644353 -644359 -644363 -644377 -644381 -644383 -644401 -644411 -644431 -644443 -644447 -644489 -644491 -644507 -644513 -644519 -644531 -644549 -644557 -644563 -644569 -644593 -644597 -644599 -644617 -644629 -644647 -644653 -644669 -644671 -644687 -644701 -644717 -644729 -644731 -644747 -644753 -644767 -644783 -644789 -644797 -644801 -644837 -644843 -644857 -644863 -644867 -644869 -644881 -644899 -644909 -644911 -644923 -644933 -644951 -644977 -644999 -645011 -645013 -645019 -645023 -645037 -645041 -645049 -645067 -645077 -645083 -645091 -645097 -645131 -645137 -645149 -645179 -645187 -645233 -645257 -645313 -645329 -645347 -645353 -645367 -645383 -645397 -645409 -645419 -645431 -645433 -645443 -645467 -645481 -645493 -645497 -645499 -645503 -645521 -645527 -645529 -645571 -645577 -645581 -645583 -645599 -645611 -645629 -645641 -645647 -645649 -645661 -645683 -645691 -645703 -645713 -645727 -645737 -645739 -645751 -645763 -645787 -645803 -645833 -645839 -645851 -645857 -645877 -645889 -645893 -645901 -645907 -645937 -645941 -645973 -645979 -646003 -646013 -646027 -646039 -646067 -646073 -646099 -646103 -646147 -646157 -646159 -646169 -646181 -646183 -646189 -646193 -646199 -646237 -646253 -646259 -646267 -646271 -646273 -646291 -646301 -646307 -646309 -646339 -646379 -646397 -646403 -646411 -646421 -646423 -646433 -646453 -646519 -646523 -646537 -646543 -646549 -646571 -646573 -646577 -646609 -646619 -646631 -646637 -646643 -646669 -646687 -646721 -646757 -646771 -646781 -646823 -646831 -646837 -646843 -646859 -646873 -646879 -646883 -646889 -646897 -646909 -646913 -646927 -646937 -646957 -646979 -646981 -646991 -646993 -647011 -647033 -647039 -647047 -647057 -647069 -647081 -647099 -647111 -647113 -647117 -647131 -647147 -647161 -647189 -647201 -647209 -647219 -647261 -647263 -647293 -647303 -647321 -647327 -647333 -647341 -647357 -647359 -647363 -647371 -647399 -647401 -647417 -647429 -647441 -647453 -647477 -647489 -647503 -647509 -647527 -647531 -647551 -647557 -647579 -647587 -647593 -647609 -647617 -647627 -647641 -647651 -647659 -647663 -647687 -647693 -647719 -647723 -647741 -647743 -647747 -647753 -647771 -647783 -647789 -647809 -647821 -647837 -647839 -647851 -647861 -647891 -647893 -647909 -647917 -647951 -647953 -647963 -647987 -648007 -648019 -648029 -648041 -648047 -648059 -648061 -648073 -648079 -648097 -648101 -648107 -648119 -648133 -648173 -648181 -648191 -648199 -648211 -648217 -648229 -648239 -648257 -648259 -648269 -648283 -648289 -648293 -648317 -648331 -648341 -648343 -648371 -648377 -648379 -648383 -648391 -648433 -648437 -648449 -648481 -648509 -648563 -648607 -648617 -648619 -648629 -648631 -648649 -648653 -648671 -648677 -648689 -648709 -648719 -648731 -648763 -648779 -648803 -648841 -648859 -648863 -648871 -648887 -648889 -648911 -648917 -648931 -648937 -648953 -648961 -648971 -648997 -649001 -649007 -649039 -649063 -649069 -649073 -649079 -649081 -649087 -649093 -649123 -649141 -649147 -649151 -649157 -649183 -649217 -649261 -649273 -649277 -649279 -649283 -649291 -649307 -649321 -649361 -649379 -649381 -649403 -649421 -649423 -649427 -649457 -649469 -649471 -649483 -649487 -649499 -649501 -649507 -649511 -649529 -649541 -649559 -649567 -649573 -649577 -649613 -649619 -649631 -649633 -649639 -649643 -649651 -649657 -649661 -649697 -649709 -649717 -649739 -649751 -649769 -649771 -649777 -649783 -649787 -649793 -649799 -649801 -649813 -649829 -649843 -649849 -649867 -649871 -649877 -649879 -649897 -649907 -649921 -649937 -649969 -649981 -649991 -650011 -650017 -650059 -650071 -650081 -650099 -650107 -650179 -650183 -650189 -650213 -650227 -650261 -650269 -650281 -650291 -650317 -650327 -650329 -650347 -650359 -650387 -650401 -650413 -650449 -650477 -650479 -650483 -650519 -650537 -650543 -650549 -650563 -650567 -650581 -650591 -650599 -650609 -650623 -650627 -650669 -650701 -650759 -650761 -650779 -650813 -650821 -650827 -650833 -650851 -650861 -650863 -650869 -650873 -650911 -650917 -650927 -650933 -650953 -650971 -650987 -651017 -651019 -651029 -651043 -651067 -651071 -651097 -651103 -651109 -651127 -651139 -651143 -651169 -651179 -651181 -651191 -651193 -651221 -651223 -651239 -651247 -651251 -651257 -651271 -651281 -651289 -651293 -651323 -651331 -651347 -651361 -651397 -651401 -651437 -651439 -651461 -651473 -651481 -651487 -651503 -651509 -651517 -651587 -651617 -651641 -651647 -651649 -651667 -651683 -651689 -651697 -651727 -651731 -651733 -651767 -651769 -651793 -651803 -651809 -651811 -651821 -651839 -651841 -651853 -651857 -651863 -651869 -651877 -651881 -651901 -651913 -651943 -651971 -651997 -652019 -652033 -652039 -652063 -652079 -652081 -652087 -652117 -652121 -652153 -652189 -652207 -652217 -652229 -652237 -652241 -652243 -652261 -652279 -652283 -652291 -652319 -652321 -652331 -652339 -652343 -652357 -652361 -652369 -652373 -652381 -652411 -652417 -652429 -652447 -652451 -652453 -652493 -652499 -652507 -652541 -652543 -652549 -652559 -652567 -652573 -652577 -652591 -652601 -652607 -652609 -652621 -652627 -652651 -652657 -652667 -652699 -652723 -652727 -652733 -652739 -652741 -652747 -652753 -652759 -652787 -652811 -652831 -652837 -652849 -652853 -652871 -652903 -652909 -652913 -652921 -652931 -652933 -652937 -652943 -652957 -652969 -652991 -652997 -652999 -653033 -653057 -653083 -653111 -653113 -653117 -653143 -653153 -653197 -653203 -653207 -653209 -653243 -653267 -653273 -653281 -653311 -653321 -653339 -653357 -653363 -653431 -653461 -653473 -653491 -653501 -653503 -653507 -653519 -653537 -653539 -653561 -653563 -653579 -653593 -653617 -653621 -653623 -653641 -653647 -653651 -653659 -653687 -653693 -653707 -653711 -653713 -653743 -653749 -653761 -653777 -653789 -653797 -653801 -653819 -653831 -653879 -653881 -653893 -653899 -653903 -653927 -653929 -653941 -653951 -653963 -653969 -653977 -653993 -654001 -654011 -654019 -654023 -654029 -654047 -654053 -654067 -654089 -654107 -654127 -654149 -654161 -654163 -654167 -654169 -654187 -654191 -654209 -654221 -654223 -654229 -654233 -654257 -654293 -654301 -654307 -654323 -654343 -654349 -654371 -654397 -654413 -654421 -654427 -654439 -654491 -654499 -654509 -654527 -654529 -654539 -654541 -654553 -654571 -654587 -654593 -654601 -654611 -654613 -654623 -654629 -654671 -654679 -654697 -654701 -654727 -654739 -654743 -654749 -654767 -654779 -654781 -654799 -654803 -654817 -654821 -654827 -654839 -654853 -654877 -654889 -654917 -654923 -654931 -654943 -654967 -654991 -655001 -655003 -655013 -655021 -655033 -655037 -655043 -655069 -655087 -655103 -655111 -655121 -655157 -655181 -655211 -655219 -655223 -655229 -655241 -655243 -655261 -655267 -655273 -655283 -655289 -655301 -655331 -655337 -655351 -655357 -655373 -655379 -655387 -655399 -655439 -655453 -655471 -655489 -655507 -655511 -655517 -655531 -655541 -655547 -655559 -655561 -655579 -655583 -655597 -655601 -655637 -655643 -655649 -655651 -655657 -655687 -655693 -655717 -655723 -655727 -655757 -655807 -655847 -655849 -655859 -655883 -655901 -655909 -655913 -655927 -655943 -655961 -655987 -656023 -656039 -656063 -656077 -656113 -656119 -656129 -656141 -656147 -656153 -656171 -656221 -656237 -656263 -656267 -656273 -656291 -656297 -656303 -656311 -656321 -656323 -656329 -656333 -656347 -656371 -656377 -656389 -656407 -656423 -656429 -656459 -656471 -656479 -656483 -656519 -656527 -656561 -656587 -656597 -656599 -656603 -656609 -656651 -656657 -656671 -656681 -656683 -656687 -656701 -656707 -656737 -656741 -656749 -656753 -656771 -656783 -656791 -656809 -656819 -656833 -656839 -656891 -656917 -656923 -656939 -656951 -656959 -656977 -656989 -656993 -657017 -657029 -657047 -657049 -657061 -657071 -657079 -657089 -657091 -657113 -657121 -657127 -657131 -657187 -657193 -657197 -657233 -657257 -657269 -657281 -657289 -657299 -657311 -657313 -657323 -657347 -657361 -657383 -657403 -657413 -657431 -657439 -657451 -657469 -657473 -657491 -657493 -657497 -657499 -657523 -657529 -657539 -657557 -657581 -657583 -657589 -657607 -657617 -657649 -657653 -657659 -657661 -657703 -657707 -657719 -657743 -657779 -657793 -657809 -657827 -657841 -657863 -657893 -657911 -657929 -657931 -657947 -657959 -657973 -657983 -658001 -658043 -658051 -658057 -658069 -658079 -658111 -658117 -658123 -658127 -658139 -658153 -658159 -658169 -658187 -658199 -658211 -658219 -658247 -658253 -658261 -658277 -658279 -658303 -658309 -658319 -658321 -658327 -658349 -658351 -658367 -658379 -658391 -658403 -658417 -658433 -658447 -658453 -658477 -658487 -658507 -658547 -658549 -658573 -658579 -658589 -658591 -658601 -658607 -658613 -658633 -658639 -658643 -658649 -658663 -658681 -658703 -658751 -658753 -658783 -658807 -658817 -658831 -658837 -658841 -658871 -658873 -658883 -658897 -658907 -658913 -658919 -658943 -658961 -658963 -658969 -658979 -658991 -658997 -659011 -659023 -659047 -659059 -659063 -659069 -659077 -659101 -659137 -659159 -659171 -659173 -659177 -659189 -659221 -659231 -659237 -659251 -659279 -659299 -659317 -659327 -659333 -659353 -659371 -659419 -659423 -659437 -659453 -659467 -659473 -659497 -659501 -659513 -659521 -659531 -659539 -659563 -659569 -659591 -659597 -659609 -659611 -659621 -659629 -659639 -659653 -659657 -659669 -659671 -659689 -659693 -659713 -659723 -659741 -659759 -659761 -659783 -659819 -659831 -659843 -659849 -659863 -659873 -659881 -659899 -659917 -659941 -659947 -659951 -659963 -659983 -659999 -660001 -660013 -660029 -660047 -660053 -660061 -660067 -660071 -660073 -660097 -660103 -660119 -660131 -660137 -660157 -660167 -660181 -660197 -660199 -660217 -660227 -660241 -660251 -660271 -660277 -660281 -660299 -660329 -660337 -660347 -660349 -660367 -660377 -660379 -660391 -660403 -660409 -660449 -660493 -660503 -660509 -660521 -660529 -660547 -660557 -660559 -660563 -660589 -660593 -660599 -660601 -660607 -660617 -660619 -660643 -660659 -660661 -660683 -660719 -660727 -660731 -660733 -660757 -660769 -660787 -660791 -660799 -660809 -660811 -660817 -660833 -660851 -660853 -660887 -660893 -660899 -660901 -660917 -660923 -660941 -660949 -660973 -660983 -661009 -661019 -661027 -661049 -661061 -661091 -661093 -661097 -661099 -661103 -661109 -661117 -661121 -661139 -661183 -661187 -661189 -661201 -661217 -661231 -661237 -661253 -661259 -661267 -661321 -661327 -661343 -661361 -661373 -661393 -661417 -661421 -661439 -661459 -661477 -661481 -661483 -661513 -661517 -661541 -661547 -661553 -661603 -661607 -661613 -661621 -661663 -661673 -661679 -661697 -661721 -661741 -661769 -661777 -661823 -661849 -661873 -661877 -661879 -661883 -661889 -661897 -661909 -661931 -661939 -661949 -661951 -661961 -661987 -661993 -662003 -662021 -662029 -662047 -662059 -662063 -662083 -662107 -662111 -662141 -662143 -662149 -662177 -662203 -662227 -662231 -662251 -662261 -662267 -662281 -662287 -662309 -662323 -662327 -662339 -662351 -662353 -662357 -662369 -662401 -662407 -662443 -662449 -662477 -662483 -662491 -662513 -662527 -662531 -662537 -662539 -662551 -662567 -662591 -662617 -662639 -662647 -662657 -662671 -662681 -662689 -662693 -662713 -662719 -662743 -662771 -662773 -662789 -662797 -662819 -662833 -662839 -662843 -662867 -662897 -662899 -662917 -662939 -662941 -662947 -662951 -662953 -662957 -662999 -663001 -663007 -663031 -663037 -663049 -663053 -663071 -663097 -663127 -663149 -663161 -663163 -663167 -663191 -663203 -663209 -663239 -663241 -663263 -663269 -663281 -663283 -663301 -663319 -663331 -663349 -663359 -663371 -663407 -663409 -663437 -663463 -663517 -663529 -663539 -663541 -663547 -663557 -663563 -663569 -663571 -663581 -663583 -663587 -663589 -663599 -663601 -663631 -663653 -663659 -663661 -663683 -663709 -663713 -663737 -663763 -663787 -663797 -663821 -663823 -663827 -663853 -663857 -663869 -663881 -663893 -663907 -663937 -663959 -663961 -663967 -663973 -663977 -663979 -663983 -663991 -663997 -664009 -664019 -664043 -664061 -664067 -664091 -664099 -664109 -664117 -664121 -664123 -664133 -664141 -664151 -664177 -664193 -664199 -664211 -664243 -664253 -664271 -664273 -664289 -664319 -664331 -664357 -664369 -664379 -664381 -664403 -664421 -664427 -664441 -664459 -664471 -664507 -664511 -664529 -664537 -664549 -664561 -664571 -664579 -664583 -664589 -664597 -664603 -664613 -664619 -664621 -664633 -664661 -664663 -664667 -664669 -664679 -664687 -664691 -664693 -664711 -664739 -664757 -664771 -664777 -664789 -664793 -664799 -664843 -664847 -664849 -664879 -664891 -664933 -664949 -664967 -664973 -664997 -665011 -665017 -665029 -665039 -665047 -665051 -665053 -665069 -665089 -665111 -665113 -665117 -665123 -665131 -665141 -665153 -665177 -665179 -665201 -665207 -665213 -665221 -665233 -665239 -665251 -665267 -665279 -665293 -665299 -665303 -665311 -665351 -665359 -665369 -665381 -665387 -665419 -665429 -665447 -665479 -665501 -665503 -665507 -665527 -665549 -665557 -665563 -665569 -665573 -665591 -665603 -665617 -665629 -665633 -665659 -665677 -665713 -665719 -665723 -665747 -665761 -665773 -665783 -665789 -665801 -665803 -665813 -665843 -665857 -665897 -665921 -665923 -665947 -665953 -665981 -665983 -665993 -666013 -666019 -666023 -666031 -666041 -666067 -666073 -666079 -666089 -666091 -666109 -666119 -666139 -666143 -666167 -666173 -666187 -666191 -666203 -666229 -666233 -666269 -666277 -666301 -666329 -666353 -666403 -666427 -666431 -666433 -666437 -666439 -666461 -666467 -666493 -666511 -666527 -666529 -666541 -666557 -666559 -666599 -666607 -666637 -666643 -666647 -666649 -666667 -666671 -666683 -666697 -666707 -666727 -666733 -666737 -666749 -666751 -666769 -666773 -666811 -666821 -666823 -666829 -666857 -666871 -666889 -666901 -666929 -666937 -666959 -666979 -666983 -666989 -667013 -667019 -667021 -667081 -667091 -667103 -667123 -667127 -667129 -667141 -667171 -667181 -667211 -667229 -667241 -667243 -667273 -667283 -667309 -667321 -667333 -667351 -667361 -667363 -667367 -667379 -667417 -667421 -667423 -667427 -667441 -667463 -667477 -667487 -667501 -667507 -667519 -667531 -667547 -667549 -667553 -667559 -667561 -667577 -667631 -667643 -667649 -667657 -667673 -667687 -667691 -667697 -667699 -667727 -667741 -667753 -667769 -667781 -667801 -667817 -667819 -667829 -667837 -667859 -667861 -667867 -667883 -667903 -667921 -667949 -667963 -667987 -667991 -667999 -668009 -668029 -668033 -668047 -668051 -668069 -668089 -668093 -668111 -668141 -668153 -668159 -668179 -668201 -668203 -668209 -668221 -668243 -668273 -668303 -668347 -668407 -668417 -668471 -668509 -668513 -668527 -668531 -668533 -668539 -668543 -668567 -668579 -668581 -668599 -668609 -668611 -668617 -668623 -668671 -668677 -668687 -668699 -668713 -668719 -668737 -668741 -668747 -668761 -668791 -668803 -668813 -668821 -668851 -668867 -668869 -668873 -668879 -668903 -668929 -668939 -668947 -668959 -668963 -668989 -668999 -669023 -669029 -669049 -669077 -669089 -669091 -669107 -669113 -669121 -669127 -669133 -669167 -669173 -669181 -669241 -669247 -669271 -669283 -669287 -669289 -669301 -669311 -669329 -669359 -669371 -669377 -669379 -669391 -669401 -669413 -669419 -669433 -669437 -669451 -669463 -669479 -669481 -669527 -669551 -669577 -669607 -669611 -669637 -669649 -669659 -669661 -669667 -669673 -669677 -669679 -669689 -669701 -669707 -669733 -669763 -669787 -669791 -669839 -669847 -669853 -669857 -669859 -669863 -669869 -669887 -669901 -669913 -669923 -669931 -669937 -669943 -669947 -669971 -669989 -670001 -670031 -670037 -670039 -670049 -670051 -670097 -670099 -670129 -670139 -670147 -670177 -670193 -670199 -670211 -670217 -670223 -670231 -670237 -670249 -670261 -670279 -670297 -670303 -670321 -670333 -670343 -670349 -670363 -670379 -670399 -670409 -670447 -670457 -670471 -670487 -670489 -670493 -670507 -670511 -670517 -670541 -670543 -670559 -670577 -670583 -670597 -670613 -670619 -670627 -670639 -670669 -670673 -670693 -670711 -670727 -670729 -670739 -670763 -670777 -670781 -670811 -670823 -670849 -670853 -670867 -670877 -670897 -670903 -670919 -670931 -670951 -670963 -670987 -670991 -671003 -671017 -671029 -671039 -671059 -671063 -671081 -671087 -671093 -671123 -671131 -671141 -671159 -671161 -671189 -671201 -671219 -671233 -671249 -671257 -671261 -671269 -671287 -671299 -671303 -671323 -671339 -671353 -671357 -671369 -671383 -671401 -671417 -671431 -671443 -671467 -671471 -671477 -671501 -671519 -671533 -671537 -671557 -671581 -671591 -671603 -671609 -671633 -671647 -671651 -671681 -671701 -671717 -671729 -671743 -671753 -671777 -671779 -671791 -671831 -671837 -671851 -671887 -671893 -671903 -671911 -671917 -671921 -671933 -671939 -671941 -671947 -671969 -671971 -671981 -671999 -672019 -672029 -672041 -672043 -672059 -672073 -672079 -672097 -672103 -672107 -672127 -672131 -672137 -672143 -672151 -672167 -672169 -672181 -672193 -672209 -672223 -672227 -672229 -672251 -672271 -672283 -672289 -672293 -672311 -672317 -672323 -672341 -672349 -672377 -672379 -672439 -672443 -672473 -672493 -672499 -672521 -672557 -672577 -672587 -672593 -672629 -672641 -672643 -672653 -672667 -672703 -672743 -672757 -672767 -672779 -672781 -672787 -672799 -672803 -672811 -672817 -672823 -672827 -672863 -672869 -672871 -672883 -672901 -672913 -672937 -672943 -672949 -672953 -672967 -672977 -672983 -673019 -673039 -673063 -673069 -673073 -673091 -673093 -673109 -673111 -673117 -673121 -673129 -673157 -673193 -673199 -673201 -673207 -673223 -673241 -673247 -673271 -673273 -673291 -673297 -673313 -673327 -673339 -673349 -673381 -673391 -673397 -673399 -673403 -673411 -673427 -673429 -673441 -673447 -673451 -673457 -673459 -673469 -673487 -673499 -673513 -673529 -673549 -673553 -673567 -673573 -673579 -673609 -673613 -673619 -673637 -673639 -673643 -673649 -673667 -673669 -673747 -673769 -673781 -673787 -673793 -673801 -673811 -673817 -673837 -673879 -673891 -673921 -673943 -673951 -673961 -673979 -673991 -674017 -674057 -674059 -674071 -674083 -674099 -674117 -674123 -674131 -674159 -674161 -674173 -674183 -674189 -674227 -674231 -674239 -674249 -674263 -674269 -674273 -674299 -674321 -674347 -674357 -674363 -674371 -674393 -674419 -674431 -674449 -674461 -674483 -674501 -674533 -674537 -674551 -674563 -674603 -674647 -674669 -674677 -674683 -674693 -674699 -674701 -674711 -674717 -674719 -674731 -674741 -674749 -674759 -674761 -674767 -674771 -674789 -674813 -674827 -674831 -674833 -674837 -674851 -674857 -674867 -674879 -674903 -674929 -674941 -674953 -674957 -674977 -674987 -675029 -675067 -675071 -675079 -675083 -675097 -675109 -675113 -675131 -675133 -675151 -675161 -675163 -675173 -675179 -675187 -675197 -675221 -675239 -675247 -675251 -675253 -675263 -675271 -675299 -675313 -675319 -675341 -675347 -675391 -675407 -675413 -675419 -675449 -675457 -675463 -675481 -675511 -675539 -675541 -675551 -675553 -675559 -675569 -675581 -675593 -675601 -675607 -675611 -675617 -675629 -675643 -675713 -675739 -675743 -675751 -675781 -675797 -675817 -675823 -675827 -675839 -675841 -675859 -675863 -675877 -675881 -675889 -675923 -675929 -675931 -675959 -675973 -675977 -675979 -676007 -676009 -676031 -676037 -676043 -676051 -676057 -676061 -676069 -676099 -676103 -676111 -676129 -676147 -676171 -676211 -676217 -676219 -676241 -676253 -676259 -676279 -676289 -676297 -676337 -676339 -676349 -676363 -676373 -676387 -676391 -676409 -676411 -676421 -676427 -676463 -676469 -676493 -676523 -676573 -676589 -676597 -676601 -676649 -676661 -676679 -676703 -676717 -676721 -676727 -676733 -676747 -676751 -676763 -676771 -676807 -676829 -676859 -676861 -676883 -676891 -676903 -676909 -676919 -676927 -676931 -676937 -676943 -676961 -676967 -676979 -676981 -676987 -676993 -677011 -677021 -677029 -677041 -677057 -677077 -677081 -677107 -677111 -677113 -677119 -677147 -677167 -677177 -677213 -677227 -677231 -677233 -677239 -677309 -677311 -677321 -677323 -677333 -677357 -677371 -677387 -677423 -677441 -677447 -677459 -677461 -677471 -677473 -677531 -677533 -677539 -677543 -677561 -677563 -677587 -677627 -677639 -677647 -677657 -677681 -677683 -677687 -677717 -677737 -677767 -677779 -677783 -677791 -677813 -677827 -677857 -677891 -677927 -677947 -677953 -677959 -677983 -678023 -678037 -678047 -678061 -678077 -678101 -678103 -678133 -678157 -678169 -678179 -678191 -678199 -678203 -678211 -678217 -678221 -678229 -678253 -678289 -678299 -678329 -678341 -678343 -678367 -678371 -678383 -678401 -678407 -678409 -678413 -678421 -678437 -678451 -678463 -678479 -678481 -678493 -678499 -678533 -678541 -678553 -678563 -678577 -678581 -678593 -678599 -678607 -678611 -678631 -678637 -678641 -678647 -678649 -678653 -678659 -678719 -678721 -678731 -678739 -678749 -678757 -678761 -678763 -678767 -678773 -678779 -678809 -678823 -678829 -678833 -678859 -678871 -678883 -678901 -678907 -678941 -678943 -678949 -678959 -678971 -678989 -679033 -679037 -679039 -679051 -679067 -679087 -679111 -679123 -679127 -679153 -679157 -679169 -679171 -679183 -679207 -679219 -679223 -679229 -679249 -679277 -679279 -679297 -679309 -679319 -679333 -679361 -679363 -679369 -679373 -679381 -679403 -679409 -679417 -679423 -679433 -679451 -679463 -679487 -679501 -679517 -679519 -679531 -679537 -679561 -679597 -679603 -679607 -679633 -679639 -679669 -679681 -679691 -679699 -679709 -679733 -679741 -679747 -679751 -679753 -679781 -679793 -679807 -679823 -679829 -679837 -679843 -679859 -679867 -679879 -679883 -679891 -679897 -679907 -679909 -679919 -679933 -679951 -679957 -679961 -679969 -679981 -679993 -679999 -680003 -680027 -680039 -680059 -680077 -680081 -680083 -680107 -680123 -680129 -680159 -680161 -680177 -680189 -680203 -680209 -680213 -680237 -680249 -680263 -680291 -680293 -680297 -680299 -680321 -680327 -680341 -680347 -680353 -680377 -680387 -680399 -680401 -680411 -680417 -680431 -680441 -680443 -680453 -680489 -680503 -680507 -680509 -680531 -680539 -680567 -680569 -680587 -680597 -680611 -680623 -680633 -680651 -680657 -680681 -680707 -680749 -680759 -680767 -680783 -680803 -680809 -680831 -680857 -680861 -680873 -680879 -680881 -680917 -680929 -680959 -680971 -680987 -680989 -680993 -681001 -681011 -681019 -681041 -681047 -681049 -681061 -681067 -681089 -681091 -681113 -681127 -681137 -681151 -681167 -681179 -681221 -681229 -681251 -681253 -681257 -681259 -681271 -681293 -681311 -681337 -681341 -681361 -681367 -681371 -681403 -681407 -681409 -681419 -681427 -681449 -681451 -681481 -681487 -681493 -681497 -681521 -681523 -681539 -681557 -681563 -681589 -681607 -681613 -681623 -681631 -681647 -681673 -681677 -681689 -681719 -681727 -681731 -681763 -681773 -681781 -681787 -681809 -681823 -681833 -681839 -681841 -681883 -681899 -681913 -681931 -681943 -681949 -681971 -681977 -681979 -681983 -681997 -682001 -682009 -682037 -682049 -682063 -682069 -682079 -682141 -682147 -682151 -682153 -682183 -682207 -682219 -682229 -682237 -682247 -682259 -682277 -682289 -682291 -682303 -682307 -682321 -682327 -682333 -682337 -682361 -682373 -682411 -682417 -682421 -682427 -682439 -682447 -682463 -682471 -682483 -682489 -682511 -682519 -682531 -682547 -682597 -682607 -682637 -682657 -682673 -682679 -682697 -682699 -682723 -682729 -682733 -682739 -682751 -682763 -682777 -682789 -682811 -682819 -682901 -682933 -682943 -682951 -682967 -683003 -683021 -683041 -683047 -683071 -683083 -683087 -683119 -683129 -683143 -683149 -683159 -683201 -683231 -683251 -683257 -683273 -683299 -683303 -683317 -683323 -683341 -683351 -683357 -683377 -683381 -683401 -683407 -683437 -683447 -683453 -683461 -683471 -683477 -683479 -683483 -683489 -683503 -683513 -683567 -683591 -683597 -683603 -683651 -683653 -683681 -683687 -683693 -683699 -683701 -683713 -683719 -683731 -683737 -683747 -683759 -683777 -683783 -683789 -683807 -683819 -683821 -683831 -683833 -683843 -683857 -683861 -683863 -683873 -683887 -683899 -683909 -683911 -683923 -683933 -683939 -683957 -683983 -684007 -684017 -684037 -684053 -684091 -684109 -684113 -684119 -684121 -684127 -684157 -684163 -684191 -684217 -684221 -684239 -684269 -684287 -684289 -684293 -684311 -684329 -684337 -684347 -684349 -684373 -684379 -684407 -684419 -684427 -684433 -684443 -684451 -684469 -684473 -684493 -684527 -684547 -684557 -684559 -684569 -684581 -684587 -684599 -684617 -684637 -684643 -684647 -684683 -684713 -684727 -684731 -684751 -684757 -684767 -684769 -684773 -684791 -684793 -684799 -684809 -684829 -684841 -684857 -684869 -684889 -684923 -684949 -684961 -684973 -684977 -684989 -685001 -685019 -685031 -685039 -685051 -685057 -685063 -685073 -685081 -685093 -685099 -685103 -685109 -685123 -685141 -685169 -685177 -685199 -685231 -685247 -685249 -685271 -685297 -685301 -685319 -685337 -685339 -685361 -685367 -685369 -685381 -685393 -685417 -685427 -685429 -685453 -685459 -685471 -685493 -685511 -685513 -685519 -685537 -685541 -685547 -685591 -685609 -685613 -685621 -685631 -685637 -685649 -685669 -685679 -685697 -685717 -685723 -685733 -685739 -685747 -685753 -685759 -685781 -685793 -685819 -685849 -685859 -685907 -685939 -685963 -685969 -685973 -685987 -685991 -686003 -686009 -686011 -686027 -686029 -686039 -686041 -686051 -686057 -686087 -686089 -686099 -686117 -686131 -686141 -686143 -686149 -686173 -686177 -686197 -686201 -686209 -686267 -686269 -686293 -686317 -686321 -686333 -686339 -686353 -686359 -686363 -686417 -686423 -686437 -686449 -686453 -686473 -686479 -686503 -686513 -686519 -686551 -686563 -686593 -686611 -686639 -686669 -686671 -686687 -686723 -686729 -686731 -686737 -686761 -686773 -686789 -686797 -686801 -686837 -686843 -686863 -686879 -686891 -686893 -686897 -686911 -686947 -686963 -686969 -686971 -686977 -686989 -686993 -687007 -687013 -687017 -687019 -687023 -687031 -687041 -687061 -687073 -687083 -687101 -687107 -687109 -687121 -687131 -687139 -687151 -687161 -687163 -687179 -687223 -687233 -687277 -687289 -687299 -687307 -687311 -687317 -687331 -687341 -687343 -687359 -687383 -687389 -687397 -687403 -687413 -687431 -687433 -687437 -687443 -687457 -687461 -687473 -687481 -687499 -687517 -687521 -687523 -687541 -687551 -687559 -687581 -687593 -687623 -687637 -687641 -687647 -687679 -687683 -687691 -687707 -687721 -687737 -687749 -687767 -687773 -687779 -687787 -687809 -687823 -687829 -687839 -687847 -687893 -687901 -687917 -687923 -687931 -687949 -687961 -687977 -688003 -688013 -688027 -688031 -688063 -688067 -688073 -688087 -688097 -688111 -688133 -688139 -688147 -688159 -688187 -688201 -688217 -688223 -688249 -688253 -688277 -688297 -688309 -688333 -688339 -688357 -688379 -688393 -688397 -688403 -688411 -688423 -688433 -688447 -688451 -688453 -688477 -688511 -688531 -688543 -688561 -688573 -688591 -688621 -688627 -688631 -688637 -688657 -688661 -688669 -688679 -688697 -688717 -688729 -688733 -688741 -688747 -688757 -688763 -688777 -688783 -688799 -688813 -688861 -688867 -688871 -688889 -688907 -688939 -688951 -688957 -688969 -688979 -688999 -689021 -689033 -689041 -689063 -689071 -689077 -689081 -689089 -689093 -689107 -689113 -689131 -689141 -689167 -689201 -689219 -689233 -689237 -689257 -689261 -689267 -689279 -689291 -689309 -689317 -689321 -689341 -689357 -689369 -689383 -689389 -689393 -689411 -689431 -689441 -689459 -689461 -689467 -689509 -689551 -689561 -689581 -689587 -689597 -689599 -689603 -689621 -689629 -689641 -689693 -689699 -689713 -689723 -689761 -689771 -689779 -689789 -689797 -689803 -689807 -689827 -689831 -689851 -689867 -689869 -689873 -689879 -689891 -689893 -689903 -689917 -689921 -689929 -689951 -689957 -689959 -689963 -689981 -689987 -690037 -690059 -690073 -690089 -690103 -690119 -690127 -690139 -690143 -690163 -690187 -690233 -690259 -690269 -690271 -690281 -690293 -690323 -690341 -690367 -690377 -690397 -690407 -690419 -690427 -690433 -690439 -690449 -690467 -690491 -690493 -690509 -690511 -690533 -690541 -690553 -690583 -690589 -690607 -690611 -690629 -690661 -690673 -690689 -690719 -690721 -690757 -690787 -690793 -690817 -690839 -690841 -690869 -690871 -690887 -690889 -690919 -690929 -690953 -690997 -691001 -691037 -691051 -691063 -691079 -691109 -691111 -691121 -691129 -691147 -691151 -691153 -691181 -691183 -691189 -691193 -691199 -691231 -691241 -691267 -691289 -691297 -691309 -691333 -691337 -691343 -691349 -691363 -691381 -691399 -691409 -691433 -691451 -691463 -691489 -691499 -691531 -691553 -691573 -691583 -691589 -691591 -691631 -691637 -691651 -691661 -691681 -691687 -691693 -691697 -691709 -691721 -691723 -691727 -691729 -691739 -691759 -691763 -691787 -691799 -691813 -691829 -691837 -691841 -691843 -691871 -691877 -691891 -691897 -691903 -691907 -691919 -691921 -691931 -691949 -691973 -691979 -691991 -691997 -692009 -692017 -692051 -692059 -692063 -692071 -692089 -692099 -692117 -692141 -692147 -692149 -692161 -692191 -692221 -692239 -692249 -692269 -692273 -692281 -692287 -692297 -692299 -692309 -692327 -692333 -692347 -692353 -692371 -692387 -692389 -692399 -692401 -692407 -692413 -692423 -692431 -692441 -692453 -692459 -692467 -692513 -692521 -692537 -692539 -692543 -692567 -692581 -692591 -692621 -692641 -692647 -692651 -692663 -692689 -692707 -692711 -692717 -692729 -692743 -692753 -692761 -692771 -692779 -692789 -692821 -692851 -692863 -692893 -692917 -692927 -692929 -692933 -692957 -692963 -692969 -692983 -693019 -693037 -693041 -693061 -693079 -693089 -693097 -693103 -693127 -693137 -693149 -693157 -693167 -693169 -693179 -693223 -693257 -693283 -693317 -693323 -693337 -693353 -693359 -693373 -693397 -693401 -693403 -693409 -693421 -693431 -693437 -693487 -693493 -693503 -693523 -693527 -693529 -693533 -693569 -693571 -693601 -693607 -693619 -693629 -693659 -693661 -693677 -693683 -693689 -693691 -693697 -693701 -693727 -693731 -693733 -693739 -693743 -693757 -693779 -693793 -693799 -693809 -693827 -693829 -693851 -693859 -693871 -693877 -693881 -693943 -693961 -693967 -693989 -694019 -694033 -694039 -694061 -694069 -694079 -694081 -694087 -694091 -694123 -694189 -694193 -694201 -694207 -694223 -694259 -694261 -694271 -694273 -694277 -694313 -694319 -694327 -694333 -694339 -694349 -694357 -694361 -694367 -694373 -694381 -694387 -694391 -694409 -694427 -694457 -694471 -694481 -694483 -694487 -694511 -694513 -694523 -694541 -694549 -694559 -694567 -694571 -694591 -694597 -694609 -694619 -694633 -694649 -694651 -694717 -694721 -694747 -694763 -694781 -694783 -694789 -694829 -694831 -694867 -694871 -694873 -694879 -694901 -694919 -694951 -694957 -694979 -694987 -694997 -694999 -695003 -695017 -695021 -695047 -695059 -695069 -695081 -695087 -695089 -695099 -695111 -695117 -695131 -695141 -695171 -695207 -695239 -695243 -695257 -695263 -695269 -695281 -695293 -695297 -695309 -695323 -695327 -695329 -695347 -695369 -695371 -695377 -695389 -695407 -695411 -695441 -695447 -695467 -695477 -695491 -695503 -695509 -695561 -695567 -695573 -695581 -695593 -695599 -695603 -695621 -695627 -695641 -695659 -695663 -695677 -695687 -695689 -695701 -695719 -695743 -695749 -695771 -695777 -695791 -695801 -695809 -695839 -695843 -695867 -695873 -695879 -695881 -695899 -695917 -695927 -695939 -695999 -696019 -696053 -696061 -696067 -696077 -696079 -696083 -696107 -696109 -696119 -696149 -696181 -696239 -696253 -696257 -696263 -696271 -696281 -696313 -696317 -696323 -696343 -696349 -696359 -696361 -696373 -696379 -696403 -696413 -696427 -696433 -696457 -696481 -696491 -696497 -696503 -696517 -696523 -696533 -696547 -696569 -696607 -696611 -696617 -696623 -696629 -696653 -696659 -696679 -696691 -696719 -696721 -696737 -696743 -696757 -696763 -696793 -696809 -696811 -696823 -696827 -696833 -696851 -696853 -696887 -696889 -696893 -696907 -696929 -696937 -696961 -696989 -696991 -697009 -697013 -697019 -697033 -697049 -697063 -697069 -697079 -697087 -697093 -697111 -697121 -697127 -697133 -697141 -697157 -697181 -697201 -697211 -697217 -697259 -697261 -697267 -697271 -697303 -697327 -697351 -697373 -697379 -697381 -697387 -697397 -697399 -697409 -697423 -697441 -697447 -697453 -697457 -697481 -697507 -697511 -697513 -697519 -697523 -697553 -697579 -697583 -697591 -697601 -697603 -697637 -697643 -697673 -697681 -697687 -697691 -697693 -697703 -697727 -697729 -697733 -697757 -697759 -697787 -697819 -697831 -697877 -697891 -697897 -697909 -697913 -697937 -697951 -697967 -697973 -697979 -697993 -697999 -698017 -698021 -698039 -698051 -698053 -698077 -698083 -698111 -698171 -698183 -698239 -698249 -698251 -698261 -698263 -698273 -698287 -698293 -698297 -698311 -698329 -698339 -698359 -698371 -698387 -698393 -698413 -698417 -698419 -698437 -698447 -698471 -698483 -698491 -698507 -698521 -698527 -698531 -698539 -698543 -698557 -698567 -698591 -698641 -698653 -698669 -698701 -698713 -698723 -698729 -698773 -698779 -698821 -698827 -698849 -698891 -698899 -698903 -698923 -698939 -698977 -698983 -699001 -699007 -699037 -699053 -699059 -699073 -699077 -699089 -699113 -699119 -699133 -699151 -699157 -699169 -699187 -699191 -699197 -699211 -699217 -699221 -699241 -699253 -699271 -699287 -699289 -699299 -699319 -699323 -699343 -699367 -699373 -699379 -699383 -699401 -699427 -699437 -699443 -699449 -699463 -699469 -699493 -699511 -699521 -699527 -699529 -699539 -699541 -699557 -699571 -699581 -699617 -699631 -699641 -699649 -699697 -699709 -699719 -699733 -699757 -699761 -699767 -699791 -699793 -699817 -699823 -699863 -699931 -699943 -699947 -699953 -699961 -699967 -700001 -700027 -700057 -700067 -700079 -700081 -700087 -700099 -700103 -700109 -700127 -700129 -700171 -700199 -700201 -700211 -700223 -700229 -700237 -700241 -700277 -700279 -700303 -700307 -700319 -700331 -700339 -700361 -700363 -700367 -700387 -700391 -700393 -700423 -700429 -700433 -700459 -700471 -700499 -700523 -700537 -700561 -700571 -700573 -700577 -700591 -700597 -700627 -700633 -700639 -700643 -700673 -700681 -700703 -700717 -700751 -700759 -700781 -700789 -700801 -700811 -700831 -700837 -700849 -700871 -700877 -700883 -700897 -700907 -700919 -700933 -700937 -700949 -700963 -700993 -701009 -701011 -701023 -701033 -701047 -701089 -701117 -701147 -701159 -701177 -701179 -701209 -701219 -701221 -701227 -701257 -701279 -701291 -701299 -701329 -701341 -701357 -701359 -701377 -701383 -701399 -701401 -701413 -701417 -701419 -701443 -701447 -701453 -701473 -701479 -701489 -701497 -701507 -701509 -701527 -701531 -701549 -701579 -701581 -701593 -701609 -701611 -701621 -701627 -701629 -701653 -701669 -701671 -701681 -701699 -701711 -701719 -701731 -701741 -701761 -701783 -701791 -701819 -701837 -701863 -701881 -701903 -701951 -701957 -701963 -701969 -702007 -702011 -702017 -702067 -702077 -702101 -702113 -702127 -702131 -702137 -702139 -702173 -702179 -702193 -702199 -702203 -702211 -702239 -702257 -702269 -702281 -702283 -702311 -702313 -702323 -702329 -702337 -702341 -702347 -702349 -702353 -702379 -702391 -702407 -702413 -702431 -702433 -702439 -702451 -702469 -702497 -702503 -702511 -702517 -702523 -702529 -702539 -702551 -702557 -702587 -702589 -702599 -702607 -702613 -702623 -702671 -702679 -702683 -702701 -702707 -702721 -702731 -702733 -702743 -702773 -702787 -702803 -702809 -702817 -702827 -702847 -702851 -702853 -702869 -702881 -702887 -702893 -702913 -702937 -702983 -702991 -703013 -703033 -703039 -703081 -703117 -703121 -703123 -703127 -703139 -703141 -703169 -703193 -703211 -703217 -703223 -703229 -703231 -703243 -703249 -703267 -703277 -703301 -703309 -703321 -703327 -703331 -703349 -703357 -703379 -703393 -703411 -703441 -703447 -703459 -703463 -703471 -703489 -703499 -703531 -703537 -703559 -703561 -703631 -703643 -703657 -703663 -703673 -703679 -703691 -703699 -703709 -703711 -703721 -703733 -703753 -703763 -703789 -703819 -703837 -703849 -703861 -703873 -703883 -703897 -703903 -703907 -703943 -703949 -703957 -703981 -703991 -704003 -704009 -704017 -704023 -704027 -704029 -704059 -704069 -704087 -704101 -704111 -704117 -704131 -704141 -704153 -704161 -704177 -704183 -704189 -704213 -704219 -704233 -704243 -704251 -704269 -704279 -704281 -704287 -704299 -704303 -704309 -704321 -704357 -704393 -704399 -704419 -704441 -704447 -704449 -704453 -704461 -704477 -704507 -704521 -704527 -704549 -704551 -704567 -704569 -704579 -704581 -704593 -704603 -704617 -704647 -704657 -704663 -704681 -704687 -704713 -704719 -704731 -704747 -704761 -704771 -704777 -704779 -704783 -704797 -704801 -704807 -704819 -704833 -704839 -704849 -704857 -704861 -704863 -704867 -704897 -704929 -704933 -704947 -704983 -704989 -704993 -704999 -705011 -705013 -705017 -705031 -705043 -705053 -705073 -705079 -705097 -705113 -705119 -705127 -705137 -705161 -705163 -705167 -705169 -705181 -705191 -705197 -705209 -705247 -705259 -705269 -705277 -705293 -705307 -705317 -705389 -705403 -705409 -705421 -705427 -705437 -705461 -705491 -705493 -705499 -705521 -705533 -705559 -705613 -705631 -705643 -705689 -705713 -705737 -705751 -705763 -705769 -705779 -705781 -705787 -705821 -705827 -705829 -705833 -705841 -705863 -705871 -705883 -705899 -705919 -705937 -705949 -705967 -705973 -705989 -706001 -706003 -706009 -706019 -706033 -706039 -706049 -706051 -706067 -706099 -706109 -706117 -706133 -706141 -706151 -706157 -706159 -706183 -706193 -706201 -706207 -706213 -706229 -706253 -706267 -706283 -706291 -706297 -706301 -706309 -706313 -706337 -706357 -706369 -706373 -706403 -706417 -706427 -706463 -706481 -706487 -706499 -706507 -706523 -706547 -706561 -706597 -706603 -706613 -706621 -706631 -706633 -706661 -706669 -706679 -706703 -706709 -706729 -706733 -706747 -706751 -706753 -706757 -706763 -706787 -706793 -706801 -706829 -706837 -706841 -706847 -706883 -706897 -706907 -706913 -706919 -706921 -706943 -706961 -706973 -706987 -706999 -707011 -707027 -707029 -707053 -707071 -707099 -707111 -707117 -707131 -707143 -707153 -707159 -707177 -707191 -707197 -707219 -707249 -707261 -707279 -707293 -707299 -707321 -707341 -707359 -707383 -707407 -707429 -707431 -707437 -707459 -707467 -707501 -707527 -707543 -707561 -707563 -707573 -707627 -707633 -707647 -707653 -707669 -707671 -707677 -707683 -707689 -707711 -707717 -707723 -707747 -707753 -707767 -707789 -707797 -707801 -707813 -707827 -707831 -707849 -707857 -707869 -707873 -707887 -707911 -707923 -707929 -707933 -707939 -707951 -707953 -707957 -707969 -707981 -707983 -708007 -708011 -708017 -708023 -708031 -708041 -708047 -708049 -708053 -708061 -708091 -708109 -708119 -708131 -708137 -708139 -708161 -708163 -708179 -708199 -708221 -708223 -708229 -708251 -708269 -708283 -708287 -708293 -708311 -708329 -708343 -708347 -708353 -708359 -708361 -708371 -708403 -708437 -708457 -708473 -708479 -708481 -708493 -708497 -708517 -708527 -708559 -708563 -708569 -708583 -708593 -708599 -708601 -708641 -708647 -708667 -708689 -708703 -708733 -708751 -708803 -708823 -708839 -708857 -708859 -708893 -708899 -708907 -708913 -708923 -708937 -708943 -708959 -708979 -708989 -708991 -708997 -709043 -709057 -709097 -709117 -709123 -709139 -709141 -709151 -709153 -709157 -709201 -709211 -709217 -709231 -709237 -709271 -709273 -709279 -709283 -709307 -709321 -709337 -709349 -709351 -709381 -709409 -709417 -709421 -709433 -709447 -709451 -709453 -709469 -709507 -709519 -709531 -709537 -709547 -709561 -709589 -709603 -709607 -709609 -709649 -709651 -709663 -709673 -709679 -709691 -709693 -709703 -709729 -709739 -709741 -709769 -709777 -709789 -709799 -709817 -709823 -709831 -709843 -709847 -709853 -709861 -709871 -709879 -709901 -709909 -709913 -709921 -709927 -709957 -709963 -709967 -709981 -709991 -710009 -710023 -710027 -710051 -710053 -710081 -710089 -710119 -710189 -710207 -710219 -710221 -710257 -710261 -710273 -710293 -710299 -710321 -710323 -710327 -710341 -710351 -710371 -710377 -710383 -710389 -710399 -710441 -710443 -710449 -710459 -710473 -710483 -710491 -710503 -710513 -710519 -710527 -710531 -710557 -710561 -710569 -710573 -710599 -710603 -710609 -710621 -710623 -710627 -710641 -710663 -710683 -710693 -710713 -710777 -710779 -710791 -710813 -710837 -710839 -710849 -710851 -710863 -710867 -710873 -710887 -710903 -710909 -710911 -710917 -710929 -710933 -710951 -710959 -710971 -710977 -710987 -710989 -711001 -711017 -711019 -711023 -711041 -711049 -711089 -711097 -711121 -711131 -711133 -711143 -711163 -711173 -711181 -711187 -711209 -711223 -711259 -711287 -711299 -711307 -711317 -711329 -711353 -711371 -711397 -711409 -711427 -711437 -711463 -711479 -711497 -711499 -711509 -711517 -711523 -711539 -711563 -711577 -711583 -711589 -711617 -711629 -711649 -711653 -711679 -711691 -711701 -711707 -711709 -711713 -711727 -711731 -711749 -711751 -711757 -711793 -711811 -711817 -711829 -711839 -711847 -711859 -711877 -711889 -711899 -711913 -711923 -711929 -711937 -711947 -711959 -711967 -711973 -711983 -712007 -712021 -712051 -712067 -712093 -712109 -712121 -712133 -712157 -712169 -712171 -712183 -712199 -712219 -712237 -712279 -712289 -712301 -712303 -712319 -712321 -712331 -712339 -712357 -712409 -712417 -712427 -712429 -712433 -712447 -712477 -712483 -712489 -712493 -712499 -712507 -712511 -712531 -712561 -712571 -712573 -712601 -712603 -712631 -712651 -712669 -712681 -712687 -712693 -712697 -712711 -712717 -712739 -712781 -712807 -712819 -712837 -712841 -712843 -712847 -712883 -712889 -712891 -712909 -712913 -712927 -712939 -712951 -712961 -712967 -712973 -712981 -713021 -713039 -713059 -713077 -713107 -713117 -713129 -713147 -713149 -713159 -713171 -713177 -713183 -713189 -713191 -713227 -713233 -713239 -713243 -713261 -713267 -713281 -713287 -713309 -713311 -713329 -713347 -713351 -713353 -713357 -713381 -713389 -713399 -713407 -713411 -713417 -713467 -713477 -713491 -713497 -713501 -713509 -713533 -713563 -713569 -713597 -713599 -713611 -713627 -713653 -713663 -713681 -713737 -713743 -713747 -713753 -713771 -713807 -713827 -713831 -713833 -713861 -713863 -713873 -713891 -713903 -713917 -713927 -713939 -713941 -713957 -713981 -713987 -714029 -714037 -714061 -714073 -714107 -714113 -714139 -714143 -714151 -714163 -714169 -714199 -714223 -714227 -714247 -714257 -714283 -714341 -714349 -714361 -714377 -714443 -714463 -714479 -714481 -714487 -714503 -714509 -714517 -714521 -714529 -714551 -714557 -714563 -714569 -714577 -714601 -714619 -714673 -714677 -714691 -714719 -714739 -714751 -714773 -714781 -714787 -714797 -714809 -714827 -714839 -714841 -714851 -714853 -714869 -714881 -714887 -714893 -714907 -714911 -714919 -714943 -714947 -714949 -714971 -714991 -715019 -715031 -715049 -715063 -715069 -715073 -715087 -715109 -715123 -715151 -715153 -715157 -715159 -715171 -715189 -715193 -715223 -715229 -715237 -715243 -715249 -715259 -715289 -715301 -715303 -715313 -715339 -715357 -715361 -715373 -715397 -715417 -715423 -715439 -715441 -715453 -715457 -715489 -715499 -715523 -715537 -715549 -715567 -715571 -715577 -715579 -715613 -715621 -715639 -715643 -715651 -715657 -715679 -715681 -715699 -715727 -715739 -715753 -715777 -715789 -715801 -715811 -715817 -715823 -715843 -715849 -715859 -715867 -715873 -715877 -715879 -715889 -715903 -715909 -715919 -715927 -715943 -715961 -715963 -715969 -715973 -715991 -715999 -716003 -716033 -716063 -716087 -716117 -716123 -716137 -716143 -716161 -716171 -716173 -716249 -716257 -716279 -716291 -716299 -716321 -716351 -716383 -716389 -716399 -716411 -716413 -716447 -716449 -716453 -716459 -716477 -716479 -716483 -716491 -716501 -716531 -716543 -716549 -716563 -716581 -716591 -716621 -716629 -716633 -716659 -716663 -716671 -716687 -716693 -716707 -716713 -716731 -716741 -716743 -716747 -716783 -716789 -716809 -716819 -716827 -716857 -716861 -716869 -716897 -716899 -716917 -716929 -716951 -716953 -716959 -716981 -716987 -717001 -717011 -717047 -717089 -717091 -717103 -717109 -717113 -717127 -717133 -717139 -717149 -717151 -717161 -717191 -717229 -717259 -717271 -717289 -717293 -717317 -717323 -717331 -717341 -717397 -717413 -717419 -717427 -717443 -717449 -717463 -717491 -717511 -717527 -717529 -717533 -717539 -717551 -717559 -717581 -717589 -717593 -717631 -717653 -717659 -717667 -717679 -717683 -717697 -717719 -717751 -717797 -717803 -717811 -717817 -717841 -717851 -717883 -717887 -717917 -717919 -717923 -717967 -717979 -717989 -718007 -718043 -718049 -718051 -718087 -718093 -718121 -718139 -718163 -718169 -718171 -718183 -718187 -718241 -718259 -718271 -718303 -718321 -718331 -718337 -718343 -718349 -718357 -718379 -718381 -718387 -718391 -718411 -718423 -718427 -718433 -718453 -718457 -718463 -718493 -718511 -718513 -718541 -718547 -718559 -718579 -718603 -718621 -718633 -718657 -718661 -718691 -718703 -718717 -718723 -718741 -718747 -718759 -718801 -718807 -718813 -718841 -718847 -718871 -718897 -718901 -718919 -718931 -718937 -718943 -718973 -718999 -719009 -719011 -719027 -719041 -719057 -719063 -719071 -719101 -719119 -719143 -719149 -719153 -719167 -719177 -719179 -719183 -719189 -719197 -719203 -719227 -719237 -719239 -719267 -719281 -719297 -719333 -719351 -719353 -719377 -719393 -719413 -719419 -719441 -719447 -719483 -719503 -719533 -719557 -719567 -719569 -719573 -719597 -719599 -719633 -719639 -719659 -719671 -719681 -719683 -719689 -719699 -719713 -719717 -719723 -719731 -719749 -719753 -719773 -719779 -719791 -719801 -719813 -719821 -719833 -719839 -719893 -719903 -719911 -719941 -719947 -719951 -719959 -719981 -719989 -720007 -720019 -720023 -720053 -720059 -720089 -720091 -720101 -720127 -720133 -720151 -720173 -720179 -720193 -720197 -720211 -720221 -720229 -720241 -720253 -720257 -720281 -720283 -720289 -720299 -720301 -720311 -720319 -720359 -720361 -720367 -720373 -720397 -720403 -720407 -720413 -720439 -720481 -720491 -720497 -720527 -720547 -720569 -720571 -720607 -720611 -720617 -720619 -720653 -720661 -720677 -720683 -720697 -720703 -720743 -720763 -720767 -720773 -720779 -720791 -720793 -720829 -720847 -720857 -720869 -720877 -720887 -720899 -720901 -720913 -720931 -720943 -720947 -720961 -720971 -720983 -720991 -720997 -721003 -721013 -721037 -721043 -721051 -721057 -721079 -721087 -721109 -721111 -721117 -721129 -721139 -721141 -721159 -721163 -721169 -721177 -721181 -721199 -721207 -721213 -721219 -721223 -721229 -721243 -721261 -721267 -721283 -721291 -721307 -721319 -721321 -721333 -721337 -721351 -721363 -721379 -721381 -721387 -721397 -721439 -721451 -721481 -721499 -721529 -721547 -721561 -721571 -721577 -721597 -721613 -721619 -721621 -721631 -721661 -721663 -721687 -721697 -721703 -721709 -721733 -721739 -721783 -721793 -721843 -721849 -721859 -721883 -721891 -721909 -721921 -721951 -721961 -721979 -721991 -721997 -722011 -722023 -722027 -722047 -722063 -722069 -722077 -722093 -722119 -722123 -722147 -722149 -722153 -722159 -722167 -722173 -722213 -722237 -722243 -722257 -722273 -722287 -722291 -722299 -722311 -722317 -722321 -722333 -722341 -722353 -722363 -722369 -722377 -722389 -722411 -722417 -722431 -722459 -722467 -722479 -722489 -722509 -722521 -722537 -722539 -722563 -722581 -722599 -722611 -722633 -722639 -722663 -722669 -722713 -722723 -722737 -722749 -722783 -722791 -722797 -722807 -722819 -722833 -722849 -722881 -722899 -722903 -722921 -722933 -722963 -722971 -722977 -722983 -723029 -723031 -723043 -723049 -723053 -723067 -723071 -723089 -723101 -723103 -723109 -723113 -723119 -723127 -723133 -723157 -723161 -723167 -723169 -723181 -723193 -723209 -723221 -723227 -723257 -723259 -723263 -723269 -723271 -723287 -723293 -723319 -723337 -723353 -723361 -723379 -723391 -723407 -723409 -723413 -723421 -723439 -723451 -723467 -723473 -723479 -723491 -723493 -723529 -723551 -723553 -723559 -723563 -723587 -723589 -723601 -723607 -723617 -723623 -723661 -723721 -723727 -723739 -723761 -723791 -723797 -723799 -723803 -723823 -723829 -723839 -723851 -723857 -723859 -723893 -723901 -723907 -723913 -723917 -723923 -723949 -723959 -723967 -723973 -723977 -723997 -724001 -724007 -724021 -724079 -724093 -724099 -724111 -724117 -724121 -724123 -724153 -724187 -724211 -724219 -724259 -724267 -724277 -724291 -724303 -724309 -724313 -724331 -724393 -724403 -724433 -724441 -724447 -724453 -724459 -724469 -724481 -724487 -724499 -724513 -724517 -724519 -724531 -724547 -724553 -724567 -724573 -724583 -724597 -724601 -724609 -724621 -724627 -724631 -724639 -724643 -724651 -724721 -724723 -724729 -724733 -724747 -724751 -724769 -724777 -724781 -724783 -724807 -724813 -724837 -724847 -724853 -724879 -724901 -724903 -724939 -724949 -724961 -724967 -724991 -724993 -725009 -725041 -725057 -725071 -725077 -725099 -725111 -725113 -725119 -725147 -725149 -725159 -725161 -725189 -725201 -725209 -725273 -725293 -725303 -725317 -725321 -725323 -725327 -725341 -725357 -725359 -725371 -725381 -725393 -725399 -725423 -725437 -725447 -725449 -725479 -725507 -725519 -725531 -725537 -725579 -725587 -725597 -725603 -725639 -725653 -725663 -725671 -725687 -725723 -725731 -725737 -725749 -725789 -725801 -725807 -725827 -725861 -725863 -725867 -725891 -725897 -725909 -725929 -725939 -725953 -725981 -725983 -725993 -725999 -726007 -726013 -726023 -726043 -726071 -726091 -726097 -726101 -726107 -726109 -726137 -726139 -726149 -726157 -726163 -726169 -726181 -726191 -726221 -726287 -726289 -726301 -726307 -726331 -726337 -726367 -726371 -726377 -726379 -726391 -726413 -726419 -726431 -726457 -726463 -726469 -726487 -726497 -726521 -726527 -726533 -726559 -726589 -726599 -726601 -726611 -726619 -726623 -726629 -726641 -726647 -726659 -726679 -726689 -726697 -726701 -726707 -726751 -726779 -726787 -726797 -726809 -726811 -726839 -726841 -726853 -726893 -726899 -726911 -726917 -726923 -726941 -726953 -726983 -726989 -726991 -727003 -727009 -727019 -727021 -727049 -727061 -727063 -727079 -727121 -727123 -727157 -727159 -727169 -727183 -727189 -727201 -727211 -727241 -727247 -727249 -727261 -727267 -727271 -727273 -727289 -727297 -727313 -727327 -727343 -727351 -727369 -727399 -727409 -727427 -727451 -727459 -727471 -727483 -727487 -727499 -727501 -727541 -727561 -727577 -727589 -727613 -727621 -727633 -727667 -727673 -727691 -727703 -727711 -727717 -727729 -727733 -727747 -727759 -727763 -727777 -727781 -727799 -727807 -727817 -727823 -727843 -727847 -727877 -727879 -727891 -727933 -727939 -727949 -727981 -727997 -728003 -728017 -728027 -728047 -728069 -728087 -728113 -728129 -728131 -728173 -728191 -728207 -728209 -728261 -728267 -728269 -728281 -728293 -728303 -728317 -728333 -728369 -728381 -728383 -728417 -728423 -728437 -728471 -728477 -728489 -728521 -728527 -728537 -728551 -728557 -728561 -728573 -728579 -728627 -728639 -728647 -728659 -728681 -728687 -728699 -728701 -728713 -728723 -728729 -728731 -728743 -728747 -728771 -728809 -728813 -728831 -728837 -728839 -728843 -728851 -728867 -728869 -728873 -728881 -728891 -728899 -728911 -728921 -728927 -728929 -728941 -728947 -728953 -728969 -728971 -728993 -729019 -729023 -729037 -729041 -729059 -729073 -729139 -729143 -729173 -729187 -729191 -729199 -729203 -729217 -729257 -729269 -729271 -729293 -729301 -729329 -729331 -729359 -729367 -729371 -729373 -729389 -729403 -729413 -729451 -729457 -729473 -729493 -729497 -729503 -729511 -729527 -729551 -729557 -729559 -729569 -729571 -729577 -729587 -729601 -729607 -729613 -729637 -729643 -729649 -729661 -729671 -729679 -729689 -729713 -729719 -729737 -729749 -729761 -729779 -729787 -729791 -729821 -729851 -729871 -729877 -729907 -729913 -729919 -729931 -729941 -729943 -729947 -729977 -729979 -729991 -730003 -730021 -730033 -730049 -730069 -730091 -730111 -730139 -730157 -730187 -730199 -730217 -730237 -730253 -730277 -730283 -730297 -730321 -730339 -730363 -730397 -730399 -730421 -730447 -730451 -730459 -730469 -730487 -730537 -730553 -730559 -730567 -730571 -730573 -730589 -730591 -730603 -730619 -730633 -730637 -730663 -730669 -730679 -730727 -730747 -730753 -730757 -730777 -730781 -730783 -730789 -730799 -730811 -730819 -730823 -730837 -730843 -730853 -730867 -730879 -730889 -730901 -730909 -730913 -730943 -730969 -730973 -730993 -730999 -731033 -731041 -731047 -731053 -731057 -731113 -731117 -731141 -731173 -731183 -731189 -731191 -731201 -731209 -731219 -731233 -731243 -731249 -731251 -731257 -731261 -731267 -731287 -731299 -731327 -731333 -731359 -731363 -731369 -731389 -731413 -731447 -731483 -731501 -731503 -731509 -731531 -731539 -731567 -731587 -731593 -731597 -731603 -731611 -731623 -731639 -731651 -731681 -731683 -731711 -731713 -731719 -731729 -731737 -731741 -731761 -731767 -731779 -731803 -731807 -731821 -731827 -731831 -731839 -731851 -731869 -731881 -731893 -731909 -731911 -731921 -731923 -731933 -731957 -731981 -731999 -732023 -732029 -732041 -732073 -732077 -732079 -732097 -732101 -732133 -732157 -732169 -732181 -732187 -732191 -732197 -732209 -732211 -732217 -732229 -732233 -732239 -732257 -732271 -732283 -732287 -732293 -732299 -732311 -732323 -732331 -732373 -732439 -732449 -732461 -732467 -732491 -732493 -732497 -732509 -732521 -732533 -732541 -732601 -732617 -732631 -732653 -732673 -732689 -732703 -732709 -732713 -732731 -732749 -732761 -732769 -732799 -732817 -732827 -732829 -732833 -732841 -732863 -732877 -732889 -732911 -732923 -732943 -732959 -732967 -732971 -732997 -733003 -733009 -733067 -733097 -733099 -733111 -733123 -733127 -733133 -733141 -733147 -733157 -733169 -733177 -733189 -733237 -733241 -733273 -733277 -733283 -733289 -733301 -733307 -733321 -733331 -733333 -733339 -733351 -733373 -733387 -733391 -733393 -733399 -733409 -733427 -733433 -733459 -733477 -733489 -733511 -733517 -733519 -733559 -733561 -733591 -733619 -733639 -733651 -733687 -733697 -733741 -733751 -733753 -733757 -733793 -733807 -733813 -733823 -733829 -733841 -733847 -733849 -733867 -733871 -733879 -733883 -733919 -733921 -733937 -733939 -733949 -733963 -733973 -733981 -733991 -734003 -734017 -734021 -734047 -734057 -734087 -734113 -734131 -734143 -734159 -734171 -734177 -734189 -734197 -734203 -734207 -734221 -734233 -734263 -734267 -734273 -734291 -734303 -734329 -734347 -734381 -734389 -734401 -734411 -734423 -734429 -734431 -734443 -734471 -734473 -734477 -734479 -734497 -734537 -734543 -734549 -734557 -734567 -734627 -734647 -734653 -734659 -734663 -734687 -734693 -734707 -734717 -734729 -734737 -734743 -734759 -734771 -734803 -734807 -734813 -734819 -734837 -734849 -734869 -734879 -734887 -734897 -734911 -734933 -734941 -734953 -734957 -734959 -734971 -735001 -735019 -735043 -735061 -735067 -735071 -735073 -735083 -735107 -735109 -735113 -735139 -735143 -735157 -735169 -735173 -735181 -735187 -735193 -735209 -735211 -735239 -735247 -735263 -735271 -735283 -735307 -735311 -735331 -735337 -735341 -735359 -735367 -735373 -735389 -735391 -735419 -735421 -735431 -735439 -735443 -735451 -735461 -735467 -735473 -735479 -735491 -735529 -735533 -735557 -735571 -735617 -735649 -735653 -735659 -735673 -735689 -735697 -735719 -735731 -735733 -735739 -735751 -735781 -735809 -735821 -735829 -735853 -735871 -735877 -735883 -735901 -735919 -735937 -735949 -735953 -735979 -735983 -735997 -736007 -736013 -736027 -736037 -736039 -736051 -736061 -736063 -736091 -736093 -736097 -736111 -736121 -736147 -736159 -736181 -736187 -736243 -736247 -736249 -736259 -736273 -736277 -736279 -736357 -736361 -736363 -736367 -736369 -736381 -736387 -736399 -736403 -736409 -736429 -736433 -736441 -736447 -736469 -736471 -736511 -736577 -736607 -736639 -736657 -736679 -736691 -736699 -736717 -736721 -736741 -736787 -736793 -736817 -736823 -736843 -736847 -736867 -736871 -736889 -736903 -736921 -736927 -736937 -736951 -736961 -736973 -736987 -736993 -737017 -737039 -737041 -737047 -737053 -737059 -737083 -737089 -737111 -737119 -737129 -737131 -737147 -737159 -737179 -737183 -737203 -737207 -737251 -737263 -737279 -737281 -737287 -737291 -737293 -737309 -737327 -737339 -737351 -737353 -737411 -737413 -737423 -737431 -737479 -737483 -737497 -737501 -737507 -737509 -737531 -737533 -737537 -737563 -737567 -737573 -737591 -737593 -737617 -737629 -737641 -737657 -737663 -737683 -737687 -737717 -737719 -737729 -737747 -737753 -737767 -737773 -737797 -737801 -737809 -737819 -737843 -737857 -737861 -737873 -737887 -737897 -737921 -737927 -737929 -737969 -737981 -737999 -738011 -738029 -738043 -738053 -738071 -738083 -738107 -738109 -738121 -738151 -738163 -738173 -738197 -738211 -738217 -738223 -738247 -738263 -738301 -738313 -738317 -738319 -738341 -738349 -738373 -738379 -738383 -738391 -738401 -738403 -738421 -738443 -738457 -738469 -738487 -738499 -738509 -738523 -738539 -738547 -738581 -738583 -738589 -738623 -738643 -738677 -738707 -738713 -738721 -738743 -738757 -738781 -738791 -738797 -738811 -738827 -738839 -738847 -738851 -738863 -738877 -738889 -738917 -738919 -738923 -738937 -738953 -738961 -738977 -738989 -739003 -739021 -739027 -739031 -739051 -739061 -739069 -739087 -739099 -739103 -739111 -739117 -739121 -739153 -739163 -739171 -739183 -739187 -739199 -739201 -739217 -739241 -739253 -739273 -739283 -739301 -739303 -739307 -739327 -739331 -739337 -739351 -739363 -739369 -739373 -739379 -739391 -739393 -739397 -739399 -739433 -739439 -739463 -739469 -739493 -739507 -739511 -739513 -739523 -739549 -739553 -739579 -739601 -739603 -739621 -739631 -739633 -739637 -739649 -739693 -739699 -739723 -739751 -739759 -739771 -739777 -739787 -739799 -739813 -739829 -739847 -739853 -739859 -739861 -739909 -739931 -739943 -739951 -739957 -739967 -739969 -740011 -740021 -740023 -740041 -740053 -740059 -740087 -740099 -740123 -740141 -740143 -740153 -740161 -740171 -740189 -740191 -740227 -740237 -740279 -740287 -740303 -740321 -740323 -740329 -740351 -740359 -740371 -740387 -740423 -740429 -740461 -740473 -740477 -740483 -740513 -740521 -740527 -740533 -740549 -740561 -740581 -740591 -740599 -740603 -740651 -740653 -740659 -740671 -740681 -740687 -740693 -740711 -740713 -740717 -740737 -740749 -740801 -740849 -740891 -740893 -740897 -740903 -740923 -740939 -740951 -740969 -740989 -741001 -741007 -741011 -741031 -741043 -741053 -741061 -741071 -741077 -741079 -741101 -741119 -741121 -741127 -741131 -741137 -741163 -741187 -741193 -741227 -741229 -741233 -741253 -741283 -741337 -741341 -741343 -741347 -741373 -741401 -741409 -741413 -741431 -741457 -741467 -741469 -741473 -741479 -741491 -741493 -741509 -741541 -741547 -741563 -741569 -741593 -741599 -741641 -741661 -741667 -741677 -741679 -741683 -741691 -741709 -741721 -741781 -741787 -741803 -741809 -741827 -741833 -741847 -741857 -741859 -741869 -741877 -741883 -741913 -741929 -741941 -741967 -741973 -741991 -742009 -742031 -742037 -742057 -742069 -742073 -742111 -742117 -742127 -742151 -742153 -742193 -742199 -742201 -742211 -742213 -742219 -742229 -742241 -742243 -742253 -742277 -742283 -742289 -742307 -742327 -742333 -742351 -742369 -742381 -742393 -742409 -742439 -742457 -742499 -742507 -742513 -742519 -742531 -742537 -742541 -742549 -742559 -742579 -742591 -742607 -742619 -742657 -742663 -742673 -742681 -742697 -742699 -742711 -742717 -742723 -742757 -742759 -742783 -742789 -742801 -742817 -742891 -742897 -742909 -742913 -742943 -742949 -742967 -742981 -742991 -742993 -742999 -743027 -743047 -743059 -743069 -743089 -743111 -743123 -743129 -743131 -743137 -743143 -743159 -743161 -743167 -743173 -743177 -743179 -743203 -743209 -743221 -743251 -743263 -743269 -743273 -743279 -743297 -743321 -743333 -743339 -743363 -743377 -743401 -743423 -743447 -743507 -743549 -743551 -743573 -743579 -743591 -743609 -743657 -743669 -743671 -743689 -743693 -743711 -743731 -743747 -743777 -743779 -743791 -743803 -743819 -743833 -743837 -743849 -743851 -743881 -743891 -743917 -743921 -743923 -743933 -743947 -743987 -743989 -744019 -744043 -744071 -744077 -744083 -744113 -744127 -744137 -744179 -744187 -744199 -744203 -744221 -744239 -744251 -744253 -744283 -744301 -744313 -744353 -744371 -744377 -744389 -744391 -744397 -744407 -744409 -744431 -744451 -744493 -744503 -744511 -744539 -744547 -744559 -744599 -744607 -744637 -744641 -744649 -744659 -744661 -744677 -744701 -744707 -744721 -744727 -744739 -744761 -744767 -744791 -744811 -744817 -744823 -744829 -744833 -744859 -744893 -744911 -744917 -744941 -744949 -744959 -744977 -745001 -745013 -745027 -745033 -745037 -745051 -745067 -745103 -745117 -745133 -745141 -745181 -745187 -745189 -745201 -745231 -745243 -745247 -745249 -745273 -745301 -745307 -745337 -745343 -745357 -745369 -745379 -745391 -745397 -745471 -745477 -745517 -745529 -745531 -745543 -745567 -745573 -745601 -745609 -745621 -745631 -745649 -745673 -745697 -745699 -745709 -745711 -745727 -745733 -745741 -745747 -745751 -745753 -745757 -745817 -745837 -745859 -745873 -745903 -745931 -745933 -745939 -745951 -745973 -745981 -745993 -745999 -746017 -746023 -746033 -746041 -746047 -746069 -746099 -746101 -746107 -746117 -746129 -746153 -746167 -746171 -746177 -746183 -746191 -746197 -746203 -746209 -746227 -746231 -746233 -746243 -746267 -746287 -746303 -746309 -746329 -746353 -746363 -746371 -746411 -746413 -746429 -746477 -746479 -746483 -746497 -746503 -746507 -746509 -746531 -746533 -746561 -746563 -746597 -746653 -746659 -746671 -746677 -746723 -746737 -746743 -746747 -746749 -746773 -746777 -746791 -746797 -746807 -746813 -746839 -746843 -746869 -746873 -746891 -746899 -746903 -746939 -746951 -746957 -746959 -746969 -746981 -746989 -747037 -747049 -747053 -747073 -747107 -747113 -747139 -747157 -747161 -747199 -747203 -747223 -747239 -747259 -747277 -747283 -747287 -747319 -747323 -747343 -747361 -747377 -747391 -747401 -747407 -747421 -747427 -747449 -747451 -747457 -747463 -747493 -747497 -747499 -747521 -747529 -747547 -747557 -747563 -747583 -747587 -747599 -747611 -747619 -747647 -747673 -747679 -747713 -747731 -747737 -747743 -747763 -747781 -747811 -747827 -747829 -747833 -747839 -747841 -747853 -747863 -747869 -747871 -747889 -747917 -747919 -747941 -747953 -747977 -747979 -747991 -748003 -748019 -748021 -748039 -748057 -748091 -748093 -748133 -748169 -748183 -748199 -748207 -748211 -748217 -748219 -748249 -748271 -748273 -748283 -748301 -748331 -748337 -748339 -748343 -748361 -748379 -748387 -748441 -748453 -748463 -748471 -748481 -748487 -748499 -748513 -748523 -748541 -748567 -748589 -748597 -748603 -748609 -748613 -748633 -748637 -748639 -748669 -748687 -748691 -748703 -748711 -748717 -748723 -748729 -748763 -748777 -748789 -748801 -748807 -748817 -748819 -748823 -748829 -748831 -748849 -748861 -748871 -748877 -748883 -748889 -748921 -748933 -748963 -748973 -748981 -748987 -749011 -749027 -749051 -749069 -749081 -749083 -749093 -749129 -749137 -749143 -749149 -749153 -749167 -749171 -749183 -749197 -749209 -749219 -749237 -749249 -749257 -749267 -749279 -749297 -749299 -749323 -749339 -749347 -749351 -749383 -749393 -749401 -749423 -749429 -749431 -749443 -749449 -749453 -749461 -749467 -749471 -749543 -749557 -749587 -749641 -749653 -749659 -749677 -749701 -749711 -749729 -749741 -749747 -749761 -749773 -749779 -749803 -749807 -749809 -749843 -749851 -749863 -749891 -749893 -749899 -749909 -749923 -749927 -749939 -749941 -749971 -749993 -750019 -750037 -750059 -750077 -750083 -750097 -750119 -750121 -750131 -750133 -750137 -750151 -750157 -750161 -750163 -750173 -750179 -750203 -750209 -750223 -750229 -750287 -750311 -750313 -750353 -750383 -750401 -750413 -750419 -750437 -750457 -750473 -750487 -750509 -750517 -750521 -750553 -750571 -750599 -750613 -750641 -750653 -750661 -750667 -750679 -750691 -750707 -750713 -750719 -750721 -750749 -750769 -750787 -750791 -750797 -750803 -750809 -750817 -750829 -750853 -750857 -750863 -750917 -750929 -750943 -750961 -750977 -750983 -751001 -751007 -751021 -751027 -751057 -751061 -751087 -751103 -751123 -751133 -751139 -751141 -751147 -751151 -751181 -751183 -751189 -751193 -751199 -751207 -751217 -751237 -751259 -751273 -751277 -751291 -751297 -751301 -751307 -751319 -751321 -751327 -751343 -751351 -751357 -751363 -751367 -751379 -751411 -751423 -751447 -751453 -751463 -751481 -751523 -751529 -751549 -751567 -751579 -751609 -751613 -751627 -751631 -751633 -751637 -751643 -751661 -751669 -751691 -751711 -751717 -751727 -751739 -751747 -751753 -751759 -751763 -751787 -751799 -751813 -751823 -751841 -751853 -751867 -751871 -751879 -751901 -751909 -751913 -751921 -751943 -751957 -751969 -751987 -751997 -752009 -752023 -752033 -752053 -752083 -752093 -752107 -752111 -752117 -752137 -752149 -752177 -752183 -752189 -752197 -752201 -752203 -752207 -752251 -752263 -752273 -752281 -752287 -752291 -752293 -752299 -752303 -752351 -752359 -752383 -752413 -752431 -752447 -752449 -752459 -752483 -752489 -752503 -752513 -752519 -752527 -752569 -752581 -752593 -752603 -752627 -752639 -752651 -752681 -752683 -752699 -752701 -752707 -752747 -752771 -752789 -752797 -752803 -752809 -752819 -752821 -752831 -752833 -752861 -752867 -752881 -752891 -752903 -752911 -752929 -752933 -752977 -752993 -753001 -753007 -753019 -753023 -753031 -753079 -753091 -753127 -753133 -753139 -753143 -753161 -753187 -753191 -753197 -753229 -753257 -753307 -753329 -753341 -753353 -753367 -753373 -753383 -753409 -753421 -753427 -753437 -753439 -753461 -753463 -753497 -753499 -753527 -753547 -753569 -753583 -753587 -753589 -753611 -753617 -753619 -753631 -753647 -753659 -753677 -753679 -753689 -753691 -753707 -753719 -753721 -753737 -753743 -753751 -753773 -753793 -753799 -753803 -753811 -753821 -753839 -753847 -753859 -753931 -753937 -753941 -753947 -753959 -753979 -753983 -754003 -754027 -754037 -754043 -754057 -754067 -754073 -754081 -754093 -754099 -754109 -754111 -754121 -754123 -754133 -754153 -754157 -754181 -754183 -754207 -754211 -754217 -754223 -754241 -754249 -754267 -754279 -754283 -754289 -754297 -754301 -754333 -754337 -754343 -754367 -754373 -754379 -754381 -754399 -754417 -754421 -754427 -754451 -754463 -754483 -754489 -754513 -754531 -754549 -754573 -754577 -754583 -754597 -754627 -754639 -754651 -754703 -754709 -754711 -754717 -754723 -754739 -754751 -754771 -754781 -754811 -754829 -754861 -754877 -754891 -754903 -754907 -754921 -754931 -754937 -754939 -754967 -754969 -754973 -754979 -754981 -754991 -754993 -755009 -755033 -755057 -755071 -755077 -755081 -755087 -755107 -755137 -755143 -755147 -755171 -755173 -755203 -755213 -755233 -755239 -755257 -755267 -755273 -755309 -755311 -755317 -755329 -755333 -755351 -755357 -755371 -755387 -755393 -755399 -755401 -755413 -755437 -755441 -755449 -755473 -755483 -755509 -755539 -755551 -755561 -755567 -755569 -755593 -755597 -755617 -755627 -755663 -755681 -755707 -755717 -755719 -755737 -755759 -755767 -755771 -755789 -755791 -755809 -755813 -755861 -755863 -755869 -755879 -755899 -755903 -755959 -755969 -755977 -756011 -756023 -756043 -756053 -756097 -756101 -756127 -756131 -756139 -756149 -756167 -756179 -756191 -756199 -756227 -756247 -756251 -756253 -756271 -756281 -756289 -756293 -756319 -756323 -756331 -756373 -756403 -756419 -756421 -756433 -756443 -756463 -756467 -756527 -756533 -756541 -756563 -756571 -756593 -756601 -756607 -756629 -756641 -756649 -756667 -756673 -756683 -756689 -756703 -756709 -756719 -756727 -756739 -756773 -756799 -756829 -756839 -756853 -756869 -756881 -756887 -756919 -756923 -756961 -756967 -756971 -757019 -757039 -757063 -757067 -757109 -757111 -757151 -757157 -757171 -757181 -757201 -757241 -757243 -757247 -757259 -757271 -757291 -757297 -757307 -757319 -757327 -757331 -757343 -757363 -757381 -757387 -757403 -757409 -757417 -757429 -757433 -757457 -757481 -757487 -757507 -757513 -757517 -757543 -757553 -757577 -757579 -757583 -757607 -757633 -757651 -757661 -757693 -757699 -757709 -757711 -757727 -757751 -757753 -757763 -757793 -757807 -757811 -757819 -757829 -757879 -757903 -757909 -757927 -757937 -757943 -757951 -757993 -757997 -758003 -758029 -758041 -758053 -758071 -758083 -758099 -758101 -758111 -758137 -758141 -758159 -758179 -758189 -758201 -758203 -758227 -758231 -758237 -758243 -758267 -758269 -758273 -758279 -758299 -758323 -758339 -758341 -758357 -758363 -758383 -758393 -758411 -758431 -758441 -758449 -758453 -758491 -758501 -758503 -758519 -758521 -758551 -758561 -758573 -758579 -758599 -758617 -758629 -758633 -758671 -758687 -758699 -758707 -758711 -758713 -758729 -758731 -758741 -758743 -758753 -758767 -758783 -758789 -758819 -758827 -758837 -758851 -758867 -758887 -758893 -758899 -758929 -758941 -758957 -758963 -758969 -758971 -758987 -759001 -759019 -759029 -759037 -759047 -759053 -759089 -759103 -759113 -759131 -759149 -759167 -759173 -759179 -759181 -759193 -759223 -759229 -759263 -759287 -759293 -759301 -759313 -759329 -759359 -759371 -759377 -759397 -759401 -759431 -759433 -759457 -759463 -759467 -759491 -759503 -759523 -759547 -759553 -759557 -759559 -759569 -759571 -759581 -759589 -759599 -759617 -759623 -759631 -759637 -759641 -759653 -759659 -759673 -759691 -759697 -759701 -759709 -759719 -759727 -759739 -759757 -759763 -759797 -759799 -759821 -759833 -759881 -759893 -759911 -759923 -759929 -759947 -759953 -759959 -759961 -759973 -760007 -760043 -760063 -760079 -760093 -760103 -760117 -760129 -760141 -760147 -760153 -760163 -760169 -760183 -760187 -760211 -760229 -760231 -760237 -760241 -760261 -760267 -760273 -760289 -760297 -760301 -760321 -760343 -760367 -760373 -760411 -760423 -760433 -760447 -760453 -760457 -760477 -760489 -760499 -760511 -760519 -760531 -760537 -760549 -760553 -760561 -760567 -760579 -760607 -760619 -760621 -760637 -760649 -760657 -760693 -760723 -760729 -760759 -760769 -760783 -760807 -760813 -760841 -760843 -760847 -760871 -760891 -760897 -760901 -760913 -760927 -760933 -760939 -760951 -760961 -760993 -760997 -761003 -761009 -761023 -761051 -761069 -761087 -761113 -761119 -761129 -761153 -761161 -761177 -761179 -761183 -761203 -761207 -761213 -761227 -761249 -761251 -761261 -761263 -761291 -761297 -761347 -761351 -761357 -761363 -761377 -761381 -761389 -761393 -761399 -761407 -761417 -761429 -761437 -761441 -761443 -761459 -761471 -761477 -761483 -761489 -761521 -761531 -761533 -761543 -761561 -761567 -761591 -761597 -761603 -761611 -761623 -761633 -761669 -761671 -761681 -761689 -761711 -761713 -761731 -761773 -761777 -761779 -761807 -761809 -761833 -761861 -761863 -761869 -761879 -761897 -761927 -761939 -761963 -761977 -761983 -761993 -762001 -762007 -762017 -762031 -762037 -762049 -762053 -762061 -762101 -762121 -762187 -762211 -762227 -762233 -762239 -762241 -762253 -762257 -762277 -762319 -762329 -762367 -762371 -762373 -762379 -762389 -762397 -762401 -762407 -762409 -762479 -762491 -762499 -762529 -762539 -762547 -762557 -762563 -762571 -762577 -762583 -762599 -762647 -762653 -762659 -762667 -762721 -762737 -762743 -762761 -762779 -762791 -762809 -762821 -762823 -762847 -762871 -762877 -762893 -762899 -762901 -762913 -762917 -762919 -762959 -762967 -762973 -762989 -763001 -763013 -763027 -763031 -763039 -763043 -763067 -763073 -763093 -763111 -763123 -763141 -763157 -763159 -763183 -763201 -763223 -763237 -763261 -763267 -763271 -763303 -763307 -763339 -763349 -763369 -763381 -763391 -763403 -763409 -763417 -763423 -763429 -763447 -763457 -763471 -763481 -763493 -763513 -763523 -763549 -763559 -763573 -763579 -763583 -763597 -763601 -763613 -763619 -763621 -763627 -763649 -763663 -763673 -763699 -763739 -763751 -763753 -763757 -763771 -763787 -763801 -763811 -763823 -763843 -763859 -763879 -763883 -763897 -763901 -763907 -763913 -763921 -763927 -763937 -763943 -763957 -763967 -763999 -764003 -764011 -764017 -764021 -764041 -764051 -764053 -764059 -764081 -764089 -764111 -764131 -764143 -764149 -764171 -764189 -764209 -764233 -764249 -764251 -764261 -764273 -764293 -764317 -764321 -764327 -764339 -764341 -764369 -764381 -764399 -764431 -764447 -764459 -764471 -764501 -764521 -764539 -764551 -764563 -764587 -764591 -764593 -764611 -764623 -764627 -764629 -764657 -764683 -764689 -764717 -764719 -764723 -764783 -764789 -764809 -764837 -764839 -764849 -764857 -764887 -764891 -764893 -764899 -764903 -764947 -764969 -764971 -764977 -764989 -764993 -764999 -765007 -765031 -765041 -765043 -765047 -765059 -765091 -765097 -765103 -765109 -765131 -765137 -765139 -765143 -765151 -765169 -765181 -765199 -765203 -765209 -765211 -765227 -765229 -765241 -765251 -765257 -765283 -765287 -765293 -765307 -765313 -765319 -765329 -765353 -765379 -765383 -765389 -765409 -765437 -765439 -765461 -765467 -765487 -765497 -765503 -765521 -765533 -765539 -765577 -765581 -765587 -765613 -765619 -765623 -765649 -765659 -765673 -765707 -765727 -765749 -765763 -765767 -765773 -765781 -765823 -765827 -765847 -765851 -765857 -765859 -765881 -765889 -765893 -765899 -765907 -765913 -765931 -765949 -765953 -765971 -765983 -765991 -766021 -766039 -766049 -766067 -766079 -766091 -766097 -766109 -766111 -766127 -766163 -766169 -766177 -766187 -766211 -766223 -766229 -766231 -766237 -766247 -766261 -766273 -766277 -766301 -766313 -766321 -766333 -766357 -766361 -766369 -766373 -766387 -766393 -766399 -766421 -766439 -766453 -766457 -766471 -766477 -766487 -766501 -766511 -766531 -766541 -766543 -766553 -766559 -766583 -766609 -766637 -766639 -766651 -766679 -766687 -766721 -766739 -766757 -766763 -766769 -766793 -766807 -766811 -766813 -766817 -766861 -766867 -766873 -766877 -766891 -766901 -766907 -766937 -766939 -766943 -766957 -766967 -766999 -767017 -767029 -767051 -767071 -767089 -767093 -767101 -767111 -767131 -767147 -767153 -767161 -767167 -767203 -767243 -767279 -767287 -767293 -767309 -767317 -767321 -767323 -767339 -767357 -767359 -767381 -767399 -767423 -767443 -767471 -767489 -767509 -767513 -767521 -767527 -767537 -767539 -767549 -767551 -767587 -767597 -767603 -767617 -767623 -767633 -767647 -767677 -767681 -767707 -767729 -767747 -767749 -767759 -767761 -767773 -767783 -767813 -767827 -767831 -767843 -767857 -767863 -767867 -767869 -767881 -767909 -767951 -767957 -768013 -768029 -768041 -768049 -768059 -768073 -768101 -768107 -768127 -768133 -768139 -768161 -768167 -768169 -768191 -768193 -768197 -768199 -768203 -768221 -768241 -768259 -768263 -768301 -768319 -768323 -768329 -768343 -768347 -768353 -768359 -768371 -768373 -768377 -768389 -768401 -768409 -768419 -768431 -768437 -768457 -768461 -768479 -768491 -768503 -768541 -768563 -768571 -768589 -768613 -768623 -768629 -768631 -768641 -768643 -768653 -768671 -768727 -768751 -768767 -768773 -768787 -768793 -768799 -768811 -768841 -768851 -768853 -768857 -768869 -768881 -768923 -768931 -768941 -768953 -768979 -768983 -769003 -769007 -769019 -769033 -769039 -769057 -769073 -769081 -769091 -769117 -769123 -769147 -769151 -769159 -769169 -769207 -769231 -769243 -769247 -769259 -769261 -769273 -769289 -769297 -769309 -769319 -769339 -769357 -769387 -769411 -769421 -769423 -769429 -769453 -769459 -769463 -769469 -769487 -769541 -769543 -769547 -769553 -769577 -769579 -769589 -769591 -769597 -769619 -769627 -769661 -769663 -769673 -769687 -769723 -769729 -769733 -769739 -769751 -769781 -769789 -769799 -769807 -769837 -769871 -769903 -769919 -769927 -769943 -769961 -769963 -769973 -769987 -769997 -769999 -770027 -770039 -770041 -770047 -770053 -770057 -770059 -770069 -770101 -770111 -770113 -770123 -770129 -770167 -770177 -770179 -770183 -770191 -770207 -770227 -770233 -770239 -770261 -770281 -770291 -770309 -770311 -770353 -770359 -770387 -770401 -770417 -770437 -770447 -770449 -770459 -770503 -770519 -770527 -770533 -770537 -770551 -770557 -770573 -770579 -770587 -770591 -770597 -770611 -770639 -770641 -770647 -770657 -770663 -770669 -770741 -770761 -770767 -770771 -770789 -770801 -770813 -770837 -770839 -770843 -770863 -770867 -770873 -770881 -770897 -770909 -770927 -770929 -770951 -770971 -770981 -770993 -771011 -771013 -771019 -771031 -771037 -771047 -771049 -771073 -771079 -771091 -771109 -771143 -771163 -771179 -771181 -771209 -771217 -771227 -771233 -771269 -771283 -771289 -771293 -771299 -771301 -771349 -771359 -771389 -771401 -771403 -771427 -771431 -771437 -771439 -771461 -771473 -771481 -771499 -771503 -771509 -771517 -771527 -771553 -771569 -771583 -771587 -771607 -771619 -771623 -771629 -771637 -771643 -771653 -771679 -771691 -771697 -771703 -771739 -771763 -771769 -771781 -771809 -771853 -771863 -771877 -771887 -771889 -771899 -771917 -771937 -771941 -771961 -771971 -771973 -771997 -772001 -772003 -772019 -772061 -772073 -772081 -772091 -772097 -772127 -772139 -772147 -772159 -772169 -772181 -772207 -772229 -772231 -772273 -772279 -772297 -772313 -772333 -772339 -772349 -772367 -772379 -772381 -772391 -772393 -772403 -772439 -772441 -772451 -772459 -772477 -772493 -772517 -772537 -772567 -772571 -772573 -772591 -772619 -772631 -772649 -772657 -772661 -772663 -772669 -772691 -772697 -772703 -772721 -772757 -772771 -772789 -772843 -772847 -772853 -772859 -772867 -772903 -772907 -772909 -772913 -772921 -772949 -772963 -772987 -772991 -773021 -773023 -773027 -773029 -773039 -773057 -773063 -773081 -773083 -773093 -773117 -773147 -773153 -773159 -773207 -773209 -773231 -773239 -773249 -773251 -773273 -773287 -773299 -773317 -773341 -773363 -773371 -773387 -773393 -773407 -773417 -773447 -773453 -773473 -773491 -773497 -773501 -773533 -773537 -773561 -773567 -773569 -773579 -773599 -773603 -773609 -773611 -773657 -773659 -773681 -773683 -773693 -773713 -773719 -773723 -773767 -773777 -773779 -773803 -773821 -773831 -773837 -773849 -773863 -773867 -773869 -773879 -773897 -773909 -773933 -773939 -773951 -773953 -773987 -773989 -773999 -774001 -774017 -774023 -774047 -774071 -774073 -774083 -774107 -774119 -774127 -774131 -774133 -774143 -774149 -774161 -774173 -774181 -774199 -774217 -774223 -774229 -774233 -774239 -774283 -774289 -774313 -774317 -774337 -774343 -774377 -774427 -774439 -774463 -774467 -774491 -774511 -774523 -774541 -774551 -774577 -774583 -774589 -774593 -774601 -774629 -774643 -774661 -774667 -774671 -774679 -774691 -774703 -774733 -774757 -774773 -774779 -774791 -774797 -774799 -774803 -774811 -774821 -774833 -774853 -774857 -774863 -774901 -774919 -774929 -774931 -774959 -774997 -775007 -775037 -775043 -775057 -775063 -775079 -775087 -775091 -775097 -775121 -775147 -775153 -775157 -775163 -775189 -775193 -775237 -775241 -775259 -775267 -775273 -775309 -775343 -775349 -775361 -775363 -775367 -775393 -775417 -775441 -775451 -775477 -775507 -775513 -775517 -775531 -775553 -775573 -775601 -775603 -775613 -775627 -775633 -775639 -775661 -775669 -775681 -775711 -775729 -775739 -775741 -775757 -775777 -775787 -775807 -775811 -775823 -775861 -775871 -775889 -775919 -775933 -775937 -775939 -775949 -775963 -775987 -776003 -776029 -776047 -776057 -776059 -776077 -776099 -776117 -776119 -776137 -776143 -776159 -776173 -776177 -776179 -776183 -776201 -776219 -776221 -776233 -776249 -776257 -776267 -776287 -776317 -776327 -776357 -776389 -776401 -776429 -776449 -776453 -776467 -776471 -776483 -776497 -776507 -776513 -776521 -776551 -776557 -776561 -776563 -776569 -776599 -776627 -776651 -776683 -776693 -776719 -776729 -776749 -776753 -776759 -776801 -776813 -776819 -776837 -776851 -776861 -776869 -776879 -776887 -776899 -776921 -776947 -776969 -776977 -776983 -776987 -777001 -777011 -777013 -777031 -777041 -777071 -777097 -777103 -777109 -777137 -777143 -777151 -777167 -777169 -777173 -777181 -777187 -777191 -777199 -777209 -777221 -777241 -777247 -777251 -777269 -777277 -777313 -777317 -777349 -777353 -777373 -777383 -777389 -777391 -777419 -777421 -777431 -777433 -777437 -777451 -777463 -777473 -777479 -777541 -777551 -777571 -777583 -777589 -777617 -777619 -777641 -777643 -777661 -777671 -777677 -777683 -777731 -777737 -777743 -777761 -777769 -777781 -777787 -777817 -777839 -777857 -777859 -777863 -777871 -777877 -777901 -777911 -777919 -777977 -777979 -777989 -778013 -778027 -778049 -778051 -778061 -778079 -778081 -778091 -778097 -778109 -778111 -778121 -778123 -778153 -778163 -778187 -778201 -778213 -778223 -778237 -778241 -778247 -778301 -778307 -778313 -778319 -778333 -778357 -778361 -778363 -778391 -778397 -778403 -778409 -778417 -778439 -778469 -778507 -778511 -778513 -778523 -778529 -778537 -778541 -778553 -778559 -778567 -778579 -778597 -778633 -778643 -778663 -778667 -778681 -778693 -778697 -778699 -778709 -778717 -778727 -778733 -778759 -778763 -778769 -778777 -778793 -778819 -778831 -778847 -778871 -778873 -778879 -778903 -778907 -778913 -778927 -778933 -778951 -778963 -778979 -778993 -779003 -779011 -779021 -779039 -779063 -779069 -779081 -779101 -779111 -779131 -779137 -779159 -779173 -779189 -779221 -779231 -779239 -779249 -779267 -779327 -779329 -779341 -779347 -779351 -779353 -779357 -779377 -779413 -779477 -779489 -779507 -779521 -779531 -779543 -779561 -779563 -779573 -779579 -779591 -779593 -779599 -779609 -779617 -779621 -779657 -779659 -779663 -779693 -779699 -779707 -779731 -779747 -779749 -779761 -779767 -779771 -779791 -779797 -779827 -779837 -779869 -779873 -779879 -779887 -779899 -779927 -779939 -779971 -779981 -779983 -779993 -780029 -780037 -780041 -780047 -780049 -780061 -780119 -780127 -780163 -780173 -780179 -780191 -780193 -780211 -780223 -780233 -780253 -780257 -780287 -780323 -780343 -780347 -780371 -780379 -780383 -780389 -780397 -780401 -780421 -780433 -780457 -780469 -780499 -780523 -780553 -780583 -780587 -780601 -780613 -780631 -780649 -780667 -780671 -780679 -780683 -780697 -780707 -780719 -780721 -780733 -780799 -780803 -780809 -780817 -780823 -780833 -780841 -780851 -780853 -780869 -780877 -780887 -780889 -780917 -780931 -780953 -780961 -780971 -780973 -780991 -781003 -781007 -781021 -781043 -781051 -781063 -781069 -781087 -781111 -781117 -781127 -781129 -781139 -781163 -781171 -781199 -781211 -781217 -781229 -781243 -781247 -781271 -781283 -781301 -781307 -781309 -781321 -781327 -781351 -781357 -781367 -781369 -781387 -781397 -781399 -781409 -781423 -781427 -781433 -781453 -781481 -781483 -781493 -781511 -781513 -781519 -781523 -781531 -781559 -781567 -781589 -781601 -781607 -781619 -781631 -781633 -781661 -781673 -781681 -781721 -781733 -781741 -781771 -781799 -781801 -781817 -781819 -781853 -781861 -781867 -781883 -781889 -781897 -781919 -781951 -781961 -781967 -781969 -781973 -781987 -781997 -781999 -782003 -782009 -782011 -782053 -782057 -782071 -782083 -782087 -782107 -782113 -782123 -782129 -782137 -782141 -782147 -782149 -782183 -782189 -782191 -782209 -782219 -782231 -782251 -782263 -782267 -782297 -782311 -782329 -782339 -782371 -782381 -782387 -782389 -782393 -782429 -782443 -782461 -782473 -782489 -782497 -782501 -782519 -782539 -782581 -782611 -782641 -782659 -782669 -782671 -782687 -782689 -782707 -782711 -782723 -782777 -782783 -782791 -782839 -782849 -782861 -782891 -782911 -782921 -782941 -782963 -782981 -782983 -782993 -783007 -783011 -783019 -783023 -783043 -783077 -783089 -783119 -783121 -783131 -783137 -783143 -783149 -783151 -783191 -783193 -783197 -783227 -783247 -783257 -783259 -783269 -783283 -783317 -783323 -783329 -783337 -783359 -783361 -783373 -783379 -783407 -783413 -783421 -783473 -783487 -783527 -783529 -783533 -783553 -783557 -783569 -783571 -783599 -783613 -783619 -783641 -783647 -783661 -783677 -783689 -783691 -783701 -783703 -783707 -783719 -783721 -783733 -783737 -783743 -783749 -783763 -783767 -783779 -783781 -783787 -783791 -783793 -783799 -783803 -783829 -783869 -783877 -783931 -783953 -784009 -784039 -784061 -784081 -784087 -784097 -784103 -784109 -784117 -784129 -784153 -784171 -784181 -784183 -784211 -784213 -784219 -784229 -784243 -784249 -784283 -784307 -784309 -784313 -784321 -784327 -784349 -784351 -784367 -784373 -784379 -784387 -784409 -784411 -784423 -784447 -784451 -784457 -784463 -784471 -784481 -784489 -784501 -784513 -784541 -784543 -784547 -784561 -784573 -784577 -784583 -784603 -784627 -784649 -784661 -784687 -784697 -784717 -784723 -784727 -784753 -784789 -784799 -784831 -784837 -784841 -784859 -784867 -784897 -784913 -784919 -784939 -784957 -784961 -784981 -785003 -785017 -785033 -785053 -785093 -785101 -785107 -785119 -785123 -785129 -785143 -785153 -785159 -785167 -785203 -785207 -785219 -785221 -785227 -785249 -785269 -785287 -785293 -785299 -785303 -785311 -785321 -785329 -785333 -785341 -785347 -785353 -785357 -785363 -785377 -785413 -785423 -785431 -785459 -785461 -785483 -785501 -785503 -785527 -785537 -785549 -785569 -785573 -785579 -785591 -785597 -785623 -785627 -785641 -785651 -785671 -785693 -785717 -785731 -785737 -785753 -785773 -785777 -785779 -785801 -785803 -785809 -785839 -785857 -785861 -785879 -785903 -785921 -785923 -785947 -785951 -785963 -786001 -786013 -786017 -786031 -786047 -786053 -786059 -786061 -786077 -786109 -786127 -786151 -786167 -786173 -786179 -786197 -786211 -786223 -786241 -786251 -786271 -786307 -786311 -786319 -786329 -786337 -786349 -786371 -786407 -786419 -786431 -786433 -786449 -786469 -786491 -786547 -786551 -786553 -786587 -786589 -786613 -786629 -786659 -786661 -786673 -786691 -786697 -786701 -786703 -786707 -786719 -786739 -786763 -786803 -786823 -786829 -786833 -786859 -786881 -786887 -786889 -786901 -786931 -786937 -786941 -786949 -786959 -786971 -786979 -786983 -787021 -787043 -787051 -787057 -787067 -787069 -787079 -787091 -787099 -787123 -787139 -787153 -787181 -787187 -787207 -787217 -787243 -787261 -787277 -787289 -787309 -787331 -787333 -787337 -787357 -787361 -787427 -787429 -787433 -787439 -787447 -787469 -787477 -787483 -787489 -787513 -787517 -787519 -787529 -787537 -787541 -787547 -787573 -787601 -787609 -787621 -787639 -787649 -787667 -787697 -787711 -787747 -787751 -787757 -787769 -787771 -787777 -787783 -787793 -787807 -787811 -787817 -787823 -787837 -787879 -787883 -787903 -787907 -787939 -787973 -787981 -787993 -787999 -788009 -788023 -788027 -788033 -788041 -788071 -788077 -788087 -788089 -788093 -788107 -788129 -788153 -788159 -788167 -788173 -788189 -788209 -788213 -788231 -788261 -788267 -788287 -788309 -788317 -788321 -788351 -788353 -788357 -788363 -788369 -788377 -788383 -788387 -788393 -788399 -788413 -788419 -788429 -788449 -788467 -788479 -788497 -788521 -788527 -788531 -788537 -788549 -788561 -788563 -788569 -788603 -788621 -788651 -788659 -788677 -788687 -788701 -788719 -788761 -788779 -788789 -788813 -788819 -788849 -788863 -788867 -788869 -788873 -788891 -788897 -788903 -788927 -788933 -788941 -788947 -788959 -788971 -788993 -788999 -789001 -789017 -789029 -789031 -789067 -789077 -789091 -789097 -789101 -789109 -789121 -789133 -789137 -789149 -789169 -789181 -789221 -789227 -789251 -789311 -789323 -789331 -789343 -789367 -789377 -789389 -789391 -789407 -789419 -789443 -789473 -789491 -789493 -789511 -789527 -789533 -789557 -789571 -789577 -789587 -789589 -789611 -789623 -789631 -789653 -789671 -789673 -789683 -789689 -789709 -789713 -789721 -789731 -789739 -789749 -789793 -789823 -789829 -789847 -789851 -789857 -789883 -789941 -789959 -789961 -789967 -789977 -789979 -790003 -790021 -790033 -790043 -790051 -790057 -790063 -790087 -790093 -790099 -790121 -790169 -790171 -790189 -790199 -790201 -790219 -790241 -790261 -790271 -790277 -790289 -790291 -790327 -790331 -790333 -790351 -790369 -790379 -790397 -790403 -790417 -790421 -790429 -790451 -790459 -790481 -790501 -790513 -790519 -790523 -790529 -790547 -790567 -790583 -790589 -790607 -790613 -790633 -790637 -790649 -790651 -790693 -790697 -790703 -790709 -790733 -790739 -790747 -790753 -790781 -790793 -790817 -790819 -790831 -790843 -790861 -790871 -790879 -790883 -790897 -790927 -790957 -790961 -790967 -790969 -790991 -790997 -791003 -791009 -791017 -791029 -791047 -791053 -791081 -791093 -791099 -791111 -791117 -791137 -791159 -791191 -791201 -791209 -791227 -791233 -791251 -791257 -791261 -791291 -791309 -791311 -791317 -791321 -791347 -791363 -791377 -791387 -791411 -791419 -791431 -791443 -791447 -791473 -791489 -791519 -791543 -791561 -791563 -791569 -791573 -791599 -791627 -791629 -791657 -791663 -791677 -791699 -791773 -791783 -791789 -791797 -791801 -791803 -791827 -791849 -791851 -791887 -791891 -791897 -791899 -791909 -791927 -791929 -791933 -791951 -791969 -791971 -791993 -792023 -792031 -792037 -792041 -792049 -792061 -792067 -792073 -792101 -792107 -792109 -792119 -792131 -792151 -792163 -792179 -792223 -792227 -792229 -792241 -792247 -792257 -792263 -792277 -792283 -792293 -792299 -792301 -792307 -792317 -792359 -792371 -792377 -792383 -792397 -792413 -792443 -792461 -792479 -792481 -792487 -792521 -792529 -792551 -792553 -792559 -792563 -792581 -792593 -792601 -792613 -792629 -792637 -792641 -792643 -792647 -792667 -792679 -792689 -792691 -792697 -792703 -792709 -792713 -792731 -792751 -792769 -792793 -792797 -792821 -792871 -792881 -792893 -792907 -792919 -792929 -792941 -792959 -792973 -792983 -792989 -792991 -793043 -793069 -793099 -793103 -793123 -793129 -793139 -793159 -793181 -793187 -793189 -793207 -793229 -793253 -793279 -793297 -793301 -793327 -793333 -793337 -793343 -793379 -793399 -793439 -793447 -793453 -793487 -793489 -793493 -793511 -793517 -793519 -793537 -793547 -793553 -793561 -793591 -793601 -793607 -793621 -793627 -793633 -793669 -793673 -793691 -793699 -793711 -793717 -793721 -793733 -793739 -793757 -793769 -793777 -793787 -793789 -793813 -793841 -793843 -793853 -793867 -793889 -793901 -793927 -793931 -793939 -793957 -793967 -793979 -793981 -793999 -794009 -794011 -794023 -794033 -794039 -794041 -794063 -794071 -794077 -794089 -794111 -794113 -794119 -794137 -794141 -794149 -794153 -794161 -794173 -794179 -794191 -794201 -794203 -794207 -794221 -794231 -794239 -794249 -794327 -794341 -794363 -794383 -794389 -794399 -794407 -794413 -794449 -794471 -794473 -794477 -794483 -794491 -794509 -794531 -794537 -794543 -794551 -794557 -794569 -794579 -794587 -794593 -794641 -794653 -794657 -794659 -794669 -794693 -794711 -794741 -794743 -794749 -794779 -794831 -794879 -794881 -794887 -794921 -794923 -794953 -794957 -794993 -794999 -795001 -795007 -795023 -795071 -795077 -795079 -795083 -795097 -795101 -795103 -795121 -795127 -795139 -795149 -795161 -795187 -795203 -795211 -795217 -795233 -795239 -795251 -795253 -795299 -795307 -795323 -795329 -795337 -795343 -795349 -795427 -795449 -795461 -795467 -795479 -795493 -795503 -795517 -795527 -795533 -795539 -795551 -795581 -795589 -795601 -795643 -795647 -795649 -795653 -795659 -795661 -795667 -795679 -795703 -795709 -795713 -795727 -795737 -795761 -795763 -795791 -795793 -795797 -795799 -795803 -795827 -795829 -795871 -795877 -795913 -795917 -795931 -795937 -795941 -795943 -795947 -795979 -795983 -795997 -796001 -796009 -796063 -796067 -796091 -796121 -796139 -796141 -796151 -796171 -796177 -796181 -796189 -796193 -796217 -796247 -796259 -796267 -796291 -796303 -796307 -796337 -796339 -796361 -796363 -796373 -796379 -796387 -796391 -796409 -796447 -796451 -796459 -796487 -796493 -796517 -796531 -796541 -796553 -796561 -796567 -796571 -796583 -796591 -796619 -796633 -796657 -796673 -796687 -796693 -796699 -796709 -796711 -796751 -796759 -796769 -796777 -796781 -796799 -796801 -796813 -796819 -796847 -796849 -796853 -796867 -796871 -796877 -796889 -796921 -796931 -796933 -796937 -796951 -796967 -796969 -796981 -797003 -797009 -797021 -797029 -797033 -797039 -797051 -797053 -797057 -797063 -797077 -797119 -797131 -797143 -797161 -797171 -797201 -797207 -797273 -797281 -797287 -797309 -797311 -797333 -797353 -797359 -797383 -797389 -797399 -797417 -797429 -797473 -797497 -797507 -797509 -797539 -797549 -797551 -797557 -797561 -797567 -797569 -797579 -797581 -797591 -797593 -797611 -797627 -797633 -797647 -797681 -797689 -797701 -797711 -797729 -797743 -797747 -797767 -797773 -797813 -797833 -797851 -797869 -797887 -797897 -797911 -797917 -797933 -797947 -797957 -797977 -797987 -798023 -798043 -798059 -798067 -798071 -798079 -798089 -798097 -798101 -798121 -798131 -798139 -798143 -798151 -798173 -798179 -798191 -798197 -798199 -798221 -798223 -798227 -798251 -798257 -798263 -798271 -798293 -798319 -798331 -798373 -798383 -798397 -798403 -798409 -798443 -798451 -798461 -798481 -798487 -798503 -798517 -798521 -798527 -798533 -798569 -798599 -798613 -798641 -798647 -798649 -798667 -798691 -798697 -798701 -798713 -798727 -798737 -798751 -798757 -798773 -798781 -798799 -798823 -798871 -798887 -798911 -798923 -798929 -798937 -798943 -798961 -799003 -799021 -799031 -799061 -799063 -799091 -799093 -799103 -799147 -799151 -799171 -799217 -799219 -799223 -799259 -799291 -799301 -799303 -799307 -799313 -799333 -799343 -799361 -799363 -799369 -799417 -799427 -799441 -799453 -799471 -799481 -799483 -799489 -799507 -799523 -799529 -799543 -799553 -799573 -799609 -799613 -799619 -799621 -799633 -799637 -799651 -799657 -799661 -799679 -799723 -799727 -799739 -799741 -799753 -799759 -799789 -799801 -799807 -799817 -799837 -799853 -799859 -799873 -799891 -799921 -799949 -799961 -799979 -799991 -799993 -799999 -800011 -800029 -800053 -800057 -800077 -800083 -800089 -800113 -800117 -800119 -800123 -800131 -800143 -800159 -800161 -800171 -800209 -800213 -800221 -800231 -800237 -800243 -800281 -800287 -800291 -800311 -800329 -800333 -800351 -800357 -800399 -800407 -800417 -800419 -800441 -800447 -800473 -800477 -800483 -800497 -800509 -800519 -800521 -800533 -800537 -800539 -800549 -800557 -800573 -800587 -800593 -800599 -800621 -800623 -800647 -800651 -800659 -800663 -800669 -800677 -800687 -800693 -800707 -800711 -800729 -800731 -800741 -800743 -800759 -800773 -800783 -800801 -800861 -800873 -800879 -800897 -800903 -800909 -800923 -800953 -800959 -800971 -800977 -800993 -800999 -801001 -801007 -801011 -801019 -801037 -801061 -801077 -801079 -801103 -801107 -801127 -801137 -801179 -801187 -801197 -801217 -801247 -801277 -801289 -801293 -801301 -801331 -801337 -801341 -801349 -801371 -801379 -801403 -801407 -801419 -801421 -801461 -801469 -801487 -801503 -801517 -801539 -801551 -801557 -801569 -801571 -801607 -801611 -801617 -801631 -801641 -801677 -801683 -801701 -801707 -801709 -801733 -801761 -801791 -801809 -801811 -801817 -801833 -801841 -801859 -801883 -801947 -801949 -801959 -801973 -801989 -802007 -802019 -802027 -802031 -802037 -802073 -802103 -802121 -802127 -802129 -802133 -802141 -802147 -802159 -802163 -802177 -802181 -802183 -802189 -802231 -802253 -802279 -802283 -802297 -802331 -802339 -802357 -802387 -802421 -802441 -802453 -802463 -802471 -802499 -802511 -802523 -802531 -802573 -802583 -802589 -802597 -802603 -802609 -802643 -802649 -802651 -802661 -802667 -802709 -802721 -802729 -802733 -802751 -802759 -802777 -802783 -802787 -802793 -802799 -802811 -802829 -802831 -802873 -802909 -802913 -802933 -802951 -802969 -802979 -802987 -803027 -803041 -803053 -803057 -803059 -803087 -803093 -803119 -803141 -803171 -803189 -803207 -803227 -803237 -803251 -803269 -803273 -803287 -803311 -803323 -803333 -803347 -803359 -803389 -803393 -803399 -803417 -803441 -803443 -803447 -803449 -803461 -803479 -803483 -803497 -803501 -803513 -803519 -803549 -803587 -803591 -803609 -803611 -803623 -803629 -803651 -803659 -803669 -803687 -803717 -803729 -803731 -803741 -803749 -803813 -803819 -803849 -803857 -803867 -803893 -803897 -803911 -803921 -803927 -803939 -803963 -803977 -803987 -803989 -804007 -804017 -804031 -804043 -804059 -804073 -804077 -804091 -804107 -804113 -804119 -804127 -804157 -804161 -804179 -804191 -804197 -804203 -804211 -804239 -804259 -804281 -804283 -804313 -804317 -804329 -804337 -804341 -804367 -804371 -804383 -804409 -804443 -804449 -804473 -804493 -804497 -804511 -804521 -804523 -804541 -804553 -804571 -804577 -804581 -804589 -804607 -804611 -804613 -804619 -804653 -804689 -804697 -804703 -804709 -804743 -804751 -804757 -804761 -804767 -804803 -804823 -804829 -804833 -804847 -804857 -804877 -804889 -804893 -804901 -804913 -804919 -804929 -804941 -804943 -804983 -804989 -804997 -805019 -805027 -805031 -805033 -805037 -805061 -805067 -805073 -805081 -805097 -805099 -805109 -805111 -805121 -805153 -805159 -805177 -805187 -805213 -805219 -805223 -805241 -805249 -805267 -805271 -805279 -805289 -805297 -805309 -805313 -805327 -805331 -805333 -805339 -805369 -805381 -805397 -805403 -805421 -805451 -805463 -805471 -805487 -805499 -805501 -805507 -805517 -805523 -805531 -805537 -805559 -805573 -805583 -805589 -805633 -805639 -805687 -805703 -805711 -805723 -805729 -805741 -805757 -805789 -805799 -805807 -805811 -805843 -805853 -805859 -805867 -805873 -805877 -805891 -805901 -805913 -805933 -805967 -805991 -806009 -806011 -806017 -806023 -806027 -806033 -806041 -806051 -806059 -806087 -806107 -806111 -806129 -806137 -806153 -806159 -806177 -806203 -806213 -806233 -806257 -806261 -806263 -806269 -806291 -806297 -806317 -806329 -806363 -806369 -806371 -806381 -806383 -806389 -806447 -806453 -806467 -806483 -806503 -806513 -806521 -806543 -806549 -806579 -806581 -806609 -806639 -806657 -806671 -806719 -806737 -806761 -806783 -806789 -806791 -806801 -806807 -806821 -806857 -806893 -806903 -806917 -806929 -806941 -806947 -806951 -806977 -806999 -807011 -807017 -807071 -807077 -807083 -807089 -807097 -807113 -807119 -807127 -807151 -807181 -807187 -807193 -807197 -807203 -807217 -807221 -807241 -807251 -807259 -807281 -807299 -807337 -807371 -807379 -807383 -807403 -807407 -807409 -807419 -807427 -807463 -807473 -807479 -807487 -807491 -807493 -807509 -807511 -807523 -807539 -807559 -807571 -807607 -807613 -807629 -807637 -807647 -807689 -807707 -807731 -807733 -807749 -807757 -807787 -807797 -807809 -807817 -807869 -807871 -807901 -807907 -807923 -807931 -807941 -807943 -807949 -807973 -807997 -808019 -808021 -808039 -808081 -808097 -808111 -808147 -808153 -808169 -808177 -808187 -808211 -808217 -808229 -808237 -808261 -808267 -808307 -808309 -808343 -808349 -808351 -808361 -808363 -808369 -808373 -808391 -808399 -808417 -808421 -808439 -808441 -808459 -808481 -808517 -808523 -808553 -808559 -808579 -808589 -808597 -808601 -808603 -808627 -808637 -808651 -808679 -808681 -808693 -808699 -808721 -808733 -808739 -808747 -808751 -808771 -808777 -808789 -808793 -808837 -808853 -808867 -808919 -808937 -808957 -808961 -808981 -808991 -808993 -809023 -809041 -809051 -809063 -809087 -809093 -809101 -809141 -809143 -809147 -809173 -809177 -809189 -809201 -809203 -809213 -809231 -809239 -809243 -809261 -809269 -809273 -809297 -809309 -809323 -809339 -809357 -809359 -809377 -809383 -809399 -809401 -809407 -809423 -809437 -809443 -809447 -809453 -809461 -809491 -809507 -809521 -809527 -809563 -809569 -809579 -809581 -809587 -809603 -809629 -809701 -809707 -809719 -809729 -809737 -809741 -809747 -809749 -809759 -809771 -809779 -809797 -809801 -809803 -809821 -809827 -809833 -809839 -809843 -809869 -809891 -809903 -809909 -809917 -809929 -809981 -809983 -809993 -810013 -810023 -810049 -810053 -810059 -810071 -810079 -810091 -810109 -810137 -810149 -810151 -810191 -810193 -810209 -810223 -810239 -810253 -810259 -810269 -810281 -810307 -810319 -810343 -810349 -810353 -810361 -810367 -810377 -810379 -810389 -810391 -810401 -810409 -810419 -810427 -810437 -810443 -810457 -810473 -810487 -810493 -810503 -810517 -810533 -810539 -810541 -810547 -810553 -810571 -810581 -810583 -810587 -810643 -810653 -810659 -810671 -810697 -810737 -810757 -810763 -810769 -810791 -810809 -810839 -810853 -810871 -810881 -810893 -810907 -810913 -810923 -810941 -810949 -810961 -810967 -810973 -810989 -811037 -811039 -811067 -811081 -811099 -811123 -811127 -811147 -811157 -811163 -811171 -811183 -811193 -811199 -811207 -811231 -811241 -811253 -811259 -811273 -811277 -811289 -811297 -811337 -811351 -811379 -811387 -811411 -811429 -811441 -811457 -811469 -811493 -811501 -811511 -811519 -811523 -811553 -811561 -811583 -811607 -811619 -811627 -811637 -811649 -811651 -811667 -811691 -811697 -811703 -811709 -811729 -811747 -811753 -811757 -811763 -811771 -811777 -811799 -811819 -811861 -811871 -811879 -811897 -811919 -811931 -811933 -811957 -811961 -811981 -811991 -811997 -812011 -812033 -812047 -812051 -812057 -812081 -812101 -812129 -812137 -812167 -812173 -812179 -812183 -812191 -812213 -812221 -812233 -812249 -812257 -812267 -812281 -812297 -812299 -812309 -812341 -812347 -812351 -812353 -812359 -812363 -812381 -812387 -812393 -812401 -812431 -812443 -812467 -812473 -812477 -812491 -812501 -812503 -812519 -812527 -812587 -812597 -812599 -812627 -812633 -812639 -812641 -812671 -812681 -812689 -812699 -812701 -812711 -812717 -812731 -812759 -812761 -812807 -812849 -812857 -812869 -812921 -812939 -812963 -812969 -813013 -813017 -813023 -813041 -813049 -813061 -813083 -813089 -813091 -813097 -813107 -813121 -813133 -813157 -813167 -813199 -813203 -813209 -813217 -813221 -813227 -813251 -813269 -813277 -813283 -813287 -813299 -813301 -813311 -813343 -813361 -813367 -813377 -813383 -813401 -813419 -813427 -813443 -813493 -813499 -813503 -813511 -813529 -813541 -813559 -813577 -813583 -813601 -813613 -813623 -813647 -813677 -813697 -813707 -813721 -813749 -813767 -813797 -813811 -813817 -813829 -813833 -813847 -813863 -813871 -813893 -813907 -813931 -813961 -813971 -813991 -813997 -814003 -814007 -814013 -814019 -814031 -814043 -814049 -814061 -814063 -814067 -814069 -814081 -814097 -814127 -814129 -814139 -814171 -814183 -814193 -814199 -814211 -814213 -814237 -814241 -814243 -814279 -814309 -814327 -814337 -814367 -814379 -814381 -814393 -814399 -814403 -814423 -814447 -814469 -814477 -814493 -814501 -814531 -814537 -814543 -814559 -814577 -814579 -814601 -814603 -814609 -814631 -814633 -814643 -814687 -814699 -814717 -814741 -814747 -814763 -814771 -814783 -814789 -814799 -814823 -814829 -814841 -814859 -814873 -814883 -814889 -814901 -814903 -814927 -814937 -814939 -814943 -814949 -814991 -815029 -815033 -815047 -815053 -815063 -815123 -815141 -815149 -815159 -815173 -815197 -815209 -815231 -815251 -815257 -815261 -815273 -815279 -815291 -815317 -815333 -815341 -815351 -815389 -815401 -815411 -815413 -815417 -815431 -815453 -815459 -815471 -815491 -815501 -815519 -815527 -815533 -815539 -815543 -815569 -815587 -815599 -815621 -815623 -815627 -815653 -815663 -815669 -815671 -815681 -815687 -815693 -815713 -815729 -815809 -815819 -815821 -815831 -815851 -815869 -815891 -815897 -815923 -815933 -815939 -815953 -815963 -815977 -815989 -816019 -816037 -816043 -816047 -816077 -816091 -816103 -816113 -816121 -816131 -816133 -816157 -816161 -816163 -816169 -816191 -816203 -816209 -816217 -816223 -816227 -816239 -816251 -816271 -816317 -816329 -816341 -816353 -816367 -816377 -816401 -816427 -816443 -816451 -816469 -816499 -816521 -816539 -816547 -816559 -816581 -816587 -816589 -816593 -816649 -816653 -816667 -816689 -816691 -816703 -816709 -816743 -816763 -816769 -816779 -816811 -816817 -816821 -816839 -816841 -816847 -816857 -816859 -816869 -816883 -816887 -816899 -816911 -816917 -816919 -816929 -816941 -816947 -816961 -816971 -817013 -817027 -817039 -817049 -817051 -817073 -817081 -817087 -817093 -817111 -817123 -817127 -817147 -817151 -817153 -817163 -817169 -817183 -817211 -817237 -817273 -817277 -817279 -817291 -817303 -817319 -817321 -817331 -817337 -817357 -817379 -817403 -817409 -817433 -817457 -817463 -817483 -817519 -817529 -817549 -817561 -817567 -817603 -817637 -817651 -817669 -817679 -817697 -817709 -817711 -817721 -817723 -817727 -817757 -817769 -817777 -817783 -817787 -817793 -817823 -817837 -817841 -817867 -817871 -817877 -817889 -817891 -817897 -817907 -817913 -817919 -817933 -817951 -817979 -817987 -818011 -818017 -818021 -818093 -818099 -818101 -818113 -818123 -818143 -818171 -818173 -818189 -818219 -818231 -818239 -818249 -818281 -818287 -818291 -818303 -818309 -818327 -818339 -818341 -818347 -818353 -818359 -818371 -818383 -818393 -818399 -818413 -818429 -818453 -818473 -818509 -818561 -818569 -818579 -818581 -818603 -818621 -818659 -818683 -818687 -818689 -818707 -818717 -818723 -818813 -818819 -818821 -818827 -818837 -818887 -818897 -818947 -818959 -818963 -818969 -818977 -818999 -819001 -819017 -819029 -819031 -819037 -819061 -819073 -819083 -819101 -819131 -819149 -819157 -819167 -819173 -819187 -819229 -819239 -819241 -819251 -819253 -819263 -819271 -819289 -819307 -819311 -819317 -819319 -819367 -819373 -819389 -819391 -819407 -819409 -819419 -819431 -819437 -819443 -819449 -819457 -819463 -819473 -819487 -819491 -819493 -819499 -819503 -819509 -819523 -819563 -819583 -819593 -819607 -819617 -819619 -819629 -819647 -819653 -819659 -819673 -819691 -819701 -819719 -819737 -819739 -819761 -819769 -819773 -819781 -819787 -819799 -819811 -819823 -819827 -819829 -819853 -819899 -819911 -819913 -819937 -819943 -819977 -819989 -819991 -820037 -820051 -820067 -820073 -820093 -820109 -820117 -820129 -820133 -820163 -820177 -820187 -820201 -820213 -820223 -820231 -820241 -820243 -820247 -820271 -820273 -820279 -820319 -820321 -820331 -820333 -820343 -820349 -820361 -820367 -820399 -820409 -820411 -820427 -820429 -820441 -820459 -820481 -820489 -820537 -820541 -820559 -820577 -820597 -820609 -820619 -820627 -820637 -820643 -820649 -820657 -820679 -820681 -820691 -820711 -820723 -820733 -820747 -820753 -820759 -820763 -820789 -820793 -820837 -820873 -820891 -820901 -820907 -820909 -820921 -820927 -820957 -820969 -820991 -820997 -821003 -821027 -821039 -821053 -821057 -821063 -821069 -821081 -821089 -821099 -821101 -821113 -821131 -821143 -821147 -821153 -821167 -821173 -821207 -821209 -821263 -821281 -821291 -821297 -821311 -821329 -821333 -821377 -821383 -821411 -821441 -821449 -821459 -821461 -821467 -821477 -821479 -821489 -821497 -821507 -821519 -821551 -821573 -821603 -821641 -821647 -821651 -821663 -821677 -821741 -821747 -821753 -821759 -821771 -821801 -821803 -821809 -821819 -821827 -821833 -821851 -821857 -821861 -821869 -821879 -821897 -821911 -821939 -821941 -821971 -821993 -821999 -822007 -822011 -822013 -822037 -822049 -822067 -822079 -822113 -822131 -822139 -822161 -822163 -822167 -822169 -822191 -822197 -822221 -822223 -822229 -822233 -822253 -822259 -822277 -822293 -822299 -822313 -822317 -822323 -822329 -822343 -822347 -822361 -822379 -822383 -822389 -822391 -822407 -822431 -822433 -822517 -822539 -822541 -822551 -822553 -822557 -822571 -822581 -822587 -822589 -822599 -822607 -822611 -822631 -822667 -822671 -822673 -822683 -822691 -822697 -822713 -822721 -822727 -822739 -822743 -822761 -822763 -822781 -822791 -822793 -822803 -822821 -822823 -822839 -822853 -822881 -822883 -822889 -822893 -822901 -822907 -822949 -822971 -822973 -822989 -823001 -823003 -823013 -823033 -823051 -823117 -823127 -823129 -823153 -823169 -823177 -823183 -823201 -823219 -823231 -823237 -823241 -823243 -823261 -823271 -823283 -823309 -823337 -823349 -823351 -823357 -823373 -823399 -823421 -823447 -823451 -823457 -823481 -823483 -823489 -823499 -823519 -823541 -823547 -823553 -823573 -823591 -823601 -823619 -823621 -823637 -823643 -823651 -823663 -823679 -823703 -823709 -823717 -823721 -823723 -823727 -823729 -823741 -823747 -823759 -823777 -823787 -823789 -823799 -823819 -823829 -823831 -823841 -823843 -823877 -823903 -823913 -823961 -823967 -823969 -823981 -823993 -823997 -824017 -824029 -824039 -824063 -824069 -824077 -824081 -824099 -824123 -824137 -824147 -824179 -824183 -824189 -824191 -824227 -824231 -824233 -824269 -824281 -824287 -824339 -824393 -824399 -824401 -824413 -824419 -824437 -824443 -824459 -824477 -824489 -824497 -824501 -824513 -824531 -824539 -824563 -824591 -824609 -824641 -824647 -824651 -824669 -824671 -824683 -824699 -824701 -824723 -824741 -824749 -824753 -824773 -824777 -824779 -824801 -824821 -824833 -824843 -824861 -824893 -824899 -824911 -824921 -824933 -824939 -824947 -824951 -824977 -824981 -824983 -825001 -825007 -825017 -825029 -825047 -825049 -825059 -825067 -825073 -825101 -825107 -825109 -825131 -825161 -825191 -825193 -825199 -825203 -825229 -825241 -825247 -825259 -825277 -825281 -825283 -825287 -825301 -825329 -825337 -825343 -825347 -825353 -825361 -825389 -825397 -825403 -825413 -825421 -825439 -825443 -825467 -825479 -825491 -825509 -825527 -825533 -825547 -825551 -825553 -825577 -825593 -825611 -825613 -825637 -825647 -825661 -825679 -825689 -825697 -825701 -825709 -825733 -825739 -825749 -825763 -825779 -825791 -825821 -825827 -825829 -825857 -825883 -825889 -825919 -825947 -825959 -825961 -825971 -825983 -825991 -825997 -826019 -826037 -826039 -826051 -826061 -826069 -826087 -826093 -826097 -826129 -826151 -826153 -826169 -826171 -826193 -826201 -826211 -826271 -826283 -826289 -826303 -826313 -826333 -826339 -826349 -826351 -826363 -826379 -826381 -826391 -826393 -826403 -826411 -826453 -826477 -826493 -826499 -826541 -826549 -826559 -826561 -826571 -826583 -826603 -826607 -826613 -826621 -826663 -826667 -826669 -826673 -826681 -826697 -826699 -826711 -826717 -826723 -826729 -826753 -826759 -826783 -826799 -826807 -826811 -826831 -826849 -826867 -826879 -826883 -826907 -826921 -826927 -826939 -826957 -826963 -826967 -826979 -826997 -827009 -827023 -827039 -827041 -827063 -827087 -827129 -827131 -827143 -827147 -827161 -827213 -827227 -827231 -827251 -827269 -827293 -827303 -827311 -827327 -827347 -827369 -827389 -827417 -827423 -827429 -827443 -827447 -827461 -827473 -827501 -827521 -827537 -827539 -827549 -827581 -827591 -827599 -827633 -827639 -827677 -827681 -827693 -827699 -827719 -827737 -827741 -827767 -827779 -827791 -827803 -827809 -827821 -827833 -827837 -827843 -827851 -827857 -827867 -827873 -827899 -827903 -827923 -827927 -827929 -827941 -827969 -827987 -827989 -828007 -828011 -828013 -828029 -828043 -828059 -828067 -828071 -828101 -828109 -828119 -828127 -828131 -828133 -828169 -828199 -828209 -828221 -828239 -828277 -828349 -828361 -828371 -828379 -828383 -828397 -828407 -828409 -828431 -828449 -828517 -828523 -828547 -828557 -828577 -828587 -828601 -828637 -828643 -828649 -828673 -828677 -828691 -828697 -828701 -828703 -828721 -828731 -828743 -828757 -828787 -828797 -828809 -828811 -828823 -828829 -828833 -828859 -828871 -828881 -828889 -828899 -828901 -828917 -828923 -828941 -828953 -828967 -828977 -829001 -829013 -829057 -829063 -829069 -829093 -829097 -829111 -829121 -829123 -829151 -829159 -829177 -829187 -829193 -829211 -829223 -829229 -829237 -829249 -829267 -829273 -829289 -829319 -829349 -829399 -829453 -829457 -829463 -829469 -829501 -829511 -829519 -829537 -829547 -829561 -829601 -829613 -829627 -829637 -829639 -829643 -829657 -829687 -829693 -829709 -829721 -829723 -829727 -829729 -829733 -829757 -829789 -829811 -829813 -829819 -829831 -829841 -829847 -829849 -829867 -829877 -829883 -829949 -829967 -829979 -829987 -829993 -830003 -830017 -830041 -830051 -830099 -830111 -830117 -830131 -830143 -830153 -830173 -830177 -830191 -830233 -830237 -830257 -830267 -830279 -830293 -830309 -830311 -830327 -830329 -830339 -830341 -830353 -830359 -830363 -830383 -830387 -830411 -830413 -830419 -830441 -830447 -830449 -830477 -830483 -830497 -830503 -830513 -830549 -830551 -830561 -830567 -830579 -830587 -830591 -830597 -830617 -830639 -830657 -830677 -830693 -830719 -830729 -830741 -830743 -830777 -830789 -830801 -830827 -830833 -830839 -830849 -830861 -830873 -830887 -830891 -830899 -830911 -830923 -830939 -830957 -830981 -830989 -831023 -831031 -831037 -831043 -831067 -831071 -831073 -831091 -831109 -831139 -831161 -831163 -831167 -831191 -831217 -831221 -831239 -831253 -831287 -831301 -831323 -831329 -831361 -831367 -831371 -831373 -831407 -831409 -831431 -831433 -831437 -831443 -831461 -831503 -831529 -831539 -831541 -831547 -831553 -831559 -831583 -831587 -831599 -831617 -831619 -831631 -831643 -831647 -831653 -831659 -831661 -831679 -831683 -831697 -831707 -831709 -831713 -831731 -831739 -831751 -831757 -831769 -831781 -831799 -831811 -831821 -831829 -831847 -831851 -831863 -831881 -831889 -831893 -831899 -831911 -831913 -831917 -831967 -831983 -832003 -832063 -832079 -832081 -832103 -832109 -832121 -832123 -832129 -832141 -832151 -832157 -832159 -832189 -832211 -832217 -832253 -832291 -832297 -832309 -832327 -832331 -832339 -832361 -832367 -832369 -832373 -832379 -832399 -832411 -832421 -832427 -832451 -832457 -832477 -832483 -832487 -832493 -832499 -832519 -832583 -832591 -832597 -832607 -832613 -832621 -832627 -832631 -832633 -832639 -832673 -832679 -832681 -832687 -832693 -832703 -832709 -832717 -832721 -832729 -832747 -832757 -832763 -832771 -832787 -832801 -832837 -832841 -832861 -832879 -832883 -832889 -832913 -832919 -832927 -832933 -832943 -832957 -832963 -832969 -832973 -832987 -833009 -833023 -833033 -833047 -833057 -833099 -833101 -833117 -833171 -833177 -833179 -833191 -833197 -833201 -833219 -833251 -833269 -833281 -833293 -833299 -833309 -833347 -833353 -833363 -833377 -833389 -833429 -833449 -833453 -833461 -833467 -833477 -833479 -833491 -833509 -833537 -833557 -833563 -833593 -833597 -833617 -833633 -833659 -833669 -833689 -833711 -833713 -833717 -833719 -833737 -833747 -833759 -833783 -833801 -833821 -833839 -833843 -833857 -833873 -833887 -833893 -833897 -833923 -833927 -833933 -833947 -833977 -833999 -834007 -834013 -834023 -834059 -834107 -834131 -834133 -834137 -834143 -834149 -834151 -834181 -834199 -834221 -834257 -834259 -834269 -834277 -834283 -834287 -834299 -834311 -834341 -834367 -834433 -834439 -834469 -834487 -834497 -834503 -834511 -834523 -834527 -834569 -834571 -834593 -834599 -834607 -834611 -834623 -834629 -834641 -834643 -834653 -834671 -834703 -834709 -834721 -834761 -834773 -834781 -834787 -834797 -834809 -834811 -834829 -834857 -834859 -834893 -834913 -834941 -834947 -834949 -834959 -834961 -834983 -834991 -835001 -835013 -835019 -835033 -835039 -835097 -835099 -835117 -835123 -835139 -835141 -835207 -835213 -835217 -835249 -835253 -835271 -835313 -835319 -835321 -835327 -835369 -835379 -835391 -835399 -835421 -835427 -835441 -835451 -835453 -835459 -835469 -835489 -835511 -835531 -835553 -835559 -835591 -835603 -835607 -835609 -835633 -835643 -835661 -835663 -835673 -835687 -835717 -835721 -835733 -835739 -835759 -835789 -835811 -835817 -835819 -835823 -835831 -835841 -835847 -835859 -835897 -835909 -835927 -835931 -835937 -835951 -835957 -835973 -835979 -835987 -835993 -835997 -836047 -836063 -836071 -836107 -836117 -836131 -836137 -836149 -836153 -836159 -836161 -836183 -836189 -836191 -836203 -836219 -836233 -836239 -836243 -836267 -836291 -836299 -836317 -836327 -836347 -836351 -836369 -836377 -836387 -836413 -836449 -836471 -836477 -836491 -836497 -836501 -836509 -836567 -836569 -836573 -836609 -836611 -836623 -836657 -836663 -836677 -836683 -836699 -836701 -836707 -836713 -836729 -836747 -836749 -836753 -836761 -836789 -836807 -836821 -836833 -836839 -836861 -836863 -836873 -836879 -836881 -836917 -836921 -836939 -836951 -836971 -837017 -837043 -837047 -837059 -837071 -837073 -837077 -837079 -837107 -837113 -837139 -837149 -837157 -837191 -837203 -837257 -837271 -837283 -837293 -837307 -837313 -837359 -837367 -837373 -837377 -837379 -837409 -837413 -837439 -837451 -837461 -837467 -837497 -837503 -837509 -837521 -837533 -837583 -837601 -837611 -837619 -837631 -837659 -837667 -837673 -837677 -837679 -837721 -837731 -837737 -837773 -837779 -837797 -837817 -837833 -837847 -837853 -837887 -837923 -837929 -837931 -837937 -837943 -837979 -838003 -838021 -838037 -838039 -838043 -838063 -838069 -838091 -838093 -838099 -838133 -838139 -838141 -838153 -838157 -838169 -838171 -838193 -838207 -838247 -838249 -838349 -838351 -838363 -838367 -838379 -838391 -838393 -838399 -838403 -838421 -838429 -838441 -838447 -838459 -838463 -838471 -838483 -838517 -838547 -838553 -838561 -838571 -838583 -838589 -838597 -838601 -838609 -838613 -838631 -838633 -838657 -838667 -838687 -838693 -838711 -838751 -838757 -838769 -838771 -838777 -838781 -838807 -838813 -838837 -838853 -838889 -838897 -838909 -838913 -838919 -838927 -838931 -838939 -838949 -838951 -838963 -838969 -838991 -838993 -839009 -839029 -839051 -839071 -839087 -839117 -839131 -839161 -839203 -839207 -839221 -839227 -839261 -839269 -839303 -839323 -839327 -839351 -839353 -839369 -839381 -839413 -839429 -839437 -839441 -839453 -839459 -839471 -839473 -839483 -839491 -839497 -839519 -839539 -839551 -839563 -839599 -839603 -839609 -839611 -839617 -839621 -839633 -839651 -839653 -839669 -839693 -839723 -839731 -839767 -839771 -839791 -839801 -839809 -839831 -839837 -839873 -839879 -839887 -839897 -839899 -839903 -839911 -839921 -839957 -839959 -839963 -839981 -839999 -840023 -840053 -840061 -840067 -840083 -840109 -840137 -840139 -840149 -840163 -840179 -840181 -840187 -840197 -840223 -840239 -840241 -840253 -840269 -840277 -840289 -840299 -840319 -840331 -840341 -840347 -840353 -840439 -840451 -840457 -840467 -840473 -840479 -840491 -840523 -840547 -840557 -840571 -840589 -840601 -840611 -840643 -840661 -840683 -840703 -840709 -840713 -840727 -840733 -840743 -840757 -840761 -840767 -840817 -840821 -840823 -840839 -840841 -840859 -840863 -840907 -840911 -840923 -840929 -840941 -840943 -840967 -840979 -840989 -840991 -841003 -841013 -841019 -841021 -841063 -841069 -841079 -841081 -841091 -841097 -841103 -841147 -841157 -841189 -841193 -841207 -841213 -841219 -841223 -841231 -841237 -841241 -841259 -841273 -841277 -841283 -841289 -841297 -841307 -841327 -841333 -841349 -841369 -841391 -841397 -841411 -841427 -841447 -841457 -841459 -841541 -841549 -841559 -841573 -841597 -841601 -841637 -841651 -841661 -841663 -841691 -841697 -841727 -841741 -841751 -841793 -841801 -841849 -841859 -841873 -841879 -841889 -841913 -841921 -841927 -841931 -841933 -841979 -841987 -842003 -842021 -842041 -842047 -842063 -842071 -842077 -842081 -842087 -842089 -842111 -842113 -842141 -842147 -842159 -842161 -842167 -842173 -842183 -842203 -842209 -842249 -842267 -842279 -842291 -842293 -842311 -842321 -842323 -842339 -842341 -842351 -842353 -842371 -842383 -842393 -842399 -842407 -842417 -842419 -842423 -842447 -842449 -842473 -842477 -842483 -842489 -842497 -842507 -842519 -842521 -842531 -842551 -842581 -842587 -842599 -842617 -842623 -842627 -842657 -842701 -842729 -842747 -842759 -842767 -842771 -842791 -842801 -842813 -842819 -842857 -842869 -842879 -842887 -842923 -842939 -842951 -842957 -842969 -842977 -842981 -842987 -842993 -843043 -843067 -843079 -843091 -843103 -843113 -843127 -843131 -843137 -843173 -843179 -843181 -843209 -843211 -843229 -843253 -843257 -843289 -843299 -843301 -843307 -843331 -843347 -843361 -843371 -843377 -843379 -843383 -843397 -843443 -843449 -843457 -843461 -843473 -843487 -843497 -843503 -843527 -843539 -843553 -843559 -843587 -843589 -843607 -843613 -843629 -843643 -843649 -843677 -843679 -843701 -843737 -843757 -843763 -843779 -843781 -843793 -843797 -843811 -843823 -843833 -843841 -843881 -843883 -843889 -843901 -843907 -843911 -844001 -844013 -844043 -844061 -844069 -844087 -844093 -844111 -844117 -844121 -844127 -844139 -844141 -844153 -844157 -844163 -844183 -844187 -844199 -844201 -844243 -844247 -844253 -844279 -844289 -844297 -844309 -844321 -844351 -844369 -844421 -844427 -844429 -844433 -844439 -844447 -844453 -844457 -844463 -844469 -844483 -844489 -844499 -844507 -844511 -844513 -844517 -844523 -844549 -844553 -844601 -844603 -844609 -844619 -844621 -844631 -844639 -844643 -844651 -844709 -844717 -844733 -844757 -844763 -844769 -844771 -844777 -844841 -844847 -844861 -844867 -844891 -844897 -844903 -844913 -844927 -844957 -844999 -845003 -845017 -845021 -845027 -845041 -845069 -845083 -845099 -845111 -845129 -845137 -845167 -845179 -845183 -845197 -845203 -845209 -845219 -845231 -845237 -845261 -845279 -845287 -845303 -845309 -845333 -845347 -845357 -845363 -845371 -845381 -845387 -845431 -845441 -845447 -845459 -845489 -845491 -845531 -845567 -845599 -845623 -845653 -845657 -845659 -845683 -845717 -845723 -845729 -845749 -845753 -845771 -845777 -845809 -845833 -845849 -845863 -845879 -845881 -845893 -845909 -845921 -845927 -845941 -845951 -845969 -845981 -845983 -845987 -845989 -846037 -846059 -846061 -846067 -846113 -846137 -846149 -846161 -846179 -846187 -846217 -846229 -846233 -846247 -846259 -846271 -846323 -846341 -846343 -846353 -846359 -846361 -846383 -846389 -846397 -846401 -846403 -846407 -846421 -846427 -846437 -846457 -846487 -846493 -846499 -846529 -846563 -846577 -846589 -846647 -846661 -846667 -846673 -846689 -846721 -846733 -846739 -846749 -846751 -846757 -846779 -846823 -846841 -846851 -846869 -846871 -846877 -846913 -846917 -846919 -846931 -846943 -846949 -846953 -846961 -846973 -846977 -846983 -846997 -847009 -847031 -847037 -847043 -847051 -847069 -847073 -847079 -847097 -847103 -847109 -847129 -847139 -847151 -847157 -847163 -847169 -847193 -847201 -847213 -847219 -847237 -847247 -847271 -847277 -847279 -847283 -847309 -847321 -847339 -847361 -847367 -847373 -847393 -847423 -847453 -847477 -847493 -847499 -847507 -847519 -847531 -847537 -847543 -847549 -847577 -847589 -847601 -847607 -847621 -847657 -847663 -847673 -847681 -847687 -847697 -847703 -847727 -847729 -847741 -847787 -847789 -847813 -847817 -847853 -847871 -847883 -847901 -847919 -847933 -847937 -847949 -847967 -847969 -847991 -847993 -847997 -848017 -848051 -848087 -848101 -848119 -848123 -848131 -848143 -848149 -848173 -848201 -848203 -848213 -848227 -848251 -848269 -848273 -848297 -848321 -848359 -848363 -848383 -848387 -848399 -848417 -848423 -848429 -848443 -848461 -848467 -848473 -848489 -848531 -848537 -848557 -848567 -848579 -848591 -848593 -848599 -848611 -848629 -848633 -848647 -848651 -848671 -848681 -848699 -848707 -848713 -848737 -848747 -848761 -848779 -848789 -848791 -848797 -848803 -848807 -848839 -848843 -848849 -848851 -848857 -848879 -848893 -848909 -848921 -848923 -848927 -848933 -848941 -848959 -848983 -848993 -849019 -849047 -849049 -849061 -849083 -849097 -849103 -849119 -849127 -849131 -849143 -849161 -849179 -849197 -849203 -849217 -849221 -849223 -849241 -849253 -849271 -849301 -849311 -849347 -849349 -849353 -849383 -849391 -849419 -849427 -849461 -849467 -849481 -849523 -849533 -849539 -849571 -849581 -849587 -849593 -849599 -849601 -849649 -849691 -849701 -849703 -849721 -849727 -849731 -849733 -849743 -849763 -849767 -849773 -849829 -849833 -849839 -849857 -849869 -849883 -849917 -849923 -849931 -849943 -849967 -849973 -849991 -849997 -850009 -850021 -850027 -850033 -850043 -850049 -850061 -850063 -850081 -850093 -850121 -850133 -850139 -850147 -850177 -850181 -850189 -850207 -850211 -850229 -850243 -850247 -850253 -850261 -850271 -850273 -850301 -850303 -850331 -850337 -850349 -850351 -850373 -850387 -850393 -850397 -850403 -850417 -850427 -850433 -850439 -850453 -850457 -850481 -850529 -850537 -850567 -850571 -850613 -850631 -850637 -850673 -850679 -850691 -850711 -850727 -850753 -850781 -850807 -850823 -850849 -850853 -850879 -850891 -850897 -850933 -850943 -850951 -850973 -850979 -851009 -851017 -851033 -851041 -851051 -851057 -851087 -851093 -851113 -851117 -851131 -851153 -851159 -851171 -851177 -851197 -851203 -851209 -851231 -851239 -851251 -851261 -851267 -851273 -851293 -851297 -851303 -851321 -851327 -851351 -851359 -851363 -851381 -851387 -851393 -851401 -851413 -851419 -851423 -851449 -851471 -851491 -851507 -851519 -851537 -851549 -851569 -851573 -851597 -851603 -851623 -851633 -851639 -851647 -851659 -851671 -851677 -851689 -851723 -851731 -851749 -851761 -851797 -851801 -851803 -851813 -851821 -851831 -851839 -851843 -851863 -851881 -851891 -851899 -851953 -851957 -851971 -852011 -852013 -852031 -852037 -852079 -852101 -852121 -852139 -852143 -852149 -852151 -852167 -852179 -852191 -852197 -852199 -852211 -852233 -852239 -852253 -852259 -852263 -852287 -852289 -852301 -852323 -852347 -852367 -852391 -852409 -852427 -852437 -852457 -852463 -852521 -852557 -852559 -852563 -852569 -852581 -852583 -852589 -852613 -852617 -852623 -852641 -852661 -852671 -852673 -852689 -852749 -852751 -852757 -852763 -852769 -852793 -852799 -852809 -852827 -852829 -852833 -852847 -852851 -852857 -852871 -852881 -852889 -852893 -852913 -852937 -852953 -852959 -852989 -852997 -853007 -853031 -853033 -853049 -853057 -853079 -853091 -853103 -853123 -853133 -853159 -853187 -853189 -853211 -853217 -853241 -853283 -853289 -853291 -853319 -853339 -853357 -853387 -853403 -853427 -853429 -853439 -853477 -853481 -853493 -853529 -853543 -853547 -853571 -853577 -853597 -853637 -853663 -853667 -853669 -853687 -853693 -853703 -853717 -853733 -853739 -853759 -853763 -853793 -853799 -853807 -853813 -853819 -853823 -853837 -853843 -853873 -853889 -853901 -853903 -853913 -853933 -853949 -853969 -853981 -853999 -854017 -854033 -854039 -854041 -854047 -854053 -854083 -854089 -854093 -854099 -854111 -854123 -854129 -854141 -854149 -854159 -854171 -854213 -854257 -854263 -854299 -854303 -854323 -854327 -854333 -854351 -854353 -854363 -854383 -854387 -854407 -854417 -854419 -854423 -854431 -854443 -854459 -854461 -854467 -854479 -854527 -854533 -854569 -854587 -854593 -854599 -854617 -854621 -854629 -854647 -854683 -854713 -854729 -854747 -854771 -854801 -854807 -854849 -854869 -854881 -854897 -854899 -854921 -854923 -854927 -854929 -854951 -854957 -854963 -854993 -854999 -855031 -855059 -855061 -855067 -855079 -855089 -855119 -855131 -855143 -855187 -855191 -855199 -855203 -855221 -855229 -855241 -855269 -855271 -855277 -855293 -855307 -855311 -855317 -855331 -855359 -855373 -855377 -855391 -855397 -855401 -855419 -855427 -855431 -855461 -855467 -855499 -855511 -855521 -855527 -855581 -855601 -855607 -855619 -855641 -855667 -855671 -855683 -855697 -855709 -855713 -855719 -855721 -855727 -855731 -855733 -855737 -855739 -855781 -855787 -855821 -855851 -855857 -855863 -855887 -855889 -855901 -855919 -855923 -855937 -855947 -855983 -855989 -855997 -856021 -856043 -856057 -856061 -856073 -856081 -856099 -856111 -856117 -856133 -856139 -856147 -856153 -856169 -856181 -856187 -856213 -856237 -856241 -856249 -856277 -856279 -856301 -856309 -856333 -856343 -856351 -856369 -856381 -856391 -856393 -856411 -856417 -856421 -856441 -856459 -856469 -856483 -856487 -856507 -856519 -856529 -856547 -856549 -856553 -856567 -856571 -856627 -856637 -856649 -856693 -856697 -856699 -856703 -856711 -856717 -856721 -856733 -856759 -856787 -856789 -856799 -856811 -856813 -856831 -856841 -856847 -856853 -856897 -856901 -856903 -856909 -856927 -856939 -856943 -856949 -856969 -856993 -857009 -857011 -857027 -857029 -857039 -857047 -857053 -857069 -857081 -857083 -857099 -857107 -857137 -857161 -857167 -857201 -857203 -857221 -857249 -857267 -857273 -857281 -857287 -857309 -857321 -857333 -857341 -857347 -857357 -857369 -857407 -857411 -857419 -857431 -857453 -857459 -857471 -857513 -857539 -857551 -857567 -857569 -857573 -857579 -857581 -857629 -857653 -857663 -857669 -857671 -857687 -857707 -857711 -857713 -857723 -857737 -857741 -857743 -857749 -857809 -857821 -857827 -857839 -857851 -857867 -857873 -857897 -857903 -857929 -857951 -857953 -857957 -857959 -857963 -857977 -857981 -858001 -858029 -858043 -858073 -858083 -858101 -858103 -858113 -858127 -858149 -858161 -858167 -858217 -858223 -858233 -858239 -858241 -858251 -858259 -858269 -858281 -858293 -858301 -858307 -858311 -858317 -858373 -858397 -858427 -858433 -858457 -858463 -858467 -858479 -858497 -858503 -858527 -858563 -858577 -858589 -858623 -858631 -858673 -858691 -858701 -858707 -858709 -858713 -858749 -858757 -858763 -858769 -858787 -858817 -858821 -858833 -858841 -858859 -858877 -858883 -858899 -858911 -858919 -858931 -858943 -858953 -858961 -858989 -858997 -859003 -859031 -859037 -859049 -859051 -859057 -859081 -859091 -859093 -859109 -859121 -859181 -859189 -859213 -859223 -859249 -859259 -859267 -859273 -859277 -859279 -859297 -859321 -859361 -859363 -859373 -859381 -859393 -859423 -859433 -859447 -859459 -859477 -859493 -859513 -859553 -859559 -859561 -859567 -859577 -859601 -859603 -859609 -859619 -859633 -859657 -859667 -859669 -859679 -859681 -859697 -859709 -859751 -859783 -859787 -859799 -859801 -859823 -859841 -859849 -859853 -859861 -859891 -859913 -859919 -859927 -859933 -859939 -859973 -859981 -859987 -860009 -860011 -860029 -860051 -860059 -860063 -860071 -860077 -860087 -860089 -860107 -860113 -860117 -860143 -860239 -860257 -860267 -860291 -860297 -860309 -860311 -860317 -860323 -860333 -860341 -860351 -860357 -860369 -860381 -860383 -860393 -860399 -860413 -860417 -860423 -860441 -860479 -860501 -860507 -860513 -860533 -860543 -860569 -860579 -860581 -860593 -860599 -860609 -860623 -860641 -860647 -860663 -860689 -860701 -860747 -860753 -860759 -860779 -860789 -860791 -860809 -860813 -860819 -860843 -860861 -860887 -860891 -860911 -860917 -860921 -860927 -860929 -860939 -860941 -860957 -860969 -860971 -861001 -861013 -861019 -861031 -861037 -861043 -861053 -861059 -861079 -861083 -861089 -861109 -861121 -861131 -861139 -861163 -861167 -861191 -861199 -861221 -861239 -861293 -861299 -861317 -861347 -861353 -861361 -861391 -861433 -861437 -861439 -861491 -861493 -861499 -861541 -861547 -861551 -861559 -861563 -861571 -861589 -861599 -861613 -861617 -861647 -861659 -861691 -861701 -861703 -861719 -861733 -861739 -861743 -861761 -861797 -861799 -861803 -861823 -861829 -861853 -861857 -861871 -861877 -861881 -861899 -861901 -861907 -861929 -861937 -861941 -861947 -861977 -861979 -861997 -862009 -862013 -862031 -862033 -862061 -862067 -862097 -862117 -862123 -862129 -862139 -862157 -862159 -862171 -862177 -862181 -862187 -862207 -862219 -862229 -862231 -862241 -862249 -862259 -862261 -862273 -862283 -862289 -862297 -862307 -862319 -862331 -862343 -862369 -862387 -862397 -862399 -862409 -862417 -862423 -862441 -862447 -862471 -862481 -862483 -862487 -862493 -862501 -862541 -862553 -862559 -862567 -862571 -862573 -862583 -862607 -862627 -862633 -862649 -862651 -862669 -862703 -862727 -862739 -862769 -862777 -862783 -862789 -862811 -862819 -862861 -862879 -862907 -862909 -862913 -862919 -862921 -862943 -862957 -862973 -862987 -862991 -862997 -863003 -863017 -863047 -863081 -863087 -863119 -863123 -863131 -863143 -863153 -863179 -863197 -863231 -863251 -863279 -863287 -863299 -863309 -863323 -863363 -863377 -863393 -863479 -863491 -863497 -863509 -863521 -863537 -863539 -863561 -863593 -863609 -863633 -863641 -863671 -863689 -863693 -863711 -863729 -863743 -863749 -863767 -863771 -863783 -863801 -863803 -863833 -863843 -863851 -863867 -863869 -863879 -863887 -863897 -863899 -863909 -863917 -863921 -863959 -863983 -864007 -864011 -864013 -864029 -864037 -864047 -864049 -864053 -864077 -864079 -864091 -864103 -864107 -864119 -864121 -864131 -864137 -864151 -864167 -864169 -864191 -864203 -864211 -864221 -864223 -864251 -864277 -864289 -864299 -864301 -864307 -864319 -864323 -864341 -864359 -864361 -864379 -864407 -864419 -864427 -864439 -864449 -864491 -864503 -864509 -864511 -864533 -864541 -864551 -864581 -864583 -864587 -864613 -864623 -864629 -864631 -864641 -864673 -864679 -864691 -864707 -864733 -864737 -864757 -864781 -864793 -864803 -864811 -864817 -864883 -864887 -864901 -864911 -864917 -864947 -864953 -864959 -864967 -864979 -864989 -865001 -865003 -865043 -865049 -865057 -865061 -865069 -865087 -865091 -865103 -865121 -865153 -865159 -865177 -865201 -865211 -865213 -865217 -865231 -865247 -865253 -865259 -865261 -865301 -865307 -865313 -865321 -865327 -865339 -865343 -865349 -865357 -865363 -865379 -865409 -865457 -865477 -865481 -865483 -865493 -865499 -865511 -865537 -865577 -865591 -865597 -865609 -865619 -865637 -865639 -865643 -865661 -865681 -865687 -865717 -865721 -865729 -865741 -865747 -865751 -865757 -865769 -865771 -865783 -865801 -865807 -865817 -865819 -865829 -865847 -865859 -865867 -865871 -865877 -865889 -865933 -865937 -865957 -865979 -865993 -866003 -866009 -866011 -866029 -866051 -866053 -866057 -866081 -866083 -866087 -866093 -866101 -866119 -866123 -866161 -866183 -866197 -866213 -866221 -866231 -866279 -866293 -866309 -866311 -866329 -866353 -866389 -866399 -866417 -866431 -866443 -866461 -866471 -866477 -866513 -866519 -866573 -866581 -866623 -866629 -866639 -866641 -866653 -866683 -866689 -866693 -866707 -866713 -866717 -866737 -866743 -866759 -866777 -866783 -866819 -866843 -866849 -866851 -866857 -866869 -866909 -866917 -866927 -866933 -866941 -866953 -866963 -866969 -867001 -867007 -867011 -867023 -867037 -867059 -867067 -867079 -867091 -867121 -867131 -867143 -867151 -867161 -867173 -867203 -867211 -867227 -867233 -867253 -867257 -867259 -867263 -867271 -867281 -867301 -867319 -867337 -867343 -867371 -867389 -867397 -867401 -867409 -867413 -867431 -867443 -867457 -867463 -867467 -867487 -867509 -867511 -867541 -867547 -867553 -867563 -867571 -867577 -867589 -867617 -867619 -867623 -867631 -867641 -867653 -867677 -867679 -867689 -867701 -867719 -867733 -867743 -867773 -867781 -867793 -867803 -867817 -867827 -867829 -867857 -867871 -867887 -867913 -867943 -867947 -867959 -867991 -868019 -868033 -868039 -868051 -868069 -868073 -868081 -868103 -868111 -868121 -868123 -868151 -868157 -868171 -868177 -868199 -868211 -868229 -868249 -868267 -868271 -868277 -868291 -868313 -868327 -868331 -868337 -868349 -868369 -868379 -868381 -868397 -868409 -868423 -868451 -868453 -868459 -868487 -868489 -868493 -868529 -868531 -868537 -868559 -868561 -868577 -868583 -868603 -868613 -868639 -868663 -868669 -868691 -868697 -868727 -868739 -868741 -868771 -868783 -868787 -868793 -868799 -868801 -868817 -868841 -868849 -868867 -868873 -868877 -868883 -868891 -868909 -868937 -868939 -868943 -868951 -868957 -868993 -868997 -868999 -869017 -869021 -869039 -869053 -869059 -869069 -869081 -869119 -869131 -869137 -869153 -869173 -869179 -869203 -869233 -869249 -869251 -869257 -869273 -869291 -869293 -869299 -869303 -869317 -869321 -869339 -869369 -869371 -869381 -869399 -869413 -869419 -869437 -869443 -869461 -869467 -869471 -869489 -869501 -869521 -869543 -869551 -869563 -869579 -869587 -869597 -869599 -869657 -869663 -869683 -869689 -869707 -869717 -869747 -869753 -869773 -869777 -869779 -869807 -869809 -869819 -869849 -869863 -869879 -869887 -869893 -869899 -869909 -869927 -869951 -869959 -869983 -869989 -870007 -870013 -870031 -870047 -870049 -870059 -870083 -870097 -870109 -870127 -870131 -870137 -870151 -870161 -870169 -870173 -870197 -870211 -870223 -870229 -870239 -870241 -870253 -870271 -870283 -870301 -870323 -870329 -870341 -870367 -870391 -870403 -870407 -870413 -870431 -870433 -870437 -870461 -870479 -870491 -870497 -870517 -870533 -870547 -870577 -870589 -870593 -870601 -870613 -870629 -870641 -870643 -870679 -870691 -870703 -870731 -870739 -870743 -870773 -870787 -870809 -870811 -870823 -870833 -870847 -870853 -870871 -870889 -870901 -870907 -870911 -870917 -870929 -870931 -870953 -870967 -870977 -870983 -870997 -871001 -871021 -871027 -871037 -871061 -871103 -871147 -871159 -871163 -871177 -871181 -871229 -871231 -871249 -871259 -871271 -871289 -871303 -871337 -871349 -871393 -871439 -871459 -871463 -871477 -871513 -871517 -871531 -871553 -871571 -871589 -871597 -871613 -871621 -871639 -871643 -871649 -871657 -871679 -871681 -871687 -871727 -871763 -871771 -871789 -871817 -871823 -871837 -871867 -871883 -871901 -871919 -871931 -871957 -871963 -871973 -871987 -871993 -872017 -872023 -872033 -872041 -872057 -872071 -872077 -872089 -872099 -872107 -872129 -872141 -872143 -872149 -872159 -872161 -872173 -872177 -872189 -872203 -872227 -872231 -872237 -872243 -872251 -872257 -872269 -872281 -872317 -872323 -872351 -872353 -872369 -872381 -872383 -872387 -872393 -872411 -872419 -872429 -872437 -872441 -872453 -872471 -872477 -872479 -872533 -872549 -872561 -872563 -872567 -872587 -872609 -872611 -872621 -872623 -872647 -872657 -872659 -872671 -872687 -872731 -872737 -872747 -872749 -872761 -872789 -872791 -872843 -872863 -872923 -872947 -872951 -872953 -872959 -872999 -873017 -873043 -873049 -873073 -873079 -873083 -873091 -873109 -873113 -873121 -873133 -873139 -873157 -873209 -873247 -873251 -873263 -873293 -873317 -873319 -873331 -873343 -873349 -873359 -873403 -873407 -873419 -873421 -873427 -873437 -873461 -873463 -873469 -873497 -873527 -873529 -873539 -873541 -873553 -873569 -873571 -873617 -873619 -873641 -873643 -873659 -873667 -873671 -873689 -873707 -873709 -873721 -873727 -873739 -873767 -873773 -873781 -873787 -873863 -873877 -873913 -873959 -873979 -873989 -873991 -874001 -874009 -874037 -874063 -874087 -874091 -874099 -874103 -874109 -874117 -874121 -874127 -874151 -874193 -874213 -874217 -874229 -874249 -874267 -874271 -874277 -874301 -874303 -874331 -874337 -874343 -874351 -874373 -874387 -874397 -874403 -874409 -874427 -874457 -874459 -874477 -874487 -874537 -874543 -874547 -874567 -874583 -874597 -874619 -874637 -874639 -874651 -874661 -874673 -874681 -874693 -874697 -874711 -874721 -874723 -874729 -874739 -874763 -874771 -874777 -874799 -874807 -874813 -874823 -874831 -874847 -874859 -874873 -874879 -874889 -874891 -874919 -874957 -874967 -874987 -875011 -875027 -875033 -875089 -875107 -875113 -875117 -875129 -875141 -875183 -875201 -875209 -875213 -875233 -875239 -875243 -875261 -875263 -875267 -875269 -875297 -875299 -875317 -875323 -875327 -875333 -875339 -875341 -875363 -875377 -875389 -875393 -875417 -875419 -875429 -875443 -875447 -875477 -875491 -875503 -875509 -875513 -875519 -875521 -875543 -875579 -875591 -875593 -875617 -875621 -875627 -875629 -875647 -875659 -875663 -875681 -875683 -875689 -875701 -875711 -875717 -875731 -875741 -875759 -875761 -875773 -875779 -875783 -875803 -875821 -875837 -875851 -875893 -875923 -875929 -875933 -875947 -875969 -875981 -875983 -876011 -876013 -876017 -876019 -876023 -876041 -876067 -876077 -876079 -876097 -876103 -876107 -876121 -876131 -876137 -876149 -876181 -876191 -876193 -876199 -876203 -876229 -876233 -876257 -876263 -876287 -876301 -876307 -876311 -876329 -876331 -876341 -876349 -876371 -876373 -876431 -876433 -876443 -876479 -876481 -876497 -876523 -876529 -876569 -876581 -876593 -876607 -876611 -876619 -876643 -876647 -876653 -876661 -876677 -876719 -876721 -876731 -876749 -876751 -876761 -876769 -876787 -876791 -876797 -876817 -876823 -876833 -876851 -876853 -876871 -876893 -876913 -876929 -876947 -876971 -877003 -877027 -877043 -877057 -877073 -877091 -877109 -877111 -877117 -877133 -877169 -877181 -877187 -877199 -877213 -877223 -877237 -877267 -877291 -877297 -877301 -877313 -877321 -877333 -877343 -877351 -877361 -877367 -877379 -877397 -877399 -877403 -877411 -877423 -877463 -877469 -877531 -877543 -877567 -877573 -877577 -877601 -877609 -877619 -877621 -877651 -877661 -877699 -877739 -877771 -877783 -877817 -877823 -877837 -877843 -877853 -877867 -877871 -877873 -877879 -877883 -877907 -877909 -877937 -877939 -877949 -877997 -878011 -878021 -878023 -878039 -878041 -878077 -878083 -878089 -878099 -878107 -878113 -878131 -878147 -878153 -878159 -878167 -878173 -878183 -878191 -878197 -878201 -878221 -878239 -878279 -878287 -878291 -878299 -878309 -878359 -878377 -878387 -878411 -878413 -878419 -878443 -878453 -878467 -878489 -878513 -878539 -878551 -878567 -878573 -878593 -878597 -878609 -878621 -878629 -878641 -878651 -878659 -878663 -878677 -878681 -878699 -878719 -878737 -878743 -878749 -878777 -878783 -878789 -878797 -878821 -878831 -878833 -878837 -878851 -878863 -878869 -878873 -878893 -878929 -878939 -878953 -878957 -878987 -878989 -879001 -879007 -879023 -879031 -879061 -879089 -879097 -879103 -879113 -879119 -879133 -879143 -879167 -879169 -879181 -879199 -879227 -879239 -879247 -879259 -879269 -879271 -879283 -879287 -879299 -879331 -879341 -879343 -879353 -879371 -879391 -879401 -879413 -879449 -879457 -879493 -879523 -879533 -879539 -879553 -879581 -879583 -879607 -879617 -879623 -879629 -879649 -879653 -879661 -879667 -879673 -879679 -879689 -879691 -879701 -879707 -879709 -879713 -879721 -879743 -879797 -879799 -879817 -879821 -879839 -879859 -879863 -879881 -879917 -879919 -879941 -879953 -879961 -879973 -879979 -880001 -880007 -880021 -880027 -880031 -880043 -880057 -880067 -880069 -880091 -880097 -880109 -880127 -880133 -880151 -880153 -880199 -880211 -880219 -880223 -880247 -880249 -880259 -880283 -880301 -880303 -880331 -880337 -880343 -880349 -880361 -880367 -880409 -880421 -880423 -880427 -880483 -880487 -880513 -880519 -880531 -880541 -880543 -880553 -880559 -880571 -880573 -880589 -880603 -880661 -880667 -880673 -880681 -880687 -880699 -880703 -880709 -880723 -880727 -880729 -880751 -880793 -880799 -880801 -880813 -880819 -880823 -880853 -880861 -880871 -880883 -880903 -880907 -880909 -880939 -880949 -880951 -880961 -880981 -880993 -881003 -881009 -881017 -881029 -881057 -881071 -881077 -881099 -881119 -881141 -881143 -881147 -881159 -881171 -881173 -881191 -881197 -881207 -881219 -881233 -881249 -881269 -881273 -881311 -881317 -881327 -881333 -881351 -881357 -881369 -881393 -881407 -881411 -881417 -881437 -881449 -881471 -881473 -881477 -881479 -881509 -881527 -881533 -881537 -881539 -881591 -881597 -881611 -881641 -881663 -881669 -881681 -881707 -881711 -881729 -881743 -881779 -881813 -881833 -881849 -881897 -881899 -881911 -881917 -881939 -881953 -881963 -881983 -881987 -882017 -882019 -882029 -882031 -882047 -882061 -882067 -882071 -882083 -882103 -882139 -882157 -882169 -882173 -882179 -882187 -882199 -882239 -882241 -882247 -882251 -882253 -882263 -882289 -882313 -882359 -882367 -882377 -882389 -882391 -882433 -882439 -882449 -882451 -882461 -882481 -882491 -882517 -882529 -882551 -882571 -882577 -882587 -882593 -882599 -882617 -882631 -882653 -882659 -882697 -882701 -882703 -882719 -882727 -882733 -882751 -882773 -882779 -882823 -882851 -882863 -882877 -882881 -882883 -882907 -882913 -882923 -882943 -882953 -882961 -882967 -882979 -883013 -883049 -883061 -883073 -883087 -883093 -883109 -883111 -883117 -883121 -883163 -883187 -883193 -883213 -883217 -883229 -883231 -883237 -883241 -883247 -883249 -883273 -883279 -883307 -883327 -883331 -883339 -883343 -883357 -883391 -883397 -883409 -883411 -883423 -883429 -883433 -883451 -883471 -883483 -883489 -883517 -883537 -883549 -883577 -883579 -883613 -883621 -883627 -883639 -883661 -883667 -883691 -883697 -883699 -883703 -883721 -883733 -883739 -883763 -883777 -883781 -883783 -883807 -883871 -883877 -883889 -883921 -883933 -883963 -883969 -883973 -883979 -883991 -884003 -884011 -884029 -884057 -884069 -884077 -884087 -884111 -884129 -884131 -884159 -884167 -884171 -884183 -884201 -884227 -884231 -884243 -884251 -884267 -884269 -884287 -884293 -884309 -884311 -884321 -884341 -884353 -884363 -884369 -884371 -884417 -884423 -884437 -884441 -884453 -884483 -884489 -884491 -884497 -884501 -884537 -884573 -884579 -884591 -884593 -884617 -884651 -884669 -884693 -884699 -884717 -884743 -884789 -884791 -884803 -884813 -884827 -884831 -884857 -884881 -884899 -884921 -884951 -884959 -884977 -884981 -884987 -884999 -885023 -885041 -885061 -885083 -885091 -885097 -885103 -885107 -885127 -885133 -885161 -885163 -885169 -885187 -885217 -885223 -885233 -885239 -885251 -885257 -885263 -885289 -885301 -885307 -885331 -885359 -885371 -885383 -885389 -885397 -885403 -885421 -885427 -885449 -885473 -885487 -885497 -885503 -885509 -885517 -885529 -885551 -885553 -885589 -885607 -885611 -885623 -885679 -885713 -885721 -885727 -885733 -885737 -885769 -885791 -885793 -885803 -885811 -885821 -885823 -885839 -885869 -885881 -885883 -885889 -885893 -885919 -885923 -885931 -885943 -885947 -885959 -885961 -885967 -885971 -885977 -885991 -886007 -886013 -886019 -886021 -886031 -886043 -886069 -886097 -886117 -886129 -886163 -886177 -886181 -886183 -886189 -886199 -886241 -886243 -886247 -886271 -886283 -886307 -886313 -886337 -886339 -886349 -886367 -886381 -886387 -886421 -886427 -886429 -886433 -886453 -886463 -886469 -886471 -886493 -886511 -886517 -886519 -886537 -886541 -886547 -886549 -886583 -886591 -886607 -886609 -886619 -886643 -886651 -886663 -886667 -886741 -886747 -886751 -886759 -886777 -886793 -886799 -886807 -886819 -886859 -886867 -886891 -886909 -886913 -886967 -886969 -886973 -886979 -886981 -886987 -886993 -886999 -887017 -887057 -887059 -887069 -887093 -887101 -887113 -887141 -887143 -887153 -887171 -887177 -887191 -887203 -887233 -887261 -887267 -887269 -887291 -887311 -887323 -887333 -887377 -887387 -887399 -887401 -887423 -887441 -887449 -887459 -887479 -887483 -887503 -887533 -887543 -887567 -887569 -887573 -887581 -887599 -887617 -887629 -887633 -887641 -887651 -887657 -887659 -887669 -887671 -887681 -887693 -887701 -887707 -887717 -887743 -887749 -887759 -887819 -887827 -887837 -887839 -887849 -887867 -887903 -887911 -887921 -887923 -887941 -887947 -887987 -887989 -888001 -888011 -888047 -888059 -888061 -888077 -888091 -888103 -888109 -888133 -888143 -888157 -888161 -888163 -888179 -888203 -888211 -888247 -888257 -888263 -888271 -888287 -888313 -888319 -888323 -888359 -888361 -888373 -888389 -888397 -888409 -888413 -888427 -888431 -888443 -888451 -888457 -888469 -888479 -888493 -888499 -888533 -888541 -888557 -888623 -888631 -888637 -888653 -888659 -888661 -888683 -888689 -888691 -888721 -888737 -888751 -888761 -888773 -888779 -888781 -888793 -888799 -888809 -888827 -888857 -888869 -888871 -888887 -888917 -888919 -888931 -888959 -888961 -888967 -888983 -888989 -888997 -889001 -889027 -889037 -889039 -889043 -889051 -889069 -889081 -889087 -889123 -889139 -889171 -889177 -889211 -889237 -889247 -889261 -889271 -889279 -889289 -889309 -889313 -889327 -889337 -889349 -889351 -889363 -889367 -889373 -889391 -889411 -889429 -889439 -889453 -889481 -889489 -889501 -889519 -889579 -889589 -889597 -889631 -889639 -889657 -889673 -889687 -889697 -889699 -889703 -889727 -889747 -889769 -889783 -889829 -889871 -889873 -889877 -889879 -889891 -889901 -889907 -889909 -889921 -889937 -889951 -889957 -889963 -889997 -890003 -890011 -890027 -890053 -890063 -890083 -890107 -890111 -890117 -890119 -890129 -890147 -890159 -890161 -890177 -890221 -890231 -890237 -890287 -890291 -890303 -890317 -890333 -890371 -890377 -890419 -890429 -890437 -890441 -890459 -890467 -890501 -890531 -890543 -890551 -890563 -890597 -890609 -890653 -890657 -890671 -890683 -890707 -890711 -890717 -890737 -890761 -890789 -890797 -890803 -890809 -890821 -890833 -890843 -890861 -890863 -890867 -890881 -890887 -890893 -890927 -890933 -890941 -890957 -890963 -890969 -890993 -890999 -891001 -891017 -891047 -891049 -891061 -891067 -891091 -891101 -891103 -891133 -891151 -891161 -891173 -891179 -891223 -891239 -891251 -891277 -891287 -891311 -891323 -891329 -891349 -891377 -891379 -891389 -891391 -891409 -891421 -891427 -891439 -891481 -891487 -891491 -891493 -891509 -891521 -891523 -891551 -891557 -891559 -891563 -891571 -891577 -891587 -891593 -891601 -891617 -891629 -891643 -891647 -891659 -891661 -891677 -891679 -891707 -891743 -891749 -891763 -891767 -891797 -891799 -891809 -891817 -891823 -891827 -891829 -891851 -891859 -891887 -891889 -891893 -891899 -891907 -891923 -891929 -891967 -891983 -891991 -891997 -892019 -892027 -892049 -892057 -892079 -892091 -892093 -892097 -892103 -892123 -892141 -892153 -892159 -892169 -892189 -892219 -892237 -892249 -892253 -892261 -892267 -892271 -892291 -892321 -892351 -892357 -892387 -892391 -892421 -892433 -892439 -892457 -892471 -892481 -892513 -892523 -892531 -892547 -892553 -892559 -892579 -892597 -892603 -892609 -892627 -892643 -892657 -892663 -892667 -892709 -892733 -892747 -892757 -892763 -892777 -892781 -892783 -892817 -892841 -892849 -892861 -892877 -892901 -892919 -892933 -892951 -892973 -892987 -892999 -893003 -893023 -893029 -893033 -893041 -893051 -893059 -893093 -893099 -893107 -893111 -893117 -893119 -893131 -893147 -893149 -893161 -893183 -893213 -893219 -893227 -893237 -893257 -893261 -893281 -893317 -893339 -893341 -893351 -893359 -893363 -893381 -893383 -893407 -893413 -893419 -893429 -893441 -893449 -893479 -893489 -893509 -893521 -893549 -893567 -893591 -893603 -893609 -893653 -893657 -893671 -893681 -893701 -893719 -893723 -893743 -893777 -893797 -893821 -893839 -893857 -893863 -893873 -893881 -893897 -893903 -893917 -893929 -893933 -893939 -893989 -893999 -894011 -894037 -894059 -894067 -894073 -894097 -894109 -894119 -894137 -894139 -894151 -894161 -894167 -894181 -894191 -894193 -894203 -894209 -894211 -894221 -894227 -894233 -894239 -894247 -894259 -894277 -894281 -894287 -894301 -894329 -894343 -894371 -894391 -894403 -894407 -894409 -894419 -894427 -894431 -894449 -894451 -894503 -894511 -894521 -894527 -894541 -894547 -894559 -894581 -894589 -894611 -894613 -894637 -894643 -894667 -894689 -894709 -894713 -894721 -894731 -894749 -894763 -894779 -894791 -894793 -894811 -894869 -894871 -894893 -894917 -894923 -894947 -894973 -894997 -895003 -895007 -895009 -895039 -895049 -895051 -895079 -895087 -895127 -895133 -895151 -895157 -895159 -895171 -895189 -895211 -895231 -895241 -895243 -895247 -895253 -895277 -895283 -895291 -895309 -895313 -895319 -895333 -895343 -895351 -895357 -895361 -895387 -895393 -895421 -895423 -895457 -895463 -895469 -895471 -895507 -895529 -895553 -895571 -895579 -895591 -895613 -895627 -895633 -895649 -895651 -895667 -895669 -895673 -895681 -895691 -895703 -895709 -895721 -895729 -895757 -895771 -895777 -895787 -895789 -895799 -895801 -895813 -895823 -895841 -895861 -895879 -895889 -895901 -895903 -895913 -895927 -895933 -895957 -895987 -896003 -896009 -896047 -896069 -896101 -896107 -896111 -896113 -896123 -896143 -896167 -896191 -896201 -896263 -896281 -896293 -896297 -896299 -896323 -896327 -896341 -896347 -896353 -896369 -896381 -896417 -896443 -896447 -896449 -896453 -896479 -896491 -896509 -896521 -896531 -896537 -896543 -896549 -896557 -896561 -896573 -896587 -896617 -896633 -896647 -896669 -896677 -896681 -896717 -896719 -896723 -896771 -896783 -896803 -896837 -896867 -896879 -896897 -896921 -896927 -896947 -896953 -896963 -896983 -897007 -897011 -897019 -897049 -897053 -897059 -897067 -897077 -897101 -897103 -897119 -897133 -897137 -897157 -897163 -897191 -897223 -897229 -897241 -897251 -897263 -897269 -897271 -897301 -897307 -897317 -897319 -897329 -897349 -897359 -897373 -897401 -897433 -897443 -897461 -897467 -897469 -897473 -897497 -897499 -897517 -897527 -897553 -897557 -897563 -897571 -897577 -897581 -897593 -897601 -897607 -897629 -897647 -897649 -897671 -897691 -897703 -897707 -897709 -897727 -897751 -897779 -897781 -897817 -897829 -897847 -897877 -897881 -897887 -897899 -897907 -897931 -897947 -897971 -897983 -898013 -898019 -898033 -898063 -898067 -898069 -898091 -898097 -898109 -898129 -898133 -898147 -898153 -898171 -898181 -898189 -898199 -898211 -898213 -898223 -898231 -898241 -898243 -898253 -898259 -898279 -898283 -898291 -898307 -898319 -898327 -898361 -898369 -898409 -898421 -898423 -898427 -898439 -898459 -898477 -898481 -898483 -898493 -898519 -898523 -898543 -898549 -898553 -898561 -898607 -898613 -898621 -898661 -898663 -898669 -898673 -898691 -898717 -898727 -898753 -898763 -898769 -898787 -898813 -898819 -898823 -898853 -898867 -898873 -898889 -898897 -898921 -898927 -898951 -898981 -898987 -899009 -899051 -899057 -899069 -899123 -899149 -899153 -899159 -899161 -899177 -899179 -899183 -899189 -899209 -899221 -899233 -899237 -899263 -899273 -899291 -899309 -899321 -899387 -899401 -899413 -899429 -899447 -899467 -899473 -899477 -899491 -899519 -899531 -899537 -899611 -899617 -899659 -899671 -899681 -899687 -899693 -899711 -899719 -899749 -899753 -899761 -899779 -899791 -899807 -899831 -899849 -899851 -899863 -899881 -899891 -899893 -899903 -899917 -899939 -899971 -899981 -900001 -900007 -900019 -900037 -900061 -900089 -900091 -900103 -900121 -900139 -900143 -900149 -900157 -900161 -900169 -900187 -900217 -900233 -900241 -900253 -900259 -900283 -900287 -900293 -900307 -900329 -900331 -900349 -900397 -900409 -900443 -900461 -900481 -900491 -900511 -900539 -900551 -900553 -900563 -900569 -900577 -900583 -900587 -900589 -900593 -900607 -900623 -900649 -900659 -900671 -900673 -900689 -900701 -900719 -900737 -900743 -900751 -900761 -900763 -900773 -900797 -900803 -900817 -900821 -900863 -900869 -900917 -900929 -900931 -900937 -900959 -900971 -900973 -900997 -901007 -901009 -901013 -901063 -901067 -901079 -901093 -901097 -901111 -901133 -901141 -901169 -901171 -901177 -901183 -901193 -901207 -901211 -901213 -901247 -901249 -901253 -901273 -901279 -901309 -901333 -901339 -901367 -901399 -901403 -901423 -901427 -901429 -901441 -901447 -901451 -901457 -901471 -901489 -901499 -901501 -901513 -901517 -901529 -901547 -901567 -901591 -901613 -901643 -901657 -901679 -901687 -901709 -901717 -901739 -901741 -901751 -901781 -901787 -901811 -901819 -901841 -901861 -901891 -901907 -901909 -901919 -901931 -901937 -901963 -901973 -901993 -901997 -902009 -902017 -902029 -902039 -902047 -902053 -902087 -902089 -902119 -902137 -902141 -902179 -902191 -902201 -902227 -902261 -902263 -902281 -902299 -902303 -902311 -902333 -902347 -902351 -902357 -902389 -902401 -902413 -902437 -902449 -902471 -902477 -902483 -902501 -902507 -902521 -902563 -902569 -902579 -902591 -902597 -902599 -902611 -902639 -902653 -902659 -902669 -902677 -902687 -902719 -902723 -902753 -902761 -902767 -902771 -902777 -902789 -902807 -902821 -902827 -902849 -902873 -902903 -902933 -902953 -902963 -902971 -902977 -902981 -902987 -903017 -903029 -903037 -903073 -903079 -903103 -903109 -903143 -903151 -903163 -903179 -903197 -903211 -903223 -903251 -903257 -903269 -903311 -903323 -903337 -903347 -903359 -903367 -903389 -903391 -903403 -903407 -903421 -903443 -903449 -903451 -903457 -903479 -903493 -903527 -903541 -903547 -903563 -903569 -903607 -903613 -903641 -903649 -903673 -903677 -903691 -903701 -903709 -903751 -903757 -903761 -903781 -903803 -903827 -903841 -903871 -903883 -903899 -903913 -903919 -903949 -903967 -903979 -904019 -904027 -904049 -904067 -904069 -904073 -904087 -904093 -904097 -904103 -904117 -904121 -904147 -904157 -904181 -904193 -904201 -904207 -904217 -904219 -904261 -904283 -904289 -904297 -904303 -904357 -904361 -904369 -904399 -904441 -904459 -904483 -904489 -904499 -904511 -904513 -904517 -904523 -904531 -904559 -904573 -904577 -904601 -904619 -904627 -904633 -904637 -904643 -904661 -904663 -904667 -904679 -904681 -904693 -904697 -904721 -904727 -904733 -904759 -904769 -904777 -904781 -904789 -904793 -904801 -904811 -904823 -904847 -904861 -904867 -904873 -904879 -904901 -904903 -904907 -904919 -904931 -904933 -904987 -904997 -904999 -905011 -905053 -905059 -905071 -905083 -905087 -905111 -905123 -905137 -905143 -905147 -905161 -905167 -905171 -905189 -905197 -905207 -905209 -905213 -905227 -905249 -905269 -905291 -905297 -905299 -905329 -905339 -905347 -905381 -905413 -905449 -905453 -905461 -905477 -905491 -905497 -905507 -905551 -905581 -905587 -905599 -905617 -905621 -905629 -905647 -905651 -905659 -905677 -905683 -905687 -905693 -905701 -905713 -905719 -905759 -905761 -905767 -905783 -905803 -905819 -905833 -905843 -905897 -905909 -905917 -905923 -905951 -905959 -905963 -905999 -906007 -906011 -906013 -906023 -906029 -906043 -906089 -906107 -906119 -906121 -906133 -906179 -906187 -906197 -906203 -906211 -906229 -906233 -906259 -906263 -906289 -906293 -906313 -906317 -906329 -906331 -906343 -906349 -906371 -906377 -906383 -906391 -906403 -906421 -906427 -906431 -906461 -906473 -906481 -906487 -906497 -906517 -906523 -906539 -906541 -906557 -906589 -906601 -906613 -906617 -906641 -906649 -906673 -906679 -906691 -906701 -906707 -906713 -906727 -906749 -906751 -906757 -906767 -906779 -906793 -906809 -906817 -906823 -906839 -906847 -906869 -906881 -906901 -906911 -906923 -906929 -906931 -906943 -906949 -906973 -907019 -907021 -907031 -907063 -907073 -907099 -907111 -907133 -907139 -907141 -907163 -907169 -907183 -907199 -907211 -907213 -907217 -907223 -907229 -907237 -907259 -907267 -907279 -907297 -907301 -907321 -907331 -907363 -907367 -907369 -907391 -907393 -907397 -907399 -907427 -907433 -907447 -907457 -907469 -907471 -907481 -907493 -907507 -907513 -907549 -907561 -907567 -907583 -907589 -907637 -907651 -907657 -907663 -907667 -907691 -907693 -907703 -907717 -907723 -907727 -907733 -907757 -907759 -907793 -907807 -907811 -907813 -907831 -907843 -907849 -907871 -907891 -907909 -907913 -907927 -907957 -907967 -907969 -907997 -907999 -908003 -908041 -908053 -908057 -908071 -908081 -908101 -908113 -908129 -908137 -908153 -908179 -908183 -908197 -908213 -908221 -908233 -908249 -908287 -908317 -908321 -908353 -908359 -908363 -908377 -908381 -908417 -908419 -908441 -908449 -908459 -908471 -908489 -908491 -908503 -908513 -908521 -908527 -908533 -908539 -908543 -908549 -908573 -908581 -908591 -908597 -908603 -908617 -908623 -908627 -908653 -908669 -908671 -908711 -908723 -908731 -908741 -908749 -908759 -908771 -908797 -908807 -908813 -908819 -908821 -908849 -908851 -908857 -908861 -908863 -908879 -908881 -908893 -908909 -908911 -908927 -908953 -908959 -908993 -909019 -909023 -909031 -909037 -909043 -909047 -909061 -909071 -909089 -909091 -909107 -909113 -909119 -909133 -909151 -909173 -909203 -909217 -909239 -909241 -909247 -909253 -909281 -909287 -909289 -909299 -909301 -909317 -909319 -909329 -909331 -909341 -909343 -909371 -909379 -909383 -909401 -909409 -909437 -909451 -909457 -909463 -909481 -909521 -909529 -909539 -909541 -909547 -909577 -909599 -909611 -909613 -909631 -909637 -909679 -909683 -909691 -909697 -909731 -909737 -909743 -909761 -909767 -909773 -909787 -909791 -909803 -909809 -909829 -909833 -909859 -909863 -909877 -909889 -909899 -909901 -909907 -909911 -909917 -909971 -909973 -909977 -910003 -910031 -910051 -910069 -910093 -910097 -910099 -910103 -910109 -910121 -910127 -910139 -910141 -910171 -910177 -910199 -910201 -910207 -910213 -910219 -910229 -910277 -910279 -910307 -910361 -910369 -910421 -910447 -910451 -910453 -910457 -910471 -910519 -910523 -910561 -910577 -910583 -910603 -910619 -910621 -910627 -910631 -910643 -910661 -910691 -910709 -910711 -910747 -910751 -910771 -910781 -910787 -910799 -910807 -910817 -910849 -910853 -910883 -910909 -910939 -910957 -910981 -911003 -911011 -911023 -911033 -911039 -911063 -911077 -911087 -911089 -911101 -911111 -911129 -911147 -911159 -911161 -911167 -911171 -911173 -911179 -911201 -911219 -911227 -911231 -911233 -911249 -911269 -911291 -911293 -911303 -911311 -911321 -911327 -911341 -911357 -911359 -911363 -911371 -911413 -911419 -911437 -911453 -911459 -911503 -911507 -911527 -911549 -911593 -911597 -911621 -911633 -911657 -911663 -911671 -911681 -911683 -911689 -911707 -911719 -911723 -911737 -911749 -911773 -911777 -911783 -911819 -911831 -911837 -911839 -911851 -911861 -911873 -911879 -911893 -911899 -911903 -911917 -911947 -911951 -911957 -911959 -911969 -912007 -912031 -912047 -912049 -912053 -912061 -912083 -912089 -912103 -912167 -912173 -912187 -912193 -912211 -912217 -912227 -912239 -912251 -912269 -912287 -912337 -912343 -912349 -912367 -912391 -912397 -912403 -912409 -912413 -912449 -912451 -912463 -912467 -912469 -912481 -912487 -912491 -912497 -912511 -912521 -912523 -912533 -912539 -912559 -912581 -912631 -912647 -912649 -912727 -912763 -912773 -912797 -912799 -912809 -912823 -912829 -912839 -912851 -912853 -912859 -912869 -912871 -912911 -912929 -912941 -912953 -912959 -912971 -912973 -912979 -912991 -913013 -913027 -913037 -913039 -913063 -913067 -913103 -913139 -913151 -913177 -913183 -913217 -913247 -913259 -913279 -913309 -913321 -913327 -913331 -913337 -913373 -913397 -913417 -913421 -913433 -913441 -913447 -913457 -913483 -913487 -913513 -913571 -913573 -913579 -913589 -913637 -913639 -913687 -913709 -913723 -913739 -913753 -913771 -913799 -913811 -913853 -913873 -913889 -913907 -913921 -913933 -913943 -913981 -913999 -914021 -914027 -914041 -914047 -914117 -914131 -914161 -914189 -914191 -914213 -914219 -914237 -914239 -914257 -914269 -914279 -914293 -914321 -914327 -914339 -914351 -914357 -914359 -914363 -914369 -914371 -914429 -914443 -914449 -914461 -914467 -914477 -914491 -914513 -914519 -914521 -914533 -914561 -914569 -914579 -914581 -914591 -914597 -914609 -914611 -914629 -914647 -914657 -914701 -914713 -914723 -914731 -914737 -914777 -914783 -914789 -914791 -914801 -914813 -914819 -914827 -914843 -914857 -914861 -914867 -914873 -914887 -914891 -914897 -914941 -914951 -914971 -914981 -915007 -915017 -915029 -915041 -915049 -915053 -915067 -915071 -915113 -915139 -915143 -915157 -915181 -915191 -915197 -915199 -915203 -915221 -915223 -915247 -915251 -915253 -915259 -915283 -915301 -915311 -915353 -915367 -915379 -915391 -915437 -915451 -915479 -915487 -915527 -915533 -915539 -915547 -915557 -915587 -915589 -915601 -915611 -915613 -915623 -915631 -915641 -915659 -915683 -915697 -915703 -915727 -915731 -915737 -915757 -915763 -915769 -915799 -915839 -915851 -915869 -915881 -915911 -915917 -915919 -915947 -915949 -915961 -915973 -915991 -916031 -916033 -916049 -916057 -916061 -916073 -916099 -916103 -916109 -916121 -916127 -916129 -916141 -916169 -916177 -916183 -916187 -916189 -916213 -916217 -916219 -916259 -916261 -916273 -916291 -916319 -916337 -916339 -916361 -916367 -916387 -916411 -916417 -916441 -916451 -916457 -916463 -916469 -916471 -916477 -916501 -916507 -916511 -916537 -916561 -916571 -916583 -916613 -916621 -916633 -916649 -916651 -916679 -916703 -916733 -916771 -916781 -916787 -916831 -916837 -916841 -916859 -916871 -916879 -916907 -916913 -916931 -916933 -916939 -916961 -916973 -916999 -917003 -917039 -917041 -917051 -917053 -917083 -917089 -917093 -917101 -917113 -917117 -917123 -917141 -917153 -917159 -917173 -917179 -917209 -917219 -917227 -917237 -917239 -917243 -917251 -917281 -917291 -917317 -917327 -917333 -917353 -917363 -917381 -917407 -917443 -917459 -917461 -917471 -917503 -917513 -917519 -917549 -917557 -917573 -917591 -917593 -917611 -917617 -917629 -917633 -917641 -917659 -917669 -917687 -917689 -917713 -917729 -917737 -917753 -917759 -917767 -917771 -917773 -917783 -917789 -917803 -917809 -917827 -917831 -917837 -917843 -917849 -917869 -917887 -917893 -917923 -917927 -917951 -917971 -917993 -918011 -918019 -918041 -918067 -918079 -918089 -918103 -918109 -918131 -918139 -918143 -918149 -918157 -918161 -918173 -918193 -918199 -918209 -918223 -918257 -918259 -918263 -918283 -918301 -918319 -918329 -918341 -918347 -918353 -918361 -918371 -918389 -918397 -918431 -918433 -918439 -918443 -918469 -918481 -918497 -918529 -918539 -918563 -918581 -918583 -918587 -918613 -918641 -918647 -918653 -918677 -918679 -918683 -918733 -918737 -918751 -918763 -918767 -918779 -918787 -918793 -918823 -918829 -918839 -918857 -918877 -918889 -918899 -918913 -918943 -918947 -918949 -918959 -918971 -918989 -919013 -919019 -919021 -919031 -919033 -919063 -919067 -919081 -919109 -919111 -919129 -919147 -919153 -919169 -919183 -919189 -919223 -919229 -919231 -919249 -919253 -919267 -919301 -919313 -919319 -919337 -919349 -919351 -919381 -919393 -919409 -919417 -919421 -919423 -919427 -919447 -919511 -919519 -919531 -919559 -919571 -919591 -919613 -919621 -919631 -919679 -919691 -919693 -919703 -919729 -919757 -919759 -919769 -919781 -919799 -919811 -919817 -919823 -919859 -919871 -919883 -919901 -919903 -919913 -919927 -919937 -919939 -919949 -919951 -919969 -919979 -920011 -920021 -920039 -920053 -920107 -920123 -920137 -920147 -920149 -920167 -920197 -920201 -920203 -920209 -920219 -920233 -920263 -920267 -920273 -920279 -920281 -920291 -920323 -920333 -920357 -920371 -920377 -920393 -920399 -920407 -920411 -920419 -920441 -920443 -920467 -920473 -920477 -920497 -920509 -920519 -920539 -920561 -920609 -920641 -920651 -920653 -920677 -920687 -920701 -920707 -920729 -920741 -920743 -920753 -920761 -920783 -920789 -920791 -920807 -920827 -920833 -920849 -920863 -920869 -920891 -920921 -920947 -920951 -920957 -920963 -920971 -920999 -921001 -921007 -921013 -921029 -921031 -921073 -921079 -921091 -921121 -921133 -921143 -921149 -921157 -921169 -921191 -921197 -921199 -921203 -921223 -921233 -921241 -921257 -921259 -921287 -921293 -921331 -921353 -921373 -921379 -921407 -921409 -921457 -921463 -921467 -921491 -921497 -921499 -921517 -921523 -921563 -921581 -921589 -921601 -921611 -921629 -921637 -921643 -921647 -921667 -921677 -921703 -921733 -921737 -921743 -921749 -921751 -921761 -921779 -921787 -921821 -921839 -921841 -921871 -921887 -921889 -921901 -921911 -921913 -921919 -921931 -921959 -921989 -922021 -922027 -922037 -922039 -922043 -922057 -922067 -922069 -922073 -922079 -922081 -922087 -922099 -922123 -922169 -922211 -922217 -922223 -922237 -922247 -922261 -922283 -922289 -922291 -922303 -922309 -922321 -922331 -922333 -922351 -922357 -922367 -922391 -922423 -922451 -922457 -922463 -922487 -922489 -922499 -922511 -922513 -922517 -922531 -922549 -922561 -922601 -922613 -922619 -922627 -922631 -922637 -922639 -922643 -922667 -922679 -922681 -922699 -922717 -922729 -922739 -922741 -922781 -922807 -922813 -922853 -922861 -922897 -922907 -922931 -922973 -922993 -923017 -923023 -923029 -923047 -923051 -923053 -923107 -923123 -923129 -923137 -923141 -923147 -923171 -923177 -923179 -923183 -923201 -923203 -923227 -923233 -923239 -923249 -923309 -923311 -923333 -923341 -923347 -923369 -923371 -923387 -923399 -923407 -923411 -923437 -923441 -923449 -923453 -923467 -923471 -923501 -923509 -923513 -923539 -923543 -923551 -923561 -923567 -923579 -923581 -923591 -923599 -923603 -923617 -923641 -923653 -923687 -923693 -923701 -923711 -923719 -923743 -923773 -923789 -923809 -923833 -923849 -923851 -923861 -923869 -923903 -923917 -923929 -923939 -923947 -923953 -923959 -923963 -923971 -923977 -923983 -923987 -924019 -924023 -924031 -924037 -924041 -924043 -924059 -924073 -924083 -924097 -924101 -924109 -924139 -924151 -924173 -924191 -924197 -924241 -924269 -924281 -924283 -924299 -924323 -924337 -924359 -924361 -924383 -924397 -924401 -924403 -924419 -924421 -924431 -924437 -924463 -924493 -924499 -924503 -924523 -924527 -924529 -924551 -924557 -924601 -924617 -924641 -924643 -924659 -924661 -924683 -924697 -924709 -924713 -924719 -924727 -924731 -924743 -924751 -924757 -924769 -924773 -924779 -924793 -924809 -924811 -924827 -924829 -924841 -924871 -924877 -924881 -924907 -924929 -924961 -924967 -924997 -925019 -925027 -925033 -925039 -925051 -925063 -925073 -925079 -925081 -925087 -925097 -925103 -925109 -925117 -925121 -925147 -925153 -925159 -925163 -925181 -925189 -925193 -925217 -925237 -925241 -925271 -925273 -925279 -925291 -925307 -925339 -925349 -925369 -925373 -925387 -925391 -925399 -925409 -925423 -925447 -925469 -925487 -925499 -925501 -925513 -925517 -925523 -925559 -925577 -925579 -925597 -925607 -925619 -925621 -925637 -925649 -925663 -925669 -925679 -925697 -925721 -925733 -925741 -925783 -925789 -925823 -925831 -925843 -925849 -925891 -925901 -925913 -925921 -925937 -925943 -925949 -925961 -925979 -925987 -925997 -926017 -926027 -926033 -926077 -926087 -926089 -926099 -926111 -926113 -926129 -926131 -926153 -926161 -926171 -926179 -926183 -926203 -926227 -926239 -926251 -926273 -926293 -926309 -926327 -926351 -926353 -926357 -926377 -926389 -926399 -926411 -926423 -926437 -926461 -926467 -926489 -926503 -926507 -926533 -926537 -926557 -926561 -926567 -926581 -926587 -926617 -926623 -926633 -926657 -926659 -926669 -926671 -926689 -926701 -926707 -926741 -926747 -926767 -926777 -926797 -926803 -926819 -926843 -926851 -926867 -926879 -926899 -926903 -926921 -926957 -926963 -926971 -926977 -926983 -927001 -927007 -927013 -927049 -927077 -927083 -927089 -927097 -927137 -927149 -927161 -927167 -927187 -927191 -927229 -927233 -927259 -927287 -927301 -927313 -927317 -927323 -927361 -927373 -927397 -927403 -927431 -927439 -927491 -927497 -927517 -927529 -927533 -927541 -927557 -927569 -927587 -927629 -927631 -927643 -927649 -927653 -927671 -927677 -927683 -927709 -927727 -927743 -927763 -927769 -927779 -927791 -927803 -927821 -927833 -927841 -927847 -927853 -927863 -927869 -927961 -927967 -927973 -928001 -928043 -928051 -928063 -928079 -928097 -928099 -928111 -928139 -928141 -928153 -928157 -928159 -928163 -928177 -928223 -928231 -928253 -928267 -928271 -928273 -928289 -928307 -928313 -928331 -928337 -928351 -928399 -928409 -928423 -928427 -928429 -928453 -928457 -928463 -928469 -928471 -928513 -928547 -928559 -928561 -928597 -928607 -928619 -928621 -928637 -928643 -928649 -928651 -928661 -928679 -928699 -928703 -928769 -928771 -928787 -928793 -928799 -928813 -928817 -928819 -928849 -928859 -928871 -928883 -928903 -928913 -928927 -928933 -928979 -929003 -929009 -929011 -929023 -929029 -929051 -929057 -929059 -929063 -929069 -929077 -929083 -929087 -929113 -929129 -929141 -929153 -929161 -929171 -929197 -929207 -929209 -929239 -929251 -929261 -929281 -929293 -929303 -929311 -929323 -929333 -929381 -929389 -929393 -929399 -929417 -929419 -929431 -929459 -929483 -929497 -929501 -929507 -929527 -929549 -929557 -929561 -929573 -929581 -929587 -929609 -929623 -929627 -929629 -929639 -929641 -929647 -929671 -929693 -929717 -929737 -929741 -929743 -929749 -929777 -929791 -929807 -929809 -929813 -929843 -929861 -929869 -929881 -929891 -929897 -929941 -929953 -929963 -929977 -929983 -930011 -930043 -930071 -930073 -930077 -930079 -930089 -930101 -930113 -930119 -930157 -930173 -930179 -930187 -930191 -930197 -930199 -930211 -930229 -930269 -930277 -930283 -930287 -930289 -930301 -930323 -930337 -930379 -930389 -930409 -930437 -930467 -930469 -930481 -930491 -930499 -930509 -930547 -930551 -930569 -930571 -930583 -930593 -930617 -930619 -930637 -930653 -930667 -930689 -930707 -930719 -930737 -930749 -930763 -930773 -930779 -930817 -930827 -930841 -930847 -930859 -930863 -930889 -930911 -930931 -930973 -930977 -930989 -930991 -931003 -931013 -931067 -931087 -931097 -931123 -931127 -931129 -931153 -931163 -931169 -931181 -931193 -931199 -931213 -931237 -931241 -931267 -931289 -931303 -931309 -931313 -931319 -931351 -931363 -931387 -931417 -931421 -931487 -931499 -931517 -931529 -931537 -931543 -931571 -931573 -931577 -931597 -931621 -931639 -931657 -931691 -931709 -931727 -931729 -931739 -931747 -931751 -931757 -931781 -931783 -931789 -931811 -931837 -931849 -931859 -931873 -931877 -931883 -931901 -931907 -931913 -931921 -931933 -931943 -931949 -931967 -931981 -931999 -932003 -932021 -932039 -932051 -932081 -932101 -932117 -932119 -932131 -932149 -932153 -932177 -932189 -932203 -932207 -932209 -932219 -932221 -932227 -932231 -932257 -932303 -932317 -932333 -932341 -932353 -932357 -932413 -932417 -932419 -932431 -932441 -932447 -932471 -932473 -932483 -932497 -932513 -932521 -932537 -932549 -932557 -932563 -932567 -932579 -932587 -932593 -932597 -932609 -932647 -932651 -932663 -932677 -932681 -932683 -932749 -932761 -932779 -932783 -932801 -932803 -932819 -932839 -932863 -932879 -932887 -932917 -932923 -932927 -932941 -932947 -932951 -932963 -932969 -932983 -932999 -933001 -933019 -933047 -933059 -933061 -933067 -933073 -933151 -933157 -933173 -933199 -933209 -933217 -933221 -933241 -933259 -933263 -933269 -933293 -933301 -933313 -933319 -933329 -933349 -933389 -933397 -933403 -933407 -933421 -933433 -933463 -933479 -933497 -933523 -933551 -933553 -933563 -933601 -933607 -933613 -933643 -933649 -933671 -933677 -933703 -933707 -933739 -933761 -933781 -933787 -933797 -933809 -933811 -933817 -933839 -933847 -933851 -933853 -933883 -933893 -933923 -933931 -933943 -933949 -933953 -933967 -933973 -933979 -934001 -934009 -934033 -934039 -934049 -934051 -934057 -934067 -934069 -934079 -934111 -934117 -934121 -934127 -934151 -934159 -934187 -934223 -934229 -934243 -934253 -934259 -934277 -934291 -934301 -934319 -934343 -934387 -934393 -934399 -934403 -934429 -934441 -934463 -934469 -934481 -934487 -934489 -934499 -934517 -934523 -934537 -934543 -934547 -934561 -934567 -934579 -934597 -934603 -934607 -934613 -934639 -934669 -934673 -934693 -934721 -934723 -934733 -934753 -934763 -934771 -934793 -934799 -934811 -934831 -934837 -934853 -934861 -934883 -934889 -934891 -934897 -934907 -934909 -934919 -934939 -934943 -934951 -934961 -934979 -934981 -935003 -935021 -935023 -935059 -935063 -935071 -935093 -935107 -935113 -935147 -935149 -935167 -935183 -935189 -935197 -935201 -935213 -935243 -935257 -935261 -935303 -935339 -935353 -935359 -935377 -935381 -935393 -935399 -935413 -935423 -935443 -935447 -935461 -935489 -935507 -935513 -935531 -935537 -935581 -935587 -935591 -935593 -935603 -935621 -935639 -935651 -935653 -935677 -935687 -935689 -935699 -935707 -935717 -935719 -935761 -935771 -935777 -935791 -935813 -935819 -935827 -935839 -935843 -935861 -935899 -935903 -935971 -935999 -936007 -936029 -936053 -936097 -936113 -936119 -936127 -936151 -936161 -936179 -936181 -936197 -936203 -936223 -936227 -936233 -936253 -936259 -936281 -936283 -936311 -936319 -936329 -936361 -936379 -936391 -936401 -936407 -936413 -936437 -936451 -936469 -936487 -936493 -936499 -936511 -936521 -936527 -936539 -936557 -936577 -936587 -936599 -936619 -936647 -936659 -936667 -936673 -936679 -936697 -936709 -936713 -936731 -936737 -936739 -936769 -936773 -936779 -936797 -936811 -936827 -936869 -936889 -936907 -936911 -936917 -936919 -936937 -936941 -936953 -936967 -937003 -937007 -937009 -937031 -937033 -937049 -937067 -937121 -937127 -937147 -937151 -937171 -937187 -937207 -937229 -937231 -937241 -937243 -937253 -937331 -937337 -937351 -937373 -937379 -937421 -937429 -937459 -937463 -937477 -937481 -937501 -937511 -937537 -937571 -937577 -937589 -937591 -937613 -937627 -937633 -937637 -937639 -937661 -937663 -937667 -937679 -937681 -937693 -937709 -937721 -937747 -937751 -937777 -937789 -937801 -937813 -937819 -937823 -937841 -937847 -937877 -937883 -937891 -937901 -937903 -937919 -937927 -937943 -937949 -937969 -937991 -938017 -938023 -938027 -938033 -938051 -938053 -938057 -938059 -938071 -938083 -938089 -938099 -938107 -938117 -938129 -938183 -938207 -938219 -938233 -938243 -938251 -938257 -938263 -938279 -938293 -938309 -938323 -938341 -938347 -938351 -938359 -938369 -938387 -938393 -938437 -938447 -938453 -938459 -938491 -938507 -938533 -938537 -938563 -938569 -938573 -938591 -938611 -938617 -938659 -938677 -938681 -938713 -938747 -938761 -938803 -938807 -938827 -938831 -938843 -938857 -938869 -938879 -938881 -938921 -938939 -938947 -938953 -938963 -938969 -938981 -938983 -938989 -939007 -939011 -939019 -939061 -939089 -939091 -939109 -939119 -939121 -939157 -939167 -939179 -939181 -939193 -939203 -939229 -939247 -939287 -939293 -939299 -939317 -939347 -939349 -939359 -939361 -939373 -939377 -939391 -939413 -939431 -939439 -939443 -939451 -939469 -939487 -939511 -939551 -939581 -939599 -939611 -939613 -939623 -939649 -939661 -939677 -939707 -939713 -939737 -939739 -939749 -939767 -939769 -939773 -939791 -939793 -939823 -939839 -939847 -939853 -939871 -939881 -939901 -939923 -939931 -939971 -939973 -939989 -939997 -940001 -940003 -940019 -940031 -940067 -940073 -940087 -940097 -940127 -940157 -940169 -940183 -940189 -940201 -940223 -940229 -940241 -940249 -940259 -940271 -940279 -940297 -940301 -940319 -940327 -940349 -940351 -940361 -940369 -940399 -940403 -940421 -940469 -940477 -940483 -940501 -940523 -940529 -940531 -940543 -940547 -940549 -940553 -940573 -940607 -940619 -940649 -940669 -940691 -940703 -940721 -940727 -940733 -940739 -940759 -940781 -940783 -940787 -940801 -940813 -940817 -940829 -940853 -940871 -940879 -940889 -940903 -940913 -940921 -940931 -940949 -940957 -940981 -940993 -941009 -941011 -941023 -941027 -941041 -941093 -941099 -941117 -941119 -941123 -941131 -941153 -941159 -941167 -941179 -941201 -941207 -941209 -941221 -941249 -941251 -941263 -941267 -941299 -941309 -941323 -941329 -941351 -941359 -941383 -941407 -941429 -941441 -941449 -941453 -941461 -941467 -941471 -941489 -941491 -941503 -941509 -941513 -941519 -941537 -941557 -941561 -941573 -941593 -941599 -941609 -941617 -941641 -941653 -941663 -941669 -941671 -941683 -941701 -941723 -941737 -941741 -941747 -941753 -941771 -941791 -941813 -941839 -941861 -941879 -941903 -941911 -941929 -941933 -941947 -941971 -941981 -941989 -941999 -942013 -942017 -942031 -942037 -942041 -942043 -942049 -942061 -942079 -942091 -942101 -942113 -942143 -942163 -942167 -942169 -942187 -942199 -942217 -942223 -942247 -942257 -942269 -942301 -942311 -942313 -942317 -942341 -942367 -942371 -942401 -942433 -942437 -942439 -942449 -942479 -942509 -942521 -942527 -942541 -942569 -942577 -942583 -942593 -942607 -942637 -942653 -942659 -942661 -942691 -942709 -942719 -942727 -942749 -942763 -942779 -942787 -942811 -942827 -942847 -942853 -942857 -942859 -942869 -942883 -942889 -942899 -942901 -942917 -942943 -942979 -942983 -943003 -943009 -943013 -943031 -943043 -943057 -943073 -943079 -943081 -943091 -943097 -943127 -943139 -943153 -943157 -943183 -943199 -943213 -943219 -943231 -943249 -943273 -943277 -943289 -943301 -943303 -943307 -943321 -943343 -943357 -943363 -943367 -943373 -943387 -943403 -943409 -943421 -943429 -943471 -943477 -943499 -943511 -943541 -943543 -943567 -943571 -943589 -943601 -943603 -943637 -943651 -943693 -943699 -943729 -943741 -943751 -943757 -943763 -943769 -943777 -943781 -943783 -943799 -943801 -943819 -943837 -943841 -943843 -943849 -943871 -943903 -943909 -943913 -943931 -943951 -943967 -944003 -944017 -944029 -944039 -944071 -944077 -944123 -944137 -944143 -944147 -944149 -944161 -944179 -944191 -944233 -944239 -944257 -944261 -944263 -944297 -944309 -944329 -944369 -944387 -944389 -944393 -944399 -944417 -944429 -944431 -944453 -944467 -944473 -944491 -944497 -944519 -944521 -944527 -944533 -944543 -944551 -944561 -944563 -944579 -944591 -944609 -944621 -944651 -944659 -944677 -944687 -944689 -944701 -944711 -944717 -944729 -944731 -944773 -944777 -944803 -944821 -944833 -944857 -944873 -944887 -944893 -944897 -944899 -944929 -944953 -944963 -944969 -944987 -945031 -945037 -945059 -945089 -945103 -945143 -945151 -945179 -945209 -945211 -945227 -945233 -945289 -945293 -945331 -945341 -945349 -945359 -945367 -945377 -945389 -945391 -945397 -945409 -945431 -945457 -945463 -945473 -945479 -945481 -945521 -945547 -945577 -945587 -945589 -945601 -945629 -945631 -945647 -945671 -945673 -945677 -945701 -945731 -945733 -945739 -945767 -945787 -945799 -945809 -945811 -945817 -945823 -945851 -945881 -945883 -945887 -945899 -945907 -945929 -945937 -945941 -945943 -945949 -945961 -945983 -946003 -946021 -946031 -946037 -946079 -946081 -946091 -946093 -946109 -946111 -946123 -946133 -946163 -946177 -946193 -946207 -946223 -946249 -946273 -946291 -946307 -946327 -946331 -946367 -946369 -946391 -946397 -946411 -946417 -946453 -946459 -946469 -946487 -946489 -946507 -946511 -946513 -946549 -946573 -946579 -946607 -946661 -946663 -946667 -946669 -946681 -946697 -946717 -946727 -946733 -946741 -946753 -946769 -946783 -946801 -946819 -946823 -946853 -946859 -946861 -946873 -946877 -946901 -946919 -946931 -946943 -946949 -946961 -946969 -946987 -946993 -946997 -947027 -947033 -947083 -947119 -947129 -947137 -947171 -947183 -947197 -947203 -947239 -947263 -947299 -947327 -947341 -947351 -947357 -947369 -947377 -947381 -947383 -947389 -947407 -947411 -947413 -947417 -947423 -947431 -947449 -947483 -947501 -947509 -947539 -947561 -947579 -947603 -947621 -947627 -947641 -947647 -947651 -947659 -947707 -947711 -947719 -947729 -947741 -947743 -947747 -947753 -947773 -947783 -947803 -947819 -947833 -947851 -947857 -947861 -947873 -947893 -947911 -947917 -947927 -947959 -947963 -947987 -948007 -948019 -948029 -948041 -948049 -948053 -948061 -948067 -948089 -948091 -948133 -948139 -948149 -948151 -948169 -948173 -948187 -948247 -948253 -948263 -948281 -948287 -948293 -948317 -948331 -948349 -948377 -948391 -948401 -948403 -948407 -948427 -948439 -948443 -948449 -948457 -948469 -948487 -948517 -948533 -948547 -948551 -948557 -948581 -948593 -948659 -948671 -948707 -948713 -948721 -948749 -948767 -948797 -948799 -948839 -948847 -948853 -948877 -948887 -948901 -948907 -948929 -948943 -948947 -948971 -948973 -948989 -949001 -949019 -949021 -949033 -949037 -949043 -949051 -949111 -949121 -949129 -949147 -949153 -949159 -949171 -949211 -949213 -949241 -949243 -949253 -949261 -949303 -949307 -949381 -949387 -949391 -949409 -949423 -949427 -949439 -949441 -949451 -949453 -949471 -949477 -949513 -949517 -949523 -949567 -949583 -949589 -949607 -949609 -949621 -949631 -949633 -949643 -949649 -949651 -949667 -949673 -949687 -949691 -949699 -949733 -949759 -949771 -949777 -949789 -949811 -949849 -949853 -949889 -949891 -949903 -949931 -949937 -949939 -949951 -949957 -949961 -949967 -949973 -949979 -949987 -949997 -950009 -950023 -950029 -950039 -950041 -950071 -950083 -950099 -950111 -950149 -950161 -950177 -950179 -950207 -950221 -950227 -950231 -950233 -950239 -950251 -950269 -950281 -950329 -950333 -950347 -950357 -950363 -950393 -950401 -950423 -950447 -950459 -950461 -950473 -950479 -950483 -950497 -950501 -950507 -950519 -950527 -950531 -950557 -950569 -950611 -950617 -950633 -950639 -950647 -950671 -950681 -950689 -950693 -950699 -950717 -950723 -950737 -950743 -950753 -950783 -950791 -950809 -950813 -950819 -950837 -950839 -950867 -950869 -950879 -950921 -950927 -950933 -950947 -950953 -950959 -950993 -951001 -951019 -951023 -951029 -951047 -951053 -951059 -951061 -951079 -951089 -951091 -951101 -951107 -951109 -951131 -951151 -951161 -951193 -951221 -951259 -951277 -951281 -951283 -951299 -951331 -951341 -951343 -951361 -951367 -951373 -951389 -951407 -951413 -951427 -951437 -951449 -951469 -951479 -951491 -951497 -951553 -951557 -951571 -951581 -951583 -951589 -951623 -951637 -951641 -951647 -951649 -951659 -951689 -951697 -951749 -951781 -951787 -951791 -951803 -951829 -951851 -951859 -951887 -951893 -951911 -951941 -951943 -951959 -951967 -951997 -952001 -952009 -952037 -952057 -952073 -952087 -952097 -952111 -952117 -952123 -952129 -952141 -952151 -952163 -952169 -952183 -952199 -952207 -952219 -952229 -952247 -952253 -952277 -952279 -952291 -952297 -952313 -952349 -952363 -952379 -952381 -952397 -952423 -952429 -952439 -952481 -952487 -952507 -952513 -952541 -952547 -952559 -952573 -952583 -952597 -952619 -952649 -952657 -952667 -952669 -952681 -952687 -952691 -952709 -952739 -952741 -952753 -952771 -952789 -952811 -952813 -952823 -952829 -952843 -952859 -952873 -952877 -952883 -952921 -952927 -952933 -952937 -952943 -952957 -952967 -952979 -952981 -952997 -953023 -953039 -953041 -953053 -953077 -953081 -953093 -953111 -953131 -953149 -953171 -953179 -953191 -953221 -953237 -953243 -953261 -953273 -953297 -953321 -953333 -953341 -953347 -953399 -953431 -953437 -953443 -953473 -953483 -953497 -953501 -953503 -953507 -953521 -953539 -953543 -953551 -953567 -953593 -953621 -953639 -953647 -953651 -953671 -953681 -953699 -953707 -953731 -953747 -953773 -953789 -953791 -953831 -953851 -953861 -953873 -953881 -953917 -953923 -953929 -953941 -953969 -953977 -953983 -953987 -954001 -954007 -954011 -954043 -954067 -954097 -954103 -954131 -954133 -954139 -954157 -954167 -954181 -954203 -954209 -954221 -954229 -954253 -954257 -954259 -954263 -954269 -954277 -954287 -954307 -954319 -954323 -954367 -954377 -954379 -954391 -954409 -954433 -954451 -954461 -954469 -954491 -954497 -954509 -954517 -954539 -954571 -954599 -954619 -954623 -954641 -954649 -954671 -954677 -954697 -954713 -954719 -954727 -954743 -954757 -954763 -954827 -954829 -954847 -954851 -954853 -954857 -954869 -954871 -954911 -954917 -954923 -954929 -954971 -954973 -954977 -954979 -954991 -955037 -955039 -955051 -955061 -955063 -955091 -955093 -955103 -955127 -955139 -955147 -955153 -955183 -955193 -955211 -955217 -955223 -955243 -955261 -955267 -955271 -955277 -955307 -955309 -955313 -955319 -955333 -955337 -955363 -955379 -955391 -955433 -955439 -955441 -955457 -955469 -955477 -955481 -955483 -955501 -955511 -955541 -955601 -955607 -955613 -955649 -955657 -955693 -955697 -955709 -955711 -955727 -955729 -955769 -955777 -955781 -955793 -955807 -955813 -955819 -955841 -955853 -955879 -955883 -955891 -955901 -955919 -955937 -955939 -955951 -955957 -955963 -955967 -955987 -955991 -955993 -956003 -956051 -956057 -956083 -956107 -956113 -956119 -956143 -956147 -956177 -956231 -956237 -956261 -956269 -956273 -956281 -956303 -956311 -956341 -956353 -956357 -956377 -956383 -956387 -956393 -956399 -956401 -956429 -956477 -956503 -956513 -956521 -956569 -956587 -956617 -956633 -956689 -956699 -956713 -956723 -956749 -956759 -956789 -956801 -956831 -956843 -956849 -956861 -956881 -956903 -956909 -956929 -956941 -956951 -956953 -956987 -956993 -956999 -957031 -957037 -957041 -957043 -957059 -957071 -957091 -957097 -957107 -957109 -957119 -957133 -957139 -957161 -957169 -957181 -957193 -957211 -957221 -957241 -957247 -957263 -957289 -957317 -957331 -957337 -957349 -957361 -957403 -957409 -957413 -957419 -957431 -957433 -957499 -957529 -957547 -957553 -957557 -957563 -957587 -957599 -957601 -957611 -957641 -957643 -957659 -957701 -957703 -957709 -957721 -957731 -957751 -957769 -957773 -957811 -957821 -957823 -957851 -957871 -957877 -957889 -957917 -957937 -957949 -957953 -957959 -957977 -957991 -958007 -958021 -958039 -958043 -958049 -958051 -958057 -958063 -958121 -958123 -958141 -958159 -958163 -958183 -958193 -958213 -958259 -958261 -958289 -958313 -958319 -958327 -958333 -958339 -958343 -958351 -958357 -958361 -958367 -958369 -958381 -958393 -958423 -958439 -958459 -958481 -958487 -958499 -958501 -958519 -958523 -958541 -958543 -958547 -958549 -958553 -958577 -958609 -958627 -958637 -958667 -958669 -958673 -958679 -958687 -958693 -958729 -958739 -958777 -958787 -958807 -958819 -958829 -958843 -958849 -958871 -958877 -958883 -958897 -958901 -958921 -958931 -958933 -958957 -958963 -958967 -958973 -959009 -959083 -959093 -959099 -959131 -959143 -959149 -959159 -959173 -959183 -959207 -959209 -959219 -959227 -959237 -959263 -959267 -959269 -959279 -959323 -959333 -959339 -959351 -959363 -959369 -959377 -959383 -959389 -959449 -959461 -959467 -959471 -959473 -959477 -959479 -959489 -959533 -959561 -959579 -959597 -959603 -959617 -959627 -959659 -959677 -959681 -959689 -959719 -959723 -959737 -959759 -959773 -959779 -959801 -959809 -959831 -959863 -959867 -959869 -959873 -959879 -959887 -959911 -959921 -959927 -959941 -959947 -959953 -959969 -960017 -960019 -960031 -960049 -960053 -960059 -960077 -960119 -960121 -960131 -960137 -960139 -960151 -960173 -960191 -960199 -960217 -960229 -960251 -960259 -960293 -960299 -960329 -960331 -960341 -960353 -960373 -960383 -960389 -960419 -960467 -960493 -960497 -960499 -960521 -960523 -960527 -960569 -960581 -960587 -960593 -960601 -960637 -960643 -960647 -960649 -960667 -960677 -960691 -960703 -960709 -960737 -960763 -960793 -960803 -960809 -960829 -960833 -960863 -960889 -960931 -960937 -960941 -960961 -960977 -960983 -960989 -960991 -961003 -961021 -961033 -961063 -961067 -961069 -961073 -961087 -961091 -961097 -961099 -961109 -961117 -961123 -961133 -961139 -961141 -961151 -961157 -961159 -961183 -961187 -961189 -961201 -961241 -961243 -961273 -961277 -961283 -961313 -961319 -961339 -961393 -961397 -961399 -961427 -961447 -961451 -961453 -961459 -961487 -961507 -961511 -961529 -961531 -961547 -961549 -961567 -961601 -961613 -961619 -961627 -961633 -961637 -961643 -961657 -961661 -961663 -961679 -961687 -961691 -961703 -961729 -961733 -961739 -961747 -961757 -961769 -961777 -961783 -961789 -961811 -961813 -961817 -961841 -961847 -961853 -961861 -961871 -961879 -961927 -961937 -961943 -961957 -961973 -961981 -961991 -961993 -962009 -962011 -962033 -962041 -962051 -962063 -962077 -962099 -962119 -962131 -962161 -962177 -962197 -962233 -962237 -962243 -962257 -962267 -962303 -962309 -962341 -962363 -962413 -962417 -962431 -962441 -962447 -962459 -962461 -962471 -962477 -962497 -962503 -962509 -962537 -962543 -962561 -962569 -962587 -962603 -962609 -962617 -962623 -962627 -962653 -962669 -962671 -962677 -962681 -962683 -962737 -962743 -962747 -962779 -962783 -962789 -962791 -962807 -962837 -962839 -962861 -962867 -962869 -962903 -962909 -962911 -962921 -962959 -962963 -962971 -962993 -963019 -963031 -963043 -963047 -963097 -963103 -963121 -963143 -963163 -963173 -963181 -963187 -963191 -963211 -963223 -963227 -963239 -963241 -963253 -963283 -963299 -963301 -963311 -963323 -963331 -963341 -963343 -963349 -963367 -963379 -963397 -963419 -963427 -963461 -963481 -963491 -963497 -963499 -963559 -963581 -963601 -963607 -963629 -963643 -963653 -963659 -963667 -963689 -963691 -963701 -963707 -963709 -963719 -963731 -963751 -963761 -963763 -963779 -963793 -963799 -963811 -963817 -963839 -963841 -963847 -963863 -963871 -963877 -963899 -963901 -963913 -963943 -963973 -963979 -964009 -964021 -964027 -964039 -964049 -964081 -964097 -964133 -964151 -964153 -964199 -964207 -964213 -964217 -964219 -964253 -964259 -964261 -964267 -964283 -964289 -964297 -964303 -964309 -964333 -964339 -964351 -964357 -964363 -964373 -964417 -964423 -964433 -964463 -964499 -964501 -964507 -964517 -964519 -964531 -964559 -964571 -964577 -964583 -964589 -964609 -964637 -964661 -964679 -964693 -964697 -964703 -964721 -964753 -964757 -964783 -964787 -964793 -964823 -964829 -964861 -964871 -964879 -964883 -964889 -964897 -964913 -964927 -964933 -964939 -964967 -964969 -964973 -964981 -965023 -965047 -965059 -965087 -965089 -965101 -965113 -965117 -965131 -965147 -965161 -965171 -965177 -965179 -965189 -965191 -965197 -965201 -965227 -965233 -965249 -965267 -965291 -965303 -965317 -965329 -965357 -965369 -965399 -965401 -965407 -965411 -965423 -965429 -965443 -965453 -965467 -965483 -965491 -965507 -965519 -965533 -965551 -965567 -965603 -965611 -965621 -965623 -965639 -965647 -965659 -965677 -965711 -965749 -965759 -965773 -965777 -965779 -965791 -965801 -965843 -965851 -965857 -965893 -965927 -965953 -965963 -965969 -965983 -965989 -966011 -966013 -966029 -966041 -966109 -966113 -966139 -966149 -966157 -966191 -966197 -966209 -966211 -966221 -966227 -966233 -966241 -966257 -966271 -966293 -966307 -966313 -966319 -966323 -966337 -966347 -966353 -966373 -966377 -966379 -966389 -966401 -966409 -966419 -966431 -966439 -966463 -966481 -966491 -966499 -966509 -966521 -966527 -966547 -966557 -966583 -966613 -966617 -966619 -966631 -966653 -966659 -966661 -966677 -966727 -966751 -966781 -966803 -966817 -966863 -966869 -966871 -966883 -966893 -966907 -966913 -966919 -966923 -966937 -966961 -966971 -966991 -966997 -967003 -967019 -967049 -967061 -967111 -967129 -967139 -967171 -967201 -967229 -967259 -967261 -967289 -967297 -967319 -967321 -967327 -967333 -967349 -967361 -967363 -967391 -967397 -967427 -967429 -967441 -967451 -967459 -967481 -967493 -967501 -967507 -967511 -967529 -967567 -967583 -967607 -967627 -967663 -967667 -967693 -967699 -967709 -967721 -967739 -967751 -967753 -967763 -967781 -967787 -967819 -967823 -967831 -967843 -967847 -967859 -967873 -967877 -967903 -967919 -967931 -967937 -967951 -967961 -967979 -967999 -968003 -968017 -968021 -968027 -968041 -968063 -968089 -968101 -968111 -968113 -968117 -968137 -968141 -968147 -968159 -968173 -968197 -968213 -968237 -968239 -968251 -968263 -968267 -968273 -968291 -968299 -968311 -968321 -968329 -968333 -968353 -968377 -968381 -968389 -968419 -968423 -968431 -968437 -968459 -968467 -968479 -968501 -968503 -968519 -968521 -968537 -968557 -968567 -968573 -968593 -968641 -968647 -968659 -968663 -968689 -968699 -968713 -968729 -968731 -968761 -968801 -968809 -968819 -968827 -968831 -968857 -968879 -968897 -968909 -968911 -968917 -968939 -968959 -968963 -968971 -969011 -969037 -969041 -969049 -969071 -969083 -969097 -969109 -969113 -969131 -969139 -969167 -969179 -969181 -969233 -969239 -969253 -969257 -969259 -969271 -969301 -969341 -969343 -969347 -969359 -969377 -969403 -969407 -969421 -969431 -969433 -969443 -969457 -969461 -969467 -969481 -969497 -969503 -969509 -969533 -969559 -969569 -969593 -969599 -969637 -969641 -969667 -969671 -969677 -969679 -969713 -969719 -969721 -969743 -969757 -969763 -969767 -969791 -969797 -969809 -969821 -969851 -969863 -969869 -969877 -969889 -969907 -969911 -969919 -969923 -969929 -969977 -969989 -970027 -970031 -970043 -970051 -970061 -970063 -970069 -970087 -970091 -970111 -970133 -970147 -970201 -970213 -970217 -970219 -970231 -970237 -970247 -970259 -970261 -970267 -970279 -970297 -970303 -970313 -970351 -970391 -970421 -970423 -970433 -970441 -970447 -970457 -970469 -970481 -970493 -970537 -970549 -970561 -970573 -970583 -970603 -970633 -970643 -970657 -970667 -970687 -970699 -970721 -970747 -970777 -970787 -970789 -970793 -970799 -970813 -970817 -970829 -970847 -970859 -970861 -970867 -970877 -970883 -970903 -970909 -970927 -970939 -970943 -970961 -970967 -970969 -970987 -970997 -970999 -971021 -971027 -971029 -971039 -971051 -971053 -971063 -971077 -971093 -971099 -971111 -971141 -971143 -971149 -971153 -971171 -971177 -971197 -971207 -971237 -971251 -971263 -971273 -971279 -971281 -971291 -971309 -971339 -971353 -971357 -971371 -971381 -971387 -971389 -971401 -971419 -971429 -971441 -971473 -971479 -971483 -971491 -971501 -971513 -971521 -971549 -971561 -971563 -971569 -971591 -971639 -971651 -971653 -971683 -971693 -971699 -971713 -971723 -971753 -971759 -971767 -971783 -971821 -971833 -971851 -971857 -971863 -971899 -971903 -971917 -971921 -971933 -971939 -971951 -971959 -971977 -971981 -971989 -972001 -972017 -972029 -972031 -972047 -972071 -972079 -972091 -972113 -972119 -972121 -972131 -972133 -972137 -972161 -972163 -972197 -972199 -972221 -972227 -972229 -972259 -972263 -972271 -972277 -972313 -972319 -972329 -972337 -972343 -972347 -972353 -972373 -972403 -972407 -972409 -972427 -972431 -972443 -972469 -972473 -972481 -972493 -972533 -972557 -972577 -972581 -972599 -972611 -972613 -972623 -972637 -972649 -972661 -972679 -972683 -972701 -972721 -972787 -972793 -972799 -972823 -972827 -972833 -972847 -972869 -972887 -972899 -972901 -972941 -972943 -972967 -972977 -972991 -973001 -973003 -973031 -973033 -973051 -973057 -973067 -973069 -973073 -973081 -973099 -973129 -973151 -973169 -973177 -973187 -973213 -973253 -973277 -973279 -973283 -973289 -973321 -973331 -973333 -973367 -973373 -973387 -973397 -973409 -973411 -973421 -973439 -973459 -973487 -973523 -973529 -973537 -973547 -973561 -973591 -973597 -973631 -973657 -973669 -973681 -973691 -973727 -973757 -973759 -973781 -973787 -973789 -973801 -973813 -973823 -973837 -973853 -973891 -973897 -973901 -973919 -973957 -974003 -974009 -974033 -974041 -974053 -974063 -974089 -974107 -974123 -974137 -974143 -974147 -974159 -974161 -974167 -974177 -974179 -974189 -974213 -974249 -974261 -974269 -974273 -974279 -974293 -974317 -974329 -974359 -974383 -974387 -974401 -974411 -974417 -974419 -974431 -974437 -974443 -974459 -974473 -974489 -974497 -974507 -974513 -974531 -974537 -974539 -974551 -974557 -974563 -974581 -974591 -974599 -974651 -974653 -974657 -974707 -974711 -974713 -974737 -974747 -974749 -974761 -974773 -974803 -974819 -974821 -974837 -974849 -974861 -974863 -974867 -974873 -974879 -974887 -974891 -974923 -974927 -974957 -974959 -974969 -974971 -974977 -974983 -974989 -974999 -975011 -975017 -975049 -975053 -975071 -975083 -975089 -975133 -975151 -975157 -975181 -975187 -975193 -975199 -975217 -975257 -975259 -975263 -975277 -975281 -975287 -975313 -975323 -975343 -975367 -975379 -975383 -975389 -975421 -975427 -975433 -975439 -975463 -975493 -975497 -975509 -975521 -975523 -975551 -975553 -975581 -975599 -975619 -975629 -975643 -975649 -975661 -975671 -975691 -975701 -975731 -975739 -975743 -975797 -975803 -975811 -975823 -975827 -975847 -975857 -975869 -975883 -975899 -975901 -975907 -975941 -975943 -975967 -975977 -975991 -976009 -976013 -976033 -976039 -976091 -976093 -976103 -976109 -976117 -976127 -976147 -976177 -976187 -976193 -976211 -976231 -976253 -976271 -976279 -976301 -976303 -976307 -976309 -976351 -976369 -976403 -976411 -976439 -976447 -976453 -976457 -976471 -976477 -976483 -976489 -976501 -976513 -976537 -976553 -976559 -976561 -976571 -976601 -976607 -976621 -976637 -976639 -976643 -976669 -976699 -976709 -976721 -976727 -976777 -976799 -976817 -976823 -976849 -976853 -976883 -976909 -976919 -976933 -976951 -976957 -976991 -977021 -977023 -977047 -977057 -977069 -977087 -977107 -977147 -977149 -977167 -977183 -977191 -977203 -977209 -977233 -977239 -977243 -977257 -977269 -977299 -977323 -977351 -977357 -977359 -977363 -977369 -977407 -977411 -977413 -977437 -977447 -977507 -977513 -977521 -977539 -977567 -977591 -977593 -977609 -977611 -977629 -977671 -977681 -977693 -977719 -977723 -977747 -977761 -977791 -977803 -977813 -977819 -977831 -977849 -977861 -977881 -977897 -977923 -977927 -977971 -978001 -978007 -978011 -978017 -978031 -978037 -978041 -978049 -978053 -978067 -978071 -978073 -978077 -978079 -978091 -978113 -978149 -978151 -978157 -978179 -978181 -978203 -978209 -978217 -978223 -978233 -978239 -978269 -978277 -978283 -978287 -978323 -978337 -978343 -978347 -978349 -978359 -978389 -978403 -978413 -978427 -978449 -978457 -978463 -978473 -978479 -978491 -978511 -978521 -978541 -978569 -978599 -978611 -978617 -978619 -978643 -978647 -978683 -978689 -978697 -978713 -978727 -978743 -978749 -978773 -978797 -978799 -978821 -978839 -978851 -978853 -978863 -978871 -978883 -978907 -978917 -978931 -978947 -978973 -978997 -979001 -979009 -979031 -979037 -979061 -979063 -979093 -979103 -979109 -979117 -979159 -979163 -979171 -979177 -979189 -979201 -979207 -979211 -979219 -979229 -979261 -979273 -979283 -979291 -979313 -979327 -979333 -979337 -979343 -979361 -979369 -979373 -979379 -979403 -979423 -979439 -979457 -979471 -979481 -979519 -979529 -979541 -979543 -979549 -979553 -979567 -979651 -979691 -979709 -979717 -979747 -979757 -979787 -979807 -979819 -979831 -979873 -979883 -979889 -979907 -979919 -979921 -979949 -979969 -979987 -980027 -980047 -980069 -980071 -980081 -980107 -980117 -980131 -980137 -980149 -980159 -980173 -980179 -980197 -980219 -980249 -980261 -980293 -980299 -980321 -980327 -980363 -980377 -980393 -980401 -980417 -980423 -980431 -980449 -980459 -980471 -980489 -980491 -980503 -980549 -980557 -980579 -980587 -980591 -980593 -980599 -980621 -980641 -980677 -980687 -980689 -980711 -980717 -980719 -980729 -980731 -980773 -980801 -980803 -980827 -980831 -980851 -980887 -980893 -980897 -980899 -980909 -980911 -980921 -980957 -980963 -980999 -981011 -981017 -981023 -981037 -981049 -981061 -981067 -981073 -981077 -981091 -981133 -981137 -981139 -981151 -981173 -981187 -981199 -981209 -981221 -981241 -981263 -981271 -981283 -981287 -981289 -981301 -981311 -981319 -981373 -981377 -981391 -981397 -981419 -981437 -981439 -981443 -981451 -981467 -981473 -981481 -981493 -981517 -981523 -981527 -981569 -981577 -981587 -981599 -981601 -981623 -981637 -981653 -981683 -981691 -981697 -981703 -981707 -981713 -981731 -981769 -981797 -981809 -981811 -981817 -981823 -981887 -981889 -981913 -981919 -981941 -981947 -981949 -981961 -981979 -981983 -982021 -982057 -982061 -982063 -982067 -982087 -982097 -982099 -982103 -982117 -982133 -982147 -982151 -982171 -982183 -982187 -982211 -982213 -982217 -982231 -982271 -982273 -982301 -982321 -982337 -982339 -982343 -982351 -982363 -982381 -982393 -982403 -982453 -982489 -982493 -982559 -982571 -982573 -982577 -982589 -982603 -982613 -982621 -982633 -982643 -982687 -982693 -982697 -982703 -982741 -982759 -982769 -982777 -982783 -982789 -982801 -982819 -982829 -982841 -982843 -982847 -982867 -982871 -982903 -982909 -982931 -982939 -982967 -982973 -982981 -983063 -983069 -983083 -983113 -983119 -983123 -983131 -983141 -983149 -983153 -983173 -983179 -983189 -983197 -983209 -983233 -983239 -983243 -983261 -983267 -983299 -983317 -983327 -983329 -983347 -983363 -983371 -983377 -983407 -983429 -983431 -983441 -983443 -983447 -983449 -983461 -983491 -983513 -983519 -983527 -983531 -983533 -983557 -983579 -983581 -983597 -983617 -983659 -983699 -983701 -983737 -983771 -983777 -983783 -983789 -983791 -983803 -983809 -983813 -983819 -983849 -983861 -983863 -983881 -983911 -983923 -983929 -983951 -983987 -983993 -984007 -984017 -984037 -984047 -984059 -984083 -984091 -984119 -984121 -984127 -984149 -984167 -984199 -984211 -984241 -984253 -984299 -984301 -984307 -984323 -984329 -984337 -984341 -984349 -984353 -984359 -984367 -984383 -984391 -984397 -984407 -984413 -984421 -984427 -984437 -984457 -984461 -984481 -984491 -984497 -984539 -984541 -984563 -984583 -984587 -984593 -984611 -984617 -984667 -984689 -984701 -984703 -984707 -984733 -984749 -984757 -984761 -984817 -984847 -984853 -984859 -984877 -984881 -984911 -984913 -984917 -984923 -984931 -984947 -984959 -985003 -985007 -985013 -985027 -985057 -985063 -985079 -985097 -985109 -985121 -985129 -985151 -985177 -985181 -985213 -985219 -985253 -985277 -985279 -985291 -985301 -985307 -985331 -985339 -985351 -985379 -985399 -985403 -985417 -985433 -985447 -985451 -985463 -985471 -985483 -985487 -985493 -985499 -985519 -985529 -985531 -985547 -985571 -985597 -985601 -985613 -985631 -985639 -985657 -985667 -985679 -985703 -985709 -985723 -985729 -985741 -985759 -985781 -985783 -985799 -985807 -985819 -985867 -985871 -985877 -985903 -985921 -985937 -985951 -985969 -985973 -985979 -985981 -985991 -985993 -985997 -986023 -986047 -986053 -986071 -986101 -986113 -986131 -986137 -986143 -986147 -986149 -986177 -986189 -986191 -986197 -986207 -986213 -986239 -986257 -986267 -986281 -986287 -986333 -986339 -986351 -986369 -986411 -986417 -986429 -986437 -986471 -986477 -986497 -986507 -986509 -986519 -986533 -986543 -986563 -986567 -986569 -986581 -986593 -986597 -986599 -986617 -986633 -986641 -986659 -986693 -986707 -986717 -986719 -986729 -986737 -986749 -986759 -986767 -986779 -986801 -986813 -986819 -986837 -986849 -986851 -986857 -986903 -986927 -986929 -986933 -986941 -986959 -986963 -986981 -986983 -986989 -987013 -987023 -987029 -987043 -987053 -987061 -987067 -987079 -987083 -987089 -987097 -987101 -987127 -987143 -987191 -987193 -987199 -987209 -987211 -987227 -987251 -987293 -987299 -987313 -987353 -987361 -987383 -987391 -987433 -987457 -987463 -987473 -987491 -987509 -987523 -987533 -987541 -987559 -987587 -987593 -987599 -987607 -987631 -987659 -987697 -987713 -987739 -987793 -987797 -987803 -987809 -987821 -987851 -987869 -987911 -987913 -987929 -987941 -987971 -987979 -987983 -987991 -987997 -988007 -988021 -988033 -988051 -988061 -988067 -988069 -988093 -988109 -988111 -988129 -988147 -988157 -988199 -988213 -988217 -988219 -988231 -988237 -988243 -988271 -988279 -988297 -988313 -988319 -988321 -988343 -988357 -988367 -988409 -988417 -988439 -988453 -988459 -988483 -988489 -988501 -988511 -988541 -988549 -988571 -988577 -988579 -988583 -988591 -988607 -988643 -988649 -988651 -988661 -988681 -988693 -988711 -988727 -988733 -988759 -988763 -988783 -988789 -988829 -988837 -988849 -988859 -988861 -988877 -988901 -988909 -988937 -988951 -988963 -988979 -989011 -989029 -989059 -989071 -989081 -989099 -989119 -989123 -989171 -989173 -989231 -989239 -989249 -989251 -989279 -989293 -989309 -989321 -989323 -989327 -989341 -989347 -989353 -989377 -989381 -989411 -989419 -989423 -989441 -989467 -989477 -989479 -989507 -989533 -989557 -989561 -989579 -989581 -989623 -989629 -989641 -989647 -989663 -989671 -989687 -989719 -989743 -989749 -989753 -989761 -989777 -989783 -989797 -989803 -989827 -989831 -989837 -989839 -989869 -989873 -989887 -989909 -989917 -989921 -989929 -989939 -989951 -989959 -989971 -989977 -989981 -989999 -990001 -990013 -990023 -990037 -990043 -990053 -990137 -990151 -990163 -990169 -990179 -990181 -990211 -990239 -990259 -990277 -990281 -990287 -990289 -990293 -990307 -990313 -990323 -990329 -990331 -990349 -990359 -990361 -990371 -990377 -990383 -990389 -990397 -990463 -990469 -990487 -990497 -990503 -990511 -990523 -990529 -990547 -990559 -990589 -990593 -990599 -990631 -990637 -990643 -990673 -990707 -990719 -990733 -990761 -990767 -990797 -990799 -990809 -990841 -990851 -990881 -990887 -990889 -990893 -990917 -990923 -990953 -990961 -990967 -990973 -990989 -991009 -991027 -991031 -991037 -991043 -991057 -991063 -991069 -991073 -991079 -991091 -991127 -991129 -991147 -991171 -991181 -991187 -991201 -991217 -991223 -991229 -991261 -991273 -991313 -991327 -991343 -991357 -991381 -991387 -991409 -991427 -991429 -991447 -991453 -991483 -991493 -991499 -991511 -991531 -991541 -991547 -991567 -991579 -991603 -991607 -991619 -991621 -991633 -991643 -991651 -991663 -991693 -991703 -991717 -991723 -991733 -991741 -991751 -991777 -991811 -991817 -991867 -991871 -991873 -991883 -991889 -991901 -991909 -991927 -991931 -991943 -991951 -991957 -991961 -991973 -991979 -991981 -991987 -991999 -992011 -992021 -992023 -992051 -992087 -992111 -992113 -992129 -992141 -992153 -992179 -992183 -992219 -992231 -992249 -992263 -992267 -992269 -992281 -992309 -992317 -992357 -992359 -992363 -992371 -992393 -992417 -992429 -992437 -992441 -992449 -992461 -992513 -992521 -992539 -992549 -992561 -992591 -992603 -992609 -992623 -992633 -992659 -992689 -992701 -992707 -992723 -992737 -992777 -992801 -992809 -992819 -992843 -992857 -992861 -992863 -992867 -992891 -992903 -992917 -992923 -992941 -992947 -992963 -992983 -993001 -993011 -993037 -993049 -993053 -993079 -993103 -993107 -993121 -993137 -993169 -993197 -993199 -993203 -993211 -993217 -993233 -993241 -993247 -993253 -993269 -993283 -993287 -993319 -993323 -993341 -993367 -993397 -993401 -993407 -993431 -993437 -993451 -993467 -993479 -993481 -993493 -993527 -993541 -993557 -993589 -993611 -993617 -993647 -993679 -993683 -993689 -993703 -993763 -993779 -993781 -993793 -993821 -993823 -993827 -993841 -993851 -993869 -993887 -993893 -993907 -993913 -993919 -993943 -993961 -993977 -993983 -993997 -994013 -994027 -994039 -994051 -994067 -994069 -994073 -994087 -994093 -994141 -994163 -994181 -994183 -994193 -994199 -994229 -994237 -994241 -994247 -994249 -994271 -994297 -994303 -994307 -994309 -994319 -994321 -994337 -994339 -994363 -994369 -994391 -994393 -994417 -994447 -994453 -994457 -994471 -994489 -994501 -994549 -994559 -994561 -994571 -994579 -994583 -994603 -994621 -994657 -994663 -994667 -994691 -994699 -994709 -994711 -994717 -994723 -994751 -994769 -994793 -994811 -994813 -994817 -994831 -994837 -994853 -994867 -994871 -994879 -994901 -994907 -994913 -994927 -994933 -994949 -994963 -994991 -994997 -995009 -995023 -995051 -995053 -995081 -995117 -995119 -995147 -995167 -995173 -995219 -995227 -995237 -995243 -995273 -995303 -995327 -995329 -995339 -995341 -995347 -995363 -995369 -995377 -995381 -995387 -995399 -995431 -995443 -995447 -995461 -995471 -995513 -995531 -995539 -995549 -995551 -995567 -995573 -995587 -995591 -995593 -995611 -995623 -995641 -995651 -995663 -995669 -995677 -995699 -995713 -995719 -995737 -995747 -995783 -995791 -995801 -995833 -995881 -995887 -995903 -995909 -995927 -995941 -995957 -995959 -995983 -995987 -995989 -996001 -996011 -996019 -996049 -996067 -996103 -996109 -996119 -996143 -996157 -996161 -996167 -996169 -996173 -996187 -996197 -996209 -996211 -996253 -996257 -996263 -996271 -996293 -996301 -996311 -996323 -996329 -996361 -996367 -996403 -996407 -996409 -996431 -996461 -996487 -996511 -996529 -996539 -996551 -996563 -996571 -996599 -996601 -996617 -996629 -996631 -996637 -996647 -996649 -996689 -996703 -996739 -996763 -996781 -996803 -996811 -996841 -996847 -996857 -996859 -996871 -996881 -996883 -996887 -996899 -996953 -996967 -996973 -996979 -997001 -997013 -997019 -997021 -997037 -997043 -997057 -997069 -997081 -997091 -997097 -997099 -997103 -997109 -997111 -997121 -997123 -997141 -997147 -997151 -997153 -997163 -997201 -997207 -997219 -997247 -997259 -997267 -997273 -997279 -997307 -997309 -997319 -997327 -997333 -997343 -997357 -997369 -997379 -997391 -997427 -997433 -997439 -997453 -997463 -997511 -997541 -997547 -997553 -997573 -997583 -997589 -997597 -997609 -997627 -997637 -997649 -997651 -997663 -997681 -997693 -997699 -997727 -997739 -997741 -997751 -997769 -997783 -997793 -997807 -997811 -997813 -997877 -997879 -997889 -997891 -997897 -997933 -997949 -997961 -997963 -997973 -997991 -998009 -998017 -998027 -998029 -998069 -998071 -998077 -998083 -998111 -998117 -998147 -998161 -998167 -998197 -998201 -998213 -998219 -998237 -998243 -998273 -998281 -998287 -998311 -998329 -998353 -998377 -998381 -998399 -998411 -998419 -998423 -998429 -998443 -998471 -998497 -998513 -998527 -998537 -998539 -998551 -998561 -998617 -998623 -998629 -998633 -998651 -998653 -998681 -998687 -998689 -998717 -998737 -998743 -998749 -998759 -998779 -998813 -998819 -998831 -998839 -998843 -998857 -998861 -998897 -998909 -998917 -998927 -998941 -998947 -998951 -998957 -998969 -998983 -998989 -999007 -999023 -999029 -999043 -999049 -999067 -999083 -999091 -999101 -999133 -999149 -999169 -999181 -999199 -999217 -999221 -999233 -999239 -999269 -999287 -999307 -999329 -999331 -999359 -999371 -999377 -999389 -999431 -999433 -999437 -999451 -999491 -999499 -999521 -999529 -999541 -999553 -999563 -999599 -999611 -999613 -999623 -999631 -999653 -999667 -999671 -999683 -999721 -999727 -999749 -999763 -999769 -999773 -999809 -999853 -999863 -999883 -999907 -999917 -999931 -999953 -999959 -999961 -999979 -999983 -1000003 -1000033 -1000037 -1000039 -1000081 -1000099 -1000117 -1000121 -1000133 -1000151 -1000159 -1000171 -1000183 -1000187 -1000193 -1000199 -1000211 -1000213 -1000231 -1000249 -1000253 -1000273 -1000289 -1000291 -1000303 -1000313 -1000333 -1000357 -1000367 -1000381 -1000393 -1000397 -1000403 -1000409 -1000423 -1000427 -1000429 -1000453 -1000457 -1000507 -1000537 -1000541 -1000547 -1000577 -1000579 -1000589 -1000609 -1000619 -1000621 -1000639 -1000651 -1000667 -1000669 -1000679 -1000691 -1000697 -1000721 -1000723 -1000763 -1000777 -1000793 -1000829 -1000847 -1000849 -1000859 -1000861 -1000889 -1000907 -1000919 -1000921 -1000931 -1000969 -1000973 -1000981 -1000999 -1001003 -1001017 -1001023 -1001027 -1001041 -1001069 -1001081 -1001087 -1001089 -1001093 -1001107 -1001123 -1001153 -1001159 -1001173 -1001177 -1001191 -1001197 -1001219 -1001237 -1001267 -1001279 -1001291 -1001303 -1001311 -1001321 -1001323 -1001327 -1001347 -1001353 -1001369 -1001381 -1001387 -1001389 -1001401 -1001411 -1001431 -1001447 -1001459 -1001467 -1001491 -1001501 -1001527 -1001531 -1001549 -1001551 -1001563 -1001569 -1001587 -1001593 -1001621 -1001629 -1001639 -1001659 -1001669 -1001683 -1001687 -1001713 -1001723 -1001743 -1001783 -1001797 -1001801 -1001807 -1001809 -1001821 -1001831 -1001839 -1001911 -1001933 -1001941 -1001947 -1001953 -1001977 -1001981 -1001983 -1001989 -1002017 -1002049 -1002061 -1002073 -1002077 -1002083 -1002091 -1002101 -1002109 -1002121 -1002143 -1002149 -1002151 -1002173 -1002191 -1002227 -1002241 -1002247 -1002257 -1002259 -1002263 -1002289 -1002299 -1002341 -1002343 -1002347 -1002349 -1002359 -1002361 -1002377 -1002403 -1002427 -1002433 -1002451 -1002457 -1002467 -1002481 -1002487 -1002493 -1002503 -1002511 -1002517 -1002523 -1002527 -1002553 -1002569 -1002577 -1002583 -1002619 -1002623 -1002647 -1002653 -1002679 -1002709 -1002713 -1002719 -1002721 -1002739 -1002751 -1002767 -1002769 -1002773 -1002787 -1002797 -1002809 -1002817 -1002821 -1002851 -1002853 -1002857 -1002863 -1002871 -1002887 -1002893 -1002899 -1002913 -1002917 -1002929 -1002931 -1002973 -1002979 -1003001 -1003003 -1003019 -1003039 -1003049 -1003087 -1003091 -1003097 -1003103 -1003109 -1003111 -1003133 -1003141 -1003193 -1003199 -1003201 -1003241 -1003259 -1003273 -1003279 -1003291 -1003307 -1003337 -1003349 -1003351 -1003361 -1003363 -1003367 -1003369 -1003381 -1003397 -1003411 -1003417 -1003433 -1003463 -1003469 -1003507 -1003517 -1003543 -1003549 -1003589 -1003601 -1003609 -1003619 -1003621 -1003627 -1003631 -1003679 -1003693 -1003711 -1003729 -1003733 -1003741 -1003747 -1003753 -1003757 -1003763 -1003771 -1003787 -1003817 -1003819 -1003841 -1003879 -1003889 -1003897 -1003907 -1003909 -1003913 -1003931 -1003943 -1003957 -1003963 -1004027 -1004033 -1004053 -1004057 -1004063 -1004077 -1004089 -1004117 -1004119 -1004137 -1004141 -1004161 -1004167 -1004209 -1004221 -1004233 -1004273 -1004279 -1004287 -1004293 -1004303 -1004317 -1004323 -1004363 -1004371 -1004401 -1004429 -1004441 -1004449 -1004453 -1004461 -1004477 -1004483 -1004501 -1004527 -1004537 -1004551 -1004561 -1004567 -1004599 -1004651 -1004657 -1004659 -1004669 -1004671 -1004677 -1004687 -1004723 -1004737 -1004743 -1004747 -1004749 -1004761 -1004779 -1004797 -1004873 -1004903 -1004911 -1004917 -1004963 -1004977 -1004981 -1004987 -1005007 -1005013 -1005019 -1005029 -1005041 -1005049 -1005071 -1005073 -1005079 -1005101 -1005107 -1005131 -1005133 -1005143 -1005161 -1005187 -1005203 -1005209 -1005217 -1005223 -1005229 -1005239 -1005241 -1005269 -1005287 -1005293 -1005313 -1005317 -1005331 -1005349 -1005359 -1005371 -1005373 -1005391 -1005409 -1005413 -1005427 -1005437 -1005439 -1005457 -1005467 -1005481 -1005493 -1005503 -1005527 -1005541 -1005551 -1005553 -1005581 -1005593 -1005617 -1005619 -1005637 -1005643 -1005647 -1005661 -1005677 -1005679 -1005701 -1005709 -1005751 -1005761 -1005821 -1005827 -1005833 -1005883 -1005911 -1005913 -1005931 -1005937 -1005959 -1005971 -1005989 -1006003 -1006007 -1006021 -1006037 -1006063 -1006087 -1006091 -1006123 -1006133 -1006147 -1006151 -1006153 -1006163 -1006169 -1006171 -1006177 -1006189 -1006193 -1006217 -1006219 -1006231 -1006237 -1006241 -1006249 -1006253 -1006267 -1006279 -1006301 -1006303 -1006307 -1006309 -1006331 -1006333 -1006337 -1006339 -1006351 -1006361 -1006367 -1006391 -1006393 -1006433 -1006441 -1006463 -1006469 -1006471 -1006493 -1006507 -1006513 -1006531 -1006543 -1006547 -1006559 -1006583 -1006589 -1006609 -1006613 -1006633 -1006637 -1006651 -1006711 -1006721 -1006739 -1006751 -1006769 -1006781 -1006783 -1006799 -1006847 -1006853 -1006861 -1006877 -1006879 -1006883 -1006891 -1006897 -1006933 -1006937 -1006949 -1006969 -1006979 -1006987 -1006991 -1007021 -1007023 -1007047 -1007059 -1007081 -1007089 -1007099 -1007117 -1007119 -1007129 -1007137 -1007161 -1007173 -1007179 -1007203 -1007231 -1007243 -1007249 -1007297 -1007299 -1007309 -1007317 -1007339 -1007353 -1007359 -1007381 -1007387 -1007401 -1007417 -1007429 -1007441 -1007459 -1007467 -1007483 -1007497 -1007519 -1007527 -1007549 -1007557 -1007597 -1007599 -1007609 -1007647 -1007651 -1007681 -1007683 -1007693 -1007701 -1007711 -1007719 -1007723 -1007729 -1007731 -1007749 -1007753 -1007759 -1007767 -1007771 -1007789 -1007801 -1007807 -1007813 -1007819 -1007827 -1007857 -1007861 -1007873 -1007887 -1007891 -1007921 -1007933 -1007939 -1007957 -1007959 -1007971 -1007977 -1008001 -1008013 -1008017 -1008031 -1008037 -1008041 -1008043 -1008101 -1008131 -1008157 -1008181 -1008187 -1008193 -1008199 -1008209 -1008223 -1008229 -1008233 -1008239 -1008247 -1008257 -1008263 -1008317 -1008323 -1008331 -1008347 -1008353 -1008373 -1008379 -1008401 -1008407 -1008409 -1008419 -1008421 -1008433 -1008437 -1008451 -1008467 -1008493 -1008499 -1008503 -1008517 -1008541 -1008547 -1008563 -1008571 -1008587 -1008589 -1008607 -1008611 -1008613 -1008617 -1008659 -1008701 -1008719 -1008743 -1008773 -1008779 -1008781 -1008793 -1008809 -1008817 -1008829 -1008851 -1008853 -1008857 -1008859 -1008863 -1008871 -1008901 -1008911 -1008913 -1008923 -1008937 -1008947 -1008979 -1008983 -1008989 -1008991 -1009007 -1009037 -1009049 -1009061 -1009097 -1009121 -1009139 -1009153 -1009157 -1009159 -1009163 -1009189 -1009193 -1009199 -1009201 -1009207 -1009237 -1009243 -1009247 -1009259 -1009289 -1009291 -1009301 -1009303 -1009319 -1009321 -1009343 -1009357 -1009361 -1009369 -1009373 -1009387 -1009399 -1009417 -1009433 -1009439 -1009457 -1009483 -1009487 -1009499 -1009501 -1009507 -1009531 -1009537 -1009559 -1009573 -1009601 -1009609 -1009621 -1009627 -1009637 -1009643 -1009649 -1009651 -1009669 -1009727 -1009741 -1009747 -1009781 -1009787 -1009807 -1009819 -1009837 -1009843 -1009859 -1009873 -1009901 -1009909 -1009927 -1009937 -1009951 -1009963 -1009991 -1009993 -1009997 -1010003 -1010033 -1010069 -1010081 -1010083 -1010129 -1010131 -1010143 -1010167 -1010179 -1010201 -1010203 -1010237 -1010263 -1010291 -1010297 -1010329 -1010353 -1010357 -1010381 -1010407 -1010411 -1010419 -1010423 -1010431 -1010461 -1010467 -1010473 -1010491 -1010501 -1010509 -1010519 -1010549 -1010567 -1010579 -1010617 -1010623 -1010627 -1010671 -1010683 -1010687 -1010717 -1010719 -1010747 -1010749 -1010753 -1010759 -1010767 -1010771 -1010783 -1010791 -1010797 -1010809 -1010833 -1010843 -1010861 -1010881 -1010897 -1010899 -1010903 -1010917 -1010929 -1010957 -1010981 -1010983 -1010993 -1011001 -1011013 -1011029 -1011037 -1011067 -1011071 -1011077 -1011079 -1011091 -1011107 -1011137 -1011139 -1011163 -1011167 -1011191 -1011217 -1011221 -1011229 -1011233 -1011239 -1011271 -1011277 -1011281 -1011289 -1011331 -1011343 -1011349 -1011359 -1011371 -1011377 -1011391 -1011397 -1011407 -1011431 -1011443 -1011509 -1011539 -1011553 -1011559 -1011583 -1011587 -1011589 -1011599 -1011601 -1011631 -1011641 -1011649 -1011667 -1011671 -1011677 -1011697 -1011719 -1011733 -1011737 -1011749 -1011763 -1011779 -1011797 -1011799 -1011817 -1011827 -1011889 -1011893 -1011917 -1011937 -1011943 -1011947 -1011961 -1011973 -1011979 -1012007 -1012009 -1012031 -1012043 -1012049 -1012079 -1012087 -1012093 -1012097 -1012103 -1012133 -1012147 -1012159 -1012171 -1012183 -1012189 -1012201 -1012213 -1012217 -1012229 -1012241 -1012259 -1012261 -1012267 -1012279 -1012289 -1012307 -1012321 -1012369 -1012373 -1012379 -1012397 -1012399 -1012411 -1012421 -1012423 -1012433 -1012439 -1012447 -1012457 -1012463 -1012481 -1012489 -1012507 -1012513 -1012519 -1012523 -1012547 -1012549 -1012559 -1012573 -1012591 -1012597 -1012601 -1012619 -1012631 -1012633 -1012637 -1012657 -1012663 -1012679 -1012691 -1012699 -1012703 -1012717 -1012721 -1012733 -1012751 -1012763 -1012769 -1012771 -1012789 -1012811 -1012829 -1012831 -1012861 -1012903 -1012919 -1012931 -1012967 -1012981 -1012993 -1012997 -1013003 -1013009 -1013029 -1013041 -1013053 -1013063 -1013143 -1013153 -1013197 -1013203 -1013227 -1013237 -1013239 -1013249 -1013263 -1013267 -1013279 -1013291 -1013321 -1013329 -1013377 -1013399 -1013401 -1013429 -1013431 -1013471 -1013477 -1013501 -1013503 -1013527 -1013531 -1013533 -1013563 -1013569 -1013581 -1013603 -1013609 -1013627 -1013629 -1013641 -1013671 -1013681 -1013687 -1013699 -1013711 -1013713 -1013717 -1013729 -1013741 -1013767 -1013773 -1013791 -1013813 -1013819 -1013827 -1013833 -1013839 -1013843 -1013851 -1013879 -1013891 -1013893 -1013899 -1013921 -1013923 -1013933 -1013993 -1014007 -1014029 -1014037 -1014061 -1014089 -1014113 -1014121 -1014127 -1014131 -1014137 -1014149 -1014157 -1014161 -1014173 -1014193 -1014197 -1014199 -1014229 -1014257 -1014259 -1014263 -1014287 -1014301 -1014317 -1014319 -1014331 -1014337 -1014341 -1014359 -1014361 -1014371 -1014389 -1014397 -1014451 -1014457 -1014469 -1014487 -1014493 -1014521 -1014539 -1014547 -1014557 -1014571 -1014593 -1014617 -1014631 -1014641 -1014649 -1014677 -1014697 -1014719 -1014721 -1014731 -1014743 -1014749 -1014763 -1014779 -1014787 -1014817 -1014821 -1014833 -1014863 -1014869 -1014877 -1014887 -1014889 -1014907 -1014941 -1014953 -1014973 -1014989 -1015009 -1015039 -1015043 -1015051 -1015057 -1015061 -1015067 -1015073 -1015081 -1015093 -1015097 -1015123 -1015127 -1015139 -1015159 -1015163 -1015171 -1015199 -1015207 -1015277 -1015309 -1015349 -1015361 -1015363 -1015367 -1015369 -1015403 -1015409 -1015423 -1015433 -1015451 -1015453 -1015459 -1015463 -1015471 -1015481 -1015499 -1015501 -1015507 -1015517 -1015523 -1015541 -1015549 -1015559 -1015561 -1015571 -1015601 -1015603 -1015627 -1015661 -1015691 -1015697 -1015709 -1015723 -1015727 -1015739 -1015747 -1015753 -1015769 -1015813 -1015823 -1015829 -1015843 -1015853 -1015871 -1015877 -1015891 -1015897 -1015907 -1015913 -1015919 -1015967 -1015981 -1015991 -1016009 -1016011 -1016023 -1016027 -1016033 -1016051 -1016053 -1016069 -1016083 -1016089 -1016111 -1016123 -1016137 -1016143 -1016153 -1016159 -1016173 -1016201 -1016203 -1016221 -1016227 -1016231 -1016237 -1016263 -1016303 -1016339 -1016341 -1016357 -1016359 -1016371 -1016399 -1016401 -1016419 -1016423 -1016441 -1016453 -1016489 -1016497 -1016527 -1016567 -1016569 -1016573 -1016581 -1016597 -1016599 -1016611 -1016621 -1016641 -1016663 -1016681 -1016689 -1016731 -1016737 -1016749 -1016773 -1016777 -1016783 -1016789 -1016839 -1016843 -1016849 -1016879 -1016881 -1016891 -1016909 -1016921 -1016927 -1016929 -1016941 -1016947 -1016959 -1016971 -1017007 -1017011 -1017031 -1017041 -1017043 -1017061 -1017077 -1017097 -1017119 -1017131 -1017139 -1017157 -1017173 -1017179 -1017193 -1017199 -1017209 -1017227 -1017277 -1017293 -1017299 -1017301 -1017307 -1017311 -1017319 -1017323 -1017329 -1017347 -1017353 -1017361 -1017371 -1017377 -1017383 -1017391 -1017437 -1017439 -1017449 -1017473 -1017479 -1017481 -1017539 -1017551 -1017553 -1017559 -1017607 -1017613 -1017617 -1017623 -1017647 -1017649 -1017673 -1017683 -1017703 -1017713 -1017719 -1017721 -1017749 -1017781 -1017787 -1017799 -1017817 -1017827 -1017847 -1017851 -1017857 -1017859 -1017881 -1017889 -1017923 -1017953 -1017959 -1017997 -1018007 -1018019 -1018021 -1018057 -1018091 -1018097 -1018109 -1018123 -1018177 -1018201 -1018207 -1018217 -1018223 -1018247 -1018253 -1018271 -1018291 -1018301 -1018309 -1018313 -1018337 -1018357 -1018411 -1018421 -1018429 -1018439 -1018447 -1018471 -1018477 -1018489 -1018513 -1018543 -1018559 -1018583 -1018613 -1018621 -1018643 -1018649 -1018651 -1018669 -1018673 -1018679 -1018697 -1018709 -1018711 -1018729 -1018733 -1018763 -1018769 -1018777 -1018789 -1018807 -1018811 -1018813 -1018817 -1018859 -1018873 -1018879 -1018889 -1018903 -1018907 -1018931 -1018937 -1018949 -1018957 -1018967 -1018981 -1018987 -1018993 -1018999 -1019023 -1019033 -1019059 -1019069 -1019071 -1019077 -1019093 -1019119 -1019129 -1019173 -1019177 -1019197 -1019209 -1019237 -1019251 -1019257 -1019261 -1019267 -1019273 -1019281 -1019297 -1019329 -1019339 -1019351 -1019353 -1019357 -1019377 -1019399 -1019411 -1019413 -1019423 -1019443 -1019449 -1019453 -1019467 -1019471 -1019479 -1019503 -1019509 -1019531 -1019533 -1019537 -1019549 -1019563 -1019617 -1019639 -1019647 -1019657 -1019663 -1019687 -1019693 -1019699 -1019701 -1019713 -1019717 -1019723 -1019729 -1019731 -1019741 -1019747 -1019771 -1019783 -1019801 -1019819 -1019827 -1019839 -1019849 -1019857 -1019861 -1019873 -1019899 -1019903 -1019927 -1019971 -1020001 -1020007 -1020011 -1020013 -1020023 -1020037 -1020043 -1020049 -1020059 -1020077 -1020079 -1020101 -1020109 -1020113 -1020137 -1020143 -1020157 -1020163 -1020223 -1020233 -1020247 -1020259 -1020269 -1020293 -1020301 -1020329 -1020337 -1020353 -1020361 -1020379 -1020389 -1020401 -1020407 -1020413 -1020419 -1020431 -1020451 -1020457 -1020491 -1020517 -1020529 -1020541 -1020557 -1020583 -1020589 -1020599 -1020619 -1020631 -1020667 -1020683 -1020689 -1020707 -1020709 -1020743 -1020751 -1020757 -1020779 -1020797 -1020821 -1020823 -1020827 -1020839 -1020841 -1020847 -1020853 -1020881 -1020893 -1020907 -1020913 -1020931 -1020959 -1020961 -1020967 -1020973 -1020977 -1020979 -1020989 -1020991 -1020997 -1021001 -1021019 -1021043 -1021067 -1021073 -1021081 -1021087 -1021091 -1021093 -1021123 -1021127 -1021129 -1021157 -1021159 -1021183 -1021199 -1021217 -1021243 -1021253 -1021259 -1021261 -1021271 -1021283 -1021289 -1021291 -1021297 -1021301 -1021303 -1021327 -1021331 -1021333 -1021367 -1021369 -1021373 -1021381 -1021387 -1021403 -1021417 -1021429 -1021441 -1021457 -1021463 -1021483 -1021487 -1021541 -1021561 -1021571 -1021577 -1021621 -1021627 -1021651 -1021661 -1021663 -1021673 -1021697 -1021711 -1021747 -1021753 -1021759 -1021777 -1021793 -1021799 -1021807 -1021831 -1021837 -1021849 -1021861 -1021879 -1021897 -1021907 -1021919 -1021961 -1021963 -1021973 -1022011 -1022017 -1022033 -1022053 -1022059 -1022071 -1022083 -1022113 -1022123 -1022129 -1022137 -1022141 -1022167 -1022179 -1022183 -1022191 -1022201 -1022209 -1022237 -1022243 -1022249 -1022251 -1022291 -1022303 -1022341 -1022377 -1022381 -1022383 -1022387 -1022389 -1022429 -1022443 -1022449 -1022467 -1022491 -1022501 -1022503 -1022507 -1022509 -1022513 -1022519 -1022531 -1022573 -1022591 -1022611 -1022629 -1022633 -1022639 -1022653 -1022677 -1022683 -1022689 -1022701 -1022719 -1022729 -1022761 -1022773 -1022797 -1022821 -1022837 -1022843 -1022849 -1022869 -1022881 -1022891 -1022899 -1022911 -1022929 -1022933 -1022963 -1022977 -1022981 -1023019 -1023037 -1023041 -1023047 -1023067 -1023079 -1023083 -1023101 -1023107 -1023133 -1023163 -1023167 -1023173 -1023199 -1023203 -1023221 -1023227 -1023229 -1023257 -1023259 -1023263 -1023277 -1023289 -1023299 -1023301 -1023311 -1023313 -1023317 -1023329 -1023353 -1023361 -1023367 -1023389 -1023391 -1023409 -1023413 -1023419 -1023461 -1023467 -1023487 -1023499 -1023521 -1023541 -1023551 -1023557 -1023571 -1023577 -1023601 -1023643 -1023653 -1023697 -1023719 -1023721 -1023731 -1023733 -1023751 -1023769 -1023821 -1023833 -1023839 -1023851 -1023857 -1023871 -1023941 -1023943 -1023947 -1023949 -1023973 -1023977 -1023991 -1024021 -1024031 -1024061 -1024073 -1024087 -1024091 -1024099 -1024103 -1024151 -1024159 -1024171 -1024183 -1024189 -1024207 -1024249 -1024277 -1024307 -1024313 -1024319 -1024321 -1024327 -1024337 -1024339 -1024357 -1024379 -1024391 -1024399 -1024411 -1024421 -1024427 -1024433 -1024477 -1024481 -1024511 -1024523 -1024547 -1024559 -1024577 -1024579 -1024589 -1024591 -1024609 -1024633 -1024663 -1024669 -1024693 -1024697 -1024703 -1024711 -1024721 -1024729 -1024757 -1024783 -1024799 -1024823 -1024843 -1024853 -1024871 -1024883 -1024901 -1024909 -1024921 -1024931 -1024939 -1024943 -1024951 -1024957 -1024963 -1024987 -1024997 -1025009 -1025021 -1025029 -1025039 -1025047 -1025081 -1025093 -1025099 -1025111 -1025113 -1025119 -1025137 -1025147 -1025149 -1025153 -1025161 -1025197 -1025203 -1025209 -1025231 -1025239 -1025257 -1025261 -1025267 -1025273 -1025279 -1025281 -1025303 -1025327 -1025333 -1025347 -1025351 -1025383 -1025393 -1025407 -1025413 -1025417 -1025419 -1025443 -1025459 -1025477 -1025483 -1025503 -1025509 -1025513 -1025537 -1025543 -1025551 -1025561 -1025579 -1025611 -1025621 -1025623 -1025641 -1025653 -1025659 -1025669 -1025693 -1025707 -1025741 -1025747 -1025749 -1025767 -1025789 -1025803 -1025807 -1025819 -1025839 -1025873 -1025887 -1025891 -1025897 -1025909 -1025911 -1025917 -1025929 -1025939 -1025957 -1026029 -1026031 -1026037 -1026041 -1026043 -1026061 -1026073 -1026101 -1026119 -1026127 -1026139 -1026143 -1026167 -1026197 -1026199 -1026217 -1026227 -1026229 -1026251 -1026253 -1026257 -1026293 -1026299 -1026313 -1026331 -1026359 -1026371 -1026383 -1026391 -1026401 -1026407 -1026413 -1026427 -1026439 -1026449 -1026457 -1026479 -1026481 -1026521 -1026547 -1026563 -1026577 -1026581 -1026583 -1026587 -1026593 -1026661 -1026667 -1026673 -1026677 -1026679 -1026709 -1026733 -1026757 -1026761 -1026791 -1026799 -1026811 -1026829 -1026833 -1026847 -1026853 -1026859 -1026887 -1026899 -1026911 -1026913 -1026917 -1026941 -1026943 -1026947 -1026979 -1026989 -1027001 -1027003 -1027027 -1027031 -1027051 -1027067 -1027097 -1027127 -1027129 -1027139 -1027153 -1027163 -1027181 -1027189 -1027199 -1027207 -1027211 -1027223 -1027241 -1027261 -1027277 -1027289 -1027319 -1027321 -1027331 -1027357 -1027391 -1027409 -1027417 -1027421 -1027427 -1027459 -1027471 -1027483 -1027487 -1027489 -1027493 -1027519 -1027547 -1027549 -1027567 -1027591 -1027597 -1027613 -1027643 -1027679 -1027687 -1027693 -1027703 -1027717 -1027727 -1027739 -1027751 -1027753 -1027757 -1027759 -1027777 -1027783 -1027787 -1027799 -1027841 -1027853 -1027883 -1027891 -1027931 -1027969 -1027987 -1028003 -1028011 -1028017 -1028023 -1028029 -1028047 -1028051 -1028063 -1028081 -1028089 -1028099 -1028101 -1028107 -1028113 -1028117 -1028129 -1028141 -1028149 -1028189 -1028191 -1028201 -1028207 -1028213 -1028221 -1028231 -1028243 -1028263 -1028273 -1028303 -1028309 -1028317 -1028327 -1028329 -1028333 -1028389 -1028393 -1028411 -1028437 -1028471 -1028473 -1028479 -1028509 -1028557 -1028561 -1028569 -1028579 -1028581 -1028597 -1028617 -1028647 -1028663 -1028669 -1028681 -1028683 -1028737 -1028747 -1028749 -1028761 -1028773 -1028777 -1028803 -1028809 -1028837 -1028843 -1028873 -1028893 -1028903 -1028939 -1028941 -1028953 -1028957 -1028969 -1028981 -1028999 -1029001 -1029013 -1029023 -1029037 -1029103 -1029109 -1029113 -1029139 -1029151 -1029157 -1029167 -1029179 -1029191 -1029199 -1029209 -1029247 -1029251 -1029263 -1029277 -1029289 -1029307 -1029323 -1029331 -1029337 -1029341 -1029349 -1029359 -1029361 -1029383 -1029403 -1029407 -1029409 -1029433 -1029467 -1029473 -1029481 -1029487 -1029499 -1029517 -1029521 -1029527 -1029533 -1029547 -1029563 -1029569 -1029577 -1029583 -1029593 -1029601 -1029617 -1029643 -1029647 -1029653 -1029689 -1029697 -1029731 -1029751 -1029757 -1029767 -1029803 -1029823 -1029827 -1029839 -1029841 -1029859 -1029881 -1029883 -1029907 -1029929 -1029937 -1029943 -1029953 -1029967 -1029983 -1029989 -1030019 -1030021 -1030027 -1030031 -1030033 -1030039 -1030049 -1030061 -1030067 -1030069 -1030091 -1030111 -1030121 -1030153 -1030157 -1030181 -1030201 -1030213 -1030219 -1030241 -1030247 -1030291 -1030297 -1030307 -1030349 -1030357 -1030361 -1030369 -1030411 -1030417 -1030429 -1030439 -1030441 -1030451 -1030493 -1030511 -1030529 -1030537 -1030543 -1030571 -1030583 -1030619 -1030637 -1030639 -1030643 -1030681 -1030703 -1030723 -1030739 -1030741 -1030751 -1030759 -1030763 -1030787 -1030793 -1030801 -1030811 -1030817 -1030823 -1030831 -1030847 -1030867 -1030873 -1030889 -1030919 -1030933 -1030949 -1030951 -1030957 -1030987 -1030993 -1031003 -1031047 -1031053 -1031057 -1031081 -1031117 -1031119 -1031137 -1031141 -1031161 -1031189 -1031231 -1031267 -1031279 -1031281 -1031291 -1031299 -1031309 -1031323 -1031347 -1031357 -1031399 -1031411 -1031413 -1031423 -1031431 -1031447 -1031461 -1031477 -1031479 -1031483 -1031489 -1031507 -1031521 -1031531 -1031533 -1031549 -1031561 -1031593 -1031609 -1031623 -1031629 -1031633 -1031669 -1031677 -1031707 -1031717 -1031729 -1031731 -1031741 -1031753 -1031759 -1031761 -1031809 -1031813 -1031831 -1031837 -1031869 -1031911 -1031923 -1031981 -1031999 -1032007 -1032047 -1032049 -1032067 -1032071 -1032107 -1032131 -1032151 -1032191 -1032193 -1032211 -1032221 -1032233 -1032259 -1032287 -1032299 -1032307 -1032319 -1032329 -1032341 -1032347 -1032349 -1032373 -1032377 -1032391 -1032397 -1032407 -1032419 -1032433 -1032457 -1032463 -1032467 -1032491 -1032497 -1032509 -1032511 -1032527 -1032541 -1032571 -1032583 -1032601 -1032607 -1032613 -1032617 -1032643 -1032649 -1032679 -1032683 -1032697 -1032701 -1032709 -1032721 -1032727 -1032739 -1032751 -1032763 -1032793 -1032799 -1032803 -1032833 -1032839 -1032841 -1032847 -1032851 -1032853 -1032881 -1032887 -1032901 -1032943 -1032949 -1032959 -1032961 -1033001 -1033007 -1033027 -1033033 -1033037 -1033057 -1033061 -1033063 -1033069 -1033079 -1033099 -1033127 -1033139 -1033171 -1033181 -1033189 -1033223 -1033271 -1033273 -1033289 -1033297 -1033303 -1033309 -1033313 -1033337 -1033339 -1033343 -1033349 -1033363 -1033369 -1033381 -1033387 -1033393 -1033421 -1033423 -1033427 -1033441 -1033451 -1033457 -1033463 -1033469 -1033489 -1033493 -1033499 -1033507 -1033517 -1033537 -1033541 -1033559 -1033567 -1033601 -1033603 -1033631 -1033661 -1033663 -1033667 -1033679 -1033687 -1033693 -1033741 -1033751 -1033759 -1033777 -1033783 -1033789 -1033793 -1033801 -1033807 -1033829 -1033841 -1033843 -1033867 -1033927 -1033951 -1033987 -1034003 -1034009 -1034027 -1034029 -1034069 -1034071 -1034101 -1034119 -1034123 -1034147 -1034167 -1034171 -1034177 -1034183 -1034197 -1034207 -1034219 -1034221 -1034233 -1034237 -1034239 -1034249 -1034251 -1034281 -1034309 -1034317 -1034323 -1034339 -1034353 -1034357 -1034359 -1034381 -1034387 -1034419 -1034443 -1034461 -1034477 -1034479 -1034489 -1034491 -1034503 -1034513 -1034549 -1034567 -1034581 -1034591 -1034597 -1034599 -1034617 -1034639 -1034651 -1034653 -1034659 -1034707 -1034729 -1034731 -1034767 -1034771 -1034783 -1034791 -1034809 -1034827 -1034833 -1034837 -1034849 -1034857 -1034861 -1034863 -1034867 -1034879 -1034903 -1034941 -1034951 -1034953 -1034959 -1034983 -1034989 -1034993 -1035007 -1035019 -1035043 -1035061 -1035077 -1035107 -1035131 -1035163 -1035187 -1035191 -1035197 -1035211 -1035241 -1035247 -1035257 -1035263 -1035277 -1035301 -1035313 -1035323 -1035341 -1035343 -1035361 -1035379 -1035383 -1035403 -1035409 -1035413 -1035427 -1035449 -1035451 -1035467 -1035469 -1035473 -1035479 -1035499 -1035527 -1035533 -1035547 -1035563 -1035571 -1035581 -1035599 -1035607 -1035613 -1035631 -1035637 -1035641 -1035649 -1035659 -1035707 -1035733 -1035743 -1035761 -1035763 -1035781 -1035791 -1035829 -1035869 -1035893 -1035917 -1035949 -1035953 -1035959 -1035973 -1035977 -1036001 -1036003 -1036027 -1036039 -1036067 -1036069 -1036073 -1036093 -1036109 -1036117 -1036121 -1036129 -1036153 -1036163 -1036183 -1036213 -1036223 -1036229 -1036247 -1036249 -1036253 -1036261 -1036267 -1036271 -1036291 -1036297 -1036307 -1036319 -1036327 -1036331 -1036339 -1036349 -1036351 -1036363 -1036367 -1036369 -1036391 -1036411 -1036459 -1036471 -1036493 -1036499 -1036513 -1036531 -1036537 -1036561 -1036579 -1036613 -1036619 -1036631 -1036649 -1036661 -1036667 -1036669 -1036681 -1036729 -1036747 -1036751 -1036757 -1036759 -1036769 -1036787 -1036793 -1036799 -1036829 -1036831 -1036853 -1036873 -1036877 -1036883 -1036913 -1036921 -1036943 -1036951 -1036957 -1036979 -1036991 -1036993 -1037041 -1037053 -1037059 -1037081 -1037087 -1037089 -1037123 -1037129 -1037137 -1037143 -1037213 -1037233 -1037249 -1037261 -1037273 -1037293 -1037297 -1037303 -1037317 -1037327 -1037329 -1037339 -1037347 -1037401 -1037411 -1037437 -1037441 -1037447 -1037471 -1037479 -1037489 -1037497 -1037503 -1037537 -1037557 -1037563 -1037567 -1037593 -1037611 -1037627 -1037653 -1037657 -1037677 -1037681 -1037683 -1037741 -1037747 -1037753 -1037759 -1037767 -1037791 -1037801 -1037819 -1037831 -1037857 -1037873 -1037879 -1037893 -1037903 -1037917 -1037929 -1037941 -1037957 -1037963 -1037983 -1038001 -1038017 -1038019 -1038029 -1038041 -1038043 -1038047 -1038073 -1038077 -1038119 -1038127 -1038143 -1038157 -1038187 -1038199 -1038203 -1038209 -1038211 -1038227 -1038251 -1038253 -1038259 -1038263 -1038269 -1038307 -1038311 -1038319 -1038329 -1038337 -1038383 -1038391 -1038409 -1038421 -1038449 -1038463 -1038487 -1038497 -1038503 -1038523 -1038529 -1038539 -1038563 -1038589 -1038599 -1038601 -1038617 -1038619 -1038623 -1038629 -1038637 -1038643 -1038671 -1038689 -1038691 -1038707 -1038721 -1038727 -1038731 -1038757 -1038797 -1038803 -1038811 -1038823 -1038827 -1038833 -1038881 -1038913 -1038937 -1038941 -1038953 -1039001 -1039007 -1039021 -1039033 -1039037 -1039039 -1039043 -1039067 -1039069 -1039081 -1039109 -1039111 -1039127 -1039139 -1039153 -1039169 -1039187 -1039229 -1039249 -1039279 -1039289 -1039307 -1039321 -1039327 -1039343 -1039349 -1039351 -1039387 -1039421 -1039427 -1039429 -1039463 -1039469 -1039477 -1039481 -1039513 -1039517 -1039537 -1039543 -1039553 -1039603 -1039607 -1039631 -1039651 -1039657 -1039667 -1039681 -1039733 -1039763 -1039769 -1039789 -1039799 -1039817 -1039823 -1039837 -1039891 -1039897 -1039901 -1039921 -1039931 -1039943 -1039949 -1039979 -1039999 -1040021 -1040029 -1040051 -1040057 -1040059 -1040069 -1040071 -1040089 -1040093 -1040101 -1040113 -1040119 -1040141 -1040153 -1040159 -1040161 -1040167 -1040183 -1040189 -1040191 -1040203 -1040219 -1040227 -1040311 -1040327 -1040339 -1040353 -1040371 -1040381 -1040387 -1040407 -1040411 -1040419 -1040447 -1040449 -1040483 -1040489 -1040503 -1040521 -1040531 -1040563 -1040579 -1040581 -1040597 -1040629 -1040651 -1040657 -1040659 -1040671 -1040717 -1040731 -1040747 -1040749 -1040771 -1040777 -1040779 -1040783 -1040797 -1040803 -1040807 -1040813 -1040821 -1040827 -1040833 -1040857 -1040861 -1040873 -1040881 -1040891 -1040899 -1040929 -1040939 -1040947 -1040951 -1040959 -1040981 -1040989 -1041041 -1041077 -1041083 -1041091 -1041109 -1041119 -1041121 -1041127 -1041137 -1041149 -1041151 -1041163 -1041167 -1041169 -1041203 -1041221 -1041223 -1041239 -1041241 -1041253 -1041269 -1041281 -1041283 -1041289 -1041307 -1041311 -1041317 -1041329 -1041343 -1041349 -1041373 -1041421 -1041427 -1041449 -1041451 -1041461 -1041497 -1041511 -1041517 -1041529 -1041553 -1041559 -1041563 -1041571 -1041577 -1041583 -1041617 -1041619 -1041643 -1041653 -1041671 -1041673 -1041701 -1041731 -1041737 -1041757 -1041779 -1041787 -1041793 -1041823 -1041829 -1041841 -1041853 -1041857 -1041863 -1041869 -1041889 -1041893 -1041907 -1041919 -1041949 -1041961 -1041983 -1041991 -1042001 -1042021 -1042039 -1042043 -1042081 -1042087 -1042091 -1042099 -1042103 -1042109 -1042121 -1042123 -1042133 -1042141 -1042183 -1042187 -1042193 -1042211 -1042241 -1042243 -1042259 -1042267 -1042271 -1042273 -1042309 -1042331 -1042333 -1042357 -1042369 -1042373 -1042381 -1042399 -1042427 -1042439 -1042451 -1042469 -1042487 -1042519 -1042523 -1042529 -1042571 -1042577 -1042583 -1042597 -1042607 -1042609 -1042619 -1042631 -1042633 -1042681 -1042687 -1042693 -1042703 -1042709 -1042733 -1042759 -1042781 -1042799 -1042819 -1042829 -1042837 -1042849 -1042861 -1042897 -1042901 -1042903 -1042931 -1042949 -1042961 -1042997 -1043011 -1043023 -1043047 -1043083 -1043089 -1043111 -1043113 -1043117 -1043131 -1043167 -1043173 -1043177 -1043183 -1043191 -1043201 -1043209 -1043213 -1043221 -1043279 -1043291 -1043293 -1043299 -1043311 -1043323 -1043351 -1043369 -1043377 -1043401 -1043453 -1043467 -1043479 -1043489 -1043501 -1043513 -1043521 -1043531 -1043543 -1043557 -1043587 -1043591 -1043593 -1043597 -1043599 -1043617 -1043639 -1043657 -1043663 -1043683 -1043701 -1043723 -1043743 -1043747 -1043753 -1043759 -1043761 -1043767 -1043773 -1043831 -1043837 -1043839 -1043843 -1043849 -1043857 -1043869 -1043873 -1043897 -1043899 -1043921 -1043923 -1043929 -1043951 -1043969 -1043981 -1044019 -1044023 -1044041 -1044053 -1044079 -1044091 -1044097 -1044133 -1044139 -1044149 -1044161 -1044167 -1044179 -1044181 -1044187 -1044193 -1044209 -1044217 -1044227 -1044247 -1044257 -1044271 -1044283 -1044287 -1044289 -1044299 -1044343 -1044347 -1044353 -1044367 -1044371 -1044383 -1044391 -1044397 -1044409 -1044437 -1044443 -1044451 -1044457 -1044479 -1044509 -1044517 -1044529 -1044559 -1044569 -1044583 -1044587 -1044613 -1044619 -1044629 -1044653 -1044689 -1044697 -1044727 -1044733 -1044737 -1044739 -1044749 -1044751 -1044761 -1044767 -1044779 -1044781 -1044809 -1044811 -1044833 -1044839 -1044847 -1044851 -1044859 -1044877 -1044889 -1044893 -1044931 -1044941 -1044971 -1044997 -1045003 -1045013 -1045021 -1045027 -1045043 -1045061 -1045063 -1045081 -1045111 -1045117 -1045123 -1045129 -1045151 -1045153 -1045157 -1045183 -1045193 -1045199 -1045223 -1045229 -1045237 -1045241 -1045273 -1045277 -1045307 -1045309 -1045321 -1045349 -1045367 -1045391 -1045393 -1045397 -1045409 -1045411 -1045423 -1045427 -1045469 -1045487 -1045493 -1045507 -1045523 -1045529 -1045543 -1045547 -1045549 -1045559 -1045571 -1045573 -1045607 -1045621 -1045633 -1045643 -1045651 -1045663 -1045679 -1045691 -1045727 -1045729 -1045739 -1045763 -1045799 -1045801 -1045819 -1045829 -1045841 -1045859 -1045903 -1045907 -1045963 -1045981 -1045987 -1045997 -1046029 -1046047 -1046051 -1046053 -1046069 -1046077 -1046081 -1046113 -1046119 -1046179 -1046183 -1046189 -1046191 -1046203 -1046207 -1046237 -1046239 -1046257 -1046263 -1046329 -1046347 -1046351 -1046369 -1046371 -1046389 -1046393 -1046399 -1046413 -1046447 -1046449 -1046459 -1046497 -1046519 -1046527 -1046557 -1046579 -1046587 -1046597 -1046599 -1046627 -1046641 -1046657 -1046659 -1046677 -1046681 -1046687 -1046701 -1046711 -1046779 -1046791 -1046797 -1046807 -1046827 -1046833 -1046849 -1046863 -1046867 -1046897 -1046917 -1046933 -1046951 -1046959 -1046977 -1046993 -1046999 -1047031 -1047041 -1047043 -1047061 -1047077 -1047089 -1047097 -1047107 -1047119 -1047127 -1047131 -1047133 -1047139 -1047157 -1047173 -1047197 -1047199 -1047229 -1047239 -1047247 -1047271 -1047281 -1047283 -1047289 -1047307 -1047311 -1047313 -1047317 -1047323 -1047341 -1047367 -1047373 -1047379 -1047391 -1047419 -1047467 -1047469 -1047479 -1047491 -1047499 -1047511 -1047533 -1047539 -1047551 -1047559 -1047587 -1047589 -1047647 -1047649 -1047653 -1047667 -1047671 -1047689 -1047691 -1047701 -1047703 -1047713 -1047721 -1047737 -1047751 -1047763 -1047773 -1047779 -1047821 -1047833 -1047841 -1047859 -1047881 -1047883 -1047887 -1047923 -1047929 -1047941 -1047961 -1047971 -1047979 -1047989 -1047997 -1048007 -1048009 -1048013 -1048027 -1048043 -1048049 -1048051 -1048063 -1048123 -1048127 -1048129 -1048139 -1048189 -1048193 -1048213 -1048217 -1048219 -1048261 -1048273 -1048291 -1048309 -1048343 -1048357 -1048361 -1048367 -1048387 -1048391 -1048423 -1048433 -1048447 -1048507 -1048517 -1048549 -1048559 -1048571 -1048573 -1048583 -1048589 -1048601 -1048609 -1048613 -1048627 -1048633 -1048661 -1048681 -1048703 -1048709 -1048717 -1048721 -1048759 -1048783 -1048793 -1048799 -1048807 -1048829 -1048837 -1048847 -1048867 -1048877 -1048889 -1048891 -1048897 -1048909 -1048919 -1048963 -1048991 -1049011 -1049023 -1049039 -1049051 -1049057 -1049063 -1049077 -1049089 -1049093 -1049101 -1049117 -1049129 -1049131 -1049137 -1049141 -1049143 -1049171 -1049173 -1049177 -1049183 -1049201 -1049219 -1049227 -1049239 -1049263 -1049281 -1049297 -1049333 -1049339 -1049387 -1049413 -1049429 -1049437 -1049459 -1049471 -1049473 -1049479 -1049483 -1049497 -1049509 -1049519 -1049527 -1049533 -1049537 -1049549 -1049569 -1049599 -1049603 -1049611 -1049623 -1049639 -1049663 -1049677 -1049681 -1049683 -1049687 -1049707 -1049717 -1049747 -1049773 -1049791 -1049809 -1049821 -1049827 -1049833 -1049837 -1049843 -1049849 -1049857 -1049861 -1049863 -1049891 -1049897 -1049899 -1049941 -1049953 -1049963 -1049977 -1049999 -1050011 -1050013 -1050031 -1050041 -1050053 -1050079 -1050083 -1050139 -1050151 -1050167 -1050169 -1050191 -1050197 -1050229 -1050233 -1050239 -1050241 -1050253 -1050281 -1050307 -1050317 -1050323 -1050331 -1050337 -1050349 -1050367 -1050391 -1050421 -1050431 -1050437 -1050449 -1050451 -1050457 -1050473 -1050503 -1050509 -1050523 -1050563 -1050593 -1050611 -1050631 -1050713 -1050727 -1050733 -1050737 -1050739 -1050743 -1050769 -1050773 -1050781 -1050811 -1050817 -1050851 -1050853 -1050887 -1050899 -1050901 -1050913 -1050949 -1050961 -1050977 -1050997 -1051003 -1051007 -1051009 -1051019 -1051027 -1051051 -1051069 -1051079 -1051081 -1051139 -1051147 -1051151 -1051153 -1051157 -1051177 -1051181 -1051247 -1051277 -1051283 -1051291 -1051301 -1051313 -1051319 -1051333 -1051373 -1051397 -1051409 -1051417 -1051423 -1051459 -1051469 -1051471 -1051481 -1051499 -1051507 -1051543 -1051549 -1051553 -1051559 -1051571 -1051591 -1051601 -1051607 -1051619 -1051621 -1051639 -1051643 -1051649 -1051663 -1051697 -1051709 -1051717 -1051747 -1051759 -1051763 -1051781 -1051789 -1051811 -1051819 -1051829 -1051847 -1051849 -1051879 -1051889 -1051903 -1051913 -1051927 -1051949 -1051957 -1051961 -1051979 -1051987 -1051991 -1052027 -1052039 -1052041 -1052063 -1052083 -1052099 -1052111 -1052119 -1052137 -1052141 -1052179 -1052197 -1052203 -1052221 -1052231 -1052237 -1052269 -1052279 -1052281 -1052287 -1052299 -1052309 -1052321 -1052327 -1052329 -1052333 -1052413 -1052417 -1052431 -1052437 -1052459 -1052473 -1052479 -1052489 -1052531 -1052533 -1052537 -1052551 -1052561 -1052563 -1052567 -1052573 -1052609 -1052629 -1052663 -1052693 -1052707 -1052719 -1052731 -1052743 -1052747 -1052767 -1052797 -1052801 -1052803 -1052813 -1052819 -1052851 -1052873 -1052881 -1052893 -1052897 -1052899 -1052939 -1052971 -1052981 -1052993 -1053007 -1053029 -1053061 -1053067 -1053071 -1053079 -1053083 -1053089 -1053097 -1053103 -1053179 -1053181 -1053191 -1053197 -1053233 -1053257 -1053259 -1053263 -1053271 -1053293 -1053301 -1053319 -1053347 -1053361 -1053383 -1053401 -1053407 -1053421 -1053449 -1053461 -1053467 -1053487 -1053491 -1053497 -1053509 -1053511 -1053529 -1053539 -1053551 -1053557 -1053571 -1053581 -1053583 -1053589 -1053593 -1053617 -1053691 -1053697 -1053707 -1053713 -1053727 -1053737 -1053739 -1053749 -1053757 -1053769 -1053809 -1053817 -1053821 -1053827 -1053863 -1053953 -1053959 -1053967 -1053971 -1053989 -1053991 -1054003 -1054007 -1054013 -1054033 -1054043 -1054049 -1054061 -1054073 -1054091 -1054133 -1054169 -1054171 -1054181 -1054189 -1054199 -1054201 -1054213 -1054219 -1054243 -1054247 -1054259 -1054267 -1054301 -1054303 -1054309 -1054321 -1054327 -1054331 -1054337 -1054363 -1054369 -1054373 -1054381 -1054393 -1054423 -1054429 -1054439 -1054441 -1054457 -1054477 -1054483 -1054517 -1054523 -1054531 -1054549 -1054577 -1054583 -1054597 -1054607 -1054609 -1054621 -1054639 -1054649 -1054667 -1054673 -1054679 -1054717 -1054721 -1054723 -1054733 -1054769 -1054813 -1054819 -1054831 -1054843 -1054853 -1054903 -1054909 -1054927 -1054931 -1054951 -1054957 -1054993 -1055017 -1055039 -1055057 -1055063 -1055077 -1055083 -1055113 -1055137 -1055141 -1055143 -1055167 -1055189 -1055191 -1055231 -1055233 -1055251 -1055261 -1055267 -1055269 -1055303 -1055321 -1055347 -1055359 -1055363 -1055371 -1055387 -1055399 -1055407 -1055413 -1055423 -1055429 -1055437 -1055471 -1055489 -1055501 -1055503 -1055531 -1055543 -1055567 -1055591 -1055597 -1055603 -1055609 -1055611 -1055671 -1055689 -1055713 -1055731 -1055737 -1055741 -1055771 -1055783 -1055801 -1055809 -1055827 -1055839 -1055851 -1055863 -1055867 -1055881 -1055893 -1055897 -1055911 -1055917 -1055933 -1055939 -1055947 -1055959 -1055969 -1055981 -1056007 -1056019 -1056047 -1056049 -1056053 -1056061 -1056071 -1056073 -1056089 -1056109 -1056113 -1056149 -1056161 -1056169 -1056173 -1056179 -1056203 -1056217 -1056241 -1056247 -1056269 -1056271 -1056281 -1056287 -1056311 -1056317 -1056323 -1056347 -1056353 -1056361 -1056371 -1056373 -1056379 -1056401 -1056443 -1056463 -1056469 -1056479 -1056481 -1056493 -1056509 -1056521 -1056541 -1056563 -1056569 -1056577 -1056589 -1056599 -1056613 -1056617 -1056623 -1056641 -1056659 -1056667 -1056707 -1056719 -1056721 -1056739 -1056773 -1056779 -1056793 -1056823 -1056829 -1056833 -1056863 -1056871 -1056893 -1056911 -1056917 -1056929 -1056949 -1056959 -1056971 -1057003 -1057013 -1057019 -1057033 -1057037 -1057051 -1057087 -1057093 -1057117 -1057129 -1057157 -1057163 -1057181 -1057183 -1057219 -1057223 -1057237 -1057249 -1057271 -1057279 -1057291 -1057307 -1057361 -1057367 -1057387 -1057391 -1057393 -1057411 -1057421 -1057477 -1057487 -1057489 -1057493 -1057531 -1057541 -1057561 -1057577 -1057579 -1057603 -1057607 -1057613 -1057631 -1057633 -1057643 -1057657 -1057663 -1057681 -1057699 -1057703 -1057739 -1057741 -1057753 -1057781 -1057807 -1057831 -1057853 -1057879 -1057883 -1057897 -1057907 -1057919 -1057951 -1057957 -1057963 -1057981 -1057993 -1058009 -1058011 -1058021 -1058027 -1058041 -1058059 -1058077 -1058093 -1058107 -1058117 -1058143 -1058147 -1058149 -1058153 -1058171 -1058179 -1058203 -1058221 -1058227 -1058249 -1058257 -1058263 -1058287 -1058303 -1058329 -1058339 -1058341 -1058353 -1058377 -1058381 -1058383 -1058389 -1058419 -1058423 -1058443 -1058461 -1058479 -1058489 -1058503 -1058507 -1058543 -1058549 -1058567 -1058591 -1058593 -1058597 -1058627 -1058639 -1058653 -1058657 -1058663 -1058671 -1058677 -1058683 -1058693 -1058711 -1058723 -1058731 -1058747 -1058749 -1058753 -1058767 -1058773 -1058779 -1058791 -1058803 -1058807 -1058809 -1058821 -1058839 -1058861 -1058891 -1058921 -1058951 -1058983 -1058999 -1059001 -1059007 -1059017 -1059029 -1059059 -1059061 -1059067 -1059073 -1059077 -1059103 -1059119 -1059131 -1059137 -1059161 -1059169 -1059181 -1059197 -1059209 -1059217 -1059221 -1059251 -1059257 -1059259 -1059263 -1059271 -1059293 -1059299 -1059313 -1059323 -1059343 -1059349 -1059413 -1059419 -1059433 -1059437 -1059439 -1059467 -1059479 -1059503 -1059511 -1059517 -1059547 -1059557 -1059571 -1059599 -1059613 -1059637 -1059647 -1059671 -1059683 -1059697 -1059701 -1059703 -1059713 -1059733 -1059743 -1059749 -1059757 -1059769 -1059787 -1059823 -1059833 -1059847 -1059857 -1059871 -1059889 -1059893 -1059923 -1059931 -1059937 -1059941 -1060009 -1060019 -1060021 -1060039 -1060043 -1060051 -1060061 -1060091 -1060097 -1060123 -1060133 -1060151 -1060177 -1060187 -1060201 -1060207 -1060223 -1060229 -1060237 -1060249 -1060253 -1060271 -1060303 -1060313 -1060321 -1060343 -1060349 -1060351 -1060357 -1060361 -1060373 -1060379 -1060391 -1060393 -1060403 -1060421 -1060427 -1060441 -1060453 -1060463 -1060469 -1060481 -1060487 -1060513 -1060519 -1060529 -1060567 -1060571 -1060573 -1060589 -1060597 -1060621 -1060673 -1060687 -1060721 -1060723 -1060739 -1060747 -1060769 -1060777 -1060781 -1060861 -1060867 -1060883 -1060937 -1060949 -1060963 -1060981 -1060991 -1060993 -1061033 -1061057 -1061069 -1061087 -1061101 -1061107 -1061117 -1061129 -1061141 -1061143 -1061149 -1061171 -1061189 -1061227 -1061251 -1061261 -1061273 -1061279 -1061287 -1061297 -1061311 -1061317 -1061323 -1061353 -1061363 -1061377 -1061393 -1061407 -1061413 -1061441 -1061453 -1061483 -1061509 -1061513 -1061527 -1061561 -1061569 -1061573 -1061591 -1061597 -1061609 -1061617 -1061623 -1061629 -1061647 -1061651 -1061677 -1061689 -1061699 -1061707 -1061717 -1061729 -1061737 -1061759 -1061771 -1061773 -1061779 -1061783 -1061807 -1061831 -1061849 -1061867 -1061869 -1061881 -1061897 -1061903 -1061909 -1061911 -1061917 -1061959 -1061969 -1061993 -1062001 -1062013 -1062031 -1062073 -1062107 -1062121 -1062169 -1062197 -1062203 -1062251 -1062253 -1062263 -1062293 -1062311 -1062343 -1062349 -1062361 -1062367 -1062379 -1062407 -1062409 -1062427 -1062443 -1062469 -1062497 -1062511 -1062521 -1062547 -1062557 -1062563 -1062599 -1062601 -1062643 -1062671 -1062673 -1062683 -1062697 -1062701 -1062707 -1062731 -1062779 -1062781 -1062793 -1062797 -1062827 -1062847 -1062869 -1062871 -1062877 -1062881 -1062907 -1062911 -1062913 -1062931 -1062947 -1062949 -1062977 -1062979 -1062989 -1063001 -1063009 -1063019 -1063033 -1063039 -1063043 -1063067 -1063079 -1063087 -1063109 -1063123 -1063151 -1063157 -1063159 -1063177 -1063189 -1063193 -1063201 -1063213 -1063219 -1063241 -1063243 -1063273 -1063303 -1063319 -1063351 -1063379 -1063397 -1063399 -1063409 -1063427 -1063441 -1063453 -1063457 -1063463 -1063471 -1063477 -1063483 -1063501 -1063523 -1063529 -1063541 -1063547 -1063553 -1063561 -1063597 -1063609 -1063613 -1063619 -1063627 -1063637 -1063649 -1063661 -1063693 -1063709 -1063721 -1063729 -1063739 -1063747 -1063757 -1063771 -1063781 -1063813 -1063823 -1063831 -1063837 -1063847 -1063849 -1063871 -1063873 -1063891 -1063897 -1063903 -1063913 -1063919 -1063921 -1063927 -1063961 -1063963 -1063967 -1063969 -1063973 -1063987 -1063999 -1064017 -1064029 -1064059 -1064069 -1064087 -1064117 -1064131 -1064153 -1064159 -1064177 -1064179 -1064191 -1064197 -1064201 -1064243 -1064257 -1064263 -1064269 -1064281 -1064311 -1064317 -1064321 -1064333 -1064339 -1064341 -1064359 -1064377 -1064383 -1064407 -1064411 -1064431 -1064467 -1064471 -1064473 -1064477 -1064507 -1064519 -1064521 -1064533 -1064549 -1064587 -1064593 -1064629 -1064653 -1064669 -1064671 -1064681 -1064689 -1064699 -1064731 -1064737 -1064743 -1064753 -1064771 -1064783 -1064801 -1064813 -1064867 -1064873 -1064911 -1064927 -1064933 -1064939 -1064941 -1064951 -1064953 -1064957 -1064977 -1064989 -1065011 -1065013 -1065017 -1065019 -1065037 -1065041 -1065047 -1065059 -1065073 -1065089 -1065091 -1065109 -1065131 -1065133 -1065137 -1065173 -1065209 -1065217 -1065263 -1065269 -1065277 -1065283 -1065307 -1065313 -1065319 -1065331 -1065343 -1065347 -1065391 -1065409 -1065433 -1065469 -1065479 -1065503 -1065511 -1065523 -1065527 -1065529 -1065557 -1065569 -1065593 -1065601 -1065629 -1065643 -1065667 -1065677 -1065683 -1065689 -1065697 -1065709 -1065733 -1065763 -1065773 -1065787 -1065791 -1065809 -1065817 -1065821 -1065829 -1065839 -1065847 -1065851 -1065887 -1065893 -1065899 -1065901 -1065937 -1065941 -1065949 -1065973 -1065979 -1066001 -1066031 -1066049 -1066063 -1066067 -1066111 -1066133 -1066139 -1066141 -1066157 -1066159 -1066217 -1066231 -1066237 -1066253 -1066267 -1066279 -1066283 -1066297 -1066313 -1066319 -1066327 -1066333 -1066339 -1066343 -1066367 -1066379 -1066399 -1066409 -1066411 -1066423 -1066433 -1066447 -1066511 -1066517 -1066523 -1066531 -1066553 -1066561 -1066567 -1066577 -1066619 -1066621 -1066643 -1066651 -1066669 -1066687 -1066693 -1066721 -1066729 -1066753 -1066757 -1066777 -1066789 -1066811 -1066817 -1066847 -1066859 -1066867 -1066883 -1066889 -1066909 -1066913 -1066931 -1066973 -1066979 -1066981 -1066987 -1066999 -1067009 -1067023 -1067029 -1067047 -1067057 -1067063 -1067069 -1067083 -1067137 -1067147 -1067159 -1067167 -1067179 -1067203 -1067207 -1067221 -1067239 -1067263 -1067293 -1067327 -1067329 -1067347 -1067351 -1067359 -1067371 -1067383 -1067387 -1067411 -1067441 -1067459 -1067467 -1067471 -1067489 -1067491 -1067497 -1067509 -1067537 -1067551 -1067557 -1067567 -1067569 -1067593 -1067597 -1067611 -1067621 -1067639 -1067653 -1067669 -1067687 -1067701 -1067707 -1067711 -1067741 -1067747 -1067749 -1067761 -1067767 -1067777 -1067789 -1067797 -1067831 -1067837 -1067849 -1067851 -1067879 -1067893 -1067903 -1067909 -1067921 -1067939 -1067951 -1067987 -1067999 -1068019 -1068037 -1068061 -1068083 -1068101 -1068103 -1068107 -1068113 -1068131 -1068149 -1068191 -1068203 -1068217 -1068233 -1068241 -1068247 -1068251 -1068253 -1068257 -1068259 -1068271 -1068307 -1068311 -1068323 -1068329 -1068343 -1068367 -1068371 -1068377 -1068383 -1068407 -1068409 -1068437 -1068439 -1068461 -1068469 -1068481 -1068491 -1068497 -1068499 -1068517 -1068559 -1068577 -1068589 -1068611 -1068619 -1068629 -1068631 -1068677 -1068701 -1068703 -1068707 -1068709 -1068713 -1068719 -1068721 -1068751 -1068757 -1068761 -1068779 -1068803 -1068811 -1068817 -1068857 -1068871 -1068877 -1068887 -1068889 -1068901 -1068913 -1068917 -1068941 -1068989 -1069001 -1069007 -1069031 -1069039 -1069043 -1069051 -1069087 -1069099 -1069127 -1069129 -1069141 -1069171 -1069183 -1069193 -1069199 -1069207 -1069217 -1069219 -1069223 -1069267 -1069273 -1069291 -1069303 -1069307 -1069349 -1069363 -1069379 -1069421 -1069427 -1069429 -1069441 -1069451 -1069459 -1069463 -1069499 -1069501 -1069507 -1069517 -1069543 -1069547 -1069553 -1069561 -1069571 -1069573 -1069577 -1069583 -1069591 -1069597 -1069603 -1069609 -1069631 -1069639 -1069667 -1069687 -1069693 -1069697 -1069727 -1069741 -1069751 -1069777 -1069807 -1069811 -1069819 -1069823 -1069853 -1069867 -1069919 -1069921 -1069927 -1069931 -1069933 -1069949 -1069951 -1069973 -1069979 -1069987 -1070009 -1070011 -1070021 -1070033 -1070039 -1070063 -1070081 -1070087 -1070093 -1070131 -1070149 -1070171 -1070189 -1070197 -1070203 -1070207 -1070221 -1070231 -1070233 -1070243 -1070249 -1070257 -1070287 -1070291 -1070309 -1070317 -1070323 -1070339 -1070341 -1070347 -1070357 -1070369 -1070389 -1070411 -1070417 -1070423 -1070429 -1070431 -1070453 -1070471 -1070491 -1070497 -1070501 -1070513 -1070527 -1070533 -1070543 -1070557 -1070561 -1070567 -1070569 -1070579 -1070621 -1070659 -1070681 -1070683 -1070689 -1070753 -1070761 -1070777 -1070789 -1070803 -1070827 -1070843 -1070851 -1070869 -1070873 -1070899 -1070921 -1070933 -1070939 -1070947 -1070981 -1070987 -1071023 -1071047 -1071053 -1071061 -1071067 -1071121 -1071131 -1071139 -1071149 -1071151 -1071157 -1071181 -1071193 -1071197 -1071223 -1071227 -1071229 -1071233 -1071241 -1071253 -1071269 -1071283 -1071311 -1071313 -1071337 -1071341 -1071349 -1071359 -1071373 -1071377 -1071379 -1071401 -1071407 -1071419 -1071439 -1071443 -1071451 -1071457 -1071479 -1071487 -1071529 -1071533 -1071541 -1071563 -1071569 -1071571 -1071589 -1071601 -1071641 -1071643 -1071659 -1071661 -1071671 -1071683 -1071703 -1071739 -1071743 -1071761 -1071773 -1071787 -1071803 -1071817 -1071821 -1071841 -1071857 -1071871 -1071899 -1071907 -1071911 -1071919 -1071937 -1071943 -1071977 -1071979 -1071991 -1072009 -1072039 -1072103 -1072129 -1072133 -1072147 -1072157 -1072163 -1072187 -1072199 -1072213 -1072219 -1072229 -1072231 -1072301 -1072327 -1072339 -1072363 -1072367 -1072373 -1072381 -1072387 -1072397 -1072429 -1072433 -1072439 -1072447 -1072457 -1072459 -1072471 -1072517 -1072537 -1072543 -1072613 -1072627 -1072633 -1072637 -1072657 -1072711 -1072733 -1072763 -1072793 -1072801 -1072811 -1072823 -1072829 -1072831 -1072837 -1072843 -1072849 -1072859 -1072867 -1072901 -1072919 -1072931 -1072933 -1072937 -1072943 -1072957 -1072961 -1072969 -1072991 -1072997 -1072999 -1073053 -1073069 -1073077 -1073089 -1073099 -1073113 -1073117 -1073131 -1073141 -1073143 -1073147 -1073153 -1073183 -1073201 -1073209 -1073213 -1073221 -1073239 -1073243 -1073263 -1073279 -1073297 -1073311 -1073321 -1073351 -1073353 -1073381 -1073383 -1073393 -1073399 -1073411 -1073441 -1073447 -1073461 -1073491 -1073507 -1073509 -1073521 -1073537 -1073563 -1073573 -1073587 -1073593 -1073599 -1073603 -1073627 -1073647 -1073651 -1073687 -1073711 -1073713 -1073717 -1073729 -1073773 -1073789 -1073791 -1073803 -1073819 -1073837 -1073857 -1073869 -1073879 -1073881 -1073909 -1073911 -1073921 -1073951 -1073953 -1073983 -1074001 -1074023 -1074041 -1074061 -1074067 -1074071 -1074079 -1074083 -1074107 -1074109 -1074113 -1074121 -1074133 -1074167 -1074223 -1074251 -1074253 -1074259 -1074277 -1074287 -1074289 -1074299 -1074329 -1074343 -1074361 -1074371 -1074377 -1074379 -1074389 -1074427 -1074433 -1074461 -1074473 -1074481 -1074509 -1074511 -1074523 -1074533 -1074559 -1074581 -1074607 -1074617 -1074641 -1074643 -1074649 -1074673 -1074683 -1074691 -1074701 -1074707 -1074709 -1074713 -1074719 -1074751 -1074761 -1074763 -1074833 -1074839 -1074847 -1074851 -1074877 -1074883 -1074889 -1074901 -1074907 -1074917 -1074919 -1074923 -1074929 -1074949 -1074971 -1074973 -1074977 -1074989 -1074991 -1075007 -1075013 -1075021 -1075027 -1075069 -1075073 -1075079 -1075091 -1075093 -1075103 -1075133 -1075141 -1075147 -1075159 -1075163 -1075169 -1075171 -1075177 -1075187 -1075201 -1075231 -1075237 -1075241 -1075259 -1075279 -1075289 -1075303 -1075337 -1075339 -1075351 -1075357 -1075391 -1075397 -1075409 -1075429 -1075433 -1075441 -1075453 -1075463 -1075469 -1075489 -1075493 -1075499 -1075507 -1075519 -1075531 -1075537 -1075561 -1075577 -1075601 -1075619 -1075621 -1075643 -1075649 -1075651 -1075663 -1075667 -1075673 -1075681 -1075691 -1075693 -1075699 -1075703 -1075727 -1075729 -1075757 -1075759 -1075769 -1075771 -1075787 -1075807 -1075843 -1075853 -1075859 -1075897 -1075909 -1075957 -1075973 -1076003 -1076011 -1076017 -1076029 -1076039 -1076051 -1076057 -1076063 -1076069 -1076077 -1076107 -1076111 -1076113 -1076123 -1076129 -1076137 -1076143 -1076167 -1076171 -1076191 -1076203 -1076213 -1076237 -1076263 -1076279 -1076281 -1076303 -1076323 -1076329 -1076353 -1076359 -1076381 -1076399 -1076401 -1076417 -1076429 -1076443 -1076447 -1076461 -1076473 -1076477 -1076501 -1076503 -1076507 -1076513 -1076519 -1076557 -1076563 -1076587 -1076611 -1076617 -1076639 -1076651 -1076657 -1076671 -1076707 -1076717 -1076731 -1076753 -1076767 -1076771 -1076773 -1076813 -1076821 -1076827 -1076843 -1076861 -1076869 -1076879 -1076893 -1076903 -1076917 -1076921 -1076953 -1076981 -1077017 -1077023 -1077047 -1077059 -1077079 -1077101 -1077127 -1077143 -1077161 -1077179 -1077191 -1077203 -1077221 -1077227 -1077233 -1077289 -1077299 -1077301 -1077311 -1077337 -1077347 -1077353 -1077371 -1077397 -1077413 -1077421 -1077449 -1077457 -1077469 -1077499 -1077533 -1077539 -1077541 -1077563 -1077599 -1077607 -1077641 -1077673 -1077677 -1077691 -1077697 -1077707 -1077719 -1077721 -1077733 -1077743 -1077751 -1077761 -1077763 -1077793 -1077799 -1077821 -1077823 -1077827 -1077841 -1077859 -1077863 -1077893 -1077911 -1077913 -1077917 -1077943 -1077971 -1077977 -1077997 -1078001 -1078009 -1078019 -1078027 -1078031 -1078043 -1078081 -1078109 -1078111 -1078127 -1078151 -1078153 -1078159 -1078163 -1078169 -1078183 -1078199 -1078219 -1078241 -1078247 -1078331 -1078333 -1078367 -1078369 -1078373 -1078387 -1078393 -1078403 -1078409 -1078411 -1078417 -1078471 -1078489 -1078507 -1078537 -1078559 -1078589 -1078643 -1078657 -1078673 -1078681 -1078691 -1078699 -1078711 -1078717 -1078733 -1078739 -1078757 -1078787 -1078789 -1078807 -1078813 -1078817 -1078841 -1078849 -1078853 -1078873 -1078879 -1078919 -1078927 -1078937 -1078943 -1078951 -1078967 -1078981 -1078993 -1079009 -1079011 -1079021 -1079033 -1079053 -1079059 -1079069 -1079077 -1079081 -1079087 -1079093 -1079101 -1079107 -1079123 -1079147 -1079153 -1079173 -1079189 -1079213 -1079227 -1079233 -1079251 -1079269 -1079291 -1079297 -1079311 -1079317 -1079329 -1079339 -1079357 -1079359 -1079369 -1079383 -1079399 -1079417 -1079431 -1079453 -1079461 -1079471 -1079473 -1079503 -1079509 -1079527 -1079531 -1079539 -1079569 -1079593 -1079609 -1079621 -1079629 -1079633 -1079647 -1079651 -1079669 -1079671 -1079681 -1079711 -1079717 -1079753 -1079777 -1079779 -1079783 -1079797 -1079809 -1079821 -1079831 -1079849 -1079861 -1079867 -1079879 -1079887 -1079917 -1079927 -1079929 -1079933 -1079957 -1079963 -1079977 -1079983 -1079987 -1079999 -1080007 -1080029 -1080043 -1080049 -1080059 -1080073 -1080077 -1080083 -1080089 -1080091 -1080097 -1080119 -1080137 -1080143 -1080173 -1080199 -1080217 -1080223 -1080229 -1080251 -1080259 -1080263 -1080269 -1080271 -1080281 -1080301 -1080307 -1080311 -1080329 -1080341 -1080347 -1080353 -1080383 -1080413 -1080419 -1080433 -1080439 -1080449 -1080451 -1080463 -1080479 -1080481 -1080491 -1080523 -1080539 -1080553 -1080557 -1080559 -1080589 -1080613 -1080647 -1080649 -1080661 -1080679 -1080683 -1080713 -1080749 -1080757 -1080763 -1080767 -1080773 -1080787 -1080791 -1080797 -1080803 -1080811 -1080817 -1080823 -1080841 -1080847 -1080851 -1080857 -1080899 -1080901 -1080907 -1080913 -1080923 -1080941 -1080943 -1080971 -1080973 -1080983 -1081027 -1081037 -1081051 -1081061 -1081079 -1081097 -1081099 -1081121 -1081123 -1081127 -1081133 -1081139 -1081153 -1081163 -1081219 -1081229 -1081231 -1081237 -1081243 -1081247 -1081277 -1081279 -1081291 -1081303 -1081307 -1081331 -1081337 -1081351 -1081361 -1081369 -1081403 -1081417 -1081429 -1081441 -1081477 -1081501 -1081513 -1081541 -1081583 -1081631 -1081637 -1081657 -1081679 -1081681 -1081687 -1081699 -1081709 -1081711 -1081721 -1081723 -1081733 -1081741 -1081757 -1081763 -1081771 -1081777 -1081781 -1081789 -1081793 -1081813 -1081823 -1081853 -1081859 -1081891 -1081901 -1081907 -1081919 -1081937 -1081939 -1081979 -1081981 -1082017 -1082023 -1082027 -1082047 -1082083 -1082089 -1082093 -1082099 -1082129 -1082141 -1082143 -1082149 -1082153 -1082161 -1082171 -1082177 -1082189 -1082197 -1082209 -1082231 -1082233 -1082243 -1082273 -1082317 -1082321 -1082351 -1082369 -1082377 -1082381 -1082383 -1082387 -1082399 -1082429 -1082443 -1082447 -1082467 -1082491 -1082527 -1082531 -1082533 -1082573 -1082579 -1082581 -1082593 -1082597 -1082603 -1082621 -1082629 -1082647 -1082659 -1082681 -1082699 -1082707 -1082717 -1082723 -1082729 -1082743 -1082761 -1082777 -1082801 -1082881 -1082891 -1082911 -1082969 -1082971 -1082989 -1082993 -1082999 -1083007 -1083031 -1083037 -1083059 -1083073 -1083077 -1083079 -1083083 -1083107 -1083113 -1083119 -1083151 -1083167 -1083191 -1083193 -1083211 -1083241 -1083253 -1083283 -1083287 -1083289 -1083301 -1083307 -1083311 -1083317 -1083319 -1083337 -1083349 -1083367 -1083371 -1083377 -1083391 -1083409 -1083431 -1083443 -1083449 -1083451 -1083463 -1083473 -1083497 -1083517 -1083541 -1083559 -1083571 -1083583 -1083601 -1083611 -1083613 -1083659 -1083689 -1083707 -1083713 -1083721 -1083743 -1083749 -1083757 -1083793 -1083809 -1083827 -1083833 -1083839 -1083847 -1083851 -1083871 -1083881 -1083899 -1083911 -1083913 -1083923 -1083941 -1083947 -1083949 -1083983 -1084001 -1084019 -1084043 -1084051 -1084067 -1084079 -1084087 -1084093 -1084103 -1084133 -1084147 -1084157 -1084177 -1084217 -1084219 -1084247 -1084253 -1084267 -1084297 -1084301 -1084309 -1084313 -1084333 -1084357 -1084367 -1084373 -1084403 -1084423 -1084429 -1084451 -1084459 -1084469 -1084471 -1084477 -1084483 -1084493 -1084543 -1084547 -1084553 -1084579 -1084609 -1084613 -1084621 -1084627 -1084637 -1084649 -1084661 -1084669 -1084673 -1084697 -1084711 -1084723 -1084747 -1084757 -1084771 -1084777 -1084793 -1084799 -1084817 -1084823 -1084829 -1084859 -1084871 -1084891 -1084927 -1084939 -1084943 -1084949 -1084981 -1084987 -1084997 -1085003 -1085011 -1085017 -1085023 -1085047 -1085053 -1085101 -1085111 -1085113 -1085131 -1085137 -1085141 -1085143 -1085153 -1085159 -1085179 -1085197 -1085221 -1085269 -1085309 -1085317 -1085327 -1085351 -1085353 -1085369 -1085389 -1085407 -1085419 -1085429 -1085431 -1085443 -1085459 -1085473 -1085509 -1085521 -1085551 -1085587 -1085611 -1085627 -1085633 -1085657 -1085663 -1085677 -1085681 -1085687 -1085719 -1085737 -1085753 -1085767 -1085771 -1085779 -1085801 -1085809 -1085813 -1085827 -1085857 -1085863 -1085867 -1085873 -1085881 -1085891 -1085911 -1085933 -1085957 -1085971 -1085989 -1086031 -1086047 -1086073 -1086089 -1086091 -1086101 -1086103 -1086119 -1086133 -1086139 -1086149 -1086161 -1086179 -1086191 -1086193 -1086199 -1086203 -1086247 -1086251 -1086257 -1086259 -1086263 -1086277 -1086299 -1086301 -1086307 -1086331 -1086343 -1086347 -1086353 -1086361 -1086373 -1086389 -1086391 -1086413 -1086433 -1086443 -1086461 -1086469 -1086493 -1086509 -1086511 -1086523 -1086529 -1086557 -1086559 -1086587 -1086607 -1086611 -1086619 -1086637 -1086641 -1086647 -1086677 -1086689 -1086703 -1086731 -1086749 -1086763 -1086769 -1086791 -1086809 -1086817 -1086859 -1086863 -1086881 -1086893 -1086901 -1086913 -1086919 -1086923 -1086931 -1086937 -1086989 -1086991 -1087001 -1087019 -1087027 -1087061 -1087091 -1087109 -1087117 -1087129 -1087147 -1087159 -1087231 -1087241 -1087249 -1087259 -1087271 -1087291 -1087301 -1087309 -1087349 -1087357 -1087379 -1087381 -1087391 -1087409 -1087423 -1087433 -1087451 -1087453 -1087459 -1087483 -1087487 -1087517 -1087519 -1087543 -1087553 -1087561 -1087589 -1087591 -1087621 -1087631 -1087657 -1087663 -1087673 -1087679 -1087687 -1087717 -1087729 -1087741 -1087747 -1087753 -1087781 -1087787 -1087789 -1087799 -1087811 -1087817 -1087829 -1087841 -1087843 -1087861 -1087873 -1087897 -1087903 -1087907 -1087937 -1087963 -1087967 -1087973 -1087981 -1087987 -1088023 -1088027 -1088039 -1088053 -1088063 -1088071 -1088081 -1088089 -1088093 -1088123 -1088159 -1088161 -1088209 -1088233 -1088237 -1088239 -1088251 -1088267 -1088273 -1088293 -1088309 -1088371 -1088387 -1088389 -1088393 -1088407 -1088413 -1088419 -1088431 -1088443 -1088447 -1088449 -1088467 -1088471 -1088489 -1088519 -1088533 -1088537 -1088543 -1088569 -1088579 -1088603 -1088611 -1088617 -1088621 -1088623 -1088639 -1088641 -1088657 -1088669 -1088671 -1088687 -1088693 -1088707 -1088723 -1088749 -1088753 -1088761 -1088777 -1088783 -1088807 -1088827 -1088831 -1088839 -1088851 -1088903 -1088917 -1088933 -1088953 -1088957 -1088959 -1088977 -1088987 -1088993 -1089017 -1089029 -1089047 -1089091 -1089103 -1089107 -1089113 -1089133 -1089161 -1089191 -1089197 -1089217 -1089223 -1089227 -1089239 -1089259 -1089299 -1089313 -1089359 -1089383 -1089397 -1089401 -1089421 -1089427 -1089457 -1089461 -1089463 -1089469 -1089481 -1089497 -1089503 -1089509 -1089523 -1089551 -1089563 -1089611 -1089629 -1089653 -1089661 -1089677 -1089679 -1089703 -1089709 -1089713 -1089757 -1089793 -1089799 -1089841 -1089863 -1089877 -1089917 -1089919 -1089941 -1089943 -1089961 -1089967 -1090003 -1090013 -1090021 -1090027 -1090031 -1090097 -1090099 -1090127 -1090129 -1090151 -1090153 -1090169 -1090181 -1090189 -1090211 -1090213 -1090217 -1090241 -1090249 -1090267 -1090273 -1090303 -1090333 -1090373 -1090381 -1090387 -1090403 -1090409 -1090421 -1090423 -1090457 -1090459 -1090469 -1090471 -1090483 -1090493 -1090519 -1090553 -1090577 -1090589 -1090597 -1090613 -1090627 -1090681 -1090697 -1090709 -1090711 -1090717 -1090721 -1090757 -1090759 -1090769 -1090783 -1090799 -1090807 -1090819 -1090841 -1090849 -1090877 -1090879 -1090883 -1090889 -1090891 -1090897 -1090909 -1090919 -1090927 -1090937 -1090939 -1090949 -1090963 -1090967 -1090979 -1090997 -1091003 -1091017 -1091021 -1091023 -1091033 -1091047 -1091053 -1091059 -1091063 -1091071 -1091119 -1091137 -1091147 -1091149 -1091159 -1091161 -1091173 -1091177 -1091191 -1091219 -1091221 -1091239 -1091243 -1091257 -1091261 -1091263 -1091267 -1091269 -1091273 -1091287 -1091329 -1091339 -1091359 -1091369 -1091371 -1091381 -1091393 -1091399 -1091401 -1091411 -1091413 -1091443 -1091459 -1091471 -1091477 -1091509 -1091521 -1091527 -1091549 -1091551 -1091561 -1091581 -1091591 -1091609 -1091617 -1091627 -1091633 -1091639 -1091659 -1091663 -1091681 -1091687 -1091711 -1091729 -1091731 -1091737 -1091749 -1091777 -1091807 -1091809 -1091837 -1091843 -1091863 -1091869 -1091887 -1091917 -1091939 -1091957 -1091983 -1092019 -1092023 -1092041 -1092043 -1092059 -1092061 -1092067 -1092089 -1092103 -1092107 -1092127 -1092137 -1092151 -1092163 -1092173 -1092181 -1092191 -1092209 -1092229 -1092241 -1092251 -1092257 -1092269 -1092283 -1092307 -1092331 -1092337 -1092349 -1092353 -1092361 -1092373 -1092379 -1092389 -1092391 -1092397 -1092419 -1092433 -1092451 -1092461 -1092463 -1092473 -1092479 -1092493 -1092541 -1092583 -1092593 -1092601 -1092629 -1092643 -1092659 -1092667 -1092677 -1092713 -1092731 -1092733 -1092757 -1092779 -1092803 -1092821 -1092827 -1092829 -1092851 -1092853 -1092863 -1092887 -1092893 -1092901 -1092907 -1092911 -1092919 -1092929 -1092961 -1092977 -1092989 -1092991 -1092997 -1093007 -1093033 -1093061 -1093063 -1093067 -1093069 -1093087 -1093109 -1093111 -1093129 -1093133 -1093159 -1093163 -1093177 -1093199 -1093201 -1093223 -1093237 -1093243 -1093249 -1093273 -1093283 -1093289 -1093297 -1093307 -1093327 -1093331 -1093357 -1093363 -1093381 -1093399 -1093403 -1093409 -1093427 -1093441 -1093487 -1093493 -1093517 -1093529 -1093531 -1093537 -1093541 -1093553 -1093571 -1093577 -1093591 -1093633 -1093637 -1093639 -1093657 -1093663 -1093667 -1093679 -1093681 -1093699 -1093717 -1093723 -1093733 -1093739 -1093747 -1093751 -1093753 -1093777 -1093789 -1093823 -1093837 -1093843 -1093847 -1093871 -1093889 -1093901 -1093907 -1093927 -1093943 -1093951 -1093957 -1093969 -1093991 -1093993 -1093997 -1093999 -1094011 -1094029 -1094047 -1094057 -1094059 -1094081 -1094089 -1094099 -1094101 -1094123 -1094129 -1094131 -1094143 -1094147 -1094161 -1094183 -1094209 -1094237 -1094263 -1094293 -1094299 -1094321 -1094333 -1094339 -1094371 -1094377 -1094407 -1094411 -1094417 -1094437 -1094441 -1094449 -1094453 -1094461 -1094473 -1094491 -1094519 -1094531 -1094539 -1094543 -1094549 -1094551 -1094557 -1094567 -1094573 -1094603 -1094623 -1094629 -1094633 -1094657 -1094669 -1094671 -1094683 -1094689 -1094693 -1094701 -1094711 -1094747 -1094759 -1094773 -1094791 -1094801 -1094803 -1094809 -1094831 -1094833 -1094843 -1094881 -1094887 -1094897 -1094911 -1094921 -1094923 -1094939 -1094957 -1094963 -1094969 -1094983 -1094999 -1095023 -1095043 -1095047 -1095049 -1095067 -1095071 -1095091 -1095119 -1095161 -1095169 -1095173 -1095209 -1095221 -1095223 -1095229 -1095239 -1095247 -1095251 -1095257 -1095287 -1095313 -1095319 -1095343 -1095349 -1095401 -1095403 -1095427 -1095433 -1095439 -1095443 -1095449 -1095461 -1095481 -1095487 -1095491 -1095503 -1095529 -1095541 -1095551 -1095557 -1095569 -1095581 -1095583 -1095613 -1095631 -1095671 -1095691 -1095713 -1095719 -1095727 -1095733 -1095739 -1095751 -1095779 -1095781 -1095791 -1095793 -1095811 -1095821 -1095833 -1095839 -1095841 -1095847 -1095851 -1095859 -1095907 -1095931 -1095947 -1095959 -1095961 -1095979 -1095989 -1096031 -1096057 -1096061 -1096079 -1096097 -1096099 -1096127 -1096133 -1096141 -1096159 -1096163 -1096189 -1096201 -1096219 -1096267 -1096289 -1096307 -1096327 -1096349 -1096351 -1096363 -1096373 -1096379 -1096393 -1096399 -1096423 -1096427 -1096451 -1096477 -1096481 -1096489 -1096493 -1096499 -1096507 -1096541 -1096549 -1096553 -1096559 -1096561 -1096583 -1096609 -1096621 -1096631 -1096639 -1096673 -1096691 -1096703 -1096727 -1096741 -1096763 -1096787 -1096793 -1096807 -1096817 -1096829 -1096831 -1096853 -1096859 -1096861 -1096871 -1096883 -1096919 -1096951 -1096957 -1096967 -1096969 -1096981 -1096999 -1097009 -1097017 -1097029 -1097039 -1097051 -1097069 -1097081 -1097101 -1097111 -1097113 -1097141 -1097143 -1097147 -1097179 -1097189 -1097203 -1097209 -1097221 -1097237 -1097267 -1097293 -1097297 -1097321 -1097323 -1097351 -1097359 -1097377 -1097381 -1097413 -1097419 -1097423 -1097441 -1097443 -1097461 -1097483 -1097501 -1097513 -1097533 -1097539 -1097543 -1097549 -1097557 -1097599 -1097627 -1097633 -1097651 -1097653 -1097659 -1097669 -1097699 -1097711 -1097717 -1097729 -1097743 -1097783 -1097791 -1097797 -1097819 -1097849 -1097851 -1097861 -1097869 -1097879 -1097891 -1097893 -1097897 -1097903 -1097909 -1097923 -1097933 -1097947 -1097983 -1098017 -1098023 -1098037 -1098073 -1098077 -1098101 -1098109 -1098121 -1098133 -1098151 -1098187 -1098191 -1098193 -1098203 -1098211 -1098221 -1098233 -1098269 -1098287 -1098301 -1098311 -1098313 -1098341 -1098373 -1098379 -1098397 -1098401 -1098439 -1098443 -1098451 -1098463 -1098469 -1098479 -1098481 -1098509 -1098511 -1098533 -1098541 -1098593 -1098613 -1098623 -1098631 -1098649 -1098667 -1098673 -1098689 -1098707 -1098709 -1098731 -1098737 -1098787 -1098791 -1098803 -1098821 -1098833 -1098847 -1098953 -1098967 -1098973 -1098989 -1099031 -1099051 -1099057 -1099079 -1099081 -1099097 -1099103 -1099117 -1099121 -1099139 -1099171 -1099177 -1099181 -1099199 -1099223 -1099247 -1099249 -1099261 -1099279 -1099289 -1099309 -1099313 -1099327 -1099337 -1099363 -1099369 -1099391 -1099393 -1099409 -1099411 -1099421 -1099433 -1099459 -1099463 -1099487 -1099489 -1099493 -1099499 -1099507 -1099513 -1099519 -1099523 -1099541 -1099547 -1099559 -1099573 -1099589 -1099619 -1099621 -1099627 -1099633 -1099649 -1099669 -1099687 -1099711 -1099717 -1099723 -1099727 -1099729 -1099741 -1099757 -1099771 -1099783 -1099793 -1099799 -1099807 -1099817 -1099823 -1099841 -1099843 -1099859 -1099867 -1099927 -1099933 -1099957 -1099961 -1099997 -1100009 -1100023 -1100027 -1100039 -1100041 -1100051 -1100063 -1100089 -1100093 -1100101 -1100123 -1100131 -1100147 -1100149 -1100161 -1100167 -1100171 -1100179 -1100213 -1100219 -1100243 -1100249 -1100261 -1100273 -1100279 -1100303 -1100311 -1100321 -1100353 -1100357 -1100377 -1100381 -1100387 -1100419 -1100441 -1100443 -1100447 -1100467 -1100471 -1100483 -1100503 -1100509 -1100513 -1100543 -1100557 -1100569 -1100581 -1100591 -1100611 -1100641 -1100653 -1100681 -1100683 -1100747 -1100773 -1100777 -1100783 -1100797 -1100807 -1100831 -1100833 -1100837 -1100839 -1100851 -1100857 -1100887 -1100893 -1100899 -1100909 -1100921 -1100933 -1100947 -1100977 -1101071 -1101091 -1101097 -1101103 -1101109 -1101127 -1101143 -1101169 -1101179 -1101193 -1101211 -1101229 -1101253 -1101283 -1101299 -1101307 -1101319 -1101323 -1101341 -1101349 -1101371 -1101377 -1101389 -1101403 -1101407 -1101409 -1101421 -1101431 -1101433 -1101439 -1101467 -1101473 -1101509 -1101511 -1101517 -1101521 -1101533 -1101559 -1101571 -1101577 -1101587 -1101593 -1101613 -1101619 -1101641 -1101649 -1101671 -1101673 -1101689 -1101691 -1101697 -1101733 -1101743 -1101761 -1101767 -1101773 -1101781 -1101803 -1101811 -1101839 -1101851 -1101871 -1101883 -1101901 -1101917 -1101929 -1101931 -1101937 -1101941 -1101959 -1101967 -1102001 -1102007 -1102021 -1102027 -1102063 -1102069 -1102111 -1102117 -1102147 -1102151 -1102159 -1102163 -1102169 -1102181 -1102187 -1102201 -1102237 -1102243 -1102249 -1102253 -1102259 -1102271 -1102279 -1102301 -1102307 -1102313 -1102333 -1102337 -1102393 -1102397 -1102411 -1102427 -1102429 -1102441 -1102447 -1102457 -1102463 -1102481 -1102483 -1102523 -1102537 -1102547 -1102553 -1102567 -1102571 -1102583 -1102663 -1102669 -1102679 -1102681 -1102691 -1102693 -1102709 -1102721 -1102727 -1102729 -1102733 -1102747 -1102757 -1102813 -1102823 -1102831 -1102847 -1102853 -1102861 -1102879 -1102883 -1102891 -1102901 -1102903 -1102921 -1102939 -1102951 -1102963 -1102967 -1102979 -1102991 -1102999 -1103009 -1103017 -1103029 -1103041 -1103059 -1103087 -1103101 -1103107 -1103111 -1103119 -1103129 -1103143 -1103171 -1103183 -1103191 -1103203 -1103213 -1103237 -1103257 -1103279 -1103281 -1103293 -1103309 -1103339 -1103341 -1103353 -1103371 -1103437 -1103449 -1103461 -1103467 -1103483 -1103489 -1103497 -1103519 -1103533 -1103549 -1103561 -1103579 -1103581 -1103587 -1103591 -1103603 -1103611 -1103617 -1103621 -1103629 -1103633 -1103639 -1103699 -1103723 -1103737 -1103749 -1103779 -1103797 -1103803 -1103849 -1103857 -1103863 -1103873 -1103899 -1103903 -1103911 -1103923 -1103933 -1103981 -1103987 -1103989 -1104017 -1104041 -1104079 -1104097 -1104101 -1104107 -1104113 -1104119 -1104137 -1104139 -1104157 -1104179 -1104193 -1104203 -1104209 -1104217 -1104221 -1104241 -1104247 -1104289 -1104293 -1104307 -1104319 -1104331 -1104343 -1104353 -1104373 -1104377 -1104379 -1104403 -1104409 -1104427 -1104431 -1104449 -1104479 -1104491 -1104511 -1104517 -1104533 -1104557 -1104559 -1104589 -1104599 -1104613 -1104619 -1104659 -1104661 -1104671 -1104683 -1104703 -1104707 -1104731 -1104737 -1104739 -1104743 -1104749 -1104751 -1104767 -1104769 -1104781 -1104787 -1104791 -1104797 -1104811 -1104821 -1104823 -1104833 -1104853 -1104877 -1104889 -1104899 -1104913 -1104919 -1104937 -1104941 -1104947 -1104959 -1105009 -1105019 -1105033 -1105061 -1105063 -1105067 -1105109 -1105141 -1105157 -1105163 -1105171 -1105177 -1105193 -1105201 -1105207 -1105213 -1105217 -1105231 -1105261 -1105267 -1105271 -1105309 -1105327 -1105333 -1105337 -1105339 -1105343 -1105387 -1105397 -1105427 -1105441 -1105457 -1105463 -1105501 -1105513 -1105519 -1105537 -1105547 -1105549 -1105571 -1105579 -1105583 -1105589 -1105603 -1105607 -1105609 -1105613 -1105619 -1105627 -1105639 -1105649 -1105651 -1105661 -1105669 -1105691 -1105693 -1105711 -1105757 -1105759 -1105787 -1105807 -1105813 -1105823 -1105847 -1105861 -1105873 -1105879 -1105883 -1105891 -1105913 -1105919 -1105943 -1105961 -1105963 -1105997 -1105999 -1106029 -1106069 -1106087 -1106099 -1106101 -1106129 -1106137 -1106159 -1106167 -1106177 -1106179 -1106197 -1106201 -1106213 -1106219 -1106233 -1106243 -1106249 -1106257 -1106267 -1106279 -1106293 -1106311 -1106317 -1106363 -1106381 -1106401 -1106407 -1106419 -1106423 -1106429 -1106447 -1106449 -1106471 -1106477 -1106489 -1106491 -1106509 -1106527 -1106531 -1106543 -1106563 -1106569 -1106593 -1106621 -1106627 -1106629 -1106653 -1106671 -1106687 -1106689 -1106741 -1106747 -1106761 -1106767 -1106771 -1106779 -1106789 -1106801 -1106821 -1106827 -1106837 -1106839 -1106851 -1106881 -1106891 -1106909 -1106923 -1106927 -1106939 -1106953 -1106957 -1106977 -1106993 -1106999 -1107019 -1107031 -1107047 -1107049 -1107053 -1107083 -1107101 -1107107 -1107109 -1107157 -1107167 -1107173 -1107199 -1107203 -1107217 -1107269 -1107317 -1107319 -1107341 -1107347 -1107383 -1107389 -1107401 -1107409 -1107419 -1107433 -1107439 -1107467 -1107479 -1107487 -1107497 -1107503 -1107511 -1107523 -1107527 -1107553 -1107569 -1107571 -1107581 -1107583 -1107593 -1107619 -1107677 -1107679 -1107721 -1107727 -1107751 -1107763 -1107773 -1107781 -1107787 -1107791 -1107793 -1107797 -1107803 -1107811 -1107823 -1107851 -1107853 -1107881 -1107893 -1107913 -1107917 -1107923 -1107929 -1107937 -1107989 -1108001 -1108007 -1108021 -1108049 -1108057 -1108069 -1108073 -1108091 -1108103 -1108123 -1108127 -1108147 -1108169 -1108171 -1108181 -1108201 -1108207 -1108223 -1108229 -1108241 -1108253 -1108259 -1108267 -1108313 -1108321 -1108337 -1108357 -1108361 -1108363 -1108369 -1108397 -1108423 -1108427 -1108447 -1108453 -1108463 -1108469 -1108477 -1108487 -1108489 -1108501 -1108507 -1108537 -1108543 -1108559 -1108561 -1108567 -1108571 -1108573 -1108579 -1108603 -1108609 -1108619 -1108633 -1108663 -1108691 -1108693 -1108697 -1108703 -1108711 -1108717 -1108727 -1108729 -1108733 -1108739 -1108747 -1108753 -1108759 -1108771 -1108781 -1108801 -1108817 -1108819 -1108823 -1108867 -1108903 -1108907 -1108909 -1108957 -1108967 -1108993 -1108997 -1108999 -1109021 -1109033 -1109057 -1109113 -1109117 -1109123 -1109159 -1109161 -1109167 -1109189 -1109197 -1109219 -1109231 -1109243 -1109249 -1109257 -1109281 -1109287 -1109291 -1109309 -1109327 -1109347 -1109351 -1109363 -1109387 -1109393 -1109399 -1109401 -1109411 -1109431 -1109473 -1109477 -1109489 -1109491 -1109509 -1109513 -1109531 -1109533 -1109561 -1109579 -1109609 -1109611 -1109629 -1109639 -1109653 -1109663 -1109723 -1109737 -1109749 -1109761 -1109783 -1109789 -1109791 -1109813 -1109821 -1109839 -1109851 -1109861 -1109869 -1109881 -1109887 -1109891 -1109897 -1109903 -1109909 -1109921 -1109951 -1109987 -1110007 -1110013 -1110019 -1110023 -1110041 -1110061 -1110077 -1110089 -1110103 -1110127 -1110133 -1110167 -1110181 -1110223 -1110229 -1110247 -1110269 -1110271 -1110289 -1110301 -1110311 -1110313 -1110331 -1110349 -1110353 -1110367 -1110397 -1110401 -1110413 -1110427 -1110433 -1110449 -1110467 -1110479 -1110517 -1110521 -1110523 -1110533 -1110539 -1110541 -1110547 -1110583 -1110587 -1110589 -1110611 -1110617 -1110643 -1110667 -1110679 -1110709 -1110713 -1110719 -1110727 -1110743 -1110773 -1110779 -1110803 -1110817 -1110821 -1110839 -1110859 -1110881 -1110887 -1110913 -1110917 -1110919 -1110929 -1110931 -1110943 -1110953 -1110959 -1110971 -1110973 -1110979 -1110983 -1110997 -1111007 -1111013 -1111021 -1111031 -1111043 -1111049 -1111057 -1111067 -1111081 -1111087 -1111091 -1111151 -1111157 -1111169 -1111181 -1111183 -1111189 -1111211 -1111213 -1111219 -1111247 -1111259 -1111283 -1111289 -1111301 -1111333 -1111339 -1111351 -1111361 -1111379 -1111393 -1111399 -1111423 -1111427 -1111433 -1111447 -1111457 -1111489 -1111493 -1111499 -1111531 -1111543 -1111547 -1111553 -1111559 -1111573 -1111577 -1111637 -1111639 -1111651 -1111661 -1111667 -1111673 -1111687 -1111703 -1111711 -1111723 -1111727 -1111741 -1111757 -1111771 -1111787 -1111793 -1111801 -1111841 -1111853 -1111867 -1111897 -1111921 -1111933 -1111949 -1111963 -1111967 -1111991 -1112003 -1112011 -1112017 -1112047 -1112057 -1112077 -1112081 -1112087 -1112093 -1112107 -1112113 -1112129 -1112131 -1112141 -1112143 -1112147 -1112159 -1112171 -1112197 -1112201 -1112239 -1112269 -1112273 -1112291 -1112323 -1112333 -1112339 -1112341 -1112351 -1112359 -1112369 -1112381 -1112383 -1112389 -1112413 -1112467 -1112471 -1112477 -1112483 -1112509 -1112513 -1112519 -1112543 -1112549 -1112561 -1112567 -1112569 -1112581 -1112591 -1112597 -1112611 -1112623 -1112651 -1112653 -1112663 -1112677 -1112689 -1112707 -1112723 -1112729 -1112731 -1112737 -1112747 -1112777 -1112779 -1112789 -1112821 -1112827 -1112831 -1112833 -1112857 -1112897 -1112899 -1112911 -1112921 -1112941 -1112953 -1112959 -1112971 -1112977 -1112983 -1113011 -1113019 -1113029 -1113043 -1113059 -1113083 -1113089 -1113103 -1113137 -1113149 -1113157 -1113173 -1113181 -1113187 -1113193 -1113197 -1113199 -1113221 -1113239 -1113253 -1113257 -1113317 -1113319 -1113337 -1113349 -1113373 -1113379 -1113401 -1113403 -1113421 -1113451 -1113461 -1113481 -1113491 -1113509 -1113521 -1113527 -1113557 -1113569 -1113587 -1113599 -1113617 -1113643 -1113667 -1113701 -1113703 -1113713 -1113719 -1113751 -1113773 -1113781 -1113787 -1113793 -1113797 -1113809 -1113859 -1113863 -1113877 -1113883 -1113887 -1113899 -1113941 -1113949 -1113953 -1113961 -1113971 -1113991 -1113997 -1114019 -1114031 -1114037 -1114039 -1114049 -1114063 -1114111 -1114117 -1114159 -1114193 -1114207 -1114213 -1114241 -1114249 -1114261 -1114271 -1114273 -1114283 -1114297 -1114301 -1114303 -1114349 -1114361 -1114381 -1114397 -1114423 -1114427 -1114447 -1114471 -1114489 -1114493 -1114501 -1114507 -1114523 -1114541 -1114549 -1114567 -1114573 -1114577 -1114591 -1114601 -1114613 -1114651 -1114657 -1114661 -1114681 -1114693 -1114697 -1114709 -1114721 -1114723 -1114733 -1114753 -1114759 -1114801 -1114807 -1114811 -1114829 -1114837 -1114849 -1114859 -1114873 -1114891 -1114907 -1114909 -1114931 -1114937 -1114943 -1114969 -1114973 -1114987 -1114999 -1115011 -1115027 -1115029 -1115057 -1115071 -1115089 -1115099 -1115113 -1115117 -1115131 -1115189 -1115207 -1115227 -1115237 -1115239 -1115267 -1115269 -1115273 -1115297 -1115299 -1115321 -1115327 -1115329 -1115351 -1115363 -1115381 -1115399 -1115407 -1115417 -1115419 -1115447 -1115449 -1115453 -1115467 -1115497 -1115501 -1115519 -1115531 -1115533 -1115539 -1115551 -1115561 -1115567 -1115573 -1115579 -1115581 -1115599 -1115627 -1115633 -1115641 -1115657 -1115683 -1115701 -1115711 -1115713 -1115731 -1115743 -1115759 -1115767 -1115771 -1115773 -1115789 -1115831 -1115839 -1115843 -1115857 -1115879 -1115899 -1115911 -1115923 -1115929 -1115941 -1115987 -1115993 -1116001 -1116053 -1116077 -1116091 -1116107 -1116133 -1116163 -1116173 -1116187 -1116209 -1116223 -1116229 -1116257 -1116277 -1116281 -1116289 -1116301 -1116317 -1116319 -1116329 -1116337 -1116347 -1116371 -1116419 -1116431 -1116439 -1116449 -1116461 -1116469 -1116473 -1116491 -1116499 -1116523 -1116541 -1116547 -1116569 -1116571 -1116593 -1116601 -1116631 -1116637 -1116641 -1116653 -1116659 -1116677 -1116701 -1116743 -1116749 -1116751 -1116809 -1116821 -1116851 -1116853 -1116859 -1116887 -1116889 -1116893 -1116911 -1116937 -1116943 -1116977 -1116989 -1117009 -1117013 -1117021 -1117027 -1117031 -1117033 -1117057 -1117069 -1117073 -1117079 -1117099 -1117111 -1117117 -1117153 -1117169 -1117177 -1117199 -1117243 -1117247 -1117253 -1117267 -1117273 -1117279 -1117301 -1117307 -1117309 -1117321 -1117349 -1117367 -1117379 -1117433 -1117439 -1117451 -1117463 -1117471 -1117477 -1117481 -1117483 -1117489 -1117513 -1117549 -1117553 -1117579 -1117591 -1117601 -1117603 -1117607 -1117609 -1117657 -1117661 -1117673 -1117679 -1117681 -1117709 -1117729 -1117741 -1117757 -1117759 -1117763 -1117769 -1117793 -1117799 -1117811 -1117813 -1117817 -1117819 -1117861 -1117867 -1117877 -1117889 -1117901 -1117913 -1117931 -1117933 -1117939 -1117943 -1117967 -1117973 -1117993 -1118003 -1118009 -1118011 -1118021 -1118023 -1118027 -1118041 -1118063 -1118081 -1118101 -1118113 -1118123 -1118137 -1118147 -1118149 -1118189 -1118197 -1118203 -1118219 -1118261 -1118267 -1118291 -1118303 -1118309 -1118317 -1118339 -1118363 -1118371 -1118393 -1118419 -1118437 -1118441 -1118479 -1118483 -1118497 -1118519 -1118527 -1118563 -1118567 -1118569 -1118599 -1118629 -1118653 -1118659 -1118713 -1118717 -1118723 -1118737 -1118749 -1118773 -1118779 -1118783 -1118797 -1118807 -1118809 -1118827 -1118837 -1118851 -1118857 -1118861 -1118863 -1118867 -1118869 -1118893 -1118911 -1118921 -1118941 -1118947 -1118951 -1118969 -1118987 -1118993 -1119029 -1119037 -1119047 -1119049 -1119077 -1119091 -1119109 -1119121 -1119169 -1119179 -1119221 -1119227 -1119241 -1119269 -1119281 -1119299 -1119319 -1119323 -1119343 -1119359 -1119389 -1119397 -1119403 -1119449 -1119473 -1119523 -1119527 -1119529 -1119557 -1119577 -1119589 -1119607 -1119611 -1119623 -1119649 -1119653 -1119659 -1119673 -1119691 -1119697 -1119707 -1119733 -1119737 -1119779 -1119793 -1119799 -1119809 -1119817 -1119821 -1119823 -1119857 -1119863 -1119871 -1119907 -1119913 -1119947 -1119949 -1119959 -1120001 -1120019 -1120051 -1120073 -1120081 -1120087 -1120109 -1120121 -1120153 -1120157 -1120159 -1120187 -1120211 -1120219 -1120237 -1120271 -1120277 -1120289 -1120291 -1120303 -1120313 -1120319 -1120321 -1120337 -1120349 -1120363 -1120369 -1120391 -1120423 -1120429 -1120459 -1120481 -1120499 -1120501 -1120507 -1120513 -1120517 -1120519 -1120529 -1120541 -1120543 -1120547 -1120549 -1120573 -1120577 -1120591 -1120607 -1120627 -1120633 -1120649 -1120661 -1120663 -1120667 -1120673 -1120687 -1120711 -1120723 -1120727 -1120739 -1120741 -1120747 -1120771 -1120781 -1120783 -1120787 -1120799 -1120807 -1120811 -1120831 -1120837 -1120849 -1120871 -1120883 -1120901 -1120907 -1120913 -1120919 -1120939 -1120957 -1120961 -1120969 -1120993 -1121011 -1121017 -1121023 -1121027 -1121033 -1121047 -1121051 -1121083 -1121093 -1121101 -1121143 -1121147 -1121173 -1121179 -1121189 -1121191 -1121203 -1121221 -1121231 -1121249 -1121257 -1121261 -1121293 -1121297 -1121317 -1121333 -1121347 -1121357 -1121369 -1121377 -1121383 -1121387 -1121389 -1121423 -1121431 -1121443 -1121447 -1121453 -1121509 -1121539 -1121543 -1121557 -1121599 -1121621 -1121629 -1121651 -1121671 -1121689 -1121693 -1121699 -1121707 -1121723 -1121737 -1121819 -1121831 -1121833 -1121837 -1121839 -1121867 -1121899 -1121933 -1121941 -1121947 -1121987 -1121993 -1122001 -1122029 -1122041 -1122053 -1122071 -1122089 -1122091 -1122103 -1122113 -1122131 -1122133 -1122137 -1122139 -1122157 -1122179 -1122181 -1122227 -1122241 -1122259 -1122263 -1122269 -1122281 -1122283 -1122287 -1122367 -1122371 -1122389 -1122397 -1122419 -1122427 -1122431 -1122437 -1122449 -1122467 -1122481 -1122491 -1122529 -1122533 -1122551 -1122571 -1122587 -1122599 -1122623 -1122643 -1122647 -1122659 -1122679 -1122683 -1122701 -1122721 -1122739 -1122749 -1122757 -1122761 -1122811 -1122841 -1122857 -1122887 -1122899 -1122923 -1122937 -1122941 -1122983 -1122997 -1123051 -1123079 -1123081 -1123093 -1123127 -1123151 -1123181 -1123189 -1123211 -1123217 -1123219 -1123231 -1123247 -1123267 -1123279 -1123303 -1123307 -1123319 -1123327 -1123349 -1123351 -1123361 -1123379 -1123391 -1123399 -1123403 -1123427 -1123429 -1123439 -1123477 -1123483 -1123487 -1123501 -1123511 -1123517 -1123531 -1123541 -1123553 -1123561 -1123567 -1123589 -1123597 -1123601 -1123621 -1123631 -1123637 -1123651 -1123667 -1123669 -1123691 -1123693 -1123699 -1123709 -1123729 -1123739 -1123741 -1123747 -1123777 -1123807 -1123841 -1123867 -1123873 -1123879 -1123883 -1123897 -1123901 -1123909 -1123919 -1123931 -1123943 -1123951 -1123961 -1123973 -1123979 -1123999 -1124027 -1124041 -1124051 -1124083 -1124087 -1124107 -1124113 -1124119 -1124131 -1124141 -1124147 -1124197 -1124203 -1124209 -1124219 -1124239 -1124251 -1124267 -1124269 -1124293 -1124297 -1124303 -1124317 -1124351 -1124353 -1124369 -1124377 -1124423 -1124429 -1124437 -1124441 -1124443 -1124449 -1124509 -1124531 -1124551 -1124561 -1124581 -1124593 -1124597 -1124603 -1124639 -1124647 -1124653 -1124659 -1124681 -1124687 -1124699 -1124719 -1124741 -1124749 -1124759 -1124789 -1124797 -1124803 -1124807 -1124813 -1124831 -1124833 -1124867 -1124869 -1124951 -1124957 -1124969 -1124983 -1124987 -1124993 -1125001 -1125013 -1125017 -1125029 -1125053 -1125097 -1125109 -1125121 -1125127 -1125139 -1125143 -1125151 -1125167 -1125169 -1125193 -1125203 -1125209 -1125217 -1125221 -1125253 -1125259 -1125283 -1125317 -1125323 -1125329 -1125343 -1125359 -1125361 -1125379 -1125391 -1125401 -1125407 -1125419 -1125431 -1125433 -1125469 -1125473 -1125479 -1125499 -1125529 -1125539 -1125557 -1125559 -1125569 -1125571 -1125581 -1125599 -1125629 -1125647 -1125653 -1125679 -1125701 -1125713 -1125739 -1125763 -1125767 -1125793 -1125797 -1125811 -1125823 -1125833 -1125857 -1125871 -1125899 -1125907 -1125911 -1125913 -1125923 -1125931 -1125941 -1125953 -1125973 -1125991 -1126031 -1126033 -1126043 -1126067 -1126093 -1126159 -1126189 -1126201 -1126211 -1126219 -1126247 -1126253 -1126259 -1126283 -1126313 -1126319 -1126343 -1126351 -1126357 -1126361 -1126381 -1126387 -1126397 -1126399 -1126421 -1126439 -1126441 -1126457 -1126459 -1126483 -1126501 -1126513 -1126519 -1126523 -1126537 -1126553 -1126561 -1126577 -1126579 -1126597 -1126627 -1126649 -1126661 -1126663 -1126667 -1126669 -1126693 -1126703 -1126711 -1126751 -1126759 -1126771 -1126781 -1126787 -1126823 -1126831 -1126837 -1126843 -1126847 -1126859 -1126861 -1126889 -1126897 -1126963 -1126973 -1126991 -1126999 -1127011 -1127029 -1127033 -1127039 -1127051 -1127081 -1127101 -1127111 -1127123 -1127149 -1127153 -1127167 -1127177 -1127183 -1127197 -1127209 -1127221 -1127227 -1127239 -1127249 -1127263 -1127281 -1127297 -1127303 -1127309 -1127311 -1127323 -1127333 -1127351 -1127359 -1127369 -1127381 -1127383 -1127393 -1127407 -1127411 -1127443 -1127447 -1127453 -1127461 -1127507 -1127513 -1127527 -1127531 -1127537 -1127557 -1127561 -1127573 -1127587 -1127603 -1127617 -1127629 -1127641 -1127657 -1127663 -1127683 -1127701 -1127741 -1127767 -1127773 -1127801 -1127803 -1127809 -1127813 -1127837 -1127849 -1127857 -1127881 -1127891 -1127911 -1127947 -1127957 -1127969 -1127981 -1127983 -1127993 -1128031 -1128037 -1128089 -1128091 -1128107 -1128109 -1128143 -1128151 -1128161 -1128181 -1128209 -1128223 -1128227 -1128233 -1128247 -1128251 -1128287 -1128289 -1128293 -1128299 -1128301 -1128313 -1128349 -1128371 -1128373 -1128383 -1128397 -1128427 -1128433 -1128451 -1128497 -1128499 -1128503 -1128509 -1128521 -1128527 -1128539 -1128553 -1128557 -1128577 -1128583 -1128599 -1128601 -1128623 -1128629 -1128637 -1128641 -1128643 -1128661 -1128667 -1128691 -1128697 -1128703 -1128713 -1128719 -1128727 -1128731 -1128737 -1128761 -1128763 -1128769 -1128773 -1128779 -1128781 -1128811 -1128821 -1128823 -1128889 -1128899 -1128901 -1128917 -1128931 -1128937 -1128943 -1128947 -1128949 -1128977 -1128979 -1128997 -1129013 -1129019 -1129033 -1129043 -1129103 -1129109 -1129111 -1129127 -1129133 -1129153 -1129159 -1129169 -1129187 -1129211 -1129213 -1129217 -1129229 -1129253 -1129283 -1129307 -1129313 -1129333 -1129343 -1129367 -1129391 -1129399 -1129409 -1129433 -1129439 -1129441 -1129459 -1129477 -1129487 -1129489 -1129501 -1129511 -1129519 -1129523 -1129559 -1129561 -1129571 -1129577 -1129603 -1129619 -1129643 -1129663 -1129679 -1129693 -1129699 -1129717 -1129729 -1129741 -1129747 -1129757 -1129763 -1129787 -1129789 -1129819 -1129831 -1129841 -1129847 -1129853 -1129859 -1129861 -1129889 -1129897 -1129951 -1129957 -1129963 -1129991 -1130011 -1130023 -1130039 -1130047 -1130053 -1130057 -1130081 -1130099 -1130117 -1130123 -1130131 -1130191 -1130237 -1130251 -1130257 -1130267 -1130273 -1130281 -1130287 -1130293 -1130299 -1130317 -1130321 -1130351 -1130359 -1130369 -1130407 -1130413 -1130417 -1130429 -1130431 -1130447 -1130471 -1130497 -1130501 -1130527 -1130561 -1130579 -1130581 -1130587 -1130621 -1130627 -1130629 -1130639 -1130641 -1130651 -1130677 -1130693 -1130699 -1130711 -1130719 -1130737 -1130741 -1130777 -1130783 -1130803 -1130807 -1130809 -1130813 -1130819 -1130827 -1130863 -1130929 -1130939 -1130947 -1130951 -1130953 -1130957 -1130963 -1130981 -1131023 -1131047 -1131049 -1131077 -1131079 -1131083 -1131103 -1131113 -1131121 -1131131 -1131133 -1131139 -1131157 -1131181 -1131191 -1131217 -1131223 -1131239 -1131253 -1131259 -1131269 -1131271 -1131307 -1131323 -1131329 -1131331 -1131341 -1131343 -1131353 -1131379 -1131397 -1131413 -1131419 -1131421 -1131437 -1131451 -1131463 -1131467 -1131479 -1131491 -1131509 -1131523 -1131547 -1131553 -1131569 -1131617 -1131629 -1131643 -1131653 -1131671 -1131677 -1131701 -1131721 -1131727 -1131737 -1131749 -1131751 -1131763 -1131769 -1131787 -1131799 -1131821 -1131827 -1131829 -1131839 -1131857 -1131863 -1131869 -1131881 -1131883 -1131913 -1131917 -1131919 -1131937 -1131943 -1131959 -1131961 -1131973 -1131997 -1132003 -1132009 -1132063 -1132067 -1132091 -1132123 -1132139 -1132141 -1132177 -1132199 -1132223 -1132249 -1132259 -1132291 -1132301 -1132309 -1132321 -1132333 -1132393 -1132403 -1132409 -1132423 -1132429 -1132447 -1132463 -1132471 -1132477 -1132487 -1132499 -1132507 -1132511 -1132519 -1132529 -1132541 -1132561 -1132567 -1132583 -1132597 -1132601 -1132603 -1132627 -1132633 -1132639 -1132643 -1132661 -1132667 -1132673 -1132679 -1132697 -1132721 -1132739 -1132753 -1132783 -1132787 -1132793 -1132811 -1132823 -1132861 -1132877 -1132883 -1132909 -1132919 -1132927 -1132933 -1132949 -1132969 -1132979 -1132987 -1132991 -1132993 -1132997 -1133009 -1133017 -1133039 -1133047 -1133053 -1133071 -1133131 -1133147 -1133149 -1133159 -1133173 -1133177 -1133183 -1133189 -1133191 -1133219 -1133227 -1133239 -1133257 -1133261 -1133263 -1133287 -1133303 -1133317 -1133333 -1133357 -1133359 -1133381 -1133387 -1133459 -1133467 -1133477 -1133479 -1133501 -1133507 -1133513 -1133519 -1133533 -1133537 -1133551 -1133579 -1133591 -1133621 -1133623 -1133633 -1133641 -1133651 -1133653 -1133659 -1133677 -1133681 -1133683 -1133689 -1133731 -1133777 -1133789 -1133809 -1133819 -1133827 -1133837 -1133843 -1133851 -1133857 -1133861 -1133893 -1133897 -1133903 -1133911 -1133933 -1133947 -1133959 -1133963 -1133971 -1133989 -1134031 -1134037 -1134043 -1134047 -1134059 -1134071 -1134079 -1134113 -1134137 -1134143 -1134149 -1134151 -1134163 -1134169 -1134179 -1134187 -1134193 -1134239 -1134241 -1134247 -1134271 -1134283 -1134299 -1134311 -1134313 -1134389 -1134391 -1134403 -1134421 -1134437 -1134443 -1134449 -1134467 -1134479 -1134481 -1134487 -1134503 -1134517 -1134541 -1134557 -1134559 -1134583 -1134587 -1134607 -1134611 -1134619 -1134649 -1134667 -1134673 -1134691 -1134697 -1134703 -1134709 -1134719 -1134769 -1134781 -1134787 -1134811 -1134821 -1134841 -1134863 -1134871 -1134877 -1134883 -1134907 -1134923 -1134929 -1134961 -1134967 -1134977 -1134989 -1135007 -1135009 -1135019 -1135021 -1135061 -1135063 -1135081 -1135087 -1135091 -1135093 -1135103 -1135111 -1135129 -1135133 -1135159 -1135171 -1135187 -1135201 -1135217 -1135229 -1135237 -1135241 -1135247 -1135261 -1135279 -1135283 -1135291 -1135327 -1135333 -1135339 -1135363 -1135367 -1135403 -1135411 -1135427 -1135429 -1135439 -1135451 -1135469 -1135483 -1135513 -1135531 -1135597 -1135613 -1135619 -1135633 -1135643 -1135657 -1135663 -1135699 -1135703 -1135711 -1135721 -1135733 -1135751 -1135777 -1135819 -1135831 -1135837 -1135847 -1135853 -1135859 -1135861 -1135873 -1135879 -1135891 -1135903 -1135913 -1135919 -1135921 -1135951 -1135963 -1135969 -1135997 -1135999 -1136041 -1136053 -1136063 -1136077 -1136081 -1136087 -1136089 -1136111 -1136117 -1136123 -1136129 -1136147 -1136153 -1136183 -1136203 -1136221 -1136227 -1136231 -1136237 -1136287 -1136299 -1136309 -1136327 -1136329 -1136339 -1136357 -1136363 -1136383 -1136389 -1136393 -1136411 -1136417 -1136449 -1136459 -1136461 -1136477 -1136483 -1136557 -1136567 -1136579 -1136587 -1136593 -1136609 -1136617 -1136623 -1136627 -1136633 -1136647 -1136651 -1136659 -1136669 -1136699 -1136717 -1136719 -1136741 -1136749 -1136767 -1136809 -1136813 -1136819 -1136831 -1136833 -1136843 -1136869 -1136897 -1136917 -1136921 -1136939 -1136951 -1136969 -1136981 -1136983 -1136999 -1137001 -1137007 -1137029 -1137067 -1137091 -1137109 -1137137 -1137139 -1137161 -1137163 -1137167 -1137179 -1137203 -1137209 -1137229 -1137233 -1137247 -1137263 -1137271 -1137289 -1137313 -1137329 -1137337 -1137341 -1137403 -1137407 -1137427 -1137439 -1137457 -1137481 -1137503 -1137527 -1137529 -1137547 -1137551 -1137553 -1137569 -1137611 -1137613 -1137629 -1137659 -1137667 -1137673 -1137677 -1137707 -1137733 -1137743 -1137749 -1137767 -1137781 -1137803 -1137809 -1137811 -1137817 -1137859 -1137863 -1137869 -1137881 -1137883 -1137887 -1137889 -1137911 -1137919 -1137937 -1137953 -1137959 -1137973 -1137977 -1137991 -1138019 -1138057 -1138061 -1138091 -1138097 -1138117 -1138127 -1138141 -1138147 -1138171 -1138183 -1138213 -1138237 -1138273 -1138363 -1138367 -1138369 -1138391 -1138393 -1138409 -1138411 -1138427 -1138429 -1138433 -1138441 -1138451 -1138457 -1138483 -1138519 -1138547 -1138559 -1138567 -1138589 -1138591 -1138637 -1138639 -1138649 -1138667 -1138673 -1138679 -1138681 -1138703 -1138717 -1138729 -1138733 -1138741 -1138751 -1138757 -1138771 -1138777 -1138793 -1138829 -1138831 -1138849 -1138853 -1138867 -1138883 -1138901 -1138919 -1138957 -1138961 -1138967 -1138979 -1138987 -1138997 -1138999 -1139003 -1139011 -1139041 -1139059 -1139081 -1139087 -1139123 -1139141 -1139143 -1139147 -1139191 -1139197 -1139227 -1139239 -1139249 -1139263 -1139269 -1139273 -1139287 -1139291 -1139293 -1139309 -1139321 -1139329 -1139353 -1139387 -1139393 -1139407 -1139423 -1139461 -1139471 -1139473 -1139483 -1139491 -1139503 -1139519 -1139521 -1139531 -1139539 -1139549 -1139557 -1139573 -1139587 -1139623 -1139669 -1139681 -1139683 -1139687 -1139713 -1139717 -1139741 -1139771 -1139773 -1139779 -1139807 -1139819 -1139843 -1139849 -1139851 -1139861 -1139863 -1139869 -1139909 -1139911 -1139917 -1139921 -1139951 -1139959 -1139989 -1139993 -1140091 -1140101 -1140103 -1140121 -1140127 -1140131 -1140137 -1140143 -1140157 -1140163 -1140197 -1140203 -1140233 -1140239 -1140253 -1140257 -1140281 -1140289 -1140311 -1140319 -1140341 -1140353 -1140371 -1140379 -1140383 -1140389 -1140413 -1140421 -1140431 -1140439 -1140449 -1140463 -1140487 -1140493 -1140533 -1140539 -1140563 -1140569 -1140571 -1140577 -1140611 -1140619 -1140637 -1140677 -1140679 -1140691 -1140697 -1140709 -1140721 -1140749 -1140787 -1140803 -1140847 -1140851 -1140859 -1140863 -1140871 -1140901 -1140911 -1140913 -1140929 -1140949 -1140959 -1140967 -1140973 -1140983 -1140991 -1141009 -1141013 -1141027 -1141031 -1141033 -1141039 -1141061 -1141067 -1141081 -1141087 -1141093 -1141097 -1141103 -1141109 -1141123 -1141139 -1141171 -1141219 -1141223 -1141229 -1141241 -1141243 -1141253 -1141267 -1141271 -1141277 -1141279 -1141289 -1141291 -1141303 -1141319 -1141321 -1141351 -1141373 -1141379 -1141381 -1141391 -1141417 -1141423 -1141447 -1141453 -1141477 -1141507 -1141523 -1141529 -1141531 -1141541 -1141571 -1141573 -1141597 -1141631 -1141633 -1141649 -1141661 -1141667 -1141717 -1141739 -1141757 -1141769 -1141801 -1141813 -1141837 -1141849 -1141853 -1141867 -1141871 -1141901 -1141909 -1141949 -1141963 -1141967 -1141969 -1141999 -1142003 -1142017 -1142021 -1142039 -1142041 -1142059 -1142069 -1142083 -1142129 -1142131 -1142159 -1142161 -1142171 -1142191 -1142201 -1142233 -1142237 -1142243 -1142263 -1142269 -1142279 -1142287 -1142311 -1142321 -1142333 -1142353 -1142357 -1142359 -1142363 -1142389 -1142423 -1142431 -1142473 -1142483 -1142503 -1142507 -1142509 -1142539 -1142549 -1142569 -1142573 -1142593 -1142599 -1142633 -1142651 -1142677 -1142693 -1142707 -1142737 -1142759 -1142773 -1142777 -1142783 -1142789 -1142809 -1142821 -1142833 -1142837 -1142851 -1142863 -1142881 -1142891 -1142909 -1142917 -1142923 -1142929 -1142941 -1142959 -1142969 -1142971 -1143013 -1143019 -1143047 -1143049 -1143053 -1143061 -1143067 -1143071 -1143073 -1143089 -1143091 -1143101 -1143113 -1143143 -1143161 -1143167 -1143193 -1143217 -1143223 -1143227 -1143239 -1143257 -1143269 -1143281 -1143283 -1143299 -1143341 -1143347 -1143371 -1143391 -1143407 -1143433 -1143469 -1143473 -1143481 -1143487 -1143529 -1143551 -1143563 -1143577 -1143587 -1143589 -1143601 -1143619 -1143643 -1143647 -1143661 -1143679 -1143697 -1143719 -1143749 -1143763 -1143799 -1143803 -1143809 -1143817 -1143829 -1143851 -1143887 -1143893 -1143943 -1143949 -1143953 -1143959 -1143977 -1144001 -1144007 -1144019 -1144037 -1144061 -1144081 -1144103 -1144139 -1144141 -1144147 -1144153 -1144163 -1144183 -1144193 -1144211 -1144223 -1144243 -1144249 -1144261 -1144271 -1144277 -1144279 -1144291 -1144301 -1144327 -1144333 -1144343 -1144349 -1144357 -1144379 -1144393 -1144399 -1144417 -1144439 -1144441 -1144453 -1144477 -1144483 -1144499 -1144511 -1144519 -1144523 -1144529 -1144537 -1144573 -1144589 -1144603 -1144607 -1144621 -1144643 -1144657 -1144667 -1144681 -1144691 -1144721 -1144723 -1144727 -1144739 -1144757 -1144783 -1144823 -1144837 -1144867 -1144877 -1144879 -1144889 -1144901 -1144903 -1144907 -1144919 -1144931 -1144939 -1144951 -1144973 -1144981 -1144993 -1145003 -1145021 -1145057 -1145059 -1145077 -1145093 -1145099 -1145107 -1145129 -1145141 -1145143 -1145173 -1145189 -1145191 -1145203 -1145213 -1145227 -1145269 -1145281 -1145293 -1145299 -1145303 -1145311 -1145323 -1145327 -1145329 -1145359 -1145369 -1145371 -1145381 -1145387 -1145393 -1145411 -1145429 -1145461 -1145479 -1145497 -1145509 -1145533 -1145537 -1145539 -1145593 -1145611 -1145621 -1145623 -1145659 -1145689 -1145693 -1145713 -1145723 -1145741 -1145743 -1145747 -1145773 -1145789 -1145797 -1145801 -1145803 -1145831 -1145843 -1145849 -1145873 -1145897 -1145899 -1145971 -1145983 -1145999 -1146037 -1146043 -1146049 -1146071 -1146083 -1146091 -1146097 -1146133 -1146143 -1146179 -1146217 -1146221 -1146263 -1146281 -1146307 -1146323 -1146329 -1146331 -1146347 -1146367 -1146391 -1146407 -1146413 -1146419 -1146421 -1146461 -1146487 -1146491 -1146511 -1146521 -1146529 -1146533 -1146539 -1146559 -1146569 -1146581 -1146661 -1146671 -1146679 -1146697 -1146703 -1146709 -1146713 -1146727 -1146731 -1146763 -1146773 -1146779 -1146781 -1146787 -1146791 -1146793 -1146797 -1146799 -1146809 -1146823 -1146829 -1146833 -1146841 -1146857 -1146869 -1146877 -1146881 -1146911 -1146917 -1146931 -1146947 -1146953 -1146967 -1146989 -1147009 -1147021 -1147039 -1147043 -1147051 -1147067 -1147073 -1147099 -1147103 -1147117 -1147127 -1147141 -1147169 -1147183 -1147187 -1147189 -1147193 -1147213 -1147229 -1147231 -1147243 -1147247 -1147249 -1147253 -1147271 -1147273 -1147297 -1147301 -1147331 -1147339 -1147351 -1147379 -1147387 -1147409 -1147417 -1147423 -1147427 -1147441 -1147451 -1147453 -1147459 -1147463 -1147499 -1147507 -1147511 -1147561 -1147567 -1147571 -1147579 -1147583 -1147591 -1147613 -1147621 -1147637 -1147639 -1147669 -1147697 -1147709 -1147711 -1147717 -1147739 -1147759 -1147793 -1147819 -1147841 -1147843 -1147889 -1147897 -1147903 -1147921 -1147931 -1147969 -1147981 -1147987 -1147997 -1148029 -1148039 -1148047 -1148087 -1148089 -1148099 -1148111 -1148167 -1148171 -1148177 -1148219 -1148249 -1148261 -1148263 -1148291 -1148293 -1148297 -1148311 -1148327 -1148339 -1148359 -1148377 -1148387 -1148437 -1148453 -1148489 -1148501 -1148507 -1148513 -1148527 -1148549 -1148561 -1148593 -1148599 -1148621 -1148629 -1148647 -1148663 -1148677 -1148681 -1148687 -1148701 -1148713 -1148729 -1148731 -1148737 -1148747 -1148753 -1148761 -1148773 -1148837 -1148839 -1148857 -1148867 -1148879 -1148921 -1148933 -1148941 -1148957 -1148963 -1148971 -1148977 -1148981 -1148989 -1148999 -1149007 -1149017 -1149037 -1149053 -1149059 -1149061 -1149131 -1149151 -1149157 -1149163 -1149167 -1149191 -1149193 -1149209 -1149221 -1149227 -1149229 -1149233 -1149259 -1149283 -1149307 -1149341 -1149349 -1149361 -1149373 -1149403 -1149409 -1149413 -1149427 -1149457 -1149469 -1149487 -1149493 -1149503 -1149509 -1149521 -1149527 -1149539 -1149559 -1149569 -1149581 -1149587 -1149593 -1149601 -1149607 -1149619 -1149637 -1149641 -1149661 -1149679 -1149689 -1149737 -1149749 -1149769 -1149773 -1149779 -1149803 -1149817 -1149857 -1149859 -1149881 -1149887 -1149901 -1149913 -1149917 -1149919 -1149943 -1149971 -1149979 -1149983 -1149989 -1149991 -1150027 -1150031 -1150057 -1150063 -1150073 -1150081 -1150103 -1150117 -1150139 -1150141 -1150151 -1150159 -1150183 -1150187 -1150199 -1150211 -1150213 -1150217 -1150229 -1150243 -1150249 -1150301 -1150309 -1150349 -1150351 -1150363 -1150397 -1150403 -1150411 -1150417 -1150421 -1150423 -1150447 -1150489 -1150511 -1150519 -1150531 -1150537 -1150547 -1150561 -1150579 -1150603 -1150609 -1150631 -1150649 -1150651 -1150657 -1150661 -1150673 -1150687 -1150703 -1150717 -1150729 -1150733 -1150739 -1150741 -1150757 -1150763 -1150769 -1150777 -1150783 -1150823 -1150837 -1150847 -1150861 -1150867 -1150871 -1150873 -1150879 -1150909 -1150921 -1150927 -1150939 -1150949 -1150957 -1150973 -1150987 -1151021 -1151041 -1151047 -1151057 -1151063 -1151069 -1151083 -1151089 -1151113 -1151141 -1151147 -1151159 -1151167 -1151177 -1151179 -1151203 -1151209 -1151221 -1151233 -1151237 -1151243 -1151251 -1151287 -1151303 -1151317 -1151327 -1151333 -1151363 -1151369 -1151383 -1151389 -1151399 -1151401 -1151413 -1151417 -1151431 -1151441 -1151443 -1151471 -1151473 -1151483 -1151519 -1151537 -1151569 -1151581 -1151593 -1151599 -1151603 -1151611 -1151629 -1151639 -1151651 -1151653 -1151659 -1151671 -1151687 -1151701 -1151713 -1151729 -1151737 -1151747 -1151753 -1151779 -1151807 -1151861 -1151873 -1151879 -1151881 -1151911 -1151933 -1151963 -1151981 -1151987 -1151993 -1151999 -1152023 -1152029 -1152037 -1152071 -1152077 -1152079 -1152091 -1152113 -1152119 -1152121 -1152149 -1152157 -1152161 -1152163 -1152181 -1152187 -1152227 -1152233 -1152287 -1152313 -1152317 -1152337 -1152343 -1152367 -1152383 -1152391 -1152397 -1152419 -1152421 -1152493 -1152509 -1152517 -1152523 -1152527 -1152589 -1152623 -1152629 -1152631 -1152637 -1152643 -1152649 -1152653 -1152667 -1152677 -1152707 -1152733 -1152751 -1152757 -1152761 -1152763 -1152773 -1152791 -1152793 -1152799 -1152841 -1152857 -1152881 -1152887 -1152913 -1152917 -1152937 -1152941 -1152979 -1152989 -1152997 -1153001 -1153007 -1153021 -1153027 -1153049 -1153057 -1153063 -1153073 -1153099 -1153109 -1153123 -1153147 -1153153 -1153157 -1153171 -1153177 -1153183 -1153199 -1153211 -1153219 -1153223 -1153237 -1153241 -1153247 -1153249 -1153261 -1153267 -1153277 -1153309 -1153337 -1153343 -1153349 -1153367 -1153393 -1153421 -1153429 -1153441 -1153457 -1153459 -1153463 -1153483 -1153487 -1153511 -1153517 -1153531 -1153553 -1153573 -1153577 -1153589 -1153597 -1153609 -1153613 -1153639 -1153643 -1153681 -1153687 -1153721 -1153729 -1153751 -1153753 -1153759 -1153769 -1153777 -1153799 -1153811 -1153849 -1153853 -1153871 -1153891 -1153921 -1153967 -1153973 -1154017 -1154029 -1154033 -1154039 -1154047 -1154051 -1154119 -1154123 -1154129 -1154159 -1154173 -1154177 -1154183 -1154207 -1154221 -1154227 -1154233 -1154239 -1154243 -1154267 -1154291 -1154297 -1154299 -1154311 -1154323 -1154327 -1154339 -1154353 -1154359 -1154369 -1154401 -1154411 -1154431 -1154449 -1154467 -1154473 -1154509 -1154513 -1154537 -1154539 -1154551 -1154561 -1154563 -1154567 -1154579 -1154581 -1154603 -1154633 -1154639 -1154651 -1154653 -1154707 -1154723 -1154737 -1154753 -1154771 -1154789 -1154819 -1154821 -1154849 -1154863 -1154887 -1154893 -1154897 -1154911 -1154927 -1154947 -1154969 -1154971 -1154987 -1155001 -1155017 -1155019 -1155053 -1155061 -1155071 -1155097 -1155101 -1155107 -1155127 -1155149 -1155151 -1155169 -1155179 -1155211 -1155223 -1155233 -1155239 -1155247 -1155263 -1155293 -1155311 -1155317 -1155373 -1155377 -1155379 -1155403 -1155419 -1155431 -1155437 -1155449 -1155457 -1155461 -1155499 -1155527 -1155529 -1155569 -1155577 -1155601 -1155607 -1155611 -1155613 -1155617 -1155619 -1155629 -1155631 -1155653 -1155659 -1155689 -1155697 -1155701 -1155703 -1155709 -1155733 -1155821 -1155823 -1155829 -1155841 -1155851 -1155859 -1155863 -1155899 -1155901 -1155907 -1155919 -1155923 -1155929 -1155937 -1155943 -1155953 -1155961 -1155967 -1155971 -1155977 -1155997 -1156009 -1156013 -1156019 -1156031 -1156033 -1156037 -1156039 -1156073 -1156079 -1156087 -1156097 -1156109 -1156121 -1156151 -1156157 -1156171 -1156217 -1156229 -1156231 -1156249 -1156261 -1156271 -1156291 -1156297 -1156303 -1156307 -1156327 -1156333 -1156343 -1156367 -1156369 -1156387 -1156403 -1156423 -1156427 -1156429 -1156451 -1156453 -1156457 -1156483 -1156501 -1156523 -1156537 -1156541 -1156553 -1156567 -1156591 -1156613 -1156627 -1156633 -1156637 -1156643 -1156681 -1156699 -1156709 -1156711 -1156721 -1156741 -1156747 -1156751 -1156769 -1156783 -1156801 -1156807 -1156819 -1156823 -1156847 -1156849 -1156873 -1156907 -1156927 -1156949 -1156963 -1156997 -1157011 -1157017 -1157033 -1157053 -1157059 -1157063 -1157069 -1157077 -1157099 -1157111 -1157131 -1157159 -1157171 -1157179 -1157183 -1157201 -1157203 -1157209 -1157213 -1157227 -1157237 -1157243 -1157251 -1157257 -1157263 -1157279 -1157293 -1157327 -1157333 -1157339 -1157341 -1157357 -1157363 -1157369 -1157381 -1157393 -1157413 -1157437 -1157449 -1157489 -1157491 -1157503 -1157531 -1157539 -1157557 -1157579 -1157591 -1157609 -1157621 -1157627 -1157641 -1157669 -1157671 -1157699 -1157701 -1157711 -1157713 -1157729 -1157747 -1157749 -1157759 -1157771 -1157773 -1157791 -1157831 -1157833 -1157837 -1157839 -1157851 -1157869 -1157873 -1157899 -1157929 -1157953 -1157969 -1157977 -1157987 -1158007 -1158011 -1158037 -1158071 -1158077 -1158089 -1158121 -1158133 -1158139 -1158161 -1158187 -1158197 -1158203 -1158217 -1158247 -1158251 -1158263 -1158271 -1158293 -1158301 -1158307 -1158317 -1158323 -1158341 -1158361 -1158383 -1158389 -1158401 -1158407 -1158419 -1158427 -1158457 -1158461 -1158467 -1158473 -1158481 -1158491 -1158523 -1158529 -1158539 -1158541 -1158551 -1158569 -1158587 -1158593 -1158607 -1158611 -1158613 -1158617 -1158629 -1158643 -1158653 -1158673 -1158679 -1158683 -1158713 -1158719 -1158743 -1158757 -1158761 -1158769 -1158799 -1158821 -1158823 -1158827 -1158841 -1158847 -1158863 -1158881 -1158887 -1158923 -1158953 -1158961 -1158977 -1158991 -1159001 -1159007 -1159027 -1159031 -1159049 -1159063 -1159073 -1159079 -1159087 -1159091 -1159127 -1159139 -1159153 -1159187 -1159189 -1159199 -1159201 -1159229 -1159231 -1159241 -1159243 -1159259 -1159271 -1159283 -1159303 -1159337 -1159339 -1159381 -1159393 -1159397 -1159421 -1159423 -1159429 -1159447 -1159463 -1159489 -1159517 -1159523 -1159531 -1159541 -1159577 -1159583 -1159597 -1159601 -1159633 -1159649 -1159661 -1159663 -1159709 -1159721 -1159777 -1159787 -1159789 -1159811 -1159813 -1159843 -1159853 -1159861 -1159877 -1159889 -1159901 -1159909 -1159919 -1159967 -1159973 -1159981 -1159993 -1159997 -1160009 -1160039 -1160041 -1160057 -1160077 -1160111 -1160129 -1160141 -1160147 -1160161 -1160167 -1160179 -1160207 -1160213 -1160219 -1160221 -1160227 -1160251 -1160279 -1160287 -1160297 -1160303 -1160309 -1160317 -1160351 -1160359 -1160363 -1160371 -1160407 -1160413 -1160429 -1160443 -1160447 -1160449 -1160459 -1160473 -1160479 -1160491 -1160503 -1160513 -1160519 -1160543 -1160567 -1160569 -1160581 -1160597 -1160611 -1160639 -1160659 -1160681 -1160689 -1160713 -1160717 -1160749 -1160771 -1160807 -1160813 -1160837 -1160839 -1160867 -1160893 -1160903 -1160911 -1160927 -1160941 -1160953 -1160977 -1160983 -1160987 -1160989 -1161001 -1161007 -1161011 -1161031 -1161037 -1161047 -1161059 -1161077 -1161091 -1161101 -1161107 -1161113 -1161137 -1161143 -1161163 -1161169 -1161203 -1161217 -1161227 -1161233 -1161239 -1161241 -1161263 -1161269 -1161289 -1161313 -1161317 -1161331 -1161343 -1161371 -1161397 -1161401 -1161403 -1161437 -1161439 -1161443 -1161449 -1161463 -1161481 -1161487 -1161493 -1161497 -1161499 -1161509 -1161521 -1161529 -1161547 -1161551 -1161553 -1161581 -1161599 -1161617 -1161619 -1161637 -1161647 -1161659 -1161683 -1161691 -1161703 -1161749 -1161757 -1161761 -1161767 -1161781 -1161791 -1161829 -1161833 -1161841 -1161851 -1161857 -1161871 -1161877 -1161883 -1161893 -1161929 -1161931 -1161947 -1161949 -1161991 -1161997 -1162009 -1162037 -1162043 -1162061 -1162067 -1162079 -1162081 -1162093 -1162099 -1162129 -1162193 -1162219 -1162223 -1162229 -1162243 -1162253 -1162261 -1162277 -1162279 -1162297 -1162303 -1162321 -1162339 -1162361 -1162367 -1162373 -1162417 -1162423 -1162453 -1162463 -1162471 -1162481 -1162493 -1162501 -1162507 -1162529 -1162537 -1162541 -1162543 -1162547 -1162559 -1162571 -1162573 -1162583 -1162589 -1162597 -1162619 -1162621 -1162631 -1162649 -1162663 -1162669 -1162687 -1162691 -1162709 -1162727 -1162729 -1162741 -1162751 -1162753 -1162771 -1162789 -1162793 -1162807 -1162853 -1162859 -1162867 -1162877 -1162879 -1162897 -1162901 -1162907 -1162927 -1162937 -1162943 -1162951 -1162957 -1162961 -1162969 -1162981 -1162991 -1163003 -1163011 -1163017 -1163033 -1163039 -1163069 -1163077 -1163081 -1163083 -1163093 -1163111 -1163119 -1163131 -1163137 -1163143 -1163147 -1163159 -1163167 -1163177 -1163189 -1163207 -1163221 -1163231 -1163233 -1163251 -1163257 -1163263 -1163273 -1163311 -1163329 -1163333 -1163339 -1163353 -1163417 -1163423 -1163431 -1163441 -1163467 -1163473 -1163479 -1163483 -1163507 -1163521 -1163543 -1163551 -1163557 -1163581 -1163587 -1163609 -1163611 -1163627 -1163629 -1163641 -1163651 -1163653 -1163663 -1163671 -1163689 -1163699 -1163711 -1163713 -1163717 -1163719 -1163737 -1163753 -1163759 -1163783 -1163791 -1163821 -1163831 -1163843 -1163849 -1163873 -1163879 -1163891 -1163923 -1163947 -1163969 -1163971 -1163977 -1163989 -1163993 -1164001 -1164029 -1164043 -1164067 -1164071 -1164077 -1164091 -1164101 -1164173 -1164179 -1164181 -1164193 -1164199 -1164203 -1164217 -1164221 -1164253 -1164287 -1164323 -1164343 -1164367 -1164409 -1164413 -1164419 -1164431 -1164433 -1164439 -1164461 -1164479 -1164497 -1164503 -1164511 -1164521 -1164533 -1164557 -1164571 -1164587 -1164589 -1164593 -1164599 -1164607 -1164617 -1164623 -1164629 -1164641 -1164659 -1164671 -1164689 -1164731 -1164749 -1164791 -1164799 -1164803 -1164811 -1164817 -1164829 -1164841 -1164853 -1164859 -1164869 -1164899 -1164937 -1164941 -1164953 -1164967 -1164979 -1164991 -1164997 -1165001 -1165037 -1165049 -1165051 -1165057 -1165069 -1165079 -1165081 -1165103 -1165121 -1165127 -1165139 -1165147 -1165183 -1165187 -1165189 -1165193 -1165201 -1165207 -1165211 -1165217 -1165223 -1165273 -1165279 -1165301 -1165303 -1165349 -1165357 -1165361 -1165363 -1165379 -1165397 -1165399 -1165421 -1165447 -1165453 -1165471 -1165511 -1165529 -1165531 -1165579 -1165583 -1165643 -1165667 -1165691 -1165711 -1165721 -1165727 -1165729 -1165739 -1165751 -1165777 -1165789 -1165799 -1165819 -1165823 -1165831 -1165837 -1165849 -1165861 -1165873 -1165889 -1165903 -1165909 -1165919 -1165921 -1165933 -1165937 -1165943 -1165949 -1165951 -1165991 -1165993 -1166021 -1166027 -1166041 -1166057 -1166083 -1166089 -1166093 -1166101 -1166107 -1166131 -1166141 -1166147 -1166153 -1166213 -1166219 -1166227 -1166237 -1166287 -1166311 -1166323 -1166329 -1166359 -1166383 -1166393 -1166401 -1166411 -1166413 -1166441 -1166453 -1166479 -1166483 -1166497 -1166507 -1166527 -1166531 -1166533 -1166549 -1166563 -1166567 -1166569 -1166579 -1166597 -1166603 -1166609 -1166617 -1166639 -1166663 -1166677 -1166687 -1166713 -1166723 -1166729 -1166741 -1166773 -1166779 -1166801 -1166807 -1166827 -1166833 -1166839 -1166849 -1166857 -1166861 -1166903 -1166927 -1166929 -1166947 -1166953 -1166969 -1166987 -1167011 -1167013 -1167053 -1167059 -1167077 -1167083 -1167139 -1167143 -1167157 -1167167 -1167193 -1167209 -1167211 -1167217 -1167233 -1167241 -1167251 -1167277 -1167289 -1167293 -1167307 -1167317 -1167329 -1167347 -1167349 -1167359 -1167391 -1167409 -1167421 -1167443 -1167449 -1167469 -1167473 -1167539 -1167547 -1167559 -1167571 -1167581 -1167587 -1167599 -1167613 -1167623 -1167637 -1167653 -1167659 -1167667 -1167689 -1167697 -1167701 -1167703 -1167707 -1167709 -1167731 -1167763 -1167773 -1167791 -1167799 -1167811 -1167821 -1167823 -1167833 -1167839 -1167841 -1167847 -1167853 -1167869 -1167889 -1167899 -1167913 -1167919 -1167937 -1167953 -1167973 -1168001 -1168007 -1168031 -1168039 -1168043 -1168093 -1168133 -1168151 -1168169 -1168183 -1168187 -1168231 -1168241 -1168243 -1168247 -1168249 -1168261 -1168301 -1168319 -1168327 -1168337 -1168339 -1168351 -1168357 -1168361 -1168397 -1168399 -1168403 -1168411 -1168451 -1168463 -1168477 -1168487 -1168493 -1168501 -1168523 -1168537 -1168553 -1168619 -1168621 -1168627 -1168637 -1168639 -1168693 -1168711 -1168721 -1168751 -1168757 -1168763 -1168771 -1168789 -1168799 -1168819 -1168829 -1168831 -1168841 -1168847 -1168859 -1168877 -1168879 -1168897 -1168919 -1168927 -1168931 -1168933 -1168957 -1168969 -1168987 -1168997 -1169009 -1169011 -1169017 -1169023 -1169027 -1169029 -1169059 -1169081 -1169131 -1169137 -1169149 -1169171 -1169177 -1169183 -1169191 -1169249 -1169257 -1169261 -1169269 -1169281 -1169293 -1169323 -1169327 -1169341 -1169347 -1169353 -1169369 -1169381 -1169383 -1169401 -1169411 -1169417 -1169419 -1169449 -1169453 -1169473 -1169477 -1169491 -1169513 -1169521 -1169563 -1169587 -1169591 -1169593 -1169603 -1169627 -1169633 -1169647 -1169669 -1169677 -1169683 -1169687 -1169713 -1169741 -1169747 -1169759 -1169761 -1169767 -1169789 -1169801 -1169809 -1169827 -1169873 -1169879 -1169899 -1169929 -1169933 -1169939 -1170007 -1170011 -1170019 -1170023 -1170031 -1170049 -1170061 -1170067 -1170089 -1170107 -1170109 -1170119 -1170131 -1170133 -1170137 -1170139 -1170167 -1170173 -1170193 -1170203 -1170209 -1170233 -1170251 -1170271 -1170277 -1170311 -1170317 -1170329 -1170349 -1170361 -1170373 -1170397 -1170437 -1170443 -1170451 -1170461 -1170487 -1170497 -1170511 -1170517 -1170523 -1170541 -1170553 -1170563 -1170581 -1170583 -1170593 -1170599 -1170607 -1170641 -1170649 -1170661 -1170667 -1170679 -1170683 -1170707 -1170709 -1170713 -1170721 -1170727 -1170751 -1170779 -1170781 -1170787 -1170803 -1170811 -1170821 -1170833 -1170853 -1170857 -1170863 -1170899 -1170941 -1170947 -1170971 -1170979 -1171031 -1171033 -1171039 -1171057 -1171061 -1171069 -1171073 -1171109 -1171111 -1171117 -1171123 -1171133 -1171189 -1171199 -1171201 -1171207 -1171231 -1171241 -1171243 -1171253 -1171259 -1171267 -1171301 -1171319 -1171343 -1171393 -1171399 -1171421 -1171427 -1171447 -1171451 -1171463 -1171477 -1171517 -1171523 -1171529 -1171549 -1171553 -1171561 -1171579 -1171591 -1171601 -1171619 -1171633 -1171637 -1171661 -1171669 -1171699 -1171721 -1171747 -1171771 -1171783 -1171789 -1171801 -1171811 -1171813 -1171823 -1171837 -1171847 -1171867 -1171921 -1171927 -1171931 -1171957 -1171967 -1171969 -1171979 -1171981 -1171991 -1171999 -1172009 -1172021 -1172023 -1172027 -1172029 -1172047 -1172063 -1172069 -1172081 -1172107 -1172111 -1172147 -1172179 -1172207 -1172233 -1172257 -1172261 -1172273 -1172279 -1172317 -1172329 -1172351 -1172377 -1172393 -1172401 -1172407 -1172411 -1172417 -1172429 -1172443 -1172447 -1172461 -1172467 -1172491 -1172497 -1172503 -1172531 -1172533 -1172537 -1172539 -1172543 -1172573 -1172579 -1172657 -1172659 -1172663 -1172671 -1172681 -1172683 -1172687 -1172713 -1172749 -1172777 -1172783 -1172797 -1172803 -1172807 -1172819 -1172833 -1172867 -1172893 -1172903 -1172921 -1172929 -1172933 -1172939 -1172953 -1172957 -1172959 -1172981 -1172993 -1173001 -1173013 -1173043 -1173059 -1173101 -1173121 -1173127 -1173157 -1173163 -1173173 -1173181 -1173191 -1173199 -1173223 -1173239 -1173259 -1173281 -1173283 -1173301 -1173343 -1173349 -1173373 -1173397 -1173401 -1173407 -1173433 -1173439 -1173463 -1173481 -1173511 -1173521 -1173539 -1173541 -1173551 -1173553 -1173581 -1173583 -1173587 -1173589 -1173593 -1173617 -1173631 -1173709 -1173743 -1173749 -1173779 -1173787 -1173803 -1173811 -1173827 -1173829 -1173841 -1173853 -1173881 -1173883 -1173917 -1173937 -1173941 -1173947 -1173959 -1173961 -1173979 -1173983 -1174021 -1174027 -1174031 -1174049 -1174073 -1174079 -1174091 -1174093 -1174099 -1174141 -1174163 -1174171 -1174193 -1174211 -1174213 -1174231 -1174237 -1174247 -1174259 -1174267 -1174273 -1174301 -1174307 -1174319 -1174331 -1174337 -1174339 -1174361 -1174387 -1174399 -1174423 -1174441 -1174451 -1174463 -1174469 -1174477 -1174487 -1174489 -1174499 -1174507 -1174519 -1174531 -1174549 -1174571 -1174583 -1174601 -1174603 -1174619 -1174627 -1174669 -1174673 -1174681 -1174687 -1174709 -1174721 -1174727 -1174739 -1174759 -1174763 -1174769 -1174781 -1174783 -1174793 -1174801 -1174829 -1174847 -1174879 -1174883 -1174891 -1174897 -1174913 -1174919 -1174949 -1174951 -1174969 -1174973 -1175003 -1175021 -1175029 -1175039 -1175071 -1175077 -1175099 -1175107 -1175123 -1175143 -1175149 -1175173 -1175191 -1175219 -1175243 -1175249 -1175257 -1175267 -1175297 -1175351 -1175353 -1175371 -1175387 -1175389 -1175407 -1175411 -1175413 -1175417 -1175437 -1175467 -1175479 -1175483 -1175497 -1175509 -1175521 -1175561 -1175569 -1175579 -1175591 -1175617 -1175623 -1175627 -1175651 -1175659 -1175677 -1175683 -1175687 -1175711 -1175717 -1175723 -1175729 -1175743 -1175767 -1175789 -1175791 -1175803 -1175807 -1175813 -1175819 -1175821 -1175833 -1175849 -1175857 -1175887 -1175899 -1175927 -1175939 -1175953 -1175959 -1175963 -1175969 -1175981 -1175989 -1176023 -1176029 -1176031 -1176041 -1176061 -1176083 -1176089 -1176113 -1176121 -1176127 -1176137 -1176163 -1176173 -1176187 -1176191 -1176221 -1176223 -1176239 -1176277 -1176293 -1176323 -1176353 -1176361 -1176367 -1176377 -1176391 -1176397 -1176403 -1176407 -1176421 -1176433 -1176449 -1176463 -1176509 -1176521 -1176529 -1176533 -1176557 -1176583 -1176589 -1176599 -1176601 -1176607 -1176631 -1176641 -1176647 -1176671 -1176673 -1176701 -1176709 -1176713 -1176737 -1176767 -1176779 -1176787 -1176793 -1176797 -1176811 -1176827 -1176869 -1176871 -1176881 -1176899 -1176911 -1176937 -1176943 -1176947 -1176949 -1176983 -1177009 -1177019 -1177027 -1177037 -1177067 -1177073 -1177087 -1177093 -1177103 -1177129 -1177147 -1177153 -1177157 -1177159 -1177171 -1177181 -1177201 -1177207 -1177219 -1177223 -1177237 -1177243 -1177247 -1177277 -1177291 -1177331 -1177387 -1177399 -1177427 -1177433 -1177447 -1177453 -1177459 -1177481 -1177489 -1177499 -1177507 -1177513 -1177529 -1177541 -1177543 -1177549 -1177571 -1177609 -1177613 -1177619 -1177621 -1177637 -1177651 -1177667 -1177681 -1177697 -1177711 -1177717 -1177723 -1177733 -1177739 -1177741 -1177751 -1177763 -1177769 -1177801 -1177843 -1177859 -1177873 -1177877 -1177901 -1177919 -1177921 -1177933 -1177949 -1177987 -1177997 -1178003 -1178017 -1178033 -1178039 -1178041 -1178059 -1178069 -1178087 -1178101 -1178113 -1178123 -1178131 -1178141 -1178159 -1178161 -1178167 -1178173 -1178189 -1178197 -1178201 -1178207 -1178213 -1178227 -1178231 -1178237 -1178239 -1178263 -1178269 -1178273 -1178297 -1178347 -1178363 -1178369 -1178371 -1178377 -1178393 -1178417 -1178447 -1178461 -1178479 -1178483 -1178521 -1178533 -1178537 -1178549 -1178557 -1178591 -1178609 -1178621 -1178623 -1178633 -1178641 -1178659 -1178669 -1178689 -1178699 -1178701 -1178707 -1178711 -1178717 -1178719 -1178743 -1178753 -1178767 -1178803 -1178809 -1178833 -1178843 -1178851 -1178887 -1178897 -1178909 -1178921 -1178927 -1178939 -1178953 -1178959 -1178963 -1178971 -1178977 -1178981 -1178993 -1179011 -1179019 -1179047 -1179109 -1179127 -1179149 -1179151 -1179173 -1179179 -1179193 -1179203 -1179223 -1179251 -1179253 -1179259 -1179263 -1179281 -1179287 -1179289 -1179293 -1179317 -1179319 -1179323 -1179329 -1179331 -1179337 -1179379 -1179383 -1179389 -1179403 -1179413 -1179419 -1179421 -1179427 -1179467 -1179491 -1179499 -1179527 -1179547 -1179551 -1179553 -1179569 -1179571 -1179583 -1179589 -1179599 -1179637 -1179641 -1179649 -1179677 -1179733 -1179751 -1179757 -1179779 -1179793 -1179797 -1179839 -1179847 -1179853 -1179859 -1179863 -1179869 -1179883 -1179901 -1179907 -1179929 -1179947 -1179961 -1179973 -1179977 -1179979 -1179989 -1179991 -1180009 -1180013 -1180019 -1180027 -1180031 -1180043 -1180057 -1180073 -1180087 -1180093 -1180099 -1180111 -1180117 -1180121 -1180133 -1180141 -1180159 -1180171 -1180219 -1180237 -1180241 -1180243 -1180247 -1180253 -1180279 -1180303 -1180313 -1180351 -1180369 -1180373 -1180381 -1180391 -1180397 -1180409 -1180423 -1180427 -1180447 -1180477 -1180493 -1180507 -1180519 -1180537 -1180547 -1180549 -1180577 -1180591 -1180631 -1180637 -1180643 -1180657 -1180661 -1180691 -1180693 -1180709 -1180721 -1180723 -1180727 -1180733 -1180757 -1180771 -1180799 -1180807 -1180811 -1180819 -1180847 -1180849 -1180853 -1180859 -1180873 -1180877 -1180891 -1180897 -1180901 -1180903 -1180913 -1180931 -1180937 -1180951 -1180957 -1180961 -1180979 -1180987 -1180997 -1181017 -1181023 -1181039 -1181051 -1181053 -1181057 -1181093 -1181099 -1181137 -1181149 -1181153 -1181171 -1181183 -1181197 -1181203 -1181209 -1181237 -1181263 -1181267 -1181269 -1181281 -1181293 -1181309 -1181311 -1181321 -1181329 -1181407 -1181413 -1181437 -1181443 -1181461 -1181471 -1181473 -1181501 -1181507 -1181519 -1181527 -1181549 -1181561 -1181563 -1181573 -1181581 -1181611 -1181617 -1181633 -1181647 -1181681 -1181699 -1181701 -1181723 -1181729 -1181731 -1181759 -1181767 -1181771 -1181773 -1181777 -1181839 -1181879 -1181881 -1181893 -1181897 -1181911 -1181923 -1181927 -1181963 -1181969 -1181981 -1181987 -1182007 -1182019 -1182023 -1182031 -1182043 -1182073 -1182121 -1182133 -1182143 -1182157 -1182211 -1182253 -1182277 -1182281 -1182283 -1182287 -1182289 -1182331 -1182341 -1182343 -1182347 -1182353 -1182383 -1182397 -1182403 -1182413 -1182421 -1182431 -1182437 -1182439 -1182449 -1182451 -1182463 -1182479 -1182487 -1182491 -1182509 -1182521 -1182539 -1182547 -1182581 -1182593 -1182611 -1182659 -1182677 -1182679 -1182689 -1182691 -1182697 -1182703 -1182737 -1182739 -1182757 -1182763 -1182767 -1182781 -1182787 -1182791 -1182817 -1182847 -1182869 -1182889 -1182893 -1182901 -1182917 -1182919 -1182947 -1182953 -1182967 -1182989 -1183003 -1183027 -1183031 -1183033 -1183057 -1183079 -1183093 -1183103 -1183121 -1183123 -1183141 -1183151 -1183157 -1183159 -1183163 -1183181 -1183199 -1183201 -1183211 -1183213 -1183241 -1183261 -1183267 -1183271 -1183277 -1183279 -1183333 -1183337 -1183349 -1183381 -1183393 -1183397 -1183409 -1183411 -1183423 -1183447 -1183451 -1183471 -1183477 -1183531 -1183537 -1183541 -1183561 -1183571 -1183579 -1183597 -1183607 -1183613 -1183687 -1183697 -1183709 -1183723 -1183729 -1183733 -1183739 -1183753 -1183759 -1183769 -1183771 -1183781 -1183799 -1183811 -1183813 -1183837 -1183843 -1183877 -1183913 -1183933 -1183939 -1183943 -1183951 -1183961 -1183969 -1183981 -1183993 -1183997 -1184003 -1184011 -1184047 -1184059 -1184069 -1184077 -1184081 -1184083 -1184093 -1184119 -1184123 -1184129 -1184143 -1184149 -1184171 -1184173 -1184207 -1184219 -1184243 -1184269 -1184291 -1184299 -1184303 -1184317 -1184329 -1184347 -1184357 -1184363 -1184369 -1184377 -1184399 -1184411 -1184413 -1184423 -1184429 -1184453 -1184459 -1184461 -1184471 -1184473 -1184483 -1184489 -1184507 -1184527 -1184537 -1184539 -1184549 -1184551 -1184587 -1184609 -1184653 -1184663 -1184671 -1184683 -1184731 -1184741 -1184749 -1184759 -1184767 -1184791 -1184797 -1184837 -1184839 -1184867 -1184881 -1184893 -1184903 -1184923 -1184927 -1184933 -1184947 -1184957 -1184959 -1184987 -1184993 -1185013 -1185017 -1185071 -1185077 -1185089 -1185103 -1185109 -1185113 -1185127 -1185131 -1185179 -1185181 -1185241 -1185281 -1185287 -1185299 -1185307 -1185313 -1185319 -1185329 -1185337 -1185343 -1185361 -1185367 -1185377 -1185383 -1185389 -1185403 -1185439 -1185463 -1185469 -1185493 -1185497 -1185511 -1185523 -1185551 -1185559 -1185577 -1185589 -1185601 -1185617 -1185623 -1185637 -1185643 -1185647 -1185659 -1185661 -1185671 -1185677 -1185683 -1185689 -1185697 -1185703 -1185707 -1185721 -1185749 -1185787 -1185791 -1185797 -1185817 -1185823 -1185827 -1185851 -1185859 -1185871 -1185883 -1185889 -1185893 -1185907 -1185929 -1185931 -1185953 -1185979 -1185997 -1186001 -1186033 -1186049 -1186051 -1186057 -1186063 -1186067 -1186079 -1186099 -1186111 -1186117 -1186121 -1186127 -1186147 -1186169 -1186181 -1186217 -1186231 -1186249 -1186259 -1186291 -1186321 -1186337 -1186349 -1186351 -1186373 -1186397 -1186403 -1186411 -1186439 -1186441 -1186489 -1186517 -1186519 -1186541 -1186573 -1186589 -1186597 -1186621 -1186631 -1186657 -1186673 -1186693 -1186697 -1186699 -1186739 -1186741 -1186751 -1186769 -1186789 -1186807 -1186811 -1186813 -1186837 -1186841 -1186847 -1186879 -1186931 -1186937 -1186963 -1186973 -1186981 -1187003 -1187009 -1187023 -1187047 -1187051 -1187089 -1187107 -1187111 -1187117 -1187141 -1187159 -1187167 -1187189 -1187201 -1187227 -1187233 -1187239 -1187261 -1187279 -1187287 -1187309 -1187311 -1187317 -1187321 -1187339 -1187341 -1187353 -1187357 -1187363 -1187369 -1187383 -1187387 -1187411 -1187413 -1187419 -1187429 -1187453 -1187471 -1187479 -1187489 -1187507 -1187509 -1187539 -1187551 -1187561 -1187567 -1187587 -1187623 -1187629 -1187639 -1187657 -1187687 -1187689 -1187699 -1187701 -1187707 -1187717 -1187723 -1187741 -1187749 -1187761 -1187801 -1187803 -1187819 -1187821 -1187833 -1187839 -1187863 -1187867 -1187873 -1187887 -1187897 -1187911 -1187933 -1187939 -1187941 -1187947 -1187981 -1187993 -1187999 -1188001 -1188007 -1188017 -1188029 -1188037 -1188041 -1188049 -1188059 -1188071 -1188073 -1188149 -1188151 -1188167 -1188169 -1188179 -1188197 -1188223 -1188227 -1188233 -1188247 -1188259 -1188263 -1188269 -1188277 -1188287 -1188289 -1188293 -1188307 -1188353 -1188359 -1188361 -1188377 -1188389 -1188409 -1188413 -1188457 -1188491 -1188511 -1188527 -1188529 -1188553 -1188557 -1188559 -1188581 -1188587 -1188601 -1188613 -1188619 -1188637 -1188653 -1188661 -1188667 -1188679 -1188689 -1188721 -1188727 -1188731 -1188763 -1188769 -1188787 -1188839 -1188841 -1188851 -1188857 -1188899 -1188917 -1188931 -1188937 -1188947 -1188973 -1188977 -1188991 -1189003 -1189007 -1189021 -1189033 -1189057 -1189061 -1189063 -1189093 -1189109 -1189121 -1189127 -1189151 -1189159 -1189163 -1189171 -1189189 -1189193 -1189213 -1189219 -1189231 -1189271 -1189277 -1189301 -1189313 -1189327 -1189333 -1189339 -1189361 -1189387 -1189403 -1189417 -1189453 -1189469 -1189471 -1189481 -1189483 -1189553 -1189567 -1189577 -1189579 -1189603 -1189607 -1189613 -1189621 -1189627 -1189631 -1189633 -1189637 -1189649 -1189651 -1189673 -1189703 -1189709 -1189717 -1189751 -1189757 -1189759 -1189763 -1189789 -1189801 -1189807 -1189823 -1189831 -1189843 -1189871 -1189879 -1189891 -1189897 -1189901 -1189907 -1189919 -1189933 -1189967 -1189999 -1190011 -1190023 -1190029 -1190041 -1190047 -1190069 -1190071 -1190081 -1190143 -1190149 -1190159 -1190177 -1190201 -1190237 -1190249 -1190261 -1190263 -1190279 -1190291 -1190311 -1190347 -1190359 -1190381 -1190417 -1190429 -1190447 -1190467 -1190473 -1190477 -1190489 -1190491 -1190507 -1190509 -1190513 -1190533 -1190573 -1190587 -1190591 -1190611 -1190633 -1190639 -1190647 -1190671 -1190699 -1190701 -1190719 -1190723 -1190737 -1190743 -1190753 -1190773 -1190789 -1190807 -1190809 -1190821 -1190831 -1190837 -1190851 -1190873 -1190897 -1190899 -1190911 -1190923 -1190929 -1190947 -1190951 -1190953 -1190983 -1191011 -1191013 -1191019 -1191031 -1191061 -1191077 -1191079 -1191089 -1191097 -1191103 -1191107 -1191109 -1191119 -1191131 -1191149 -1191163 -1191187 -1191191 -1191199 -1191209 -1191221 -1191247 -1191277 -1191283 -1191293 -1191301 -1191313 -1191341 -1191347 -1191353 -1191373 -1191409 -1191431 -1191439 -1191457 -1191481 -1191499 -1191529 -1191539 -1191551 -1191559 -1191563 -1191571 -1191577 -1191601 -1191611 -1191613 -1191637 -1191643 -1191667 -1191679 -1191691 -1191703 -1191719 -1191727 -1191731 -1191739 -1191761 -1191767 -1191769 -1191781 -1191793 -1191809 -1191821 -1191833 -1191847 -1191899 -1191923 -1191937 -1191941 -1191947 -1191973 -1191979 -1191991 -1192013 -1192027 -1192039 -1192069 -1192073 -1192097 -1192099 -1192109 -1192127 -1192141 -1192151 -1192153 -1192171 -1192181 -1192183 -1192187 -1192199 -1192201 -1192207 -1192211 -1192241 -1192253 -1192259 -1192267 -1192271 -1192327 -1192337 -1192339 -1192349 -1192357 -1192369 -1192391 -1192409 -1192417 -1192423 -1192427 -1192453 -1192469 -1192483 -1192517 -1192549 -1192559 -1192561 -1192571 -1192579 -1192589 -1192603 -1192651 -1192673 -1192679 -1192699 -1192717 -1192721 -1192753 -1192781 -1192811 -1192817 -1192823 -1192831 -1192837 -1192847 -1192853 -1192879 -1192883 -1192889 -1192897 -1192903 -1192909 -1192927 -1192937 -1192951 -1192967 -1192969 -1193011 -1193021 -1193041 -1193047 -1193057 -1193081 -1193107 -1193119 -1193123 -1193131 -1193149 -1193161 -1193173 -1193183 -1193209 -1193233 -1193237 -1193239 -1193243 -1193261 -1193267 -1193299 -1193303 -1193329 -1193351 -1193363 -1193369 -1193399 -1193429 -1193431 -1193443 -1193459 -1193473 -1193483 -1193497 -1193501 -1193503 -1193513 -1193537 -1193557 -1193567 -1193573 -1193603 -1193609 -1193617 -1193653 -1193663 -1193683 -1193693 -1193701 -1193707 -1193711 -1193729 -1193737 -1193741 -1193743 -1193761 -1193767 -1193771 -1193783 -1193821 -1193833 -1193837 -1193839 -1193849 -1193867 -1193869 -1193887 -1193909 -1193911 -1193939 -1193947 -1193963 -1193971 -1193989 -1193993 -1194019 -1194023 -1194031 -1194041 -1194047 -1194059 -1194103 -1194157 -1194161 -1194163 -1194203 -1194209 -1194211 -1194241 -1194251 -1194253 -1194269 -1194293 -1194311 -1194329 -1194341 -1194343 -1194373 -1194379 -1194383 -1194407 -1194421 -1194439 -1194443 -1194449 -1194463 -1194493 -1194517 -1194521 -1194541 -1194547 -1194553 -1194581 -1194593 -1194601 -1194631 -1194659 -1194667 -1194671 -1194679 -1194707 -1194727 -1194731 -1194733 -1194751 -1194757 -1194763 -1194769 -1194797 -1194799 -1194803 -1194821 -1194847 -1194857 -1194877 -1194883 -1194889 -1194899 -1194901 -1194917 -1194923 -1194959 -1194961 -1194971 -1194979 -1194997 -1195021 -1195031 -1195037 -1195039 -1195067 -1195091 -1195121 -1195123 -1195127 -1195141 -1195153 -1195169 -1195171 -1195189 -1195193 -1195217 -1195223 -1195231 -1195237 -1195247 -1195277 -1195291 -1195361 -1195387 -1195421 -1195429 -1195459 -1195463 -1195477 -1195483 -1195489 -1195501 -1195543 -1195547 -1195549 -1195561 -1195567 -1195573 -1195589 -1195669 -1195673 -1195679 -1195681 -1195693 -1195703 -1195709 -1195721 -1195723 -1195741 -1195751 -1195759 -1195771 -1195801 -1195807 -1195811 -1195837 -1195849 -1195891 -1195897 -1195907 -1195919 -1195927 -1195937 -1195979 -1195991 -1196003 -1196029 -1196033 -1196059 -1196077 -1196087 -1196089 -1196119 -1196123 -1196141 -1196177 -1196191 -1196201 -1196219 -1196227 -1196231 -1196267 -1196269 -1196281 -1196287 -1196309 -1196323 -1196329 -1196347 -1196357 -1196359 -1196399 -1196401 -1196413 -1196431 -1196471 -1196473 -1196491 -1196501 -1196509 -1196513 -1196519 -1196521 -1196537 -1196539 -1196593 -1196597 -1196603 -1196609 -1196633 -1196653 -1196683 -1196707 -1196717 -1196719 -1196729 -1196731 -1196773 -1196809 -1196813 -1196837 -1196843 -1196857 -1196861 -1196863 -1196869 -1196873 -1196891 -1196911 -1196927 -1196939 -1196959 -1196999 -1197011 -1197013 -1197017 -1197029 -1197037 -1197041 -1197059 -1197067 -1197073 -1197103 -1197107 -1197113 -1197121 -1197167 -1197181 -1197187 -1197193 -1197197 -1197199 -1197211 -1197221 -1197239 -1197257 -1197263 -1197269 -1197277 -1197281 -1197289 -1197307 -1197337 -1197347 -1197349 -1197353 -1197359 -1197367 -1197389 -1197407 -1197409 -1197433 -1197451 -1197467 -1197473 -1197479 -1197509 -1197527 -1197571 -1197577 -1197601 -1197617 -1197619 -1197631 -1197649 -1197697 -1197709 -1197739 -1197743 -1197751 -1197767 -1197799 -1197821 -1197827 -1197829 -1197881 -1197901 -1197907 -1197923 -1197929 -1197941 -1197947 -1197953 -1197971 -1197997 -1198013 -1198033 -1198037 -1198049 -1198051 -1198063 -1198069 -1198073 -1198081 -1198103 -1198123 -1198133 -1198151 -1198157 -1198187 -1198189 -1198201 -1198217 -1198229 -1198247 -1198259 -1198261 -1198289 -1198291 -1198297 -1198303 -1198321 -1198343 -1198361 -1198363 -1198397 -1198399 -1198403 -1198411 -1198427 -1198433 -1198447 -1198451 -1198469 -1198481 -1198511 -1198513 -1198523 -1198537 -1198583 -1198607 -1198609 -1198621 -1198643 -1198651 -1198661 -1198669 -1198679 -1198699 -1198727 -1198751 -1198793 -1198811 -1198819 -1198849 -1198853 -1198861 -1198867 -1198877 -1198903 -1198927 -1198949 -1198973 -1198979 -1198991 -1198997 -1198999 -1199039 -1199047 -1199069 -1199083 -1199087 -1199089 -1199117 -1199123 -1199131 -1199137 -1199167 -1199183 -1199189 -1199203 -1199257 -1199309 -1199329 -1199351 -1199357 -1199369 -1199371 -1199377 -1199389 -1199417 -1199423 -1199437 -1199441 -1199447 -1199459 -1199461 -1199467 -1199477 -1199491 -1199507 -1199509 -1199521 -1199551 -1199557 -1199573 -1199587 -1199591 -1199593 -1199617 -1199621 -1199623 -1199629 -1199659 -1199663 -1199677 -1199683 -1199689 -1199699 -1199711 -1199719 -1199767 -1199777 -1199789 -1199801 -1199813 -1199819 -1199833 -1199839 -1199851 -1199857 -1199879 -1199893 -1199899 -1199909 -1199923 -1199929 -1199953 -1199969 -1199993 -1199999 -1200007 -1200061 -1200077 -1200083 -1200109 -1200139 -1200161 -1200167 -1200179 -1200187 -1200191 -1200233 -1200253 -1200307 -1200313 -1200323 -1200341 -1200349 -1200359 -1200361 -1200371 -1200373 -1200377 -1200383 -1200389 -1200403 -1200443 -1200449 -1200461 -1200467 -1200491 -1200499 -1200509 -1200527 -1200581 -1200583 -1200607 -1200611 -1200637 -1200643 -1200673 -1200679 -1200691 -1200697 -1200701 -1200739 -1200751 -1200779 -1200799 -1200809 -1200811 -1200833 -1200839 -1200869 -1200883 -1200887 -1200889 -1200917 -1200929 -1200937 -1200943 -1200949 -1200959 -1200989 -1201001 -1201003 -1201019 -1201021 -1201027 -1201043 -1201049 -1201061 -1201073 -1201087 -1201097 -1201103 -1201111 -1201117 -1201141 -1201153 -1201163 -1201171 -1201183 -1201201 -1201217 -1201229 -1201241 -1201247 -1201261 -1201283 -1201307 -1201309 -1201327 -1201337 -1201381 -1201439 -1201469 -1201481 -1201483 -1201489 -1201493 -1201513 -1201523 -1201531 -1201553 -1201559 -1201567 -1201583 -1201601 -1201633 -1201637 -1201643 -1201687 -1201691 -1201699 -1201703 -1201709 -1201729 -1201787 -1201793 -1201813 -1201829 -1201841 -1201843 -1201853 -1201873 -1201909 -1201919 -1201939 -1201961 -1201969 -1201999 -1202009 -1202017 -1202023 -1202027 -1202029 -1202041 -1202057 -1202063 -1202077 -1202081 -1202099 -1202107 -1202129 -1202147 -1202153 -1202183 -1202191 -1202219 -1202221 -1202231 -1202239 -1202251 -1202261 -1202269 -1202293 -1202303 -1202317 -1202321 -1202329 -1202347 -1202363 -1202387 -1202423 -1202429 -1202437 -1202447 -1202471 -1202473 -1202477 -1202483 -1202497 -1202501 -1202507 -1202549 -1202561 -1202569 -1202603 -1202609 -1202627 -1202629 -1202633 -1202689 -1202741 -1202743 -1202771 -1202779 -1202783 -1202791 -1202807 -1202813 -1202819 -1202827 -1202837 -1202843 -1202849 -1202857 -1202863 -1202867 -1202881 -1202939 -1202959 -1202963 -1202977 -1202987 -1203019 -1203067 -1203077 -1203101 -1203121 -1203127 -1203149 -1203151 -1203161 -1203179 -1203193 -1203211 -1203217 -1203221 -1203229 -1203233 -1203263 -1203283 -1203287 -1203329 -1203331 -1203343 -1203359 -1203361 -1203421 -1203437 -1203443 -1203457 -1203463 -1203467 -1203487 -1203493 -1203509 -1203533 -1203557 -1203571 -1203581 -1203607 -1203611 -1203619 -1203641 -1203661 -1203667 -1203689 -1203691 -1203731 -1203733 -1203739 -1203757 -1203773 -1203779 -1203791 -1203793 -1203799 -1203809 -1203817 -1203827 -1203841 -1203863 -1203887 -1203893 -1203899 -1203901 -1203913 -1203919 -1203929 -1203931 -1203941 -1203949 -1203953 -1203959 -1203971 -1204003 -1204019 -1204037 -1204097 -1204103 -1204117 -1204139 -1204141 -1204153 -1204169 -1204171 -1204183 -1204207 -1204219 -1204243 -1204271 -1204279 -1204289 -1204309 -1204337 -1204363 -1204369 -1204397 -1204409 -1204421 -1204447 -1204451 -1204453 -1204471 -1204477 -1204493 -1204507 -1204519 -1204529 -1204561 -1204583 -1204597 -1204607 -1204613 -1204633 -1204649 -1204669 -1204681 -1204699 -1204711 -1204729 -1204741 -1204781 -1204783 -1204787 -1204813 -1204823 -1204859 -1204871 -1204873 -1204883 -1204891 -1204937 -1204967 -1204969 -1204981 -1205027 -1205047 -1205081 -1205089 -1205093 -1205101 -1205117 -1205119 -1205123 -1205159 -1205173 -1205179 -1205219 -1205231 -1205251 -1205257 -1205287 -1205293 -1205339 -1205377 -1205387 -1205411 -1205437 -1205447 -1205459 -1205467 -1205471 -1205473 -1205489 -1205513 -1205527 -1205537 -1205539 -1205549 -1205557 -1205563 -1205609 -1205627 -1205629 -1205639 -1205647 -1205653 -1205663 -1205669 -1205681 -1205693 -1205707 -1205713 -1205717 -1205731 -1205749 -1205753 -1205767 -1205773 -1205779 -1205819 -1205843 -1205891 -1205899 -1205903 -1205921 -1205947 -1205951 -1205969 -1205977 -1205999 -1206013 -1206017 -1206043 -1206053 -1206059 -1206061 -1206071 -1206113 -1206131 -1206151 -1206157 -1206169 -1206173 -1206181 -1206187 -1206199 -1206209 -1206223 -1206229 -1206259 -1206263 -1206277 -1206307 -1206319 -1206323 -1206341 -1206347 -1206353 -1206377 -1206383 -1206391 -1206407 -1206433 -1206449 -1206461 -1206467 -1206479 -1206497 -1206529 -1206539 -1206553 -1206563 -1206577 -1206581 -1206587 -1206619 -1206637 -1206679 -1206683 -1206691 -1206701 -1206703 -1206713 -1206721 -1206731 -1206743 -1206749 -1206761 -1206767 -1206769 -1206773 -1206781 -1206791 -1206809 -1206827 -1206841 -1206869 -1206941 -1206973 -1206979 -1207001 -1207027 -1207033 -1207039 -1207043 -1207079 -1207093 -1207097 -1207111 -1207117 -1207121 -1207123 -1207133 -1207147 -1207159 -1207211 -1207223 -1207237 -1207249 -1207259 -1207267 -1207291 -1207307 -1207309 -1207313 -1207319 -1207331 -1207343 -1207351 -1207363 -1207379 -1207387 -1207403 -1207417 -1207429 -1207439 -1207441 -1207447 -1207489 -1207501 -1207511 -1207519 -1207529 -1207537 -1207597 -1207603 -1207627 -1207649 -1207681 -1207699 -1207721 -1207727 -1207751 -1207757 -1207769 -1207841 -1207883 -1207903 -1207909 -1207919 -1207933 -1207957 -1207961 -1207979 -1207981 -1208017 -1208021 -1208023 -1208027 -1208033 -1208057 -1208069 -1208089 -1208113 -1208117 -1208131 -1208149 -1208159 -1208177 -1208189 -1208209 -1208219 -1208237 -1208239 -1208243 -1208269 -1208279 -1208297 -1208299 -1208303 -1208341 -1208371 -1208387 -1208399 -1208407 -1208413 -1208423 -1208447 -1208461 -1208507 -1208521 -1208561 -1208569 -1208573 -1208591 -1208651 -1208657 -1208663 -1208677 -1208681 -1208689 -1208707 -1208731 -1208741 -1208777 -1208789 -1208791 -1208797 -1208813 -1208821 -1208833 -1208843 -1208849 -1208863 -1208873 -1208927 -1208939 -1208941 -1208957 -1209007 -1209017 -1209029 -1209053 -1209073 -1209079 -1209083 -1209107 -1209113 -1209121 -1209139 -1209151 -1209163 -1209181 -1209191 -1209199 -1209209 -1209223 -1209233 -1209239 -1209251 -1209269 -1209277 -1209281 -1209287 -1209311 -1209337 -1209347 -1209353 -1209367 -1209379 -1209427 -1209437 -1209457 -1209463 -1209469 -1209487 -1209491 -1209517 -1209539 -1209557 -1209563 -1209577 -1209583 -1209587 -1209617 -1209629 -1209631 -1209647 -1209671 -1209697 -1209707 -1209709 -1209739 -1209757 -1209763 -1209773 -1209779 -1209781 -1209809 -1209811 -1209821 -1209841 -1209853 -1209877 -1209883 -1209889 -1209931 -1209947 -1209959 -1209973 -1209979 -1210003 -1210019 -1210021 -1210037 -1210039 -1210049 -1210051 -1210067 -1210093 -1210103 -1210123 -1210127 -1210151 -1210163 -1210169 -1210177 -1210193 -1210207 -1210211 -1210229 -1210241 -1210259 -1210289 -1210351 -1210369 -1210379 -1210387 -1210393 -1210397 -1210399 -1210403 -1210409 -1210411 -1210427 -1210439 -1210441 -1210459 -1210477 -1210483 -1210499 -1210523 -1210541 -1210549 -1210597 -1210609 -1210613 -1210631 -1210637 -1210639 -1210711 -1210717 -1210747 -1210753 -1210777 -1210787 -1210793 -1210799 -1210801 -1210817 -1210819 -1210831 -1210843 -1210871 -1210873 -1210877 -1210879 -1210883 -1210897 -1210903 -1210921 -1210933 -1210939 -1210949 -1210967 -1210987 -1210999 -1211027 -1211039 -1211051 -1211057 -1211059 -1211081 -1211083 -1211087 -1211141 -1211167 -1211179 -1211183 -1211191 -1211207 -1211227 -1211261 -1211279 -1211281 -1211303 -1211311 -1211333 -1211339 -1211381 -1211389 -1211393 -1211407 -1211411 -1211423 -1211443 -1211477 -1211489 -1211501 -1211503 -1211531 -1211537 -1211543 -1211549 -1211563 -1211593 -1211597 -1211599 -1211603 -1211621 -1211629 -1211647 -1211653 -1211657 -1211659 -1211669 -1211677 -1211689 -1211701 -1211719 -1211723 -1211731 -1211737 -1211741 -1211761 -1211767 -1211779 -1211789 -1211797 -1211807 -1211813 -1211827 -1211843 -1211857 -1211863 -1211897 -1211911 -1211921 -1211923 -1211933 -1211983 -1211999 -1212011 -1212017 -1212023 -1212047 -1212053 -1212061 -1212103 -1212119 -1212121 -1212149 -1212173 -1212187 -1212191 -1212199 -1212221 -1212227 -1212241 -1212251 -1212259 -1212283 -1212293 -1212301 -1212319 -1212331 -1212347 -1212361 -1212373 -1212397 -1212401 -1212427 -1212433 -1212437 -1212439 -1212443 -1212473 -1212479 -1212487 -1212517 -1212521 -1212551 -1212569 -1212611 -1212613 -1212641 -1212649 -1212671 -1212677 -1212683 -1212697 -1212703 -1212709 -1212719 -1212737 -1212769 -1212773 -1212781 -1212787 -1212793 -1212811 -1212817 -1212839 -1212847 -1212851 -1212853 -1212857 -1212877 -1212889 -1212907 -1212917 -1212919 -1212923 -1212931 -1212943 -1212973 -1212989 -1213007 -1213019 -1213021 -1213027 -1213033 -1213049 -1213057 -1213063 -1213081 -1213087 -1213097 -1213109 -1213129 -1213133 -1213141 -1213151 -1213153 -1213183 -1213189 -1213213 -1213241 -1213253 -1213259 -1213271 -1213301 -1213327 -1213339 -1213357 -1213367 -1213379 -1213427 -1213439 -1213451 -1213469 -1213481 -1213483 -1213517 -1213529 -1213547 -1213561 -1213573 -1213577 -1213591 -1213601 -1213607 -1213627 -1213631 -1213633 -1213643 -1213651 -1213657 -1213661 -1213673 -1213721 -1213741 -1213747 -1213757 -1213759 -1213763 -1213781 -1213801 -1213829 -1213837 -1213841 -1213873 -1213879 -1213897 -1213907 -1213909 -1213913 -1213921 -1213931 -1213939 -1213943 -1213951 -1213981 -1214011 -1214023 -1214039 -1214047 -1214077 -1214093 -1214113 -1214117 -1214131 -1214137 -1214141 -1214159 -1214167 -1214183 -1214189 -1214197 -1214219 -1214221 -1214237 -1214261 -1214273 -1214281 -1214299 -1214333 -1214357 -1214371 -1214393 -1214401 -1214407 -1214413 -1214417 -1214431 -1214441 -1214453 -1214459 -1214471 -1214483 -1214489 -1214519 -1214533 -1214567 -1214573 -1214579 -1214593 -1214617 -1214623 -1214639 -1214641 -1214657 -1214659 -1214663 -1214669 -1214671 -1214683 -1214687 -1214711 -1214729 -1214737 -1214743 -1214749 -1214767 -1214819 -1214827 -1214849 -1214867 -1214891 -1214909 -1214923 -1214933 -1214947 -1214957 -1214959 -1214963 -1214971 -1214977 -1214981 -1215017 -1215029 -1215047 -1215079 -1215083 -1215103 -1215121 -1215133 -1215157 -1215161 -1215167 -1215173 -1215197 -1215209 -1215229 -1215239 -1215271 -1215283 -1215299 -1215301 -1215311 -1215329 -1215349 -1215359 -1215367 -1215391 -1215397 -1215407 -1215421 -1215433 -1215437 -1215439 -1215451 -1215457 -1215463 -1215497 -1215499 -1215509 -1215521 -1215553 -1215569 -1215583 -1215587 -1215623 -1215629 -1215631 -1215637 -1215647 -1215649 -1215673 -1215679 -1215703 -1215719 -1215743 -1215769 -1215779 -1215787 -1215827 -1215839 -1215847 -1215853 -1215859 -1215881 -1215899 -1215917 -1215919 -1215923 -1216009 -1216013 -1216021 -1216043 -1216067 -1216069 -1216087 -1216091 -1216109 -1216123 -1216147 -1216151 -1216177 -1216213 -1216249 -1216273 -1216277 -1216337 -1216339 -1216349 -1216351 -1216373 -1216379 -1216387 -1216393 -1216417 -1216421 -1216433 -1216441 -1216451 -1216459 -1216489 -1216507 -1216529 -1216543 -1216547 -1216559 -1216561 -1216577 -1216583 -1216591 -1216601 -1216603 -1216619 -1216681 -1216693 -1216711 -1216717 -1216729 -1216751 -1216759 -1216763 -1216777 -1216793 -1216799 -1216807 -1216823 -1216841 -1216847 -1216849 -1216867 -1216871 -1216879 -1216903 -1216913 -1216937 -1216939 -1216951 -1216961 -1216973 -1216987 -1216997 -1217009 -1217017 -1217023 -1217033 -1217053 -1217057 -1217063 -1217071 -1217077 -1217089 -1217093 -1217107 -1217113 -1217119 -1217131 -1217141 -1217143 -1217147 -1217171 -1217179 -1217191 -1217207 -1217213 -1217219 -1217233 -1217261 -1217269 -1217297 -1217299 -1217303 -1217309 -1217317 -1217329 -1217351 -1217393 -1217399 -1217407 -1217417 -1217423 -1217443 -1217467 -1217471 -1217473 -1217477 -1217483 -1217509 -1217521 -1217533 -1217537 -1217561 -1217617 -1217647 -1217651 -1217663 -1217669 -1217677 -1217683 -1217687 -1217719 -1217731 -1217753 -1217759 -1217771 -1217809 -1217813 -1217831 -1217833 -1217861 -1217893 -1217899 -1217903 -1217917 -1217921 -1217927 -1217933 -1217941 -1217947 -1217963 -1217977 -1217989 -1218017 -1218043 -1218089 -1218121 -1218131 -1218157 -1218167 -1218179 -1218197 -1218199 -1218209 -1218211 -1218221 -1218247 -1218251 -1218257 -1218263 -1218277 -1218281 -1218307 -1218313 -1218367 -1218383 -1218391 -1218401 -1218421 -1218433 -1218449 -1218457 -1218463 -1218467 -1218473 -1218487 -1218533 -1218557 -1218559 -1218571 -1218583 -1218601 -1218617 -1218631 -1218649 -1218653 -1218683 -1218691 -1218709 -1218727 -1218731 -1218739 -1218761 -1218773 -1218779 -1218787 -1218821 -1218829 -1218853 -1218859 -1218901 -1218911 -1218913 -1218923 -1218941 -1218949 -1218953 -1218989 -1218991 -1219003 -1219061 -1219081 -1219091 -1219109 -1219111 -1219123 -1219129 -1219147 -1219177 -1219213 -1219237 -1219241 -1219271 -1219279 -1219297 -1219301 -1219303 -1219307 -1219313 -1219343 -1219349 -1219357 -1219399 -1219411 -1219433 -1219453 -1219457 -1219469 -1219481 -1219487 -1219489 -1219501 -1219507 -1219549 -1219577 -1219607 -1219613 -1219619 -1219639 -1219643 -1219649 -1219651 -1219657 -1219663 -1219679 -1219703 -1219717 -1219721 -1219727 -1219739 -1219747 -1219753 -1219763 -1219783 -1219787 -1219789 -1219793 -1219807 -1219811 -1219831 -1219837 -1219843 -1219847 -1219849 -1219859 -1219861 -1219871 -1219877 -1219879 -1219891 -1219909 -1219913 -1219919 -1219931 -1219949 -1219951 -1219957 -1219961 -1219963 -1219991 -1220027 -1220029 -1220041 -1220071 -1220077 -1220099 -1220147 -1220171 -1220203 -1220239 -1220249 -1220251 -1220257 -1220309 -1220327 -1220333 -1220347 -1220353 -1220363 -1220369 -1220393 -1220411 -1220423 -1220437 -1220489 -1220491 -1220497 -1220507 -1220591 -1220599 -1220623 -1220657 -1220663 -1220669 -1220689 -1220699 -1220711 -1220717 -1220729 -1220743 -1220761 -1220773 -1220777 -1220783 -1220797 -1220801 -1220803 -1220819 -1220833 -1220839 -1220893 -1220897 -1220903 -1220917 -1220927 -1220953 -1220969 -1220981 -1220983 -1220993 -1221019 -1221029 -1221049 -1221061 -1221079 -1221083 -1221089 -1221097 -1221113 -1221119 -1221131 -1221163 -1221167 -1221193 -1221197 -1221221 -1221223 -1221239 -1221247 -1221251 -1221289 -1221299 -1221373 -1221379 -1221383 -1221391 -1221421 -1221427 -1221443 -1221449 -1221457 -1221463 -1221469 -1221499 -1221503 -1221523 -1221527 -1221533 -1221541 -1221551 -1221557 -1221559 -1221589 -1221593 -1221601 -1221631 -1221641 -1221653 -1221659 -1221667 -1221707 -1221749 -1221751 -1221761 -1221767 -1221791 -1221793 -1221811 -1221821 -1221823 -1221853 -1221863 -1221907 -1221917 -1221937 -1221959 -1221971 -1222003 -1222019 -1222027 -1222037 -1222049 -1222057 -1222063 -1222097 -1222129 -1222157 -1222159 -1222171 -1222187 -1222219 -1222229 -1222231 -1222241 -1222253 -1222259 -1222267 -1222271 -1222279 -1222307 -1222373 -1222393 -1222409 -1222411 -1222433 -1222471 -1222483 -1222493 -1222499 -1222513 -1222523 -1222537 -1222561 -1222567 -1222583 -1222597 -1222601 -1222603 -1222633 -1222643 -1222651 -1222667 -1222679 -1222681 -1222693 -1222717 -1222723 -1222729 -1222751 -1222757 -1222769 -1222777 -1222789 -1222801 -1222811 -1222829 -1222831 -1222847 -1222853 -1222889 -1222909 -1222913 -1222931 -1222943 -1222957 -1222967 -1222993 -1223003 -1223021 -1223029 -1223039 -1223051 -1223059 -1223077 -1223083 -1223093 -1223119 -1223149 -1223161 -1223177 -1223179 -1223197 -1223203 -1223207 -1223231 -1223237 -1223263 -1223279 -1223281 -1223309 -1223311 -1223323 -1223329 -1223351 -1223357 -1223381 -1223419 -1223437 -1223447 -1223449 -1223459 -1223471 -1223489 -1223491 -1223527 -1223533 -1223549 -1223561 -1223569 -1223587 -1223591 -1223603 -1223633 -1223683 -1223687 -1223689 -1223693 -1223723 -1223731 -1223749 -1223753 -1223767 -1223773 -1223777 -1223857 -1223863 -1223867 -1223879 -1223897 -1223921 -1223939 -1223941 -1223953 -1223977 -1223987 -1223993 -1224029 -1224031 -1224053 -1224059 -1224077 -1224079 -1224089 -1224109 -1224121 -1224131 -1224133 -1224149 -1224163 -1224169 -1224193 -1224203 -1224217 -1224229 -1224233 -1224239 -1224257 -1224259 -1224269 -1224271 -1224281 -1224287 -1224299 -1224329 -1224337 -1224347 -1224389 -1224403 -1224413 -1224437 -1224439 -1224473 -1224479 -1224481 -1224529 -1224533 -1224577 -1224599 -1224637 -1224673 -1224677 -1224701 -1224703 -1224709 -1224739 -1224763 -1224767 -1224809 -1224823 -1224851 -1224857 -1224859 -1224863 -1224869 -1224887 -1224889 -1224893 -1224913 -1224919 -1224943 -1224953 -1224967 -1224973 -1224983 -1224991 -1225009 -1225019 -1225061 -1225067 -1225073 -1225079 -1225087 -1225093 -1225097 -1225099 -1225109 -1225111 -1225117 -1225123 -1225127 -1225129 -1225153 -1225157 -1225183 -1225219 -1225223 -1225261 -1225283 -1225297 -1225303 -1225319 -1225327 -1225331 -1225361 -1225373 -1225381 -1225397 -1225409 -1225459 -1225493 -1225501 -1225507 -1225517 -1225529 -1225541 -1225559 -1225571 -1225577 -1225579 -1225589 -1225591 -1225603 -1225621 -1225643 -1225657 -1225663 -1225687 -1225691 -1225703 -1225723 -1225727 -1225729 -1225759 -1225769 -1225787 -1225817 -1225849 -1225871 -1225879 -1225883 -1225891 -1225897 -1225907 -1225909 -1225919 -1225927 -1225933 -1225949 -1225963 -1225981 -1225997 -1225999 -1226011 -1226041 -1226053 -1226063 -1226077 -1226083 -1226087 -1226101 -1226111 -1226117 -1226179 -1226189 -1226191 -1226209 -1226213 -1226237 -1226257 -1226263 -1226293 -1226297 -1226299 -1226311 -1226321 -1226339 -1226341 -1226347 -1226353 -1226377 -1226387 -1226417 -1226461 -1226471 -1226479 -1226483 -1226501 -1226503 -1226531 -1226539 -1226549 -1226557 -1226581 -1226593 -1226609 -1226611 -1226623 -1226629 -1226651 -1226663 -1226677 -1226681 -1226683 -1226699 -1226707 -1226711 -1226713 -1226741 -1226767 -1226779 -1226783 -1226789 -1226801 -1226803 -1226807 -1226821 -1226831 -1226851 -1226857 -1226861 -1226867 -1226891 -1226899 -1226959 -1226977 -1226983 -1226993 -1227047 -1227053 -1227101 -1227103 -1227131 -1227133 -1227143 -1227151 -1227157 -1227167 -1227173 -1227181 -1227241 -1227271 -1227277 -1227299 -1227301 -1227319 -1227323 -1227329 -1227337 -1227353 -1227379 -1227407 -1227431 -1227437 -1227463 -1227469 -1227491 -1227497 -1227539 -1227547 -1227559 -1227563 -1227619 -1227637 -1227649 -1227659 -1227683 -1227701 -1227703 -1227713 -1227719 -1227769 -1227797 -1227829 -1227833 -1227841 -1227847 -1227871 -1227881 -1227887 -1227911 -1227917 -1227929 -1227943 -1227949 -1227973 -1227977 -1227979 -1227983 -1228001 -1228009 -1228013 -1228021 -1228091 -1228099 -1228109 -1228133 -1228147 -1228153 -1228159 -1228163 -1228181 -1228187 -1228193 -1228219 -1228243 -1228247 -1228273 -1228277 -1228291 -1228303 -1228309 -1228327 -1228333 -1228351 -1228373 -1228391 -1228393 -1228397 -1228399 -1228429 -1228441 -1228457 -1228459 -1228489 -1228501 -1228519 -1228537 -1228541 -1228543 -1228547 -1228567 -1228571 -1228583 -1228589 -1228603 -1228613 -1228631 -1228651 -1228657 -1228679 -1228691 -1228693 -1228741 -1228763 -1228783 -1228789 -1228837 -1228841 -1228849 -1228861 -1228883 -1228889 -1228891 -1228907 -1228919 -1228937 -1228943 -1228949 -1228951 -1228961 -1228963 -1228987 -1228993 -1229021 -1229023 -1229071 -1229077 -1229093 -1229113 -1229131 -1229141 -1229149 -1229159 -1229197 -1229201 -1229203 -1229209 -1229213 -1229227 -1229237 -1229257 -1229269 -1229273 -1229279 -1229297 -1229309 -1229311 -1229317 -1229329 -1229351 -1229353 -1229359 -1229369 -1229377 -1229381 -1229401 -1229443 -1229447 -1229453 -1229461 -1229483 -1229489 -1229519 -1229521 -1229531 -1229561 -1229563 -1229581 -1229597 -1229617 -1229633 -1229647 -1229663 -1229689 -1229707 -1229719 -1229731 -1229743 -1229773 -1229783 -1229807 -1229827 -1229869 -1229873 -1229897 -1229903 -1229911 -1229939 -1229941 -1229957 -1229981 -1229993 -1229999 -1230013 -1230023 -1230029 -1230067 -1230071 -1230107 -1230127 -1230167 -1230169 -1230181 -1230199 -1230223 -1230227 -1230233 -1230241 -1230263 -1230301 -1230311 -1230329 -1230331 -1230337 -1230343 -1230347 -1230349 -1230367 -1230371 -1230373 -1230377 -1230379 -1230391 -1230401 -1230433 -1230461 -1230469 -1230479 -1230491 -1230521 -1230529 -1230539 -1230547 -1230571 -1230587 -1230599 -1230629 -1230631 -1230637 -1230667 -1230689 -1230727 -1230739 -1230743 -1230751 -1230769 -1230791 -1230829 -1230863 -1230869 -1230871 -1230881 -1230907 -1230913 -1230941 -1230949 -1230967 -1230997 -1231001 -1231003 -1231039 -1231049 -1231051 -1231063 -1231073 -1231091 -1231093 -1231099 -1231127 -1231129 -1231141 -1231171 -1231177 -1231193 -1231199 -1231201 -1231207 -1231229 -1231231 -1231247 -1231261 -1231267 -1231277 -1231283 -1231301 -1231303 -1231309 -1231313 -1231319 -1231337 -1231339 -1231357 -1231379 -1231381 -1231387 -1231411 -1231421 -1231423 -1231453 -1231457 -1231459 -1231469 -1231481 -1231487 -1231511 -1231513 -1231547 -1231553 -1231577 -1231579 -1231589 -1231597 -1231613 -1231631 -1231663 -1231669 -1231687 -1231691 -1231697 -1231709 -1231721 -1231733 -1231753 -1231757 -1231771 -1231781 -1231787 -1231799 -1231807 -1231817 -1231829 -1231831 -1231843 -1231859 -1231873 -1231877 -1231883 -1231889 -1231943 -1231961 -1231981 -1231987 -1231999 -1232003 -1232069 -1232071 -1232083 -1232089 -1232171 -1232183 -1232201 -1232213 -1232221 -1232227 -1232243 -1232269 -1232291 -1232299 -1232327 -1232339 -1232351 -1232353 -1232377 -1232389 -1232393 -1232401 -1232411 -1232417 -1232431 -1232437 -1232453 -1232461 -1232477 -1232527 -1232531 -1232537 -1232563 -1232573 -1232603 -1232611 -1232617 -1232657 -1232659 -1232683 -1232689 -1232713 -1232719 -1232771 -1232797 -1232801 -1232809 -1232831 -1232843 -1232849 -1232851 -1232879 -1232893 -1232909 -1232941 -1232947 -1232977 -1232981 -1232983 -1232999 -1233019 -1233047 -1233073 -1233079 -1233097 -1233101 -1233107 -1233121 -1233143 -1233179 -1233181 -1233187 -1233209 -1233241 -1233251 -1233259 -1233263 -1233301 -1233313 -1233319 -1233361 -1233371 -1233373 -1233377 -1233409 -1233431 -1233433 -1233437 -1233439 -1233473 -1233493 -1233497 -1233509 -1233523 -1233527 -1233539 -1233563 -1233569 -1233577 -1233587 -1233593 -1233599 -1233607 -1233611 -1233619 -1233641 -1233647 -1233653 -1233709 -1233721 -1233751 -1233761 -1233763 -1233779 -1233781 -1233851 -1233887 -1233899 -1233907 -1233923 -1233929 -1233949 -1233983 -1234001 -1234003 -1234039 -1234049 -1234063 -1234067 -1234099 -1234109 -1234117 -1234133 -1234147 -1234187 -1234231 -1234237 -1234241 -1234243 -1234253 -1234271 -1234309 -1234333 -1234349 -1234351 -1234367 -1234379 -1234391 -1234393 -1234417 -1234439 -1234463 -1234511 -1234517 -1234531 -1234537 -1234543 -1234547 -1234577 -1234603 -1234613 -1234627 -1234657 -1234687 -1234703 -1234721 -1234747 -1234757 -1234759 -1234769 -1234777 -1234787 -1234789 -1234799 -1234813 -1234819 -1234837 -1234841 -1234843 -1234853 -1234873 -1234889 -1234901 -1234951 -1234967 -1234969 -1234991 -1235021 -1235027 -1235041 -1235063 -1235083 -1235093 -1235099 -1235131 -1235137 -1235141 -1235149 -1235159 -1235167 -1235177 -1235183 -1235191 -1235239 -1235243 -1235249 -1235251 -1235263 -1235281 -1235287 -1235303 -1235309 -1235321 -1235327 -1235363 -1235369 -1235383 -1235389 -1235417 -1235419 -1235431 -1235447 -1235449 -1235459 -1235473 -1235477 -1235497 -1235501 -1235503 -1235539 -1235569 -1235573 -1235593 -1235651 -1235653 -1235659 -1235669 -1235701 -1235711 -1235761 -1235789 -1235791 -1235803 -1235807 -1235821 -1235831 -1235833 -1235867 -1235879 -1235887 -1235891 -1235909 -1235929 -1235933 -1235947 -1235977 -1235981 -1235987 -1235999 -1236017 -1236073 -1236077 -1236161 -1236163 -1236173 -1236203 -1236211 -1236229 -1236233 -1236239 -1236259 -1236307 -1236317 -1236329 -1236337 -1236383 -1236397 -1236419 -1236439 -1236449 -1236467 -1236479 -1236481 -1236491 -1236517 -1236527 -1236533 -1236541 -1236553 -1236583 -1236611 -1236623 -1236629 -1236643 -1236659 -1236661 -1236667 -1236701 -1236709 -1236713 -1236727 -1236737 -1236743 -1236751 -1236757 -1236761 -1236769 -1236787 -1236791 -1236797 -1236803 -1236811 -1236827 -1236857 -1236883 -1236901 -1236953 -1236959 -1236979 -1237001 -1237013 -1237031 -1237037 -1237043 -1237051 -1237057 -1237063 -1237079 -1237091 -1237121 -1237129 -1237139 -1237151 -1237163 -1237177 -1237199 -1237207 -1237211 -1237213 -1237217 -1237231 -1237253 -1237273 -1237279 -1237283 -1237297 -1237309 -1237349 -1237363 -1237373 -1237387 -1237393 -1237403 -1237417 -1237433 -1237441 -1237471 -1237487 -1237493 -1237499 -1237501 -1237513 -1237519 -1237529 -1237531 -1237543 -1237547 -1237567 -1237571 -1237589 -1237619 -1237627 -1237661 -1237721 -1237727 -1237739 -1237757 -1237763 -1237783 -1237813 -1237823 -1237829 -1237843 -1237849 -1237853 -1237867 -1237877 -1237897 -1237919 -1237931 -1237939 -1237949 -1237961 -1237963 -1237967 -1237993 -1238023 -1238033 -1238051 -1238063 -1238071 -1238087 -1238089 -1238101 -1238119 -1238129 -1238137 -1238177 -1238179 -1238189 -1238197 -1238201 -1238219 -1238267 -1238269 -1238273 -1238291 -1238317 -1238327 -1238333 -1238371 -1238381 -1238383 -1238407 -1238411 -1238423 -1238429 -1238431 -1238437 -1238449 -1238459 -1238491 -1238509 -1238521 -1238533 -1238537 -1238551 -1238597 -1238599 -1238621 -1238647 -1238659 -1238681 -1238683 -1238687 -1238693 -1238717 -1238719 -1238747 -1238749 -1238759 -1238761 -1238767 -1238771 -1238789 -1238801 -1238821 -1238827 -1238833 -1238843 -1238863 -1238893 -1238903 -1238911 -1238917 -1238921 -1238947 -1238989 -1238999 -1239001 -1239013 -1239023 -1239041 -1239067 -1239089 -1239103 -1239109 -1239127 -1239151 -1239179 -1239191 -1239197 -1239223 -1239229 -1239239 -1239247 -1239269 -1239281 -1239311 -1239319 -1239323 -1239341 -1239347 -1239353 -1239361 -1239367 -1239377 -1239379 -1239397 -1239421 -1239443 -1239449 -1239457 -1239461 -1239481 -1239499 -1239509 -1239517 -1239523 -1239529 -1239533 -1239551 -1239569 -1239583 -1239593 -1239599 -1239607 -1239619 -1239643 -1239661 -1239671 -1239697 -1239727 -1239737 -1239739 -1239751 -1239761 -1239773 -1239803 -1239817 -1239839 -1239877 -1239893 -1239899 -1239911 -1239913 -1239919 -1239923 -1239943 -1239961 -1239971 -1239983 -1239989 -1240007 -1240009 -1240013 -1240021 -1240027 -1240039 -1240081 -1240087 -1240097 -1240117 -1240139 -1240153 -1240159 -1240181 -1240193 -1240199 -1240207 -1240219 -1240231 -1240241 -1240247 -1240271 -1240273 -1240307 -1240319 -1240333 -1240361 -1240363 -1240387 -1240391 -1240399 -1240423 -1240483 -1240487 -1240511 -1240517 -1240523 -1240543 -1240553 -1240559 -1240607 -1240621 -1240637 -1240667 -1240669 -1240691 -1240699 -1240703 -1240709 -1240717 -1240739 -1240741 -1240751 -1240763 -1240769 -1240777 -1240793 -1240807 -1240817 -1240831 -1240859 -1240861 -1240931 -1240957 -1240973 -1240979 -1240991 -1240999 -1241003 -1241027 -1241033 -1241039 -1241059 -1241077 -1241081 -1241087 -1241159 -1241161 -1241173 -1241197 -1241203 -1241243 -1241249 -1241257 -1241263 -1241267 -1241269 -1241291 -1241321 -1241341 -1241347 -1241351 -1241369 -1241377 -1241381 -1241389 -1241407 -1241413 -1241417 -1241423 -1241437 -1241447 -1241467 -1241477 -1241483 -1241489 -1241491 -1241507 -1241509 -1241549 -1241551 -1241557 -1241573 -1241579 -1241587 -1241627 -1241651 -1241659 -1241677 -1241699 -1241741 -1241743 -1241761 -1241771 -1241789 -1241813 -1241819 -1241827 -1241869 -1241879 -1241893 -1241921 -1241923 -1241927 -1241939 -1241941 -1241951 -1241957 -1241963 -1241971 -1241987 -1242001 -1242029 -1242061 -1242067 -1242089 -1242097 -1242103 -1242107 -1242119 -1242121 -1242151 -1242167 -1242169 -1242181 -1242191 -1242193 -1242217 -1242221 -1242233 -1242251 -1242271 -1242289 -1242317 -1242347 -1242359 -1242361 -1242379 -1242403 -1242407 -1242413 -1242419 -1242421 -1242457 -1242487 -1242503 -1242517 -1242569 -1242601 -1242611 -1242617 -1242623 -1242629 -1242641 -1242643 -1242739 -1242757 -1242763 -1242767 -1242781 -1242803 -1242811 -1242817 -1242823 -1242827 -1242841 -1242859 -1242869 -1242889 -1242893 -1242929 -1242931 -1242937 -1242947 -1242959 -1242977 -1242979 -1242991 -1243003 -1243013 -1243093 -1243097 -1243111 -1243129 -1243133 -1243141 -1243147 -1243157 -1243169 -1243181 -1243211 -1243271 -1243273 -1243309 -1243337 -1243343 -1243349 -1243367 -1243369 -1243373 -1243387 -1243391 -1243393 -1243421 -1243427 -1243439 -1243471 -1243477 -1243481 -1243483 -1243511 -1243523 -1243537 -1243547 -1243559 -1243577 -1243579 -1243609 -1243631 -1243639 -1243643 -1243663 -1243673 -1243691 -1243709 -1243717 -1243741 -1243747 -1243783 -1243789 -1243793 -1243807 -1243811 -1243819 -1243841 -1243843 -1243859 -1243877 -1243883 -1243889 -1243927 -1243933 -1243939 -1243943 -1243951 -1243961 -1243967 -1243969 -1243997 -1244003 -1244021 -1244027 -1244029 -1244039 -1244041 -1244053 -1244057 -1244059 -1244083 -1244099 -1244141 -1244143 -1244149 -1244153 -1244167 -1244183 -1244197 -1244203 -1244233 -1244249 -1244261 -1244263 -1244279 -1244293 -1244333 -1244357 -1244359 -1244363 -1244381 -1244393 -1244401 -1244423 -1244429 -1244437 -1244447 -1244459 -1244471 -1244479 -1244483 -1244501 -1244521 -1244531 -1244533 -1244543 -1244567 -1244591 -1244603 -1244609 -1244611 -1244627 -1244629 -1244647 -1244687 -1244699 -1244713 -1244729 -1244741 -1244753 -1244759 -1244777 -1244797 -1244813 -1244819 -1244821 -1244833 -1244839 -1244857 -1244863 -1244879 -1244909 -1244911 -1244923 -1244953 -1244987 -1244989 -1244993 -1245001 -1245017 -1245019 -1245037 -1245067 -1245091 -1245103 -1245113 -1245121 -1245137 -1245149 -1245169 -1245187 -1245191 -1245217 -1245227 -1245281 -1245331 -1245353 -1245379 -1245397 -1245401 -1245421 -1245449 -1245451 -1245479 -1245509 -1245527 -1245529 -1245551 -1245557 -1245589 -1245613 -1245617 -1245619 -1245623 -1245649 -1245683 -1245689 -1245691 -1245701 -1245707 -1245719 -1245721 -1245763 -1245767 -1245779 -1245781 -1245791 -1245799 -1245817 -1245833 -1245847 -1245863 -1245877 -1245883 -1245917 -1245929 -1245943 -1245953 -1245961 -1245971 -1245973 -1246013 -1246033 -1246057 -1246061 -1246073 -1246081 -1246093 -1246099 -1246103 -1246181 -1246187 -1246199 -1246207 -1246213 -1246241 -1246243 -1246247 -1246249 -1246261 -1246283 -1246303 -1246307 -1246313 -1246319 -1246327 -1246331 -1246339 -1246351 -1246361 -1246363 -1246367 -1246369 -1246373 -1246379 -1246387 -1246397 -1246429 -1246433 -1246451 -1246459 -1246471 -1246477 -1246481 -1246489 -1246499 -1246501 -1246513 -1246517 -1246529 -1246537 -1246543 -1246561 -1246573 -1246579 -1246589 -1246591 -1246601 -1246631 -1246639 -1246667 -1246673 -1246697 -1246703 -1246711 -1246733 -1246747 -1246757 -1246781 -1246823 -1246829 -1246841 -1246867 -1246879 -1246891 -1246907 -1246919 -1246943 -1246961 -1246963 -1246997 -1247009 -1247017 -1247033 -1247053 -1247063 -1247089 -1247101 -1247107 -1247117 -1247119 -1247167 -1247177 -1247189 -1247209 -1247231 -1247243 -1247263 -1247269 -1247291 -1247297 -1247303 -1247317 -1247321 -1247327 -1247329 -1247371 -1247383 -1247401 -1247417 -1247419 -1247429 -1247447 -1247453 -1247459 -1247479 -1247501 -1247509 -1247527 -1247549 -1247557 -1247563 -1247569 -1247581 -1247591 -1247599 -1247611 -1247621 -1247627 -1247641 -1247651 -1247663 -1247693 -1247699 -1247737 -1247759 -1247761 -1247767 -1247777 -1247797 -1247801 -1247833 -1247837 -1247861 -1247867 -1247879 -1247881 -1247893 -1247923 -1247947 -1247951 -1247959 -1247969 -1248001 -1248007 -1248011 -1248017 -1248019 -1248031 -1248041 -1248059 -1248061 -1248083 -1248101 -1248103 -1248113 -1248119 -1248151 -1248193 -1248199 -1248209 -1248211 -1248217 -1248229 -1248239 -1248241 -1248253 -1248271 -1248323 -1248329 -1248337 -1248341 -1248347 -1248349 -1248353 -1248383 -1248391 -1248407 -1248413 -1248427 -1248449 -1248451 -1248469 -1248493 -1248503 -1248529 -1248539 -1248551 -1248553 -1248563 -1248571 -1248589 -1248593 -1248631 -1248641 -1248671 -1248673 -1248691 -1248697 -1248703 -1248721 -1248757 -1248781 -1248799 -1248809 -1248829 -1248833 -1248847 -1248857 -1248859 -1248869 -1248881 -1248893 -1248917 -1248941 -1248953 -1248977 -1248979 -1248991 -1249013 -1249019 -1249033 -1249037 -1249043 -1249049 -1249057 -1249063 -1249091 -1249099 -1249111 -1249121 -1249133 -1249139 -1249141 -1249151 -1249159 -1249163 -1249187 -1249201 -1249217 -1249243 -1249247 -1249273 -1249301 -1249319 -1249321 -1249333 -1249343 -1249361 -1249363 -1249373 -1249397 -1249403 -1249411 -1249427 -1249433 -1249477 -1249481 -1249487 -1249489 -1249499 -1249511 -1249519 -1249531 -1249559 -1249603 -1249621 -1249627 -1249631 -1249643 -1249657 -1249669 -1249681 -1249691 -1249693 -1249727 -1249733 -1249739 -1249741 -1249747 -1249757 -1249799 -1249811 -1249817 -1249819 -1249837 -1249841 -1249847 -1249849 -1249861 -1249873 -1249901 -1249921 -1249939 -1249943 -1249999 -1250003 -1250009 -1250021 -1250023 -1250057 -1250069 -1250083 -1250087 -1250099 -1250107 -1250141 -1250147 -1250149 -1250173 -1250177 -1250189 -1250201 -1250203 -1250237 -1250243 -1250273 -1250281 -1250297 -1250309 -1250351 -1250357 -1250407 -1250413 -1250437 -1250443 -1250449 -1250453 -1250461 -1250471 -1250479 -1250497 -1250507 -1250519 -1250521 -1250527 -1250551 -1250593 -1250609 -1250611 -1250629 -1250647 -1250653 -1250677 -1250701 -1250737 -1250749 -1250761 -1250771 -1250773 -1250779 -1250783 -1250801 -1250813 -1250831 -1250839 -1250863 -1250867 -1250917 -1250923 -1250929 -1250939 -1250969 -1250971 -1250981 -1250983 -1251011 -1251037 -1251043 -1251053 -1251071 -1251083 -1251097 -1251101 -1251109 -1251121 -1251157 -1251161 -1251179 -1251227 -1251247 -1251259 -1251287 -1251301 -1251307 -1251317 -1251323 -1251329 -1251409 -1251427 -1251431 -1251433 -1251461 -1251463 -1251527 -1251529 -1251533 -1251571 -1251577 -1251581 -1251583 -1251641 -1251661 -1251667 -1251671 -1251697 -1251703 -1251707 -1251713 -1251721 -1251743 -1251787 -1251791 -1251797 -1251827 -1251841 -1251851 -1251857 -1251869 -1251871 -1251881 -1251907 -1251911 -1251919 -1251923 -1251937 -1251947 -1251953 -1251961 -1251983 -1252021 -1252037 -1252049 -1252057 -1252063 -1252073 -1252079 -1252103 -1252109 -1252123 -1252129 -1252151 -1252159 -1252177 -1252187 -1252193 -1252201 -1252211 -1252217 -1252219 -1252247 -1252259 -1252267 -1252283 -1252331 -1252343 -1252357 -1252399 -1252403 -1252411 -1252421 -1252429 -1252439 -1252451 -1252457 -1252469 -1252483 -1252507 -1252523 -1252579 -1252609 -1252631 -1252639 -1252661 -1252663 -1252681 -1252711 -1252717 -1252721 -1252729 -1252739 -1252751 -1252777 -1252799 -1252817 -1252819 -1252843 -1252873 -1252877 -1252897 -1252903 -1252913 -1252921 -1252943 -1252957 -1252963 -1252987 -1252991 -1252997 -1253011 -1253023 -1253027 -1253047 -1253059 -1253071 -1253089 -1253093 -1253099 -1253111 -1253137 -1253167 -1253171 -1253249 -1253251 -1253261 -1253279 -1253323 -1253327 -1253333 -1253347 -1253377 -1253381 -1253401 -1253437 -1253453 -1253471 -1253479 -1253513 -1253519 -1253521 -1253557 -1253587 -1253591 -1253599 -1253621 -1253627 -1253683 -1253689 -1253701 -1253717 -1253723 -1253729 -1253737 -1253741 -1253761 -1253783 -1253803 -1253831 -1253839 -1253849 -1253851 -1253887 -1253897 -1253909 -1253911 -1253947 -1253951 -1253953 -1253963 -1253969 -1253999 -1254013 -1254017 -1254023 -1254031 -1254037 -1254049 -1254053 -1254059 -1254061 -1254079 -1254091 -1254109 -1254119 -1254131 -1254137 -1254151 -1254157 -1254161 -1254179 -1254193 -1254203 -1254217 -1254241 -1254251 -1254257 -1254269 -1254293 -1254301 -1254317 -1254329 -1254367 -1254371 -1254373 -1254377 -1254427 -1254433 -1254467 -1254469 -1254479 -1254497 -1254503 -1254523 -1254527 -1254529 -1254541 -1254553 -1254557 -1254577 -1254593 -1254607 -1254613 -1254619 -1254623 -1254637 -1254647 -1254653 -1254661 -1254667 -1254683 -1254689 -1254731 -1254733 -1254739 -1254751 -1254761 -1254767 -1254791 -1254793 -1254823 -1254833 -1254839 -1254863 -1254899 -1254907 -1254941 -1254959 -1254971 -1254983 -1254997 -1255013 -1255021 -1255039 -1255049 -1255063 -1255069 -1255081 -1255103 -1255109 -1255117 -1255123 -1255129 -1255139 -1255147 -1255153 -1255157 -1255169 -1255181 -1255183 -1255187 -1255201 -1255211 -1255237 -1255249 -1255253 -1255259 -1255279 -1255301 -1255307 -1255313 -1255321 -1255333 -1255337 -1255357 -1255361 -1255367 -1255391 -1255393 -1255421 -1255427 -1255451 -1255453 -1255477 -1255519 -1255549 -1255559 -1255567 -1255591 -1255601 -1255609 -1255619 -1255633 -1255651 -1255663 -1255679 -1255687 -1255693 -1255721 -1255747 -1255757 -1255759 -1255799 -1255801 -1255811 -1255829 -1255831 -1255847 -1255861 -1255907 -1255913 -1255927 -1255931 -1255939 -1255949 -1255963 -1255967 -1255993 -1255997 -1256009 -1256023 -1256029 -1256041 -1256063 -1256107 -1256149 -1256161 -1256197 -1256201 -1256209 -1256231 -1256243 -1256267 -1256279 -1256303 -1256323 -1256347 -1256369 -1256383 -1256389 -1256393 -1256407 -1256429 -1256449 -1256477 -1256531 -1256533 -1256543 -1256573 -1256579 -1256587 -1256597 -1256611 -1256617 -1256621 -1256659 -1256681 -1256687 -1256693 -1256707 -1256711 -1256729 -1256737 -1256747 -1256753 -1256777 -1256797 -1256809 -1256813 -1256819 -1256821 -1256837 -1256863 -1256867 -1256873 -1256887 -1256891 -1256897 -1256903 -1256911 -1256917 -1256923 -1256939 -1256953 -1256989 -1256993 -1257013 -1257017 -1257029 -1257041 -1257043 -1257049 -1257071 -1257073 -1257077 -1257079 -1257089 -1257103 -1257119 -1257131 -1257163 -1257199 -1257209 -1257229 -1257233 -1257239 -1257241 -1257247 -1257251 -1257253 -1257281 -1257293 -1257307 -1257313 -1257317 -1257323 -1257331 -1257359 -1257397 -1257409 -1257437 -1257457 -1257461 -1257463 -1257491 -1257493 -1257499 -1257517 -1257521 -1257547 -1257559 -1257563 -1257569 -1257587 -1257589 -1257611 -1257647 -1257653 -1257689 -1257691 -1257713 -1257719 -1257721 -1257749 -1257787 -1257827 -1257829 -1257853 -1257859 -1257869 -1257877 -1257911 -1257931 -1257953 -1257959 -1257961 -1257973 -1257989 -1258001 -1258013 -1258027 -1258039 -1258079 -1258087 -1258097 -1258099 -1258109 -1258133 -1258139 -1258141 -1258151 -1258163 -1258171 -1258177 -1258181 -1258183 -1258207 -1258211 -1258217 -1258219 -1258241 -1258267 -1258291 -1258297 -1258303 -1258319 -1258337 -1258343 -1258349 -1258373 -1258403 -1258409 -1258417 -1258421 -1258423 -1258429 -1258441 -1258451 -1258457 -1258469 -1258471 -1258483 -1258487 -1258511 -1258531 -1258559 -1258589 -1258597 -1258601 -1258627 -1258637 -1258639 -1258643 -1258657 -1258661 -1258667 -1258681 -1258709 -1258711 -1258717 -1258723 -1258753 -1258771 -1258781 -1258783 -1258787 -1258811 -1258819 -1258837 -1258847 -1258871 -1258877 -1258889 -1258903 -1258927 -1258931 -1258937 -1258967 -1258973 -1258993 -1259017 -1259029 -1259033 -1259039 -1259047 -1259051 -1259053 -1259057 -1259077 -1259081 -1259087 -1259099 -1259107 -1259113 -1259123 -1259129 -1259143 -1259171 -1259179 -1259191 -1259213 -1259231 -1259243 -1259249 -1259287 -1259299 -1259317 -1259329 -1259371 -1259389 -1259393 -1259413 -1259429 -1259477 -1259509 -1259527 -1259537 -1259539 -1259543 -1259551 -1259563 -1259569 -1259593 -1259603 -1259627 -1259639 -1259653 -1259659 -1259663 -1259669 -1259677 -1259689 -1259701 -1259737 -1259743 -1259749 -1259759 -1259767 -1259777 -1259803 -1259821 -1259851 -1259873 -1259899 -1259903 -1259927 -1259939 -1259953 -1259977 -1259983 -1260011 -1260019 -1260031 -1260047 -1260059 -1260067 -1260113 -1260121 -1260131 -1260143 -1260157 -1260163 -1260167 -1260169 -1260191 -1260223 -1260269 -1260277 -1260283 -1260293 -1260317 -1260319 -1260323 -1260341 -1260359 -1260361 -1260383 -1260401 -1260419 -1260437 -1260439 -1260461 -1260473 -1260481 -1260487 -1260509 -1260541 -1260547 -1260551 -1260569 -1260577 -1260583 -1260599 -1260629 -1260641 -1260643 -1260661 -1260673 -1260691 -1260713 -1260719 -1260731 -1260733 -1260751 -1260757 -1260767 -1260769 -1260797 -1260799 -1260827 -1260829 -1260841 -1260851 -1260877 -1260881 -1260887 -1260893 -1260899 -1260901 -1260911 -1260971 -1260979 -1260989 -1260991 -1261033 -1261069 -1261079 -1261081 -1261109 -1261121 -1261133 -1261157 -1261171 -1261177 -1261199 -1261217 -1261223 -1261259 -1261261 -1261279 -1261289 -1261301 -1261313 -1261321 -1261327 -1261333 -1261357 -1261363 -1261373 -1261387 -1261411 -1261427 -1261459 -1261487 -1261489 -1261523 -1261531 -1261549 -1261567 -1261571 -1261627 -1261639 -1261643 -1261649 -1261697 -1261699 -1261717 -1261721 -1261739 -1261747 -1261759 -1261763 -1261769 -1261789 -1261801 -1261823 -1261829 -1261831 -1261837 -1261861 -1261889 -1261891 -1261901 -1261913 -1261933 -1261943 -1261963 -1261969 -1261973 -1262011 -1262017 -1262057 -1262071 -1262081 -1262083 -1262087 -1262099 -1262101 -1262119 -1262143 -1262147 -1262203 -1262207 -1262221 -1262231 -1262237 -1262269 -1262281 -1262291 -1262293 -1262299 -1262311 -1262321 -1262363 -1262377 -1262411 -1262419 -1262441 -1262453 -1262461 -1262479 -1262483 -1262491 -1262509 -1262519 -1262543 -1262557 -1262563 -1262581 -1262587 -1262617 -1262621 -1262623 -1262629 -1262633 -1262669 -1262671 -1262693 -1262711 -1262713 -1262717 -1262731 -1262741 -1262753 -1262771 -1262783 -1262819 -1262839 -1262851 -1262869 -1262881 -1262887 -1262893 -1262897 -1262903 -1262917 -1262927 -1262929 -1262939 -1262941 -1262957 -1263007 -1263047 -1263071 -1263077 -1263079 -1263103 -1263107 -1263109 -1263113 -1263121 -1263133 -1263173 -1263179 -1263181 -1263187 -1263191 -1263193 -1263209 -1263239 -1263247 -1263259 -1263263 -1263299 -1263307 -1263319 -1263323 -1263331 -1263337 -1263341 -1263347 -1263373 -1263377 -1263391 -1263403 -1263461 -1263463 -1263473 -1263487 -1263499 -1263503 -1263511 -1263539 -1263541 -1263547 -1263569 -1263583 -1263599 -1263607 -1263629 -1263631 -1263659 -1263667 -1263677 -1263697 -1263701 -1263751 -1263761 -1263767 -1263793 -1263799 -1263803 -1263817 -1263853 -1263863 -1263887 -1263917 -1263929 -1263931 -1263943 -1263947 -1263949 -1263953 -1263961 -1263973 -1263979 -1264009 -1264027 -1264033 -1264037 -1264049 -1264061 -1264063 -1264129 -1264177 -1264189 -1264199 -1264213 -1264231 -1264259 -1264261 -1264267 -1264271 -1264301 -1264303 -1264331 -1264337 -1264363 -1264387 -1264411 -1264447 -1264451 -1264499 -1264537 -1264541 -1264559 -1264561 -1264573 -1264577 -1264597 -1264607 -1264643 -1264649 -1264651 -1264657 -1264663 -1264667 -1264687 -1264699 -1264733 -1264741 -1264763 -1264787 -1264801 -1264807 -1264819 -1264829 -1264853 -1264859 -1264867 -1264873 -1264877 -1264883 -1264889 -1264897 -1264903 -1264909 -1264933 -1264969 -1264979 -1264981 -1264997 -1265029 -1265041 -1265051 -1265053 -1265063 -1265081 -1265083 -1265087 -1265093 -1265101 -1265111 -1265113 -1265119 -1265129 -1265167 -1265177 -1265179 -1265197 -1265233 -1265249 -1265273 -1265279 -1265281 -1265311 -1265321 -1265333 -1265347 -1265353 -1265377 -1265387 -1265393 -1265431 -1265443 -1265449 -1265461 -1265471 -1265477 -1265479 -1265503 -1265519 -1265521 -1265527 -1265549 -1265557 -1265573 -1265581 -1265597 -1265603 -1265611 -1265617 -1265623 -1265639 -1265653 -1265657 -1265681 -1265729 -1265741 -1265777 -1265779 -1265801 -1265813 -1265827 -1265843 -1265857 -1265861 -1265863 -1265867 -1265899 -1265903 -1265909 -1265911 -1265921 -1265923 -1265941 -1265959 -1265969 -1265977 -1265981 -1265987 -1265993 -1266019 -1266043 -1266047 -1266059 -1266073 -1266077 -1266079 -1266091 -1266101 -1266107 -1266113 -1266149 -1266157 -1266163 -1266191 -1266197 -1266229 -1266241 -1266247 -1266259 -1266263 -1266269 -1266271 -1266277 -1266281 -1266301 -1266323 -1266337 -1266341 -1266359 -1266371 -1266373 -1266379 -1266389 -1266409 -1266413 -1266431 -1266451 -1266469 -1266487 -1266491 -1266493 -1266511 -1266523 -1266527 -1266539 -1266557 -1266563 -1266583 -1266589 -1266593 -1266611 -1266631 -1266677 -1266719 -1266731 -1266743 -1266751 -1266757 -1266761 -1266763 -1266767 -1266779 -1266781 -1266799 -1266841 -1266847 -1266851 -1266869 -1266883 -1266893 -1266899 -1266913 -1266919 -1266929 -1266931 -1266943 -1266949 -1266953 -1267009 -1267043 -1267051 -1267067 -1267103 -1267109 -1267117 -1267121 -1267127 -1267151 -1267157 -1267159 -1267183 -1267193 -1267199 -1267223 -1267237 -1267291 -1267297 -1267303 -1267307 -1267349 -1267381 -1267403 -1267411 -1267429 -1267447 -1267451 -1267459 -1267463 -1267481 -1267501 -1267517 -1267529 -1267531 -1267549 -1267577 -1267579 -1267589 -1267613 -1267633 -1267649 -1267663 -1267681 -1267709 -1267711 -1267723 -1267727 -1267757 -1267771 -1267787 -1267789 -1267823 -1267831 -1267837 -1267859 -1267873 -1267883 -1267891 -1267897 -1267907 -1267933 -1267939 -1267943 -1267951 -1267957 -1267961 -1267999 -1268011 -1268017 -1268039 -1268051 -1268053 -1268077 -1268093 -1268119 -1268143 -1268147 -1268167 -1268173 -1268177 -1268207 -1268213 -1268221 -1268233 -1268261 -1268279 -1268287 -1268291 -1268299 -1268327 -1268341 -1268357 -1268359 -1268369 -1268413 -1268419 -1268429 -1268447 -1268453 -1268461 -1268467 -1268479 -1268537 -1268549 -1268563 -1268567 -1268593 -1268599 -1268621 -1268623 -1268627 -1268633 -1268669 -1268681 -1268713 -1268731 -1268741 -1268747 -1268753 -1268759 -1268777 -1268783 -1268789 -1268791 -1268797 -1268803 -1268807 -1268843 -1268849 -1268867 -1268881 -1268899 -1268921 -1268929 -1268947 -1268963 -1269001 -1269007 -1269013 -1269017 -1269041 -1269043 -1269049 -1269061 -1269077 -1269091 -1269113 -1269119 -1269131 -1269167 -1269173 -1269179 -1269187 -1269193 -1269197 -1269221 -1269223 -1269239 -1269241 -1269253 -1269263 -1269283 -1269287 -1269299 -1269311 -1269337 -1269343 -1269377 -1269379 -1269383 -1269391 -1269413 -1269427 -1269461 -1269467 -1269493 -1269497 -1269529 -1269547 -1269559 -1269563 -1269571 -1269589 -1269601 -1269641 -1269643 -1269683 -1269691 -1269703 -1269731 -1269733 -1269743 -1269757 -1269797 -1269847 -1269859 -1269869 -1269871 -1269901 -1269907 -1269911 -1269923 -1269929 -1269937 -1269953 -1269971 -1270001 -1270013 -1270033 -1270051 -1270063 -1270067 -1270079 -1270097 -1270103 -1270111 -1270123 -1270141 -1270147 -1270151 -1270183 -1270193 -1270201 -1270231 -1270237 -1270249 -1270271 -1270279 -1270301 -1270309 -1270319 -1270327 -1270333 -1270337 -1270343 -1270361 -1270391 -1270417 -1270421 -1270429 -1270433 -1270441 -1270471 -1270483 -1270499 -1270513 -1270531 -1270537 -1270541 -1270547 -1270559 -1270561 -1270567 -1270571 -1270573 -1270579 -1270609 -1270627 -1270639 -1270649 -1270651 -1270657 -1270667 -1270669 -1270679 -1270747 -1270757 -1270771 -1270817 -1270823 -1270849 -1270859 -1270861 -1270879 -1270897 -1270901 -1270909 -1270933 -1270943 -1270961 -1270981 -1271027 -1271029 -1271033 -1271047 -1271051 -1271059 -1271069 -1271087 -1271089 -1271111 -1271117 -1271129 -1271147 -1271161 -1271167 -1271173 -1271183 -1271197 -1271201 -1271203 -1271213 -1271227 -1271239 -1271251 -1271293 -1271299 -1271317 -1271321 -1271339 -1271351 -1271353 -1271359 -1271383 -1271393 -1271399 -1271401 -1271419 -1271429 -1271449 -1271471 -1271483 -1271503 -1271507 -1271513 -1271521 -1271531 -1271551 -1271561 -1271597 -1271603 -1271609 -1271657 -1271659 -1271671 -1271687 -1271701 -1271717 -1271731 -1271747 -1271749 -1271791 -1271797 -1271807 -1271813 -1271827 -1271833 -1271839 -1271843 -1271849 -1271903 -1271927 -1271929 -1271939 -1271953 -1271971 -1271987 -1271999 -1272001 -1272043 -1272049 -1272067 -1272071 -1272079 -1272091 -1272109 -1272113 -1272133 -1272151 -1272157 -1272163 -1272169 -1272191 -1272203 -1272211 -1272223 -1272233 -1272247 -1272253 -1272269 -1272281 -1272283 -1272287 -1272289 -1272329 -1272343 -1272347 -1272361 -1272367 -1272377 -1272379 -1272409 -1272421 -1272443 -1272451 -1272461 -1272539 -1272547 -1272559 -1272577 -1272589 -1272617 -1272629 -1272631 -1272641 -1272647 -1272653 -1272673 -1272679 -1272749 -1272811 -1272827 -1272833 -1272847 -1272851 -1272857 -1272863 -1272881 -1272883 -1272893 -1272899 -1272913 -1272917 -1272919 -1272937 -1272941 -1272961 -1272983 -1272989 -1272991 -1273001 -1273021 -1273033 -1273037 -1273039 -1273087 -1273099 -1273109 -1273117 -1273121 -1273127 -1273157 -1273159 -1273199 -1273213 -1273231 -1273241 -1273267 -1273289 -1273291 -1273301 -1273309 -1273313 -1273331 -1273333 -1273343 -1273367 -1273381 -1273403 -1273409 -1273411 -1273417 -1273421 -1273423 -1273457 -1273463 -1273471 -1273483 -1273499 -1273507 -1273541 -1273543 -1273549 -1273561 -1273567 -1273609 -1273637 -1273639 -1273663 -1273673 -1273681 -1273687 -1273693 -1273721 -1273729 -1273733 -1273739 -1273757 -1273771 -1273781 -1273787 -1273823 -1273843 -1273879 -1273889 -1273891 -1273903 -1273907 -1273919 -1273933 -1273939 -1273957 -1273981 -1274011 -1274017 -1274041 -1274051 -1274071 -1274087 -1274089 -1274111 -1274113 -1274129 -1274137 -1274149 -1274183 -1274209 -1274227 -1274249 -1274267 -1274291 -1274293 -1274297 -1274309 -1274323 -1274333 -1274353 -1274363 -1274381 -1274389 -1274401 -1274411 -1274423 -1274437 -1274461 -1274509 -1274549 -1274557 -1274561 -1274599 -1274617 -1274621 -1274629 -1274633 -1274671 -1274701 -1274719 -1274723 -1274737 -1274759 -1274771 -1274773 -1274803 -1274851 -1274857 -1274873 -1274879 -1274899 -1274921 -1274929 -1274939 -1274941 -1274989 -1275011 -1275019 -1275041 -1275067 -1275107 -1275121 -1275133 -1275173 -1275179 -1275193 -1275199 -1275203 -1275227 -1275269 -1275277 -1275283 -1275293 -1275319 -1275341 -1275349 -1275359 -1275361 -1275401 -1275437 -1275457 -1275467 -1275499 -1275503 -1275523 -1275539 -1275541 -1275553 -1275559 -1275563 -1275569 -1275583 -1275601 -1275611 -1275643 -1275661 -1275667 -1275683 -1275691 -1275707 -1275709 -1275719 -1275737 -1275749 -1275751 -1275779 -1275803 -1275817 -1275823 -1275829 -1275839 -1275847 -1275851 -1275863 -1275877 -1275889 -1275893 -1275899 -1275931 -1275947 -1275973 -1275977 -1275979 -1276001 -1276007 -1276013 -1276027 -1276031 -1276039 -1276049 -1276057 -1276069 -1276103 -1276117 -1276123 -1276129 -1276133 -1276147 -1276157 -1276169 -1276183 -1276193 -1276213 -1276237 -1276243 -1276271 -1276279 -1276307 -1276313 -1276351 -1276357 -1276361 -1276397 -1276409 -1276433 -1276441 -1276447 -1276481 -1276501 -1276511 -1276529 -1276543 -1276571 -1276579 -1276589 -1276603 -1276619 -1276621 -1276631 -1276637 -1276657 -1276679 -1276687 -1276711 -1276721 -1276733 -1276739 -1276747 -1276763 -1276771 -1276777 -1276817 -1276829 -1276861 -1276867 -1276871 -1276889 -1276897 -1276903 -1276927 -1276949 -1276967 -1276969 -1276973 -1276987 -1276999 -1277011 -1277021 -1277039 -1277041 -1277063 -1277069 -1277071 -1277083 -1277093 -1277099 -1277113 -1277137 -1277147 -1277197 -1277207 -1277209 -1277233 -1277249 -1277257 -1277267 -1277299 -1277321 -1277323 -1277357 -1277359 -1277369 -1277387 -1277429 -1277449 -1277461 -1277477 -1277483 -1277491 -1277501 -1277543 -1277557 -1277569 -1277593 -1277597 -1277621 -1277629 -1277651 -1277657 -1277677 -1277699 -1277723 -1277729 -1277741 -1277743 -1277753 -1277761 -1277791 -1277803 -1277813 -1277819 -1277833 -1277849 -1277863 -1277867 -1277879 -1277897 -1277909 -1277911 -1277957 -1277971 -1277993 -1278007 -1278029 -1278031 -1278047 -1278097 -1278107 -1278113 -1278131 -1278139 -1278163 -1278181 -1278191 -1278197 -1278203 -1278209 -1278217 -1278227 -1278253 -1278287 -1278289 -1278323 -1278337 -1278341 -1278371 -1278373 -1278379 -1278391 -1278397 -1278401 -1278419 -1278437 -1278439 -1278463 -1278467 -1278479 -1278481 -1278493 -1278527 -1278551 -1278583 -1278601 -1278611 -1278617 -1278619 -1278623 -1278631 -1278637 -1278659 -1278671 -1278701 -1278709 -1278713 -1278721 -1278733 -1278769 -1278779 -1278787 -1278799 -1278803 -1278811 -1278817 -1278839 -1278857 -1278881 -1278899 -1278911 -1278983 -1278997 -1279001 -1279013 -1279021 -1279027 -1279039 -1279043 -1279081 -1279087 -1279093 -1279111 -1279123 -1279133 -1279141 -1279163 -1279171 -1279177 -1279181 -1279183 -1279189 -1279193 -1279211 -1279249 -1279253 -1279303 -1279307 -1279309 -1279319 -1279321 -1279337 -1279357 -1279361 -1279417 -1279427 -1279457 -1279459 -1279483 -1279493 -1279507 -1279511 -1279519 -1279541 -1279547 -1279549 -1279561 -1279583 -1279601 -1279609 -1279627 -1279643 -1279657 -1279661 -1279667 -1279673 -1279679 -1279687 -1279693 -1279703 -1279727 -1279753 -1279757 -1279787 -1279801 -1279807 -1279813 -1279819 -1279823 -1279843 -1279847 -1279853 -1279871 -1279877 -1279907 -1279919 -1279921 -1279931 -1279937 -1279961 -1279969 -1279997 -1280023 -1280101 -1280107 -1280113 -1280119 -1280129 -1280131 -1280141 -1280159 -1280161 -1280173 -1280179 -1280183 -1280221 -1280231 -1280267 -1280281 -1280291 -1280297 -1280309 -1280317 -1280333 -1280371 -1280399 -1280401 -1280407 -1280417 -1280431 -1280453 -1280473 -1280519 -1280537 -1280549 -1280561 -1280567 -1280597 -1280603 -1280623 -1280633 -1280651 -1280659 -1280677 -1280693 -1280707 -1280737 -1280743 -1280759 -1280761 -1280767 -1280789 -1280791 -1280803 -1280821 -1280833 -1280837 -1280857 -1280863 -1280869 -1280887 -1280921 -1280947 -1280969 -1280987 -1280989 -1281029 -1281041 -1281043 -1281047 -1281083 -1281089 -1281097 -1281101 -1281131 -1281149 -1281157 -1281167 -1281187 -1281193 -1281211 -1281221 -1281229 -1281253 -1281257 -1281263 -1281281 -1281283 -1281317 -1281331 -1281349 -1281367 -1281383 -1281389 -1281407 -1281431 -1281433 -1281439 -1281451 -1281457 -1281463 -1281503 -1281521 -1281523 -1281541 -1281547 -1281551 -1281563 -1281587 -1281649 -1281653 -1281667 -1281673 -1281677 -1281691 -1281697 -1281703 -1281727 -1281739 -1281751 -1281773 -1281779 -1281781 -1281799 -1281803 -1281809 -1281821 -1281823 -1281827 -1281853 -1281871 -1281883 -1281899 -1281937 -1281941 -1281961 -1281971 -1281979 -1281983 -1282007 -1282009 -1282031 -1282033 -1282051 -1282069 -1282079 -1282081 -1282093 -1282109 -1282117 -1282121 -1282133 -1282153 -1282163 -1282187 -1282201 -1282213 -1282231 -1282241 -1282261 -1282277 -1282279 -1282289 -1282297 -1282343 -1282349 -1282363 -1282381 -1282387 -1282399 -1282417 -1282423 -1282427 -1282451 -1282469 -1282471 -1282493 -1282499 -1282507 -1282511 -1282513 -1282517 -1282529 -1282543 -1282571 -1282577 -1282597 -1282607 -1282613 -1282627 -1282637 -1282639 -1282649 -1282657 -1282661 -1282681 -1282693 -1282703 -1282717 -1282739 -1282751 -1282763 -1282781 -1282783 -1282807 -1282817 -1282867 -1282877 -1282903 -1282907 -1282909 -1282913 -1282933 -1282943 -1282951 -1282961 -1282969 -1282993 -1283011 -1283017 -1283021 -1283027 -1283063 -1283069 -1283083 -1283099 -1283111 -1283119 -1283129 -1283137 -1283159 -1283167 -1283171 -1283173 -1283179 -1283207 -1283237 -1283297 -1283323 -1283333 -1283339 -1283353 -1283383 -1283389 -1283417 -1283437 -1283441 -1283473 -1283479 -1283509 -1283521 -1283537 -1283539 -1283543 -1283549 -1283563 -1283573 -1283591 -1283603 -1283677 -1283683 -1283701 -1283707 -1283717 -1283719 -1283731 -1283753 -1283759 -1283767 -1283771 -1283797 -1283831 -1283839 -1283873 -1283879 -1283881 -1283897 -1283903 -1283939 -1283941 -1283957 -1283969 -1283981 -1283983 -1284007 -1284037 -1284043 -1284047 -1284053 -1284083 -1284131 -1284169 -1284187 -1284209 -1284211 -1284223 -1284263 -1284271 -1284287 -1284293 -1284301 -1284313 -1284317 -1284329 -1284341 -1284373 -1284379 -1284383 -1284421 -1284427 -1284433 -1284443 -1284467 -1284473 -1284487 -1284511 -1284523 -1284541 -1284551 -1284553 -1284559 -1284583 -1284601 -1284617 -1284623 -1284631 -1284641 -1284659 -1284691 -1284709 -1284713 -1284737 -1284739 -1284763 -1284769 -1284791 -1284793 -1284823 -1284841 -1284847 -1284851 -1284863 -1284889 -1284901 -1284917 -1284931 -1284937 -1284967 -1284971 -1284977 -1284991 -1285021 -1285049 -1285051 -1285057 -1285061 -1285069 -1285099 -1285111 -1285117 -1285129 -1285139 -1285147 -1285159 -1285169 -1285181 -1285199 -1285213 -1285223 -1285231 -1285237 -1285247 -1285259 -1285267 -1285279 -1285283 -1285289 -1285301 -1285351 -1285381 -1285393 -1285397 -1285411 -1285429 -1285441 -1285451 -1285469 -1285481 -1285507 -1285511 -1285513 -1285517 -1285519 -1285547 -1285549 -1285553 -1285607 -1285619 -1285633 -1285649 -1285679 -1285699 -1285703 -1285717 -1285741 -1285747 -1285759 -1285763 -1285777 -1285789 -1285793 -1285799 -1285811 -1285813 -1285841 -1285847 -1285853 -1285859 -1285871 -1285877 -1285891 -1285903 -1285913 -1285937 -1285943 -1285969 -1285981 -1285993 -1286011 -1286017 -1286039 -1286071 -1286081 -1286093 -1286099 -1286107 -1286119 -1286147 -1286149 -1286177 -1286189 -1286191 -1286209 -1286227 -1286239 -1286261 -1286267 -1286269 -1286273 -1286287 -1286303 -1286323 -1286359 -1286371 -1286381 -1286387 -1286399 -1286419 -1286447 -1286489 -1286491 -1286503 -1286513 -1286521 -1286533 -1286557 -1286561 -1286569 -1286581 -1286587 -1286617 -1286629 -1286633 -1286641 -1286647 -1286653 -1286657 -1286669 -1286683 -1286693 -1286707 -1286711 -1286773 -1286777 -1286783 -1286797 -1286807 -1286819 -1286821 -1286833 -1286837 -1286839 -1286843 -1286881 -1286939 -1286941 -1286953 -1286959 -1286969 -1286981 -1286983 -1287007 -1287047 -1287059 -1287061 -1287067 -1287071 -1287101 -1287109 -1287131 -1287133 -1287157 -1287163 -1287173 -1287179 -1287197 -1287199 -1287217 -1287233 -1287239 -1287289 -1287323 -1287329 -1287343 -1287347 -1287353 -1287361 -1287371 -1287373 -1287401 -1287431 -1287457 -1287467 -1287469 -1287479 -1287487 -1287491 -1287499 -1287511 -1287541 -1287551 -1287553 -1287569 -1287589 -1287593 -1287607 -1287613 -1287623 -1287661 -1287683 -1287691 -1287697 -1287707 -1287731 -1287739 -1287743 -1287749 -1287751 -1287757 -1287761 -1287787 -1287799 -1287817 -1287821 -1287829 -1287841 -1287857 -1287883 -1287887 -1287899 -1287917 -1287947 -1287961 -1287967 -1287973 -1287983 -1287989 -1287997 -1288003 -1288009 -1288013 -1288033 -1288037 -1288043 -1288051 -1288057 -1288061 -1288099 -1288103 -1288109 -1288117 -1288163 -1288169 -1288171 -1288187 -1288193 -1288201 -1288213 -1288247 -1288249 -1288291 -1288307 -1288337 -1288349 -1288361 -1288363 -1288367 -1288393 -1288421 -1288423 -1288429 -1288439 -1288487 -1288513 -1288519 -1288531 -1288541 -1288543 -1288559 -1288571 -1288597 -1288603 -1288607 -1288613 -1288643 -1288649 -1288657 -1288691 -1288697 -1288699 -1288709 -1288711 -1288733 -1288769 -1288783 -1288799 -1288817 -1288823 -1288829 -1288831 -1288843 -1288849 -1288853 -1288871 -1288873 -1288877 -1288891 -1288919 -1288921 -1288933 -1288939 -1288951 -1288967 -1288981 -1288993 -1288997 -1289003 -1289009 -1289027 -1289039 -1289053 -1289077 -1289083 -1289111 -1289129 -1289149 -1289153 -1289159 -1289179 -1289213 -1289231 -1289237 -1289261 -1289273 -1289287 -1289303 -1289329 -1289333 -1289341 -1289363 -1289371 -1289381 -1289401 -1289411 -1289423 -1289429 -1289447 -1289459 -1289513 -1289531 -1289537 -1289551 -1289557 -1289567 -1289593 -1289597 -1289599 -1289621 -1289623 -1289627 -1289653 -1289657 -1289677 -1289711 -1289713 -1289731 -1289747 -1289749 -1289753 -1289779 -1289789 -1289801 -1289803 -1289831 -1289839 -1289851 -1289867 -1289881 -1289921 -1289927 -1289933 -1289963 -1289969 -1289971 -1290013 -1290019 -1290031 -1290049 -1290077 -1290083 -1290109 -1290131 -1290143 -1290151 -1290161 -1290167 -1290169 -1290173 -1290199 -1290203 -1290209 -1290257 -1290259 -1290287 -1290293 -1290299 -1290319 -1290329 -1290371 -1290379 -1290427 -1290431 -1290433 -1290439 -1290463 -1290467 -1290469 -1290491 -1290503 -1290533 -1290539 -1290551 -1290563 -1290571 -1290581 -1290593 -1290607 -1290629 -1290631 -1290637 -1290643 -1290649 -1290659 -1290673 -1290683 -1290719 -1290791 -1290811 -1290823 -1290847 -1290853 -1290857 -1290869 -1290901 -1290907 -1290923 -1290937 -1290983 -1291001 -1291007 -1291009 -1291019 -1291021 -1291063 -1291079 -1291111 -1291117 -1291139 -1291153 -1291159 -1291163 -1291177 -1291193 -1291211 -1291217 -1291219 -1291223 -1291229 -1291249 -1291271 -1291313 -1291321 -1291327 -1291343 -1291349 -1291357 -1291369 -1291379 -1291387 -1291391 -1291421 -1291447 -1291453 -1291471 -1291481 -1291483 -1291489 -1291501 -1291523 -1291547 -1291567 -1291579 -1291603 -1291637 -1291669 -1291673 -1291691 -1291783 -1291793 -1291799 -1291817 -1291819 -1291831 -1291861 -1291877 -1291883 -1291907 -1291909 -1291931 -1291957 -1291963 -1291967 -1291991 -1291999 -1292009 -1292023 -1292029 -1292063 -1292069 -1292089 -1292099 -1292113 -1292131 -1292141 -1292143 -1292149 -1292167 -1292177 -1292219 -1292237 -1292243 -1292251 -1292257 -1292261 -1292281 -1292293 -1292309 -1292329 -1292339 -1292353 -1292371 -1292383 -1292387 -1292419 -1292429 -1292441 -1292477 -1292491 -1292503 -1292509 -1292539 -1292549 -1292563 -1292567 -1292579 -1292587 -1292591 -1292593 -1292597 -1292609 -1292633 -1292639 -1292653 -1292657 -1292659 -1292693 -1292701 -1292713 -1292717 -1292729 -1292737 -1292783 -1292789 -1292801 -1292813 -1292831 -1292843 -1292857 -1292887 -1292927 -1292947 -1292953 -1292957 -1292971 -1292983 -1292989 -1292999 -1293001 -1293011 -1293031 -1293077 -1293119 -1293133 -1293137 -1293157 -1293169 -1293179 -1293199 -1293203 -1293233 -1293239 -1293247 -1293251 -1293277 -1293283 -1293287 -1293307 -1293317 -1293319 -1293323 -1293329 -1293361 -1293367 -1293373 -1293401 -1293419 -1293421 -1293433 -1293473 -1293491 -1293493 -1293499 -1293529 -1293533 -1293541 -1293553 -1293559 -1293583 -1293587 -1293613 -1293619 -1293647 -1293659 -1293701 -1293739 -1293757 -1293763 -1293791 -1293797 -1293821 -1293829 -1293839 -1293841 -1293857 -1293869 -1293899 -1293917 -1293923 -1293931 -1293947 -1293949 -1293961 -1293967 -1293977 -1293979 -1293983 -1294019 -1294021 -1294031 -1294037 -1294039 -1294061 -1294081 -1294087 -1294103 -1294121 -1294123 -1294129 -1294169 -1294177 -1294199 -1294201 -1294231 -1294253 -1294273 -1294277 -1294301 -1294303 -1294309 -1294339 -1294351 -1294361 -1294367 -1294369 -1294393 -1294399 -1294453 -1294459 -1294471 -1294477 -1294483 -1294561 -1294571 -1294583 -1294597 -1294609 -1294621 -1294627 -1294633 -1294639 -1294649 -1294651 -1294691 -1294721 -1294723 -1294729 -1294753 -1294757 -1294759 -1294817 -1294823 -1294841 -1294849 -1294939 -1294957 -1294967 -1294973 -1294987 -1294999 -1295003 -1295027 -1295033 -1295051 -1295057 -1295069 -1295071 -1295081 -1295089 -1295113 -1295131 -1295137 -1295159 -1295183 -1295191 -1295201 -1295207 -1295219 -1295221 -1295243 -1295263 -1295279 -1295293 -1295297 -1295299 -1295309 -1295317 -1295321 -1295323 -1295339 -1295347 -1295369 -1295377 -1295387 -1295389 -1295447 -1295473 -1295491 -1295501 -1295513 -1295533 -1295543 -1295549 -1295551 -1295561 -1295563 -1295603 -1295611 -1295617 -1295639 -1295647 -1295653 -1295681 -1295711 -1295717 -1295737 -1295741 -1295747 -1295761 -1295783 -1295803 -1295809 -1295813 -1295839 -1295849 -1295867 -1295869 -1295873 -1295881 -1295947 -1295953 -1295989 -1295993 -1296007 -1296011 -1296019 -1296023 -1296037 -1296041 -1296059 -1296077 -1296089 -1296101 -1296109 -1296137 -1296143 -1296167 -1296181 -1296187 -1296209 -1296227 -1296277 -1296283 -1296287 -1296293 -1296319 -1296331 -1296341 -1296343 -1296371 -1296391 -1296409 -1296413 -1296419 -1296467 -1296473 -1296481 -1296499 -1296511 -1296521 -1296523 -1296551 -1296557 -1296563 -1296571 -1296583 -1296587 -1296593 -1296601 -1296613 -1296623 -1296629 -1296649 -1296679 -1296689 -1296703 -1296721 -1296727 -1296749 -1296781 -1296787 -1296803 -1296817 -1296829 -1296833 -1296839 -1296877 -1296899 -1296907 -1296929 -1296949 -1296973 -1296983 -1297001 -1297003 -1297013 -1297019 -1297027 -1297057 -1297061 -1297063 -1297091 -1297103 -1297123 -1297129 -1297139 -1297147 -1297157 -1297169 -1297171 -1297193 -1297201 -1297211 -1297217 -1297229 -1297243 -1297249 -1297271 -1297273 -1297279 -1297297 -1297313 -1297333 -1297337 -1297349 -1297357 -1297367 -1297369 -1297393 -1297397 -1297399 -1297403 -1297411 -1297421 -1297447 -1297451 -1297459 -1297477 -1297487 -1297501 -1297507 -1297519 -1297523 -1297537 -1297561 -1297573 -1297601 -1297607 -1297619 -1297631 -1297633 -1297649 -1297651 -1297657 -1297669 -1297687 -1297693 -1297727 -1297739 -1297771 -1297781 -1297799 -1297841 -1297847 -1297853 -1297873 -1297927 -1297963 -1297973 -1297979 -1297993 -1298027 -1298039 -1298047 -1298053 -1298057 -1298111 -1298113 -1298117 -1298119 -1298131 -1298149 -1298161 -1298173 -1298191 -1298197 -1298221 -1298261 -1298279 -1298291 -1298309 -1298317 -1298329 -1298333 -1298351 -1298357 -1298371 -1298387 -1298467 -1298489 -1298491 -1298537 -1298551 -1298573 -1298581 -1298611 -1298617 -1298641 -1298651 -1298653 -1298699 -1298719 -1298723 -1298747 -1298771 -1298779 -1298789 -1298797 -1298809 -1298819 -1298831 -1298849 -1298863 -1298887 -1298909 -1298911 -1298923 -1298951 -1298963 -1298981 -1298989 -1299007 -1299013 -1299019 -1299029 -1299041 -1299059 -1299061 -1299079 -1299097 -1299101 -1299143 -1299169 -1299173 -1299187 -1299203 -1299209 -1299211 -1299223 -1299227 -1299257 -1299269 -1299283 -1299289 -1299299 -1299317 -1299323 -1299341 -1299343 -1299349 -1299359 -1299367 -1299377 -1299379 -1299437 -1299439 -1299449 -1299451 -1299457 -1299491 -1299499 -1299533 -1299541 -1299553 -1299583 -1299601 -1299631 -1299637 -1299647 -1299653 -1299673 -1299689 -1299709 diff --git a/files/AddAndSubtractPaths.java b/files/AddAndSubtractPaths.java index 30cf4de18..06409c9c8 100644 --- a/files/AddAndSubtractPaths.java +++ b/files/AddAndSubtractPaths.java @@ -52,13 +52,12 @@ public static void main(String[] args) { } } /* Output: -Windows 8.1 +Windows 10 C:\Git -(1)r OnJava8\ExtractedExamples\files\AddAndSubtractPath -s.java -RealPath: C:\Git\OnJava8\ExtractedExamples\files\AddAnd -SubtractPaths.java -(2)r OnJava8\ExtractedExamples\strings\..\files +(1)r OnJava8\ExtractedExamples\files\AddAndSubtractPaths.java +RealPath: +C:\Git\OnJava8\ExtractedExamples\files\AddAndSubtractPaths.java +(2)r OnJava8\ExtractedExamples\files RealPath: C:\Git\OnJava8\ExtractedExamples\files (3)r OnJava8\ExtractedExamples\files RealPath: C:\Git\OnJava8\ExtractedExamples\files @@ -68,7 +67,7 @@ public static void main(String[] args) { RealPath: C:\Git\OnJava8 (6)r OnJava8 RealPath: C:\Git\OnJava8 -(7)r OnJava8\ExtractedExamples\files\.\..\.. +(7)r OnJava8 RealPath: C:\Git\OnJava8 (8)r OnJava8 RealPath: C:\Git\OnJava8 diff --git a/files/FileSystemDemo.java b/files/FileSystemDemo.java index 9f7d9b7df..51f47cabd 100644 --- a/files/FileSystemDemo.java +++ b/files/FileSystemDemo.java @@ -26,20 +26,22 @@ public static void main(String[] args) { } } /* Output: -Windows 8.1 +Windows 10 File Store: (C:) File Store: System Reserved (E:) File Store: (F:) +File Store: Google Drive (G:) Root Directory: C:\ Root Directory: D:\ Root Directory: E:\ Root Directory: F:\ +Root Directory: G:\ Separator: \ UserPrincipalLookupService: -sun.nio.fs.WindowsFileSystem$LookupService$1@19e0bfd +sun.nio.fs.WindowsFileSystem$LookupService$1@1bd4fdd isOpen: true isReadOnly: false FileSystemProvider: -sun.nio.fs.WindowsFileSystemProvider@139a55 +sun.nio.fs.WindowsFileSystemProvider@55183b20 File Attribute Views: [owner, dos, acl, basic, user] */ diff --git a/files/PartsOfPaths.java b/files/PartsOfPaths.java index ee9865d6a..63a581e52 100644 --- a/files/PartsOfPaths.java +++ b/files/PartsOfPaths.java @@ -23,7 +23,7 @@ public static void main(String[] args) { } } /* Output: -Windows 8.1 +Windows 10 Git OnJava8 ExtractedExamples diff --git a/files/PathAnalysis.java b/files/PathAnalysis.java index ee2922f07..9800ed2c5 100644 --- a/files/PathAnalysis.java +++ b/files/PathAnalysis.java @@ -38,7 +38,7 @@ static void say(String id, Object result) { } } /* Output: -Windows 8.1 +Windows 10 Exists: true Directory: false Executable: true @@ -49,8 +49,8 @@ static void say(String id, Object result) { Hidden: false size: 1617 FileStore: (C:) -LastModified: : 2021-01-24T15:48:37.461504Z +LastModified: : 2021-11-08T00:34:52.693768Z Owner: GROOT\Bruce (User) -ContentType: null +ContentType: text/plain SymbolicLink: false */ diff --git a/files/PathInfo.java b/files/PathInfo.java index 019ca4594..78ef9e48b 100644 --- a/files/PathInfo.java +++ b/files/PathInfo.java @@ -9,17 +9,17 @@ public class PathInfo { static void show(String id, Object p) { - System.out.println(id + ": " + p); + System.out.println(id + p); } static void info(Path p) { - show("toString", p); - show("Exists", Files.exists(p)); - show("RegularFile", Files.isRegularFile(p)); - show("Directory", Files.isDirectory(p)); - show("Absolute", p.isAbsolute()); - show("FileName", p.getFileName()); - show("Parent", p.getParent()); - show("Root", p.getRoot()); + show("toString:\n ", p); + show("Exists: ", Files.exists(p)); + show("RegularFile: ", Files.isRegularFile(p)); + show("Directory: ", Files.isDirectory(p)); + show("Absolute: ", p.isAbsolute()); + show("FileName: ", p.getFileName()); + show("Parent: ", p.getParent()); + show("Root: ", p.getRoot()); System.out.println("******************"); } public static void main(String[] args) { @@ -37,15 +37,16 @@ public static void main(String[] args) { System.out.println(e); } URI u = p.toUri(); - System.out.println("URI: " + u); + System.out.println("URI:\n" + u); Path puri = Paths.get(u); System.out.println(Files.exists(puri)); File f = ap.toFile(); // Don't be fooled } } /* Output: -Windows 8.1 -toString: C:\path\to\nowhere\NoFile.txt +Windows 10 +toString: + C:\path\to\nowhere\NoFile.txt Exists: false RegularFile: false Directory: false @@ -54,7 +55,8 @@ public static void main(String[] args) { Parent: C:\path\to\nowhere Root: C:\ ****************** -toString: PathInfo.java +toString: + PathInfo.java Exists: true RegularFile: true Directory: false @@ -64,7 +66,7 @@ public static void main(String[] args) { Root: null ****************** toString: -C:\Git\OnJava8\ExtractedExamples\files\PathInfo.java + C:\Git\OnJava8\ExtractedExamples\files\PathInfo.java Exists: true RegularFile: true Directory: false @@ -73,7 +75,8 @@ public static void main(String[] args) { Parent: C:\Git\OnJava8\ExtractedExamples\files Root: C:\ ****************** -toString: C:\Git\OnJava8\ExtractedExamples\files +toString: + C:\Git\OnJava8\ExtractedExamples\files Exists: true RegularFile: false Directory: true @@ -83,7 +86,7 @@ public static void main(String[] args) { Root: C:\ ****************** toString: -C:\Git\OnJava8\ExtractedExamples\files\PathInfo.java + C:\Git\OnJava8\ExtractedExamples\files\PathInfo.java Exists: true RegularFile: true Directory: false @@ -92,7 +95,7 @@ public static void main(String[] args) { Parent: C:\Git\OnJava8\ExtractedExamples\files Root: C:\ ****************** -URI: file:///C:/Git/OnJava8/ExtractedExamples/files/Pat -hInfo.java +URI: +file:///C:/Git/OnJava8/ExtractedExamples/files/PathInfo.java true */ diff --git a/functional/MethodReferences.java b/functional/MethodReferences.java index 4cd593455..4c1e5f9fb 100644 --- a/functional/MethodReferences.java +++ b/functional/MethodReferences.java @@ -2,7 +2,6 @@ // (c)2021 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. -import java.util.*; interface Callable { // [1] void call(String s); diff --git a/generics/coffee/CoffeeSupplier.java b/generics/coffee/CoffeeSupplier.java index 5fb68a288..90df2e463 100644 --- a/generics/coffee/CoffeeSupplier.java +++ b/generics/coffee/CoffeeSupplier.java @@ -23,7 +23,7 @@ public CoffeeSupplier() {} return (Coffee) types[rand.nextInt(types.length)] .getConstructor().newInstance(); - // Report programmer errors at run time: + // Report programmer errors at runtime: } catch(InstantiationException | NoSuchMethodException | InvocationTargetException | diff --git a/newio/data.txt b/newio/data.txt deleted file mode 100644 index 6dc5df604..000000000 --- a/newio/data.txt +++ /dev/null @@ -1 +0,0 @@ -Some text Some more \ No newline at end of file diff --git a/references/ImmutableStrings.java b/references/ImmutableStrings.java deleted file mode 100644 index 9ca8f72c7..000000000 --- a/references/ImmutableStrings.java +++ /dev/null @@ -1,25 +0,0 @@ -// references/ImmutableStrings.java -// (c)2021 MindView LLC: see Copyright.txt -// We make no guarantees that this code is fit for any purpose. -// Visit http://OnJava8.com for more book information. -// Demonstrating StringBuilder - -public class ImmutableStrings { - public static void main(String[] args) { - String foo = "foo"; - String s = "abc" + foo + "def" - + Integer.toString(47); - System.out.println(s); - // The "equivalent" using StringBuilder: - StringBuilder sb = - new StringBuilder("abc"); // Creates String - sb.append(foo); - sb.append("def"); // Creates String - sb.append(Integer.toString(47)); - System.out.println(sb); - } -} -/* Output: -abcfoodef47 -abcfoodef47 -*/ diff --git a/references/Stringer.java b/references/Stringer.java deleted file mode 100644 index 0a4d0dd8a..000000000 --- a/references/Stringer.java +++ /dev/null @@ -1,22 +0,0 @@ -// references/Stringer.java -// (c)2021 MindView LLC: see Copyright.txt -// We make no guarantees that this code is fit for any purpose. -// Visit http://OnJava8.com for more book information. - -public class Stringer { - public static String upcase(String s) { - return s.toUpperCase(); - } - public static void main(String[] args) { - String q = new String("howdy"); - System.out.println(q); // howdy - String qq = upcase(q); - System.out.println(qq); // HOWDY - System.out.println(q); // howdy - } -} -/* Output: -howdy -HOWDY -howdy -*/ diff --git a/streams/RandomGenerators.java b/streams/RandomGenerators.java index 78d6f231a..286368f3f 100644 --- a/streams/RandomGenerators.java +++ b/streams/RandomGenerators.java @@ -7,10 +7,10 @@ public class RandomGenerators { public static void show(Stream stream) { - stream - .limit(4) - .forEach(System.out::println); - System.out.println("++++++++"); + stream + .limit(4) + .forEach(System.out::println); + System.out.println("++++++++"); } public static void main(String[] args) { Random rand = new Random(47);